summaryrefslogtreecommitdiff
path: root/calendar-cli.py
diff options
context:
space:
mode:
Diffstat (limited to 'calendar-cli.py')
-rwxr-xr-xcalendar-cli.py116
1 files changed, 80 insertions, 36 deletions
diff --git a/calendar-cli.py b/calendar-cli.py
index 90727d7..f75bce1 100755
--- a/calendar-cli.py
+++ b/calendar-cli.py
@@ -11,8 +11,11 @@ from icalendar import Calendar,Event
from caldavclientlibrary.client.account import CalDAVAccount
from caldavclientlibrary.protocol.url import URL
import uuid
+import json
+import os
+import logging
-__version__ = "0.02"
+__version__ = "0.03"
__author__ = "Tobias Brox"
__author_short__ = "tobixen"
__copyright__ = "Copyright 2013, Tobias Brox"
@@ -33,7 +36,7 @@ def caldav_connect(args):
return CalDAVAccount(splits.netloc, ssl=ssl, user=args.caldav_user, pswd=args.caldav_pass, root=(splits.path or '/'), principal=None, logging=args.debug_logging)
-def calendar_add(args):
+def calendar_add(caldav_conn, args):
if (not args.calendar_url):
## args.calendar_url must be given ... :/
niy()
@@ -61,37 +64,78 @@ def calendar_add(args):
elif args.caldav_url:
caldav_conn.session.writeData(URL(args.calendar_url+str(uuid.uuid1())+'.ical'), cal.to_ical(), 'text/calendar', method='PUT')
-parser = argparse.ArgumentParser()
-
-## Global options
-parser.add_argument("--icalendar", help="Do not connect to CalDAV server, but read/write icalendar format from stdin/stdout", action="store_true")
-parser.add_argument("--timezone", help="Timezone to use")
-parser.add_argument('--language', help="language used", default="EN")
-parser.add_argument("--caldav-url", help="Full URL to the caldav server", metavar="URL")
-parser.add_argument("--caldav-user", help="username to log into the caldav server", metavar="USER")
-parser.add_argument("--caldav-pass", help="password to log into the caldav server", metavar="PASS")
-parser.add_argument("--debug-logging", help="turn on debug logging", action="store_true")
-
-## TODO: check sys.argv[0] to find command
-subparsers = parser.add_subparsers(title='command')
-
-calendar_parser = subparsers.add_parser('calendar')
-calendar_parser.add_argument("--calendar-url", help="URL for calendar to be used")
-calendar_subparsers = calendar_parser.add_subparsers(title='subcommand')
-calendar_add_parser = calendar_subparsers.add_parser('add')
-calendar_add_parser.add_argument('event_time', help="Timestamp and duration of the event. See the documentation for event_time specifications")
-calendar_add_parser.add_argument('description', nargs='+')
-calendar_add_parser.set_defaults(func=calendar_add)
-
-calendar_agenda_parser = calendar_subparsers.add_parser('agenda')
-calendar_agenda_parser.set_defaults(func=niy)
-todo_parser = subparsers.add_parser('todo')
-todo_parser.set_defaults(func=niy)
-args = parser.parse_args()
-
-if not args.icalendar:
- caldav_conn = caldav_connect(args)
-
-ret = args.func(args)
-
-
+def main():
+ ## This boilerplate pattern is from
+ ## http://stackoverflow.com/questions/3609852
+ ## We want defaults for the command line options to be fetched from the config file
+
+ # Parse any conf_file specification
+ # We make this parser with add_help=False so that
+ # it doesn't parse -h and print help.
+ conf_parser = argparse.ArgumentParser(
+ description=__doc__, # printed with -h/--help
+ # Don't mess with format of description
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ # Turn off help, so we print all options in response to -h
+ add_help=False
+ )
+ conf_parser.add_argument("--config-file",
+ help="Specify config file", metavar="FILE", default=os.getenv('XDG_CONFIG_HOME', os.getenv('HOME', '~') + '/.config')+'/calendar.conf')
+ conf_parser.add_argument("--config-section",
+ help="Specify config section; allows several caldav servers to be configured in the same config file", default='default')
+ args, remaining_argv = conf_parser.parse_known_args()
+
+ config = {}
+ try:
+ with open(args.config_file) as config_file:
+ config = json.load(config_file)
+ except IOError:
+ ## File not found
+ logging.info("no config file found")
+ except ValueError:
+ logging.error("error in config file", exc_info=True)
+
+ defaults = config.get('default', {})
+
+ # Parse rest of arguments
+ # Don't suppress add_help here so it will handle -h
+ parser = argparse.ArgumentParser(
+ # Inherit options from config_parser
+ parents=[conf_parser]
+ )
+ parser.set_defaults(**defaults)
+
+ ## Global options
+ parser.add_argument("--icalendar", help="Do not connect to CalDAV server, but read/write icalendar format from stdin/stdout", action="store_true")
+ parser.add_argument("--timezone", help="Timezone to use")
+ parser.add_argument('--language', help="language used", default="EN")
+ parser.add_argument("--caldav-url", help="Full URL to the caldav server", metavar="URL")
+ parser.add_argument("--caldav-user", help="username to log into the caldav server", metavar="USER")
+ parser.add_argument("--caldav-pass", help="password to log into the caldav server", metavar="PASS")
+ parser.add_argument("--debug-logging", help="turn on debug logging", action="store_true")
+
+ ## TODO: check sys.argv[0] to find command
+ ## TODO: set up logging
+ subparsers = parser.add_subparsers(title='command')
+
+ calendar_parser = subparsers.add_parser('calendar')
+ calendar_parser.add_argument("--calendar-url", help="URL for calendar to be used")
+ calendar_subparsers = calendar_parser.add_subparsers(title='subcommand')
+ calendar_add_parser = calendar_subparsers.add_parser('add')
+ calendar_add_parser.add_argument('event_time', help="Timestamp and duration of the event. See the documentation for event_time specifications")
+ calendar_add_parser.add_argument('description', nargs='+')
+ calendar_add_parser.set_defaults(func=calendar_add)
+
+ calendar_agenda_parser = calendar_subparsers.add_parser('agenda')
+ calendar_agenda_parser.set_defaults(func=niy)
+ todo_parser = subparsers.add_parser('todo')
+ todo_parser.set_defaults(func=niy)
+ args = parser.parse_args(remaining_argv)
+
+ if not args.icalendar:
+ caldav_conn = caldav_connect(args)
+
+ ret = args.func(caldav_conn, args)
+
+if __name__ == '__main__':
+ main()