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.
@@ -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)