diff --git a/src/ape/cli/arguments.py b/src/ape/cli/arguments.py index b9405672c6..a2be011d94 100644 --- a/src/ape/cli/arguments.py +++ b/src/ape/cli/arguments.py @@ -3,16 +3,16 @@ import click from eth_utils import is_hex -from ape import accounts, project from ape.cli.choices import _ACCOUNT_TYPE_FILTER, Alias from ape.cli.paramtype import AllFilePaths from ape.exceptions import AccountsError, AliasAlreadyInUseError +from ape.utils.basemodel import ManagerAccessMixin _flatten = chain.from_iterable def _alias_callback(ctx, param, value): - if value in accounts.aliases: + if value in ManagerAccessMixin.account_manager.aliases: # Alias cannot be used. raise AliasAlreadyInUseError(value) @@ -59,7 +59,7 @@ def _raise_bad_arg(name): resolved_contract_paths = set() for contract_path in contract_paths: # Adds missing absolute path as well as extension. - if resolved_contract_path := project.lookup_path(contract_path): + if resolved_contract_path := ManagerAccessMixin.project_manager.lookup_path(contract_path): resolved_contract_paths.add(resolved_contract_path) else: _raise_bad_arg(contract_path.name) diff --git a/src/ape/cli/choices.py b/src/ape/cli/choices.py index 54f7c2eb6e..3b63997c22 100644 --- a/src/ape/cli/choices.py +++ b/src/ape/cli/choices.py @@ -7,11 +7,11 @@ import click from click import BadParameter, Choice, Context, Parameter -from ape import accounts, networks from ape.api.accounts import AccountAPI from ape.api.providers import ProviderAPI from ape.exceptions import AccountsError from ape.types import _LazySequence +from ape.utils.basemodel import ManagerAccessMixin _ACCOUNT_TYPE_FILTER = Union[ None, Sequence[AccountAPI], Type[AccountAPI], Callable[[AccountAPI], bool] @@ -21,14 +21,14 @@ def _get_accounts(key: _ACCOUNT_TYPE_FILTER) -> List[AccountAPI]: add_test_accounts = False if key is None: - account_list = list(accounts) + account_list = list(ManagerAccessMixin.account_manager) # Include test accounts at end. add_test_accounts = True elif isinstance(key, type): # Filtering by type. - account_list = accounts.get_accounts_by_type(key) + account_list = ManagerAccessMixin.account_manager.get_accounts_by_type(key) elif isinstance(key, (list, tuple, set)): # Given an account list. @@ -36,11 +36,11 @@ def _get_accounts(key: _ACCOUNT_TYPE_FILTER) -> List[AccountAPI]: else: # Filtering by callable. - account_list = [a for a in accounts if key(a)] # type: ignore + account_list = [a for a in ManagerAccessMixin.account_manager if key(a)] # type: ignore sorted_accounts = sorted(account_list, key=lambda a: a.alias or "") if add_test_accounts: - sorted_accounts.extend(accounts.test_accounts) + sorted_accounts.extend(ManagerAccessMixin.account_manager.test_accounts) return sorted_accounts @@ -213,13 +213,13 @@ def convert( self.fail(f"Cannot reference test account by '{value}'.", param=param) account_idx = int(idx_str) - if 0 <= account_idx < len(accounts.test_accounts): - return accounts.test_accounts[int(idx_str)] + if 0 <= account_idx < len(ManagerAccessMixin.account_manager.test_accounts): + return ManagerAccessMixin.account_manager.test_accounts[int(idx_str)] self.fail(f"Index '{idx_str}' is not valid.", param=param) - elif alias and alias in accounts.aliases: - return accounts.load(alias) + elif alias and alias in ManagerAccessMixin.account_manager.aliases: + return ManagerAccessMixin.account_manager.load(alias) return None @@ -231,7 +231,7 @@ def print_choices(self): click.echo(f"{idx}. {choice}") did_print = True - len_test_accounts = len(accounts.test_accounts) - 1 + len_test_accounts = len(ManagerAccessMixin.account_manager.test_accounts) - 1 if len_test_accounts > 0: msg = "'TEST::account_idx', where `account_idx` is in [0..{len_test_accounts}]\n" if did_print: @@ -260,9 +260,11 @@ def select_account(self) -> AccountAPI: if not self.choices or len(self.choices) == 0: raise AccountsError("No accounts found.") elif len(self.choices) == 1 and self.choices[0].startswith("TEST::"): - return accounts.test_accounts[int(self.choices[0].replace("TEST::", ""))] + return ManagerAccessMixin.account_manager.test_accounts[ + int(self.choices[0].replace("TEST::", "")) + ] elif len(self.choices) == 1: - return accounts.load(self.choices[0]) + return ManagerAccessMixin.account_manager.load(self.choices[0]) self.print_choices() return click.prompt(self._prompt_message, type=self) @@ -291,7 +293,7 @@ def get_networks( @lru_cache(maxsize=None) def _get_networks_sequence_from_cache(ecosystem_key: str, network_key: str, provider_key: str): return _LazySequence( - networks.get_network_choices( + ManagerAccessMixin.network_manager.get_network_choices( ecosystem_filter=_key_to_network_filter(ecosystem_key), network_filter=_key_to_network_filter(network_key), provider_filter=_key_to_network_filter(provider_key), @@ -382,7 +384,10 @@ def convert(self, value: Any, param: Optional[Parameter], ctx: Optional[Context] and issubclass(self.base_type, ProviderAPI) ): # Return the provider. - choice = networks.get_provider_from_choice(network_choice=choice) + + choice = ManagerAccessMixin.network_manager.get_provider_from_choice( + network_choice=value + ) return self.callback(ctx, param, choice) if self.callback else choice diff --git a/src/ape/cli/commands.py b/src/ape/cli/commands.py index 04d6e72443..c7ef6cd7f7 100644 --- a/src/ape/cli/commands.py +++ b/src/ape/cli/commands.py @@ -5,10 +5,10 @@ import click from click import Context -from ape import networks from ape.api import ProviderAPI, ProviderContextManager from ape.cli.choices import _NONE_NETWORK, NetworkChoice from ape.exceptions import NetworkError +from ape.utils.basemodel import ManagerAccessMixin def get_param_from_ctx(ctx: Context, param: str) -> Optional[Any]: @@ -33,10 +33,13 @@ def parse_network(ctx: Context) -> Optional[ProviderContextManager]: provider = get_param_from_ctx(ctx, "network") if provider is not None and isinstance(provider, ProviderAPI): return provider.network.use_provider(provider, disconnect_on_exit=not interactive) + elif provider not in (None, _NONE_NETWORK) and isinstance(provider, str): - return networks.parse_network_choice(provider, disconnect_on_exit=not interactive) + return ManagerAccessMixin.network_manager.parse_network_choice( + provider, disconnect_on_exit=not interactive + ) elif provider is None: - ecosystem = networks.default_ecosystem + ecosystem = ManagerAccessMixin.network_manager.default_ecosystem network = ecosystem.default_network if provider_name := network.default_provider_name: return network.use_provider(provider_name, disconnect_on_exit=not interactive) diff --git a/src/ape/cli/options.py b/src/ape/cli/options.py index 81b299bcf5..7c3e4ba495 100644 --- a/src/ape/cli/options.py +++ b/src/ape/cli/options.py @@ -6,7 +6,6 @@ from click import Option from ethpm_types import ContractType -from ape import networks, project from ape.api import ProviderAPI from ape.cli import ConnectedProviderCommand from ape.cli.choices import ( @@ -19,7 +18,7 @@ ) from ape.exceptions import Abort, ProjectError from ape.logging import DEFAULT_LOG_LEVEL, ApeLogger, LogLevel, logger -from ape.managers.base import ManagerAccessMixin +from ape.utils.basemodel import ManagerAccessMixin _VERBOSITY_VALUES = ("--verbosity", "-v") @@ -149,7 +148,7 @@ def __init__(self, *args, **kwargs) -> None: else: # NOTE: Use a function as the default so it is calculated lazily def fn(): - return networks.default_ecosystem.name + return ManagerAccessMixin.network_manager.default_ecosystem.name default = fn @@ -215,7 +214,8 @@ def callback(ctx, param, value): use_default = default == "auto" if not is_legacy and value is None and use_default: - provider_obj = networks.default_ecosystem.default_network.default_provider + default_ecosystem = ManagerAccessMixin.network_manager.default_ecosystem + provider_obj = default_ecosystem.default_network.default_provider elif value is None or is_legacy: provider_obj = None @@ -227,7 +227,7 @@ def callback(ctx, param, value): provider_obj = None else: - network_ctx = networks.parse_network_choice(value) + network_ctx = ManagerAccessMixin.network_manager.parse_network_choice(value) provider_obj = network_ctx._provider if provider_obj: @@ -353,7 +353,7 @@ def _load_contracts(ctx, param, value) -> Optional[Union[ContractType, List[Cont if not value: return None - if len(project.contracts) == 0: + if len(ManagerAccessMixin.project_manager.contracts) == 0: raise ProjectError("Project has no contracts.") # If the user passed in `multiple=True`, then `value` is a list, @@ -361,10 +361,10 @@ def _load_contracts(ctx, param, value) -> Optional[Union[ContractType, List[Cont is_multiple = isinstance(value, (tuple, list)) def get_contract(contract_name: str) -> ContractType: - if contract_name not in project.contracts: + if contract_name not in ManagerAccessMixin.project_manager.contracts: raise ProjectError(f"No contract named '{value}'") - return project.contracts[contract_name] + return ManagerAccessMixin.project_manager.contracts[contract_name] return [get_contract(c) for c in value] if is_multiple else get_contract(value) diff --git a/src/ape/cli/utils.py b/src/ape/cli/utils.py deleted file mode 100644 index e69de29bb2..0000000000