python-oracle-apex 0.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- python_oracle_apex/__init__.py +6 -0
- python_oracle_apex/apexlang-26.1.peg +387 -0
- python_oracle_apex/grammar.py +974 -0
- python_oracle_apex/objects.py +295 -0
- python_oracle_apex/reader.py +189 -0
- python_oracle_apex-0.0.0.dist-info/METADATA +27 -0
- python_oracle_apex-0.0.0.dist-info/RECORD +9 -0
- python_oracle_apex-0.0.0.dist-info/WHEEL +4 -0
- python_oracle_apex-0.0.0.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,974 @@
|
|
|
1
|
+
from parsimonious import Grammar, NodeVisitor
|
|
2
|
+
from python_oracle_apex.objects import *
|
|
3
|
+
from importlib import resources as impresources
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import python_oracle_apex
|
|
6
|
+
|
|
7
|
+
class RuleNotImplemented(BaseException):
|
|
8
|
+
pass
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ApxNodeVisitor(NodeVisitor):
|
|
12
|
+
def visit_page_object(self, node, visited_children):
|
|
13
|
+
""" Gets the section name. """
|
|
14
|
+
component_id = visited_children[2]
|
|
15
|
+
body_parts = visited_children[5]
|
|
16
|
+
if type(component_id) is list:
|
|
17
|
+
component_id = component_id[0][1]
|
|
18
|
+
else:
|
|
19
|
+
component_id = None
|
|
20
|
+
|
|
21
|
+
page = Page(component_id)
|
|
22
|
+
for item in body_parts:
|
|
23
|
+
if type(item) is tuple:
|
|
24
|
+
if type(item[1]) is dict:
|
|
25
|
+
page.add_group(item[0], item[1])
|
|
26
|
+
else:
|
|
27
|
+
page.add_property(item[0], item[1])
|
|
28
|
+
elif isinstance(item, ApexObject):
|
|
29
|
+
page.add_child(item)
|
|
30
|
+
elif item is None:
|
|
31
|
+
continue
|
|
32
|
+
else:
|
|
33
|
+
raise RuleNotImplemented(f"unprocessed: {item}")
|
|
34
|
+
return page
|
|
35
|
+
|
|
36
|
+
def visit_component_id(self, node, visited_children):
|
|
37
|
+
return node.text
|
|
38
|
+
|
|
39
|
+
def visit_page_body_line(self, node, visited_children):
|
|
40
|
+
return visited_children[0]
|
|
41
|
+
|
|
42
|
+
def visit_page_group_block(self, node, visited_children):
|
|
43
|
+
return visited_children[0]
|
|
44
|
+
|
|
45
|
+
def visit_page_child_component(self, node, visited_children):
|
|
46
|
+
return visited_children[0]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def visit_page_direct_property_line(self, node, visited_children):
|
|
50
|
+
return visited_children[1]
|
|
51
|
+
|
|
52
|
+
def visit_page_direct_property(self, node, visited_children):
|
|
53
|
+
v = visited_children[0]
|
|
54
|
+
title, _, _, value = v
|
|
55
|
+
return (title.text, value)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def visit_page_appearance(self, node, visited_children):
|
|
59
|
+
parts = visited_children[5]
|
|
60
|
+
d = {}
|
|
61
|
+
for item in parts:
|
|
62
|
+
if type(item) is tuple:
|
|
63
|
+
d[item[0]] = item[1]
|
|
64
|
+
else:
|
|
65
|
+
raise RuleNotImplemented()
|
|
66
|
+
return ('appearance', d)
|
|
67
|
+
|
|
68
|
+
def visit_page_appearance_property_line(self, node, visited_children):
|
|
69
|
+
return visited_children[1]
|
|
70
|
+
|
|
71
|
+
def visit_page_appearance_property(self, node, visited_children):
|
|
72
|
+
v = visited_children[0]
|
|
73
|
+
return (v[0].text, v[3])
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def visit_page_navigation(self, node, visited_children):
|
|
77
|
+
parts = visited_children[5]
|
|
78
|
+
d = {}
|
|
79
|
+
for item in parts:
|
|
80
|
+
if type(item) is tuple:
|
|
81
|
+
d[item[0]] = item[1]
|
|
82
|
+
else:
|
|
83
|
+
raise RuleNotImplemented()
|
|
84
|
+
return ('navigation', d)
|
|
85
|
+
|
|
86
|
+
def visit_page_navigation_property_line(self, node, visited_children):
|
|
87
|
+
return visited_children[1]
|
|
88
|
+
|
|
89
|
+
def visit_page_navigation_property(self, node, visited_children):
|
|
90
|
+
v = visited_children[0]
|
|
91
|
+
match v[0].text:
|
|
92
|
+
case 'cursorFocus':
|
|
93
|
+
return (v[0].text, v[3][0].text)
|
|
94
|
+
case 'warnOnUnsavedChanges':
|
|
95
|
+
return (v[0].text, v[3])
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def visit_page_css(self, node, visited_children):
|
|
99
|
+
parts = visited_children[5]
|
|
100
|
+
d = {}
|
|
101
|
+
for item in parts:
|
|
102
|
+
if type(item) is tuple:
|
|
103
|
+
d[item[0]] = item[1]
|
|
104
|
+
else:
|
|
105
|
+
raise RuleNotImplemented()
|
|
106
|
+
return ('css', d)
|
|
107
|
+
|
|
108
|
+
def visit_page_css_property_line(self, node, visited_children):
|
|
109
|
+
return visited_children[1]
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def visit_page_css_property(self, node, visited_children):
|
|
113
|
+
v = visited_children[0]
|
|
114
|
+
match v[0].text:
|
|
115
|
+
case 'inline':
|
|
116
|
+
return (v[0].text, v[-1])
|
|
117
|
+
case 'fileUrls':
|
|
118
|
+
return (v[0].text, v[3])
|
|
119
|
+
|
|
120
|
+
def visit_page_security(self, node, visited_children):
|
|
121
|
+
parts = visited_children[5]
|
|
122
|
+
d = {}
|
|
123
|
+
for item in parts:
|
|
124
|
+
if type(item) is tuple:
|
|
125
|
+
d[item[0]] = item[1]
|
|
126
|
+
else:
|
|
127
|
+
raise RuleNotImplemented()
|
|
128
|
+
return ('security', d)
|
|
129
|
+
|
|
130
|
+
def visit_page_security_property_line(self, node, visited_children):
|
|
131
|
+
return visited_children[1]
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def visit_page_security_property(self, node, visited_children):
|
|
135
|
+
v = visited_children[0]
|
|
136
|
+
match v[0].text:
|
|
137
|
+
case 'authentication' | 'pageAccessProtection':
|
|
138
|
+
return (v[0].text, v[3][0].text)
|
|
139
|
+
case 'formAutoComplete':
|
|
140
|
+
return (v[0].text, v[3])
|
|
141
|
+
case _:
|
|
142
|
+
raise RuleNotImplemented()
|
|
143
|
+
|
|
144
|
+
def visit_page_advanced(self, node, visited_children):
|
|
145
|
+
parts = visited_children[5]
|
|
146
|
+
d = {}
|
|
147
|
+
for item in parts:
|
|
148
|
+
if type(item) is tuple:
|
|
149
|
+
d[item[0]] = item[1]
|
|
150
|
+
else:
|
|
151
|
+
raise RuleNotImplemented()
|
|
152
|
+
return ('advanced', d)
|
|
153
|
+
|
|
154
|
+
def visit_page_advanced_property_line(self, node, visited_children):
|
|
155
|
+
return visited_children[1]
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def visit_page_advanced_property(self, node, visited_children):
|
|
159
|
+
v = visited_children[0]
|
|
160
|
+
match v[0].text:
|
|
161
|
+
case 'reloadOnSubmit' | 'duplicateSubmissionUrl':
|
|
162
|
+
return (v[0].text, v[3][0].text)
|
|
163
|
+
case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
164
|
+
return (v[0].text, v[3])
|
|
165
|
+
case _:
|
|
166
|
+
raise RuleNotImplemented()
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def visit_region(self, node, visited_children):
|
|
170
|
+
component_id = visited_children[2]
|
|
171
|
+
body_parts = visited_children[6]
|
|
172
|
+
if type(component_id) is list:
|
|
173
|
+
component_id = component_id[0][1]
|
|
174
|
+
else:
|
|
175
|
+
component_id = None
|
|
176
|
+
|
|
177
|
+
region = Region(component_id)
|
|
178
|
+
for item in body_parts:
|
|
179
|
+
if type(item) is tuple:
|
|
180
|
+
if type(item[1]) is dict:
|
|
181
|
+
region.add_group(item[0], item[1])
|
|
182
|
+
else:
|
|
183
|
+
region.add_property(item[0], item[1])
|
|
184
|
+
elif item is None:
|
|
185
|
+
# blanklines
|
|
186
|
+
continue
|
|
187
|
+
else:
|
|
188
|
+
raise RuleNotImplemented(f"unprocessed: {item}")
|
|
189
|
+
return region
|
|
190
|
+
|
|
191
|
+
def visit_region_body_line(self, node, visited_children):
|
|
192
|
+
return visited_children[0]
|
|
193
|
+
|
|
194
|
+
def visit_region_direct_property_line(self, node, visited_children):
|
|
195
|
+
return visited_children[1]
|
|
196
|
+
|
|
197
|
+
def visit_region_direct_property(self, node, visited_children):
|
|
198
|
+
v = visited_children[0]
|
|
199
|
+
title, _, _, value = v
|
|
200
|
+
return (title.text, value)
|
|
201
|
+
|
|
202
|
+
def visit_region_group_block(self, node, visited_children):
|
|
203
|
+
return visited_children[0]
|
|
204
|
+
|
|
205
|
+
def visit_region_layout(self, node, visited_children):
|
|
206
|
+
parts = visited_children[5]
|
|
207
|
+
d = {}
|
|
208
|
+
for item in parts:
|
|
209
|
+
if type(item) is tuple:
|
|
210
|
+
d[item[0]] = item[1]
|
|
211
|
+
else:
|
|
212
|
+
raise RuleNotImplemented()
|
|
213
|
+
return ('layout', RegionLayout(d) )
|
|
214
|
+
|
|
215
|
+
def visit_region_layout_property_line(self, node, visited_children):
|
|
216
|
+
return visited_children[1]
|
|
217
|
+
|
|
218
|
+
def visit_region_layout_property(self, node, visited_children):
|
|
219
|
+
v = visited_children[0]
|
|
220
|
+
match v[0].text:
|
|
221
|
+
case 'sequence' | 'slot':
|
|
222
|
+
return (v[0].text, v[3])
|
|
223
|
+
case 'reloadOnSubmit' | 'duplicateSubmissionUrl':
|
|
224
|
+
return (v[0].text, v[3][0].text)
|
|
225
|
+
case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
226
|
+
return (v[0].text, v[3])
|
|
227
|
+
case _:
|
|
228
|
+
raise RuleNotImplemented()
|
|
229
|
+
|
|
230
|
+
def visit_region_appearance(self, node, visited_children):
|
|
231
|
+
parts = visited_children[5]
|
|
232
|
+
d = {}
|
|
233
|
+
for item in parts:
|
|
234
|
+
if type(item) is tuple:
|
|
235
|
+
d[item[0]] = item[1]
|
|
236
|
+
else:
|
|
237
|
+
raise RuleNotImplemented()
|
|
238
|
+
return ('appearance', RegionAppearance(d))
|
|
239
|
+
|
|
240
|
+
def visit_region_appearance_property_line(self, node, visited_children):
|
|
241
|
+
return visited_children[1]
|
|
242
|
+
|
|
243
|
+
def visit_region_appearance_property(self, node, visited_children):
|
|
244
|
+
v = visited_children[0]
|
|
245
|
+
match v[0].text:
|
|
246
|
+
case 'template':
|
|
247
|
+
return (v[0].text, v[3])
|
|
248
|
+
case 'templateOptions':
|
|
249
|
+
return (v[0].text, v[3][0])
|
|
250
|
+
case 'reloadOnSubmit' | 'duplicateSubmissionUrl':
|
|
251
|
+
return (v[0].text, v[3][0].text)
|
|
252
|
+
case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
253
|
+
return (v[0].text, v[3])
|
|
254
|
+
case _:
|
|
255
|
+
raise RuleNotImplemented()
|
|
256
|
+
|
|
257
|
+
def visit_region_image(self, node, visited_children):
|
|
258
|
+
parts = visited_children[5]
|
|
259
|
+
d = {}
|
|
260
|
+
for item in parts:
|
|
261
|
+
if type(item) is tuple:
|
|
262
|
+
d[item[0]] = item[1]
|
|
263
|
+
else:
|
|
264
|
+
raise RuleNotImplemented()
|
|
265
|
+
return ('image', d)
|
|
266
|
+
|
|
267
|
+
def visit_region_image_property_line(self, node, visited_children):
|
|
268
|
+
return visited_children[1]
|
|
269
|
+
|
|
270
|
+
def visit_region_image_property(self, node, visited_children):
|
|
271
|
+
v = visited_children[0]
|
|
272
|
+
match v[0].text:
|
|
273
|
+
case 'fileUrl' | 'accessibleDescription' | 'customAttributes':
|
|
274
|
+
return (v[0].text, v[3])
|
|
275
|
+
case _:
|
|
276
|
+
raise RuleNotImplemented()
|
|
277
|
+
|
|
278
|
+
def visit_region_advanced(self, node, visited_children):
|
|
279
|
+
parts = visited_children[5]
|
|
280
|
+
d = {}
|
|
281
|
+
for item in parts:
|
|
282
|
+
if type(item) is tuple:
|
|
283
|
+
d[item[0]] = item[1]
|
|
284
|
+
else:
|
|
285
|
+
raise RuleNotImplemented()
|
|
286
|
+
return ('advanced', d)
|
|
287
|
+
|
|
288
|
+
def visit_region_advanced_property_line(self, node, visited_children):
|
|
289
|
+
return visited_children[1]
|
|
290
|
+
|
|
291
|
+
def visit_region_advanced_property(self, node, visited_children):
|
|
292
|
+
v = visited_children[0]
|
|
293
|
+
match v[0].text:
|
|
294
|
+
case 'htmlDomId':
|
|
295
|
+
return (v[0].text, v[3])
|
|
296
|
+
case _:
|
|
297
|
+
raise RuleNotImplemented()
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def visit_page_item(self, node, visited_children):
|
|
301
|
+
component_id = visited_children[2]
|
|
302
|
+
body_parts = visited_children[6]
|
|
303
|
+
if type(component_id) is list:
|
|
304
|
+
component_id = component_id[0][1]
|
|
305
|
+
else:
|
|
306
|
+
component_id = None
|
|
307
|
+
|
|
308
|
+
page_item = PageItem(component_id)
|
|
309
|
+
for item in body_parts:
|
|
310
|
+
if type(item) is tuple:
|
|
311
|
+
if type(item[1]) is dict:
|
|
312
|
+
page_item.add_group(item[0], item[1])
|
|
313
|
+
elif isinstance(item[1], ApexGroup):
|
|
314
|
+
page_item.add_group(item[0], item[1])
|
|
315
|
+
else:
|
|
316
|
+
page_item.add_property(item[0], item[1])
|
|
317
|
+
elif item is None:
|
|
318
|
+
continue
|
|
319
|
+
else:
|
|
320
|
+
raise RuleNotImplemented(f"unprocessed: {item}")
|
|
321
|
+
return page_item
|
|
322
|
+
|
|
323
|
+
def visit_page_item_body_line(self, node, visited_children):
|
|
324
|
+
return visited_children[0]
|
|
325
|
+
|
|
326
|
+
def visit_page_item_direct_property_line(self, node, visited_children):
|
|
327
|
+
return visited_children[1]
|
|
328
|
+
|
|
329
|
+
def visit_page_item_direct_property(self, node, visited_children):
|
|
330
|
+
v = visited_children[0]
|
|
331
|
+
title, _, _, value = v
|
|
332
|
+
return (title.text, value)
|
|
333
|
+
|
|
334
|
+
def visit_page_item_group_block(self, node, visited_children):
|
|
335
|
+
return visited_children[0]
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def visit_page_item_label(self, node, visited_children):
|
|
339
|
+
parts = visited_children[5]
|
|
340
|
+
d = {}
|
|
341
|
+
for item in parts:
|
|
342
|
+
if type(item) is tuple:
|
|
343
|
+
d[item[0]] = item[1]
|
|
344
|
+
else:
|
|
345
|
+
raise RuleNotImplemented()
|
|
346
|
+
return ('label', PageItemLabel(d) )
|
|
347
|
+
|
|
348
|
+
def visit_page_item_label_property_line(self, node, visited_children):
|
|
349
|
+
return visited_children[1]
|
|
350
|
+
|
|
351
|
+
def visit_page_item_label_property(self, node, visited_children):
|
|
352
|
+
v = visited_children[0]
|
|
353
|
+
match v[0].text:
|
|
354
|
+
case 'sequence' | 'label':
|
|
355
|
+
return (v[0].text, v[3])
|
|
356
|
+
case 'alignment' | 'duplicateSubmissionUrl':
|
|
357
|
+
return (v[0].text, v[3][0].text)
|
|
358
|
+
case _:
|
|
359
|
+
raise RuleNotImplemented()
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
def visit_page_item_settings(self, node, visited_children):
|
|
363
|
+
parts = visited_children[5]
|
|
364
|
+
d = {}
|
|
365
|
+
for item in parts:
|
|
366
|
+
if type(item) is tuple:
|
|
367
|
+
d[item[0]] = item[1]
|
|
368
|
+
else:
|
|
369
|
+
raise RuleNotImplemented()
|
|
370
|
+
return ('settings', PageItemSettings(d) )
|
|
371
|
+
|
|
372
|
+
def visit_page_item_settings_property_line(self, node, visited_children):
|
|
373
|
+
return visited_children[1]
|
|
374
|
+
|
|
375
|
+
def visit_page_item_settings_property(self, node, visited_children):
|
|
376
|
+
v = visited_children[0]
|
|
377
|
+
match v[0].text:
|
|
378
|
+
# case 'sequence' | 'label':
|
|
379
|
+
# return (v[0].text, v[3])
|
|
380
|
+
case 'trimSpaces':
|
|
381
|
+
return (v[0].text, v[3][0].text)
|
|
382
|
+
case _:
|
|
383
|
+
raise RuleNotImplemented()
|
|
384
|
+
|
|
385
|
+
def visit_page_item_session_state(self, node, visited_children):
|
|
386
|
+
parts = visited_children[5]
|
|
387
|
+
d = {}
|
|
388
|
+
for item in parts:
|
|
389
|
+
if type(item) is tuple:
|
|
390
|
+
d[item[0]] = item[1]
|
|
391
|
+
else:
|
|
392
|
+
raise RuleNotImplemented()
|
|
393
|
+
return ('sessionState', PageItemSessionState(d) )
|
|
394
|
+
|
|
395
|
+
def visit_page_item_session_state_property_line(self, node, visited_children):
|
|
396
|
+
return visited_children[1]
|
|
397
|
+
|
|
398
|
+
def visit_page_item_session_state_property(self, node, visited_children):
|
|
399
|
+
v = visited_children[0]
|
|
400
|
+
match v[0].text:
|
|
401
|
+
# case 'sequence' | 'label':
|
|
402
|
+
# return (v[0].text, v[3])
|
|
403
|
+
case 'dataType' | 'storage':
|
|
404
|
+
return (v[0].text, v[3][0].text)
|
|
405
|
+
case _:
|
|
406
|
+
raise RuleNotImplemented()
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def visit_page_item_layout(self, node, visited_children):
|
|
410
|
+
parts = visited_children[5]
|
|
411
|
+
d = {}
|
|
412
|
+
for item in parts:
|
|
413
|
+
if type(item) is tuple:
|
|
414
|
+
d[item[0]] = item[1]
|
|
415
|
+
else:
|
|
416
|
+
raise RuleNotImplemented()
|
|
417
|
+
return ('layout', PageItemLayout(d) )
|
|
418
|
+
|
|
419
|
+
def visit_page_item_layout_property_line(self, node, visited_children):
|
|
420
|
+
return visited_children[1]
|
|
421
|
+
|
|
422
|
+
def visit_page_item_layout_property(self, node, visited_children):
|
|
423
|
+
v = visited_children[0]
|
|
424
|
+
match v[0].text:
|
|
425
|
+
case 'sequence' | 'slot' | 'region':
|
|
426
|
+
return (v[0].text, v[3])
|
|
427
|
+
case 'alignment':
|
|
428
|
+
return (v[0].text, v[3][0].text)
|
|
429
|
+
case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
430
|
+
return (v[0].text, v[3])
|
|
431
|
+
case _:
|
|
432
|
+
raise RuleNotImplemented()
|
|
433
|
+
|
|
434
|
+
def visit_page_item_appearance(self, node, visited_children):
|
|
435
|
+
parts = visited_children[5]
|
|
436
|
+
d = {}
|
|
437
|
+
for item in parts:
|
|
438
|
+
if type(item) is tuple:
|
|
439
|
+
d[item[0]] = item[1]
|
|
440
|
+
else:
|
|
441
|
+
raise RuleNotImplemented()
|
|
442
|
+
return ('appearance', PageItemAppearance(d) )
|
|
443
|
+
|
|
444
|
+
def visit_page_item_appearance_property_line(self, node, visited_children):
|
|
445
|
+
return visited_children[1]
|
|
446
|
+
|
|
447
|
+
def visit_page_item_appearance_property(self, node, visited_children):
|
|
448
|
+
v = visited_children[0]
|
|
449
|
+
match v[0].text:
|
|
450
|
+
case 'template' | 'cssClasses' | 'width' | 'valuePlaceholder':
|
|
451
|
+
return (v[0].text, v[3])
|
|
452
|
+
case 'templateOptions':
|
|
453
|
+
return (v[0].text, v[3][0])
|
|
454
|
+
case _:
|
|
455
|
+
raise RuleNotImplemented()
|
|
456
|
+
|
|
457
|
+
def visit_page_item_validation(self, node, visited_children):
|
|
458
|
+
parts = visited_children[5]
|
|
459
|
+
d = {}
|
|
460
|
+
for item in parts:
|
|
461
|
+
if type(item) is tuple:
|
|
462
|
+
d[item[0]] = item[1]
|
|
463
|
+
else:
|
|
464
|
+
raise RuleNotImplemented()
|
|
465
|
+
return ('validation', PageItemValidation(d) )
|
|
466
|
+
|
|
467
|
+
def visit_page_item_validation_property_line(self, node, visited_children):
|
|
468
|
+
return visited_children[1]
|
|
469
|
+
|
|
470
|
+
def visit_page_item_validation_property(self, node, visited_children):
|
|
471
|
+
v = visited_children[0]
|
|
472
|
+
match v[0].text:
|
|
473
|
+
case 'valueRequired' | 'maxLength':
|
|
474
|
+
return (v[0].text, v[3])
|
|
475
|
+
case '?':
|
|
476
|
+
return (v[0].text, v[3][0])
|
|
477
|
+
case _:
|
|
478
|
+
raise RuleNotImplemented()
|
|
479
|
+
|
|
480
|
+
def visit_page_item_advanced(self, node, visited_children):
|
|
481
|
+
parts = visited_children[5]
|
|
482
|
+
d = {}
|
|
483
|
+
for item in parts:
|
|
484
|
+
if type(item) is tuple:
|
|
485
|
+
d[item[0]] = item[1]
|
|
486
|
+
else:
|
|
487
|
+
raise RuleNotImplemented()
|
|
488
|
+
return ('advanced', PageItemAdvanced(d) )
|
|
489
|
+
|
|
490
|
+
def visit_page_item_advanced_property_line(self, node, visited_children):
|
|
491
|
+
return visited_children[1]
|
|
492
|
+
|
|
493
|
+
def visit_page_item_advanced_property(self, node, visited_children):
|
|
494
|
+
v = visited_children[0]
|
|
495
|
+
match v[0].text:
|
|
496
|
+
case 'customAttributes':
|
|
497
|
+
return (v[0].text, v[3])
|
|
498
|
+
case 'postText':
|
|
499
|
+
return (v[0].text, v[3][0])
|
|
500
|
+
case _:
|
|
501
|
+
raise RuleNotImplemented()
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def visit_page_item_security(self, node, visited_children):
|
|
505
|
+
parts = visited_children[5]
|
|
506
|
+
d = {}
|
|
507
|
+
for item in parts:
|
|
508
|
+
if type(item) is tuple:
|
|
509
|
+
d[item[0]] = item[1]
|
|
510
|
+
else:
|
|
511
|
+
raise RuleNotImplemented()
|
|
512
|
+
return ('security', PageItemSecurity(d) )
|
|
513
|
+
|
|
514
|
+
def visit_page_item_security_property_line(self, node, visited_children):
|
|
515
|
+
return visited_children[1]
|
|
516
|
+
|
|
517
|
+
def visit_page_item_security_property(self, node, visited_children):
|
|
518
|
+
v = visited_children[0]
|
|
519
|
+
match v[0].text:
|
|
520
|
+
case 'encryptSessionState':
|
|
521
|
+
return (v[0].text, v[3])
|
|
522
|
+
case 'sessionStateProtection' | 'restrictedChars':
|
|
523
|
+
return (v[0].text, v[3][0])
|
|
524
|
+
case _:
|
|
525
|
+
raise RuleNotImplemented()
|
|
526
|
+
|
|
527
|
+
def visit_button(self, node, visited_children):
|
|
528
|
+
component_id = visited_children[2]
|
|
529
|
+
body_parts = visited_children[6]
|
|
530
|
+
if type(component_id) is list:
|
|
531
|
+
component_id = component_id[0][1]
|
|
532
|
+
else:
|
|
533
|
+
component_id = None
|
|
534
|
+
|
|
535
|
+
button = Button(component_id)
|
|
536
|
+
for item in body_parts:
|
|
537
|
+
if type(item) is tuple:
|
|
538
|
+
if type(item[1]) is dict:
|
|
539
|
+
button.add_group(item[0], item[1])
|
|
540
|
+
elif isinstance(item[1], ApexGroup):
|
|
541
|
+
button.add_group(item[0], item[1])
|
|
542
|
+
else:
|
|
543
|
+
button.add_property(item[0], item[1])
|
|
544
|
+
elif item is None:
|
|
545
|
+
continue
|
|
546
|
+
else:
|
|
547
|
+
raise RuleNotImplemented(f"unprocessed: {item}")
|
|
548
|
+
return button
|
|
549
|
+
|
|
550
|
+
def visit_button_body_line(self, node, visited_children):
|
|
551
|
+
return visited_children[0]
|
|
552
|
+
|
|
553
|
+
def visit_button_direct_property_line(self, node, visited_children):
|
|
554
|
+
return visited_children[1]
|
|
555
|
+
|
|
556
|
+
def visit_button_direct_property(self, node, visited_children):
|
|
557
|
+
v = visited_children[0]
|
|
558
|
+
title, _, _, value = v
|
|
559
|
+
return (title.text, value)
|
|
560
|
+
|
|
561
|
+
def visit_button_group_block(self, node, visited_children):
|
|
562
|
+
return visited_children[0]
|
|
563
|
+
|
|
564
|
+
def visit_button_layout(self, node, visited_children):
|
|
565
|
+
parts = visited_children[5]
|
|
566
|
+
d = {}
|
|
567
|
+
for item in parts:
|
|
568
|
+
if type(item) is tuple:
|
|
569
|
+
d[item[0]] = item[1]
|
|
570
|
+
else:
|
|
571
|
+
raise RuleNotImplemented()
|
|
572
|
+
return ('layout', ButtonLayout(d) )
|
|
573
|
+
|
|
574
|
+
def visit_button_layout_property_line(self, node, visited_children):
|
|
575
|
+
return visited_children[1]
|
|
576
|
+
|
|
577
|
+
def visit_button_layout_property(self, node, visited_children):
|
|
578
|
+
v = visited_children[0]
|
|
579
|
+
match v[0].text:
|
|
580
|
+
# case 'sequence' | 'slot' | 'region':
|
|
581
|
+
# return (v[0].text, v[3])
|
|
582
|
+
# case 'alignment':
|
|
583
|
+
# return (v[0].text, v[3][0].text)
|
|
584
|
+
# case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
585
|
+
# return (v[0].text, v[3])
|
|
586
|
+
case _:
|
|
587
|
+
raise RuleNotImplemented()
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def visit_button_appearance(self, node, visited_children):
|
|
591
|
+
parts = visited_children[5]
|
|
592
|
+
d = {}
|
|
593
|
+
for item in parts:
|
|
594
|
+
if type(item) is tuple:
|
|
595
|
+
d[item[0]] = item[1]
|
|
596
|
+
else:
|
|
597
|
+
raise RuleNotImplemented()
|
|
598
|
+
return ('appearance', ButtonAppearance(d) )
|
|
599
|
+
|
|
600
|
+
def visit_button_appearance_property_line(self, node, visited_children):
|
|
601
|
+
return visited_children[1]
|
|
602
|
+
|
|
603
|
+
def visit_button_appearance_property(self, node, visited_children):
|
|
604
|
+
v = visited_children[0]
|
|
605
|
+
match v[0].text:
|
|
606
|
+
case 'buttonTemplate' | 'hot':
|
|
607
|
+
return (v[0].text, v[3])
|
|
608
|
+
# case 'alignment':
|
|
609
|
+
# return (v[0].text, v[3][0].text)
|
|
610
|
+
# case 'templateOptions' | 'enableDuplicatePageSubmissions':
|
|
611
|
+
# return (v[0].text, v[3])
|
|
612
|
+
case 'templateOptions':
|
|
613
|
+
return (v[0].text, v[3][0])
|
|
614
|
+
case _:
|
|
615
|
+
raise RuleNotImplemented()
|
|
616
|
+
|
|
617
|
+
def visit_button_behavior(self, node, visited_children):
|
|
618
|
+
parts = visited_children[5]
|
|
619
|
+
d = {}
|
|
620
|
+
for item in parts:
|
|
621
|
+
if type(item) is tuple:
|
|
622
|
+
d[item[0]] = item[1]
|
|
623
|
+
else:
|
|
624
|
+
raise RuleNotImplemented()
|
|
625
|
+
return ('behavior', ButtonBehavior(d) )
|
|
626
|
+
|
|
627
|
+
def visit_button_behavior_property_line(self, node, visited_children):
|
|
628
|
+
return visited_children[1]
|
|
629
|
+
|
|
630
|
+
def visit_button_behavior_property(self, node, visited_children):
|
|
631
|
+
v = visited_children[0]
|
|
632
|
+
match v[0].text:
|
|
633
|
+
case 'warnOnUnsavedChanges':
|
|
634
|
+
return (v[0].text, v[3])
|
|
635
|
+
# case 'alignment':
|
|
636
|
+
# return (v[0].text, v[3][0].text)
|
|
637
|
+
# case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
638
|
+
# return (v[0].text, v[3])
|
|
639
|
+
case _:
|
|
640
|
+
raise RuleNotImplemented()
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
def visit_dynamic_action(self, node, visited_children):
|
|
644
|
+
component_id = visited_children[2]
|
|
645
|
+
body_parts = visited_children[6]
|
|
646
|
+
if type(component_id) is list:
|
|
647
|
+
component_id = component_id[0][1]
|
|
648
|
+
else:
|
|
649
|
+
component_id = None
|
|
650
|
+
|
|
651
|
+
dynact = DynamicAction(component_id)
|
|
652
|
+
for item in body_parts:
|
|
653
|
+
if type(item) is tuple:
|
|
654
|
+
if type(item[1]) is dict:
|
|
655
|
+
dynact.add_group(item[0], item[1])
|
|
656
|
+
elif isinstance(item[1], ApexGroup):
|
|
657
|
+
dynact.add_group(item[0], item[1])
|
|
658
|
+
else:
|
|
659
|
+
dynact.add_property(item[0], item[1])
|
|
660
|
+
elif isinstance(item, ApexObject):
|
|
661
|
+
dynact.add_child(item)
|
|
662
|
+
elif item is None:
|
|
663
|
+
continue
|
|
664
|
+
else:
|
|
665
|
+
raise RuleNotImplemented(f"unprocessed: {item}")
|
|
666
|
+
return dynact
|
|
667
|
+
|
|
668
|
+
def visit_dynamic_action_body_line(self, node, visited_children):
|
|
669
|
+
return visited_children[0]
|
|
670
|
+
|
|
671
|
+
def visit_dynamic_action_direct_property_line(self, node, visited_children):
|
|
672
|
+
return visited_children[1]
|
|
673
|
+
|
|
674
|
+
def visit_dynamic_action_direct_property(self, node, visited_children):
|
|
675
|
+
v = visited_children[0]
|
|
676
|
+
title, _, _, value = v
|
|
677
|
+
return (title.text, value)
|
|
678
|
+
|
|
679
|
+
def visit_dynamic_action_group_block(self, node, visited_children):
|
|
680
|
+
return visited_children[0]
|
|
681
|
+
|
|
682
|
+
def visit_dynamic_action_execution(self, node, visited_children):
|
|
683
|
+
parts = visited_children[5]
|
|
684
|
+
d = {}
|
|
685
|
+
for item in parts:
|
|
686
|
+
if type(item) is tuple:
|
|
687
|
+
d[item[0]] = item[1]
|
|
688
|
+
else:
|
|
689
|
+
raise RuleNotImplemented()
|
|
690
|
+
return ('execution', DynamicActionExecution(d) )
|
|
691
|
+
|
|
692
|
+
def visit_dynamic_action_execution_property_line(self, node, visited_children):
|
|
693
|
+
return visited_children[1]
|
|
694
|
+
|
|
695
|
+
def visit_dynamic_action_execution_property(self, node, visited_children):
|
|
696
|
+
v = visited_children[0]
|
|
697
|
+
match v[0].text:
|
|
698
|
+
case 'sequence':
|
|
699
|
+
return (v[0].text, v[3])
|
|
700
|
+
# case 'alignment':
|
|
701
|
+
# return (v[0].text, v[3][0].text)
|
|
702
|
+
# case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
703
|
+
# return (v[0].text, v[3])
|
|
704
|
+
case _:
|
|
705
|
+
raise RuleNotImplemented()
|
|
706
|
+
|
|
707
|
+
def visit_dynamic_action_when(self, node, visited_children):
|
|
708
|
+
parts = visited_children[5]
|
|
709
|
+
d = {}
|
|
710
|
+
for item in parts:
|
|
711
|
+
if type(item) is tuple:
|
|
712
|
+
d[item[0]] = item[1]
|
|
713
|
+
else:
|
|
714
|
+
raise RuleNotImplemented()
|
|
715
|
+
return ('when', DynamicActionWhen(d) )
|
|
716
|
+
|
|
717
|
+
def visit_dynamic_action_when_property_line(self, node, visited_children):
|
|
718
|
+
return visited_children[1]
|
|
719
|
+
|
|
720
|
+
def visit_dynamic_action_when_property(self, node, visited_children):
|
|
721
|
+
v = visited_children[0]
|
|
722
|
+
match v[0].text:
|
|
723
|
+
case 'event':
|
|
724
|
+
return (v[0].text, v[3])
|
|
725
|
+
# case 'alignment':
|
|
726
|
+
# return (v[0].text, v[3][0].text)
|
|
727
|
+
# case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
728
|
+
# return (v[0].text, v[3])
|
|
729
|
+
case _:
|
|
730
|
+
raise RuleNotImplemented()
|
|
731
|
+
|
|
732
|
+
def visit_dynamic_action_client_side_condition(self, node, visited_children):
|
|
733
|
+
parts = visited_children[5]
|
|
734
|
+
d = {}
|
|
735
|
+
for item in parts:
|
|
736
|
+
if type(item) is tuple:
|
|
737
|
+
d[item[0]] = item[1]
|
|
738
|
+
else:
|
|
739
|
+
raise RuleNotImplemented()
|
|
740
|
+
return ('clientSideCondition', DynamicActionClientSideCondition(d) )
|
|
741
|
+
|
|
742
|
+
def visit_dynamic_action_client_side_condition_property_line(self, node, visited_children):
|
|
743
|
+
return visited_children[1]
|
|
744
|
+
|
|
745
|
+
def visit_dynamic_action_client_side_condition_property(self, node, visited_children):
|
|
746
|
+
v = visited_children[0]
|
|
747
|
+
match v[0].text:
|
|
748
|
+
case 'event' | 'javaScriptExpression':
|
|
749
|
+
return (v[0].text, v[3])
|
|
750
|
+
case 'type':
|
|
751
|
+
return (v[0].text, v[3][0].text)
|
|
752
|
+
# case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
753
|
+
# return (v[0].text, v[3])
|
|
754
|
+
case _:
|
|
755
|
+
raise RuleNotImplemented()
|
|
756
|
+
|
|
757
|
+
def visit_action_c(self, node, visited_children):
|
|
758
|
+
component_id = visited_children[2]
|
|
759
|
+
body_parts = visited_children[6]
|
|
760
|
+
if type(component_id) is list:
|
|
761
|
+
component_id = component_id[0][1]
|
|
762
|
+
else:
|
|
763
|
+
component_id = None
|
|
764
|
+
|
|
765
|
+
act = Action(component_id)
|
|
766
|
+
for item in body_parts:
|
|
767
|
+
if type(item) is tuple:
|
|
768
|
+
if type(item[1]) is dict:
|
|
769
|
+
act.add_group(item[0], item[1])
|
|
770
|
+
elif isinstance(item[1], ApexGroup):
|
|
771
|
+
act.add_group(item[0], item[1])
|
|
772
|
+
else:
|
|
773
|
+
act.add_property(item[0], item[1])
|
|
774
|
+
elif item is None:
|
|
775
|
+
continue
|
|
776
|
+
else:
|
|
777
|
+
raise RuleNotImplemented(f"unprocessed: {item}")
|
|
778
|
+
return act
|
|
779
|
+
|
|
780
|
+
def visit_action_c_body_line(self, node, visited_children):
|
|
781
|
+
return visited_children[0]
|
|
782
|
+
|
|
783
|
+
def visit_action_c_direct_property_line(self, node, visited_children):
|
|
784
|
+
return visited_children[1]
|
|
785
|
+
|
|
786
|
+
def visit_action_c_direct_property(self, node, visited_children):
|
|
787
|
+
v = visited_children[0]
|
|
788
|
+
title, _, _, value = v
|
|
789
|
+
return (title.text, value)
|
|
790
|
+
|
|
791
|
+
def visit_action_c_group_block(self, node, visited_children):
|
|
792
|
+
return visited_children[0]
|
|
793
|
+
|
|
794
|
+
def visit_action_c_affected_elements(self, node, visited_children):
|
|
795
|
+
parts = visited_children[5]
|
|
796
|
+
d = {}
|
|
797
|
+
for item in parts:
|
|
798
|
+
if type(item) is tuple:
|
|
799
|
+
d[item[0]] = item[1]
|
|
800
|
+
else:
|
|
801
|
+
raise RuleNotImplemented()
|
|
802
|
+
return ('affectedElements', ActionAffectedElements(d) )
|
|
803
|
+
|
|
804
|
+
def visit_action_c_affected_elements_property_line(self, node, visited_children):
|
|
805
|
+
return visited_children[1]
|
|
806
|
+
|
|
807
|
+
def visit_action_c_affected_elements_property(self, node, visited_children):
|
|
808
|
+
v = visited_children[0]
|
|
809
|
+
match v[0].text:
|
|
810
|
+
case 'selectionType' | 'items':
|
|
811
|
+
return (v[0].text, v[3])
|
|
812
|
+
# case 'alignment':
|
|
813
|
+
# return (v[0].text, v[3][0].text)
|
|
814
|
+
# case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
815
|
+
# return (v[0].text, v[3])
|
|
816
|
+
case _:
|
|
817
|
+
raise RuleNotImplemented()
|
|
818
|
+
|
|
819
|
+
def visit_action_c_execution(self, node, visited_children):
|
|
820
|
+
parts = visited_children[5]
|
|
821
|
+
d = {}
|
|
822
|
+
for item in parts:
|
|
823
|
+
if type(item) is tuple:
|
|
824
|
+
d[item[0]] = item[1]
|
|
825
|
+
else:
|
|
826
|
+
raise RuleNotImplemented()
|
|
827
|
+
return ('execution', ActionExecution(d) )
|
|
828
|
+
|
|
829
|
+
def visit_action_c_execution_property_line(self, node, visited_children):
|
|
830
|
+
return visited_children[1]
|
|
831
|
+
|
|
832
|
+
def visit_action_c_execution_property(self, node, visited_children):
|
|
833
|
+
v = visited_children[0]
|
|
834
|
+
match v[0].text:
|
|
835
|
+
case 'sequence' | 'fireWhenEventResultIs':
|
|
836
|
+
return (v[0].text, v[3])
|
|
837
|
+
# case 'alignment':
|
|
838
|
+
# return (v[0].text, v[3][0].text)
|
|
839
|
+
# case 'enableMetaTags' | 'enableDuplicatePageSubmissions':
|
|
840
|
+
# return (v[0].text, v[3])
|
|
841
|
+
case _:
|
|
842
|
+
raise RuleNotImplemented()
|
|
843
|
+
|
|
844
|
+
|
|
845
|
+
|
|
846
|
+
def visit_process(self, node, visited_children):
|
|
847
|
+
component_id = visited_children[2]
|
|
848
|
+
body_parts = visited_children[6]
|
|
849
|
+
if type(component_id) is list:
|
|
850
|
+
component_id = component_id[0][1]
|
|
851
|
+
else:
|
|
852
|
+
component_id = None
|
|
853
|
+
|
|
854
|
+
proc = Process(component_id)
|
|
855
|
+
for item in body_parts:
|
|
856
|
+
if type(item) is tuple:
|
|
857
|
+
if type(item[1]) is dict:
|
|
858
|
+
proc.add_group(item[0], item[1])
|
|
859
|
+
elif isinstance(item[1], ApexGroup):
|
|
860
|
+
proc.add_group(item[0], item[1])
|
|
861
|
+
else:
|
|
862
|
+
proc.add_property(item[0], item[1])
|
|
863
|
+
elif item is None:
|
|
864
|
+
continue
|
|
865
|
+
else:
|
|
866
|
+
raise RuleNotImplemented(f"unprocessed: {item}")
|
|
867
|
+
return proc
|
|
868
|
+
|
|
869
|
+
def visit_process_body_line(self, node, visited_children):
|
|
870
|
+
return visited_children[0]
|
|
871
|
+
|
|
872
|
+
def visit_process_direct_property_line(self, node, visited_children):
|
|
873
|
+
return visited_children[1]
|
|
874
|
+
|
|
875
|
+
def visit_process_direct_property(self, node, visited_children):
|
|
876
|
+
v = visited_children[0]
|
|
877
|
+
title, _, _, value = v
|
|
878
|
+
return (title.text, value)
|
|
879
|
+
|
|
880
|
+
def visit_process_group_block(self, node, visited_children):
|
|
881
|
+
return visited_children[0]
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
def visit_reference(self, node, visited_children):
|
|
885
|
+
return node.text
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
def visit_code_block(self, node, visited_children):
|
|
889
|
+
return node.text
|
|
890
|
+
|
|
891
|
+
def visit_multiline_string(self, node, visited_children):
|
|
892
|
+
return node.text
|
|
893
|
+
|
|
894
|
+
def visit_array_of_string_like_value(self, node, visited_children):
|
|
895
|
+
values = visited_children[1]
|
|
896
|
+
ret = []
|
|
897
|
+
for v in values:
|
|
898
|
+
ret.append(v[2])
|
|
899
|
+
|
|
900
|
+
return ret
|
|
901
|
+
|
|
902
|
+
def visit_string_like_value(self, node, visited_children):
|
|
903
|
+
t = node.text
|
|
904
|
+
if t[0] == '"' and t[-1] == '"':
|
|
905
|
+
return t[1:-1]
|
|
906
|
+
else:
|
|
907
|
+
return t
|
|
908
|
+
|
|
909
|
+
def visit_identifier(self, node, visited_children):
|
|
910
|
+
return node.text
|
|
911
|
+
|
|
912
|
+
def visit_string(self, node, visited_children):
|
|
913
|
+
return node.text[1:-1]
|
|
914
|
+
|
|
915
|
+
def visit_boolean(self, node, visited_children):
|
|
916
|
+
return node.text == 'true'
|
|
917
|
+
|
|
918
|
+
def visit_number(self, node, visited_children):
|
|
919
|
+
if '.' in node.text:
|
|
920
|
+
return float(node.text)
|
|
921
|
+
else:
|
|
922
|
+
return int(node.text)
|
|
923
|
+
|
|
924
|
+
def visit_required_ws(self, node, visited_children):
|
|
925
|
+
return None
|
|
926
|
+
|
|
927
|
+
def visit_ws(self, node, visited_children):
|
|
928
|
+
return None
|
|
929
|
+
|
|
930
|
+
def visit_blank_lines(self, node, visited_children):
|
|
931
|
+
return None
|
|
932
|
+
|
|
933
|
+
|
|
934
|
+
def generic_visit(self, node, visited_children):
|
|
935
|
+
""" The generic visit method. """
|
|
936
|
+
return visited_children or node
|
|
937
|
+
|
|
938
|
+
def parse_apex_file(apex_file: str | Path, apex_version : str = "26.1") -> ApexObject:
|
|
939
|
+
if type(apex_file) is str:
|
|
940
|
+
fn = Path(apex_file)
|
|
941
|
+
else:
|
|
942
|
+
fn = apex_file
|
|
943
|
+
with fn.open('r') as f:
|
|
944
|
+
data = f.read()
|
|
945
|
+
|
|
946
|
+
return parse_apex(data, apex_version)
|
|
947
|
+
|
|
948
|
+
def parse_apex(data: str, apex_version : str = "26.1") -> ApexObject:
|
|
949
|
+
inp_file = impresources.files(python_oracle_apex) / f'apexlang-{apex_version}.peg'
|
|
950
|
+
with inp_file.open("rt") as f:
|
|
951
|
+
template = f.read()
|
|
952
|
+
|
|
953
|
+
grammar = Grammar(template)
|
|
954
|
+
|
|
955
|
+
nodes = grammar.parse(data)
|
|
956
|
+
|
|
957
|
+
visitor = ApxNodeVisitor()
|
|
958
|
+
output = visitor.visit(nodes)
|
|
959
|
+
return output
|
|
960
|
+
|
|
961
|
+
if __name__ == '__main__': # pragma: no cover
|
|
962
|
+
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
page = parse_apex(
|
|
966
|
+
"""page A (
|
|
967
|
+
)
|
|
968
|
+
""")
|
|
969
|
+
|
|
970
|
+
|
|
971
|
+
|
|
972
|
+
print(page)
|
|
973
|
+
|
|
974
|
+
print(page.appearance)
|