Skip to content

Commit 0af99ff

Browse files
committed
Runtime checks for _std packages
commit-id:dc2f7a0d
1 parent 5c94559 commit 0af99ff

File tree

3 files changed

+85
-5
lines changed

3 files changed

+85
-5
lines changed

crates/forge/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@ const MINIMAL_RECOMMENDED_SCARB_VERSION: Version = Version::new(2, 9, 4);
4141
const MINIMAL_SCARB_VERSION_PREBUILT_PLUGIN: Version = Version::new(2, 10, 0);
4242
const MINIMAL_USC_VERSION: Version = Version::new(2, 0, 0);
4343
const MINIMAL_SCARB_VERSION_FOR_SIERRA_GAS: Version = Version::new(2, 10, 0);
44-
// TODO(#3344) Set this to 0.44.0 after it has been released
4544
const MINIMAL_SNFORGE_STD_VERSION: Version = Version::new(0, 44, 0);
45+
// TODO Set this to version from v2 macros release
46+
const MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION: Version = Version::new(0, 44, 0);
4647

4748
#[derive(Parser, Debug)]
4849
#[command(

crates/forge/src/run_tests/workspace.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
use super::package::RunForPackageArgs;
22
use super::structs::{LatestBlocksNumbersMessage, TestsFailureSummaryMessage};
3-
use crate::warn::{error_if_snforge_std_not_compatible, warn_if_backtrace_without_panic_hint};
3+
use crate::warn::{
4+
error_if_not_snforge_std_compatibility, error_if_snforge_std_compatibility_not_compatible,
5+
error_if_snforge_std_not_compatible, warn_if_backtrace_without_panic_hint,
6+
warn_if_snforge_std_compatibility_not_compatible,
7+
warn_if_snforge_std_compatibility_on_new_scarb,
8+
};
49
use crate::{
510
ColorOption, ExitStatus, TestArgs, block_number_map::BlockNumberMap,
611
run_tests::package::run_for_package, scarb::build_artifacts_with_scarb,
@@ -38,8 +43,18 @@ pub async fn run_for_workspace(args: TestArgs, ui: Arc<UI>) -> Result<ExitStatus
3843
can_coverage_be_generated(&scarb_metadata)?;
3944
}
4045

41-
error_if_snforge_std_not_compatible(&scarb_metadata)?;
42-
warn_if_snforge_std_not_compatible(&scarb_metadata, &ui)?;
46+
let scarb_version = ScarbCommand::version().run()?.scarb;
47+
// TODO: Update this check for `2.12.0` before merging
48+
if scarb_version.build.is_empty() {
49+
error_if_not_snforge_std_compatibility(&scarb_metadata)?;
50+
error_if_snforge_std_compatibility_not_compatible(&scarb_metadata)?;
51+
warn_if_snforge_std_compatibility_not_compatible(&scarb_metadata, &ui)?;
52+
} else {
53+
error_if_snforge_std_not_compatible(&scarb_metadata)?;
54+
warn_if_snforge_std_not_compatible(&scarb_metadata, &ui)?;
55+
warn_if_snforge_std_compatibility_on_new_scarb(&scarb_metadata, &ui);
56+
}
57+
4358
warn_if_backtrace_without_panic_hint(&scarb_metadata, &ui);
4459

4560
let artifacts_dir_path =

crates/forge/src/warn.rs

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::MINIMAL_SNFORGE_STD_VERSION;
1+
use crate::{MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION, MINIMAL_SNFORGE_STD_VERSION};
22
use anyhow::{Result, anyhow};
33
use forge_runner::backtrace::is_backtrace_enabled;
44
use forge_runner::package_tests::with_config_resolved::TestTargetWithResolvedConfig;
@@ -85,6 +85,70 @@ fn snforge_std_recommended_version() -> VersionReq {
8585
}
8686
}
8787

88+
pub fn error_if_not_snforge_std_compatibility(scarb_metadata: &Metadata) -> Result<()> {
89+
if !scarb_metadata
90+
.packages
91+
.iter()
92+
.any(|p| p.name == "snforge_std_compatibility")
93+
{
94+
return Err(anyhow!(
95+
"On Scarb versions < 2.12.0, the `snforge_std` package must be replaced with `snforge_std_compatibility`. Please update it in Scarb.toml"
96+
));
97+
}
98+
Ok(())
99+
}
100+
101+
pub fn error_if_snforge_std_compatibility_not_compatible(scarb_metadata: &Metadata) -> Result<()> {
102+
let snforge_std_version_requirement_comparator = Comparator {
103+
op: Op::GreaterEq,
104+
major: MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION.major,
105+
minor: Some(MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION.minor),
106+
patch: Some(MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION.patch),
107+
pre: MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION.pre,
108+
};
109+
let snforge_std_version_requirement = VersionReq {
110+
comparators: vec![snforge_std_version_requirement_comparator],
111+
};
112+
113+
if !package_matches_version_requirement(
114+
scarb_metadata,
115+
"snforge_std_compatibility",
116+
&snforge_std_version_requirement,
117+
)? {
118+
return Err(anyhow!(
119+
"Package snforge_std_compatibility version does not meet the minimum required version {snforge_std_version_requirement}. Please upgrade snforge_std in Scarb.toml"
120+
));
121+
}
122+
Ok(())
123+
}
124+
125+
pub fn warn_if_snforge_std_compatibility_not_compatible(
126+
scarb_metadata: &Metadata,
127+
ui: &UI,
128+
) -> Result<()> {
129+
let snforge_std_version_requirement = snforge_std_recommended_version();
130+
if !package_matches_version_requirement(
131+
scarb_metadata,
132+
"snforge_std_compatibility",
133+
&snforge_std_version_requirement,
134+
)? {
135+
ui.println(&WarningMessage::new(&format!(
136+
"Package snforge_std_compatibility version does not meet the recommended version requirement {snforge_std_version_requirement}, it might result in unexpected behaviour"
137+
)));
138+
}
139+
Ok(())
140+
}
141+
142+
pub fn warn_if_snforge_std_compatibility_on_new_scarb(scarb_metadata: &Metadata, ui: &UI) {
143+
if scarb_metadata
144+
.packages
145+
.iter()
146+
.any(|p| p.name == "snforge_std_compatibility")
147+
{
148+
ui.println(&WarningMessage::new(&"Package snforge_std_compatibility should not be used on Scarb versions >= 2.12.0. Please replace it with snforge_std".to_string()));
149+
}
150+
}
151+
88152
pub fn error_if_snforge_std_not_compatible(scarb_metadata: &Metadata) -> Result<()> {
89153
let snforge_std_version_requirement_comparator = Comparator {
90154
op: Op::GreaterEq,

0 commit comments

Comments
 (0)