Skip to content

Commit

Permalink
Merge e22babe into 2b59b89
Browse files Browse the repository at this point in the history
  • Loading branch information
moltob committed May 13, 2019
2 parents 2b59b89 + e22babe commit 2ad26b4
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 2 deletions.
4 changes: 2 additions & 2 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ Changes
- Fix `result_dep`, use result **after** its execution
- Fix #286: Support `functools.partial` on tasks' dict metadata `task.title`
- Fix #285: `clean` command, remove targets in reverse lexical order
- Deprecated TaskLoader in favor of TaskLoader2, which separates loading doit's configuration from loading tasks.

- Deprecated `TaskLoader` in favor of `TaskLoader2`, which separates loading doit's configuration from loading tasks.
- Added `doit.get_dep_manager()` to access dependency manager during all task processing phases.

0.31.1 (*2018-03-18*)
=====================
Expand Down
32 changes: 32 additions & 0 deletions doc/samples/global_dep_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import doit.globals

DOIT_CONFIG = dict(
verbosity=2,
)


def task_create():
# dependency manager is defined for all code inside the generator:
dep_manager = doit.globals.Globals.dep_manager

def action(ident):
# assume some involved logic to define ident:
ident = 42
print('Created', ident)

# store for clean:
return dict(created=ident)

def clean(task):
result = dep_manager.get_result(task.name)
if result:
ident = result['created']
print('Deleted', ident)

# possibly forget the task, after it was cleaned:
dep_manager.remove(task.name)

return dict(
actions=[action],
clean=[clean],
)
4 changes: 4 additions & 0 deletions doit/cmd_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from collections import defaultdict
import textwrap

from .globals import Globals
from . import version
from .cmdparse import CmdOption, CmdParse
from .exceptions import InvalidCommand, InvalidDodoFile
Expand Down Expand Up @@ -543,6 +544,9 @@ def execute(self, params, args):
self.dep_manager = Dependency(
db_class, params['dep_file'], checker_cls)

# register dependency manager in global registry:
Globals.dep_manager = self.dep_manager

# load tasks from new-style loader, now that dependency manager is available:
if not legacy_loader:
self.task_list = self.loader.load_tasks(cmd=self, pos_args=args)
Expand Down
9 changes: 9 additions & 0 deletions doit/globals.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"""Simple registry of singletons."""


class Globals:
"""Accessors to doit singletons.
:cvar dep_manager: The doit dependency manager, holding all persistent task data.
"""
dep_manager = None
1 change: 1 addition & 0 deletions tests/test___init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ def test_get_initial_workdir(restore_cwd):
assert os.getcwd() == cwd, os.getcwd()
assert doit.get_initial_workdir() == initial_wd


18 changes: 18 additions & 0 deletions tests/test_cmd_base.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os

from unittest import mock
import pytest

from doit import version
Expand Down Expand Up @@ -207,6 +208,23 @@ def test_execute(self, depfile_name):
'--mine', 'min'])


@mock.patch('doit.cmd_base.Globals')
def test_execute_provides_dep_manager(self, mock_globals, depfile_name):
mock_globals.dep_manager = None
members = {'task_xxx1': lambda: {'actions': []}}

class MockTaskLoader(ModuleTaskLoader):
def load_tasks(self, cmd, pos_args):
assert mock_globals.dep_manager, 'dep_manager not set before tasks are loaded'
return super().load_tasks(cmd, pos_args)

loader = get_loader({}, task_loader=MockTaskLoader(members))
mycmd = self.MyCmd(task_loader=loader)

mycmd.parse_execute(['--db-file', depfile_name, '--mine', 'min'])
assert mock_globals.dep_manager == mycmd.dep_manager


def test_execute_with_legacy_dict_loader(self, depfile_name):
members = {'task_xxx1': lambda: {'actions': []}}

Expand Down

0 comments on commit 2ad26b4

Please sign in to comment.