Wrap `Range` types in reporter for customizable display impl

This commit is contained in:
Zanie 2024-01-09 10:49:23 -06:00
parent ee6d809b60
commit 52f72d23c8
3 changed files with 84 additions and 15 deletions

2
Cargo.lock generated
View File

@ -2246,7 +2246,7 @@ dependencies = [
[[package]] [[package]]
name = "pubgrub" name = "pubgrub"
version = "0.2.1" version = "0.2.1"
source = "git+https://github.com/zanieb/pubgrub?rev=866c0f2a87fee1e8abe804d40a2ee934de0973d7#866c0f2a87fee1e8abe804d40a2ee934de0973d7" source = "git+https://github.com/zanieb/pubgrub?rev=c7cefdab4e69f123cba10bcc297f9ceed46a9dc5#c7cefdab4e69f123cba10bcc297f9ceed46a9dc5"
dependencies = [ dependencies = [
"indexmap 2.1.0", "indexmap 2.1.0",
"log", "log",

View File

@ -52,7 +52,7 @@ owo-colors = { version = "3.5.0" }
petgraph = { version = "0.6.4" } petgraph = { version = "0.6.4" }
platform-info = { version = "2.0.2" } platform-info = { version = "2.0.2" }
plist = { version = "1.6.0" } plist = { version = "1.6.0" }
pubgrub = { git = "https://github.com/zanieb/pubgrub", rev = "866c0f2a87fee1e8abe804d40a2ee934de0973d7" } pubgrub = { git = "https://github.com/zanieb/pubgrub", rev = "c7cefdab4e69f123cba10bcc297f9ceed46a9dc5" }
pyo3 = { version = "0.20.2" } pyo3 = { version = "0.20.2" }
pyo3-log = { version = "0.9.0"} pyo3-log = { version = "0.9.0"}
pyproject-toml = { version = "0.8.1" } pyproject-toml = { version = "0.8.1" }

View File

@ -1,4 +1,5 @@
use std::borrow::Cow; use std::borrow::Cow;
use std::ops::Bound;
use derivative::Derivative; use derivative::Derivative;
use owo_colors::OwoColorize; use owo_colors::OwoColorize;
@ -35,7 +36,10 @@ impl ReportFormatter<PubGrubPackage, Range<PubGrubVersion>> for PubGrubReportFor
if set.as_ref() == &Range::full() { if set.as_ref() == &Range::full() {
format!("there are no versions of {package}") format!("there are no versions of {package}")
} else { } else {
format!("there are no versions of {package}{set}") format!(
"there are no versions of {package}{}",
PubGrubRange::new(&set)
)
} }
} }
External::UnavailableDependencies(package, set) => { External::UnavailableDependencies(package, set) => {
@ -43,7 +47,10 @@ impl ReportFormatter<PubGrubPackage, Range<PubGrubVersion>> for PubGrubReportFor
if set.as_ref() == &Range::full() { if set.as_ref() == &Range::full() {
format!("dependencies of {package} are unavailable") format!("dependencies of {package} are unavailable")
} else { } else {
format!("dependencies of {package}{set} are unavailable") format!(
"dependencies of {package}{} are unavailable",
PubGrubRange::new(&set)
)
} }
} }
External::UnusableDependencies(package, set, reason) => { External::UnusableDependencies(package, set, reason) => {
@ -55,7 +62,10 @@ impl ReportFormatter<PubGrubPackage, Range<PubGrubVersion>> for PubGrubReportFor
if set.as_ref() == &Range::full() { if set.as_ref() == &Range::full() {
format!("dependencies of {package} are unusable: {reason}") format!("dependencies of {package} are unusable: {reason}")
} else { } else {
format!("dependencies of {package}{set} are unusable: {reason}",) format!(
"dependencies of {package}{} are unusable: {reason}",
PubGrubRange::new(&set)
)
} }
} }
} else { } else {
@ -63,7 +73,10 @@ impl ReportFormatter<PubGrubPackage, Range<PubGrubVersion>> for PubGrubReportFor
if set.as_ref() == &Range::full() { if set.as_ref() == &Range::full() {
format!("dependencies of {package} are unusable") format!("dependencies of {package} are unusable")
} else { } else {
format!("dependencies of {package}{set} are unusable") format!(
"dependencies of {package}{} are unusable",
PubGrubRange::new(&set)
)
} }
} }
} }
@ -75,20 +88,33 @@ impl ReportFormatter<PubGrubPackage, Range<PubGrubVersion>> for PubGrubReportFor
{ {
format!("{package} depends on {dependency}") format!("{package} depends on {dependency}")
} else if package_set.as_ref() == &Range::full() { } else if package_set.as_ref() == &Range::full() {
format!("{package} depends on {dependency}{dependency_set}") format!(
"{package} depends on {dependency}{}",
PubGrubRange::new(&dependency_set)
)
} else if dependency_set.as_ref() == &Range::full() { } else if dependency_set.as_ref() == &Range::full() {
if matches!(package, PubGrubPackage::Root(_)) { if matches!(package, PubGrubPackage::Root(_)) {
// Exclude the dummy version for root packages // Exclude the dummy version for root packages
format!("{package} depends on {dependency}") format!("{package} depends on {dependency}")
} else { } else {
format!("{package}{package_set} depends on {dependency}") format!(
"{package}{} depends on {dependency}",
PubGrubRange::new(&package_set)
)
} }
} else { } else {
if matches!(package, PubGrubPackage::Root(_)) { if matches!(package, PubGrubPackage::Root(_)) {
// Exclude the dummy version for root packages // Exclude the dummy version for root packages
format!("{package} depends on {dependency}{dependency_set}") format!(
"{package} depends on {dependency}{}",
PubGrubRange::new(&dependency_set)
)
} else { } else {
format!("{package}{package_set} depends on {dependency}{dependency_set}") format!(
"{package}{} depends on {dependency}{}",
PubGrubRange::new(&package_set),
PubGrubRange::new(&dependency_set)
)
} }
} }
} }
@ -107,7 +133,7 @@ impl ReportFormatter<PubGrubPackage, Range<PubGrubVersion>> for PubGrubReportFor
.unwrap_or(&vec![]) .unwrap_or(&vec![])
.iter(), .iter(),
); );
format!("{package}{range} is forbidden") format!("{package}{} is forbidden", PubGrubRange::new(&range))
} }
[(package @ PubGrubPackage::Package(..), Term::Negative(range))] => { [(package @ PubGrubPackage::Package(..), Term::Negative(range))] => {
let range = range.simplify( let range = range.simplify(
@ -116,7 +142,7 @@ impl ReportFormatter<PubGrubPackage, Range<PubGrubVersion>> for PubGrubReportFor
.unwrap_or(&vec![]) .unwrap_or(&vec![])
.iter(), .iter(),
); );
format!("{package}{range} is mandatory") format!("{package}{} is mandatory", PubGrubRange::new(&range))
} }
[(p1, Term::Positive(r1)), (p2, Term::Negative(r2))] => self.format_external( [(p1, Term::Positive(r1)), (p2, Term::Negative(r2))] => self.format_external(
&External::FromDependencyOf((*p1).clone(), r1.clone(), (*p2).clone(), r2.clone()), &External::FromDependencyOf((*p1).clone(), r1.clone(), (*p2).clone(), r2.clone()),
@ -265,14 +291,14 @@ impl std::fmt::Display for PubGrubHint {
"hint".bold().cyan(), "hint".bold().cyan(),
":".bold(), ":".bold(),
package.bold(), package.bold(),
range.bold() PubGrubRange::new(range).bold()
) )
} }
} }
} }
} }
/// A derivative of the [Term] type with custom formatting. /// A derivative of [Term] with custom formatting.
struct PubGrubTerm { struct PubGrubTerm {
inner: Term<Range<PubGrubVersion>>, inner: Term<Range<PubGrubVersion>>,
} }
@ -285,7 +311,7 @@ impl std::fmt::Display for PubGrubTerm {
if let Some(version) = set.as_singleton() { if let Some(version) = set.as_singleton() {
write!(f, "!={version}") write!(f, "!={version}")
} else { } else {
write!(f, "!( {set} )") write!(f, "!( {} )", PubGrubRange::new(set))
} }
} }
} }
@ -297,3 +323,46 @@ impl PubGrubTerm {
PubGrubTerm { inner: term } PubGrubTerm { inner: term }
} }
} }
/// A derivative of [Range] with custom formatting.
struct PubGrubRange<'a> {
inner: &'a Range<PubGrubVersion>,
}
impl std::fmt::Display for PubGrubRange<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.inner.is_empty() {
write!(f, "")?;
} else {
for (idx, segment) in self.inner.iter().enumerate() {
if idx > 0 {
write!(f, " | ")?;
}
match segment {
(Bound::Unbounded, Bound::Unbounded) => write!(f, "*")?,
(Bound::Unbounded, Bound::Included(v)) => write!(f, "<={v}")?,
(Bound::Unbounded, Bound::Excluded(v)) => write!(f, "<{v}")?,
(Bound::Included(v), Bound::Unbounded) => write!(f, ">={v}")?,
(Bound::Included(v), Bound::Included(b)) => {
if v == b {
write!(f, "=={v}")?;
} else {
write!(f, ">={v}, <={b}")?;
}
}
(Bound::Included(v), Bound::Excluded(b)) => write!(f, ">={v}, <{b}")?,
(Bound::Excluded(v), Bound::Unbounded) => write!(f, ">{v}")?,
(Bound::Excluded(v), Bound::Included(b)) => write!(f, ">{v}, <={b}")?,
(Bound::Excluded(v), Bound::Excluded(b)) => write!(f, ">{v}, <{b}")?,
};
}
}
Ok(())
}
}
impl PubGrubRange<'_> {
fn new(range: &Range<PubGrubVersion>) -> PubGrubRange {
PubGrubRange { inner: range }
}
}