Node template folders restructuring (#4811)

* Restructure node-template so it is clear that node, runtime, and pallets are separated
* Separating to mock and tests
* restructuring runtime to top-level
* updated release script
* updated Cargo.lock
This commit is contained in:
Jimmy Chu
2020-02-06 20:13:44 +08:00
committed by GitHub
parent 6148c7ce15
commit acb66f0699
17 changed files with 205 additions and 126 deletions
@@ -1,7 +1,7 @@
use structopt::StructOpt;
use std::{
path::{PathBuf, Path}, collections::HashMap, fs::{File, self}, io::{Read, Write},
path::{PathBuf, Path}, collections::HashMap, fs::{File, OpenOptions, self}, io::{Read, Write},
process::Command
};
@@ -88,7 +88,7 @@ fn replace_path_dependencies_with_git(cargo_toml_path: &Path, commit_id: &str, c
// remove `Cargo.toml`
cargo_toml_path.pop();
for &table in &["dependencies", "build-dependencies"] {
for &table in &["dependencies", "build-dependencies", "dev-dependencies"] {
let mut dependencies: toml::value::Table = match cargo_toml
.remove(table)
.and_then(|v| v.try_into().ok()) {
@@ -212,11 +212,21 @@ fn main() {
let node_template_path = build_dir.path().join(node_template_folder);
copy_node_template(&options.node_template, build_dir.path());
let cargo_tomls = find_cargo_tomls(build_dir.path().to_owned());
let mut cargo_tomls = find_cargo_tomls(build_dir.path().to_owned());
let commit_id = get_git_commit_id(&options.node_template);
let top_level_cargo_toml_path = node_template_path.join("Cargo.toml");
// Check if top level Cargo.toml exists. If not, create one in the destination
if !cargo_tomls.contains(&top_level_cargo_toml_path) {
// create the top_level_cargo_toml
OpenOptions::new().create(true).write(true).open(top_level_cargo_toml_path.clone())
.expect("Create root level `Cargo.toml` failed.");
// push into our data structure
cargo_tomls.push(PathBuf::from(top_level_cargo_toml_path.clone()));
}
cargo_tomls.iter().for_each(|t| {
let mut cargo_toml = parse_cargo_toml(&t);
replace_path_dependencies_with_git(&t, &commit_id, &mut cargo_toml);
+14
View File
@@ -3554,6 +3554,7 @@ dependencies = [
"pallet-indices",
"pallet-randomness-collective-flip",
"pallet-sudo",
"pallet-template",
"pallet-timestamp",
"pallet-transaction-payment",
"parity-scale-codec",
@@ -4337,6 +4338,19 @@ dependencies = [
"sp-std",
]
[[package]]
name = "pallet-template"
version = "2.0.0"
dependencies = [
"frame-support",
"frame-system",
"parity-scale-codec",
"safe-mix",
"sp-core",
"sp-io",
"sp-runtime",
]
[[package]]
name = "pallet-timestamp"
version = "2.0.0"
+2 -1
View File
@@ -1,7 +1,8 @@
[workspace]
members = [
"bin/node-template",
"bin/node-template/node",
"bin/node-template/runtime",
"bin/node-template/pallets/template",
"bin/node/cli",
"bin/node/executor",
"bin/node/primitives",
-37
View File
@@ -1,37 +0,0 @@
[package]
name = "node-template"
version = "2.0.0"
authors = ["Anonymous"]
build = "build.rs"
edition = "2018"
license = "Unlicense"
[[bin]]
name = "node-template"
path = "src/main.rs"
[dependencies]
futures = "0.3.1"
log = "0.4.8"
sc-cli = { version = "0.8.0", path = "../../client/cli" }
sp-core = { version = "2.0.0", path = "../../primitives/core" }
sc-executor = { version = "0.8", path = "../../client/executor" }
sc-service = { version = "0.8", path = "../../client/service" }
sp-inherents = { version = "2.0.0", path = "../../primitives/inherents" }
sc-transaction-pool = { version = "2.0.0", path = "../../client/transaction-pool" }
sp-transaction-pool = { version = "2.0.0", path = "../../primitives/transaction-pool" }
sc-network = { version = "0.8", path = "../../client/network" }
sc-consensus-aura = { version = "0.8", path = "../../client/consensus/aura" }
sp-consensus-aura = { version = "0.8", path = "../../primitives/consensus/aura" }
sp-consensus = { version = "0.8", path = "../../primitives/consensus/common" }
grandpa = { version = "0.8", package = "sc-finality-grandpa", path = "../../client/finality-grandpa" }
grandpa-primitives = { version = "2.0.0", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" }
sc-client = { version = "0.8", path = "../../client/" }
node-template-runtime = { version = "2.0.0", path = "runtime" }
sp-runtime = { version = "2.0.0", path = "../../primitives/runtime" }
sc-basic-authorship = { path = "../../client/basic-authorship" }
structopt = "0.3.8"
[build-dependencies]
vergen = "3.0.4"
build-script-utils = { version = "2.0.0", package = "substrate-build-script-utils", path = "../../utils/build-script-utils" }
@@ -0,0 +1,38 @@
[package]
name = "node-template"
version = "2.0.0"
authors = ["Anonymous"]
edition = "2018"
license = "Unlicense"
build = "build.rs"
[[bin]]
name = "node-template"
[dependencies]
futures = "0.3.1"
log = "0.4.8"
structopt = "0.3.8"
sc-cli = { version = "0.8.0", path = "../../../client/cli" }
sp-core = { version = "2.0.0", path = "../../../primitives/core" }
sc-executor = { version = "0.8", path = "../../../client/executor" }
sc-service = { version = "0.8", path = "../../../client/service" }
sp-inherents = { version = "2.0.0", path = "../../../primitives/inherents" }
sc-transaction-pool = { version = "2.0.0", path = "../../../client/transaction-pool" }
sp-transaction-pool = { version = "2.0.0", path = "../../../primitives/transaction-pool" }
sc-network = { version = "0.8", path = "../../../client/network" }
sc-consensus-aura = { version = "0.8", path = "../../../client/consensus/aura" }
sp-consensus-aura = { version = "0.8", path = "../../../primitives/consensus/aura" }
sp-consensus = { version = "0.8", path = "../../../primitives/consensus/common" }
grandpa = { version = "0.8", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" }
grandpa-primitives = { version = "2.0.0", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" }
sc-client = { version = "0.8", path = "../../../client/" }
sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" }
sc-basic-authorship = { path = "../../../client/basic-authorship" }
node-template-runtime = { version = "2.0.0", path = "../runtime" }
[build-dependencies]
vergen = "3.0.4"
build-script-utils = { version = "2.0.0", package = "substrate-build-script-utils", path = "../../../utils/build-script-utils" }
@@ -0,0 +1,44 @@
[package]
authors = ['Anonymous']
edition = '2018'
name = 'pallet-template'
version = '2.0.0'
[dependencies]
codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] }
safe-mix = { default-features = false, version = '1.0.0' }
[dependencies.frame-support]
default-features = false
version = '2.0.0'
path = "../../../../frame/support"
[dependencies.system]
default-features = false
package = 'frame-system'
version = '2.0.0'
path = "../../../../frame/system"
[dev-dependencies.sp-core]
default-features = false
version = '2.0.0'
path = "../../../../primitives/core"
[dev-dependencies.sp-io]
default-features = false
version = '2.0.0'
path = "../../../../primitives/io"
[dev-dependencies.sp-runtime]
default-features = false
version = '2.0.0'
path = "../../../../primitives/runtime"
[features]
default = ['std']
std = [
'codec/std',
'frame-support/std',
'safe-mix/std',
'system/std'
]
@@ -1,16 +1,23 @@
#![cfg_attr(not(feature = "std"), no_std)]
/// A runtime module template with necessary imports
/// Feel free to remove or edit this file as needed.
/// If you change the name of this file, make sure to update its references in runtime/src/lib.rs
/// If you remove this file, you can remove those references
/// For more guidance on Substrate modules, see the example module
/// https://github.com/paritytech/substrate/blob/master/frame/example/src/lib.rs
use frame_support::{decl_module, decl_storage, decl_event, decl_error, dispatch};
use system::ensure_signed;
#[cfg(test)]
mod mock;
#[cfg(test)]
mod tests;
/// The pallet's configuration trait.
pub trait Trait: system::Trait {
// Add other types and constants required to configure this pallet.
@@ -95,82 +102,3 @@ decl_module! {
}
}
}
/// Tests for this pallet
#[cfg(test)]
mod tests {
use super::*;
use sp_core::H256;
use frame_support::{impl_outer_origin, assert_ok, assert_noop, parameter_types, weights::Weight};
use sp_runtime::{
traits::{BlakeTwo256, IdentityLookup}, testing::Header, Perbill,
};
impl_outer_origin! {
pub enum Origin for Test {}
}
// For testing the module, we construct most of a mock runtime. This means
// first constructing a configuration type (`Test`) which `impl`s each of the
// configuration traits of modules we want to use.
#[derive(Clone, Eq, PartialEq)]
pub struct Test;
parameter_types! {
pub const BlockHashCount: u64 = 250;
pub const MaximumBlockWeight: Weight = 1024;
pub const MaximumBlockLength: u32 = 2 * 1024;
pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75);
}
impl system::Trait for Test {
type Origin = Origin;
type Call = ();
type Index = u64;
type BlockNumber = u64;
type Hash = H256;
type Hashing = BlakeTwo256;
type AccountId = u64;
type Lookup = IdentityLookup<Self::AccountId>;
type Header = Header;
type Event = ();
type BlockHashCount = BlockHashCount;
type MaximumBlockWeight = MaximumBlockWeight;
type MaximumBlockLength = MaximumBlockLength;
type AvailableBlockRatio = AvailableBlockRatio;
type Version = ();
type ModuleToIndex = ();
}
impl Trait for Test {
type Event = ();
}
type TemplateModule = Module<Test>;
// This function basically just builds a genesis storage key/value store according to
// our desired mockup.
fn new_test_ext() -> sp_io::TestExternalities {
system::GenesisConfig::default().build_storage::<Test>().unwrap().into()
}
#[test]
fn it_works_for_default_value() {
new_test_ext().execute_with(|| {
// Just a dummy test for the dummy funtion `do_something`
// calling the `do_something` function with a value 42
assert_ok!(TemplateModule::do_something(Origin::signed(1), 42));
// asserting that the stored value is equal to what we stored
assert_eq!(TemplateModule::something(), Some(42));
});
}
#[test]
fn correct_error_for_none_value() {
new_test_ext().execute_with(|| {
// Ensure the correct error is thrown on None value
assert_noop!(
TemplateModule::cause_error(Origin::signed(1)),
Error::<Test>::NoneValue
);
});
}
}
@@ -0,0 +1,52 @@
// Creating mock runtime here
use crate::{Module, Trait};
use sp_core::H256;
use frame_support::{impl_outer_origin, parameter_types, weights::Weight};
use sp_runtime::{
traits::{BlakeTwo256, IdentityLookup}, testing::Header, Perbill,
};
impl_outer_origin! {
pub enum Origin for Test {}
}
// For testing the module, we construct most of a mock runtime. This means
// first constructing a configuration type (`Test`) which `impl`s each of the
// configuration traits of modules we want to use.
#[derive(Clone, Eq, PartialEq)]
pub struct Test;
parameter_types! {
pub const BlockHashCount: u64 = 250;
pub const MaximumBlockWeight: Weight = 1024;
pub const MaximumBlockLength: u32 = 2 * 1024;
pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75);
}
impl system::Trait for Test {
type Origin = Origin;
type Call = ();
type Index = u64;
type BlockNumber = u64;
type Hash = H256;
type Hashing = BlakeTwo256;
type AccountId = u64;
type Lookup = IdentityLookup<Self::AccountId>;
type Header = Header;
type Event = ();
type BlockHashCount = BlockHashCount;
type MaximumBlockWeight = MaximumBlockWeight;
type MaximumBlockLength = MaximumBlockLength;
type AvailableBlockRatio = AvailableBlockRatio;
type Version = ();
type ModuleToIndex = ();
}
impl Trait for Test {
type Event = ();
}
pub type TemplateModule = Module<Test>;
// This function basically just builds a genesis storage key/value store according to
// our desired mockup.
pub fn new_test_ext() -> sp_io::TestExternalities {
system::GenesisConfig::default().build_storage::<Test>().unwrap().into()
}
@@ -0,0 +1,26 @@
// Tests to be written here
use crate::{Error, mock::*};
use frame_support::{assert_ok, assert_noop};
#[test]
fn it_works_for_default_value() {
new_test_ext().execute_with(|| {
// Just a dummy test for the dummy funtion `do_something`
// calling the `do_something` function with a value 42
assert_ok!(TemplateModule::do_something(Origin::signed(1), 42));
// asserting that the stored value is equal to what we stored
assert_eq!(TemplateModule::something(), Some(42));
});
}
#[test]
fn correct_error_for_none_value() {
new_test_ext().execute_with(|| {
// Ensure the correct error is thrown on None value
assert_noop!(
TemplateModule::cause_error(Origin::signed(1)),
Error::<Test>::NoneValue
);
});
}
@@ -6,6 +6,8 @@ edition = "2018"
license = "Unlicense"
[dependencies]
codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] }
aura = { version = "2.0.0", default-features = false, package = "pallet-aura", path = "../../../frame/aura" }
balances = { version = "2.0.0", default-features = false, package = "pallet-balances", path = "../../../frame/balances" }
frame-support = { version = "2.0.0", default-features = false, path = "../../../frame/support" }
@@ -16,8 +18,6 @@ sudo = { version = "2.0.0", default-features = false, package = "pallet-sudo", p
system = { version = "2.0.0", default-features = false, package = "frame-system", path = "../../../frame/system" }
timestamp = { version = "2.0.0", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" }
transaction-payment = { version = "2.0.0", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" }
codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] }
frame-executive = { version = "2.0.0", default-features = false, path = "../../../frame/executive" }
serde = { version = "1.0.101", optional = true, features = ["derive"] }
sp-api = { version = "2.0.0", default-features = false, path = "../../../primitives/api" }
@@ -33,6 +33,8 @@ sp-std = { version = "2.0.0", default-features = false, path = "../../../primiti
sp-transaction-pool = { version = "2.0.0", default-features = false, path = "../../../primitives/transaction-pool" }
sp-version = { version = "2.0.0", default-features = false, path = "../../../primitives/version" }
template = { version = "2.0.0", default-features = false, path = "../pallets/template", package = "pallet-template" }
[build-dependencies]
wasm-builder-runner = { version = "1.0.4", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" }
@@ -64,4 +66,5 @@ std = [
"system/std",
"timestamp/std",
"transaction-payment/std",
"template/std",
]
@@ -37,6 +37,9 @@ pub use frame_support::{
weights::Weight,
};
/// Importing a template pallet
pub use template;
/// An index to a block.
pub type BlockNumber = u32;
@@ -63,9 +66,6 @@ pub type Hash = sp_core::H256;
/// Digest item type.
pub type DigestItem = generic::DigestItem<Hash>;
/// Used for the module template in `./template.rs`
mod template;
/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know
/// the specifics of the runtime. They can then be made to be agnostic over specific formats
/// of data like extrinsics, allowing for them to continue syncing the network through upgrades