pimutils / todoman

✅ A simple, standards-based, cli todo (aka: task) manager.
https://todoman.readthedocs.io
ISC License
482 stars 76 forks source link

Add experimental support for JSON input. #518

Open skowalak opened 1 year ago

skowalak commented 1 year ago

Only supports reading JSON input from stdin for the new subcommand.

Adds a new Parsers class which can implement differing input methods.

skowalak commented 1 year ago

Hi @WhyNotHugo, I have added some experimental code to implement JSON input from stdin for the todoman new command, to show you the direction I am heading.

Currently I am working on having click stop the validation callbacks on the todo_properties arguments after detecting read_json, but my experience with click is very limited. If you have some ideas on how to do that without big changes to the cli, a small hint would be great! It would also be possible to move the functionality to an entirely new subcommand (e.g. todoman new-json).

skowalak commented 1 year ago

Thank you for your review! I will implement your suggestions and work on the rest of the functionality.

skowalak commented 1 year ago

After some hours researching how to work with Click I believe it would be far easier and less complicated to add a new command or even a new group for working with json input. The current interface is built with command-line-options grouped in reuseable functions returning a decorator. Unfortunately it is impossible to suspend the validation callbacks on these options when the --read-json argument is passed, so I am proposing the following:

Instead of todo --porcelain new --read-json create the new command as todo new-json and analoguous for the edit/update command. Any thoughts?

WhyNotHugo commented 1 year ago

After thinking about this a bunch of times, I think we can have a new todo import command. Unlike new, import doesn't use @_todo_property_options, doesn't prompt for anything interactively, and doesn't show a UI.

This feature can exist as todo import --json FILE, where FILE can be - to read from stdin.

If --porcelain is provided, we output the todo as JSON, otherwise we print the regular version (e.g.: there's no special behaviour when it comes to output).

Perhaps todo import --ics can be a thing in future, but honestly the main reason for a separate command is the limitations that you mentioned above regarding the decorators in todo new.

skowalak commented 1 year ago

After thinking about this a bunch of times, I think we can have a new todo import command. Unlike new, import doesn't use @_todo_property_options, doesn't prompt for anything interactively, and doesn't show a UI.

That seems like a good idea to me. The way validation is implemented using Click callbacks, it is very hard to make changes to the UI without breaking existing functionality. A separate json mode for scripted interaction would be great.

This feature can exist as todo import --json FILE, where FILE can be - to read from stdin.

If --porcelain is provided, we output the todo as JSON, otherwise we print the regular version (e.g.: there's no special behaviour when it comes to output).

I will have a look at this 🙂