Skip to content

Commit 19ff49d

Browse files
committed
Merge TomlLoader and MemoryLoader
1 parent 9ce3ab0 commit 19ff49d

File tree

12 files changed

+48
-176
lines changed

12 files changed

+48
-176
lines changed

src/tox/config/loader/memory.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from __future__ import annotations
22

33
from pathlib import Path
4-
from typing import TYPE_CHECKING, Any, Iterator
4+
from typing import TYPE_CHECKING, Any, Iterator, Sequence
55

66
from tox.config.types import Command, EnvList
77

8-
from .api import Loader
8+
from .api import Loader, Override
99
from .section import Section
1010
from .str_convert import StrConvert
1111

@@ -14,9 +14,14 @@
1414

1515

1616
class MemoryLoader(Loader[Any]):
17-
def __init__(self, **kwargs: Any) -> None:
18-
super().__init__(Section(prefix="<memory>", name=str(id(self))), [])
19-
self.raw: dict[str, Any] = {**kwargs}
17+
def __init__(self, raw: dict[str, Any], *, section: Section | None = None, overrides: list[Override] | None = None,
18+
) -> None:
19+
section = section or Section(prefix="<memory>", name=str(id(self)))
20+
super().__init__(section, overrides or [])
21+
self.raw = raw
22+
23+
def __repr__(self) -> str:
24+
return f"{self.__class__.__name__}(section={self._section.key}, overrides={self.overrides!r})"
2025

2126
def load_raw(self, key: Any, conf: Config | None, env_name: str | None) -> Any: # noqa: ARG002
2227
return self.raw[key]
@@ -62,4 +67,6 @@ def to_env_list(value: Any) -> EnvList:
6267
return value
6368
if isinstance(value, str):
6469
return StrConvert.to_env_list(value)
70+
if isinstance(value, Sequence):
71+
return EnvList(value)
6572
raise TypeError(value)

src/tox/config/loader/toml.py

Lines changed: 0 additions & 100 deletions
This file was deleted.

src/tox/config/source/toml.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from tox.config.loader.ini.factor import find_envs
1515
from tox.config.loader.section import Section
16-
from tox.config.loader.toml import TomlLoader
16+
from tox.config.loader.memory import MemoryLoader
1717

1818
from .api import Source
1919
from .ini_section import CORE, PKG_ENV_PREFIX, TEST_ENV_PREFIX, IniSection
@@ -48,7 +48,7 @@ def __repr__(self) -> str:
4848
def transform_section(self, section: Section) -> Section: # noqa: PLR6301
4949
return IniSection(section.prefix, section.name)
5050

51-
def get_loader(self, section: Section, override_map: OverrideMap) -> TomlLoader | None:
51+
def get_loader(self, section: Section, override_map: OverrideMap) -> MemoryLoader | None:
5252
# look up requested section name in the generative testenv mapping to find the real config source
5353
for key in self._section_mapping.get(section.name) or []:
5454
if section.prefix is None or Section.from_key(key).prefix == section.prefix:
@@ -57,12 +57,10 @@ def get_loader(self, section: Section, override_map: OverrideMap) -> TomlLoader
5757
# if no matching section/prefix is found, use the requested section key as-is (for custom prefixes)
5858
key = section.key
5959
if key in self._raw:
60-
return TomlLoader(
60+
return MemoryLoader(
61+
self._raw[key],
6162
section=section,
62-
raw=self._raw,
6363
overrides=override_map.get(section.key, []),
64-
core_section=self.CORE_SECTION,
65-
section_key=key,
6664
)
6765
return None
6866

src/tox/provision.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,14 @@ def add_tox_requires_min_version(reqs: list[Requirement]) -> list[Requirement]:
9191

9292
deps = ", ".join(f"{p}{'' if v is None else f' ({v})'}" for p, v in missing)
9393
loader = MemoryLoader( # these configuration values are loaded from in-memory always (no file conf)
94-
base=[], # disable inheritance for provision environments
95-
package="skip", # no packaging for this please
96-
# use our own dependency specification
97-
deps=PythonDeps("\n".join(str(r) for r in requires), root=state.conf.core["tox_root"]),
98-
pass_env=["*"], # do not filter environment variables, will be handled by provisioned tox
99-
recreate=state.conf.options.recreate and not state.conf.options.no_recreate_provision,
94+
dict(
95+
base=[], # disable inheritance for provision environments
96+
package="skip", # no packaging for this please
97+
# use our own dependency specification
98+
deps=PythonDeps("\n".join(str(r) for r in requires), root=state.conf.core["tox_root"]),
99+
pass_env=["*"], # do not filter environment variables, will be handled by provisioned tox
100+
recreate=state.conf.options.recreate and not state.conf.options.no_recreate_provision,
101+
)
100102
)
101103
provision_tox_env: str = state.conf.core["provision_tox_env"]
102104
state.conf.memory_seed_loaders[provision_tox_env].append(loader)

src/tox/session/cmd/devenv.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ def devenv(state: State) -> int:
3535
opt.skip_pkg_install = False # always install a package in this case
3636
opt.no_test = True # do not run the test phase
3737
loader = MemoryLoader( # these configuration values are loaded from in-memory always (no file conf)
38-
usedevelop=True, # dev environments must be of type dev
39-
env_dir=opt.devenv_path, # move it in source
38+
dict(
39+
usedevelop=True, # dev environments must be of type dev
40+
env_dir=opt.devenv_path, # move it in source
41+
)
4042
)
4143
state.conf.memory_seed_loaders[next(iter(opt.env))].append(loader)
4244

src/tox/session/cmd/exec_.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ def exec_(state: State) -> int:
3434
msg = f"exactly one target environment allowed in exec mode but found {', '.join(envs)}"
3535
raise HandledError(msg)
3636
loader = MemoryLoader( # these configuration values are loaded from in-memory always (no file conf)
37-
commands_pre=[],
38-
commands=[],
39-
commands_post=[],
37+
dict(
38+
commands_pre=[],
39+
commands=[],
40+
commands_post=[],
41+
)
4042
)
4143
conf = state.envs[envs[0]].conf
4244
conf.loaders.insert(0, loader)

src/tox/session/cmd/legacy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def _handle_legacy_only_flags(option: Parsed, envs: EnvSelector) -> None: # noq
129129
for env in envs.iter(only_active=True, package=False):
130130
env_conf = envs[env].conf
131131
if override:
132-
env_conf.loaders.insert(0, MemoryLoader(**override))
132+
env_conf.loaders.insert(0, MemoryLoader(override))
133133
if set_env:
134134
cast(SetEnv, env_conf["set_env"]).update(set_env, override=True)
135135
if forced:

tests/config/loader/test_memory_loader.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@
88

99
from tox.config.loader.api import ConfigLoadArgs, Override
1010
from tox.config.loader.memory import MemoryLoader
11+
from tox.config.loader.section import Section
1112
from tox.config.types import Command, EnvList
1213

1314

1415
def test_memory_loader_repr() -> None:
15-
loader = MemoryLoader(a=1)
16-
assert repr(loader) == "MemoryLoader"
16+
core = Section(None, "tox")
17+
loader = MemoryLoader({'a': 1}, section=core)
18+
assert repr(loader) == "MemoryLoader(section=tox, overrides={})"
1719

1820

1921
def test_memory_loader_override() -> None:
20-
loader = MemoryLoader(a=1)
22+
loader = MemoryLoader({'a': 1})
2123
loader.overrides["a"] = [Override("a=2")]
2224
args = ConfigLoadArgs([], "name", None)
2325
loaded = loader.load("a", of_type=int, conf=None, factory=None, args=args)
@@ -48,11 +50,12 @@ def test_memory_loader_override() -> None:
4850
(os.getcwd(), Path, Path.cwd()), # noqa: PTH109
4951
("pip list", Command, Command(["pip", "list"])),
5052
("a\nb", EnvList, EnvList(["a", "b"])),
53+
(["a", "b"], EnvList, EnvList(["a", "b"])),
5154
("1", Optional[int], 1),
5255
],
5356
)
5457
def test_memory_loader(value: Any, of_type: type[Any], outcome: Any) -> None:
55-
loader = MemoryLoader(a=value, kwargs={})
58+
loader = MemoryLoader({'a': value, 'kwargs': {}})
5659
args = ConfigLoadArgs([], "name", None)
5760
loaded = loader.load("a", of_type=of_type, conf=None, factory=None, args=args)
5861
assert loaded == outcome
@@ -72,18 +75,18 @@ def test_memory_loader(value: Any, of_type: type[Any], outcome: Any) -> None:
7275
],
7376
)
7477
def test_memory_loader_fails_invalid(value: Any, of_type: type[Any], exception: Exception, msg: str) -> None:
75-
loader = MemoryLoader(a=value, kwargs={})
78+
loader = MemoryLoader({'a': value, 'kwargs': {}})
7679
args = ConfigLoadArgs([], "name", None)
7780
with pytest.raises(exception, match=msg): # type: ignore[call-overload]
7881
loader.load("a", of_type=of_type, conf=None, factory=None, args=args)
7982

8083

8184
def test_memory_found_keys() -> None:
82-
loader = MemoryLoader(a=1, c=2)
85+
loader = MemoryLoader({'a': 1, 'c': 2})
8386
assert loader.found_keys() == {"a", "c"}
8487

8588

8689
def test_memory_loader_contains() -> None:
87-
loader = MemoryLoader(a=1)
90+
loader = MemoryLoader({'a': 1})
8891
assert "a" in loader
8992
assert "b" not in loader

tests/config/loader/toml/test_toml_loader.py

Lines changed: 0 additions & 42 deletions
This file was deleted.

tests/config/test_main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def test_config_overrides(tox_ini_conf: ToxIniCreator) -> None:
102102

103103
def test_config_override_wins_memory_loader(tox_ini_conf: ToxIniCreator) -> None:
104104
main_conf = tox_ini_conf("[testenv]", override=[Override("testenv.c=ok")])
105-
conf = main_conf.get_env("py", loaders=[MemoryLoader(c="something_else")])
105+
conf = main_conf.get_env("py", loaders=[MemoryLoader({'c': "something_else"})])
106106
conf.add_config("c", of_type=str, default="d", desc="desc")
107107
assert conf["c"] == "ok"
108108

0 commit comments

Comments
 (0)