Skip to content

Commit a6c9364

Browse files
committed
Update to account for parsing happening at creation of Range instead of at use.
1 parent e55e879 commit a6c9364

File tree

10 files changed

+190
-172
lines changed

10 files changed

+190
-172
lines changed

compiler-cli/src/dependencies.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use futures::future;
1111
use gleam_core::{
1212
Error, Result,
1313
build::{Mode, Target, Telemetry},
14-
config::PackageConfig,
14+
config::{GleamVersion, PackageConfig},
1515
dependency,
1616
error::{FileIoAction, FileKind, ShellCommandFailureReason, StandardIoAction},
1717
hex::{self, HEXPM_PUBLIC_KEY},
@@ -295,7 +295,10 @@ fn remove_extra_requirements(config: &PackageConfig, manifest: &mut Manifest) ->
295295
pub fn parse_gleam_add_specifier(package: &str) -> Result<(EcoString, Requirement)> {
296296
let Some((package, version)) = package.split_once('@') else {
297297
// Default to the latest version available.
298-
return Ok((package.into(), Requirement::hex(">= 0.0.0")));
298+
return Ok((
299+
package.into(),
300+
Requirement::hex(">= 0.0.0").expect(">= 0.0.0 should be a valid requirement"),
301+
));
299302
};
300303

301304
// Parse the major and minor from the provided semantic version.
@@ -338,7 +341,7 @@ pub fn parse_gleam_add_specifier(package: &str) -> Result<(EcoString, Requiremen
338341
),
339342
});
340343
}
341-
};
344+
}?;
342345

343346
Ok((package.into(), requirement))
344347
}
@@ -1075,8 +1078,8 @@ fn provide_package(
10751078
match provided.get(&package_name) {
10761079
Some(package) if package.source == package_source => {
10771080
// This package has already been provided from this source, return the version
1078-
let version = hexpm::version::Range::new(format!("== {}", &package.version));
1079-
return Ok(version);
1081+
let version = GleamVersion::new(format!("== {}", &package.version))?;
1082+
return Ok(version.hex().clone());
10801083
}
10811084
Some(package) => {
10821085
// This package has already been provided from a different source which conflicts
@@ -1123,7 +1126,7 @@ fn provide_package(
11231126
}
11241127
let _ = parents.pop();
11251128
// Add the package to the provided packages dictionary
1126-
let version = hexpm::version::Range::new(format!("== {}", &config.version));
1129+
let version = GleamVersion::new(format!("== {}", &config.version))?;
11271130
let _ = provided.insert(
11281131
config.name,
11291132
ProvidedPackage {
@@ -1133,7 +1136,7 @@ fn provide_package(
11331136
},
11341137
);
11351138
// Return the version
1136-
Ok(version)
1139+
Ok(version.hex().clone())
11371140
}
11381141

11391142
/// Unlocks specified packages and their unique dependencies.

compiler-cli/src/dependencies/tests.rs

Lines changed: 49 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -320,60 +320,36 @@ fn parse_gleam_add_specifier_non_numeric_version() {
320320
#[test]
321321
fn parse_gleam_add_specifier_default() {
322322
let provided = "some_package";
323-
let expected = ">= 0.0.0";
323+
let expected = Requirement::hex(">= 0.0.0").unwrap();
324324
let (package, version) = parse_gleam_add_specifier(provided).unwrap();
325-
match &version {
326-
Requirement::Hex { version: v } => {
327-
assert!(v.to_pubgrub().is_ok(), "failed pubgrub parse: {v}");
328-
}
329-
_ => assert!(false, "failed hexpm version parse: {provided}"),
330-
}
331-
assert_eq!(version, Requirement::hex(expected));
325+
assert_eq!(version, expected);
332326
assert_eq!("some_package", package);
333327
}
334328

335329
#[test]
336330
fn parse_gleam_add_specifier_major_only() {
337331
let provided = "wobble@1";
338-
let expected = ">= 1.0.0 and < 2.0.0";
332+
let expected = Requirement::hex(">= 1.0.0 and < 2.0.0").unwrap();
339333
let (package, version) = parse_gleam_add_specifier(provided).unwrap();
340-
match &version {
341-
Requirement::Hex { version: v } => {
342-
assert!(v.to_pubgrub().is_ok(), "failed pubgrub parse: {v}");
343-
}
344-
_ => assert!(false, "failed hexpm version parse: {provided}"),
345-
}
346-
assert_eq!(version, Requirement::hex(expected));
334+
assert_eq!(version, expected);
347335
assert_eq!("wobble", package);
348336
}
349337

350338
#[test]
351339
fn parse_gleam_add_specifier_major_and_minor() {
352340
let provided = "[email protected]";
353-
let expected = ">= 1.2.0 and < 2.0.0";
341+
let expected = Requirement::hex(">= 1.2.0 and < 2.0.0").unwrap();
354342
let (package, version) = parse_gleam_add_specifier(provided).unwrap();
355-
match &version {
356-
Requirement::Hex { version: v } => {
357-
assert!(v.to_pubgrub().is_ok(), "failed pubgrub parse: {v}");
358-
}
359-
_ => assert!(false, "failed hexpm version parse: {provided}"),
360-
}
361-
assert_eq!(version, Requirement::hex(expected));
343+
assert_eq!(version, expected);
362344
assert_eq!("wibble", package);
363345
}
364346

365347
#[test]
366348
fn parse_gleam_add_specifier_major_minor_and_patch() {
367349
let provided = "[email protected]";
368-
let expected = "1.2.3";
350+
let expected = Requirement::hex("1.2.3").unwrap();
369351
let (package, version) = parse_gleam_add_specifier(provided).unwrap();
370-
match &version {
371-
Requirement::Hex { version: v } => {
372-
assert!(v.to_pubgrub().is_ok(), "failed pubgrub parse: {v}");
373-
}
374-
_ => assert!(false, "failed hexpm version parse: {provided}"),
375-
}
376-
assert_eq!(version, Requirement::hex(expected));
352+
assert_eq!(version, expected);
377353
assert_eq!("bobble", package);
378354
}
379355

@@ -533,7 +509,10 @@ fn provide_existing_package() {
533509
&mut provided,
534510
&mut vec!["root".into(), "subpackage".into()],
535511
);
536-
assert_eq!(result, Ok(hexpm::version::Range::new("== 0.1.0".into())));
512+
assert_eq!(
513+
result,
514+
Ok(hexpm::version::Range::new("== 0.1.0".into()).unwrap())
515+
);
537516

538517
let result = provide_local_package(
539518
"hello_world".into(),
@@ -543,7 +522,10 @@ fn provide_existing_package() {
543522
&mut provided,
544523
&mut vec!["root".into(), "subpackage".into()],
545524
);
546-
assert_eq!(result, Ok(hexpm::version::Range::new("== 0.1.0".into())));
525+
assert_eq!(
526+
result,
527+
Ok(hexpm::version::Range::new("== 0.1.0".into()).unwrap())
528+
);
547529
}
548530

549531
#[test]
@@ -558,7 +540,10 @@ fn provide_conflicting_package() {
558540
&mut provided,
559541
&mut vec!["root".into(), "subpackage".into()],
560542
);
561-
assert_eq!(result, Ok(hexpm::version::Range::new("== 0.1.0".into())));
543+
assert_eq!(
544+
result,
545+
Ok(hexpm::version::Range::new("== 0.1.0".into()).unwrap())
546+
);
562547

563548
let result = provide_package(
564549
"hello_world".into(),
@@ -592,7 +577,10 @@ fn provided_is_absolute() {
592577
&mut provided,
593578
&mut vec!["root".into(), "subpackage".into()],
594579
);
595-
assert_eq!(result, Ok(hexpm::version::Range::new("== 0.1.0".into())));
580+
assert_eq!(
581+
result,
582+
Ok(hexpm::version::Range::new("== 0.1.0".into()).unwrap())
583+
);
596584
let package = provided.get("hello_world").unwrap().clone();
597585
match package.source {
598586
ProvidedPackageSource::Local { path } => {
@@ -634,11 +622,11 @@ fn provided_local_to_hex() {
634622
requirements: [
635623
(
636624
"req_1".into(),
637-
hexpm::version::Range::new("~> 1.0.0".into()),
625+
hexpm::version::Range::new("~> 1.0.0".into()).unwrap(),
638626
),
639627
(
640628
"req_2".into(),
641-
hexpm::version::Range::new("== 1.0.0".into()),
629+
hexpm::version::Range::new("== 1.0.0".into()).unwrap(),
642630
),
643631
]
644632
.into(),
@@ -656,7 +644,7 @@ fn provided_local_to_hex() {
656644
(
657645
"req_1".into(),
658646
hexpm::Dependency {
659-
requirement: hexpm::version::Range::new("~> 1.0.0".into()),
647+
requirement: hexpm::version::Range::new("~> 1.0.0".into()).unwrap(),
660648
optional: false,
661649
app: None,
662650
repository: None,
@@ -665,7 +653,7 @@ fn provided_local_to_hex() {
665653
(
666654
"req_2".into(),
667655
hexpm::Dependency {
668-
requirement: hexpm::version::Range::new("== 1.0.0".into()),
656+
requirement: hexpm::version::Range::new("== 1.0.0".into()).unwrap(),
669657
optional: false,
670658
app: None,
671659
repository: None,
@@ -693,11 +681,11 @@ fn provided_git_to_hex() {
693681
requirements: [
694682
(
695683
"req_1".into(),
696-
hexpm::version::Range::new("~> 1.0.0".into()),
684+
hexpm::version::Range::new("~> 1.0.0".into()).unwrap(),
697685
),
698686
(
699687
"req_2".into(),
700-
hexpm::version::Range::new("== 1.0.0".into()),
688+
hexpm::version::Range::new("== 1.0.0".into()).unwrap(),
701689
),
702690
]
703691
.into(),
@@ -715,7 +703,7 @@ fn provided_git_to_hex() {
715703
(
716704
"req_1".into(),
717705
hexpm::Dependency {
718-
requirement: hexpm::version::Range::new("~> 1.0.0".into()),
706+
requirement: hexpm::version::Range::new("~> 1.0.0".into()).unwrap(),
719707
optional: false,
720708
app: None,
721709
repository: None,
@@ -724,7 +712,7 @@ fn provided_git_to_hex() {
724712
(
725713
"req_2".into(),
726714
hexpm::Dependency {
727-
requirement: hexpm::version::Range::new("== 1.0.0".into()),
715+
requirement: hexpm::version::Range::new("== 1.0.0".into()).unwrap(),
728716
optional: false,
729717
app: None,
730718
repository: None,
@@ -751,11 +739,11 @@ fn provided_local_to_manifest() {
751739
requirements: [
752740
(
753741
"req_1".into(),
754-
hexpm::version::Range::new("~> 1.0.0".into()),
742+
hexpm::version::Range::new("~> 1.0.0".into()).unwrap(),
755743
),
756744
(
757745
"req_2".into(),
758-
hexpm::version::Range::new("== 1.0.0".into()),
746+
hexpm::version::Range::new("== 1.0.0".into()).unwrap(),
759747
),
760748
]
761749
.into(),
@@ -789,11 +777,11 @@ fn provided_git_to_manifest() {
789777
requirements: [
790778
(
791779
"req_1".into(),
792-
hexpm::version::Range::new("~> 1.0.0".into()),
780+
hexpm::version::Range::new("~> 1.0.0".into()).unwrap(),
793781
),
794782
(
795783
"req_2".into(),
796-
hexpm::version::Range::new("== 1.0.0".into()),
784+
hexpm::version::Range::new("== 1.0.0".into()).unwrap(),
797785
),
798786
]
799787
.into(),
@@ -875,7 +863,7 @@ fn create_testable_unlock_manifest(
875863
(
876864
name,
877865
Requirement::Hex {
878-
version: hexpm::version::Range::new(range.into()),
866+
version: hexpm::version::Range::new(range.into()).unwrap(),
879867
},
880868
)
881869
})
@@ -1219,14 +1207,14 @@ fn package_config(
12191207
#[test]
12201208
fn test_remove_do_nothing() {
12211209
let config = package_config(
1222-
HashMap::from([("a".into(), Requirement::hex("~>1"))]),
1223-
HashMap::from([("b".into(), Requirement::hex("~>2"))]),
1210+
HashMap::from([("a".into(), Requirement::hex("~>1.0").unwrap())]),
1211+
HashMap::from([("b".into(), Requirement::hex("~>2.0").unwrap())]),
12241212
);
12251213

12261214
let mut manifest = Manifest {
12271215
requirements: HashMap::from([
1228-
("a".into(), Requirement::hex("~>1")),
1229-
("b".into(), Requirement::hex("~>2")),
1216+
("a".into(), Requirement::hex("~>1.0").unwrap()),
1217+
("b".into(), Requirement::hex("~>2.0").unwrap()),
12301218
]),
12311219
packages: vec![
12321220
manifest_package("a", "1.0.0", vec![]),
@@ -1247,7 +1235,7 @@ fn test_remove_simple() {
12471235
let config = package_config(HashMap::new(), HashMap::new());
12481236

12491237
let mut manifest = Manifest {
1250-
requirements: HashMap::from([("a".into(), Requirement::hex("~>1"))]),
1238+
requirements: HashMap::from([("a".into(), Requirement::hex("~>1.0").unwrap())]),
12511239
packages: vec![manifest_package("a", "1.0.0", vec![])],
12521240
};
12531241

@@ -1262,7 +1250,7 @@ fn test_remove_package_with_transitive_dependencies() {
12621250
let config = package_config(HashMap::new(), HashMap::new());
12631251

12641252
let mut manifest = Manifest {
1265-
requirements: HashMap::from([("a".into(), Requirement::hex("~>1"))]),
1253+
requirements: HashMap::from([("a".into(), Requirement::hex("~>1.0").unwrap())]),
12661254
packages: vec![
12671255
manifest_package("a", "1.0.0", vec!["b".into()]),
12681256
manifest_package("b", "1.2.3", vec!["c".into()]),
@@ -1279,14 +1267,14 @@ fn test_remove_package_with_transitive_dependencies() {
12791267
#[test]
12801268
fn test_remove_package_with_shared_transitive_dependencies() {
12811269
let config = package_config(
1282-
HashMap::from([("a".into(), Requirement::hex("~>1"))]),
1270+
HashMap::from([("a".into(), Requirement::hex("~>1.0").unwrap())]),
12831271
HashMap::new(),
12841272
);
12851273

12861274
let mut manifest = Manifest {
12871275
requirements: HashMap::from([
1288-
("a".into(), Requirement::hex("~>1")),
1289-
("b".into(), Requirement::hex("~>1")),
1276+
("a".into(), Requirement::hex("~>1.0").unwrap()),
1277+
("b".into(), Requirement::hex("~>1.0").unwrap()),
12901278
]),
12911279
packages: vec![
12921280
manifest_package("a", "1.0.0", vec!["c".into()]),
@@ -1311,14 +1299,14 @@ fn test_remove_package_with_shared_transitive_dependencies() {
13111299
#[test]
13121300
fn test_remove_package_that_is_also_a_transitive_dependency() {
13131301
let config = package_config(
1314-
HashMap::from([("a".into(), Requirement::hex("~>1"))]),
1302+
HashMap::from([("a".into(), Requirement::hex("~>1.0").unwrap())]),
13151303
HashMap::new(),
13161304
);
13171305

13181306
let mut manifest = Manifest {
13191307
requirements: HashMap::from([
1320-
("a".into(), Requirement::hex("~>1")),
1321-
("b".into(), Requirement::hex("~>1")),
1308+
("a".into(), Requirement::hex("~>1.0").unwrap()),
1309+
("b".into(), Requirement::hex("~>1.0").unwrap()),
13221310
]),
13231311
packages: vec![
13241312
manifest_package("a", "1.0.0", vec!["b".into(), "c".into()]),

compiler-cli/src/publish.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -675,8 +675,8 @@ fn release_metadata_as_erlang() {
675675
let version = "1.2.3".try_into().unwrap();
676676
let homepage = "https://gleam.run".parse().unwrap();
677677
let github = "https://github.com/lpil/myapp".parse().unwrap();
678-
let req1 = Range::new("~> 1.2.3 or >= 5.0.0".into());
679-
let req2 = Range::new("~> 1.2".into());
678+
let req1 = Range::new("~> 1.2.3 or >= 5.0.0".into()).unwrap();
679+
let req2 = Range::new("~> 1.2".into()).unwrap();
680680
let meta = ReleaseMetadata {
681681
name: "myapp",
682682
version: &version,

compiler-core/src/analyse.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ impl<'a, A> ModuleAnalyzer<'a, A> {
214214
.package_config
215215
.gleam_version
216216
.clone()
217-
.map(|version| version.as_pubgrub()),
217+
.map(|version| version.as_pubgrub().clone()),
218218
current_module: self.module_name.clone(),
219219
target: self.target,
220220
importable_modules: self.importable_modules,

0 commit comments

Comments
 (0)