Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

feat: allow ignoring specific dependency and version for multiple-dependency-versions #84

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading