Skip to content
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
8 changes: 4 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ foundry-compilers-artifacts-solc = { path = "crates/artifacts/solc", version = "
foundry-compilers-artifacts-vyper = { path = "crates/artifacts/vyper", version = "0.18.2" }
foundry-compilers-core = { path = "crates/core", version = "0.18.2" }

alloy-json-abi = { version = "1.2", features = ["serde_json"] }
alloy-primitives = { version = "1.2", features = ["serde", "rand"] }
alloy-json-abi = { version = "1.3", features = ["serde_json"] }
alloy-primitives = { version = "1.3", features = ["serde", "rand"] }
cfg-if = "1.0"
dunce = "1.0"
memmap2 = "0.9"
path-slash = "0.2"
rayon = "1.10"
rayon = "1.11"
regex = "1.11"
semver = { version = "1.0", features = ["serde"] }
serde = { version = "1", features = ["derive", "rc"] }
Expand All @@ -65,7 +65,7 @@ yansi = "1.0"

# async
futures-util = "0.3"
tokio = { version = "1.46", features = ["rt-multi-thread"] }
tokio = { version = "1.47", features = ["rt-multi-thread"] }

snapbox = "0.6.21"

Expand Down
4 changes: 2 additions & 2 deletions benches/read_all.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@ fn prepare_contracts(root: &Path, num: usize) -> Vec<PathBuf> {
let f = File::create(&path).unwrap();
let mut writer = BufWriter::new(f);

let mut rng = rand::thread_rng();
let mut rng = rand::rng();

// let's assume a solidity file is between 2kb and 16kb
let n: usize = rng.gen_range(4..17);
let n: usize = rng.random_range(4..17);
let s: String = rng.sample_iter(&Alphanumeric).take(n * 1024).map(char::from).collect();
writer.write_all(s.as_bytes()).unwrap();
writer.flush().unwrap();
Expand Down
6 changes: 3 additions & 3 deletions crates/compilers/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ tokio = { workspace = true, optional = true }
auto_impl = "1"
winnow = "0.7"
dyn-clone = "1"
derive_more = { version = "1", features = ["debug"] }
derive_more = { version = "2", features = ["debug"] }
home = "0.5"
dirs = "6.0"
itertools = ">=0.13, <=0.14"

# project-util
tempfile = { version = "3.20", optional = true }
fs_extra = { version = "1.3", optional = true }
rand = { version = "0.8", optional = true }
rand = { version = "0.9", optional = true }

# svm
svm = { workspace = true, optional = true }
Expand All @@ -61,7 +61,7 @@ tracing-subscriber = { version = "0.3", default-features = false, features = [
] }
similar-asserts.workspace = true
fd-lock = "4.0.4"
tokio = { version = "1.46", features = ["rt-multi-thread", "macros"] }
tokio = { version = "1.47", features = ["rt-multi-thread", "macros"] }
reqwest = "0.12"
tempfile = "3.20"
snapbox.workspace = true
Expand Down
65 changes: 34 additions & 31 deletions crates/compilers/src/project_util/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@

use foundry_compilers_artifacts::Remapping;
use foundry_compilers_core::error::{Result, SolcError};
use rand::{
distributions::{Distribution, Uniform},
seq::SliceRandom,
Rng,
};
use rand::{seq::SliceRandom, Rng};
use serde::{Deserialize, Serialize};
use std::{
collections::{BTreeSet, HashMap, HashSet, VecDeque},
Expand Down Expand Up @@ -70,11 +66,11 @@ impl MockProjectGenerator {
}

let graph = Graph::<MultiCompilerParsedSource>::resolve(paths)?;
let mut gen = Self::default();
let mut generated = Self::default();
let (_, edges) = graph.into_sources();

// add all files as source files
gen.add_sources(edges.files().count());
generated.add_sources(edges.files().count());

// stores libs and their files
let libs = get_libs(
Expand All @@ -85,25 +81,25 @@ impl MockProjectGenerator {

// mark all files as libs
for (lib_id, lib_files) in libs.into_values().enumerate() {
let lib_name = gen.name_strategy.new_lib_name(lib_id);
let offset = gen.inner.files.len();
let lib_name = generated.name_strategy.new_lib_name(lib_id);
let offset = generated.inner.files.len();
let lib = MockLib { name: lib_name, id: lib_id, num_files: lib_files.len(), offset };
for lib_file in lib_files {
let file = &mut gen.inner.files[lib_file];
let file = &mut generated.inner.files[lib_file];
file.lib_id = Some(lib_id);
file.name = gen.name_strategy.new_lib_name(file.id);
file.name = generated.name_strategy.new_lib_name(file.id);
}
gen.inner.libraries.push(lib);
generated.inner.libraries.push(lib);
}

for id in edges.files() {
for import in edges.imported_nodes(id).iter().copied() {
let import = gen.get_import(import);
gen.inner.files[id].imports.insert(import);
let import = generated.get_import(import);
generated.inner.files[id].imports.insert(import);
}
}

Ok(gen)
Ok(generated)
}

/// Consumes the type and returns the underlying skeleton
Expand Down Expand Up @@ -243,34 +239,36 @@ impl MockProjectGenerator {
self
}

/// randomly assign empty file status so that mocked files don't emit artifacts
/// Randomly assign empty file status so that mocked files don't emit artifacts.
pub fn assign_empty_files(&mut self) -> &mut Self {
let mut rng = rand::thread_rng();
let die = Uniform::from(0..self.inner.files.len());
let mut rng = rand::rng();
let n = self.inner.files.len();

for file in self.inner.files.iter_mut() {
let throw = die.sample(&mut rng);
let throw = rng.random_range(0..n);
if throw == 0 {
// give it a 1 in num(files) chance that the file will be empty
// 1 in n chance that the file will be empty
file.emit_artifacts = false;
}
}

self
}

/// Populates the imports of the project
pub fn populate_imports(&mut self, settings: &MockProjectSettings) -> &mut Self {
let mut rng = rand::thread_rng();
let mut rng = rand::rng();

// populate imports
for id in 0..self.inner.files.len() {
let imports = if let Some(lib) = self.inner.files[id].lib_id {
let num_imports = rng
.gen_range(settings.min_imports..=settings.max_imports)
.random_range(settings.min_imports..=settings.max_imports)
.min(self.inner.libraries[lib].num_files.saturating_sub(1));
self.unique_imports_for_lib(&mut rng, lib, id, num_imports)
} else {
let num_imports = rng
.gen_range(settings.min_imports..=settings.max_imports)
.random_range(settings.min_imports..=settings.max_imports)
.min(self.inner.files.len().saturating_sub(1));
self.unique_imports_for_source(&mut rng, id, num_imports)
};
Expand Down Expand Up @@ -437,11 +435,16 @@ impl MockFile {

pub fn target_path<L: Language>(
&self,
gen: &MockProjectGenerator,
generated: &MockProjectGenerator,
paths: &ProjectPathsConfig<L>,
) -> PathBuf {
let mut target = if let Some(lib) = self.lib_id {
paths.root.join("lib").join(&gen.inner.libraries[lib].name).join("src").join(&self.name)
paths
.root
.join("lib")
.join(&generated.inner.libraries[lib].name)
.join("src")
.join(&self.name)
} else {
paths.sources.join(&self.name)
};
Expand Down Expand Up @@ -552,14 +555,14 @@ pub struct MockProjectSettings {
impl MockProjectSettings {
/// Generates a new instance with random settings within an arbitrary range
pub fn random() -> Self {
let mut rng = rand::thread_rng();
let mut rng = rand::rng();
// arbitrary thresholds
Self {
num_sources: rng.gen_range(2..25),
num_libs: rng.gen_range(0..5),
num_lib_files: rng.gen_range(1..10),
min_imports: rng.gen_range(0..3),
max_imports: rng.gen_range(4..10),
num_sources: rng.random_range(2..25),
num_libs: rng.random_range(0..5),
num_lib_files: rng.random_range(1..10),
min_imports: rng.random_range(0..3),
max_imports: rng.random_range(4..10),
allow_no_artifacts_files: true,
}
}
Expand Down
Loading