Skip to content

Commit

Permalink
feat: allow ignoring specific dependency and version for `multiple-de…
Browse files Browse the repository at this point in the history
…pendency-versions` (#84)
  • Loading branch information
QuiiBz authored Aug 1, 2024
1 parent beda8aa commit 4d0fee3
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 18 deletions.
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ sherif -p @repo/tools
sherif -p "./integrations/*"
```

> **Note**
> **Note*13.2.4*
> Sherif doesn't have many rules for now, but will likely have more in the future (along with more features).
#### `empty-dependencies`
Expand All @@ -93,11 +93,14 @@ sherif -p "./integrations/*"

A given dependency should use the same version across the monorepo.

You can ignore this rule for a dependency if you expect to have multiple versions by using `--ignore-dependency <name>` (or `-i <name>`):
You can ignore this rule for a specific dependency and version or all versions of a dependency if it's expected in your monorepo by using `--ignore-dependency <name@version>` / `--ignore-dependency <name>` (or `-i <name@version>` / `-i <name>`):

```bash
# Ignore dependencies that are expected to have multiple versions
sherif -i react -i @types/node
# Ignore only the specific dependency version mismatch
sherif -i react@17.0.2 -i next@13.2.4

# Completely ignore all versions mismatch of these dependencies
sherif -i react -i next
```

#### `non-existant-packages` ⚠️
Expand Down
2 changes: 1 addition & 1 deletion src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ pub struct Args {
#[arg(long)]
pub fix: bool,

/// Ignore the `multiple-dependency-versions` rule for the given dependency name.
/// Ignore the `multiple-dependency-versions` rule for the given dependency name and/or version.
#[arg(long, short)]
pub ignore_dependency: Vec<String>,

Expand Down
59 changes: 47 additions & 12 deletions src/collect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -266,24 +266,31 @@ pub fn collect_issues(args: &Args, packages_list: PackagesList) -> IssuesList<'_
}
}

for (name, mut versions) in all_dependencies {
if versions.len() > 1
&& !versions
for (name, versions) in all_dependencies {
let mut filtered_versions = versions
.iter()
.filter(|(_, version)| {
!args
.ignore_dependency
.contains(&format!("{}@{}", name, version))
})
.map(|(path, version)| (path.clone(), version.clone()))
.collect::<IndexMap<_, _>>();

if filtered_versions.len() > 1
&& !filtered_versions
.values()
.collect::<Vec<_>>()
.windows(2)
.all(|window| window[0] == window[1])
&& !args.ignore_dependency.contains(&name)
{
let ignored = args.ignore_dependency.contains(&name);

if !ignored {
versions.sort_keys();
filtered_versions.sort_keys();

issues.add_raw(
PackageType::None,
MultipleDependencyVersionsIssue::new(name, versions),
);
}
issues.add_raw(
PackageType::None,
MultipleDependencyVersionsIssue::new(name, filtered_versions),
);
}
}

Expand Down Expand Up @@ -569,6 +576,34 @@ mod test {
);
}

#[test]
fn collect_dependencies_allow() {
let args = Args {
path: "fixtures/dependencies".into(),
fix: false,
ignore_rule: Vec::new(),
ignore_package: Vec::new(),
ignore_dependency: vec!["next@4.5.6".to_string()],
};

let packages_list = collect_packages(&args).unwrap();
assert_eq!(packages_list.root_package.get_name(), "dependencies");

let issues = collect_issues(&args, packages_list);
assert_eq!(issues.total_len(), 2);

let issues = issues.into_iter().collect::<IndexMap<_, _>>();

assert_eq!(
issues.get(&PackageType::None).unwrap()[0].name(),
"multiple-dependency-versions"
);
assert_eq!(
issues.get(&PackageType::None).unwrap()[1].name(),
"multiple-dependency-versions"
);
}

#[test]
fn collect_dependencies_without_star() {
let args = Args {
Expand Down
2 changes: 1 addition & 1 deletion src/packages/semversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use anyhow::{anyhow, Result};
use semver::{Version, VersionReq};
use std::{cmp::Ordering, fmt::Display};

#[derive(Debug, PartialEq, Eq)]
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum SemVersion {
Exact(Version),
Range(VersionReq),
Expand Down

0 comments on commit 4d0fee3

Please # to comment.