Skip to content

Commit 4ddc540

Browse files
committed
Simplified LazyPropertySetting, changed Settings initialization
1 parent cbadbe9 commit 4ddc540

File tree

6 files changed

+36
-42
lines changed

6 files changed

+36
-42
lines changed

arca/_arca.py

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import hashlib
22
import json
3-
import os
43
import re
54
from collections import defaultdict
65
from datetime import datetime
@@ -34,16 +33,16 @@ class Arca:
3433

3534
RUNNER = Path(__file__).parent.resolve() / "_runner.py"
3635

37-
base_dir: str = LazySettingProperty(key="base_dir", default=".arca")
38-
single_pull: bool = LazySettingProperty(key="single_pull", default=False, convert=bool)
39-
ignore_cache_errors: bool = LazySettingProperty(key="ignore_cache_errors", default=False, convert=bool)
36+
base_dir: str = LazySettingProperty(default=".arca")
37+
single_pull: bool = LazySettingProperty(default=False, convert=bool)
38+
ignore_cache_errors: bool = LazySettingProperty(default=False, convert=bool)
4039

4140
def __init__(self, backend: BackendDefinitionType=NOT_SET,
4241
settings=None,
4342
single_pull=None,
4443
base_dir=None,
4544
ignore_cache_errors=None) -> None:
46-
self.settings: Settings = self._get_settings(settings)
45+
self.settings: Settings = Settings(settings)
4746

4847
if ignore_cache_errors is not None:
4948
self.ignore_cache_errors = bool(ignore_cache_errors)
@@ -80,22 +79,6 @@ def get_backend_instance(self, backend: BackendDefinitionType) -> BaseBackend:
8079

8180
return backend
8281

83-
def _get_settings(self, settings: Optional[Dict[str, Any]]) -> Settings:
84-
"""
85-
Returns a initialized a :class:`arca.utils.Settings` instance,
86-
from the provided dictionary and from environment variables
87-
"""
88-
if settings is not None:
89-
_settings = Settings(settings)
90-
else:
91-
_settings = Settings()
92-
93-
for key, val in os.environ.items():
94-
if key.startswith(Settings.PREFIX):
95-
_settings.set(key, val)
96-
97-
return _settings
98-
9982
def make_region(self) -> CacheRegion:
10083
"""
10184
Returns a :class:`CacheRegion <dogpile.cache.region.CacheRegion>` based on settings.

arca/backend/base.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class BaseBackend:
2525
* **cwd**: Relative path to the required working directory. (default is ``""``, the root of the repo)
2626
"""
2727

28-
requirements_location: str = LazySettingProperty(key="requirements_location", default="requirements.txt")
29-
cwd: str = LazySettingProperty(key="cwd", default="")
28+
requirements_location: str = LazySettingProperty(default="requirements.txt")
29+
cwd: str = LazySettingProperty(default="")
3030

3131
def __init__(self, **settings):
3232
self._arca = None
@@ -66,6 +66,8 @@ def get_setting(self, key, default=NOT_SET):
6666
6767
:raise KeyError: If the key is not set and default isn't provided.
6868
"""
69+
if self._arca is None:
70+
raise LazySettingProperty.SettingsNotReady
6971
return self._arca.settings.get(*self.get_settings_keys(key), default=default)
7072

7173
def get_requirements_file(self, path: Path) -> Optional[Path]:

arca/backend/current_environment.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,8 @@ class CurrentEnvironmentBackend(BaseRunInSubprocessBackend):
4040
4141
"""
4242

43-
current_environment_requirements = LazySettingProperty(key="current_environment_requirements",
44-
default="requirements.txt")
45-
requirements_strategy = LazySettingProperty(key="requirements_strategy",
46-
default=RequirementsStrategy.RAISE,
43+
current_environment_requirements = LazySettingProperty(default="requirements.txt")
44+
requirements_strategy = LazySettingProperty(default=RequirementsStrategy.RAISE,
4745
convert=RequirementsStrategy)
4846

4947
def install_requirements(self, *, path: Optional[Path] = None, requirements: Optional[Iterable[str]] = None,

arca/backend/docker.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ class DockerBackend(BaseBackend):
4040
* **registry_pull_only** - only use the registry to pull images, don't push updated
4141
"""
4242

43-
python_version = LazySettingProperty(key="python_version", default=None)
44-
keep_container_running = LazySettingProperty(key="keep_container_running", default=False)
45-
apk_dependencies = LazySettingProperty(key="apk_dependencies", default=None)
46-
disable_pull = LazySettingProperty(key="disable_pull", default=False) # so the build can be tested
47-
inherit_image = LazySettingProperty(key="inherit_image", default=None)
48-
use_registry_name = LazySettingProperty(key="use_registry_name", default=None)
49-
registry_pull_only = LazySettingProperty(key="registry_pull_only", default=False)
43+
python_version = LazySettingProperty(default=None)
44+
keep_container_running = LazySettingProperty(default=False)
45+
apk_dependencies = LazySettingProperty(default=None)
46+
disable_pull = LazySettingProperty(default=False) # so the build can be tested
47+
inherit_image = LazySettingProperty(default=None)
48+
use_registry_name = LazySettingProperty(default=None)
49+
registry_pull_only = LazySettingProperty(default=False)
5050

5151
NO_REQUIREMENTS_HASH = "no_req"
5252
NO_DEPENDENCIES_HASH = "no_dep"

arca/backend/vagrant.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ class VagrantBackend(DockerBackend):
3636

3737
# Box has to either not contain docker at all (will be installed in that case, takes a long time)
3838
# or has to contain Docker with version >= 1.8 (Versions < 1.8 can't copy files from host to container)
39-
box = LazySettingProperty(key="box", default="ailispaw/barge")
40-
provider = LazySettingProperty(key="provider", default="virtualbox")
41-
quiet = LazySettingProperty(key="quiet", default=True, convert=bool)
42-
destroy = LazySettingProperty(key="destroy", default=True, convert=bool)
39+
box = LazySettingProperty(default="ailispaw/barge")
40+
provider = LazySettingProperty(default="virtualbox")
41+
quiet = LazySettingProperty(default=True, convert=bool)
42+
destroy = LazySettingProperty(default=True, convert=bool)
4343

4444
def __init__(self, **kwargs):
4545
super().__init__(**kwargs)

arca/utils.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import importlib
22
import logging
3+
import os
34
from pathlib import Path
45
from typing import Any, Dict, Optional, Callable, Union
56

@@ -50,18 +51,24 @@ class LazySettingProperty:
5051
The property is evaluated lazily when accessed, getting the value from settings
5152
using the instances method ``get_setting``. The property can be overridden by the constructor.
5253
"""
53-
def __init__(self, *, key, default=NOT_SET, convert: Callable=None) -> None:
54+
class SettingsNotReady(Exception):
55+
pass
56+
57+
def __init__(self, *, key=None, default=NOT_SET, convert: Callable=None) -> None:
5458
self.key = key
5559
self.default = default
5660
self.convert = convert
5761

5862
def __set_name__(self, cls, name):
5963
self.name = name
64+
if self.key is None:
65+
self.key = name
6066

6167
def __get__(self, instance, cls):
62-
if instance is None or (hasattr(instance, "_arca") and instance._arca is None):
68+
try:
69+
result = instance.get_setting(self.key, self.default)
70+
except self.SettingsNotReady:
6371
return self
64-
result = instance.get_setting(self.key, self.default)
6572

6673
if self.convert is not None:
6774
result = self.convert(result)
@@ -77,7 +84,11 @@ class Settings:
7784
PREFIX = "ARCA"
7885

7986
def __init__(self, data: Optional[Dict[str, Any]]=None) -> None:
80-
self._data = data or {}
87+
self._data = dict(data) if data else {}
88+
89+
for key, val in os.environ.items():
90+
if key.startswith(Settings.PREFIX):
91+
self.set(key, val)
8192

8293
def set(self, key, value):
8394
self._data[key] = value

0 commit comments

Comments
 (0)