Skip to content

Commit 8c37699

Browse files
authored
Split version ranges into their own crate (#262)
* Split version ranges into their own crate * polish * Rename to `Ranges` * Doc * Use union feature for smallvec > This feature requires Rust 1.49. > When the union feature is enabled smallvec will track its state (inline or spilled) without the use of an enum tag, reducing the size of the smallvec by one machine word. This means that there is potentially no space overhead compared to Vec. Note that smallvec can still be larger than Vec if the inline buffer is larger than two machine words. * Use `SmallVec<[Interval<V>; 1]>` for better performance * Move comments. * Add alias to avoid breaking change
1 parent be52667 commit 8c37699

21 files changed

+431
-393
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ jobs:
1616
steps:
1717
- uses: actions/checkout@v4
1818
- uses: dtolnay/rust-toolchain@stable
19-
- run: cargo build --verbose
20-
- run: cargo test --features=serde --verbose
19+
- run: cargo build --verbose --workspace
20+
- run: cargo test --all-features --workspace --verbose
2121

2222
clippy:
2323
name: No warnings from Clippy
@@ -30,7 +30,7 @@ jobs:
3030
- name: Check Clippy lints
3131
env:
3232
RUSTFLAGS: -D warnings
33-
run: cargo clippy
33+
run: cargo clippy --workspace
3434

3535
check_formatting:
3636
name: Source code is formatted
@@ -51,4 +51,4 @@ jobs:
5151
- name: Check documentation
5252
env:
5353
RUSTDOCFLAGS: -D warnings
54-
run: cargo doc --no-deps --document-private-items
54+
run: cargo doc --workspace --no-deps --document-private-items

Cargo.lock

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# SPDX-License-Identifier: MPL-2.0
22

3+
[workspace]
4+
members = ["version-ranges"]
5+
36
[package]
47
name = "pubgrub"
58
version = "0.2.1"
@@ -21,18 +24,23 @@ include = ["Cargo.toml", "LICENSE", "README.md", "src/**", "tests/**", "examples
2124

2225
[dependencies]
2326
indexmap = "2.5.0"
27+
log = "0.4.22" # for debug logs in tests
2428
priority-queue = "2.1.1"
25-
thiserror = "1.0"
2629
rustc-hash = ">=1.0.0, <3.0.0"
2730
serde = { version = "1.0", features = ["derive"], optional = true }
28-
log = "0.4.22" # for debug logs in tests
31+
thiserror = "1.0"
32+
version-ranges = { version = "0.1.0", path = "version-ranges" }
2933

3034
[dev-dependencies]
35+
criterion = "0.5"
36+
env_logger = "0.11.5"
3137
proptest = "1.5.0"
3238
ron = "=0.9.0-alpha.0"
3339
varisat = "0.2.2"
34-
criterion = "0.5"
35-
env_logger = "0.11.5"
40+
version-ranges = { version = "0.1.0", path = "version-ranges", features = ["proptest"] }
41+
42+
[features]
43+
serde = ["dep:serde", "version-ranges/serde"]
3644

3745
[[bench]]
3846
name = "large_case"

examples/branching_error_reporting.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// SPDX-License-Identifier: MPL-2.0
22

33
use pubgrub::{
4-
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Range, Reporter,
4+
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Ranges, Reporter,
55
SemanticVersion,
66
};
77

8-
type SemVS = Range<SemanticVersion>;
8+
type SemVS = Ranges<SemanticVersion>;
99

1010
// https://github.com/dart-lang/pub/blob/master/doc/solver.md#branching-error-reporting
1111
fn main() {
@@ -14,31 +14,31 @@ fn main() {
1414
// root 1.0.0 depends on foo ^1.0.0
1515
dependency_provider.add_dependencies(
1616
"root", (1, 0, 0),
17-
[("foo", Range::from_range_bounds((1, 0, 0)..(2, 0, 0)))],
17+
[("foo", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0)))],
1818
);
1919
#[rustfmt::skip]
2020
// foo 1.0.0 depends on a ^1.0.0 and b ^1.0.0
2121
dependency_provider.add_dependencies(
2222
"foo", (1, 0, 0),
2323
[
24-
("a", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
25-
("b", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
24+
("a", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
25+
("b", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
2626
],
2727
);
2828
#[rustfmt::skip]
2929
// foo 1.1.0 depends on x ^1.0.0 and y ^1.0.0
3030
dependency_provider.add_dependencies(
3131
"foo", (1, 1, 0),
3232
[
33-
("x", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
34-
("y", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
33+
("x", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
34+
("y", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
3535
],
3636
);
3737
#[rustfmt::skip]
3838
// a 1.0.0 depends on b ^2.0.0
3939
dependency_provider.add_dependencies(
4040
"a", (1, 0, 0),
41-
[("b", Range::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
41+
[("b", Ranges::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
4242
);
4343
// b 1.0.0 and 2.0.0 have no dependencies.
4444
dependency_provider.add_dependencies("b", (1, 0, 0), []);
@@ -47,7 +47,7 @@ fn main() {
4747
// x 1.0.0 depends on y ^2.0.0.
4848
dependency_provider.add_dependencies(
4949
"x", (1, 0, 0),
50-
[("y", Range::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
50+
[("y", Ranges::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
5151
);
5252
// y 1.0.0 and 2.0.0 have no dependencies.
5353
dependency_provider.add_dependencies("y", (1, 0, 0), []);

examples/caching_dependency_provider.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
use std::cell::RefCell;
44

5-
use pubgrub::{resolve, Dependencies, DependencyProvider, OfflineDependencyProvider, Range};
5+
use pubgrub::{resolve, Dependencies, DependencyProvider, OfflineDependencyProvider, Ranges};
66

7-
type NumVS = Range<u32>;
7+
type NumVS = Ranges<u32>;
88

99
// An example implementing caching dependency provider that will
1010
// store queried dependencies in memory and check them before querying more from remote.
@@ -51,14 +51,14 @@ impl<DP: DependencyProvider<M = String>> DependencyProvider for CachingDependenc
5151
}
5252
}
5353

54-
fn choose_version(&self, package: &DP::P, range: &DP::VS) -> Result<Option<DP::V>, DP::Err> {
55-
self.remote_dependencies.choose_version(package, range)
54+
fn choose_version(&self, package: &DP::P, ranges: &DP::VS) -> Result<Option<DP::V>, DP::Err> {
55+
self.remote_dependencies.choose_version(package, ranges)
5656
}
5757

5858
type Priority = DP::Priority;
5959

60-
fn prioritize(&self, package: &DP::P, range: &DP::VS) -> Self::Priority {
61-
self.remote_dependencies.prioritize(package, range)
60+
fn prioritize(&self, package: &DP::P, ranges: &DP::VS) -> Self::Priority {
61+
self.remote_dependencies.prioritize(package, ranges)
6262
}
6363

6464
type Err = DP::Err;

examples/doc_interface.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// SPDX-License-Identifier: MPL-2.0
22

3-
use pubgrub::{resolve, OfflineDependencyProvider, Range};
3+
use pubgrub::{resolve, OfflineDependencyProvider, Ranges};
44

5-
type NumVS = Range<u32>;
5+
type NumVS = Ranges<u32>;
66

77
// `root` depends on `menu` and `icons`
88
// `menu` depends on `dropdown`
@@ -12,10 +12,10 @@ type NumVS = Range<u32>;
1212
fn main() {
1313
let mut dependency_provider = OfflineDependencyProvider::<&str, NumVS>::new();
1414
dependency_provider.add_dependencies(
15-
"root", 1u32, [("menu", Range::full()), ("icons", Range::full())],
15+
"root", 1u32, [("menu", Ranges::full()), ("icons", Ranges::full())],
1616
);
17-
dependency_provider.add_dependencies("menu", 1u32, [("dropdown", Range::full())]);
18-
dependency_provider.add_dependencies("dropdown", 1u32, [("icons", Range::full())]);
17+
dependency_provider.add_dependencies("menu", 1u32, [("dropdown", Ranges::full())]);
18+
dependency_provider.add_dependencies("dropdown", 1u32, [("icons", Ranges::full())]);
1919
dependency_provider.add_dependencies("icons", 1u32, []);
2020

2121
// Run the algorithm.

examples/doc_interface_error.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// SPDX-License-Identifier: MPL-2.0
22

33
use pubgrub::{
4-
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Range, Reporter,
4+
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Ranges, Reporter,
55
SemanticVersion,
66
};
77

8-
type SemVS = Range<SemanticVersion>;
8+
type SemVS = Ranges<SemanticVersion>;
99

1010
// `root` depends on `menu`, `icons 1.0.0` and `intl 5.0.0`
1111
// `menu 1.0.0` depends on `dropdown < 2.0.0`
@@ -19,46 +19,46 @@ fn main() {
1919
let mut dependency_provider = OfflineDependencyProvider::<&str, SemVS>::new();
2020
// Direct dependencies: menu and icons.
2121
dependency_provider.add_dependencies("root", (1, 0, 0), [
22-
("menu", Range::full()),
23-
("icons", Range::singleton((1, 0, 0))),
24-
("intl", Range::singleton((5, 0, 0))),
22+
("menu", Ranges::full()),
23+
("icons", Ranges::singleton((1, 0, 0))),
24+
("intl", Ranges::singleton((5, 0, 0))),
2525
]);
2626

2727
// Dependencies of the menu lib.
2828
dependency_provider.add_dependencies("menu", (1, 0, 0), [
29-
("dropdown", Range::from_range_bounds(..(2, 0, 0))),
29+
("dropdown", Ranges::from_range_bounds(..(2, 0, 0))),
3030
]);
3131
dependency_provider.add_dependencies("menu", (1, 1, 0), [
32-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
32+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
3333
]);
3434
dependency_provider.add_dependencies("menu", (1, 2, 0), [
35-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
35+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
3636
]);
3737
dependency_provider.add_dependencies("menu", (1, 3, 0), [
38-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
38+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
3939
]);
4040
dependency_provider.add_dependencies("menu", (1, 4, 0), [
41-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
41+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
4242
]);
4343
dependency_provider.add_dependencies("menu", (1, 5, 0), [
44-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
44+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
4545
]);
4646

4747
// Dependencies of the dropdown lib.
4848
dependency_provider.add_dependencies("dropdown", (1, 8, 0), [
49-
("intl", Range::singleton((3, 0, 0))),
49+
("intl", Ranges::singleton((3, 0, 0))),
5050
]);
5151
dependency_provider.add_dependencies("dropdown", (2, 0, 0), [
52-
("icons", Range::singleton((2, 0, 0))),
52+
("icons", Ranges::singleton((2, 0, 0))),
5353
]);
5454
dependency_provider.add_dependencies("dropdown", (2, 1, 0), [
55-
("icons", Range::singleton((2, 0, 0))),
55+
("icons", Ranges::singleton((2, 0, 0))),
5656
]);
5757
dependency_provider.add_dependencies("dropdown", (2, 2, 0), [
58-
("icons", Range::singleton((2, 0, 0))),
58+
("icons", Ranges::singleton((2, 0, 0))),
5959
]);
6060
dependency_provider.add_dependencies("dropdown", (2, 3, 0), [
61-
("icons", Range::singleton((2, 0, 0))),
61+
("icons", Ranges::singleton((2, 0, 0))),
6262
]);
6363

6464
// Icons have no dependencies.

examples/doc_interface_semantic.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// SPDX-License-Identifier: MPL-2.0
22

33
use pubgrub::{
4-
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Range, Reporter,
4+
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Ranges, Reporter,
55
SemanticVersion,
66
};
77

8-
type SemVS = Range<SemanticVersion>;
8+
type SemVS = Ranges<SemanticVersion>;
99

1010
// `root` depends on `menu` and `icons 1.0.0`
1111
// `menu 1.0.0` depends on `dropdown < 2.0.0`
@@ -18,43 +18,43 @@ fn main() {
1818
let mut dependency_provider = OfflineDependencyProvider::<&str, SemVS>::new();
1919
// Direct dependencies: menu and icons.
2020
dependency_provider.add_dependencies("root", (1, 0, 0), [
21-
("menu", Range::full()),
22-
("icons", Range::singleton((1, 0, 0))),
21+
("menu", Ranges::full()),
22+
("icons", Ranges::singleton((1, 0, 0))),
2323
]);
2424

2525
// Dependencies of the menu lib.
2626
dependency_provider.add_dependencies("menu", (1, 0, 0), [
27-
("dropdown", Range::from_range_bounds(..(2, 0, 0))),
27+
("dropdown", Ranges::from_range_bounds(..(2, 0, 0))),
2828
]);
2929
dependency_provider.add_dependencies("menu", (1, 1, 0), [
30-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
30+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
3131
]);
3232
dependency_provider.add_dependencies("menu", (1, 2, 0), [
33-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
33+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
3434
]);
3535
dependency_provider.add_dependencies("menu", (1, 3, 0), [
36-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
36+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
3737
]);
3838
dependency_provider.add_dependencies("menu", (1, 4, 0), [
39-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
39+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
4040
]);
4141
dependency_provider.add_dependencies("menu", (1, 5, 0), [
42-
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
42+
("dropdown", Ranges::from_range_bounds((2, 0, 0)..)),
4343
]);
4444

4545
// Dependencies of the dropdown lib.
4646
dependency_provider.add_dependencies("dropdown", (1, 8, 0), []);
4747
dependency_provider.add_dependencies("dropdown", (2, 0, 0), [
48-
("icons", Range::singleton((2, 0, 0))),
48+
("icons", Ranges::singleton((2, 0, 0))),
4949
]);
5050
dependency_provider.add_dependencies("dropdown", (2, 1, 0), [
51-
("icons", Range::singleton((2, 0, 0))),
51+
("icons", Ranges::singleton((2, 0, 0))),
5252
]);
5353
dependency_provider.add_dependencies("dropdown", (2, 2, 0), [
54-
("icons", Range::singleton((2, 0, 0))),
54+
("icons", Ranges::singleton((2, 0, 0))),
5555
]);
5656
dependency_provider.add_dependencies("dropdown", (2, 3, 0), [
57-
("icons", Range::singleton((2, 0, 0))),
57+
("icons", Ranges::singleton((2, 0, 0))),
5858
]);
5959

6060
// Icons has no dependency.

examples/linear_error_reporting.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// SPDX-License-Identifier: MPL-2.0
22

33
use pubgrub::{
4-
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Range, Reporter,
4+
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Ranges, Reporter,
55
SemanticVersion,
66
};
77

8-
type SemVS = Range<SemanticVersion>;
8+
type SemVS = Ranges<SemanticVersion>;
99

1010
// https://github.com/dart-lang/pub/blob/master/doc/solver.md#linear-error-reporting
1111
fn main() {
@@ -15,21 +15,21 @@ fn main() {
1515
dependency_provider.add_dependencies(
1616
"root", (1, 0, 0),
1717
[
18-
("foo", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
19-
("baz", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
18+
("foo", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
19+
("baz", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
2020
],
2121
);
2222
#[rustfmt::skip]
2323
// foo 1.0.0 depends on bar ^2.0.0
2424
dependency_provider.add_dependencies(
2525
"foo", (1, 0, 0),
26-
[("bar", Range::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
26+
[("bar", Ranges::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
2727
);
2828
#[rustfmt::skip]
2929
// bar 2.0.0 depends on baz ^3.0.0
3030
dependency_provider.add_dependencies(
3131
"bar", (2, 0, 0),
32-
[("baz", Range::from_range_bounds((3, 0, 0)..(4, 0, 0)))],
32+
[("baz", Ranges::from_range_bounds((3, 0, 0)..(4, 0, 0)))],
3333
);
3434
// baz 1.0.0 and 3.0.0 have no dependencies
3535
dependency_provider.add_dependencies("baz", (1, 0, 0), []);

0 commit comments

Comments
 (0)