From 9a1d7819756f44beed60986dc751f297258a3ba1 Mon Sep 17 00:00:00 2001 From: Jessica Black Date: Fri, 17 May 2024 18:09:32 -0700 Subject: [PATCH] Since we're doing a breaking change, rename `project` -> `package` --- src/error.rs | 30 +++++------ src/lib.rs | 72 ++++++++++++------------- src/locator.rs | 120 ++++++++++++++++++++--------------------- src/locator_package.rs | 88 +++++++++++++++--------------- src/locator_strict.rs | 78 +++++++++++++-------------- 5 files changed, 194 insertions(+), 194 deletions(-) diff --git a/src/error.rs b/src/error.rs index e2d3f0d..6cb1d85 100644 --- a/src/error.rs +++ b/src/error.rs @@ -45,38 +45,38 @@ pub enum ParseError { error: strum::ParseError, }, - /// An unsupported value for the "project" field was provided. - #[error("invalid project '{project}' in input '{input}'")] - Project { + /// An unsupported value for the "package" field was provided. + #[error("invalid package '{package}' in input '{input}'")] + Package { /// The input originally provided to the parser. input: String, - /// The project that was attempted to parse. - project: String, + /// The package that was attempted to parse. + package: String, /// The error returned by the parser. #[source] - error: ProjectParseError, + error: PackageParseError, }, } -/// Errors encountered when parsing the project field +/// Errors encountered when parsing the package field /// when parsing a [`Locator`](crate::Locator) from a string. #[derive(Error, Clone, PartialEq, Eq, Debug)] #[non_exhaustive] -pub enum ProjectParseError { - /// An unsupported value for the "project" field was provided. - #[error("project did not match required syntax: {project}")] - Project { - /// The project input. - project: String, +pub enum PackageParseError { + /// An unsupported value for the "package" field was provided. + #[error("package did not match required syntax: {package}")] + Package { + /// The package input. + package: String, }, /// The "named" field was missing from the input. - #[error("field '{field}' missing from input: {project}")] + #[error("field '{field}' missing from input: {package}")] Field { /// The input originally provided to the parser. - project: String, + package: String, /// The field that was missing. field: String, diff --git a/src/lib.rs b/src/lib.rs index b6b5731..9ca1f33 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -174,48 +174,48 @@ impl std::fmt::Debug for OrgId { } } -/// The project section of the locator. +/// The package section of the locator. #[derive(Clone, Eq, PartialEq, Hash)] -pub struct Project(String); +pub struct Package(String); -impl Project { +impl Package { /// View the item as a string. pub fn as_str(&self) -> &str { &self.0 } } -impl From for Project { +impl From for Package { fn from(value: String) -> Self { Self(value) } } -impl From<&str> for Project { +impl From<&str> for Package { fn from(value: &str) -> Self { Self::from(value.to_string()) } } -impl std::fmt::Display for Project { +impl std::fmt::Display for Package { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } } -impl std::fmt::Debug for Project { +impl std::fmt::Debug for Package { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{self}") } } -impl std::cmp::Ord for Project { +impl std::cmp::Ord for Package { fn cmp(&self, other: &Self) -> std::cmp::Ordering { alphanumeric_sort::compare_str(&self.0, &other.0) } } -impl std::cmp::PartialOrd for Project { +impl std::cmp::PartialOrd for Package { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } @@ -289,25 +289,25 @@ impl std::cmp::PartialOrd for Revision { } } -/// Optionally parse an org ID and trimmed project out of a project string. -fn parse_org_project(project: &str) -> Result<(Option, Project), ProjectParseError> { +/// Optionally parse an org ID and trimmed package out of a package string. +fn parse_org_package(package: &str) -> Result<(Option, Package), PackageParseError> { lazy_static! { - static ref RE: Regex = Regex::new(r"^(?:(?P\d+)/)?(?P.+)") - .expect("Project parsing expression must compile"); + static ref RE: Regex = Regex::new(r"^(?:(?P\d+)/)?(?P.+)") + .expect("Package parsing expression must compile"); } - let mut captures = RE.captures_iter(project); - let capture = captures.next().ok_or_else(|| ProjectParseError::Project { - project: project.to_string(), + let mut captures = RE.captures_iter(package); + let capture = captures.next().ok_or_else(|| PackageParseError::Package { + package: package.to_string(), })?; - let trimmed_project = + let trimmed_package = capture - .name("project") + .name("package") .map(|m| m.as_str()) - .ok_or_else(|| ProjectParseError::Field { - project: project.to_string(), - field: String::from("project"), + .ok_or_else(|| PackageParseError::Field { + package: package.to_string(), + field: String::from("package"), })?; // If we fail to parse the org_id as a valid number, don't fail the overall parse; @@ -318,12 +318,12 @@ fn parse_org_project(project: &str) -> Result<(Option, Project), ProjectP .map(OrgId::try_from) { // An org ID was provided and validly parsed, use it. - Some(Ok(org_id)) => Ok((Some(org_id), Project::from(trimmed_project))), + Some(Ok(org_id)) => Ok((Some(org_id), Package::from(trimmed_package))), // Otherwise, if we either didn't get an org ID section, // or it wasn't a valid org ID, - // just use the project as-is. - _ => Ok((None, Project::from(project))), + // just use the package as-is. + _ => Ok((None, Package::from(package))), } } @@ -333,42 +333,42 @@ mod tests { use super::*; - impl Project { + impl Package { fn new(value: &str) -> Self { Self(value.to_string()) } } #[test] - fn parses_org_project() { + fn parses_org_package() { let orgs = [OrgId(0usize), OrgId(1), OrgId(9809572)]; - let names = [Project::new("name"), Project::new("name/foo")]; + let names = [Package::new("name"), Package::new("name/foo")]; for (org, name) in izip!(orgs, names) { let test = format!("{org}/{name}"); - let Ok((Some(org_id), project)) = parse_org_project(&test) else { + let Ok((Some(org_id), package)) = parse_org_package(&test) else { panic!("must parse '{test}'") }; assert_eq!(org_id, org, "'org_id' must match in '{test}'"); - assert_eq!(project, name, "'project' must match in '{test}"); + assert_eq!(package, name, "'package' must match in '{test}"); } } #[test] - fn parses_org_project_no_org() { + fn parses_org_package_no_org() { let names = [ - Project::new("/name/foo"), - Project::new("/name"), - Project::new("abcd/1234/name"), - Project::new("1abc2/name"), + Package::new("/name/foo"), + Package::new("/name"), + Package::new("abcd/1234/name"), + Package::new("1abc2/name"), ]; for test in names { let input = &format!("{test}"); - let Ok((org_id, project)) = parse_org_project(input) else { + let Ok((org_id, package)) = parse_org_package(input) else { panic!("must parse '{test}'") }; assert_eq!(org_id, None, "'org_id' must be None in '{test}'"); - assert_eq!(project, test, "'project' must match in '{test}"); + assert_eq!(package, test, "'package' must match in '{test}"); } } } diff --git a/src/locator.rs b/src/locator.rs index 6b4b4fc..1954fa0 100644 --- a/src/locator.rs +++ b/src/locator.rs @@ -13,7 +13,7 @@ use utoipa::{ }; use crate::{ - parse_org_project, Error, Fetcher, OrgId, PackageLocator, ParseError, Project, Revision, + parse_org_package, Error, Fetcher, OrgId, Package, PackageLocator, ParseError, Revision, StrictLocator, }; @@ -40,7 +40,7 @@ use crate::{ /// Locators order by: /// 1. Fetcher, alphanumerically. /// 2. Organization ID, alphanumerically; missing organizations are sorted higher. -/// 3. The project field, alphanumerically. +/// 3. The package field, alphanumerically. /// 4. The revision field: /// If both comparing locators use semver, these are compared using semver rules; /// otherwise these are compared alphanumerically. @@ -53,17 +53,17 @@ use crate::{ /// ## Parsing /// /// The input string must be in one of the following forms: -/// - `{fetcher}+{project}` -/// - `{fetcher}+{project}$` -/// - `{fetcher}+{project}${revision}` +/// - `{fetcher}+{package}` +/// - `{fetcher}+{package}$` +/// - `{fetcher}+{package}${revision}` /// -/// Projects may also be namespaced to a specific organization; -/// in such cases the organization ID is at the start of the `{project}` field +/// Packages may also be namespaced to a specific organization; +/// in such cases the organization ID is at the start of the `{package}` field /// separated by a slash. The ID can be any non-negative integer. /// This yields the following formats: -/// - `{fetcher}+{org_id}/{project}` -/// - `{fetcher}+{org_id}/{project}$` -/// - `{fetcher}+{org_id}/{project}${revision}` +/// - `{fetcher}+{org_id}/{package}` +/// - `{fetcher}+{org_id}/{package}$` +/// - `{fetcher}+{org_id}/{package}${revision}` /// /// This parse function is based on the function used in FOSSA Core for maximal compatibility. #[derive( @@ -80,26 +80,26 @@ use crate::{ Documented, )] pub struct Locator { - /// Determines which fetcher is used to download this project. + /// Determines which fetcher is used to download this package. #[getset(get_copy = "pub")] fetcher: Fetcher, - /// Specifies the organization ID to which this project is namespaced. + /// Specifies the organization ID to which this package is namespaced. #[builder(default, setter(transform = |id: usize| Some(OrgId(id))))] #[getset(get_copy = "pub")] org_id: Option, - /// Specifies the unique identifier for the project by fetcher. + /// Specifies the unique identifier for the package by fetcher. /// - /// For example, the `git` fetcher fetching a github project - /// uses a value in the form of `{user_name}/{project_name}`. - #[builder(setter(transform = |project: impl ToString| Project(project.to_string())))] + /// For example, the `git` fetcher fetching a github package + /// uses a value in the form of `{user_name}/{package_name}`. + #[builder(setter(transform = |package: impl ToString| Package(package.to_string())))] #[getset(get = "pub")] - project: Project, + package: Package, - /// Specifies the version for the project by fetcher. + /// Specifies the version for the package by fetcher. /// - /// For example, the `git` fetcher fetching a github project + /// For example, the `git` fetcher fetching a github package /// uses a value in the form of `{git_sha}` or `{git_tag}`, /// and the fetcher disambiguates. #[builder(default, setter(transform = |revision: impl ToString| Some(Revision::from(revision.to_string()))))] @@ -113,7 +113,7 @@ impl Locator { pub fn parse(locator: &str) -> Result { lazy_static! { static ref RE: Regex = Regex::new( - r"^(?:(?P[a-z-]+)\+|)(?P[^$]+)(?:\$|)(?P.+|)$" + r"^(?:(?P[a-z-]+)\+|)(?P[^$]+)(?:\$|)(?P.+|)$" ) .expect("Locator parsing expression must compile"); } @@ -138,12 +138,12 @@ impl Locator { error, })?; - let project = capture - .name("project") + let package = capture + .name("package") .map(|m| m.as_str().to_owned()) .ok_or_else(|| ParseError::Field { input: locator.to_owned(), - field: "project".to_string(), + field: "package".to_string(), })?; let revision = capture.name("revision").map(|m| m.as_str()).and_then(|s| { @@ -154,22 +154,22 @@ impl Locator { } }); - match parse_org_project(&project) { - Ok((org_id @ Some(_), project)) => Ok(Locator { + match parse_org_package(&package) { + Ok((org_id @ Some(_), package)) => Ok(Locator { fetcher, org_id, - project, + package: package, revision, }), Ok((org_id @ None, _)) => Ok(Locator { fetcher, org_id, - project: Project::from(project.as_str()), + package: Package::from(package.as_str()), revision, }), - Err(error) => Err(Error::Parse(ParseError::Project { + Err(error) => Err(Error::Parse(ParseError::Package { input: locator.to_owned(), - project, + package, error, })), } @@ -182,7 +182,7 @@ impl Locator { pub fn promote_strict(self, revision: impl ToString) -> StrictLocator { let locator = StrictLocator::builder() .fetcher(self.fetcher) - .project(self.project) + .package(self.package) .revision( self.revision .unwrap_or_else(|| Revision::from(revision.to_string())), @@ -201,7 +201,7 @@ impl Locator { pub fn promote_strict_with String>(self, revision: F) -> StrictLocator { let locator = StrictLocator::builder() .fetcher(self.fetcher) - .project(self.project) + .package(self.package) .revision(self.revision.unwrap_or_else(|| Revision::from(revision()))); match self.org_id { @@ -218,8 +218,8 @@ impl Locator { /// Explodes the locator into its (owned) parts. /// Used for conversions without cloning. - pub(crate) fn explode(self) -> (Fetcher, Option, Project, Option) { - (self.fetcher, self.org_id, self.project, self.revision) + pub(crate) fn explode(self) -> (Fetcher, Option, Package, Option) { + (self.fetcher, self.org_id, self.package, self.revision) } } @@ -228,11 +228,11 @@ impl Display for Locator { let fetcher = &self.fetcher; write!(f, "{fetcher}+")?; - let project = &self.project; + let package = &self.package; if let Some(org_id) = &self.org_id { write!(f, "{org_id}/")?; } - write!(f, "{project}")?; + write!(f, "{package}")?; if let Some(revision) = &self.revision { write!(f, "${revision}")?; @@ -281,11 +281,11 @@ impl<'a> ToSchema<'a> for Locator { impl From for Locator { fn from(package: PackageLocator) -> Self { - let (fetcher, org_id, project) = package.explode(); + let (fetcher, org_id, package) = package.explode(); Self { fetcher, org_id, - project, + package: package, revision: None, } } @@ -296,7 +296,7 @@ impl From<&PackageLocator> for Locator { Self { fetcher: package.fetcher(), org_id: package.org_id(), - project: package.project().clone(), + package: package.package().clone(), revision: None, } } @@ -304,11 +304,11 @@ impl From<&PackageLocator> for Locator { impl From for Locator { fn from(strict: StrictLocator) -> Self { - let (fetcher, org_id, project, revision) = strict.explode(); + let (fetcher, org_id, package, revision) = strict.explode(); Self { fetcher, org_id, - project, + package: package, revision: Some(revision), } } @@ -319,7 +319,7 @@ impl From<&StrictLocator> for Locator { Self { fetcher: strict.fetcher(), org_id: strict.org_id(), - project: strict.project().clone(), + package: strict.package().clone(), revision: Some(strict.revision().clone()), } } @@ -344,7 +344,7 @@ mod tests { let parsed = Locator::parse(input).expect("must parse locator"); let expected = Locator::builder() .fetcher(Fetcher::Git) - .project("github.com/foo/bar") + .package("github.com/foo/bar") .build(); assert_eq!(expected, parsed); assert_eq!(&parsed.to_string(), input); @@ -353,7 +353,7 @@ mod tests { let parsed = Locator::parse(input).expect("must parse locator"); let expected = Locator::builder() .fetcher(Fetcher::Git) - .project("github.com/foo/bar") + .package("github.com/foo/bar") .revision("abcd") .build(); assert_eq!(expected, parsed); @@ -368,7 +368,7 @@ mod tests { } #[test] - fn parse_missing_project() { + fn parse_missing_package() { let input = "git+"; let parsed = Locator::parse(input); assert_matches!(parsed, Err(Error::Parse(ParseError::Field { .. }))); @@ -395,11 +395,11 @@ mod tests { OrgId(2385028), OrgId(19847938492847928), ]; - let projects = ["github.com/foo/bar", "some-name"]; + let packages = ["github.com/foo/bar", "some-name"]; let revisions = ["", "$", "$1", "$1234abcd1234"]; - for (fetcher, org, project, revision) in izip!(fetchers, orgs, projects, revisions) { - let input = format!("{fetcher}+{org}/{project}{revision}"); + for (fetcher, org, package, revision) in izip!(fetchers, orgs, packages, revisions) { + let input = format!("{fetcher}+{org}/{package}{revision}"); let Ok(parsed) = Locator::parse(&input) else { panic!("must parse '{input}'") }; @@ -415,9 +415,9 @@ mod tests { "'org_id' in '{input}' must match" ); assert_eq!( - parsed.project().as_str(), - project, - "'project' in '{input}' must match" + parsed.package().as_str(), + package, + "'package' in '{input}' must match" ); let revision = if revision.is_empty() || revision == "$" { @@ -438,7 +438,7 @@ mod tests { let locator = Locator::builder() .fetcher(Fetcher::Custom) .org_id(1234) - .project("foo/bar") + .package("foo/bar") .revision("123abc") .build(); @@ -454,7 +454,7 @@ mod tests { fn render_with_revision() { let locator = Locator::builder() .fetcher(Fetcher::Custom) - .project("foo/bar") + .package("foo/bar") .revision("123abc") .build(); @@ -463,10 +463,10 @@ mod tests { } #[test] - fn render_project() { + fn render_package() { let locator = Locator::builder() .fetcher(Fetcher::Custom) - .project("foo/bar") + .package("foo/bar") .build(); let rendered = locator.to_string(); @@ -477,7 +477,7 @@ mod tests { fn roundtrip_serialization() { let input = Locator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .revision("bar") .org_id(1) .build(); @@ -497,7 +497,7 @@ mod tests { let input = r#"{ "locator": "custom+1/foo$bar" }"#; let expected = Locator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .revision("bar") .org_id(1) .build(); @@ -511,14 +511,14 @@ mod tests { fn demotes() { let input = Locator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .revision("abcd") .build(); let expected = PackageLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .build(); let demoted = input.clone().into_package(); @@ -529,13 +529,13 @@ mod tests { fn promotes_strict() { let input = Locator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .build(); let expected = StrictLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .revision("bar") .build(); diff --git a/src/locator_package.rs b/src/locator_package.rs index 573a738..310023d 100644 --- a/src/locator_package.rs +++ b/src/locator_package.rs @@ -10,7 +10,7 @@ use utoipa::{ ToSchema, }; -use crate::{Error, Fetcher, Locator, OrgId, Project, StrictLocator}; +use crate::{Error, Fetcher, Locator, OrgId, Package, StrictLocator}; /// A [`Locator`] specialized to not include the `revision` component. /// @@ -22,7 +22,7 @@ use crate::{Error, Fetcher, Locator, OrgId, Project, StrictLocator}; /// Locators order by: /// 1. Fetcher, alphanumerically. /// 2. Organization ID, alphanumerically; missing organizations are sorted higher. -/// 3. The project field, alphanumerically. +/// 3. The package field, alphanumerically. /// /// Importantly, there may be other metrics for ordering using the actual code host /// which contains the package (for example, ordering by release date). @@ -31,17 +31,17 @@ use crate::{Error, Fetcher, Locator, OrgId, Project, StrictLocator}; /// ## Parsing /// /// The input string must be in one of the following forms: -/// - `{fetcher}+{project}` -/// - `{fetcher}+{project}$` -/// - `{fetcher}+{project}${revision}` +/// - `{fetcher}+{package}` +/// - `{fetcher}+{package}$` +/// - `{fetcher}+{package}${revision}` /// -/// Projects may also be namespaced to a specific organization; -/// in such cases the organization ID is at the start of the `{project}` field +/// Packages may also be namespaced to a specific organization; +/// in such cases the organization ID is at the start of the `{package}` field /// separated by a slash. The ID can be any non-negative integer. /// This yields the following formats: -/// - `{fetcher}+{org_id}/{project}` -/// - `{fetcher}+{org_id}/{project}$` -/// - `{fetcher}+{org_id}/{project}${revision}` +/// - `{fetcher}+{org_id}/{package}` +/// - `{fetcher}+{org_id}/{package}$` +/// - `{fetcher}+{org_id}/{package}${revision}` /// /// This implementation ignores the `revision` segment if it exists. If this is not preferred, use [`Locator`] instead. #[derive( @@ -58,22 +58,22 @@ use crate::{Error, Fetcher, Locator, OrgId, Project, StrictLocator}; Documented, )] pub struct PackageLocator { - /// Determines which fetcher is used to download this project. + /// Determines which fetcher is used to download this package. #[getset(get_copy = "pub")] fetcher: Fetcher, - /// Specifies the organization ID to which this project is namespaced. + /// Specifies the organization ID to which this package is namespaced. #[builder(default, setter(transform = |id: usize| Some(OrgId(id))))] #[getset(get_copy = "pub")] org_id: Option, - /// Specifies the unique identifier for the project by fetcher. + /// Specifies the unique identifier for the package by fetcher. /// - /// For example, the `git` fetcher fetching a github project - /// uses a value in the form of `{user_name}/{project_name}`. - #[builder(setter(transform = |project: impl ToString| Project(project.to_string())))] + /// For example, the `git` fetcher fetching a github package + /// uses a value in the form of `{user_name}/{package_name}`. + #[builder(setter(transform = |package: impl ToString| Package(package.to_string())))] #[getset(get = "pub")] - project: Project, + package: Package, } impl PackageLocator { @@ -88,7 +88,7 @@ impl PackageLocator { pub fn promote(self, revision: Option) -> Locator { let locator = Locator::builder() .fetcher(self.fetcher) - .project(self.project); + .package(self.package); match (self.org_id, revision) { (None, None) => locator.build(), @@ -102,7 +102,7 @@ impl PackageLocator { pub fn promote_strict(self, revision: impl ToString) -> StrictLocator { let locator = StrictLocator::builder() .fetcher(self.fetcher) - .project(self.project) + .package(self.package) .revision(revision); match self.org_id { @@ -113,8 +113,8 @@ impl PackageLocator { /// Explodes the locator into its (owned) parts. /// Used for conversions without cloning. - pub(crate) fn explode(self) -> (Fetcher, Option, Project) { - (self.fetcher, self.org_id, self.project) + pub(crate) fn explode(self) -> (Fetcher, Option, Package) { + (self.fetcher, self.org_id, self.package) } } @@ -164,11 +164,11 @@ impl Serialize for PackageLocator { impl From for PackageLocator { fn from(full: Locator) -> Self { - let (fetcher, org_id, project, _) = full.explode(); + let (fetcher, org_id, package, _) = full.explode(); Self { fetcher, org_id, - project, + package, } } } @@ -178,18 +178,18 @@ impl From<&Locator> for PackageLocator { Self { fetcher: full.fetcher(), org_id: full.org_id(), - project: full.project().clone(), + package: full.package().clone(), } } } impl From for PackageLocator { fn from(strict: StrictLocator) -> Self { - let (fetcher, org_id, project, _) = strict.explode(); + let (fetcher, org_id, package, _) = strict.explode(); Self { fetcher, org_id, - project, + package, } } } @@ -199,7 +199,7 @@ impl From<&StrictLocator> for PackageLocator { Self { fetcher: strict.fetcher(), org_id: strict.org_id(), - project: strict.project().clone(), + package: strict.package().clone(), } } } @@ -222,7 +222,7 @@ mod tests { let parsed = PackageLocator::parse(input).expect("must parse locator"); let expected = PackageLocator::builder() .fetcher(Fetcher::Git) - .project("github.com/foo/bar") + .package("github.com/foo/bar") .build(); assert_eq!(expected, parsed); assert_eq!(&parsed.to_string(), input); @@ -234,7 +234,7 @@ mod tests { let parsed = PackageLocator::parse(input).expect("must parse locator"); let expected = PackageLocator::builder() .fetcher(Fetcher::Git) - .project("github.com/foo/bar") + .package("github.com/foo/bar") .build(); assert_eq!(expected, parsed); } @@ -247,7 +247,7 @@ mod tests { } #[test] - fn parse_missing_project() { + fn parse_missing_package() { let input = "git+"; let parsed = PackageLocator::parse(input); assert_matches!(parsed, Err(Error::Parse(ParseError::Field { .. }))); @@ -274,11 +274,11 @@ mod tests { OrgId(2385028), OrgId(19847938492847928), ]; - let projects = ["github.com/foo/bar", "some-name"]; + let packages = ["github.com/foo/bar", "some-name"]; let revisions = ["", "$", "$1", "$1234abcd1234"]; - for (fetcher, org, project, revision) in izip!(fetchers, orgs, projects, revisions) { - let input = format!("{fetcher}+{org}/{project}{revision}"); + for (fetcher, org, package, revision) in izip!(fetchers, orgs, packages, revisions) { + let input = format!("{fetcher}+{org}/{package}{revision}"); let Ok(parsed) = PackageLocator::parse(&input) else { panic!("must parse '{input}'") }; @@ -294,9 +294,9 @@ mod tests { "'org_id' in '{input}' must match" ); assert_eq!( - parsed.project().as_str(), - project, - "'project' in '{input}' must match" + parsed.package().as_str(), + package, + "'package' in '{input}' must match" ); } } @@ -306,7 +306,7 @@ mod tests { let locator = PackageLocator::builder() .fetcher(Fetcher::Custom) .org_id(1234) - .project("foo/bar") + .package("foo/bar") .build(); let rendered = locator.to_string(); @@ -317,7 +317,7 @@ mod tests { fn roundtrip_serialization() { let input = PackageLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .build(); @@ -336,7 +336,7 @@ mod tests { let input = r#"{ "locator": "custom+1/foo" }"#; let locator = PackageLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .build(); @@ -349,13 +349,13 @@ mod tests { fn promotes_locator() { let input = PackageLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .build(); let expected = Locator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .build(); let promoted = input.clone().promote(None); @@ -363,7 +363,7 @@ mod tests { let expected = Locator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .revision("bar") .build(); @@ -375,13 +375,13 @@ mod tests { fn promotes_strict() { let input = PackageLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .build(); let expected = StrictLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .revision("bar") .build(); diff --git a/src/locator_strict.rs b/src/locator_strict.rs index 48d98ae..31e3397 100644 --- a/src/locator_strict.rs +++ b/src/locator_strict.rs @@ -10,7 +10,7 @@ use utoipa::{ ToSchema, }; -use crate::{Error, Fetcher, Locator, OrgId, PackageLocator, ParseError, Project, Revision}; +use crate::{Error, Fetcher, Locator, OrgId, Package, PackageLocator, ParseError, Revision}; /// A [`Locator`] specialized to **require** the `revision` component. /// @@ -19,7 +19,7 @@ use crate::{Error, Fetcher, Locator, OrgId, PackageLocator, ParseError, Project, /// Locators order by: /// 1. Fetcher, alphanumerically. /// 2. Organization ID, alphanumerically; missing organizations are sorted higher. -/// 3. The project field, alphanumerically. +/// 3. The package field, alphanumerically. /// 4. The revision field: /// If both comparing locators use semver, these are compared using semver rules; /// otherwise these are compared alphanumerically. @@ -32,15 +32,15 @@ use crate::{Error, Fetcher, Locator, OrgId, PackageLocator, ParseError, Project, /// /// The input string must be in the following format: /// ```ignore -/// {fetcher}+{project}${revision} +/// {fetcher}+{package}${revision} /// ``` /// -/// Projects may also be namespaced to a specific organization; -/// in such cases the organization ID is at the start of the `{project}` field +/// Packages may also be namespaced to a specific organization; +/// in such cases the organization ID is at the start of the `{package}` field /// separated by a slash. The ID can be any non-negative integer. /// This yields the following format: /// ```ignore -/// {fetcher}+{org_id}/{project}${revision} +/// {fetcher}+{org_id}/{package}${revision} /// ``` #[derive( Clone, @@ -56,26 +56,26 @@ use crate::{Error, Fetcher, Locator, OrgId, PackageLocator, ParseError, Project, Documented, )] pub struct StrictLocator { - /// Determines which fetcher is used to download this project. + /// Determines which fetcher is used to download this package. #[getset(get_copy = "pub")] fetcher: Fetcher, - /// Specifies the organization ID to which this project is namespaced. + /// Specifies the organization ID to which this package is namespaced. #[builder(default, setter(transform = |id: usize| Some(OrgId(id))))] #[getset(get_copy = "pub")] org_id: Option, - /// Specifies the unique identifier for the project by fetcher. + /// Specifies the unique identifier for the package by fetcher. /// - /// For example, the `git` fetcher fetching a github project - /// uses a value in the form of `{user_name}/{project_name}`. - #[builder(setter(transform = |project: impl ToString| Project(project.to_string())))] + /// For example, the `git` fetcher fetching a github package + /// uses a value in the form of `{user_name}/{package_name}`. + #[builder(setter(transform = |package: impl ToString| Package(package.to_string())))] #[getset(get = "pub")] - project: Project, + package: Package, - /// Specifies the version for the project by fetcher. + /// Specifies the version for the package by fetcher. /// - /// For example, the `git` fetcher fetching a github project + /// For example, the `git` fetcher fetching a github package /// uses a value in the form of `{git_sha}` or `{git_tag}`, /// and the fetcher disambiguates. #[builder(setter(transform = |revision: impl ToString| Revision::from(revision.to_string())))] @@ -87,7 +87,7 @@ impl StrictLocator { /// Parse a `StrictLocator`. /// For details, see the parsing section on [`StrictLocator`]. pub fn parse(locator: &str) -> Result { - let (fetcher, org_id, project, revision) = Locator::parse(locator)?.explode(); + let (fetcher, org_id, package, revision) = Locator::parse(locator)?.explode(); let Some(revision) = revision else { return Err(Error::Parse(ParseError::Field { @@ -99,7 +99,7 @@ impl StrictLocator { Ok(Self { fetcher, org_id, - project, + package, revision, }) } @@ -118,8 +118,8 @@ impl StrictLocator { /// Explodes the locator into its (owned) parts. /// Used for conversions without cloning. - pub(crate) fn explode(self) -> (Fetcher, Option, Project, Revision) { - (self.fetcher, self.org_id, self.project, self.revision) + pub(crate) fn explode(self) -> (Fetcher, Option, Package, Revision) { + (self.fetcher, self.org_id, self.package, self.revision) } } @@ -132,9 +132,9 @@ impl Display for StrictLocator { write!(f, "{org_id}/")?; } - let project = &self.project; + let package = &self.package; let revision = &self.revision; - write!(f, "{project}${revision}")?; + write!(f, "{package}${revision}")?; Ok(()) } @@ -193,7 +193,7 @@ mod tests { let parsed = StrictLocator::parse(input).expect("must parse locator"); let expected = StrictLocator::builder() .fetcher(Fetcher::Git) - .project("github.com/foo/bar") + .package("github.com/foo/bar") .revision("abcd") .build(); assert_eq!(expected, parsed); @@ -208,7 +208,7 @@ mod tests { } #[test] - fn parse_missing_project() { + fn parse_missing_package() { let input = "git+"; let parsed = StrictLocator::parse(input); assert_matches!(parsed, Err(Error::Parse(ParseError::Field { .. }))); @@ -216,14 +216,14 @@ mod tests { #[test] fn parse_missing_revision() { - let input = "git+project"; + let input = "git+package"; let parsed = StrictLocator::parse(input); assert_matches!(parsed, Err(Error::Parse(ParseError::Field { .. }))); } #[test] fn parse_empty_revision() { - let input = "git+project$"; + let input = "git+package$"; let parsed = StrictLocator::parse(input); assert_matches!(parsed, Err(Error::Parse(ParseError::Field { .. }))); } @@ -249,11 +249,11 @@ mod tests { OrgId(2385028), OrgId(19847938492847928), ]; - let projects = ["github.com/foo/bar", "some-name"]; + let packages = ["github.com/foo/bar", "some-name"]; let revisions = ["1", "1234abcd1234"]; - for (fetcher, org, project, revision) in izip!(fetchers, orgs, projects, revisions) { - let input = format!("{fetcher}+{org}/{project}${revision}"); + for (fetcher, org, package, revision) in izip!(fetchers, orgs, packages, revisions) { + let input = format!("{fetcher}+{org}/{package}${revision}"); let Ok(parsed) = StrictLocator::parse(&input) else { panic!("must parse '{input}'") }; @@ -269,9 +269,9 @@ mod tests { "'org_id' in '{input}' must match" ); assert_eq!( - parsed.project().as_str(), - project, - "'project' in '{input}' must match" + parsed.package().as_str(), + package, + "'package' in '{input}' must match" ); assert_eq!( parsed.revision().as_str(), @@ -286,7 +286,7 @@ mod tests { let locator = StrictLocator::builder() .fetcher(Fetcher::Custom) .org_id(1234) - .project("foo/bar") + .package("foo/bar") .revision("123abc") .build(); @@ -298,7 +298,7 @@ mod tests { fn render_with_revision() { let locator = StrictLocator::builder() .fetcher(Fetcher::Custom) - .project("foo/bar") + .package("foo/bar") .revision("123abc") .build(); @@ -310,7 +310,7 @@ mod tests { fn roundtrip_serialization() { let input = StrictLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .revision("bar") .org_id(1) .build(); @@ -330,7 +330,7 @@ mod tests { let input = r#"{ "locator": "custom+1/foo$bar" }"#; let locator = StrictLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .revision("bar") .org_id(1) .build(); @@ -344,14 +344,14 @@ mod tests { fn demotes_package() { let input = StrictLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .revision("bar") .org_id(1) .build(); let expected = PackageLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .build(); let demoted = input.clone().into_package(); @@ -362,14 +362,14 @@ mod tests { fn demotes_locator() { let input = StrictLocator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .revision("bar") .org_id(1) .build(); let expected = Locator::builder() .fetcher(Fetcher::Custom) - .project("foo") + .package("foo") .org_id(1) .revision("bar") .build();