Skip to content

Commit

Permalink
Fix bug related to what is fed to Task.init_options().
Browse files Browse the repository at this point in the history
  • Loading branch information
rbdixon committed Aug 13, 2019
1 parent f2a5e14 commit 8df3e48
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 17 deletions.
7 changes: 3 additions & 4 deletions doit/loader.py
Expand Up @@ -186,13 +186,12 @@ def _add_delayed(tname, ref):
parser = TaskParse([CmdOption(opt) for opt in task_gen['params']])
# Annotate the task generator with parsed parameter values so that when
# the task is eventually called the parsed parameters are available.
task_gen['parsed'], _ = parser.parse('')

# if relevant command line defaults are available parse those
if len(args) > 0:
if name == args[0]:
# parse command line
task_gen['parsed'], _ = parser.parse(args[1:])
else:
# set defaults
task_gen['parsed'], _ = parser.parse('')

if not delayed: # not a delayed task, just run creator
_process_gen(ref)
Expand Down
8 changes: 4 additions & 4 deletions doit/task.py
Expand Up @@ -373,14 +373,14 @@ def init_options(self, args=None):
if self.cfg_values is not None:
taskcmd.overwrite_defaults(self.cfg_values)

if args is None:
if args is None or len(args) == 0:
# ignore positional parameters
self.options.update(taskcmd.parse('')[0])
return None
else:
elif len(args) > 0:
parsed_options, args = taskcmd.parse(args)
self.options.update(parsed_options)
return args

return args

def _init_getargs(self):
"""task getargs attribute define implicit task dependencies"""
Expand Down
33 changes: 24 additions & 9 deletions tests/test_loader.py
Expand Up @@ -7,7 +7,7 @@
from doit.task import InvalidTask, DelayedLoader, Task
from doit.loader import flat_generator, get_module
from doit.loader import load_tasks, load_doit_config, generate_tasks
from doit.loader import create_after, task_param
from doit.loader import create_after, task_param, TASK_GEN_PARAM


class TestFlatGenerator(object):
Expand Down Expand Up @@ -209,13 +209,12 @@ def task_method2(self):

class TestTaskGeneratorParams(object):

class Tasks(object):
@task_param([{"name": "foo", "default": "bar", "long": "foo"}])
def task_foo(self, foo):
return {
'actions': [],
'doc': foo
}
def test_task_param_annotations(self):
pd = [{"name": "foo", "default": "bar", "long": "foo"}]
func = task_param(pd)(lambda: 1)
assert hasattr(func, TASK_GEN_PARAM)
assert getattr(func, TASK_GEN_PARAM)['params'] == pd
assert getattr(func, TASK_GEN_PARAM)['parsed'] == {}

def test_method_default(self):
'Ensure that a task parameter can be passed to the task generator.'
Expand All @@ -229,6 +228,8 @@ def task_foo(foo):
task_list = load_tasks({'task_foo': task_foo})
task = task_list.pop()
assert task.doc == 'bar'
task.init_options()
assert task.options['foo'] == 'bar'

def test_method_args(self):
'Ensure that a task generator parameter can be set from the command line.'
Expand All @@ -238,16 +239,30 @@ def task_foo(foo):
'actions': [],
'doc': foo
}
task_list = load_tasks({'task_foo': task_foo}, args=['foo', '--foo=from_arg'])

args = ['foo', '--foo=from_arg']
task_list = load_tasks({'task_foo': task_foo}, args=args)
task = task_list.pop()
assert task.doc == 'from_arg'
task.init_options(args=args[1:])
assert task.options['foo'] == 'from_arg'

class Tasks(object):
@task_param([{"name": "foo", "default": "bar", "long": "foo"}])
def task_foo(self, foo):
return {
'actions': [],
'doc': foo
}

def test_class_default(self):
'Ensure that a task parameter can be passed to the task generator defined as a class method.'
foo = self.Tasks().task_foo
task_list = load_tasks({'task_foo': foo})
task = task_list.pop()
assert task.doc == 'bar'
task.init_options()
assert task.options['foo'] == 'bar'

class TestDodoConfig(object):

Expand Down

0 comments on commit 8df3e48

Please sign in to comment.