dv-flow-mgr 0.0.1.13730579777a1__tar.gz → 0.0.1.13755459426a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/pyproject.toml +1 -1
  3. dv_flow_mgr-0.0.1.13755459426a1/src/dv_flow/mgr/task_listener_log.py +50 -0
  4. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_runner.py +1 -0
  5. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  6. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +1 -0
  7. dv_flow_mgr-0.0.1.13755459426a1/tests/unit/test_markers.py +45 -0
  8. dv_flow_mgr-0.0.1.13730579777a1/src/dv_flow/mgr/task_listener_log.py +0 -27
  9. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/.github/workflows/ci.yml +0 -0
  10. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/.gitignore +0 -0
  11. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/.vscode/settings.json +0 -0
  12. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/LICENSE +0 -0
  13. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/README.md +0 -0
  14. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/KeyArchitecture.md +0 -0
  15. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/Makefile +0 -0
  16. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/Notes.md +0 -0
  17. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/Roadmap.md +0 -0
  18. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/RundirLayout.md +0 -0
  19. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/Stages.md +0 -0
  20. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/Steps.md +0 -0
  21. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/Tasks.md +0 -0
  22. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/TypesAndDefs.md +0 -0
  23. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/Usecases.md +0 -0
  24. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/conf.py +0 -0
  25. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/index.rst +0 -0
  26. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/intro.rst +0 -0
  27. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/quickstart.rst +0 -0
  28. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/docs/reference.rst +0 -0
  29. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/fwperiph_dma.pss +0 -0
  30. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/ivpm.yaml +0 -0
  31. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/setup.cfg +0 -0
  32. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/__init__.py +0 -0
  33. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/__main__.py +0 -0
  34. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/cmds/cmd_run.py +0 -0
  35. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/eval_jq.py +0 -0
  36. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/expr_eval.py +0 -0
  37. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/expr_parser.py +0 -0
  38. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/fileset.py +0 -0
  39. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/fragment_def.py +0 -0
  40. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/out +0 -0
  41. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/package.py +0 -0
  42. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/package_def.py +0 -0
  43. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  44. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/param.py +0 -0
  45. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/param_def.py +0 -0
  46. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/param_ref_eval.py +0 -0
  47. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/parsetab.py +0 -0
  48. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
  49. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/share/flow.json +0 -0
  50. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/std/exec.py +0 -0
  51. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/std/fileset.py +0 -0
  52. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  53. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/std/message.py +0 -0
  54. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/std/task_null.py +0 -0
  55. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task.py +0 -0
  56. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_ctor.py +0 -0
  57. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_data.py +0 -0
  58. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_def.py +0 -0
  59. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_exec_data.py +0 -0
  60. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_graph_builder.py +0 -0
  61. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_graph_runner.py +0 -0
  62. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_graph_runner_local.py +0 -0
  63. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_impl_data.py +0 -0
  64. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_memento.py +0 -0
  65. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_node.py +0 -0
  66. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_output.py +0 -0
  67. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/task_params_ctor.py +0 -0
  68. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/type.py +0 -0
  69. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/type_def.py +0 -0
  70. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow/mgr/util.py +0 -0
  71. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  72. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  73. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  74. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  75. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/examples/example1/example1.flow +0 -0
  76. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/system/test_depends.py +0 -0
  77. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/system/test_pkg_discovery.py +0 -0
  78. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/system/test_stdlib.py +0 -0
  79. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/__init__.py +0 -0
  80. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  81. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  82. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  83. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  84. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  85. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
  86. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  87. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  88. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  89. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  90. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  91. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  92. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  93. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_data_merge.py +0 -0
  94. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_expr_eval.py +0 -0
  95. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_expr_parser.py +0 -0
  96. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_fileset.py +0 -0
  97. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_imports.py +0 -0
  98. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_parse.py +0 -0
  99. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_pyclass.py +0 -0
  100. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_pytask_smoke.py +0 -0
  101. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_smoke copy.sav +0 -0
  102. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_smoke.py +0 -0
  103. {dv_flow_mgr-0.0.1.13730579777a1 → dv_flow_mgr-0.0.1.13755459426a1}/tests/unit/test_stdlib.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13730579777a1
3
+ Version: 0.0.1.13755459426a1
4
4
  Summary: DV Flow Manager is a build system for silicon design
5
5
  Author-email: Matthew Ballance <matt.ballance@gmail.com>
6
6
  License: Apache License
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "dv-flow-mgr"
8
- version = "0.0.1.13730579777a1"
8
+ version = "0.0.1.13755459426a1"
9
9
  dependencies = [
10
10
  'jq',
11
11
  'pydantic',
@@ -0,0 +1,50 @@
1
+ import dataclasses as dc
2
+ from rich.console import Console
3
+
4
+ @dc.dataclass
5
+ class TaskListenerLog(object):
6
+ console : Console = dc.field(default_factory=Console)
7
+ level : int = 0
8
+ quiet : bool = False
9
+
10
+ def event(self, task : 'Task', reason : 'Reason'):
11
+ if reason == 'enter':
12
+ self.level += 1
13
+ if not self.quiet:
14
+ self.console.print("[green]>[%d][/green] Task %s" % (self.level, task.name))
15
+ elif reason == 'leave':
16
+ if self.quiet:
17
+ if task.result.changed:
18
+ self.console.print("[green]Done:[/green] %s" % (task.name,))
19
+ else:
20
+ sev_pref_m = {
21
+ "info": "[blue]I[/blue]",
22
+ "warn": "[yellow]W[/yellow]",
23
+ "error": "[red]E[/red]",
24
+ }
25
+ for m in task.result.markers:
26
+ msg = " %s %s: %s" % (
27
+ sev_pref_m[m.severity],
28
+ task.name,
29
+ m.msg)
30
+
31
+ self.console.print(msg)
32
+
33
+ if m.loc is not None:
34
+ if m.loc.line != -1 and m.loc.pos != -1:
35
+ self.console.print(" %s:%d:%d" % (m.loc.path, m.loc.line, m.loc.pos))
36
+ elif m.loc.line != -1:
37
+ self.console.print(" %s:%d" % (m.loc.path, m.loc.line))
38
+ else:
39
+ self.console.print(" %s" % m.loc.path)
40
+
41
+ pass
42
+ if task.result.status == 0:
43
+ self.console.print("[green]<[%d][/green] Task %s" % (self.level, task.name))
44
+ else:
45
+ self.console.print("[red]<[%d][/red] Task %s" % (self.level, task.name))
46
+ self.level -= 1
47
+ else:
48
+ self.console.print("[red]-[/red] Task %s" % task.name)
49
+ pass
50
+
@@ -176,6 +176,7 @@ class SingleTaskRunner(TaskRunner):
176
176
  # print("Field: %s" % field.name)
177
177
 
178
178
  input = TaskDataInput(
179
+ name=task.name,
179
180
  changed=changed,
180
181
  srcdir=task.srcdir,
181
182
  rundir=self.rundir,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13730579777a1
3
+ Version: 0.0.1.13755459426a1
4
4
  Summary: DV Flow Manager is a build system for silicon design
5
5
  Author-email: Matthew Ballance <matt.ballance@gmail.com>
6
6
  License: Apache License
@@ -78,6 +78,7 @@ tests/unit/test_expr_eval.py
78
78
  tests/unit/test_expr_parser.py
79
79
  tests/unit/test_fileset.py
80
80
  tests/unit/test_imports.py
81
+ tests/unit/test_markers.py
81
82
  tests/unit/test_parse.py
82
83
  tests/unit/test_pyclass.py
83
84
  tests/unit/test_pytask_smoke.py
@@ -0,0 +1,45 @@
1
+ import asyncio
2
+ import pytest
3
+ from typing import List, Union
4
+ import dataclasses as dc
5
+ import pydantic.dataclasses as pdc
6
+ from pydantic import BaseModel
7
+ from dv_flow.mgr.param import Param, ParamT
8
+ from dv_flow.mgr.task import Task
9
+ from dv_flow.mgr.task_data import TaskDataResult, TaskMarker, TaskMarkerLoc
10
+ from dv_flow.mgr.task_node import task as t_decorator
11
+ from dv_flow.mgr.task_node import task
12
+ from dv_flow.mgr.task_runner import SingleTaskRunner, TaskSetRunner
13
+ from dv_flow.mgr.task_listener_log import TaskListenerLog
14
+
15
+ def test_smoke_1(tmpdir):
16
+
17
+ class Params(BaseModel):
18
+ p1 : str = None
19
+
20
+ called = False
21
+
22
+ @task(Params)
23
+ async def MyTask(runner, input):
24
+ nonlocal called
25
+ called = True
26
+ print("Hello from run")
27
+ return TaskDataResult(
28
+ status=1,
29
+ markers=[
30
+ TaskMarker(msg="testing", severity="info",
31
+ loc=TaskMarkerLoc(
32
+ path="file1",
33
+ line=1,
34
+ pos=1
35
+ ))
36
+ ]
37
+ )
38
+
39
+ task1 = MyTask("task1", srcdir="srcdir", p1="p1")
40
+ runner = TaskSetRunner("rundir")
41
+ runner.add_listener(TaskListenerLog().event)
42
+
43
+ result = asyncio.run(runner.run(task1))
44
+
45
+ assert called
@@ -1,27 +0,0 @@
1
- import dataclasses as dc
2
- from rich.console import Console
3
-
4
- @dc.dataclass
5
- class TaskListenerLog(object):
6
- console : Console = dc.field(default_factory=Console)
7
- level : int = 0
8
- quiet : bool = False
9
-
10
- def event(self, task : 'Task', reason : 'Reason'):
11
- if reason == 'enter':
12
- self.level += 1
13
- if not self.quiet:
14
- self.console.print("[green]>[%d][/green] Task %s" % (self.level, task.name))
15
- elif reason == 'leave':
16
- for m in task.result.markers:
17
- print(" %s" % m)
18
- if self.quiet:
19
- if task.result.changed:
20
- self.console.print("[green]Done:[/green] %s" % (task.name,))
21
- else:
22
- self.console.print("[green]<[%d][/green] Task %s" % (self.level, task.name))
23
- self.level -= 1
24
- else:
25
- self.console.print("[red]-[/red] Task %s" % task.name)
26
- pass
27
-