Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use list for file_dep (fixes #254). #430

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
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
4 changes: 1 addition & 3 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ Changes

- Ref #409: make cloudpickle optional, and not installed by default on PyPy.
- fix: make sure `io.capture` respects out/err option.


- Fix #254: use `list` for `file_dep` instead of `set` to preserve the order of dependencies.

0.36.0 (*2022-04-22*)
=====================
Expand Down Expand Up @@ -611,4 +610,3 @@ Changes
====================

- initial release

2 changes: 1 addition & 1 deletion doit/control.py
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,7 @@ def _add_task(self, node):
# remove file_dep since generated tasks are not required
# to really create the target (support multiple matches)
if regex_group:
this_task.file_dep = {}
this_task.file_dep = []
if regex_group.target in self.targets:
regex_group.found = True
else:
Expand Down
7 changes: 4 additions & 3 deletions doit/dependency.py
Original file line number Diff line number Diff line change
Expand Up @@ -679,10 +679,11 @@ def get_status(self, task, tasks_dict, get_log=False):
# check for modified file_dep
previous = self._get(task.name, 'deps:')
previous_set = set(previous) if previous else None
if previous_set and previous_set != task.file_dep:
set_file_dep = set(task.file_dep)
if previous_set and previous_set != set_file_dep:
if get_log:
added_files = sorted(list(task.file_dep - previous_set))
removed_files = sorted(list(previous_set - task.file_dep))
added_files = sorted(list(set_file_dep - previous_set))
removed_files = sorted(list(previous_set - set_file_dep))
result.set_reason('added_file_dep', added_files)
result.set_reason('removed_file_dep', removed_files)
result.status = 'run'
Expand Down
6 changes: 3 additions & 3 deletions doit/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ def _init_deps(self, file_dep, task_dep, calc_dep):
self.dep_changed = None

# file_dep
self.file_dep = set()
self.file_dep = []
self._expand_file_dep(file_dep)

# task_dep
Expand Down Expand Up @@ -327,9 +327,9 @@ def _expand_file_dep(self, file_dep):
"""put input into file_dep"""
for dep in file_dep:
if isinstance(dep, str):
self.file_dep.add(dep)
self.file_dep.append(dep)
elif isinstance(dep, PurePath):
self.file_dep.add(str(dep))
self.file_dep.append(str(dep))
else:
msg = ("%s. file_dep must be a str or Path from pathlib. "
"Got '%r' (%s)")
Expand Down
6 changes: 3 additions & 3 deletions tests/test_action.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ def test_task_meta_reference(self):
assert my_action.execute() is None

got = my_action.out.split('-')
assert task.file_dep == set(got[0].split())
assert task.file_dep == got[0].split()
assert task.dep_changed == got[1].split()
assert targets == got[2].split()

Expand Down Expand Up @@ -896,15 +896,15 @@ def py_callable(targets, dependencies, changed, task):
targets.append('new_target')
dependencies.append('new_dependency')
changed.append('new_changed')
task.file_dep.add('dep2')
task.file_dep.append('dep2')
my_task = Task('Fake', [py_callable], file_dep=['dependencies'],
targets=['targets'])
my_task.dep_changed = ['changed']
my_task.options = {}
my_action = my_task.actions[0]
my_action.execute()

assert my_task.file_dep == set(['dependencies', 'dep2'])
assert my_task.file_dep == ['dependencies', 'dep2']
assert my_task.targets == ['targets']
assert my_task.dep_changed == ['changed']

Expand Down
12 changes: 6 additions & 6 deletions tests/test_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ def test_filter_delayed_regex_single(self):
assert len(selected) == 1
assert selected[0] == '_regex_target_abc:taskY'
sel_task = control.tasks['_regex_target_abc:taskY']
assert sel_task.file_dep == {'abc'}
assert sel_task.file_dep == ['abc']
assert sel_task.loader.basename == 'taskY'
assert sel_task.loader is t2.loader

Expand Down Expand Up @@ -159,8 +159,8 @@ def test_filter_delayed_regex_multiple_match(self):
assert len(selected) == 2
assert (sorted(selected) ==
['_regex_target_abc:taskY', '_regex_target_abc:taskZ'])
assert control.tasks['_regex_target_abc:taskY'].file_dep == {'abc'}
assert control.tasks['_regex_target_abc:taskZ'].file_dep == {'abc'}
assert control.tasks['_regex_target_abc:taskY'].file_dep == ['abc']
assert control.tasks['_regex_target_abc:taskZ'].file_dep == ['abc']
assert (control.tasks['_regex_target_abc:taskY'].loader.basename ==
t2.name)
assert (control.tasks['_regex_target_abc:taskZ'].loader.basename ==
Expand All @@ -177,8 +177,8 @@ def test_filter_delayed_regex_auto(self):
assert len(selected) == 2
assert (sorted(selected) ==
['_regex_target_abc:taskY', '_regex_target_abc:taskZ'])
assert control.tasks['_regex_target_abc:taskY'].file_dep == {'abc'}
assert control.tasks['_regex_target_abc:taskZ'].file_dep == {'abc'}
assert control.tasks['_regex_target_abc:taskY'].file_dep == ['abc']
assert control.tasks['_regex_target_abc:taskZ'].file_dep == ['abc']
assert (control.tasks['_regex_target_abc:taskY'].loader.basename ==
t2.name)
assert (control.tasks['_regex_target_abc:taskZ'].loader.basename ==
Expand Down Expand Up @@ -586,7 +586,7 @@ def creator():

# file_dep is removed because foo might not be task
# that creates this task (support for multi regex matches)
assert n6.file_dep == {}
assert n6.file_dep == []


def test_regex_group_already_created(self):
Expand Down
2 changes: 1 addition & 1 deletion tests/test_dependency.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ def test_save_files(self, pdep_manager):
pdep_manager.save_success(t1)
assert pdep_manager._get("taskId_X", filePath) is not None
assert pdep_manager._get("taskId_X", filePath2) is not None
assert set(pdep_manager._get("taskId_X", 'deps:')) == t1.file_dep
assert list(pdep_manager._get("taskId_X", 'deps:')) == t1.file_dep

def test_save_values(self, pdep_manager):
t1 = Task('t1', None)
Expand Down
4 changes: 2 additions & 2 deletions tests/test_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ def creator():
original.create_doit_tasks = creator
task_list = load_tasks({'x': original})
assert 1 == len(task_list)
assert set(['foox']) == task_list[0].file_dep
assert ['foox'] == task_list[0].file_dep

def testUse_create_doit_tasks_class_method(self):
class Foo(object):
Expand All @@ -209,7 +209,7 @@ def _create_doit_tasks(self):

task_list = load_tasks({'Foo':Foo, 'foo':Foo()})
assert len(task_list) == 1
assert task_list[0].file_dep == set(['fooy'])
assert task_list[0].file_dep == ['fooy']

def testUse_create_doit_tasks_basename_kwargs(self):
class Foo(object):
Expand Down
4 changes: 2 additions & 2 deletions tests/test_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ def use_args(arg1):
def make_args():
return {'myarg':1}
def action_add_filedep(task, extra_dep):
task.file_dep.add(extra_dep)
task.file_dep.append(extra_dep)


class TestRunner_run_tasks(object):
Expand Down Expand Up @@ -542,7 +542,7 @@ def testActionModifiesFiledep(self, reporter, RunnerClass, dep_manager):
assert ('start', t1) == reporter.log.pop(0), reporter.log
assert ('execute', t1) == reporter.log.pop(0)
assert ('success', t1) == reporter.log.pop(0)
assert t1.file_dep == set([extra_dep])
assert t1.file_dep == [extra_dep]

# SystemExit runner should not interfere with SystemExit
def testSystemExitRaises(self, reporter, RunnerClass, dep_manager):
Expand Down
8 changes: 4 additions & 4 deletions tests/test_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,13 +210,13 @@ def test_invalid(self):
class TestTaskExpandFileDep(object):

def test_dependencyStringIsFile(self):
my_task = task.Task("Task X", ["taskcmd"], file_dep=["123","456"])
assert set(["123","456"]) == my_task.file_dep
my_task = task.Task("Task X", ["taskcmd"], file_dep=["123", "456"])
assert ["123", "456"] == my_task.file_dep

def test_file_dep_path(self):
my_task = task.Task("Task X", ["taskcmd"],
file_dep=["123", Path("456"), PurePath("789")])
assert {"123", "456", "789"} == my_task.file_dep
assert ["123", "456", "789"] == my_task.file_dep

def test_file_dep_str(self):
pytest.raises(task.InvalidTask, task.Task, "Task X", ["taskcmd"],
Expand Down Expand Up @@ -248,7 +248,7 @@ def test_update_deps(self):
'uptodate': [True],
'to_be_ignored': 'asdf',
})
assert set(['fileX', 'fileY']) == my_task.file_dep
assert ['fileX', 'fileY'] == my_task.file_dep
assert ['taskY'] == my_task.task_dep
assert set(['calcX', 'calcY']) == my_task.calc_dep
assert [(None, None, None), (True, None, None)] == my_task.uptodate
Expand Down