expressir 2.2.1 → 2.3.0

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 (190) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.rubocop_todo.yml +253 -81
  4. data/Gemfile +4 -1
  5. data/README.adoc +63 -26
  6. data/benchmark/srl_benchmark.rb +386 -0
  7. data/benchmark/srl_native_benchmark.rb +142 -0
  8. data/benchmark/srl_ruby_benchmark.rb +130 -0
  9. data/expressir.gemspec +3 -2
  10. data/lib/expressir/benchmark.rb +1 -1
  11. data/lib/expressir/changes/item_change.rb +0 -1
  12. data/lib/expressir/changes/mapping_change.rb +0 -1
  13. data/lib/expressir/changes/schema_change.rb +0 -2
  14. data/lib/expressir/changes/version_change.rb +0 -3
  15. data/lib/expressir/changes.rb +5 -6
  16. data/lib/expressir/cli.rb +10 -24
  17. data/lib/expressir/commands/changes.rb +0 -2
  18. data/lib/expressir/commands/changes_import_eengine.rb +0 -3
  19. data/lib/expressir/commands/changes_validate.rb +0 -2
  20. data/lib/expressir/commands/format.rb +1 -1
  21. data/lib/expressir/commands/manifest.rb +0 -7
  22. data/lib/expressir/commands/package.rb +16 -29
  23. data/lib/expressir/commands/validate.rb +0 -2
  24. data/lib/expressir/commands/validate_load.rb +1 -1
  25. data/lib/expressir/commands.rb +20 -0
  26. data/lib/expressir/config.rb +0 -2
  27. data/lib/expressir/coverage.rb +11 -4
  28. data/lib/expressir/eengine/arm_compare_report.rb +1 -4
  29. data/lib/expressir/eengine/changes_section.rb +1 -3
  30. data/lib/expressir/eengine/compare_report.rb +1 -13
  31. data/lib/expressir/eengine/mim_compare_report.rb +1 -4
  32. data/lib/expressir/eengine/modified_object.rb +1 -2
  33. data/lib/expressir/eengine.rb +9 -0
  34. data/lib/expressir/errors.rb +3 -5
  35. data/lib/expressir/express/builder.rb +22 -7
  36. data/lib/expressir/express/builder_registry.rb +411 -0
  37. data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
  38. data/lib/expressir/express/builders/built_in_builder.rb +1 -16
  39. data/lib/expressir/express/builders/constant_builder.rb +4 -19
  40. data/lib/expressir/express/builders/declaration_builder.rb +0 -4
  41. data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
  42. data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
  43. data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
  44. data/lib/expressir/express/builders/entity_decl_builder.rb +7 -13
  45. data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
  46. data/lib/expressir/express/builders/expression_builder.rb +31 -67
  47. data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
  48. data/lib/expressir/express/builders/interface_builder.rb +0 -20
  49. data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
  50. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
  51. data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
  52. data/lib/expressir/express/builders/literal_builder.rb +1 -15
  53. data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
  54. data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
  55. data/lib/expressir/express/builders/reference_builder.rb +1 -10
  56. data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
  57. data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
  58. data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
  59. data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
  60. data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
  61. data/lib/expressir/express/builders/statement_builder.rb +4 -32
  62. data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
  63. data/lib/expressir/express/builders/syntax_builder.rb +60 -7
  64. data/lib/expressir/express/builders/type_builder.rb +3 -45
  65. data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
  66. data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
  67. data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
  68. data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
  69. data/lib/expressir/express/builders.rb +47 -35
  70. data/lib/expressir/express/error.rb +0 -3
  71. data/lib/expressir/express/formatter.rb +17 -19
  72. data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
  73. data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
  74. data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
  75. data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
  76. data/lib/expressir/express/formatters/references_formatter.rb +34 -32
  77. data/lib/expressir/express/formatters/remark_formatter.rb +176 -209
  78. data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
  79. data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
  80. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
  81. data/lib/expressir/express/formatters.rb +22 -0
  82. data/lib/expressir/express/parser.rb +40 -41
  83. data/lib/expressir/express/pretty_formatter.rb +68 -47
  84. data/lib/expressir/express/remark_attacher.rb +210 -147
  85. data/lib/expressir/express/streaming_builder.rb +0 -3
  86. data/lib/expressir/express/transformer/remark_handling.rb +1 -2
  87. data/lib/expressir/express.rb +29 -0
  88. data/lib/expressir/manifest/resolver.rb +0 -3
  89. data/lib/expressir/manifest/validator.rb +0 -3
  90. data/lib/expressir/manifest.rb +6 -0
  91. data/lib/expressir/model/cache.rb +1 -1
  92. data/lib/expressir/model/concerns.rb +19 -0
  93. data/lib/expressir/model/data_types/aggregate.rb +1 -1
  94. data/lib/expressir/model/data_types/array.rb +1 -1
  95. data/lib/expressir/model/data_types/bag.rb +1 -1
  96. data/lib/expressir/model/data_types/binary.rb +1 -1
  97. data/lib/expressir/model/data_types/boolean.rb +1 -1
  98. data/lib/expressir/model/data_types/enumeration.rb +1 -1
  99. data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
  100. data/lib/expressir/model/data_types/generic.rb +1 -1
  101. data/lib/expressir/model/data_types/generic_entity.rb +1 -1
  102. data/lib/expressir/model/data_types/integer.rb +1 -1
  103. data/lib/expressir/model/data_types/list.rb +1 -1
  104. data/lib/expressir/model/data_types/logical.rb +1 -1
  105. data/lib/expressir/model/data_types/number.rb +1 -1
  106. data/lib/expressir/model/data_types/real.rb +1 -1
  107. data/lib/expressir/model/data_types/select.rb +1 -1
  108. data/lib/expressir/model/data_types/set.rb +1 -1
  109. data/lib/expressir/model/data_types/string.rb +1 -1
  110. data/lib/expressir/model/data_types.rb +25 -0
  111. data/lib/expressir/model/declarations/attribute.rb +1 -1
  112. data/lib/expressir/model/declarations/constant.rb +1 -1
  113. data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
  114. data/lib/expressir/model/declarations/entity.rb +4 -1
  115. data/lib/expressir/model/declarations/function.rb +3 -1
  116. data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
  117. data/lib/expressir/model/declarations/interface.rb +1 -1
  118. data/lib/expressir/model/declarations/interface_item.rb +1 -1
  119. data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
  120. data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
  121. data/lib/expressir/model/declarations/parameter.rb +1 -1
  122. data/lib/expressir/model/declarations/procedure.rb +3 -1
  123. data/lib/expressir/model/declarations/remark_item.rb +1 -1
  124. data/lib/expressir/model/declarations/rule.rb +4 -1
  125. data/lib/expressir/model/declarations/schema.rb +2 -1
  126. data/lib/expressir/model/declarations/schema_version.rb +1 -1
  127. data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
  128. data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
  129. data/lib/expressir/model/declarations/type.rb +4 -1
  130. data/lib/expressir/model/declarations/unique_rule.rb +1 -1
  131. data/lib/expressir/model/declarations/variable.rb +1 -1
  132. data/lib/expressir/model/declarations/where_rule.rb +1 -1
  133. data/lib/expressir/model/declarations.rb +31 -0
  134. data/lib/expressir/model/dependency_resolver.rb +0 -2
  135. data/lib/expressir/model/exp_file.rb +38 -0
  136. data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
  137. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
  138. data/lib/expressir/model/expressions/binary_expression.rb +1 -1
  139. data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
  140. data/lib/expressir/model/expressions/function_call.rb +1 -1
  141. data/lib/expressir/model/expressions/interval.rb +1 -1
  142. data/lib/expressir/model/expressions/query_expression.rb +1 -1
  143. data/lib/expressir/model/expressions/unary_expression.rb +1 -1
  144. data/lib/expressir/model/expressions.rb +18 -0
  145. data/lib/expressir/model/identifier.rb +5 -1
  146. data/lib/expressir/model/indexes.rb +11 -0
  147. data/lib/expressir/model/literals/binary.rb +1 -1
  148. data/lib/expressir/model/literals/integer.rb +1 -1
  149. data/lib/expressir/model/literals/logical.rb +1 -1
  150. data/lib/expressir/model/literals/real.rb +1 -1
  151. data/lib/expressir/model/literals/string.rb +1 -1
  152. data/lib/expressir/model/literals.rb +13 -0
  153. data/lib/expressir/model/model_element.rb +7 -15
  154. data/lib/expressir/model/references/attribute_reference.rb +1 -1
  155. data/lib/expressir/model/references/group_reference.rb +1 -1
  156. data/lib/expressir/model/references/index_reference.rb +1 -1
  157. data/lib/expressir/model/references/simple_reference.rb +1 -1
  158. data/lib/expressir/model/references.rb +12 -0
  159. data/lib/expressir/model/remark_info.rb +1 -7
  160. data/lib/expressir/model/repository.rb +72 -36
  161. data/lib/expressir/model/repository_validator.rb +0 -2
  162. data/lib/expressir/model/search_engine.rb +6 -30
  163. data/lib/expressir/model/statements/alias.rb +1 -1
  164. data/lib/expressir/model/statements/assignment.rb +1 -1
  165. data/lib/expressir/model/statements/case.rb +1 -1
  166. data/lib/expressir/model/statements/case_action.rb +1 -1
  167. data/lib/expressir/model/statements/compound.rb +1 -1
  168. data/lib/expressir/model/statements/escape.rb +1 -1
  169. data/lib/expressir/model/statements/if.rb +1 -1
  170. data/lib/expressir/model/statements/null.rb +1 -1
  171. data/lib/expressir/model/statements/procedure_call.rb +1 -1
  172. data/lib/expressir/model/statements/repeat.rb +1 -1
  173. data/lib/expressir/model/statements/return.rb +1 -1
  174. data/lib/expressir/model/statements/skip.rb +1 -1
  175. data/lib/expressir/model/statements.rb +20 -0
  176. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
  177. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
  178. data/lib/expressir/model/supertype_expressions.rb +12 -0
  179. data/lib/expressir/model.rb +28 -4
  180. data/lib/expressir/package/builder.rb +33 -4
  181. data/lib/expressir/package/metadata.rb +0 -1
  182. data/lib/expressir/package/reader.rb +0 -1
  183. data/lib/expressir/package.rb +8 -0
  184. data/lib/expressir/schema_manifest.rb +5 -6
  185. data/lib/expressir/schema_manifest_entry.rb +3 -4
  186. data/lib/expressir/transformer.rb +7 -0
  187. data/lib/expressir/version.rb +1 -1
  188. data/lib/expressir.rb +23 -171
  189. metadata +49 -9
  190. data/lib/expressir/express/builders/token_builder.rb +0 -15
@@ -4,8 +4,6 @@ require "thor"
4
4
  require "json"
5
5
  require "yaml"
6
6
  require "pathname"
7
- require_relative "base"
8
- require_relative "../model/search_engine"
9
7
 
10
8
  module Expressir
11
9
  module Commands
@@ -94,10 +92,6 @@ module Expressir
94
92
  option :verbose, type: :boolean, default: false,
95
93
  desc: "Enable verbose output"
96
94
  def build(root_schema = nil, output = nil)
97
- require_relative "../model/dependency_resolver"
98
- require_relative "../model/repository"
99
- require_relative "../schema_manifest"
100
-
101
95
  schema_files = if options[:manifest]
102
96
  # Manifest-based mode
103
97
  unless File.exist?(options[:manifest])
@@ -109,7 +103,7 @@ module Expressir
109
103
  unless output
110
104
  raise Expressir::MissingRequiredArgumentError.new(
111
105
  "OUTPUT path is required",
112
- usage_hint: "expressir package build --manifest MANIFEST.yaml OUTPUT.ler"
106
+ usage_hint: "expressir package build --manifest MANIFEST.yaml OUTPUT.ler",
113
107
  )
114
108
  end
115
109
 
@@ -130,7 +124,6 @@ module Expressir
130
124
  say ""
131
125
  else
132
126
  say "Verifying manifest integrity..."
133
- require_relative "../manifest/validator"
134
127
 
135
128
  validator = Expressir::Manifest::Validator.new(
136
129
  manifest, options.merge(verbose: true)
@@ -141,7 +134,7 @@ module Expressir
141
134
  unless file_errors.empty?
142
135
  raise Expressir::ManifestValidationError.new(
143
136
  "Manifest validation failed",
144
- errors: file_errors.map { |e| e[:message] }
137
+ errors: file_errors.map { |e| e[:message] },
145
138
  )
146
139
  end
147
140
 
@@ -150,7 +143,7 @@ module Expressir
150
143
  unless reference_errors.empty?
151
144
  raise Expressir::ReferentialIntegrityError.new(
152
145
  reference_errors,
153
- message: "Manifest has unresolved dependencies"
146
+ message: "Manifest has unresolved dependencies",
154
147
  )
155
148
  end
156
149
 
@@ -189,7 +182,7 @@ module Expressir
189
182
  unless errors.empty?
190
183
  raise Expressir::ManifestValidationError.new(
191
184
  "Manifest validation failed",
192
- errors: errors
185
+ errors: errors,
193
186
  )
194
187
  end
195
188
 
@@ -205,14 +198,14 @@ module Expressir
205
198
  unless root_schema
206
199
  raise Expressir::MissingRequiredArgumentError.new(
207
200
  "ROOT_SCHEMA is required when not using --manifest",
208
- usage_hint: "expressir package build ROOT_SCHEMA OUTPUT.ler"
201
+ usage_hint: "expressir package build ROOT_SCHEMA OUTPUT.ler",
209
202
  )
210
203
  end
211
204
 
212
205
  unless output
213
206
  raise Expressir::MissingRequiredArgumentError.new(
214
207
  "OUTPUT path is required",
215
- usage_hint: "expressir package build ROOT_SCHEMA OUTPUT.ler"
208
+ usage_hint: "expressir package build ROOT_SCHEMA OUTPUT.ler",
216
209
  )
217
210
  end
218
211
 
@@ -273,7 +266,7 @@ module Expressir
273
266
  else
274
267
  e.to_s
275
268
  end
276
- end
269
+ end,
277
270
  )
278
271
  end
279
272
  say " ✓ Validation passed" if options[:verbose]
@@ -290,7 +283,7 @@ module Expressir
290
283
  rescue StandardError => e
291
284
  raise Expressir::PackageBuildError.new(
292
285
  "Error building package: #{e.message}",
293
- command_name: "package build"
286
+ command_name: "package build",
294
287
  )
295
288
  end
296
289
 
@@ -312,9 +305,6 @@ module Expressir
312
305
  enum: ["text", "json", "yaml"],
313
306
  desc: "Output format"
314
307
  def info(package_path)
315
- require_relative "../model/repository"
316
- require_relative "../package/reader"
317
-
318
308
  repo = load_package(package_path)
319
309
  metadata = load_package_metadata(package_path)
320
310
 
@@ -331,7 +321,7 @@ module Expressir
331
321
  rescue StandardError => e
332
322
  raise Expressir::PackageReadError.new(
333
323
  "Error reading package info: #{e.message}",
334
- command_name: "package info"
324
+ command_name: "package info",
335
325
  )
336
326
  end
337
327
 
@@ -377,8 +367,6 @@ module Expressir
377
367
  enum: ["text", "json", "yaml"],
378
368
  desc: "Output format"
379
369
  def validate(package_path)
380
- require_relative "../model/repository"
381
-
382
370
  repo = load_package(package_path)
383
371
  validation = repo.validate(
384
372
  strict: options[:strict],
@@ -396,7 +384,7 @@ module Expressir
396
384
  unless validation[:valid?]
397
385
  raise Expressir::PackageValidationError.new(
398
386
  "Package validation failed",
399
- errors: validation[:errors] || []
387
+ errors: validation[:errors] || [],
400
388
  )
401
389
  end
402
390
  rescue Expressir::Error
@@ -404,7 +392,7 @@ module Expressir
404
392
  rescue StandardError => e
405
393
  raise Expressir::PackageValidationError.new(
406
394
  "Error validating package: #{e.message}",
407
- command_name: "package validate"
395
+ command_name: "package validate",
408
396
  )
409
397
  end
410
398
 
@@ -431,7 +419,7 @@ module Expressir
431
419
  unless options[:output]
432
420
  raise Expressir::MissingRequiredArgumentError.new(
433
421
  "output directory is required",
434
- usage_hint: "expressir package extract PACKAGE --output OUTPUT_DIR"
422
+ usage_hint: "expressir package extract PACKAGE --output OUTPUT_DIR",
435
423
  )
436
424
  end
437
425
 
@@ -455,7 +443,7 @@ module Expressir
455
443
  rescue StandardError => e
456
444
  raise Expressir::PackageExtractError.new(
457
445
  "Error extracting package: #{e.message}",
458
- command_name: "package extract"
446
+ command_name: "package extract",
459
447
  )
460
448
  end
461
449
 
@@ -521,7 +509,7 @@ module Expressir
521
509
  rescue StandardError => e
522
510
  raise Expressir::PackageListError.new(
523
511
  "Error listing elements: #{e.message}",
524
- command_name: "package list"
512
+ command_name: "package list",
525
513
  )
526
514
  end
527
515
 
@@ -605,7 +593,7 @@ module Expressir
605
593
  rescue StandardError => e
606
594
  raise Expressir::PackageSearchError.new(
607
595
  "Error searching: #{e.message}",
608
- command_name: "package search"
596
+ command_name: "package search",
609
597
  )
610
598
  end
611
599
  desc "tree PACKAGE", "Display hierarchical tree view of package contents"
@@ -676,7 +664,7 @@ module Expressir
676
664
  rescue StandardError => e
677
665
  raise Expressir::PackageTreeError.new(
678
666
  "Error displaying tree: #{e.message}",
679
- command_name: "package tree"
667
+ command_name: "package tree",
680
668
  )
681
669
  end
682
670
 
@@ -711,7 +699,6 @@ module Expressir
711
699
  # @return [Package::Metadata] Package metadata
712
700
  def load_package_metadata(package_path)
713
701
  require "zip"
714
- require_relative "../package/metadata"
715
702
 
716
703
  Zip::File.open(package_path) do |zip|
717
704
  entry = zip.find_entry("metadata.yaml")
@@ -30,7 +30,6 @@ module Expressir
30
30
  method_option :verbose, type: :boolean, default: false,
31
31
  desc: "Show verbose output"
32
32
  def load(*paths)
33
- require_relative "validate_load"
34
33
  ValidateLoad.new(options).run(paths)
35
34
  end
36
35
 
@@ -78,7 +77,6 @@ module Expressir
78
77
  method_option :verbose, type: :boolean, default: false,
79
78
  desc: "Show verbose output"
80
79
  def ascii(path)
81
- require_relative "validate_ascii"
82
80
  ValidateAscii.new(options).run(path)
83
81
  end
84
82
  end
@@ -61,7 +61,7 @@ module Expressir
61
61
  unless [no_valid, no_version].all?(&:empty?)
62
62
  raise Expressir::SchemaValidationError.new(
63
63
  "Schema validation failed",
64
- errors: no_valid + no_version
64
+ errors: no_valid + no_version,
65
65
  )
66
66
  end
67
67
 
@@ -0,0 +1,20 @@
1
+ # lib/expressir/commands.rb
2
+ module Expressir
3
+ module Commands
4
+ autoload :Base, "#{__dir__}/commands/base"
5
+ autoload :Benchmark, "#{__dir__}/commands/benchmark"
6
+ autoload :BenchmarkCache, "#{__dir__}/commands/benchmark_cache"
7
+ autoload :Clean, "#{__dir__}/commands/clean"
8
+ autoload :Coverage, "#{__dir__}/commands/coverage"
9
+ autoload :Format, "#{__dir__}/commands/format"
10
+ autoload :Validate, "#{__dir__}/commands/validate"
11
+ autoload :ValidateLoad, "#{__dir__}/commands/validate_load"
12
+ autoload :ValidateAscii, "#{__dir__}/commands/validate_ascii"
13
+ autoload :Changes, "#{__dir__}/commands/changes"
14
+ autoload :ChangesValidate, "#{__dir__}/commands/changes_validate"
15
+ autoload :ChangesImportEengine, "#{__dir__}/commands/changes_import_eengine"
16
+ autoload :Version, "#{__dir__}/commands/version"
17
+ autoload :Package, "#{__dir__}/commands/package"
18
+ autoload :Manifest, "#{__dir__}/commands/manifest"
19
+ end
20
+ end
@@ -57,6 +57,4 @@ module Expressir
57
57
  @benchmark_enabled && @benchmark_parallel
58
58
  end
59
59
  end
60
-
61
- extend Config
62
60
  end
@@ -304,16 +304,23 @@ module Expressir
304
304
  end
305
305
 
306
306
  # Find all entities in a schema or repository
307
- # @param schema_or_repo [Expressir::Model::Declarations::Schema, Expressir::Model::Repository] The schema or repository to analyze
307
+ # @param schema_or_repo [Expressir::Model::Declarations::Schema, Expressir::Model::Repository, Expressir::Model::ExpFile] The schema, repository, or file to analyze
308
308
  # @param skip_types [Array<String>] Array of entity type names to skip from coverage
309
309
  # @return [Array<Expressir::Model::ModelElement>] Array of entities
310
310
  def self.find_entities(schema_or_repo, skip_types = [])
311
311
  entities = []
312
312
 
313
- # Handle both repository and schema inputs
313
+ # Handle repository, exp_file, and schema inputs
314
314
  if schema_or_repo.is_a?(Expressir::Model::Repository)
315
- # If it's a repository, process all schemas
316
- schema_or_repo.schemas.each do |schema|
315
+ # If it's a repository, process all files
316
+ schema_or_repo.files&.each do |file|
317
+ file.schemas&.each do |schema|
318
+ entities.concat(find_entities_in_schema(schema))
319
+ end
320
+ end
321
+ elsif schema_or_repo.is_a?(Expressir::Model::ExpFile)
322
+ # If it's an ExpFile, process all schemas in the file
323
+ schema_or_repo.schemas&.each do |schema|
317
324
  entities.concat(find_entities_in_schema(schema))
318
325
  end
319
326
  else
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "lutaml/model"
4
- require_relative "changes_section"
5
- require_relative "modified_object"
6
3
 
7
4
  module Expressir
8
5
  module Eengine
@@ -13,7 +10,7 @@ module Expressir
13
10
  attribute :deletions, ChangesSection
14
11
 
15
12
  xml do
16
- root "arm.changes"
13
+ element "arm.changes"
17
14
  map_element "arm.modifications", to: :modifications
18
15
  map_element "arm.additions", to: :additions
19
16
  map_element "arm.deletions", to: :deletions
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "lutaml/model"
4
- require_relative "modified_object"
5
3
 
6
4
  module Expressir
7
5
  module Eengine
@@ -11,7 +9,7 @@ module Expressir
11
9
  attribute :modified_objects, ModifiedObject, collection: true
12
10
 
13
11
  xml do
14
- root "changes.section"
12
+ element "changes.section"
15
13
  map_element "modified.object", to: :modified_objects
16
14
  end
17
15
  end
@@ -1,17 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "lutaml/model"
4
-
5
- Lutaml::Model::Config.configure do |config|
6
- require "lutaml/model/xml_adapter/nokogiri_adapter"
7
- config.xml_adapter = Lutaml::Model::XmlAdapter::NokogiriAdapter
8
- end
9
-
10
- require_relative "changes_section"
11
- require_relative "modified_object"
12
- require_relative "arm_compare_report"
13
- require_relative "mim_compare_report"
14
-
15
3
  module Expressir
16
4
  module Eengine
17
5
  # Represents an Eengine comparison XML report
@@ -22,7 +10,7 @@ module Expressir
22
10
  attribute :deletions, ChangesSection
23
11
 
24
12
  xml do
25
- root "schema.changes"
13
+ element "schema.changes"
26
14
  map_element "schema.modifications", to: :modifications
27
15
  map_element "schema.additions", to: :additions
28
16
  map_element "schema.deletions", to: :deletions
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "lutaml/model"
4
- require_relative "changes_section"
5
- require_relative "modified_object"
6
3
 
7
4
  module Expressir
8
5
  module Eengine
@@ -13,7 +10,7 @@ module Expressir
13
10
  attribute :deletions, ChangesSection
14
11
 
15
12
  xml do
16
- root "mim.changes"
13
+ element "mim.changes"
17
14
  map_element "mim.modifications", to: :modifications
18
15
  map_element "mim.additions", to: :additions
19
16
  map_element "mim.deletions", to: :deletions
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "lutaml/model"
4
3
 
5
4
  module Expressir
6
5
  module Eengine
@@ -12,7 +11,7 @@ module Expressir
12
11
  attribute :description, :string
13
12
 
14
13
  xml do
15
- root "modified.object"
14
+ element "modified.object"
16
15
  map_attribute "type", to: :type
17
16
  map_attribute "name", to: :name
18
17
  map_attribute "interfaced.items", to: :interfaced_items
@@ -0,0 +1,9 @@
1
+ module Expressir
2
+ module Eengine
3
+ autoload :ModifiedObject, "#{__dir__}/eengine/modified_object"
4
+ autoload :ChangesSection, "#{__dir__}/eengine/changes_section"
5
+ autoload :CompareReport, "#{__dir__}/eengine/compare_report"
6
+ autoload :ArmCompareReport, "#{__dir__}/eengine/arm_compare_report"
7
+ autoload :MimCompareReport, "#{__dir__}/eengine/mim_compare_report"
8
+ end
9
+ end
@@ -80,7 +80,8 @@ module Expressir
80
80
  class ReferentialIntegrityError < ValidationError
81
81
  attr_reader :unresolved_references
82
82
 
83
- def initialize(unresolved_references, message: "Referential integrity check failed")
83
+ def initialize(unresolved_references,
84
+ message: "Referential integrity check failed")
84
85
  @unresolved_references = unresolved_references
85
86
  super(message)
86
87
  end
@@ -88,7 +89,7 @@ module Expressir
88
89
 
89
90
  class NoValidSchemaPathsError < ValidationError
90
91
  def initialize(message = "No valid schema paths found")
91
- super(message)
92
+ super
92
93
  end
93
94
  end
94
95
 
@@ -109,7 +110,4 @@ module Expressir
109
110
  class PackageListError < CommandError; end
110
111
  class PackageSearchError < CommandError; end
111
112
  class PackageTreeError < CommandError; end
112
-
113
- # Backward compatibility - alias the old name to the new class
114
- InvalidSchemaManifestError = ManifestValidationError
115
113
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "error"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  # Builder registry for AST node type handlers.
@@ -110,14 +108,29 @@ module Expressir
110
108
  build(ast)
111
109
  end
112
110
 
111
+ # Normalize a value to an Array for iteration.
112
+ # Handles: nil → [], Parsanol::Slice → [], Array → Array, other → [other]
113
+ def ensure_array(value)
114
+ return [] if value.nil?
115
+ return [] if value.is_a?(Parsanol::Slice)
116
+ value.is_a?(Array) ? value : [value]
117
+ end
118
+
113
119
  # Build children (array of AST nodes)
114
120
  # Optimized to avoid intermediate array allocations
115
121
  def build_children(ast_array)
116
- return [] unless ast_array
122
+ return [] if ast_array.nil?
123
+
124
+ # Handle Parsanol::Slice (including empty Slices from native parser)
125
+ # Convert to empty Array to match Ruby parser behavior
126
+ # Native parser returns empty slices where Ruby parser returns empty arrays
127
+ if ast_array.is_a?(Parsanol::Slice)
128
+ return []
129
+ end
117
130
 
118
131
  # Handle single element (common case)
119
132
  unless ast_array.is_a?(Array)
120
- return ast_array.nil? ? [] : [build(ast_array)].compact
133
+ return [build(ast_array)].compact
121
134
  end
122
135
 
123
136
  # Build result in single pass, avoiding flatten/compact/map chain
@@ -125,6 +138,11 @@ module Expressir
125
138
  ast_array.each do |item|
126
139
  next if item.nil?
127
140
 
141
+ # Empty Slices from native parser should be treated as empty arrays
142
+ if item.is_a?(Parsanol::Slice)
143
+ next
144
+ end
145
+
128
146
  case item
129
147
  when Array
130
148
  item.each do |sub|
@@ -345,6 +363,3 @@ module Expressir
345
363
  end
346
364
  end
347
365
  end
348
-
349
- # Top-level alias for convenience in builder files
350
- Builder = Expressir::Express::Builder