Merge branch 'feature/0.2'

pull/15/head support/0.2
Andrew Williams 2015-12-12 14:24:25 +00:00
commit 420e06abfb
6 changed files with 65 additions and 112 deletions

View File

@ -1,6 +1,7 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2014 Adam Kramer Copyright (c) 2014 Adam Kramer
Copyright (c) 2015 Andrew Williams
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1 +0,0 @@
nextaction: python nextaction.py

View File

@ -4,7 +4,7 @@ NextAction
A more GTD-like workflow for Todoist. Uses the REST API to add and remove a `@next_action` label from tasks. A more GTD-like workflow for Todoist. Uses the REST API to add and remove a `@next_action` label from tasks.
This program looks at every list in your Todoist account. This program looks at every list in your Todoist account.
Any list that ends with `-` or `=` is treated specially, and processed by NextAction. Any list that ends with `_` or `.` is treated specially, and processed by NextAction.
Note that NextAction requires Todoist Premium to function properly, as labels are a premium feature. Note that NextAction requires Todoist Premium to function properly, as labels are a premium feature.
@ -19,36 +19,22 @@ Activating NextAction
Sequential list processing Sequential list processing
-------------------------- --------------------------
If a list ends with `-`, the top level of tasks will be treated as a priority queue and the most important will be labeled `@next_action`. If a list ends with `_`, the top level of tasks will be treated as a priority queue and the most important will be labeled `@next_action`.
Importance is determined by order in the list Importance is determined by order in the list
Parallel list processing Parallel list processing
------------------------ ------------------------
If a list name ends with `=`, the top level of tasks will be treated as parallel `@next_action`s. If a list name ends with `.`, the top level of tasks will be treated as parallel `@next_action`s.
The waterfall processing will be applied the same way as sequential lists - every parent task will be treated as sequential. This can be overridden by appending `=` to the name of the parent task. The waterfall processing will be applied the same way as sequential lists - every parent task will be treated as sequential. This can be overridden by appending `_` to the name of the parent task.
Executing NextAction Executing NextAction
==================== ====================
You can run NexAction from any system that supports Python, and also deploy to Heroku as a constant running service You can run NexAction from any system that supports Python.
Running NextAction Running NextAction
------------------ ------------------
NextAction will read your environment to retrieve your Todoist API key, so to run on a Linux/Mac OSX you can use the following commandline NextAction will read your environment to retrieve your Todoist API key, so to run on a Linux/Mac OSX you can use the following commandline
TODOIST_API_KEY="XYZ" python nextaction.py python nextaction.py -a <API Key>
Heroku Support
--------------
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
This package is ready to be pushed to a Heroku instance with minimal configuration values:
* ```TODOIST_API_KEY``` - Your Todoist API Key
* ```TODOIST_NEXT_ACTION_LABEL``` - The label to use in Todoist for next actions (defaults to next_action)
* ```TODOIST_SYNC_DELAY``` - The number of seconds to wait between syncs. (defaults to 5)
* ```TODOIST_INBOX_HANDLING``` - What method to use for the Inbox, sequence or parallel (defaults to parallel)
* ```TODODIST_PARALLEL_SUFFIX``` - What sequence of characters to use to identify parallel processed projects (defaults to =)
* ```TODODIST_SERIAL_SUFFIX``` - What sequence of characters to use to identify serial processed projects (defaults to -)

View File

@ -1,37 +0,0 @@
{
"name": "NextAction",
"description": "Todoist API application to provide a auto-populated next action label",
"repository": "https://github.com/nikdoof/NextAction",
"keywords": ["python"],
"env": {
"TODOIST_API_KEY": {
"description": "Your Todoist API Key",
"required": true
},
"TODOIST_NEXT_ACTION_LABEL": {
"description": "The Todoist label to use for next actions.",
"value": "next_action",
"required": false
},
"TODOIST_SYNC_DELAY": {
"description": "The number of seconds to wait between syncs.",
"value": "5",
"required": false
},
"TODOIST_INBOX_HANDLING": {
"description": "What method to use for the Inbox, sequence or parallel",
"value": "parallel",
"required": false
},
"TODODIST_PARALLEL_SUFFIX": {
"description": "What sequence of characters to use to identify parallel processed projects",
"value": "=",
"required": false
},
"TODODIST_SERIAL_SUFFIX": {
"description": "What sequence of characters to use to identify serial processed projects",
"value": "-",
"required": false
}
}
}

View File

@ -1,14 +1,15 @@
#!/usr/bin/env python #!/usr/bin/env python
import time
import logging import logging
import os
import sys
import argparse import argparse
from datetime import datetime
# noinspection PyPackageRequirements
from todoist.api import TodoistAPI from todoist.api import TodoistAPI
import time
import sys
from datetime import datetime
def get_subitems(items, parent_item=None): def get_subitems(items, parent_item=None):
"""Search a flat item list for child items""" """Search a flat item list for child items"""
@ -34,24 +35,20 @@ def get_subitems(items, parent_item=None):
def main(): def main():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('-a', '--api_key', help='Todoist API Key', parser.add_argument('-a', '--api_key', help='Todoist API Key')
default=os.environ.get('TODOIST_API_KEY', None)) parser.add_argument('-l', '--label', help='The next action label to use', default='next_action')
parser.add_argument('-l', '--label', help='The next action label to use', parser.add_argument('-d', '--delay', help='Specify the delay in seconds between syncs', default=5, type=int)
default=os.environ.get('TODOIST_NEXT_ACTION_LABEL', 'next_action'))
parser.add_argument('-d', '--delay', help='Specify the delay in seconds between syncs',
default=int(os.environ.get('TODOIST_SYNC_DELAY', '5')), type=int)
parser.add_argument('--debug', help='Enable debugging', action='store_true') parser.add_argument('--debug', help='Enable debugging', action='store_true')
parser.add_argument('--inbox', help='The method the Inbox project should be processed', parser.add_argument('--inbox', help='The method the Inbox project should be processed',
default=os.environ.get('TODOIST_INBOX_HANDLING', 'parallel'), default='parallel', choices=['parallel', 'serial'])
choices=['parallel', 'serial']) parser.add_argument('--parallel_suffix', default='.')
parser.add_argument('--parallel_suffix', default=os.environ.get('TODOIST_PARALLEL_SUFFIX', '=')) parser.add_argument('--serial_suffix', default='_')
parser.add_argument('--serial_suffix', default=os.environ.get('TODOIST_SERIAL_SUFFIX', '-'))
parser.add_argument('--hide_future', help='Hide future dated next actions until the specified number of days', parser.add_argument('--hide_future', help='Hide future dated next actions until the specified number of days',
default=int(os.environ.get('TODOIST_HIDE_FUTURE', '7')), type=int) default=7, type=int)
args = parser.parse_args() args = parser.parse_args()
# Set debug # Set debug
if args.debug or os.environ.get('TODOIST_DEBUG', None): if args.debug:
log_level = logging.DEBUG log_level = logging.DEBUG
else: else:
log_level = logging.INFO log_level = logging.INFO
@ -89,7 +86,11 @@ def main():
# Main loop # Main loop
while True: while True:
try:
api.sync(resource_types=['projects', 'labels', 'items']) api.sync(resource_types=['projects', 'labels', 'items'])
except Exception as e:
logging.exception('Error trying to sync with Todoist API: %s' % str(e))
else:
for project in api.projects.all(): for project in api.projects.all():
project_type = get_project_type(project) project_type = get_project_type(project)
if project_type: if project_type:

View File

@ -1,8 +1,8 @@
from distutils.core import setup from setuptools import setup
setup( setup(
name='NextAction', name='NextAction',
version='0.1', version='0.2',
py_modules=['nextaction'], py_modules=['nextaction'],
url='https://github.com/nikdoof/NextAction', url='https://github.com/nikdoof/NextAction',
license='MIT', license='MIT',
@ -10,8 +10,11 @@ setup(
author_email='andy@tensixtyone.com', author_email='andy@tensixtyone.com',
description='A more GTD-like workflow for Todoist. Uses the REST API to add and remove a @next_action label from tasks.', description='A more GTD-like workflow for Todoist. Uses the REST API to add and remove a @next_action label from tasks.',
entry_points={ entry_points={
"distutils.commands": [ "console_scripts": [
"nextaction = nextaction:main", "nextaction=nextaction:main",
], ],
} },
install_requires=[
'todoist-python',
]
) )