Skip to content
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
1 change: 1 addition & 0 deletions docs/changelog/2264.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix plugin initialization order - core plugins first, then 3rd party and finally inline - by :user:`gaborbernat`.
2 changes: 1 addition & 1 deletion src/tox/config/cli/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def _get_base(args: Sequence[str]) -> tuple[int, ToxHandler, Source]:

source = discover_source(parsed.config_file, parsed.root_dir)

MANAGER.load_inline_plugin(source.path)
MANAGER.load_plugins(source.path)

return guess_verbosity, handler, source

Expand Down
17 changes: 9 additions & 8 deletions src/tox/plugin/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,13 @@ def __init__(self) -> None:
self.manager: pluggy.PluginManager = pluggy.PluginManager(NAME)
self.manager.add_hookspecs(spec)

def _register_plugins(self, inline: ModuleType | None) -> None:
from tox.session import state
from tox.session.cmd import depends, devenv, exec_, legacy, list_env, quickstart, show_config, version_flag

if inline is not None:
self.manager.register(inline)
self.manager.load_setuptools_entrypoints(NAME)
internal_plugins = (
loader_api,
provision,
Expand All @@ -49,10 +53,8 @@ def __init__(self) -> None:
sequential,
package_api,
)

for plugin in internal_plugins:
self.manager.register(plugin)
self.manager.load_setuptools_entrypoints(NAME)
self.manager.register(state)
self.manager.check_pending()

Expand All @@ -74,13 +76,12 @@ def tox_before_run_commands(self, tox_env: ToxEnv) -> None:
def tox_after_run_commands(self, tox_env: ToxEnv, exit_code: int, outcomes: list[Outcome]) -> None:
self.manager.hook.tox_after_run_commands(tox_env=tox_env, exit_code=exit_code, outcomes=outcomes)

def load_inline_plugin(self, path: Path) -> None:
result = _load_inline(path)
if result is not None:
self.manager.register(result)
def load_plugins(self, path: Path) -> None:
for _plugin in self.manager.get_plugins(): # make sure we start with a clean state, repeated in memory run
self.manager.unregister(_plugin)
inline = _load_inline(path)
self._register_plugins(inline)
REGISTER._register_tox_env_types(self)
if result is not None: #: recheck pending for the inline plugins
self.manager.check_pending()


def _load_inline(path: Path) -> ModuleType | None: # used to be able to unregister plugin tests
Expand Down
6 changes: 2 additions & 4 deletions src/tox/pytest.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,8 @@ def _disable_root_tox_py(request: SubRequest, mocker: MockerFixture) -> Iterator

def _load_inline(path: Path) -> ModuleType | None: # register only on first run, and unregister at end
nonlocal module
if module is None:
module = load_inline(path)
return module
return None
module = load_inline(path)
return module

mocker.patch.object(manager, "_load_inline", _load_inline)
yield
Expand Down
4 changes: 2 additions & 2 deletions src/tox/tox_env/register.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ def __init__(self) -> None:

def _register_tox_env_types(self, manager: Plugin) -> None:
manager.tox_register_tox_env(register=self)
if not self._default_run_env:
self._default_run_env = next(iter(self._run_envs.keys()))

def add_run_env(self, of_type: type[RunToxEnv]) -> None:
"""
Expand All @@ -49,6 +47,8 @@ def env_runners(self) -> Iterable[str]:
@property
def default_env_runner(self) -> str:
""":returns: the default run environment type"""
if not self._default_run_env and self._run_envs:
self._default_run_env = next(iter(self._run_envs.keys()))
return self._default_run_env

@default_env_runner.setter
Expand Down
13 changes: 10 additions & 3 deletions tests/tox_env/test_register.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,15 @@ def test_register_set_new_default_no_register() -> None:


def test_register_set_new_default_with_register() -> None:
class B(VirtualEnvRunner):
@staticmethod
def id() -> str:
return "B"

register = ToxEnvRegister()
register.add_run_env(VirtualEnvRunner)
assert register.default_env_runner == ""
register.default_env_runner = VirtualEnvRunner.id()
assert register.default_env_runner == "virtualenv"
assert register.default_env_runner == VirtualEnvRunner.id()
register.add_run_env(B)
assert register.default_env_runner == VirtualEnvRunner.id()
register.default_env_runner = B.id()
assert register.default_env_runner == "B"
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ description = run type check on code base
setenv =
{tty:MYPY_FORCE_COLOR = 1}
deps =
mypy==0.930
mypy==0.931
types-cachetools
types-chardet
types-freezegun
Expand Down