Skip to content

Commit

Permalink
Configurable description_content_type
Browse files Browse the repository at this point in the history
No validation is performed.
The defaults are unchanged (and inconsistent with setuptools/PyPI).

Basic test for checking metadata gets through.
  • Loading branch information
clbarnes committed Oct 7, 2020
1 parent 845637f commit 573bb27
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 32 deletions.
1 change: 1 addition & 0 deletions src/cargo_toml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ pub struct RemainingCoreMetadata {
pub requires_external: Option<Vec<String>>,
pub project_url: Option<Vec<String>>,
pub provides_extra: Option<Vec<String>>,
pub description_content_type: Option<String>,
}

#[cfg(test)]
Expand Down
130 changes: 98 additions & 32 deletions src/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,23 +76,26 @@ impl Metadata21 {
None
};

let description_content_type = if description.is_some() {
// I'm not hundred percent sure if that's the best preset
Some("text/markdown; charset=UTF-8; variant=GFM".to_owned())
} else {
None
};

let classifier = cargo_toml.classifier();

let extra_metadata = cargo_toml.remaining_core_metadata();

let author_email = if authors.contains('@') {
Some(authors.clone())
} else {
None
};

let extra_metadata = cargo_toml.remaining_core_metadata();

// See https://packaging.python.org/specifications/core-metadata/#description-content-type
let description_content_type = extra_metadata.description_content_type.or_else(|| {
if description.is_some() {
// I'm not hundred percent sure if that's the best preset
Some("text/markdown; charset=UTF-8; variant=GFM".to_owned())
} else {
None
}
});

Ok(Metadata21 {
metadata_version: "2.1".to_owned(),

Expand Down Expand Up @@ -243,16 +246,7 @@ mod test {
use indoc::indoc;
use std::io::Write;

#[test]
fn test_metadata_from_cargo_toml() {
let readme = indoc!(
r#"
# Some test package
This is the readme for a test package
"#
);

fn assert_metadata_from_cargo_toml(readme: &str, cargo_toml: &str, expected: &str) {
let mut readme_md = tempfile::NamedTempFile::new().unwrap();

let readme_path = if cfg!(windows) {
Expand All @@ -263,6 +257,36 @@ mod test {

readme_md.write_all(readme.as_bytes()).unwrap();

let cargo_toml = cargo_toml.replace("readme.md", &readme_path);

let cargo_toml: CargoToml = toml::from_str(&cargo_toml).unwrap();

let metadata =
Metadata21::from_cargo_toml(&cargo_toml, &readme_md.path().parent().unwrap()).unwrap();

let actual = metadata.to_file_contents();

if actual.trim() != expected.trim() {
panic!("Actual metadata differed from expected\nEXPECTED:\n{}\n\nGOT:\n{}", expected, actual);
}

assert_eq!(actual.trim(), expected.trim());

if metadata.get_dist_info_dir() != PathBuf::from("info_project-0.1.0.dist-info") {
panic!("Dist info dir differed from expected");
}
}

#[test]
fn test_metadata_from_cargo_toml() {
let readme = indoc!(
r#"
# Some test package
This is the readme for a test package
"#
);

let cargo_toml = indoc!(
r#"
[package]
Expand All @@ -285,13 +309,7 @@ mod test {
classifier = ["Programming Language :: Python"]
requires-dist = ["flask~=1.1.0", "toml==0.10.0"]
"#
)
.replace("readme.md", &readme_path);

let cargo_toml: CargoToml = toml::from_str(&cargo_toml).unwrap();

let metadata =
Metadata21::from_cargo_toml(&cargo_toml, &readme_md.path().parent().unwrap()).unwrap();
);

let expected = indoc!(
r#"
Expand All @@ -314,13 +332,61 @@ mod test {
"#
);

let actual = metadata.to_file_contents();
assert_metadata_from_cargo_toml(readme, cargo_toml, expected);
}

assert_eq!(actual.trim(), expected.trim());
#[test]
fn test_metadata_from_cargo_toml_rst() {
let readme = indoc!(
r#"
# Some test package
"#
);

let cargo_toml = indoc!(
r#"
[package]
authors = ["konstin <[email protected]>"]
name = "info-project"
version = "0.1.0"
description = "A test project"
homepage = "https://example.org"
readme = "readme.md"
keywords = ["ffi", "test"]
[lib]
crate-type = ["cdylib"]
name = "pyo3_pure"
[package.metadata.maturin.scripts]
ph = "maturin:print_hello"
[package.metadata.maturin]
classifier = ["Programming Language :: Python"]
requires-dist = ["flask~=1.1.0", "toml==0.10.0"]
description-content-type = "text/x-rst"
"#
);

let expected = indoc!(
r#"
Metadata-Version: 2.1
Name: info-project
Version: 0.1.0
Classifier: Programming Language :: Python
Requires-Dist: flask~=1.1.0
Requires-Dist: toml==0.10.0
Summary: A test project
Keywords: ffi test
Home-Page: https://example.org
Author: konstin <[email protected]>
Author-Email: konstin <[email protected]>
Description-Content-Type: text/x-rst
# Some test package
"#
);

assert_eq!(
metadata.get_dist_info_dir(),
PathBuf::from("info_project-0.1.0.dist-info")
)
assert_metadata_from_cargo_toml(readme, cargo_toml, expected);
}
}

0 comments on commit 573bb27

Please sign in to comment.