Skip to content

Commit

Permalink
fix: added deprecated field to the related structs (#61)
Browse files Browse the repository at this point in the history
Co-authored-by: David Sherret <[email protected]>
  • Loading branch information
HasanAlrimawi and dsherret authored Aug 19, 2024
1 parent e7d5af7 commit ebd57a4
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@ pub struct NpmResolutionPackage {
pub optional_dependencies: HashSet<String>,
pub bin: Option<NpmPackageVersionBinEntry>,
pub scripts: HashMap<String, String>,
pub deprecated: Option<String>,
}

impl std::fmt::Debug for NpmResolutionPackage {
Expand All @@ -270,6 +271,7 @@ impl std::fmt::Debug for NpmResolutionPackage {
deps.sort();
deps
})
.field("deprecated", &self.deprecated)
.finish()
}
}
Expand All @@ -284,6 +286,7 @@ impl NpmResolutionPackage {
optional_dependencies: self.optional_dependencies.clone(),
bin: self.bin.clone(),
scripts: self.scripts.clone(),
deprecated: self.deprecated.clone(),
}
}

Expand Down
158 changes: 158 additions & 0 deletions src/registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ pub struct NpmPackageVersionInfo {
#[serde(default)]
#[serde(deserialize_with = "deserializers::hashmap")]
pub scripts: HashMap<String, String>,
#[serde(default)]
#[serde(deserialize_with = "deserializers::string")]
pub deprecated: Option<String>,
}

impl NpmPackageVersionInfo {
Expand Down Expand Up @@ -561,6 +564,13 @@ mod deserializers {
})
}

pub fn string<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_option(OptionalStringVisitor)
}

pub fn vector<'de, T, D>(deserializer: D) -> Result<Vec<T>, D::Error>
where
T: DeserializeOwned,
Expand Down Expand Up @@ -668,6 +678,91 @@ mod deserializers {
}
}

struct OptionalStringVisitor;

impl<'de> Visitor<'de> for OptionalStringVisitor {
type Value = Option<String>;

fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("string or null")
}

fn visit_none<E>(self) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(None)
}

fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
where
M: MapAccess<'de>,
{
while map
.next_entry::<de::IgnoredAny, de::IgnoredAny>()?
.is_some()
{}
Ok(None)
}

fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
while seq.next_element::<de::IgnoredAny>()?.is_some() {}
Ok(None)
}

fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_any(self)
}

fn visit_bool<E>(self, _v: bool) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(None)
}

fn visit_i64<E>(self, _v: i64) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(None)
}

fn visit_u64<E>(self, _v: u64) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(None)
}

fn visit_f64<E>(self, _v: f64) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(None)
}

fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(Some(v))
}

fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(Some(v.to_string()))
}
}

struct VectorVisitor<T> {
marker: std::marker::PhantomData<fn() -> Vec<T>>,
}
Expand Down Expand Up @@ -793,6 +888,69 @@ mod test {
);
}

#[test]
fn deserializes_pkg_info_with_deprecated() {
let text = r#"{
"version": "1.0.0",
"dist": { "tarball": "value", "shasum": "test" },
"dependencies": ["key","value"],
"deprecated": "aa"
}"#;
let info: NpmPackageVersionInfo = serde_json::from_str(text).unwrap();
assert_eq!(
info,
NpmPackageVersionInfo {
version: Version::parse_from_npm("1.0.0").unwrap(),
dist: NpmPackageVersionDistInfo {
tarball: "value".to_string(),
shasum: "test".to_string(),
integrity: None,
},
dependencies: HashMap::new(),
deprecated: Some("aa".to_string()),
..Default::default()
}
);
}

#[test]
fn deserializes_pkg_info_with_deprecated_invalid() {
let values = [
r#"["aa"]"#,
r#"{ "prop": "aa" }"#,
"1",
"1.0",
"true",
"null",
];
for value in values {
let text = format!(
r#"{{
"version": "1.0.0",
"dist": {{ "tarball": "value", "shasum": "test" }},
"dependencies": ["key","value"],
"deprecated": {}
}}"#,
value
);
let info: NpmPackageVersionInfo = serde_json::from_str(&text).unwrap();
assert_eq!(
info,
NpmPackageVersionInfo {
version: Version::parse_from_npm("1.0.0").unwrap(),
dist: NpmPackageVersionDistInfo {
tarball: "value".to_string(),
shasum: "test".to_string(),
integrity: None,
},
dependencies: HashMap::new(),
deprecated: None,
..Default::default()
}
);
}
}

#[test]
fn deserializes_bin_entry() {
// string
Expand Down
1 change: 1 addition & 0 deletions src/resolution/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,7 @@ impl Graph {
.collect(),
bin: version_info.bin.clone(),
scripts: version_info.scripts.clone(),
deprecated: version_info.deprecated.clone(),
},
);
}
Expand Down
9 changes: 9 additions & 0 deletions src/resolution/snapshot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ pub struct SerializedNpmResolutionSnapshotPackage {
pub optional_dependencies: HashSet<String>,
pub bin: Option<NpmPackageVersionBinEntry>,
pub scripts: HashMap<String, String>,
pub deprecated: Option<String>,
}

#[derive(Default, Clone, Serialize, Deserialize, PartialEq, Eq)]
Expand Down Expand Up @@ -255,6 +256,7 @@ impl NpmResolutionSnapshot {
optional_dependencies: package.optional_dependencies,
bin: package.bin,
scripts: package.scripts,
deprecated: package.deprecated,
},
);
}
Expand Down Expand Up @@ -314,6 +316,7 @@ impl NpmResolutionSnapshot {
optional_dependencies: Default::default(),
bin: None,
scripts: Default::default(),
deprecated: Default::default(),
};
for (key, dep_id) in &pkg.dependencies {
let dep = self.packages.get(dep_id).unwrap();
Expand Down Expand Up @@ -967,6 +970,7 @@ pub async fn snapshot_from_lockfile<'a>(
.collect(),
bin: version_info.bin.clone(),
scripts: version_info.scripts.clone(),
deprecated: version_info.deprecated.clone(),
});
}
Err(err) => {
Expand Down Expand Up @@ -1070,6 +1074,7 @@ mod tests {
optional_dependencies: HashSet::from(["c".to_string()]),
bin: None,
scripts: Default::default(),
deprecated: Default::default(),
},
SerializedNpmResolutionSnapshotPackage {
id: NpmPackageId::from_serialized("[email protected]").unwrap(),
Expand All @@ -1079,6 +1084,7 @@ mod tests {
optional_dependencies: Default::default(),
bin: None,
scripts: Default::default(),
deprecated: Default::default(),
},
SerializedNpmResolutionSnapshotPackage {
id: NpmPackageId::from_serialized("[email protected]").unwrap(),
Expand All @@ -1091,6 +1097,7 @@ mod tests {
optional_dependencies: Default::default(),
bin: None,
scripts: Default::default(),
deprecated: Default::default(),
},
SerializedNpmResolutionSnapshotPackage {
id: NpmPackageId::from_serialized("[email protected]").unwrap(),
Expand All @@ -1100,6 +1107,7 @@ mod tests {
optional_dependencies: Default::default(),
bin: None,
scripts: Default::default(),
deprecated: Default::default(),
},
],
}
Expand Down Expand Up @@ -1212,6 +1220,7 @@ mod tests {
optional_dependencies: Default::default(),
bin: None,
scripts: Default::default(),
deprecated: Default::default(),
}
}

Expand Down

0 comments on commit ebd57a4

Please sign in to comment.