microsoft-todo-cli 1.1.0__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 (48) hide show
  1. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/CHANGES.txt +3 -0
  2. {microsoft_todo_cli-1.1.0/microsoft_todo_cli.egg-info → microsoft_todo_cli-1.3.0}/PKG-INFO +2 -1
  3. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/README.md +1 -0
  4. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/docs/setup-api.md +3 -3
  5. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0/microsoft_todo_cli.egg-info}/PKG-INFO +2 -1
  6. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_cli_commands.py +16 -0
  7. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_cli_url_integration.py +1 -1
  8. microsoft_todo_cli-1.3.0/todocli/__init__.py +1 -0
  9. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/cli.py +12 -0
  10. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/graphapi/oauth.py +9 -1
  11. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/graphapi/wrapper.py +3 -0
  12. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/utils/update_checker.py +1 -1
  13. microsoft_todo_cli-1.1.0/todocli/__init__.py +0 -1
  14. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/LICENSE +0 -0
  15. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/MANIFEST.in +0 -0
  16. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/microsoft_todo_cli.egg-info/SOURCES.txt +0 -0
  17. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/microsoft_todo_cli.egg-info/dependency_links.txt +0 -0
  18. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/microsoft_todo_cli.egg-info/entry_points.txt +0 -0
  19. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/microsoft_todo_cli.egg-info/requires.txt +0 -0
  20. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/microsoft_todo_cli.egg-info/top_level.txt +0 -0
  21. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/setup.cfg +0 -0
  22. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/setup.py +0 -0
  23. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/__init__.py +0 -0
  24. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/run_tests.py +0 -0
  25. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_checklist_cli.py +0 -0
  26. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_checklist_item_model.py +0 -0
  27. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_checklist_wrapper.py +0 -0
  28. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_cli_output.py +0 -0
  29. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_datetime_parser.py +0 -0
  30. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_filters.py +0 -0
  31. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_json_output.py +0 -0
  32. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_lst_output.py +0 -0
  33. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_models.py +0 -0
  34. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_note_cli.py +0 -0
  35. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_note_wrapper.py +0 -0
  36. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_odata_escape.py +0 -0
  37. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_recurrence.py +0 -0
  38. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_update_command.py +0 -0
  39. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_utils.py +0 -0
  40. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/tests/test_wrapper.py +0 -0
  41. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/graphapi/__init__.py +0 -0
  42. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/models/__init__.py +0 -0
  43. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/models/checklistitem.py +0 -0
  44. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/models/todolist.py +0 -0
  45. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/models/todotask.py +0 -0
  46. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/utils/__init__.py +0 -0
  47. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/utils/datetime_util.py +0 -0
  48. {microsoft_todo_cli-1.1.0 → microsoft_todo_cli-1.3.0}/todocli/utils/recurrence_util.py +0 -0
@@ -1,3 +1,6 @@
1
+ v1.2.0, 2026-02-05
2
+ - Added -N/--note flag to 'new' command for creating tasks with notes
3
+
1
4
  v1.1.0, 2026-02-05
2
5
  - Added note support: note, show-note, clear-note commands
3
6
  - Added sn, cn aliases for show-note and clear-note
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microsoft-todo-cli
3
- Version: 1.1.0
3
+ Version: 1.3.0
4
4
  Summary: Fast, minimal command-line client for Microsoft To-Do
5
5
  Home-page: https://github.com/underwear/microsoft-todo-cli
6
6
  Author: underwear
@@ -116,6 +116,7 @@ todo new "Task" -I # Important
116
116
  todo new "Task" -R daily # Recurring
117
117
  todo new "Task" -R weekly:mon,fri # Recurring on specific days
118
118
  todo new "Task" -S "Step 1" -S "Step 2" # With subtasks
119
+ todo new "Task" -N "Note content" # With note
119
120
 
120
121
  # View single task
121
122
  todo show "Task" # Show task details
@@ -78,6 +78,7 @@ todo new "Task" -I # Important
78
78
  todo new "Task" -R daily # Recurring
79
79
  todo new "Task" -R weekly:mon,fri # Recurring on specific days
80
80
  todo new "Task" -S "Step 1" -S "Step 2" # With subtasks
81
+ todo new "Task" -N "Note content" # With note
81
82
 
82
83
  # View single task
83
84
  todo show "Task" # Show task details
@@ -37,10 +37,10 @@ After registration, you'll see the **Application (client) ID** on the overview p
37
37
  Create the config file:
38
38
 
39
39
  ```bash
40
- mkdir -p ~/.config/tod0
40
+ mkdir -p ~/.config/microsoft-todo-cli
41
41
  ```
42
42
 
43
- Add your credentials to `~/.config/tod0/keys.yml`:
43
+ Add your credentials to `~/.config/microsoft-todo-cli/keys.yml`:
44
44
 
45
45
  ```yaml
46
46
  client_id: 'your-application-client-id'
@@ -64,4 +64,4 @@ A browser window will open for Microsoft authentication. After logging in, you'r
64
64
  - Check that platform is set to `Web`
65
65
 
66
66
  **Token expired**
67
- - Delete `~/.config/tod0/token.pkl` and run any command to re-authenticate
67
+ - Delete `~/.config/microsoft-todo-cli/token.json` and run any command to re-authenticate
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microsoft-todo-cli
3
- Version: 1.1.0
3
+ Version: 1.3.0
4
4
  Summary: Fast, minimal command-line client for Microsoft To-Do
5
5
  Home-page: https://github.com/underwear/microsoft-todo-cli
6
6
  Author: underwear
@@ -116,6 +116,7 @@ todo new "Task" -I # Important
116
116
  todo new "Task" -R daily # Recurring
117
117
  todo new "Task" -R weekly:mon,fri # Recurring on specific days
118
118
  todo new "Task" -S "Step 1" -S "Step 2" # With subtasks
119
+ todo new "Task" -N "Note content" # With note
119
120
 
120
121
  # View single task
121
122
  todo show "Task" # Show task details
@@ -129,6 +129,22 @@ class TestCLIArgumentParsing(unittest.TestCase):
129
129
  args = self.parser.parse_args(["new", "buy milk"])
130
130
  self.assertEqual(args.step, [])
131
131
 
132
+ def test_new_command_with_note_flag(self):
133
+ """Test 'new' command with -N flag"""
134
+ args = self.parser.parse_args(["new", "-N", "Remember to check prices", "buy milk"])
135
+ self.assertEqual(args.task_name, "buy milk")
136
+ self.assertEqual(args.note, "Remember to check prices")
137
+
138
+ def test_new_command_with_note_long_flag(self):
139
+ """Test 'new' command with --note flag"""
140
+ args = self.parser.parse_args(["new", "--note", "My note", "buy milk"])
141
+ self.assertEqual(args.note, "My note")
142
+
143
+ def test_new_command_without_note(self):
144
+ """Test 'new' command defaults note to None"""
145
+ args = self.parser.parse_args(["new", "buy milk"])
146
+ self.assertIsNone(args.note)
147
+
132
148
  def test_new_command_with_all_flags(self):
133
149
  """Test 'new' command with all flags"""
134
150
  args = self.parser.parse_args(
@@ -4,7 +4,7 @@ Real integration test for URL support in task names.
4
4
  This test actually creates tasks in Microsoft To-Do and verifies they exist.
5
5
 
6
6
  Prerequisites:
7
- - Valid API credentials configured in ~/.config/tod0/keys.yml
7
+ - Valid API credentials configured in ~/.config/microsoft-todo-cli/keys.yml
8
8
  - Network connection
9
9
 
10
10
  Note: This test creates a 'test-list' and adds tasks to it.
@@ -0,0 +1 @@
1
+ __version__ = "1.3.0"
@@ -152,6 +152,7 @@ def new(args):
152
152
  due_datetime = parse_datetime(due_date_time_str)
153
153
 
154
154
  recurrence = parse_recurrence(args.recurrence)
155
+ note_content = getattr(args, "note", None)
155
156
 
156
157
  task_id = wrapper.create_task(
157
158
  name,
@@ -160,6 +161,7 @@ def new(args):
160
161
  due_datetime=due_datetime,
161
162
  important=args.important,
162
163
  recurrence=recurrence,
164
+ note=note_content,
163
165
  )
164
166
 
165
167
  steps = getattr(args, "step", []) or []
@@ -175,6 +177,8 @@ def new(args):
175
177
  msg = f"Created task '{name}' in '{task_list}'"
176
178
  if steps:
177
179
  msg += f" with {len(steps)} step(s)"
180
+ if note_content:
181
+ msg += " with note"
178
182
 
179
183
  result = {
180
184
  "action": "created",
@@ -185,6 +189,8 @@ def new(args):
185
189
  }
186
190
  if step_ids:
187
191
  result["step_ids"] = step_ids
192
+ if note_content:
193
+ result["note"] = note_content
188
194
 
189
195
  _output_result(args, result)
190
196
 
@@ -1200,6 +1206,12 @@ def setup_parser():
1200
1206
  default=[],
1201
1207
  help="Add a step (checklist item); can be repeated",
1202
1208
  )
1209
+ subparser.add_argument(
1210
+ "-N",
1211
+ "--note",
1212
+ help="Add a note to the task",
1213
+ metavar="TEXT",
1214
+ )
1203
1215
  _add_list_flag(subparser)
1204
1216
  _add_json_flag(subparser)
1205
1217
  subparser.set_defaults(func=new)
@@ -29,7 +29,15 @@ authorize_url = "{0}{1}".format(settings["authority"], settings["authorize_endpo
29
29
  token_url = "{0}{1}".format(settings["authority"], settings["token_endpoint"])
30
30
 
31
31
  # User settings location
32
- config_dir = "{}/.config/tod0".format(os.path.expanduser("~"))
32
+ config_dir = os.path.join(os.path.expanduser("~"), ".config", "microsoft-todo-cli")
33
+
34
+ # Migrate from old config directory
35
+ old_config_dir = os.path.join(os.path.expanduser("~"), ".config", "tod0")
36
+ if os.path.isdir(old_config_dir) and not os.path.isdir(config_dir):
37
+ import shutil
38
+
39
+ shutil.copytree(old_config_dir, config_dir)
40
+
33
41
  if not os.path.isdir(config_dir):
34
42
  os.makedirs(config_dir)
35
43
 
@@ -172,6 +172,7 @@ def create_task(
172
172
  due_datetime: datetime | None = None,
173
173
  important: bool = False,
174
174
  recurrence: dict | None = None,
175
+ note: str | None = None,
175
176
  ):
176
177
  _require_list(list_name, list_id)
177
178
 
@@ -191,6 +192,8 @@ def create_task(
191
192
  "importance": TaskImportance.HIGH if important else TaskImportance.NORMAL,
192
193
  "recurrence": recurrence,
193
194
  }
195
+ if note:
196
+ request_body["body"] = {"content": note, "contentType": "text"}
194
197
  session = get_oauth_session()
195
198
  response = session.post(endpoint, json=request_body)
196
199
  if response.ok:
@@ -10,7 +10,7 @@ PYPI_PACKAGE = "microsoft-todo-cli"
10
10
 
11
11
  def check():
12
12
  """Check for updates once per day, silently fail on errors."""
13
- config_dir = "{}/.config/tod0".format(os.path.expanduser("~"))
13
+ config_dir = os.path.join(os.path.expanduser("~"), ".config", "microsoft-todo-cli")
14
14
  if not os.path.isdir(config_dir):
15
15
  os.makedirs(config_dir)
16
16
 
@@ -1 +0,0 @@
1
- __version__ = "1.1.0"