Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: circular import issues from accounts plugins #1888

Merged
merged 1 commit into from
Jan 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
antazoey marked this conversation as resolved.
Show resolved Hide resolved
Empty file.
Loading