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.
Files changed (23) hide show
  1. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/PKG-INFO +1 -1
  2. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/pyproject.toml +1 -1
  3. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/cli.py +35 -4
  4. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/views.py +5 -1
  5. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/.github/workflows/publish-to-pypi.yml +0 -0
  6. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/.gitignore +0 -0
  7. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/DEVLOG.md +0 -0
  8. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/README.md +0 -0
  9. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/docs/index.md +0 -0
  10. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/mkdocs.yml +0 -0
  11. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/scripts/bump_version.py +0 -0
  12. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/config.py +0 -0
  13. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/help_menu.py +0 -0
  14. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/json_dir_database.py +0 -0
  15. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/models.py +0 -0
  16. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/services/ai.py +0 -0
  17. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/services/pomodoro.py +0 -0
  18. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/services/repair_database.py +0 -0
  19. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/taskai/services/user_setup.py +0 -0
  20. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/test/test_cli.py +0 -0
  21. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/test/test_execution.py +0 -0
  22. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/test/test_json_dir_database.py +0 -0
  23. {taskai_cli-1.3.0 → taskai_cli-1.4.2}/test/test_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskai-cli
3
- Version: 1.3.0
3
+ Version: 1.4.2
4
4
  Author-email: Alex Paskal <alexcpaskal@gmail.com>
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: google-genai>=2.8
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "taskai-cli"
3
- version = "1.3.0"
3
+ version = "1.4.2"
4
4
  description = ""
5
5
  authors = [{name = "Alex Paskal", email = "alexcpaskal@gmail.com"}]
6
6
  readme = "README.md"
@@ -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
- for item_id in db.get_item_ids():
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
- Controller.delete_completed()
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
- item_id, status_val = args[1:3]
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