taskai-cli 1.2.1__tar.gz → 1.3.0__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.2.1 → taskai_cli-1.3.0}/PKG-INFO +1 -1
  2. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/pyproject.toml +1 -1
  3. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/cli.py +20 -0
  4. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/models.py +1 -0
  5. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/views.py +10 -3
  6. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/.github/workflows/publish-to-pypi.yml +0 -0
  7. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/.gitignore +0 -0
  8. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/DEVLOG.md +0 -0
  9. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/README.md +0 -0
  10. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/docs/index.md +0 -0
  11. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/mkdocs.yml +0 -0
  12. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/scripts/bump_version.py +0 -0
  13. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/config.py +0 -0
  14. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/help_menu.py +0 -0
  15. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/json_dir_database.py +0 -0
  16. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/services/ai.py +0 -0
  17. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/services/pomodoro.py +0 -0
  18. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/services/repair_database.py +0 -0
  19. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/services/user_setup.py +0 -0
  20. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/test/test_cli.py +0 -0
  21. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/test/test_execution.py +0 -0
  22. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/test/test_json_dir_database.py +0 -0
  23. {taskai_cli-1.2.1 → taskai_cli-1.3.0}/test/test_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskai-cli
3
- Version: 1.2.1
3
+ Version: 1.3.0
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.2.1"
3
+ version = "1.3.0"
4
4
  description = ""
5
5
  authors = [{name = "Alex Paskal", email = "alexcpaskal@gmail.com"}]
6
6
  readme = "README.md"
@@ -52,6 +52,12 @@ class Controller:
52
52
  return db.get_item(id_)
53
53
  return None
54
54
 
55
+ def _find_item_by_identifier(identifier: str|int) -> TodoItem:
56
+ if _is_int(identifier):
57
+ return db.get_item(identifier)
58
+ else:
59
+ return Controller._find_model_by_stringmatch("name", identifier)
60
+
55
61
  def _parse_item_kwargs(kwargs):
56
62
  for k, v in kwargs.copy().items():
57
63
  if v is None:
@@ -240,6 +246,15 @@ class Controller:
240
246
  db.update_item(parent.id, child_ids=new_child_ids)
241
247
  db.commit()
242
248
 
249
+ def add_link(parent_id: int|str, child_id: int|str):
250
+ parent: TodoItem = Controller._find_item_by_identifier(parent_id)
251
+ child: TodoItem = Controller._find_item_by_identifier(child_id)
252
+
253
+ if child.id not in parent.linked_ids:
254
+ parent.linked_ids.append(child_id)
255
+ db.update_item(parent.id, linked_ids=parent.linked_ids)
256
+ db.commit()
257
+
243
258
 
244
259
  # utilities
245
260
  def _parse_arg_string(arg_string: str) -> list[str]:
@@ -376,6 +391,11 @@ def execute_commands(*args, **kwargs) -> int:
376
391
  parent_identifier = args[1]
377
392
  item_name = args[2]
378
393
  Controller.create_item(item_name, parent_identifier, **kwargs)
394
+
395
+ case "link":
396
+ parent_identifier = args[1]
397
+ item_identifier = args[2]
398
+ Controller.add_link(parent_identifier, item_identifier)
379
399
 
380
400
  case "complete" | "done":
381
401
  match args[1]:
@@ -39,6 +39,7 @@ class TodoItem(Base):
39
39
  due_by: Optional[datetime] = None
40
40
  comment_ids: list[int] = Field(default_factory=list)
41
41
  dependency_ids: list[int] = Field(default_factory=list)
42
+ linked_ids: list[int] = Field(default_factory=list)
42
43
  child_ids: list[int] = Field(default_factory=list)
43
44
  priority: int = 0
44
45
  recurs_every: Optional[list[timedelta]] = None
@@ -1,5 +1,5 @@
1
1
  # local
2
- from taskai.json_dir_database import JsonDirectoryDatabase
2
+ from taskai.json_dir_database import JsonDirectoryDatabase, DatabaseError
3
3
  from taskai.models import TodoItem, Comment
4
4
  from taskai.config import config
5
5
 
@@ -66,20 +66,27 @@ def view_lists(
66
66
  display_string = _wrap_string(display_string, "[strike]", "[/strike]", condition=item.completed)
67
67
  return display_string
68
68
 
69
- def _print_item(item: TodoItem, level: int):
69
+ def _print_item(item: TodoItem, level: int, prefix=""):
70
70
  if not show_done and item.completed:
71
71
  return
72
72
 
73
73
  display_string = _render_display_string(item)
74
74
  indent = "\t" * level
75
- print(indent + display_string)
75
+ print(indent + prefix + display_string)
76
76
 
77
77
  def _recursive_print(item_id: int, level: int):
78
78
  item = db.get_item(item_id)
79
79
  _print_item(item, level)
80
+ for linked_id in item.linked_ids:
81
+ try:
82
+ linked_item = db.get_item(linked_id)
83
+ except DatabaseError:
84
+ continue
85
+ _print_item(linked_item, level+1, prefix="-->")
80
86
  for child_id in item.child_ids:
81
87
  _recursive_print(child_id, level+1)
82
88
 
89
+
83
90
  for root in roots:
84
91
  _recursive_print(root, 0)
85
92
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes