Refactor some code into the common crate

This commit is contained in:
Omar Abdulla
2025-07-24 14:51:42 +03:00
parent 3494ce250e
commit df6ad1e9e2
22 changed files with 70 additions and 40 deletions
Generated
+7 -4
View File
@@ -3953,6 +3953,10 @@ name = "revive-dt-common"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"futures",
"once_cell",
"tokio",
"tracing",
] ]
[[package]] [[package]]
@@ -3989,6 +3993,7 @@ dependencies = [
"clap", "clap",
"indexmap 2.10.0", "indexmap 2.10.0",
"rayon", "rayon",
"revive-dt-common",
"revive-dt-compiler", "revive-dt-compiler",
"revive-dt-config", "revive-dt-config",
"revive-dt-format", "revive-dt-format",
@@ -4010,6 +4015,7 @@ dependencies = [
"alloy-primitives", "alloy-primitives",
"alloy-sol-types", "alloy-sol-types",
"anyhow", "anyhow",
"revive-dt-common",
"revive-dt-node-interaction", "revive-dt-node-interaction",
"semver 1.0.26", "semver 1.0.26",
"serde", "serde",
@@ -4023,6 +4029,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"alloy", "alloy",
"anyhow", "anyhow",
"revive-dt-common",
"revive-dt-config", "revive-dt-config",
"revive-dt-node-interaction", "revive-dt-node-interaction",
"serde", "serde",
@@ -4040,10 +4047,6 @@ version = "0.1.0"
dependencies = [ dependencies = [
"alloy", "alloy",
"anyhow", "anyhow",
"futures",
"once_cell",
"tokio",
"tracing",
] ]
[[package]] [[package]]
+4
View File
@@ -10,3 +10,7 @@ rust-version.workspace = true
[dependencies] [dependencies]
anyhow = { workspace = true } anyhow = { workspace = true }
futures = { workspace = true }
tracing = { workspace = true }
once_cell = { workspace = true }
tokio = { workspace = true }
@@ -23,7 +23,7 @@ use tracing::Instrument;
/// executor to drive an async computation: /// executor to drive an async computation:
/// ///
/// ```rust /// ```rust
/// use revive_dt_node_interaction::*; /// use revive_dt_common::concepts::*;
/// ///
/// fn blocking_function() { /// fn blocking_function() {
/// let result = BlockingExecutor::execute(async move { /// let result = BlockingExecutor::execute(async move {
@@ -208,7 +208,9 @@ mod test {
fn panics_in_futures_are_caught() { fn panics_in_futures_are_caught() {
// Act // Act
let result = BlockingExecutor::execute(async move { let result = BlockingExecutor::execute(async move {
panic!("This is a panic!"); panic!(
"If this panic causes, well, a panic, then this is an issue. If it's caught then all good!"
);
0xFFu8 0xFFu8
}); });
+3
View File
@@ -0,0 +1,3 @@
mod blocking_executor;
pub use blocking_executor::*;
+3
View File
@@ -0,0 +1,3 @@
mod files_with_extension_iterator;
pub use files_with_extension_iterator::*;
+4
View File
@@ -1,2 +1,6 @@
//! This crate provides common concepts, functionality, types, macros, and more that other crates in //! This crate provides common concepts, functionality, types, macros, and more that other crates in
//! the workspace can benefit from. //! the workspace can benefit from.
pub mod concepts;
pub mod iterators;
pub mod macros;
@@ -12,11 +12,9 @@
/// pub struct CaseId(usize); /// pub struct CaseId(usize);
/// ``` /// ```
/// ///
/// And would also implement a number of methods on this type making it easier /// And would also implement a number of methods on this type making it easier to use.
/// to use.
/// ///
/// These wrapper types become very useful as they make the code a lot easier /// These wrapper types become very useful as they make the code a lot easier to read.
/// to read.
/// ///
/// Take the following as an example: /// Take the following as an example:
/// ///
@@ -26,26 +24,28 @@
/// } /// }
/// ``` /// ```
/// ///
/// In the above code it's hard to understand what the various types refer to or /// In the above code it's hard to understand what the various types refer to or what to expect them
/// what to expect them to contain. /// to contain.
/// ///
/// With these wrapper types we're able to create code that's self-documenting /// With these wrapper types we're able to create code that's self-documenting in that the types
/// in that the types tell us what the code is referring to. The above code is /// tell us what the code is referring to. The above code is transformed into
/// transformed into
/// ///
/// ```rust,ignore /// ```rust,ignore
/// struct State { /// struct State {
/// contracts: HashMap<CaseId, HashMap<ContractName, ContractByteCode>> /// contracts: HashMap<CaseId, HashMap<ContractName, ContractByteCode>>
/// } /// }
/// ``` /// ```
///
/// Note that we follow the same syntax for defining wrapper structs but we do not permit the use of
/// generics.
#[macro_export] #[macro_export]
macro_rules! define_wrapper_type { macro_rules! define_wrapper_type {
( (
$(#[$meta: meta])* $(#[$meta: meta])*
$ident: ident($ty: ty) $(;)? $vis:vis struct $ident: ident($ty: ty);
) => { ) => {
$(#[$meta])* $(#[$meta])*
pub struct $ident($ty); $vis struct $ident($ty);
impl $ident { impl $ident {
pub fn new(value: $ty) -> Self { pub fn new(value: $ty) -> Self {
@@ -104,3 +104,7 @@ macro_rules! define_wrapper_type {
} }
}; };
} }
/// Technically not needed but this allows for the macro to be found in the `macros` module of the
/// crate in addition to being found in the root of the crate.
pub use define_wrapper_type;
+3
View File
@@ -0,0 +1,3 @@
mod define_wrapper_type;
pub use define_wrapper_type::*;
+1
View File
@@ -13,6 +13,7 @@ name = "retester"
path = "src/main.rs" path = "src/main.rs"
[dependencies] [dependencies]
revive-dt-common = { workspace = true }
revive-dt-compiler = { workspace = true } revive-dt-compiler = { workspace = true }
revive-dt-config = { workspace = true } revive-dt-config = { workspace = true }
revive-dt-format = { workspace = true } revive-dt-format = { workspace = true }
+4 -3
View File
@@ -1,6 +1,7 @@
//! The test driver handles the compilation and execution of the test cases. //! The test driver handles the compilation and execution of the test cases.
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt::Debug;
use std::marker::PhantomData; use std::marker::PhantomData;
use alloy::json_abi::JsonAbi; use alloy::json_abi::JsonAbi;
@@ -19,6 +20,9 @@ use alloy::{
}; };
use anyhow::Context; use anyhow::Context;
use indexmap::IndexMap; use indexmap::IndexMap;
use serde_json::Value;
use revive_dt_common::iterators::FilesWithExtensionIterator;
use revive_dt_compiler::{Compiler, SolidityCompiler}; use revive_dt_compiler::{Compiler, SolidityCompiler};
use revive_dt_config::Arguments; use revive_dt_config::Arguments;
use revive_dt_format::case::CaseIdx; use revive_dt_format::case::CaseIdx;
@@ -29,11 +33,8 @@ use revive_dt_node::Node;
use revive_dt_node_interaction::EthereumNode; use revive_dt_node_interaction::EthereumNode;
use revive_dt_report::reporter::{CompilationTask, Report, Span}; use revive_dt_report::reporter::{CompilationTask, Report, Span};
use revive_solc_json_interface::SolcStandardJsonOutput; use revive_solc_json_interface::SolcStandardJsonOutput;
use serde_json::Value;
use std::fmt::Debug;
use crate::Platform; use crate::Platform;
use crate::common::*;
pub struct State<'a, T: Platform> { pub struct State<'a, T: Platform> {
/// The configuration that the framework was started with. /// The configuration that the framework was started with.
-1
View File
@@ -8,7 +8,6 @@ use revive_dt_config::TestingPlatform;
use revive_dt_node::{Node, geth, kitchensink::KitchensinkNode}; use revive_dt_node::{Node, geth, kitchensink::KitchensinkNode};
use revive_dt_node_interaction::EthereumNode; use revive_dt_node_interaction::EthereumNode;
pub mod common;
pub mod driver; pub mod driver;
/// One platform can be tested differentially against another. /// One platform can be tested differentially against another.
+1
View File
@@ -9,6 +9,7 @@ repository.workspace = true
rust-version.workspace = true rust-version.workspace = true
[dependencies] [dependencies]
revive-dt-common = { workspace = true }
revive-dt-node-interaction = { workspace = true } revive-dt-node-interaction = { workspace = true }
alloy = { workspace = true } alloy = { workspace = true }
+3 -2
View File
@@ -1,7 +1,8 @@
use serde::Deserialize; use serde::Deserialize;
use revive_dt_common::macros::define_wrapper_type;
use crate::{ use crate::{
define_wrapper_type,
input::{Expected, Input}, input::{Expected, Input},
mode::Mode, mode::Mode,
}; };
@@ -45,5 +46,5 @@ impl Case {
define_wrapper_type!( define_wrapper_type!(
/// A wrapper type for the index of test cases found in metadata file. /// A wrapper type for the index of test cases found in metadata file.
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
CaseIdx(usize); pub struct CaseIdx(usize);
); );
+3 -2
View File
@@ -11,9 +11,10 @@ use alloy_primitives::{FixedBytes, utils::parse_units};
use semver::VersionReq; use semver::VersionReq;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use revive_dt_common::macros::define_wrapper_type;
use revive_dt_node_interaction::EthereumNode; use revive_dt_node_interaction::EthereumNode;
use crate::{define_wrapper_type, metadata::ContractInstance}; use crate::metadata::ContractInstance;
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct Input { pub struct Input {
@@ -84,7 +85,7 @@ pub enum Method {
define_wrapper_type!( define_wrapper_type!(
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
EtherValue(U256); pub struct EtherValue(U256);
); );
impl Serialize for EtherValue { impl Serialize for EtherValue {
-1
View File
@@ -3,6 +3,5 @@
pub mod case; pub mod case;
pub mod corpus; pub mod corpus;
pub mod input; pub mod input;
pub mod macros;
pub mod metadata; pub mod metadata;
pub mod mode; pub mod mode;
+10 -5
View File
@@ -9,9 +9,10 @@ use std::{
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use revive_dt_common::macros::define_wrapper_type;
use crate::{ use crate::{
case::Case, case::Case,
define_wrapper_type,
mode::{Mode, SolcMode}, mode::{Mode, SolcMode},
}; };
@@ -217,18 +218,22 @@ define_wrapper_type!(
/// Represents a contract instance found a metadata file. /// Represents a contract instance found a metadata file.
/// ///
/// Typically, this is used as the key to the "contracts" field of metadata files. /// Typically, this is used as the key to the "contracts" field of metadata files.
#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] #[derive(
Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
)]
#[serde(transparent)] #[serde(transparent)]
ContractInstance(String); pub struct ContractInstance(String);
); );
define_wrapper_type!( define_wrapper_type!(
/// Represents a contract identifier found a metadata file. /// Represents a contract identifier found a metadata file.
/// ///
/// A contract identifier is the name of the contract in the source code. /// A contract identifier is the name of the contract in the source code.
#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] #[derive(
Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
)]
#[serde(transparent)] #[serde(transparent)]
ContractIdent(String); pub struct ContractIdent(String);
); );
/// Represents an identifier used for contracts. /// Represents an identifier used for contracts.
-4
View File
@@ -11,7 +11,3 @@ rust-version.workspace = true
[dependencies] [dependencies]
alloy = { workspace = true } alloy = { workspace = true }
anyhow = { workspace = true } anyhow = { workspace = true }
futures = { workspace = true }
tracing = { workspace = true }
once_cell = { workspace = true }
tokio = { workspace = true }
-3
View File
@@ -6,9 +6,6 @@ use alloy::rpc::types::trace::geth::{DiffMode, GethDebugTracingOptions, GethTrac
use alloy::rpc::types::{TransactionReceipt, TransactionRequest}; use alloy::rpc::types::{TransactionReceipt, TransactionRequest};
use anyhow::Result; use anyhow::Result;
mod blocking_executor;
pub use blocking_executor::*;
/// An interface for all interactions with Ethereum compatible nodes. /// An interface for all interactions with Ethereum compatible nodes.
pub trait EthereumNode { pub trait EthereumNode {
/// Execute the [TransactionRequest] and return a [TransactionReceipt]. /// Execute the [TransactionRequest] and return a [TransactionReceipt].
+1
View File
@@ -15,6 +15,7 @@ tracing = { workspace = true }
tokio = { workspace = true } tokio = { workspace = true }
revive-dt-node-interaction = { workspace = true } revive-dt-node-interaction = { workspace = true }
revive-dt-common = { workspace = true }
revive-dt-config = { workspace = true } revive-dt-config = { workspace = true }
serde = { workspace = true } serde = { workspace = true }
+2 -1
View File
@@ -25,8 +25,9 @@ use alloy::{
}, },
signers::local::PrivateKeySigner, signers::local::PrivateKeySigner,
}; };
use revive_dt_common::concepts::BlockingExecutor;
use revive_dt_config::Arguments; use revive_dt_config::Arguments;
use revive_dt_node_interaction::{BlockingExecutor, EthereumNode}; use revive_dt_node_interaction::EthereumNode;
use tracing::Level; use tracing::Level;
use crate::{Node, common::FallbackGasFiller, constants::INITIAL_BALANCE}; use crate::{Node, common::FallbackGasFiller, constants::INITIAL_BALANCE};
+2 -1
View File
@@ -36,8 +36,9 @@ use sp_core::crypto::Ss58Codec;
use sp_runtime::AccountId32; use sp_runtime::AccountId32;
use tracing::Level; use tracing::Level;
use revive_dt_common::concepts::BlockingExecutor;
use revive_dt_config::Arguments; use revive_dt_config::Arguments;
use revive_dt_node_interaction::{BlockingExecutor, EthereumNode}; use revive_dt_node_interaction::EthereumNode;
use crate::{Node, common::FallbackGasFiller, constants::INITIAL_BALANCE}; use crate::{Node, common::FallbackGasFiller, constants::INITIAL_BALANCE};