taskai-cli 1.3.0__tar.gz → 1.4.2__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.
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/PKG-INFO +1 -1
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/pyproject.toml +1 -1
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/cli.py +35 -4
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/views.py +5 -1
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/.github/workflows/publish-to-pypi.yml +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/.gitignore +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/DEVLOG.md +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/README.md +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/docs/index.md +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/mkdocs.yml +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/scripts/bump_version.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/config.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/help_menu.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/json_dir_database.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/models.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/services/ai.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/services/pomodoro.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/services/repair_database.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/services/user_setup.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/test/test_cli.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/test/test_execution.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/test/test_json_dir_database.py +0 -0
- {taskai_cli-1.3.0 → taskai_cli-1.4.2}/test/test_view.py +0 -0
|
@@ -58,6 +58,19 @@ class Controller:
|
|
|
58
58
|
else:
|
|
59
59
|
return Controller._find_model_by_stringmatch("name", identifier)
|
|
60
60
|
|
|
61
|
+
def _flatten_item_descendants(item: TodoItem, existing=None) -> list[int]:
|
|
62
|
+
"""DFS through children"""
|
|
63
|
+
if existing is None:
|
|
64
|
+
existing = []
|
|
65
|
+
|
|
66
|
+
existing.append(item.id)
|
|
67
|
+
for child_id in item.child_ids:
|
|
68
|
+
child = db.get_item(child_id)
|
|
69
|
+
child_descendants = Controller._flatten_item_descendants(child, existing=existing)
|
|
70
|
+
|
|
71
|
+
return existing
|
|
72
|
+
|
|
73
|
+
|
|
61
74
|
def _parse_item_kwargs(kwargs):
|
|
62
75
|
for k, v in kwargs.copy().items():
|
|
63
76
|
if v is None:
|
|
@@ -144,8 +157,16 @@ class Controller:
|
|
|
144
157
|
else:
|
|
145
158
|
Controller.throw_error("Cannot find list by name")
|
|
146
159
|
|
|
147
|
-
def delete_completed():
|
|
148
|
-
|
|
160
|
+
def delete_completed(parent_identifier=None):
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
if parent_identifier is None:
|
|
164
|
+
ids_to_check = db.get_item_ids()
|
|
165
|
+
else:
|
|
166
|
+
parent = Controller._find_item_by_identifier(parent_identifier)
|
|
167
|
+
ids_to_check = Controller._flatten_item_descendants(parent)
|
|
168
|
+
|
|
169
|
+
for item_id in ids_to_check:
|
|
149
170
|
try:
|
|
150
171
|
item: TodoItem = db.get_item(item_id)
|
|
151
172
|
except:
|
|
@@ -409,10 +430,17 @@ def execute_commands(*args, **kwargs) -> int:
|
|
|
409
430
|
Controller.repair_service()
|
|
410
431
|
|
|
411
432
|
case "clear":
|
|
412
|
-
|
|
433
|
+
if len(args) > 1:
|
|
434
|
+
parent_identifier = args[1]
|
|
435
|
+
else:
|
|
436
|
+
parent_identifier = None
|
|
437
|
+
Controller.delete_completed(parent_identifier=parent_identifier)
|
|
413
438
|
|
|
414
439
|
case "move":
|
|
415
440
|
Controller.move_item(args[1], args[2])
|
|
441
|
+
|
|
442
|
+
case "rename":
|
|
443
|
+
Controller.update_item(args[1], name=args[2])
|
|
416
444
|
|
|
417
445
|
case "depend":
|
|
418
446
|
src_id, dst_id = args[1:3]
|
|
@@ -429,7 +457,10 @@ def execute_commands(*args, **kwargs) -> int:
|
|
|
429
457
|
print_json(json.dumps(db.get_item(int(args[1])).model_dump()).decode())
|
|
430
458
|
|
|
431
459
|
case "status":
|
|
432
|
-
|
|
460
|
+
if len(args) < 3:
|
|
461
|
+
item_id, status_val = args[1], ""
|
|
462
|
+
else:
|
|
463
|
+
item_id, status_val = args[1:3]
|
|
433
464
|
Controller.update_item(item_id, status=status_val)
|
|
434
465
|
|
|
435
466
|
case "exit" | "exit()" | "quit":
|
|
@@ -39,6 +39,7 @@ def view_lists(
|
|
|
39
39
|
db: JsonDirectoryDatabase,
|
|
40
40
|
roots: list[int],
|
|
41
41
|
show_done=True,
|
|
42
|
+
max_level=1000,
|
|
42
43
|
display_str: str = "id name status",
|
|
43
44
|
display_colors: str = None
|
|
44
45
|
):
|
|
@@ -75,6 +76,8 @@ def view_lists(
|
|
|
75
76
|
print(indent + prefix + display_string)
|
|
76
77
|
|
|
77
78
|
def _recursive_print(item_id: int, level: int):
|
|
79
|
+
if level > max_level:
|
|
80
|
+
return
|
|
78
81
|
item = db.get_item(item_id)
|
|
79
82
|
_print_item(item, level)
|
|
80
83
|
for linked_id in item.linked_ids:
|
|
@@ -119,9 +122,10 @@ def view_item(
|
|
|
119
122
|
comment: Comment = db.get_comment(comment_id)
|
|
120
123
|
console.print(f"{comment.created_on.strftime("%Y-%m-%d %H:%M:%S")} - {comment.content}")
|
|
121
124
|
|
|
122
|
-
if item.child_ids:
|
|
125
|
+
if item.child_ids or item.linked_ids:
|
|
123
126
|
console.print("\n[bold green]\nSubtasks:[/bold green]")
|
|
124
127
|
view_lists(db, item.child_ids, show_done=show_done)
|
|
128
|
+
view_lists(db, item.linked_ids, show_done=show_done, max_level=1, prefix="-->")
|
|
125
129
|
|
|
126
130
|
def view_items(
|
|
127
131
|
db: JsonDirectoryDatabase,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|