-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent_parser.py
143 lines (123 loc) · 5.41 KB
/
event_parser.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
135
136
137
138
139
140
141
142
143
import json
import re
from api import FigmaAPI
from jycm.jycm import YouchamaJsonDiffer
class FigmaEventParser:
NodeIDRegex = r'(\d+[:-]\d+)'
def __init__(self, event, figma_api) -> None:
self.event = event
self.api = figma_api
self.message_lines = []
@staticmethod
def convert_node_id(node_id):
return node_id.replace(':', '-')
@staticmethod
def get_node_url_from_component(component):
meta = component['meta']
return f"{FigmaAPI.FIGMA_WEB}/{meta['file_key']}?node-id={FigmaEventParser.convert_node_id(meta['node_id'])}"
def modified_components(self):
modified_info = {
'component_ids': set(),
'components': []
}
component_ids = set()
if 'modified_components' in self.event:
for component in self.event['modified_components']:
key = component['key']
info = self.api.get_component_info(key)
meta = info['meta']
node_id = FigmaEventParser.convert_node_id(meta['node_id'])
component_ids.add(node_id)
if 'name' in meta['containing_frame']:
name = f"{meta['containing_frame']['name']}, {meta['name']}"
else:
name = meta['name']
modified_info['components'].append([node_id, name])
modified_info['component_ids'] = component_ids
return modified_info
def created_components(self):
created_info = {
'component_ids': set(),
'components': []
}
component_ids = set()
if 'created_components' in self.event:
for component in self.event['created_components']:
key = component['key']
info = self.api.get_component_info(key)
meta = info['meta']
component_ids.add(FigmaEventParser.convert_node_id(meta['node_id']))
if 'name' in meta['containing_frame']:
name = f"{meta['containing_frame']['name']}, {meta['name']}"
else:
name = meta['name']
created_info['components'].append([meta['node_id'], name])
created_info['component_ids'] = component_ids
return created_info
@staticmethod
def traverse_path(obj, path):
new_path = []
cur = obj
for key in path.split("->"):
if key == "":
return ""
elif key[0]=='[' and key[-1]==']':
cur = cur[int(key[1:-1])]
if 'name' in cur:
new_path.append(f"({cur['name']})")
elif isinstance(cur, str):
new_path.append(cur)
else:
new_path.append(f"ERROR")
else:
cur=cur[key]
new_path.append(key)
return ' -> '.join(new_path)
@staticmethod
def flatten_object(obj, path):
if isinstance(obj, str):
return obj
else:
if 'componentSetId' in obj:
node_id = obj['componentSetId']
elif 'id' in obj:
node_id = obj['id']
else:
node_id = re.findall(FigmaEventParser.NodeIDRegex, path)[-1]
return [FigmaEventParser.convert_node_id(node_id), obj['name']]
def generate_history_diff(self, left, right):
ycm = YouchamaJsonDiffer(left, right)
ycm.diff()
diff_result = ycm.to_dict(no_pairs=True)
with open("diff.json", "w") as w:
w.write(json.dumps(diff_result))
if 'value_changes' in diff_result:
for i, change in enumerate(diff_result['value_changes']):
diff_result['value_changes'][i]['path'] = FigmaEventParser.traverse_path(left, change['left_path'])
del diff_result['value_changes'][i]['left']
del diff_result['value_changes'][i]['right']
del diff_result['value_changes'][i]['left_path']
del diff_result['value_changes'][i]['right_path']
else:
diff_result['value_changes'] = []
if 'dict:add' in diff_result:
for i, change in enumerate(diff_result['dict:add']):
diff_result['dict:add'][i]['path'] = FigmaEventParser.traverse_path(right, change['right_path'])
diff_result['dict:add'][i]['value'] = FigmaEventParser.flatten_object(change['right'], change['right_path'])
del diff_result['dict:add'][i]['left']
del diff_result['dict:add'][i]['right']
del diff_result['dict:add'][i]['left_path']
del diff_result['dict:add'][i]['right_path']
else:
diff_result['dict:add'] = []
if 'list:add' in diff_result:
for i, change in enumerate(diff_result['list:add']):
diff_result['list:add'][i]['path'] = FigmaEventParser.traverse_path(right, change['right_path'])
diff_result['list:add'][i]['value'] = FigmaEventParser.flatten_object(change['right'], change['right_path'])
del diff_result['list:add'][i]['left']
del diff_result['list:add'][i]['right']
del diff_result['list:add'][i]['left_path']
del diff_result['list:add'][i]['right_path']
else:
diff_result['list:add'] = []
return diff_result