Skip to content

Commit

Permalink
fix: circular import issues (#1888)
Browse files Browse the repository at this point in the history
  • Loading branch information
antazoey authored Jan 26, 2024
1 parent 7f1aab9 commit 40f3738
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 28 deletions.
6 changes: 3 additions & 3 deletions src/ape/cli/arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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)
Expand Down
33 changes: 19 additions & 14 deletions src/ape/cli/choices.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -21,26 +21,26 @@
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.
account_list = key # type: ignore

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

Expand Down Expand Up @@ -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

Expand All @@ -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:
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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

Expand Down
9 changes: 6 additions & 3 deletions src/ape/cli/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]:
Expand All @@ -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)
Expand Down
16 changes: 8 additions & 8 deletions src/ape/cli/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand All @@ -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")

Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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:
Expand Down Expand Up @@ -353,18 +353,18 @@ 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,
# and therefore we should also return a list.
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)

Expand Down
Empty file removed src/ape/cli/utils.py
Empty file.

0 comments on commit 40f3738

Please sign in to comment.