taskai-cli 1.2.0__tar.gz → 1.2.1__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 (25) hide show
  1. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/PKG-INFO +1 -1
  2. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/pyproject.toml +1 -1
  3. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/cli.py +5 -1
  4. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/models.py +7 -1
  5. taskai_cli-1.2.0/migrations/_001_removing_lists.py +0 -50
  6. taskai_cli-1.2.0/migrations/convert_title_to_name.py +0 -30
  7. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/.github/workflows/publish-to-pypi.yml +0 -0
  8. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/.gitignore +0 -0
  9. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/DEVLOG.md +0 -0
  10. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/README.md +0 -0
  11. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/docs/index.md +0 -0
  12. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/mkdocs.yml +0 -0
  13. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/scripts/bump_version.py +0 -0
  14. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/config.py +0 -0
  15. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/help_menu.py +0 -0
  16. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/json_dir_database.py +0 -0
  17. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/services/ai.py +0 -0
  18. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/services/pomodoro.py +0 -0
  19. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/services/repair_database.py +0 -0
  20. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/services/user_setup.py +0 -0
  21. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/taskai/views.py +0 -0
  22. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/test/test_cli.py +0 -0
  23. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/test/test_execution.py +0 -0
  24. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/test/test_json_dir_database.py +0 -0
  25. {taskai_cli-1.2.0 → taskai_cli-1.2.1}/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.0
3
+ Version: 1.2.1
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.0"
3
+ version = "1.2.1"
4
4
  description = ""
5
5
  authors = [{name = "Alex Paskal", email = "alexcpaskal@gmail.com"}]
6
6
  readme = "README.md"
@@ -406,7 +406,11 @@ def execute_commands(*args, **kwargs) -> int:
406
406
  # developer use
407
407
  case "db":
408
408
  import orjson as json
409
- print_json(json.dumps(db.read(args[1]).model_dump()).decode())
409
+ print_json(json.dumps(db.get_item(int(args[1])).model_dump()).decode())
410
+
411
+ case "status":
412
+ item_id, status_val = args[1:3]
413
+ Controller.update_item(item_id, status=status_val)
410
414
 
411
415
  case "exit" | "exit()" | "quit":
412
416
  return 0
@@ -4,7 +4,7 @@ from typing import Optional
4
4
  from datetime import datetime, timedelta
5
5
 
6
6
  # external
7
- from pydantic import Field, BaseModel
7
+ from pydantic import Field, BaseModel, field_validator
8
8
 
9
9
  class Base(BaseModel):
10
10
  pass
@@ -46,6 +46,12 @@ class TodoItem(Base):
46
46
  recur_keep_incomplete: bool = False
47
47
  status: str = ""
48
48
 
49
+ @field_validator("status", mode="before")
50
+ def coerce_status(cls, value):
51
+ if not isinstance(value, str):
52
+ return ""
53
+ return value
54
+
49
55
 
50
56
  class Comment(Base):
51
57
  content: str
@@ -1,50 +0,0 @@
1
- import argparse
2
- import orjson as json
3
- from taskai.models import TodoItem
4
-
5
- def migrate(data):
6
- if "TodoList" in data:
7
- for k, record in data["TodoList"].items():
8
-
9
- record["child_ids"] = record.pop("item_ids")
10
- TodoItem(**record)
11
- print(f"Converting {k} to Item")
12
- data["TodoItem"][k] = record
13
- data.pop("TodoList")
14
-
15
- for k, record in data["TodoItem"].items():
16
-
17
- if "title" in record:
18
- print(f"converting title->name for {k}")
19
- record["title"] = record["name"]
20
- record.pop("title")
21
-
22
- if "parent" in record:
23
- print(f"converting parent->parent_id for {k}")
24
- record["parent_id"] = record["parent"]
25
- record.pop("parent")
26
-
27
- if "child_ids" not in record:
28
- print(f"Adding Child IDs {k}")
29
- record["child_ids"] = []
30
-
31
- try:
32
- data["TodoItem"][k] = TodoItem(**record).model_dump()
33
- except:
34
- print("validation for {} failed".format(k))
35
- import sys
36
- sys.exit()
37
-
38
-
39
- arg_parser = argparse.ArgumentParser()
40
- arg_parser.add_argument("path", help="path to taskai root")
41
- args = arg_parser.parse_args()
42
-
43
- with open(args.path, "rb") as f:
44
- data = json.loads(f.read())
45
-
46
- migrate(data)
47
-
48
-
49
- with open(args.path, "wb") as f:
50
- f.write(json.dumps(data))
@@ -1,30 +0,0 @@
1
- import argparse
2
- import orjson as json
3
-
4
-
5
- def convert_name_to_name(path):
6
- with open(path, "rb") as f:
7
- data = json.loads(f.read())
8
-
9
- for k, record in data["TodoItem"].items():
10
-
11
- if "name" in record:
12
- print(f"migrating {k}")
13
- record["name"] = record["name"]
14
- record.pop("name")
15
- elif "name" in record:
16
- print(f"validated {k}")
17
- else:
18
- print(f"{k} is corrupted")
19
-
20
- with open(path, "wb") as f:
21
- f.write(json.dumps(data))
22
-
23
-
24
- arg_parser = argparse.ArgumentParser()
25
- arg_parser.add_argument("path", help="path to taskai root")
26
- args = arg_parser.parse_args()
27
-
28
-
29
- convert_name_to_name(args.path)
30
-
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