-
Notifications
You must be signed in to change notification settings - Fork 2
/
jsonjuggler.py
88 lines (77 loc) · 3.38 KB
/
jsonjuggler.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
# json parser implementation
from juggler import *
import json, re, math
import dateutil.parser
class DictJugglerTaskDepends(JugglerTaskDepends):
def load_from_issue(self, issue):
"""
Args:
issue["depends"] - a list of identifiers that this task depends on
"""
if "depends" in issue:
# TODO HERE: remove ID normalization!
if isinstance(issue["depends"], str) or isinstance(issue['depends'], unicode):
self.set_value([int(x) for x in re.findall(r"[\w']+", issue["depends"])])
# TODO check for list, else add idfr
else: self.set_value([int(x) for x in issue["depends"]])
class DictJugglerTaskPriority(JugglerTaskPriority):
def load_from_issue(self, issue):
if "priority" in issue: self.set_value(int(issue["priority"]))
class DictJugglerTaskStart(JugglerTaskStart):
def load_from_issue(self, issue):
if "start" in issue:
if isinstance(issue["start"], str) or isinstance(issue['start'], unicode):
self.set_value(dateutil.parser.parse(issue["start"]))
else:
self.set_value(issue["start"])
class DictJugglerTaskEffort(JugglerTaskEffort):
UNIT = "h"
def load_from_issue(self, issue):
if "effort" in issue: self.set_value(math.ceil(issue["effort"]))
class DictJugglerTaskAllocate(JugglerTaskAllocate):
def load_from_issue(self, issue):
if "allocate" in issue: alloc = issue["allocate"]
else: alloc = "me" # stub!
self.set_value(alloc)
src.walk(JugglerSource)[0].set_property(DictJugglerResource(issue))
class DictJugglerTask(JugglerTask):
def load_default_properties(self, issue):
self.set_property(DictJugglerTaskDepends(issue))
self.set_property(DictJugglerTaskEffort(issue))
self.set_property(DictJugglerTaskAllocate(issue))
self.set_property(DictJugglerTaskStart(issue))
self.set_property(DictJugglerTaskPriority(issue))
def load_from_issue(self, issue):
self.set_id(issue["id"])
if "summary" in issue: self.summary = issue["summary"]
class DictJuggler(GenericJuggler):
""" a simple dictionary based format parser """
def __init__(self, issues):
self.issues = issues
def load_issues(self):
return self.issues
def create_task_instance(self, issue):
return DictJugglerTask(issue)
def create_jugglersource_instance(self):
global src
src = DictJugglerSource()
return src
class DictJugglerSource(JugglerSource):
def load_default_properties(self, issue = None):
self.set_property(JugglerProject())
# self.set_property(DictJugglerResource()) # define no resource
self.set_property(JugglerIcalreport())
class DictJugglerResource(JugglerResource):
def load_from_issue(self, issue):
if "allocate" in issue:
self.set_id(issue["allocate"])
self.set_value(issue["allocate"])
class JsonJuggler(DictJuggler):
def __init__(self, json_issues):
self.issues = json.loads(json_issues)
def toJSON(self):
for t in self.walk(JugglerTask):
for i in self.issues:
if t.get_id() == i["id"]:
i["booking"] = t.walk(JugglerBooking)[0].decode()[0].isoformat()
return json.dumps(self.issues, sort_keys=True, indent=4, separators=(',', ': '))