expressir 2.1.13 → 2.1.14

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.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +7 -82
  3. data/.rubocop_todo.yml +15 -74
  4. data/Gemfile +4 -5
  5. data/expressir.gemspec +3 -1
  6. data/lib/expressir/express/cache.rb +4 -6
  7. data/lib/expressir/express/formatter.rb +92 -63
  8. data/lib/expressir/express/model_visitor.rb +10 -9
  9. data/lib/expressir/express/parser.rb +10 -8
  10. data/lib/expressir/express/resolve_references_model_visitor.rb +0 -3
  11. data/lib/expressir/express/visitor.rb +2 -1
  12. data/lib/expressir/liquid.rb +0 -17
  13. data/lib/expressir/model/cache.rb +9 -8
  14. data/lib/expressir/model/data_types/aggregate.rb +6 -11
  15. data/lib/expressir/model/data_types/array.rb +14 -20
  16. data/lib/expressir/model/data_types/bag.rb +10 -14
  17. data/lib/expressir/model/data_types/binary.rb +8 -11
  18. data/lib/expressir/model/data_types/boolean.rb +6 -1
  19. data/lib/expressir/model/data_types/enumeration.rb +10 -14
  20. data/lib/expressir/model/data_types/enumeration_item.rb +3 -5
  21. data/lib/expressir/model/data_types/generic.rb +4 -6
  22. data/lib/expressir/model/data_types/generic_entity.rb +4 -6
  23. data/lib/expressir/model/data_types/integer.rb +6 -1
  24. data/lib/expressir/model/data_types/list.rb +12 -17
  25. data/lib/expressir/model/data_types/logical.rb +6 -1
  26. data/lib/expressir/model/data_types/number.rb +6 -1
  27. data/lib/expressir/model/data_types/real.rb +6 -8
  28. data/lib/expressir/model/data_types/select.rb +12 -17
  29. data/lib/expressir/model/data_types/set.rb +10 -14
  30. data/lib/expressir/model/data_types/string.rb +8 -11
  31. data/lib/expressir/model/declarations/attribute.rb +17 -26
  32. data/lib/expressir/model/declarations/constant.rb +8 -14
  33. data/lib/expressir/model/declarations/entity.rb +18 -29
  34. data/lib/expressir/model/declarations/function.rb +25 -39
  35. data/lib/expressir/model/declarations/interface.rb +12 -16
  36. data/lib/expressir/model/declarations/interface_item.rb +7 -11
  37. data/lib/expressir/model/declarations/interfaced_item.rb +11 -18
  38. data/lib/expressir/model/declarations/parameter.rb +8 -14
  39. data/lib/expressir/model/declarations/procedure.rb +23 -36
  40. data/lib/expressir/model/declarations/remark_item.rb +8 -11
  41. data/lib/expressir/model/declarations/rule.rb +27 -42
  42. data/lib/expressir/model/declarations/schema.rb +59 -58
  43. data/lib/expressir/model/declarations/schema_version.rb +7 -10
  44. data/lib/expressir/model/declarations/schema_version_item.rb +7 -10
  45. data/lib/expressir/model/declarations/subtype_constraint.rb +12 -20
  46. data/lib/expressir/model/declarations/type.rb +10 -17
  47. data/lib/expressir/model/declarations/unique_rule.rb +6 -11
  48. data/lib/expressir/model/declarations/variable.rb +8 -14
  49. data/lib/expressir/model/declarations/where_rule.rb +6 -11
  50. data/lib/expressir/model/expressions/aggregate_initializer.rb +6 -8
  51. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +8 -11
  52. data/lib/expressir/model/expressions/binary_expression.rb +40 -42
  53. data/lib/expressir/model/expressions/entity_constructor.rb +8 -11
  54. data/lib/expressir/model/expressions/function_call.rb +8 -11
  55. data/lib/expressir/model/expressions/interval.rb +16 -22
  56. data/lib/expressir/model/expressions/query_expression.rb +8 -14
  57. data/lib/expressir/model/expressions/unary_expression.rb +11 -14
  58. data/lib/expressir/model/identifier.rb +8 -25
  59. data/lib/expressir/model/literals/binary.rb +6 -8
  60. data/lib/expressir/model/literals/integer.rb +6 -8
  61. data/lib/expressir/model/literals/logical.rb +9 -11
  62. data/lib/expressir/model/literals/real.rb +6 -8
  63. data/lib/expressir/model/literals/string.rb +8 -11
  64. data/lib/expressir/model/model_element.rb +164 -131
  65. data/lib/expressir/model/references/attribute_reference.rb +8 -11
  66. data/lib/expressir/model/references/group_reference.rb +8 -11
  67. data/lib/expressir/model/references/index_reference.rb +10 -14
  68. data/lib/expressir/model/references/simple_reference.rb +10 -13
  69. data/lib/expressir/model/repository.rb +5 -7
  70. data/lib/expressir/model/statements/alias.rb +8 -14
  71. data/lib/expressir/model/statements/assignment.rb +8 -11
  72. data/lib/expressir/model/statements/case.rb +10 -14
  73. data/lib/expressir/model/statements/case_action.rb +7 -10
  74. data/lib/expressir/model/statements/compound.rb +6 -8
  75. data/lib/expressir/model/statements/escape.rb +6 -1
  76. data/lib/expressir/model/statements/if.rb +10 -14
  77. data/lib/expressir/model/statements/null.rb +6 -1
  78. data/lib/expressir/model/statements/procedure_call.rb +8 -11
  79. data/lib/expressir/model/statements/repeat.rb +16 -26
  80. data/lib/expressir/model/statements/return.rb +6 -8
  81. data/lib/expressir/model/statements/skip.rb +6 -1
  82. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +12 -16
  83. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +6 -8
  84. data/lib/expressir/model.rb +1 -8
  85. data/lib/expressir/version.rb +1 -1
  86. data/lib/expressir.rb +7 -3
  87. metadata +32 -89
  88. data/lib/expressir/liquid/cache_drop.rb +0 -20
  89. data/lib/expressir/liquid/data_type_drop.rb +0 -8
  90. data/lib/expressir/liquid/data_types/aggregate_drop.rb +0 -21
  91. data/lib/expressir/liquid/data_types/array_drop.rb +0 -34
  92. data/lib/expressir/liquid/data_types/bag_drop.rb +0 -26
  93. data/lib/expressir/liquid/data_types/binary_drop.rb +0 -22
  94. data/lib/expressir/liquid/data_types/boolean_drop.rb +0 -10
  95. data/lib/expressir/liquid/data_types/enumeration_drop.rb +0 -30
  96. data/lib/expressir/liquid/data_types/enumeration_item_drop.rb +0 -17
  97. data/lib/expressir/liquid/data_types/generic_drop.rb +0 -17
  98. data/lib/expressir/liquid/data_types/generic_entity_drop.rb +0 -17
  99. data/lib/expressir/liquid/data_types/integer_drop.rb +0 -10
  100. data/lib/expressir/liquid/data_types/list_drop.rb +0 -30
  101. data/lib/expressir/liquid/data_types/logical_drop.rb +0 -10
  102. data/lib/expressir/liquid/data_types/number_drop.rb +0 -10
  103. data/lib/expressir/liquid/data_types/real_drop.rb +0 -18
  104. data/lib/expressir/liquid/data_types/select_drop.rb +0 -34
  105. data/lib/expressir/liquid/data_types/set_drop.rb +0 -26
  106. data/lib/expressir/liquid/data_types/string_drop.rb +0 -22
  107. data/lib/expressir/liquid/declaration_drop.rb +0 -8
  108. data/lib/expressir/liquid/declarations/attribute_drop.rb +0 -37
  109. data/lib/expressir/liquid/declarations/constant_drop.rb +0 -25
  110. data/lib/expressir/liquid/declarations/entity_drop.rb +0 -65
  111. data/lib/expressir/liquid/declarations/function_drop.rb +0 -93
  112. data/lib/expressir/liquid/declarations/interface_drop.rb +0 -30
  113. data/lib/expressir/liquid/declarations/interface_item_drop.rb +0 -22
  114. data/lib/expressir/liquid/declarations/interfaced_item_drop.rb +0 -34
  115. data/lib/expressir/liquid/declarations/parameter_drop.rb +0 -25
  116. data/lib/expressir/liquid/declarations/procedure_drop.rb +0 -89
  117. data/lib/expressir/liquid/declarations/remark_item_drop.rb +0 -22
  118. data/lib/expressir/liquid/declarations/rule_drop.rb +0 -105
  119. data/lib/expressir/liquid/declarations/schema_drop.rb +0 -131
  120. data/lib/expressir/liquid/declarations/schema_version_drop.rb +0 -26
  121. data/lib/expressir/liquid/declarations/schema_version_item_drop.rb +0 -22
  122. data/lib/expressir/liquid/declarations/subtype_constraint_drop.rb +0 -37
  123. data/lib/expressir/liquid/declarations/type_drop.rb +0 -37
  124. data/lib/expressir/liquid/declarations/unique_rule_drop.rb +0 -21
  125. data/lib/expressir/liquid/declarations/variable_drop.rb +0 -25
  126. data/lib/expressir/liquid/declarations/where_rule_drop.rb +0 -21
  127. data/lib/expressir/liquid/expression_drop.rb +0 -8
  128. data/lib/expressir/liquid/expressions/aggregate_initializer_drop.rb +0 -24
  129. data/lib/expressir/liquid/expressions/aggregate_initializer_item_drop.rb +0 -22
  130. data/lib/expressir/liquid/expressions/binary_expression_drop.rb +0 -26
  131. data/lib/expressir/liquid/expressions/entity_constructor_drop.rb +0 -26
  132. data/lib/expressir/liquid/expressions/function_call_drop.rb +0 -26
  133. data/lib/expressir/liquid/expressions/interval_drop.rb +0 -34
  134. data/lib/expressir/liquid/expressions/query_expression_drop.rb +0 -25
  135. data/lib/expressir/liquid/expressions/unary_expression_drop.rb +0 -22
  136. data/lib/expressir/liquid/identifier_drop.rb +0 -33
  137. data/lib/expressir/liquid/literal_drop.rb +0 -8
  138. data/lib/expressir/liquid/literals/binary_drop.rb +0 -18
  139. data/lib/expressir/liquid/literals/integer_drop.rb +0 -18
  140. data/lib/expressir/liquid/literals/logical_drop.rb +0 -18
  141. data/lib/expressir/liquid/literals/real_drop.rb +0 -18
  142. data/lib/expressir/liquid/literals/string_drop.rb +0 -22
  143. data/lib/expressir/liquid/model_element_drop.rb +0 -33
  144. data/lib/expressir/liquid/reference_drop.rb +0 -8
  145. data/lib/expressir/liquid/references/attribute_reference_drop.rb +0 -22
  146. data/lib/expressir/liquid/references/group_reference_drop.rb +0 -22
  147. data/lib/expressir/liquid/references/index_reference_drop.rb +0 -26
  148. data/lib/expressir/liquid/references/simple_reference_drop.rb +0 -22
  149. data/lib/expressir/liquid/repository_drop.rb +0 -25
  150. data/lib/expressir/liquid/statement_drop.rb +0 -8
  151. data/lib/expressir/liquid/statements/alias_drop.rb +0 -29
  152. data/lib/expressir/liquid/statements/assignment_drop.rb +0 -22
  153. data/lib/expressir/liquid/statements/case_action_drop.rb +0 -26
  154. data/lib/expressir/liquid/statements/case_drop.rb +0 -30
  155. data/lib/expressir/liquid/statements/compound_drop.rb +0 -22
  156. data/lib/expressir/liquid/statements/escape_drop.rb +0 -10
  157. data/lib/expressir/liquid/statements/if_drop.rb +0 -34
  158. data/lib/expressir/liquid/statements/null_drop.rb +0 -10
  159. data/lib/expressir/liquid/statements/procedure_call_drop.rb +0 -26
  160. data/lib/expressir/liquid/statements/repeat_drop.rb +0 -45
  161. data/lib/expressir/liquid/statements/return_drop.rb +0 -18
  162. data/lib/expressir/liquid/statements/skip_drop.rb +0 -10
  163. data/lib/expressir/liquid/supertype_expression_drop.rb +0 -8
  164. data/lib/expressir/liquid/supertype_expressions/binary_supertype_expression_drop.rb +0 -26
  165. data/lib/expressir/liquid/supertype_expressions/oneof_supertype_expression_drop.rb +0 -22
  166. data/lib/expressir/model/data_type.rb +0 -9
  167. data/lib/expressir/model/declaration.rb +0 -9
  168. data/lib/expressir/model/expression.rb +0 -9
  169. data/lib/expressir/model/literal.rb +0 -9
  170. data/lib/expressir/model/reference.rb +0 -9
  171. data/lib/expressir/model/statement.rb +0 -9
  172. data/lib/expressir/model/supertype_expression.rb +0 -9
@@ -1,5 +1,3 @@
1
- require_relative "../model"
2
-
3
1
  module Expressir
4
2
  module Express
5
3
  class Formatter
@@ -57,7 +55,7 @@ module Expressir
57
55
  # Formats Express model into an Express code
58
56
  # @param [Model::ModelElement] node
59
57
  # @return [String]
60
- def format(node)
58
+ def format(node) # rubocop:disable Metrics/MethodLength
61
59
  case node
62
60
  when Model::Repository
63
61
  format_repository(node)
@@ -189,6 +187,18 @@ module Expressir
189
187
  format_supertype_expressions_binary_supertype_expression(node)
190
188
  when Model::SupertypeExpressions::OneofSupertypeExpression
191
189
  format_supertype_expressions_oneof_supertype_expression(node)
190
+ when Model::Declarations::SchemaVersionItem
191
+ # not implemented yet
192
+ when Model::Declarations::InterfacedItem
193
+ # not implemented yet
194
+ when Model::Declarations::RemarkItem
195
+ # not implemented yet
196
+ when Model::Cache
197
+ # not implemented yet
198
+ when Model::ModelElement
199
+ # not implemented yet
200
+ when NilClass
201
+ # not implemented yet
192
202
  else
193
203
  warn "#{node.class.name} format not implemented"
194
204
  ""
@@ -198,7 +208,7 @@ module Expressir
198
208
  private
199
209
 
200
210
  def format_repository(node)
201
- node.schemas.map { |x| format(x) }.join("\n\n")
211
+ node.schemas&.map { |x| format(x) }&.join("\n\n")
202
212
  end
203
213
 
204
214
  def format_declarations_attribute(node)
@@ -265,9 +275,15 @@ module Expressir
265
275
  end
266
276
 
267
277
  def format_declarations_entity(node)
268
- explicit_attributes = node.attributes.select { |x| x.kind == Model::Declarations::Attribute::EXPLICIT }
269
- derived_attributes = node.attributes.select { |x| x.kind == Model::Declarations::Attribute::DERIVED }
270
- inverse_attributes = node.attributes.select { |x| x.kind == Model::Declarations::Attribute::INVERSE }
278
+ if node.attributes.nil?
279
+ explicit_attributes = []
280
+ derived_attributes = []
281
+ inverse_attributes = []
282
+ else
283
+ explicit_attributes = node.attributes.select { |x| x.kind == Model::Declarations::Attribute::EXPLICIT }
284
+ derived_attributes = node.attributes.select { |x| x.kind == Model::Declarations::Attribute::DERIVED }
285
+ inverse_attributes = node.attributes.select { |x| x.kind == Model::Declarations::Attribute::INVERSE }
286
+ end
271
287
 
272
288
  [
273
289
  [
@@ -314,7 +330,7 @@ module Expressir
314
330
  ].join("")),
315
331
  ].join("")
316
332
  end,
317
- *if node.subtype_of.length.positive?
333
+ *if node.subtype_of&.length&.positive?
318
334
  [
319
335
  "\n",
320
336
  indent([
@@ -345,13 +361,13 @@ module Expressir
345
361
  indent(inverse_attributes.map { |x| format(x) }.join("\n")),
346
362
  ]
347
363
  end,
348
- *if node.unique_rules.length.positive?
364
+ *if node.unique_rules&.length&.positive?
349
365
  [
350
366
  "UNIQUE",
351
367
  indent(node.unique_rules.map { |x| format(x) }.join("\n")),
352
368
  ]
353
369
  end,
354
- *if node.where_rules.length.positive?
370
+ *if node.where_rules&.length&.positive?
355
371
  [
356
372
  "WHERE",
357
373
  indent(node.where_rules.map { |x| format(x) }.join("\n")),
@@ -370,7 +386,7 @@ module Expressir
370
386
  "FUNCTION",
371
387
  " ",
372
388
  node.id,
373
- *if node.parameters.length.positive?
389
+ *if node.parameters&.length&.positive?
374
390
  parameter_indent = INDENT_CHAR * "FUNCTION #{node.id}(".length
375
391
  [
376
392
  "(",
@@ -384,22 +400,22 @@ module Expressir
384
400
  format(node.return_type),
385
401
  ";",
386
402
  ].join(""),
387
- *if node.types.length.positive?
403
+ *if node.types&.length&.positive?
388
404
  indent(node.types.map { |x| format(x) }.join("\n"))
389
405
  end,
390
- *if node.entities.length.positive?
406
+ *if node.entities&.length&.positive?
391
407
  indent(node.entities.map { |x| format(x) }.join("\n"))
392
408
  end,
393
- *if node.subtype_constraints.length.positive?
409
+ *if node.subtype_constraints&.length&.positive?
394
410
  indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
395
411
  end,
396
- *if node.functions.length.positive?
412
+ *if node.functions&.length&.positive?
397
413
  indent(node.functions.map { |x| format(x) }.join("\n"))
398
414
  end,
399
- *if node.procedures.length.positive?
415
+ *if node.procedures&.length&.positive?
400
416
  indent(node.procedures.map { |x| format(x) }.join("\n"))
401
417
  end,
402
- *if node.constants.length.positive?
418
+ *if node.constants&.length&.positive?
403
419
  indent([
404
420
  "CONSTANT",
405
421
  indent(node.constants.map { |x| format(x) }.join("\n")),
@@ -409,7 +425,7 @@ module Expressir
409
425
  ].join(""),
410
426
  ].join("\n"))
411
427
  end,
412
- *if node.variables.length.positive?
428
+ *if node.variables&.length&.positive?
413
429
  indent([
414
430
  "LOCAL",
415
431
  indent(node.variables.map { |x| format(x) }.join("\n")),
@@ -419,7 +435,7 @@ module Expressir
419
435
  ].join(""),
420
436
  ].join("\n"))
421
437
  end,
422
- *if node.statements.length.positive?
438
+ *if node.statements&.length&.positive?
423
439
  indent(node.statements.map { |x| format(x) }.join("\n"))
424
440
  end,
425
441
  [
@@ -439,7 +455,7 @@ module Expressir
439
455
  "FROM",
440
456
  " ",
441
457
  format(node.schema),
442
- *if node.items.length.positive?
458
+ *if node.items&.length&.positive?
443
459
  item_indent = INDENT_CHAR * "(".length
444
460
  [
445
461
  "\n",
@@ -490,7 +506,7 @@ module Expressir
490
506
  "PROCEDURE",
491
507
  " ",
492
508
  node.id,
493
- *if node.parameters.length.positive?
509
+ *if node.parameters&.length&.positive?
494
510
  parameter_indent = INDENT_CHAR * "PROCEDURE #{node.id}(".length
495
511
  [
496
512
  "(",
@@ -500,22 +516,22 @@ module Expressir
500
516
  end,
501
517
  ";",
502
518
  ].join(""),
503
- *if node.types.length.positive?
519
+ *if node.types&.length&.positive?
504
520
  indent(node.types.map { |x| format(x) }.join("\n"))
505
521
  end,
506
- *if node.entities.length.positive?
522
+ *if node.entities&.length&.positive?
507
523
  indent(node.entities.map { |x| format(x) }.join("\n"))
508
524
  end,
509
- *if node.subtype_constraints.length.positive?
525
+ *if node.subtype_constraints&.length&.positive?
510
526
  indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
511
527
  end,
512
- *if node.functions.length.positive?
528
+ *if node.functions&.length&.positive?
513
529
  indent(node.functions.map { |x| format(x) }.join("\n"))
514
530
  end,
515
- *if node.procedures.length.positive?
531
+ *if node.procedures&.length&.positive?
516
532
  indent(node.procedures.map { |x| format(x) }.join("\n"))
517
533
  end,
518
- *if node.constants.length.positive?
534
+ *if node.constants&.length&.positive?
519
535
  indent([
520
536
  "CONSTANT",
521
537
  indent(node.constants.map { |x| format(x) }.join("\n")),
@@ -525,7 +541,7 @@ module Expressir
525
541
  ].join(""),
526
542
  ].join("\n"))
527
543
  end,
528
- *if node.variables.length.positive?
544
+ *if node.variables&.length&.positive?
529
545
  indent([
530
546
  "LOCAL",
531
547
  indent(node.variables.map { |x| format(x) }.join("\n")),
@@ -535,7 +551,7 @@ module Expressir
535
551
  ].join(""),
536
552
  ].join("\n"))
537
553
  end,
538
- *if node.statements.length.positive?
554
+ *if node.statements&.length&.positive?
539
555
  indent(node.statements.map { |x| format(x) }.join("\n"))
540
556
  end,
541
557
  [
@@ -546,6 +562,7 @@ module Expressir
546
562
  end
547
563
 
548
564
  def format_declarations_rule(node)
565
+ node.applies_to ||= []
549
566
  [
550
567
  [
551
568
  "RULE",
@@ -559,22 +576,22 @@ module Expressir
559
576
  ")",
560
577
  ";",
561
578
  ].join(""),
562
- *if node.types.length.positive?
579
+ *if node.types&.length&.positive?
563
580
  indent(node.types.map { |x| format(x) }.join("\n"))
564
581
  end,
565
- *if node.entities.length.positive?
582
+ *if node.entities&.length&.positive?
566
583
  indent(node.entities.map { |x| format(x) }.join("\n"))
567
584
  end,
568
- *if node.subtype_constraints.length.positive?
585
+ *if node.subtype_constraints&.length&.positive?
569
586
  indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
570
587
  end,
571
- *if node.functions.length.positive?
588
+ *if node.functions&.length&.positive?
572
589
  indent(node.functions.map { |x| format(x) }.join("\n"))
573
590
  end,
574
- *if node.procedures.length.positive?
591
+ *if node.procedures&.length&.positive?
575
592
  indent(node.procedures.map { |x| format(x) }.join("\n"))
576
593
  end,
577
- *if node.constants.length.positive?
594
+ *if node.constants&.length&.positive?
578
595
  indent([
579
596
  "CONSTANT",
580
597
  indent(node.constants.map { |x| format(x) }.join("\n")),
@@ -584,7 +601,7 @@ module Expressir
584
601
  ].join(""),
585
602
  ].join("\n"))
586
603
  end,
587
- *if node.variables.length.positive?
604
+ *if node.variables&.length&.positive?
588
605
  indent([
589
606
  "LOCAL",
590
607
  indent(node.variables.map { |x| format(x) }.join("\n")),
@@ -594,10 +611,10 @@ module Expressir
594
611
  ].join(""),
595
612
  ].join("\n"))
596
613
  end,
597
- *if node.statements.length.positive?
614
+ *if node.statements&.length&.positive?
598
615
  indent(node.statements.map { |x| format(x) }.join("\n"))
599
616
  end,
600
- *if node.where_rules.length.positive?
617
+ *if node.where_rules&.length&.positive?
601
618
  [
602
619
  "WHERE",
603
620
  indent(node.where_rules.map { |x| format(x) }.join("\n")),
@@ -624,7 +641,7 @@ module Expressir
624
641
  end,
625
642
  ";",
626
643
  ].join(""),
627
- *if node.interfaces.length.positive?
644
+ *if node.interfaces&.length&.positive?
628
645
  [
629
646
  "",
630
647
  node.interfaces.map { |x| format(x) }.join("\n"),
@@ -635,7 +652,7 @@ module Expressir
635
652
 
636
653
  def format_declarations_schema(node)
637
654
  schema_declarations = [
638
- *if node.constants.length.positive?
655
+ *if node.constants&.length&.positive?
639
656
  [
640
657
  "CONSTANT",
641
658
  indent(node.constants.map { |x| format(x) }.join("\n")),
@@ -645,19 +662,19 @@ module Expressir
645
662
  ].join(""),
646
663
  ].join("\n")
647
664
  end,
648
- *if node.types.length.positive?
665
+ *if node.types&.length&.positive?
649
666
  node.types.map { |x| format(x) }
650
667
  end,
651
- *if node.entities.length.positive?
668
+ *if node.entities&.length&.positive?
652
669
  node.entities.map { |x| format(x) }
653
670
  end,
654
- *if node.subtype_constraints.length.positive?
671
+ *if node.subtype_constraints&.length&.positive?
655
672
  node.subtype_constraints.map { |x| format(x) }
656
673
  end,
657
- *if node.functions.length.positive?
674
+ *if node.functions&.length&.positive?
658
675
  node.functions.map { |x| format(x) }
659
676
  end,
660
- *if node.rules.length.positive?
677
+ *if node.rules&.length&.positive?
661
678
  node.rules.map { |x| format(x) }
662
679
  end,
663
680
  *if node.procedures&.length&.positive?
@@ -667,7 +684,7 @@ module Expressir
667
684
 
668
685
  [
669
686
  format_declarations_schema_head(node),
670
- *if schema_declarations.length.positive?
687
+ *if schema_declarations&.length&.positive?
671
688
  [
672
689
  "",
673
690
  schema_declarations.join("\n\n"),
@@ -710,7 +727,7 @@ module Expressir
710
727
  ";",
711
728
  ].join(""))
712
729
  end,
713
- *if node.total_over.length.positive?
730
+ *if node.total_over&.length&.positive?
714
731
  indent([
715
732
  "TOTAL_OVER",
716
733
  "(",
@@ -744,7 +761,7 @@ module Expressir
744
761
  format(node.underlying_type),
745
762
  ";",
746
763
  ].join(""),
747
- *if node.where_rules.length.positive?
764
+ *if node.where_rules&.length&.positive?
748
765
  [
749
766
  "WHERE",
750
767
  indent(node.where_rules.map { |x| format(x) }.join("\n")),
@@ -758,6 +775,7 @@ module Expressir
758
775
  end
759
776
 
760
777
  def format_declarations_unique_rule(node)
778
+ node.attributes ||= []
761
779
  [
762
780
  *if node.id
763
781
  [
@@ -805,6 +823,7 @@ module Expressir
805
823
  end
806
824
 
807
825
  def format_expressions_aggregate_initializer(node)
826
+ node.items ||= []
808
827
  [
809
828
  "[",
810
829
  node.items.map { |x| format(x) }.join(", "),
@@ -870,6 +889,7 @@ module Expressir
870
889
  end
871
890
 
872
891
  def format_expressions_entity_constructor(node)
892
+ node.parameters ||= []
873
893
  [
874
894
  format(node.entity),
875
895
  "(",
@@ -927,7 +947,7 @@ module Expressir
927
947
  "|",
928
948
  " ",
929
949
  format(node.expression),
930
- *format_remarks(node).instance_eval { |x| x.length.positive? ? ["\n", *x, "\n"] : x },
950
+ *format_remarks(node).instance_eval { |x| x&.length&.positive? ? ["\n", *x, "\n"] : x },
931
951
  ")",
932
952
  ].join("")
933
953
  end
@@ -1038,7 +1058,7 @@ module Expressir
1038
1058
  format(node.expression),
1039
1059
  ";",
1040
1060
  ].join(""),
1041
- *if node.statements.length.positive?
1061
+ *if node.statements&.length&.positive?
1042
1062
  indent(node.statements.map { |x| format(x) }.join("\n"))
1043
1063
  end,
1044
1064
  *format_remarks(node),
@@ -1063,7 +1083,7 @@ module Expressir
1063
1083
  def format_statements_procedure_call(node)
1064
1084
  [
1065
1085
  format(node.procedure),
1066
- *if node.parameters.length.positive?
1086
+ *if node.parameters&.length&.positive?
1067
1087
  [
1068
1088
  "(",
1069
1089
  node.parameters.map { |x| format(x) }.join(", "),
@@ -1083,7 +1103,7 @@ module Expressir
1083
1103
  " ",
1084
1104
  "OF",
1085
1105
  ].join(""),
1086
- *if node.actions.length.positive?
1106
+ *if node.actions&.length&.positive?
1087
1107
  node.actions.map { |x| format(x) }
1088
1108
  end,
1089
1109
  *if node.otherwise_statement
@@ -1104,6 +1124,7 @@ module Expressir
1104
1124
  end
1105
1125
 
1106
1126
  def format_statements_case_action(node)
1127
+ node.labels ||= []
1107
1128
  [
1108
1129
  [
1109
1130
  node.labels.map { |x| format(x) }.join(", "),
@@ -1115,9 +1136,10 @@ module Expressir
1115
1136
  end
1116
1137
 
1117
1138
  def format_statements_compound(node)
1139
+ node.statements ||= []
1118
1140
  [
1119
1141
  "BEGIN",
1120
- *if node.statements.length.positive?
1142
+ *if node.statements&.length&.positive?
1121
1143
  indent(node.statements.map { |x| format(x) }.join("\n"))
1122
1144
  end,
1123
1145
  [
@@ -1143,10 +1165,10 @@ module Expressir
1143
1165
  " ",
1144
1166
  "THEN",
1145
1167
  ].join(""),
1146
- *if node.statements.length.positive?
1168
+ *if node.statements&.length&.positive?
1147
1169
  indent(node.statements.map { |x| format(x) }.join("\n"))
1148
1170
  end,
1149
- *if node.else_statements.length.positive?
1171
+ *if node.else_statements&.length&.positive?
1150
1172
  [
1151
1173
  "ELSE",
1152
1174
  indent(node.else_statements.map { |x| format(x) }.join("\n")),
@@ -1164,6 +1186,7 @@ module Expressir
1164
1186
  end
1165
1187
 
1166
1188
  def format_statements_repeat(node)
1189
+ node.statements ||= []
1167
1190
  [
1168
1191
  [
1169
1192
  "REPEAT",
@@ -1207,7 +1230,7 @@ module Expressir
1207
1230
  end,
1208
1231
  ";",
1209
1232
  ].join(""),
1210
- *if node.statements.length.positive?
1233
+ *if node.statements&.length&.positive?
1211
1234
  indent(node.statements.map { |x| format(x) }.join("\n"))
1212
1235
  end,
1213
1236
  *format_remarks(node),
@@ -1271,6 +1294,7 @@ module Expressir
1271
1294
  end
1272
1295
 
1273
1296
  def format_supertype_expressions_oneof_supertype_expression(node)
1297
+ node.operands ||= []
1274
1298
  [
1275
1299
  "ONEOF",
1276
1300
  "(",
@@ -1374,7 +1398,7 @@ module Expressir
1374
1398
  "BASED_ON",
1375
1399
  " ",
1376
1400
  format(node.based_on),
1377
- *if node.items.length.positive?
1401
+ *if node.items&.length&.positive?
1378
1402
  item_indent = INDENT_CHAR * "(".length
1379
1403
  [
1380
1404
  " ",
@@ -1390,7 +1414,7 @@ module Expressir
1390
1414
  ].join("")
1391
1415
  else
1392
1416
  [
1393
- *if node.items.length.positive?
1417
+ *if node.items&.length&.positive?
1394
1418
  item_indent = INDENT_CHAR * "(".length
1395
1419
  [
1396
1420
  " ",
@@ -1489,6 +1513,7 @@ module Expressir
1489
1513
  end
1490
1514
 
1491
1515
  def format_data_types_select(node)
1516
+ node.items ||= []
1492
1517
  [
1493
1518
  *if node.extensible
1494
1519
  [
@@ -1509,7 +1534,7 @@ module Expressir
1509
1534
  "BASED_ON",
1510
1535
  " ",
1511
1536
  format(node.based_on),
1512
- *if node.items.length.positive?
1537
+ *if node.items&.length&.positive?
1513
1538
  item_indent = INDENT_CHAR * "(".length
1514
1539
  [
1515
1540
  " ",
@@ -1525,7 +1550,7 @@ module Expressir
1525
1550
  ].join("")
1526
1551
  else
1527
1552
  [
1528
- *if node.items.length.positive?
1553
+ *if node.items&.length&.positive?
1529
1554
  item_indent = INDENT_CHAR * "(".length
1530
1555
  [
1531
1556
  "\n",
@@ -1582,6 +1607,8 @@ module Expressir
1582
1607
  end
1583
1608
 
1584
1609
  def indent(str)
1610
+ return if str.nil?
1611
+
1585
1612
  str.split("\n").map { |x| "#{INDENT}#{x}" }.join("\n")
1586
1613
  end
1587
1614
 
@@ -1610,7 +1637,9 @@ module Expressir
1610
1637
  end
1611
1638
 
1612
1639
  def format_remarks(node)
1613
- if node.class.method_defined?(:remarks) && !@no_remarks
1640
+ if node.class.method_defined?(:remarks) && !@no_remarks &&
1641
+ !node.remarks.nil?
1642
+
1614
1643
  node.remarks.map do |remark|
1615
1644
  format_remark(node, remark)
1616
1645
  end
@@ -1622,9 +1651,9 @@ module Expressir
1622
1651
  def format_scope_remarks(node)
1623
1652
  [
1624
1653
  *format_remarks(node),
1625
- *node.children.select do |x|
1654
+ *node&.children&.select do |x|
1626
1655
  !x.is_a? Model::DataTypes::EnumerationItem or node.is_a? Model::Declarations::Type
1627
- end.flat_map { |x| format_scope_remarks(x) },
1656
+ end&.flat_map { |x| format_scope_remarks(x) },
1628
1657
  ]
1629
1658
  end
1630
1659
  end
@@ -1,20 +1,21 @@
1
- require_relative "../model"
2
-
3
1
  module Expressir
4
2
  module Express
5
3
  # @abstract
6
4
  class ModelVisitor
7
5
  def visit(node)
8
- node.class.model_attrs.each do |variable|
9
- value = node.send(variable)
6
+ node.class.attributes.each_key do |symbol|
7
+ next if ::Expressir::Model::ModelElement::SKIP_ATTRIBUTES.include?(symbol)
8
+
9
+ value = node.send(symbol)
10
10
 
11
- if value.is_a? Array
12
- value.each do |value|
13
- if value.is_a? Model::ModelElement
14
- visit(value)
11
+ case value
12
+ when Array
13
+ value.each do |val|
14
+ if val.is_a? Model::ModelElement
15
+ visit(val)
15
16
  end
16
17
  end
17
- elsif value.is_a? Model::ModelElement
18
+ when Model::ModelElement
18
19
  visit(value)
19
20
  end
20
21
  end
@@ -1,6 +1,4 @@
1
1
  require "parslet"
2
- require_relative "resolve_references_model_visitor"
3
- require_relative "../model"
4
2
 
5
3
  module Expressir
6
4
  module Express
@@ -388,9 +386,12 @@ module Expressir
388
386
  # @param [Boolean] skip_references skip resolving references
389
387
  # @param [Boolean] include_source attach original source code to model elements
390
388
  # @return [Model::Repository]
391
- def self.from_file(file, skip_references: nil, include_source: nil) # rubocop:disable Metrics/AbcSize
389
+ def self.from_file(file, skip_references: nil, include_source: nil, root_path: nil) # rubocop:disable Metrics/AbcSize
392
390
  source = File.read file
393
391
 
392
+ # remove root path from file path
393
+ schema_file = root_path ? Pathname.new(file.to_s).relative_path_from(root_path).to_s : file.to_s
394
+
394
395
  begin
395
396
  ast = Parser.new.parse source
396
397
  rescue Parslet::ParseFailed => e
@@ -399,11 +400,12 @@ module Expressir
399
400
  end
400
401
 
401
402
  visitor = Expressir::Express::Visitor.new(source, include_source: include_source)
402
- transformed = visitor.visit_ast ast, :top
403
- @repository = transformed
403
+ @repository = visitor.visit_ast ast, :top
404
404
 
405
405
  @repository.schemas.each do |schema|
406
- schema.file = file.to_s
406
+ schema.file = schema_file
407
+ schema.file_basename = File.basename(schema_file, ".exp")
408
+ schema.formatted = schema.to_s(no_remarks: true)
407
409
  end
408
410
 
409
411
  unless skip_references
@@ -419,10 +421,10 @@ module Expressir
419
421
  # @param [Boolean] skip_references skip resolving references
420
422
  # @param [Boolean] include_source attach original source code to model elements
421
423
  # @return [Model::Repository]
422
- def self.from_files(files, skip_references: nil, include_source: nil)
424
+ def self.from_files(files, skip_references: nil, include_source: nil, root_path: nil)
423
425
  schemas = files.each_with_index.map do |file, _i|
424
426
  # start = Time.now
425
- repository = from_file(file, skip_references: true)
427
+ repository = from_file(file, skip_references: true, root_path: root_path)
426
428
  # STDERR.puts "#{i+1}/#{files.length} #{file} #{Time.now - start}"
427
429
  repository.schemas
428
430
  end.flatten
@@ -1,6 +1,3 @@
1
- require_relative "model_visitor"
2
- require_relative "../model"
3
-
4
1
  module Expressir
5
2
  module Express
6
3
  class ResolveReferencesModelVisitor < ModelVisitor
@@ -1,4 +1,3 @@
1
- require_relative "../model"
2
1
  require "set"
3
2
 
4
3
  # reference type is not recognized
@@ -232,8 +231,10 @@ module Expressir
232
231
  # check if path can create implicit informal proposition
233
232
  # see https://github.com/lutaml/expressir/issues/50
234
233
  if parent_node.class.method_defined?(:informal_propositions) && current_path.match(/^IP\d+$/)
234
+ parent_node.informal_propositions ||= []
235
235
  parent_node.informal_propositions << remark_item
236
236
  else
237
+ parent_node.remark_items ||= []
237
238
  parent_node.remark_items << remark_item
238
239
  end
239
240
  parent_node.reset_children_by_id
@@ -1,18 +1 @@
1
1
  require "liquid"
2
-
3
- require_relative "liquid/model_element_drop"
4
-
5
- require_relative "liquid/cache_drop"
6
- require_relative "liquid/data_type_drop"
7
- require_relative "liquid/declaration_drop"
8
- require_relative "liquid/expression_drop"
9
- require_relative "liquid/literal_drop"
10
- require_relative "liquid/reference_drop"
11
- require_relative "liquid/statement_drop"
12
- require_relative "liquid/supertype_expression_drop"
13
- require_relative "liquid/identifier_drop"
14
- require_relative "liquid/repository_drop"
15
-
16
- Dir[File.join(__dir__, "liquid", "**", "*.rb")].sort.each do |f|
17
- require f
18
- end
@@ -2,15 +2,16 @@ module Expressir
2
2
  module Model
3
3
  # Cache content object with Expressir version
4
4
  class Cache < ModelElement
5
- model_attr_accessor :version, "String"
6
- model_attr_accessor :content, "ModelElement"
5
+ attribute :version, :string
6
+ attribute :root_path, :string
7
+ attribute :content, ModelElement
8
+ attribute :_class, :string, default: -> { send(:name) }
7
9
 
8
- # @param [Hash] options
9
- # @option options [String] :version
10
- # @option options [ModelElement] :content
11
- def initialize(options = {})
12
- @version = options[:version]
13
- @content = options[:content]
10
+ key_value do
11
+ map "_class", to: :_class, render_default: true
12
+ map "version", to: :version
13
+ map "root_path", to: :root_path
14
+ map "content", to: :content
14
15
  end
15
16
  end
16
17
  end