Skip to content

Commit

Permalink
Merge ff7ace3 into 6006b54
Browse files Browse the repository at this point in the history
  • Loading branch information
saimn committed Jan 8, 2018
2 parents 6006b54 + ff7ace3 commit 8051136
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 28 deletions.
43 changes: 26 additions & 17 deletions doit/cmd_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
'short': 's',
'long': 'status',
'type': bool,
'default': False,
'default': True,
'help': """Shows reasons why this task would be executed.
[default: %(default)s]"""
}
Expand All @@ -27,7 +27,7 @@ class Info(DoitCmdBase):

cmd_options = (opt_show_execute_status, )

def _execute(self, pos_args, show_execute_status=False):
def _execute(self, pos_args, show_execute_status=True):
if len(pos_args) != 1:
msg = ('`info` failed, must select *one* task.'
'\nCheck `{} help info`.'.format(self.bin_name))
Expand All @@ -41,31 +41,40 @@ def _execute(self, pos_args, show_execute_status=False):

task = tasks[task_name]
task_attrs = (
'name', 'file_dep', 'task_dep', 'setup_tasks', 'calc_dep',
'targets',
'file_dep', 'task_dep', 'setup_tasks', 'calc_dep', 'targets',
# these fields usually contains reference to python functions
# 'actions', 'clean', 'uptodate', 'teardown', 'title'
'getargs', 'params', 'verbosity', 'watch'
)
for attr in task_attrs:
value = getattr(task, attr)
# by default only print fields that have non-empty value
if value:
self.outstream.write('\n{0}:'.format(attr))
printer.pprint(getattr(task, attr))

self.outstream.write('\n{}\n'.format(task.name))
if task.doc:
self.outstream.write('\n{}\n'.format(task.doc))

# print reason task is not up-to-date
if show_execute_status:
retcode = 0
if show_execute_status and self.dep_manager is not None:
status = self.dep_manager.get_status(task, tasks, get_log=True)
if status.status == 'up-to-date':
self.outstream.write('\nTask is up-to-date.\n')
return 0
else: # status.status == 'run' or status.status == 'error'
self.outstream.write('\nTask is not up-to-date:\n')
self.outstream.write('\n{:11s}: {}\n'
.format('status', status.status))
if status.status != 'up-to-date':
# status.status == 'run' or status.status == 'error'
self.outstream.write(self.get_reasons(status.reasons))
self.outstream.write('\n')
return 1
retcode = 1

for attr in task_attrs:
value = getattr(task, attr)
# by default only print fields that have non-empty value
if value:
self.outstream.write('\n{:11s}:\n'.format(attr))
try:
for val in value:
self.outstream.write(' - {}\n'.format(val))
except:
printer.pprint(getattr(task, attr))

return retcode

@staticmethod
def get_reasons(reasons):
Expand Down
6 changes: 3 additions & 3 deletions doit/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def flat_generator(gen, gen_doc=''):
if inspect.isgenerator(item):
item_doc = item.gi_code.co_consts[0]
for value, value_doc in flat_generator(item, item_doc):
yield value, value_doc
yield value, value_doc or gen_doc
else:
yield item, gen_doc

Expand Down Expand Up @@ -171,8 +171,8 @@ def _get_task_creators(namespace, command_names):
for name, ref in namespace.items():

# function is a task creator because of its name
if ((inspect.isfunction(ref) or inspect.ismethod(ref)) and
name.startswith(TASK_STRING)):
if name.startswith(TASK_STRING) and (
inspect.isfunction(ref) or inspect.ismethod(ref)):
# remove TASK_STRING prefix from name
task_name = name[prefix_len:]

Expand Down
24 changes: 16 additions & 8 deletions tests/test_cmd_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from doit.cmd_info import Info
from .conftest import CmdFactory


class TestCmdInfo(object):

def test_info(self, depfile):
Expand All @@ -15,8 +16,17 @@ def test_info(self, depfile):
cmd = CmdFactory(Info, outstream=output,
dep_file=depfile.name, task_list=[task])
cmd._execute(['t1'])
assert """name:'t1'""" in output.getvalue()
assert """'tests/data/dependency1'""" in output.getvalue()
assert """t1""" in output.getvalue()
assert """tests/data/dependency1""" in output.getvalue()

def test_info_unicode(self, depfile):
output = StringIO()
task = Task("t1", [], file_dep=['tests/data/dependency1'])
cmd = CmdFactory(Info, outstream=output,
dep_file=depfile.name, task_list=[task])
cmd._execute(['t1'])
assert """t1""" in output.getvalue()
assert """tests/data/dependency1""" in output.getvalue()

def test_invalid_command_args(self, depfile):
output = StringIO()
Expand All @@ -34,9 +44,9 @@ def test_execute_status_run(self, depfile, dependency1):
dep_file=depfile.name, task_list=[task],
backend='dbm')
return_val = cmd._execute(['t1'], show_execute_status=True)
assert """name:'t1'""" in output.getvalue()
assert """t1""" in output.getvalue()
assert return_val == 1 # indicates task is not up-to-date
assert "Task is not up-to-date" in output.getvalue()
assert "run" in output.getvalue()
assert """ - tests/data/dependency1""" in output.getvalue()

def test_execute_status_uptodate(self, depfile, dependency1):
Expand All @@ -47,10 +57,9 @@ def test_execute_status_uptodate(self, depfile, dependency1):
backend='dbm')
cmd.dep_manager.save_success(task)
return_val = cmd._execute(['t1'], show_execute_status=True)
assert """name:'t1'""" in output.getvalue()
assert """t1""" in output.getvalue()
assert return_val == 0 # indicates task is not up-to-date
assert "Task is up-to-date" in output.getvalue()

assert "up-to-date" in output.getvalue()

def test_get_reasons_str(self):
reasons = {
Expand All @@ -69,4 +78,3 @@ def test_get_reasons_str(self):
assert got[4] == ' * The following targets do not exist:'
assert got[5] == ' - f1'
assert got[6] == ' - f2'

0 comments on commit 8051136

Please sign in to comment.