Skip to content

Commit

Permalink
fix: improve when we print brackets (#861)
Browse files Browse the repository at this point in the history
  • Loading branch information
wolfv committed Sep 12, 2024
1 parent 4885895 commit 7d13a20
Showing 1 changed file with 31 additions and 4 deletions.
35 changes: 31 additions & 4 deletions crates/rattler_conda_types/src/version_spec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,11 @@ impl Display for LogicalOperator {

impl Display for VersionSpec {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
fn write(spec: &VersionSpec, f: &mut Formatter<'_>, part_of_or: bool) -> std::fmt::Result {
fn write(
spec: &VersionSpec,
f: &mut Formatter<'_>,
parent_op: Option<LogicalOperator>,
) -> std::fmt::Result {
match spec {
VersionSpec::Any => write!(f, "*"),
VersionSpec::StrictRange(op, version) => match op {
Expand All @@ -266,15 +270,19 @@ impl Display for VersionSpec {
write!(f, "{op}{version}")
}
VersionSpec::Group(op, group) => {
let requires_parenthesis = *op == LogicalOperator::And && part_of_or;
let requires_parenthesis = matches!(
(op, parent_op),
(LogicalOperator::Or, Some(LogicalOperator::And))
);

if requires_parenthesis {
write!(f, "(")?;
}
for (i, spec) in group.iter().enumerate() {
if i > 0 {
write!(f, "{op}")?;
}
write(spec, f, *op == LogicalOperator::Or)?;
write(spec, f, Some(*op))?;
}
if requires_parenthesis {
write!(f, ")")?;
Expand All @@ -285,7 +293,7 @@ impl Display for VersionSpec {
}
}

write(self, f, false)
write(self, f, None)
}
}

Expand Down Expand Up @@ -489,6 +497,25 @@ mod tests {
assert!(VersionSpec::from_str("0.2.18.*.", ParseStrictness::Strict).is_err());
}

#[test]
fn issue_bracket_printing() {
let v = VersionSpec::from_str("(>=1,<2)|>3", ParseStrictness::Lenient).unwrap();
assert_eq!(format!("{}", v), ">=1,<2|>3");

let v = VersionSpec::from_str("(>=1|<2),>3", ParseStrictness::Lenient).unwrap();
assert_eq!(format!("{}", v), "(>=1|<2),>3");

let v = VersionSpec::from_str("(>=1|<2)|>3", ParseStrictness::Lenient).unwrap();
assert_eq!(format!("{}", v), ">=1|<2|>3");

let v = VersionSpec::from_str("(>=1,<2),>3", ParseStrictness::Lenient).unwrap();
assert_eq!(format!("{}", v), ">=1,<2,>3");

let v =
VersionSpec::from_str("((>=1|>2),(>3|>4))|(>5,<6)", ParseStrictness::Lenient).unwrap();
assert_eq!(format!("{}", v), "(>=1|>2),(>3|>4)|>5,<6");
}

#[test]
fn issue_star_operator() {
assert_eq!(
Expand Down

0 comments on commit 7d13a20

Please sign in to comment.