Skip to content

Commit 6741628

Browse files
added option to filter by project/area/tag, added command to show todos, cleanup
1 parent bca70cc commit 6741628

File tree

1 file changed

+46
-27
lines changed

1 file changed

+46
-27
lines changed

things_cli/cli.py

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from things_cli import __version__
2222

2323

24-
class ThingsCLI:
24+
class ThingsCLI: # pylint: disable=R0902
2525
"""A simple Python 3 CLI to read your Things app data."""
2626

2727
print_json = False
@@ -30,6 +30,9 @@ class ThingsCLI:
3030
# anonymize = False
3131
database = None
3232
recursive = False
33+
filter_project = None
34+
filter_area = None
35+
filter_tag = None
3336

3437
def __init__(self, database=None):
3538
self.database = database
@@ -153,6 +156,7 @@ def get_parser(cls):
153156
subparsers.add_parser("completed", help="Shows completed tasks")
154157
subparsers.add_parser("canceled", help="Shows canceled tasks")
155158
subparsers.add_parser("trash", help="Shows trashed tasks")
159+
subparsers.add_parser("todos", help="Shows all todos")
156160
subparsers.add_parser("all", help="Shows all tasks")
157161
subparsers.add_parser("areas", help="Shows all areas")
158162
subparsers.add_parser("projects", help="Shows all projects")
@@ -216,6 +220,16 @@ def get_parser(cls):
216220
# action="store_true", default=False,
217221
# help="anonymize output", dest="anonymize")
218222

223+
parser.add_argument(
224+
"-p", "--filter-project", dest="filter_project", help="Filter by project"
225+
)
226+
parser.add_argument(
227+
"-a", "--filter-area", dest="filter_area", help="Filter by area"
228+
)
229+
parser.add_argument(
230+
"-t", "--filtertag", dest="filter_tag", help="Filter by tag"
231+
)
232+
219233
parser.add_argument(
220234
"-o",
221235
"--opml",
@@ -267,6 +281,16 @@ def get_parser(cls):
267281

268282
return parser
269283

284+
def defaults(self):
285+
"""Some default options for the new API."""
286+
return dict(
287+
project=self.filter_project,
288+
area=self.filter_area,
289+
tag=self.filter_tag,
290+
include_items=self.recursive,
291+
filepath=self.database,
292+
)
293+
270294
def main(self, args=None):
271295
""" Main entry point of the app """
272296

@@ -278,29 +302,30 @@ def main(self, args=None):
278302
self.print_csv = args.csv
279303
self.print_opml = args.opml
280304
self.database = args.database or self.database
305+
self.filter_project = args.filter_project or None
306+
self.filter_area = args.filter_area or None
307+
self.filter_tag = args.filter_tag or None
281308
self.recursive = args.recursive
282309
# self.anonymize = args.anonymize
283310
# self.things3.anonymize = self.anonymize ## not implemented
311+
defaults = self.defaults()
312+
313+
remove_filter = ["all", "areas", "tags"]
314+
if command in remove_filter:
315+
defaults.pop("area")
316+
defaults.pop("project")
317+
defaults.pop("tag")
284318

285319
if command == "all":
286-
inbox = api.inbox(filepath=self.database, include_items=self.recursive)
287-
today = api.today(filepath=self.database, include_items=self.recursive)
288-
upcoming = api.upcoming(
289-
filepath=self.database, include_items=self.recursive
290-
)
291-
anytime = api.anytime(
292-
filepath=self.database, include_items=self.recursive
293-
)
294-
someday = api.someday(
295-
filepath=self.database, include_items=self.recursive
296-
)
297-
logbook = api.logbook(
298-
filepath=self.database, include_items=self.recursive
299-
)
300-
no_area = api.projects(
301-
area=False, filepath=self.database, include_items=self.recursive
302-
)
303-
areas = api.areas(filepath=self.database, include_items=self.recursive)
320+
inbox = api.inbox(**defaults)
321+
today = api.today(**defaults)
322+
upcoming = api.upcoming(**defaults)
323+
anytime = api.anytime(**defaults)
324+
someday = api.someday(**defaults)
325+
logbook = api.logbook(**defaults)
326+
327+
no_area = api.projects(**defaults)
328+
areas = api.areas(**defaults)
304329
structure = [
305330
{"title": "Inbox", "items": inbox},
306331
{"title": "Today", "items": today},
@@ -313,9 +338,7 @@ def main(self, args=None):
313338
]
314339
self.print_tasks(structure)
315340
elif command == "upcoming":
316-
result = getattr(api, command)(
317-
filepath=self.database, include_items=self.recursive
318-
)
341+
result = getattr(api, command)(**defaults)
319342
result.sort(key=lambda task: task["start_date"], reverse=False)
320343
self.print_tasks(result)
321344
elif command == "search":
@@ -329,11 +352,7 @@ def main(self, args=None):
329352
elif command == "feedback": # pragma: no cover
330353
webbrowser.open("https://github.com/thingsapi/things-cli/issues")
331354
elif command in dir(api):
332-
self.print_tasks(
333-
getattr(api, command)(
334-
filepath=self.database, include_items=self.recursive
335-
)
336-
)
355+
self.print_tasks(getattr(api, command)(**defaults))
337356
else: # pragma: no cover
338357
ThingsCLI.print_unimplemented(command)
339358
sys.exit(3)

0 commit comments

Comments
 (0)