-
Notifications
You must be signed in to change notification settings - Fork 1
/
hashcal.py
134 lines (110 loc) · 3.36 KB
/
hashcal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/python
"""Usage: hashcal.py [options] arguments
Options:
-h --help show this help message and exit
-v --verbose print status messages
-q --quiet print only success or failure
--version print the current version
-a --add add an item to the list
-s --show show all items in the list
-f --file=<file> file to store the calendar database in. [default: ~/.hashcal/cal.dat]
"""
from docopt import docopt
import dateparser
import tokenize
import pickle
import os
import vobject
def file_check(fn):
def wrap(self, file_name, *args):
# create directory if it doesn't exist
directory = file_name[:file_name.rfind("/")]
if not os.path.exists(directory):
os.makedirs(directory)
# create file if it doesn't exist
if not os.path.exists(file_name):
file(file_name, "w").close()
fn(self, file_name, *args)
return wrap
def write_ics(filename, start, end, description):
ical = vobject.iCalendar()
ical.add('vevent')
event = ical.vevent
event.add('dtstart').value = start
event.add('dtend').value = end
event.add('summary').value = description
event.add('prodid').value = 'hashcal'
file = open(filename, 'w')
file.write( ical.serialize() )
file.close()
class HashCal(object):
def __init__(self, source_file=None):
"""Create HashCal. If file is given, load events from it"""
if source_file is not None:
self.load_from_file(source_file)
else:
self.events = []
def split_hashtags(self, args):
"""Given a set of args, will return:
An array of all the hashtagged args with the hashtags stripped,
and a word with the description"""
tags = []
description = ""
for element in args:
for token in element.split(" "):
if token[0] == '#':
tags.append(token[1:])
else:
if len(description)>0: description += " "
description += token
return tags, description
def add_item(self, options, tags, description):
"""Adds an item to event list"""
print tags, description
start,end = dateparser.parse_tags(tags)
print start,end
self.events.append( { 'start': start, 'end': end, 'text': description })
write_ics('test.ics', start, end, description)
@file_check
def load_from_file(self, file_name):
"""Loads all the events from given file"""
f = file(file_name, "rb")
# Make sure file isn't empty when loading the
# pickle, or it will give EOFERROR
if os.path.getsize(file_name) > 0:
self.events = pickle.load(f)
else:
self.events = []
f.close()
@file_check
def save_to_file(self, file_name):
"""Saves Self.events to given file,
making the directories for the file if needed"""
f = file(file_name, "wb")
pickle.dump(self.events, f)
f.close()
def print_items(self):
"""Prints all the items"""
print self.events
def main(options, args):
"""Executes depending on given options"""
has_done_something = False
calendar = HashCal(options.file)
if options.verbose:
print args
print options
has_done_something = True
if options.add:
tags, description = calendar.split_hashtags(args)
calendar.add_item(options, tags, description)
calendar.save_to_file(options.file)
has_done_something = True
if options.show:
calendar.print_items()
has_done_something = True
if not has_done_something:
print __doc__
if __name__ == '__main__':
options, args = docopt(__doc__)
options.file = os.path.expanduser(options.file)
main(options, args)