diff -Nru doit-0.12/debian/bzr-builder.manifest doit-0.12/debian/bzr-builder.manifest --- doit-0.12/debian/bzr-builder.manifest 2012-02-07 12:11:42.000000000 +0000 +++ doit-0.12/debian/bzr-builder.manifest 2012-03-15 18:36:09.000000000 +0000 @@ -1,3 +1,3 @@ -# bzr-builder format 0.3 deb-version {debupstream}-0ubuntu1~rev479 -lp:doit revid:schettino72-20120125225124-8p0jzfjxyxwc1b42 +# bzr-builder format 0.3 deb-version {debupstream}-0ubuntu1~rev481 +lp:doit revid:schettino72-20120315164706-cw6smkoailsxopeb nest debian lp:~javier.collado/doit/debian debian revid:javier.collado@canonical.com-20110420094754-6xj0yas483oamfdg diff -Nru doit-0.12/debian/changelog doit-0.12/debian/changelog --- doit-0.12/debian/changelog 2012-02-07 12:11:42.000000000 +0000 +++ doit-0.12/debian/changelog 2012-03-15 18:36:09.000000000 +0000 @@ -1,8 +1,8 @@ -doit (0.12-0ubuntu1~rev479~precise1) precise; urgency=low +doit (0.12-0ubuntu1~rev481~precise1) precise; urgency=low * Auto build. - -- Javier Collado Tue, 07 Feb 2012 12:11:42 +0000 + -- Javier Collado Thu, 15 Mar 2012 18:36:09 +0000 doit (0.12) UNRELEASED; urgency=low diff -Nru doit-0.12/doc/index.rst doit-0.12/doc/index.rst --- doit-0.12/doc/index.rst 2012-02-07 12:11:41.000000000 +0000 +++ doit-0.12/doc/index.rst 2012-03-15 18:36:08.000000000 +0000 @@ -72,6 +72,9 @@ I needed a sort of 'make' tool to glue things together and after trying out all kinds, doit ... has actually turned out to be beautiful. Its easy to add and manage tasks, even complex ones-- gluing things together with decorators and 'library' functions I've written to do certain similar things. - `Matthew `_ + Some time ago, I grew frustrated with Make and Ant and started porting my build files to every build tool I found (SCons, Waf, etc.). Each time, as soon as I stepped out of already available rules, I ran into some difficult to overcome stumbling blocks. Then I discovered this little gem of simplicity: doit. It's Python-based. It doesn't try to be smart, it does not try to be cool, it just works. If you are looking for a flexible little build tool for different languages and tasks, give it a chance. My build files weren't that big or complex, therefore I don't know how well it scales, and I wouldn't recommend it as a replacement for more complex build tools like Maven either. - `lelele `_ + + Quick Start ============ diff -Nru doit-0.12/doit/loader.py doit-0.12/doit/loader.py --- doit-0.12/doit/loader.py 2012-02-07 12:11:41.000000000 +0000 +++ doit-0.12/doit/loader.py 2012-03-15 18:36:08.000000000 +0000 @@ -23,6 +23,18 @@ return type(obj) is types.GeneratorType +def flat_generator(gen): + """return only values from generators + if any generator yields another generator it is recursivelly called + """ + for item in gen: + if isgenerator(item): + for x in flat_generator(item): + yield x + else: + yield item + + def get_module(dodo_file, cwd=None, seek_parent=False): """ @param dodo_file(str): path to file containing the tasks @@ -130,13 +142,15 @@ return {'task_list': task_list, 'config': doit_config} + def generate_tasks(name, gen_result, gen_doc=None): """Create tasks from a task generator result. @param name: (string) name of taskgen function @param gen_result: value returned by a task generator function + it can be a dict or generator (generating dicts) @param gen_doc: (string/None) docstring from the task generator function - @return: (tuple) task,list of subtasks + @return: (tuple) task, list of subtasks """ # task described as a dictionary if isinstance(gen_result, dict): @@ -156,14 +170,14 @@ if isgenerator(gen_result): group_task = Task(name, None, doc=gen_doc) tasks = [group_task] - # the generator return subtasks as dictionaries . - for task_dict in gen_result: + # the generator return subtasks as dictionaries + for task_dict in flat_generator(gen_result): # check valid input if not isinstance(task_dict, dict): - raise InvalidTask("Task %s must yield dictionaries"% name) + raise InvalidTask("Task '%s' must yield dictionaries"% name) if 'name' not in task_dict: - raise InvalidTask("Task %s must contain field name. %s"% + raise InvalidTask("Task '%s' must contain field name. %s"% (name,task_dict)) # name is task.subtask task_dict['name'] = "%s:%s"% (name, task_dict.get('name')) @@ -175,7 +189,7 @@ group_task.task_dep = [task.name for task in tasks[1:]] return tasks - raise InvalidTask("Task %s. Must return a dictionary. got %s" % + raise InvalidTask("Task '%s'. Must return a dictionary. got %s" % (name, type(gen_result))) diff -Nru doit-0.12/tests/test_loader.py doit-0.12/tests/test_loader.py --- doit-0.12/tests/test_loader.py 2012-02-07 12:11:41.000000000 +0000 +++ doit-0.12/tests/test_loader.py 2012-03-15 18:36:08.000000000 +0000 @@ -5,7 +5,7 @@ from doit.exceptions import InvalidDodoFile, InvalidCommand from doit.task import InvalidTask, Task from doit.loader import load_task_generators, generate_tasks, get_tasks -from doit.loader import isgenerator, get_module +from doit.loader import isgenerator, flat_generator, get_module class TestIsGenerator(object): @@ -22,15 +22,24 @@ assert not isgenerator(giveme()) +class TestFlatGenerator(object): + def test_nested(self): + def myg(items): + for x in items: + yield x + flat = flat_generator(myg([1, myg([2, myg([3, myg([4, myg([5])])])])])) + assert [1,2,3,4,5] == list(flat) + + class TestGenerateTasks(object): def testDict(self): - tasks = generate_tasks("dict",{'actions':['xpto 14']}) + tasks = generate_tasks("my_name", {'actions':['xpto 14']}) assert isinstance(tasks[0],Task) # name field is only for subtasks. def testInvalidNameField(self): - pytest.raises(InvalidTask, generate_tasks, "dict", + pytest.raises(InvalidTask, generate_tasks, "my_name", {'actions':['xpto 14'],'name':'bla bla'}) def testInvalidValue(self): @@ -47,6 +56,24 @@ assert not tasks[0].is_subtask assert tasks[1].is_subtask + + def testMultiLevelGenerator(self): + def f_xpto(base_name): + for i in range(3): + name = "%s-%d" % (base_name, i) + yield {'name':name, 'actions' :["xpto -%d"%i]} + def f_first_level(): + for i in range(2): + yield f_xpto(str(i)) + tasks = generate_tasks("xpto", f_first_level()) + assert isinstance(tasks[0], Task) + assert 7 == len(tasks) + assert not tasks[0].is_subtask + assert tasks[1].is_subtask + assert "xpto:0-0" == tasks[1].name + assert "xpto:1-2" == tasks[-1].name + + def testGeneratorDoesntReturnDict(self): def f_xpto(): for i in range(3): diff -Nru doit-0.12/TODO.txt doit-0.12/TODO.txt --- doit-0.12/TODO.txt 2012-02-07 12:11:41.000000000 +0000 +++ doit-0.12/TODO.txt 2012-03-15 18:36:08.000000000 +0000 @@ -16,6 +16,7 @@ . forget a dependency, not a task . option to make sub-task not part of a group . task name alias +. action to be executed on when ctrl-c is hit on auto mode needs volunteer