Compare commits
4 commits
72e609f96b
...
5f4d9963d6
Author | SHA1 | Date | |
---|---|---|---|
|
5f4d9963d6 | ||
|
8d94c6ec1a | ||
|
2294ac78f8 | ||
|
25497721a3 |
5 changed files with 56 additions and 2 deletions
7
.github/workflows/ci.yml
vendored
7
.github/workflows/ci.yml
vendored
|
@ -47,11 +47,14 @@ jobs:
|
|||
run: |
|
||||
python -m tox
|
||||
python -m tox -e coverage_report
|
||||
- uses: codecov/codecov-action@v3
|
||||
- uses: codecov/codecov-action@v5
|
||||
with:
|
||||
fail_ci_if_error: true
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
fmt:
|
||||
name: Format
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: psf/black@stable
|
||||
- uses: isort/isort-action@v1
|
||||
|
|
4
codecov.yml
Normal file
4
codecov.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
coverage:
|
||||
status:
|
||||
project: off
|
||||
patch: off
|
|
@ -5,8 +5,23 @@ from .context import Context
|
|||
from .messenger import Messenger
|
||||
from .plugin import Plugin
|
||||
|
||||
current_dispatcher = None
|
||||
|
||||
|
||||
class Dispatcher:
|
||||
def __new__(cls, *args, **kwargs):
|
||||
# After dotbot instantiates this class, the instance will be cached.
|
||||
# Subsequent instantiations (say, by plugins) will return the same instance.
|
||||
# This is needed because plugins don't have access to the entire configuration
|
||||
# (for example, they won't know which plugins have been loaded).
|
||||
# This ensures a consistent configuration is used.
|
||||
global current_dispatcher
|
||||
if current_dispatcher is None:
|
||||
instance = object.__new__(cls)
|
||||
instance.is_initialized = False
|
||||
current_dispatcher = instance
|
||||
return current_dispatcher
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
base_directory,
|
||||
|
@ -16,6 +31,9 @@ class Dispatcher:
|
|||
options=Namespace(),
|
||||
plugins=None,
|
||||
):
|
||||
if self.is_initialized:
|
||||
return
|
||||
self.is_initialized = True
|
||||
self._log = Messenger()
|
||||
self._setup_context(base_directory, options)
|
||||
plugins = plugins or []
|
||||
|
|
|
@ -12,6 +12,7 @@ import pytest
|
|||
import yaml
|
||||
|
||||
import dotbot.cli
|
||||
import dotbot.dispatcher
|
||||
|
||||
|
||||
def get_long_path(path):
|
||||
|
@ -315,3 +316,9 @@ def run_dotbot(dotfiles):
|
|||
dotbot.cli.main()
|
||||
|
||||
yield runner
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def reset_current_dispatcher():
|
||||
yield
|
||||
dotbot.dispatcher.current_dispatcher = None
|
||||
|
|
22
tests/test_dispatcher.py
Normal file
22
tests/test_dispatcher.py
Normal file
|
@ -0,0 +1,22 @@
|
|||
import dotbot.dispatcher
|
||||
|
||||
|
||||
def test_dispatcher_instantiation(home, dotfiles, run_dotbot):
|
||||
"""Verify that the dispatcher caches itself as a singleton."""
|
||||
|
||||
assert dotbot.dispatcher.current_dispatcher is None
|
||||
|
||||
dotfiles.write_config([])
|
||||
run_dotbot()
|
||||
|
||||
# Verify the dispatcher has been cached.
|
||||
assert dotbot.dispatcher.current_dispatcher is not None
|
||||
|
||||
existing_id = id(dotbot.dispatcher.current_dispatcher)
|
||||
new_instance = dotbot.dispatcher.Dispatcher("bogus")
|
||||
|
||||
# Verify the new and existing instances are the same.
|
||||
assert existing_id == id(new_instance)
|
||||
|
||||
# Verify the singleton was not overridden.
|
||||
assert existing_id == id(dotbot.dispatcher.current_dispatcher)
|
Loading…
Reference in a new issue