diff --git a/src/kontrol/__main__.py b/src/kontrol/__main__.py index e65074042..d4835af12 100644 --- a/src/kontrol/__main__.py +++ b/src/kontrol/__main__.py @@ -137,8 +137,9 @@ def main() -> None: def exec_load_state(options: LoadStateOptions) -> None: foundry = _load_foundry(options.foundry_root, add_enum_constraints=options.enum_constraints) if options.output_dir_name is None: - options.output_dir_name = foundry.profile.get('test', '') - output_dir = foundry._root / options.output_dir_name + output_dir = foundry.test_path + else: + output_dir = foundry._root / options.output_dir_name foundry_state_load(options=options, output_dir=output_dir) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index e870a8709..0c94eabcf 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -476,9 +476,19 @@ def profile(self) -> dict[str, Any]: return {**default_profile, **current_profile} + def config(self, key: str, default: Any = None) -> Any: + """ + Get a configuration value from an environment variable or foundry.toml profile. + This mimics Foundry's behavior of allowing environment variables to override + settings in foundry.toml. + """ + env_name = 'FOUNDRY_' + key.upper() + return os.getenv(env_name, self.profile.get(key, default)) + @property def out(self) -> Path: - return self._root / self.profile.get('out', '') + out = self.config('out', '') + return self._root / out @property def proofs_dir(self) -> Path: @@ -502,13 +512,18 @@ def main_file(self) -> Path: @property def build_info(self) -> Path: - build_info_path = self.profile.get('build_info_path') + build_info_path = self.config('build_info_path', '') if build_info_path: return self._root / build_info_path else: return self.out / 'build-info' + @property + def test_path(self) -> Path: + test_path = self.config('test', '') + return self._root / test_path + @property def ffi(self) -> bool: if os.getenv('FOUNDRY_FFI', '').lower() in ('true', '1'): @@ -644,7 +659,7 @@ def load_lemmas(self, lemmas_id: str | None) -> KFlatModule | None: @cached_property def all_tests(self) -> list[str]: - test_dir = os.path.join(self.profile.get('test', 'test'), '') + test_dir = os.path.join(self.config('test', 'test'), '') return [ f'{contract.name_with_path}.{method.signature}' for contract in self.contracts.values() diff --git a/src/tests/integration/test_foundry_prove.py b/src/tests/integration/test_foundry_prove.py index 3520be9f9..18c1ffba7 100644 --- a/src/tests/integration/test_foundry_prove.py +++ b/src/tests/integration/test_foundry_prove.py @@ -784,7 +784,6 @@ def test_load_state_diff( foundry_root_dir = root_tmp_dir / 'foundry' foundry = Foundry(foundry_root=foundry_root_dir) - output_dir = foundry._root / foundry.profile.get('test', '') foundry_state_load( LoadStateOptions( { @@ -794,7 +793,7 @@ def test_load_state_diff( 'from_state_diff': 'True', } ), - output_dir=output_dir, + output_dir=foundry.test_path, ) generated_main_file = foundry_root_dir / 'src' / 'LoadStateDiff.sol' @@ -828,7 +827,6 @@ def test_load_state_dump( foundry_root_dir = root_tmp_dir / 'foundry' foundry = Foundry(foundry_root=foundry_root_dir) - output_dir = foundry._root / foundry.profile.get('test', '') foundry_state_load( LoadStateOptions( { @@ -837,7 +835,7 @@ def test_load_state_dump( 'output_dir_name': 'src', } ), - output_dir=output_dir, + output_dir=foundry.test_path, ) generated_main_file = foundry_root_dir / 'src' / 'LoadStateDump.sol'