From 6600438241b30bff537f52d89e0368b8abe3e599 Mon Sep 17 00:00:00 2001 From: Yordan Miladinov Date: Mon, 27 Jan 2025 18:34:07 +0200 Subject: [PATCH] Prefix config environment vars to avoid conflicts --- src/ape/api/config.py | 6 ++++-- src/ape_cache/config.py | 2 ++ src/ape_compile/config.py | 3 +++ src/ape_console/config.py | 3 +++ src/ape_ethereum/ecosystem.py | 4 +++- src/ape_networks/config.py | 5 ++++- src/ape_node/provider.py | 4 ++-- src/ape_test/config.py | 13 +++++++++++++ 8 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/ape/api/config.py b/src/ape/api/config.py index 141b226d02..baaa6b5df8 100644 --- a/src/ape/api/config.py +++ b/src/ape/api/config.py @@ -66,7 +66,7 @@ class PluginConfig(BaseSettings): a config API must register a subclass of this class. """ - model_config = SettingsConfigDict(extra="allow") + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_API_") @classmethod def from_overrides( @@ -198,6 +198,8 @@ class DeploymentConfig(PluginConfig): (must be a contract in the project). """ + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_API_") + def _get_problem_with_config(errors: list, path: Path) -> Optional[str]: # Attempt to find line numbers in the config matching. @@ -350,7 +352,7 @@ def __init__(self, *args, **kwargs): """ # NOTE: Plugin configs are technically "extras". - model_config = SettingsConfigDict(extra="allow") + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_API_") @model_validator(mode="before") @classmethod diff --git a/src/ape_cache/config.py b/src/ape_cache/config.py index 264516b738..29f80cdcfa 100644 --- a/src/ape_cache/config.py +++ b/src/ape_cache/config.py @@ -1,5 +1,7 @@ +from pydantic_settings import SettingsConfigDict from ape.api.config import PluginConfig class CacheConfig(PluginConfig): size: int = 1024**3 # 1gb + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_CACHE_") diff --git a/src/ape_compile/config.py b/src/ape_compile/config.py index 012e590b04..ef0c749f5f 100644 --- a/src/ape_compile/config.py +++ b/src/ape_compile/config.py @@ -3,6 +3,7 @@ from typing import Union from pydantic import field_serializer, field_validator +from pydantic_settings import SettingsConfigDict from ape.api.config import ConfigEnum, PluginConfig from ape.utils.misc import SOURCE_EXCLUDE_PATTERNS @@ -53,6 +54,8 @@ class Config(PluginConfig): Extra selections to output. Outputs to ``.build/{key.lower()}``. """ + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_COMPILE_") + @field_validator("exclude", mode="before") @classmethod def validate_exclude(cls, value): diff --git a/src/ape_console/config.py b/src/ape_console/config.py index 48b432ced2..2deaa552fa 100644 --- a/src/ape_console/config.py +++ b/src/ape_console/config.py @@ -1,6 +1,9 @@ +from pydantic_settings import SettingsConfigDict from ape.api.config import PluginConfig class ConsoleConfig(PluginConfig): plugins: list[str] = [] """Additional IPython plugins to include in your session.""" + + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_CONSOLE_") diff --git a/src/ape_ethereum/ecosystem.py b/src/ape_ethereum/ecosystem.py index 94aff193be..74524104f0 100644 --- a/src/ape_ethereum/ecosystem.py +++ b/src/ape_ethereum/ecosystem.py @@ -157,6 +157,8 @@ class NetworkConfig(PluginConfig): request_headers: dict = {} """Optionally config extra request headers whenever using this network.""" + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_ETHEREUM_") + @field_validator("gas_limit", mode="before") @classmethod def validate_gas_limit(cls, value): @@ -233,7 +235,7 @@ class BaseEthereumConfig(PluginConfig): # NOTE: This gets appended to Ape's root User-Agent string. request_headers: dict = {} - model_config = SettingsConfigDict(extra="allow") + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_ETHEREUM_") @model_validator(mode="before") @classmethod diff --git a/src/ape_networks/config.py b/src/ape_networks/config.py index 381cd268b2..1153800bde 100644 --- a/src/ape_networks/config.py +++ b/src/ape_networks/config.py @@ -1,5 +1,5 @@ from typing import Optional - +from pydantic_settings import SettingsConfigDict from ape.api.config import PluginConfig @@ -26,6 +26,8 @@ class CustomNetwork(PluginConfig): request_header: dict = {} """The HTTP request header.""" + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_NETWORKS_") + @property def is_fork(self) -> bool: """ @@ -36,3 +38,4 @@ def is_fork(self) -> bool: class NetworksConfig(PluginConfig): custom: list[CustomNetwork] = [] + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_NETWORKS_") diff --git a/src/ape_node/provider.py b/src/ape_node/provider.py index f8af5eeb08..579306de8f 100644 --- a/src/ape_node/provider.py +++ b/src/ape_node/provider.py @@ -297,7 +297,7 @@ class EthereumNetworkConfig(PluginConfig): # Make sure to run via `geth --dev` (or similar) local: dict = {**DEFAULT_SETTINGS.copy(), "chain_id": DEFAULT_TEST_CHAIN_ID} - model_config = SettingsConfigDict(extra="allow") + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_NODE_") @field_validator("local", mode="before") @classmethod @@ -357,7 +357,7 @@ class EthereumNodeConfig(PluginConfig): Optionally specify request headers to use whenever using this provider. """ - model_config = SettingsConfigDict(extra="allow") + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_NODE_") @field_validator("call_trace_approach", mode="before") @classmethod diff --git a/src/ape_test/config.py b/src/ape_test/config.py index 3ce2609dfe..adb2541a6f 100644 --- a/src/ape_test/config.py +++ b/src/ape_test/config.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING, NewType, Optional, Union from pydantic import NonNegativeInt, field_validator +from pydantic_settings import SettingsConfigDict from ape.api.config import PluginConfig from ape.utils.basemodel import ManagerAccessMixin @@ -19,11 +20,13 @@ class EthTesterProviderConfig(PluginConfig): chain_id: int = DEFAULT_TEST_CHAIN_ID auto_mine: bool = True + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_TEST_") class GasExclusion(PluginConfig): contract_name: str = "*" # If only given method, searches across all contracts. method_name: Optional[str] = None # By default, match all methods in a contract + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_TEST_") CoverageExclusion = NewType("CoverageExclusion", GasExclusion) @@ -48,6 +51,8 @@ class GasConfig(PluginConfig): Report-types to use. Currently, only supports `terminal`. """ + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_TEST_") + @field_validator("reports", mode="before") @classmethod def validate_reports(cls, values): @@ -89,6 +94,8 @@ class CoverageReportsConfig(PluginConfig): Set to ``True`` to generate HTML coverage reports. """ + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_TEST_") + @property def has_any(self) -> bool: return any(x not in ({}, None, False) for x in (self.html, self.terminal, self.xml)) @@ -119,6 +126,8 @@ class CoverageConfig(PluginConfig): use ``prefix_*`` to skip all items with a certain prefix. """ + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_TEST_") + class IsolationConfig(PluginConfig): enable_session: bool = True @@ -146,6 +155,8 @@ class IsolationConfig(PluginConfig): Set to ``False`` to disable function isolation. """ + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_TEST_") + def get_isolation(self, scope: "Scope") -> bool: return getattr(self, f"enable_{scope.name.lower()}") @@ -209,6 +220,8 @@ class ApeTestConfig(PluginConfig): ``False`` to disable all and ``True`` (default) to disable all. """ + model_config = SettingsConfigDict(extra="allow", env_prefix="APE_TEST_") + @field_validator("balance", mode="before") @classmethod def validate_balance(cls, value):