Skip to content

Commit 8096ce3

Browse files
committed
Add support for Rust contract meta crates; more conversion to pathlib.Path; method renaming
1 parent cb50496 commit 8096ce3

4 files changed

Lines changed: 70 additions & 45 deletions

File tree

erdpy/projects/project_base.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def build(self, options: Union[Dict[str, Any], None] = None) -> Path:
2626
return self._do_after_build()
2727

2828
def clean(self):
29-
utils.remove_folder(self._get_output_folder())
29+
utils.remove_folder(self.get_output_folder())
3030

3131
def _ensure_dependencies_installed(self):
3232
module_keys = self.get_dependencies()
@@ -42,36 +42,35 @@ def perform_build(self) -> None:
4242
def get_file_wasm(self):
4343
return self.find_file_in_output("*.wasm")
4444

45-
def find_file_globally(self, pattern):
46-
folder = self.directory
47-
return self.find_file_in_folder(folder, pattern)
45+
def find_file_globally(self, pattern: str) -> Path:
46+
return self.find_file_in_folder(self.path, pattern)
4847

49-
def find_file_in_output(self, pattern):
50-
folder = path.join(self.directory, "output")
48+
def find_file_in_output(self, pattern: str) -> Path:
49+
folder = self.path / 'output'
5150
return self.find_file_in_folder(folder, pattern)
5251

53-
def find_file_in_folder(self, folder, pattern):
54-
files = list(Path(folder).rglob(pattern))
52+
def find_file_in_folder(self, folder: Path, pattern: str) -> Path:
53+
files = list(folder.rglob(pattern))
5554

5655
if len(files) == 0:
5756
raise errors.KnownError(f"No file matches pattern [{pattern}].")
5857
if len(files) > 1:
5958
logger.warning(f"More files match pattern [{pattern}]. Will pick first:\n{files}")
6059

61-
file = path.join(folder, files[0])
60+
file = folder / files[0]
6261
return Path(file).resolve()
6362

6463
def _do_after_build(self) -> Path:
6564
raise NotImplementedError()
6665

67-
def _copy_to_output(self, source: str, destination: str = None) -> Path:
68-
output_folder = self._get_output_folder()
66+
def _copy_to_output(self, source: Path, destination: str = None) -> Path:
67+
output_folder = self.get_output_folder()
6968
utils.ensure_folder(output_folder)
7069
destination = path.join(output_folder, destination) if destination else output_folder
71-
output_wasm_file = shutil.copy(source, destination)
70+
output_wasm_file = shutil.copy(str(source), destination)
7271
return Path(output_wasm_file)
7372

74-
def _get_output_folder(self):
73+
def get_output_folder(self):
7574
return path.join(self.directory, "output")
7675

7776
def get_bytecode(self):

erdpy/projects/project_clang.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import logging
2-
import os
32
import subprocess
43
from os import path
54
from pathlib import Path
65

6+
from typing import List
7+
78
from erdpy import dependencies, errors, myprocess, utils
89
from erdpy.projects.project_base import Project
910

@@ -135,9 +136,9 @@ def ensure_source_files(self):
135136

136137
self.config['source_files'] = source_files
137138

138-
def get_exported_functions(self):
139+
def get_exported_functions(self) -> List[str]:
139140
file_export = self.find_file_globally('*.export')
140-
lines = utils.read_lines(file_export)
141+
lines = utils.read_lines(str(file_export))
141142
return lines
142143

143144
def default_config(self):

erdpy/projects/project_rust.py

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,107 +14,132 @@
1414
class ProjectRust(Project):
1515
def __init__(self, directory):
1616
super().__init__(directory)
17-
self.cargo_file = self._get_cargo_file()
17+
self.cargo_file = self.get_cargo_file()
1818

1919
def clean(self):
2020
super().clean()
2121
utils.remove_folder(path.join(self.directory, "wasm", "target"))
2222

23-
def _get_cargo_file(self):
24-
cargo_path = path.join(self.directory, "Cargo.toml")
23+
def get_cargo_file(self):
24+
cargo_path = self.path / 'Cargo.toml'
2525
return CargoFile(cargo_path)
2626

27+
def get_meta_folder(self):
28+
return self.path / 'meta'
29+
2730
def perform_build(self):
31+
meta = self.has_meta()
2832
try:
33+
if meta:
34+
self.run_meta()
2935
self.run_cargo()
30-
self._generate_abi()
36+
37+
# ABI generated separately for backwards compatibility
38+
if not meta:
39+
self.generate_abi()
3140
except subprocess.CalledProcessError as err:
3241
raise errors.BuildError(err.output)
3342

3443
def run_cargo(self):
35-
env = self._get_env()
44+
env = self.get_env()
3645

3746
args = [
3847
"cargo",
3948
"build",
4049
"--target=wasm32-unknown-unknown",
4150
"--release",
4251
"--out-dir",
43-
self._get_output_folder(),
52+
self.get_output_folder(),
4453
"-Z"
4554
"unstable-options"
4655
]
47-
self._decorate_cargo_args(args)
56+
self.decorate_cargo_args(args)
4857

4958
if not self.options.get("wasm_symbols"):
5059
env["RUSTFLAGS"] = "-C link-arg=-s"
5160

52-
cwd = path.join(self.directory, "wasm")
53-
return_code = myprocess.run_process_async(args, env=env, cwd=cwd)
61+
cwd = self.path / 'wasm'
62+
return_code = myprocess.run_process_async(args, env=env, cwd=str(cwd))
63+
if return_code != 0:
64+
raise errors.BuildError(f"error code = {return_code}, see output")
65+
66+
def run_meta(self):
67+
cwd = self.get_meta_folder()
68+
env = self.get_env()
69+
70+
args = [
71+
"cargo",
72+
"build",
73+
]
74+
75+
return_code = myprocess.run_process_async(args, env=env, cwd=str(cwd))
5476
if return_code != 0:
5577
raise errors.BuildError(f"error code = {return_code}, see output")
5678

57-
def _decorate_cargo_args(self, args):
79+
def decorate_cargo_args(self, args):
5880
target_dir = self.options.get("cargo_target_dir")
5981
if target_dir:
6082
args.extend(["--target-dir", target_dir])
6183

62-
def _generate_abi(self):
63-
if not self._has_abi():
84+
def generate_abi(self):
85+
if not self.has_abi():
6486
return
6587

6688
args = [
6789
"cargo",
6890
"run"
6991
]
70-
self._decorate_cargo_args(args)
92+
self.decorate_cargo_args(args)
7193

72-
env = self._get_env()
94+
env = self.get_env()
7395
cwd = path.join(self.directory, "abi")
74-
sink = myprocess.FileOutputSink(self._get_abi_filepath())
96+
sink = myprocess.FileOutputSink(self.get_abi_filepath())
7597
return_code = myprocess.run_process_async(args, env=env, cwd=cwd, stdout_sink=sink)
7698
if return_code != 0:
7799
raise errors.BuildError(f"error code = {return_code}, see output")
78100

79-
utils.prettify_json_file(self._get_abi_filepath())
101+
utils.prettify_json_file(self.get_abi_filepath())
102+
103+
def has_meta(self):
104+
return self.get_meta_folder().exists()
80105

81-
def _has_abi(self):
82-
return (self._get_abi_folder() / "Cargo.toml").exists()
106+
def has_abi(self):
107+
return (self.get_abi_folder() / "Cargo.toml").exists()
83108

84-
def _get_abi_filepath(self):
85-
return self._get_abi_folder() / "abi.json"
109+
def get_abi_filepath(self):
110+
return self.get_abi_folder() / "abi.json"
86111

87-
def _get_abi_folder(self):
112+
def get_abi_folder(self):
88113
return Path(self.directory, "abi")
89114

90115
def _do_after_build(self) -> Path:
91116
original_name = self.cargo_file.package_name
92117
wasm_base_name = self.cargo_file.package_name.replace("-", "_")
93-
wasm_file = Path(self._get_output_folder(), f"{wasm_base_name}_wasm.wasm").resolve()
118+
wasm_file = Path(self.get_output_folder(), f"{wasm_base_name}_wasm.wasm").resolve()
94119
wasm_file_renamed = self.options.get("wasm_name")
95120
if not wasm_file_renamed:
96121
wasm_file_renamed = f"{original_name}.wasm"
97-
wasm_file_renamed_path = Path(self._get_output_folder(), wasm_file_renamed)
122+
wasm_file_renamed_path = Path(self.get_output_folder(), wasm_file_renamed)
98123
shutil.move(wasm_file, wasm_file_renamed_path)
99124

100-
if self._has_abi():
101-
abi_file = self._get_abi_filepath()
102-
abi_file_renamed = Path(self._get_output_folder(), f"{original_name}.abi.json")
125+
if self.has_abi():
126+
abi_file = self.get_abi_filepath()
127+
abi_file_renamed = Path(self.get_output_folder(), f"{original_name}.abi.json")
103128
shutil.move(abi_file, abi_file_renamed)
104129

105130
return wasm_file_renamed_path
106131

107132
def get_dependencies(self):
108133
return ["rust"]
109134

110-
def _get_env(self):
135+
def get_env(self):
111136
return dependencies.get_module_by_key("rust").get_env()
112137

113138

114139
class CargoFile:
115140
data: Dict[str, Any]
116141

117-
def __init__(self, path):
142+
def __init__(self, path: Path):
118143
self.data = {}
119144
self.path = path
120145

erdpy/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def uniquify(path: Path) -> Path:
7979
return path
8080

8181

82-
def read_lines(file: str):
82+
def read_lines(file: str) -> List[str]:
8383
with open(file) as f:
8484
lines = f.readlines()
8585
lines = [line.strip() for line in lines]

0 commit comments

Comments
 (0)