expressir 2.2.0 → 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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.rubocop_todo.yml +254 -77
  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 +4 -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/base.rb +2 -9
  18. data/lib/expressir/commands/changes.rb +0 -2
  19. data/lib/expressir/commands/changes_import_eengine.rb +0 -3
  20. data/lib/expressir/commands/changes_validate.rb +0 -2
  21. data/lib/expressir/commands/format.rb +5 -3
  22. data/lib/expressir/commands/manifest.rb +0 -7
  23. data/lib/expressir/commands/package.rb +93 -101
  24. data/lib/expressir/commands/validate.rb +0 -2
  25. data/lib/expressir/commands/validate_ascii.rb +2 -4
  26. data/lib/expressir/commands/validate_load.rb +8 -5
  27. data/lib/expressir/commands.rb +20 -0
  28. data/lib/expressir/config.rb +0 -2
  29. data/lib/expressir/coverage.rb +11 -4
  30. data/lib/expressir/eengine/arm_compare_report.rb +1 -4
  31. data/lib/expressir/eengine/changes_section.rb +1 -3
  32. data/lib/expressir/eengine/compare_report.rb +1 -13
  33. data/lib/expressir/eengine/mim_compare_report.rb +1 -4
  34. data/lib/expressir/eengine/modified_object.rb +1 -2
  35. data/lib/expressir/eengine.rb +9 -0
  36. data/lib/expressir/errors.rb +113 -0
  37. data/lib/expressir/express/builder.rb +22 -7
  38. data/lib/expressir/express/builder_registry.rb +411 -0
  39. data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
  40. data/lib/expressir/express/builders/built_in_builder.rb +1 -16
  41. data/lib/expressir/express/builders/constant_builder.rb +4 -19
  42. data/lib/expressir/express/builders/declaration_builder.rb +0 -4
  43. data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
  44. data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
  45. data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
  46. data/lib/expressir/express/builders/entity_decl_builder.rb +7 -13
  47. data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
  48. data/lib/expressir/express/builders/expression_builder.rb +31 -67
  49. data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
  50. data/lib/expressir/express/builders/interface_builder.rb +0 -20
  51. data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
  52. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
  53. data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
  54. data/lib/expressir/express/builders/literal_builder.rb +1 -15
  55. data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
  56. data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
  57. data/lib/expressir/express/builders/reference_builder.rb +1 -10
  58. data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
  59. data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
  60. data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
  61. data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
  62. data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
  63. data/lib/expressir/express/builders/statement_builder.rb +4 -32
  64. data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
  65. data/lib/expressir/express/builders/syntax_builder.rb +60 -7
  66. data/lib/expressir/express/builders/type_builder.rb +3 -45
  67. data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
  68. data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
  69. data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
  70. data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
  71. data/lib/expressir/express/builders.rb +47 -35
  72. data/lib/expressir/express/error.rb +0 -3
  73. data/lib/expressir/express/formatter.rb +17 -19
  74. data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
  75. data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
  76. data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
  77. data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
  78. data/lib/expressir/express/formatters/references_formatter.rb +34 -32
  79. data/lib/expressir/express/formatters/remark_formatter.rb +176 -209
  80. data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
  81. data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
  82. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
  83. data/lib/expressir/express/formatters.rb +22 -0
  84. data/lib/expressir/express/parser.rb +40 -41
  85. data/lib/expressir/express/pretty_formatter.rb +68 -47
  86. data/lib/expressir/express/remark_attacher.rb +210 -147
  87. data/lib/expressir/express/streaming_builder.rb +0 -3
  88. data/lib/expressir/express/transformer/remark_handling.rb +1 -2
  89. data/lib/expressir/express.rb +29 -0
  90. data/lib/expressir/manifest/resolver.rb +0 -3
  91. data/lib/expressir/manifest/validator.rb +0 -3
  92. data/lib/expressir/manifest.rb +6 -0
  93. data/lib/expressir/model/cache.rb +1 -1
  94. data/lib/expressir/model/concerns.rb +19 -0
  95. data/lib/expressir/model/data_types/aggregate.rb +1 -1
  96. data/lib/expressir/model/data_types/array.rb +1 -1
  97. data/lib/expressir/model/data_types/bag.rb +1 -1
  98. data/lib/expressir/model/data_types/binary.rb +1 -1
  99. data/lib/expressir/model/data_types/boolean.rb +1 -1
  100. data/lib/expressir/model/data_types/enumeration.rb +1 -1
  101. data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
  102. data/lib/expressir/model/data_types/generic.rb +1 -1
  103. data/lib/expressir/model/data_types/generic_entity.rb +1 -1
  104. data/lib/expressir/model/data_types/integer.rb +1 -1
  105. data/lib/expressir/model/data_types/list.rb +1 -1
  106. data/lib/expressir/model/data_types/logical.rb +1 -1
  107. data/lib/expressir/model/data_types/number.rb +1 -1
  108. data/lib/expressir/model/data_types/real.rb +1 -1
  109. data/lib/expressir/model/data_types/select.rb +1 -1
  110. data/lib/expressir/model/data_types/set.rb +1 -1
  111. data/lib/expressir/model/data_types/string.rb +1 -1
  112. data/lib/expressir/model/data_types.rb +25 -0
  113. data/lib/expressir/model/declarations/attribute.rb +1 -1
  114. data/lib/expressir/model/declarations/constant.rb +1 -1
  115. data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
  116. data/lib/expressir/model/declarations/entity.rb +4 -1
  117. data/lib/expressir/model/declarations/function.rb +3 -1
  118. data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
  119. data/lib/expressir/model/declarations/interface.rb +1 -1
  120. data/lib/expressir/model/declarations/interface_item.rb +1 -1
  121. data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
  122. data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
  123. data/lib/expressir/model/declarations/parameter.rb +1 -1
  124. data/lib/expressir/model/declarations/procedure.rb +3 -1
  125. data/lib/expressir/model/declarations/remark_item.rb +1 -1
  126. data/lib/expressir/model/declarations/rule.rb +4 -1
  127. data/lib/expressir/model/declarations/schema.rb +2 -1
  128. data/lib/expressir/model/declarations/schema_version.rb +1 -1
  129. data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
  130. data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
  131. data/lib/expressir/model/declarations/type.rb +4 -1
  132. data/lib/expressir/model/declarations/unique_rule.rb +1 -1
  133. data/lib/expressir/model/declarations/variable.rb +1 -1
  134. data/lib/expressir/model/declarations/where_rule.rb +1 -1
  135. data/lib/expressir/model/declarations.rb +31 -0
  136. data/lib/expressir/model/dependency_resolver.rb +0 -2
  137. data/lib/expressir/model/exp_file.rb +38 -0
  138. data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
  139. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
  140. data/lib/expressir/model/expressions/binary_expression.rb +1 -1
  141. data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
  142. data/lib/expressir/model/expressions/function_call.rb +1 -1
  143. data/lib/expressir/model/expressions/interval.rb +1 -1
  144. data/lib/expressir/model/expressions/query_expression.rb +1 -1
  145. data/lib/expressir/model/expressions/unary_expression.rb +1 -1
  146. data/lib/expressir/model/expressions.rb +18 -0
  147. data/lib/expressir/model/identifier.rb +5 -1
  148. data/lib/expressir/model/indexes.rb +11 -0
  149. data/lib/expressir/model/literals/binary.rb +1 -1
  150. data/lib/expressir/model/literals/integer.rb +1 -1
  151. data/lib/expressir/model/literals/logical.rb +1 -1
  152. data/lib/expressir/model/literals/real.rb +1 -1
  153. data/lib/expressir/model/literals/string.rb +1 -1
  154. data/lib/expressir/model/literals.rb +13 -0
  155. data/lib/expressir/model/model_element.rb +7 -15
  156. data/lib/expressir/model/references/attribute_reference.rb +1 -1
  157. data/lib/expressir/model/references/group_reference.rb +1 -1
  158. data/lib/expressir/model/references/index_reference.rb +1 -1
  159. data/lib/expressir/model/references/simple_reference.rb +1 -1
  160. data/lib/expressir/model/references.rb +12 -0
  161. data/lib/expressir/model/remark_info.rb +1 -7
  162. data/lib/expressir/model/repository.rb +72 -36
  163. data/lib/expressir/model/repository_validator.rb +0 -2
  164. data/lib/expressir/model/search_engine.rb +6 -30
  165. data/lib/expressir/model/statements/alias.rb +1 -1
  166. data/lib/expressir/model/statements/assignment.rb +1 -1
  167. data/lib/expressir/model/statements/case.rb +1 -1
  168. data/lib/expressir/model/statements/case_action.rb +1 -1
  169. data/lib/expressir/model/statements/compound.rb +1 -1
  170. data/lib/expressir/model/statements/escape.rb +1 -1
  171. data/lib/expressir/model/statements/if.rb +1 -1
  172. data/lib/expressir/model/statements/null.rb +1 -1
  173. data/lib/expressir/model/statements/procedure_call.rb +1 -1
  174. data/lib/expressir/model/statements/repeat.rb +1 -1
  175. data/lib/expressir/model/statements/return.rb +1 -1
  176. data/lib/expressir/model/statements/skip.rb +1 -1
  177. data/lib/expressir/model/statements.rb +20 -0
  178. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
  179. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
  180. data/lib/expressir/model/supertype_expressions.rb +12 -0
  181. data/lib/expressir/model.rb +28 -4
  182. data/lib/expressir/package/builder.rb +33 -4
  183. data/lib/expressir/package/metadata.rb +0 -1
  184. data/lib/expressir/package/reader.rb +0 -1
  185. data/lib/expressir/package.rb +8 -0
  186. data/lib/expressir/schema_manifest.rb +5 -6
  187. data/lib/expressir/schema_manifest_entry.rb +3 -4
  188. data/lib/expressir/transformer.rb +7 -0
  189. data/lib/expressir/version.rb +1 -1
  190. data/lib/expressir.rb +23 -173
  191. metadata +64 -9
  192. 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,25 +92,19 @@ 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])
104
- say "Error: Manifest file not found: #{options[:manifest]}",
105
- :red
106
- exit 1
98
+ raise Expressir::ManifestNotFoundError.new(options[:manifest])
107
99
  end
108
100
 
109
101
  # Override output if not provided
110
102
  output ||= root_schema
111
103
  unless output
112
- say "Error: OUTPUT path is required", :red
113
- say "Usage: expressir package build --manifest MANIFEST.yaml OUTPUT.ler",
114
- :yellow
115
- exit 1
104
+ raise Expressir::MissingRequiredArgumentError.new(
105
+ "OUTPUT path is required",
106
+ usage_hint: "expressir package build --manifest MANIFEST.yaml OUTPUT.ler",
107
+ )
116
108
  end
117
109
 
118
110
  # Build repository
@@ -132,7 +124,6 @@ module Expressir
132
124
  say ""
133
125
  else
134
126
  say "Verifying manifest integrity..."
135
- require_relative "../manifest/validator"
136
127
 
137
128
  validator = Expressir::Manifest::Validator.new(
138
129
  manifest, options.merge(verbose: true)
@@ -141,29 +132,19 @@ module Expressir
141
132
  # Check file existence
142
133
  file_errors = validator.validate_file_existence
143
134
  unless file_errors.empty?
144
- say "✗ Manifest validation failed", :red
145
- say ""
146
- file_errors.each do |e|
147
- say " - #{e[:message]}", :red
148
- end
149
- exit 1
135
+ raise Expressir::ManifestValidationError.new(
136
+ "Manifest validation failed",
137
+ errors: file_errors.map { |e| e[:message] },
138
+ )
150
139
  end
151
140
 
152
141
  # Check referential integrity
153
142
  reference_errors = validator.validate_referential_integrity
154
143
  unless reference_errors.empty?
155
- say "✗ Manifest has unresolved dependencies", :red
156
- say ""
157
- say "The following schema references cannot be resolved:",
158
- :red
159
- reference_errors.each do |e|
160
- say " - #{e[:message]}", :red
161
- end
162
- say ""
163
- say "This package may be incomplete or inconsistent.",
164
- :red
165
- say "To build anyway, use: --skip-verify", :yellow
166
- exit 1
144
+ raise Expressir::ReferentialIntegrityError.new(
145
+ reference_errors,
146
+ message: "Manifest has unresolved dependencies",
147
+ )
167
148
  end
168
149
 
169
150
  say "✓ Manifest verified", :green
@@ -199,9 +180,10 @@ module Expressir
199
180
  end
200
181
 
201
182
  unless errors.empty?
202
- say "Error: Manifest validation failed", :red
203
- errors.each { |e| say " - #{e}", :red }
204
- exit 1
183
+ raise Expressir::ManifestValidationError.new(
184
+ "Manifest validation failed",
185
+ errors: errors,
186
+ )
205
187
  end
206
188
 
207
189
  if options[:verbose] && warnings.any?
@@ -214,18 +196,17 @@ module Expressir
214
196
  else
215
197
  # Auto-resolution mode
216
198
  unless root_schema
217
- say "Error: ROOT_SCHEMA is required when not using --manifest",
218
- :red
219
- say "Usage: expressir package build ROOT_SCHEMA OUTPUT.ler",
220
- :yellow
221
- exit 1
199
+ raise Expressir::MissingRequiredArgumentError.new(
200
+ "ROOT_SCHEMA is required when not using --manifest",
201
+ usage_hint: "expressir package build ROOT_SCHEMA OUTPUT.ler",
202
+ )
222
203
  end
223
204
 
224
205
  unless output
225
- say "Error: OUTPUT path is required", :red
226
- say "Usage: expressir package build ROOT_SCHEMA OUTPUT.ler",
227
- :yellow
228
- exit 1
206
+ raise Expressir::MissingRequiredArgumentError.new(
207
+ "OUTPUT path is required",
208
+ usage_hint: "expressir package build ROOT_SCHEMA OUTPUT.ler",
209
+ )
229
210
  end
230
211
 
231
212
  say "Building LER package from #{root_schema}..." if options[:verbose]
@@ -272,35 +253,21 @@ module Expressir
272
253
  say "Validating repository..." if options[:verbose]
273
254
  validation = repo.validate
274
255
  unless validation[:valid?]
275
- say "✗ Repository validation failed", :red
276
- say ""
277
- errors = validation[:errors] || []
278
- say "Validation errors (#{errors.size}):", :red
279
- errors.each_with_index do |e, i|
280
- error_msg = if e.is_a?(Hash)
281
- # Format hash errors properly
282
- msg = e[:message] || "Unknown error"
283
- type = e[:type] ? "[#{e[:type]}] " : ""
284
- "#{type}#{msg}"
285
- else
286
- # Fallback for string errors
287
- e.to_s
288
- end
289
- say " #{i + 1}. #{error_msg}", :red
290
- if e.is_a?(Hash) && e[:schema]
291
- say " Schema: #{e[:schema]}",
292
- :red
293
- end
294
- if e.is_a?(Hash) && e[:referenced_schema]
295
- say " Referenced: #{e[:referenced_schema]}",
296
- :red
297
- end
298
- if e.is_a?(Hash) && e[:interface_type]
299
- say " Interface: #{e[:interface_type]}",
300
- :red
301
- end
302
- end
303
- exit 1
256
+ raise Expressir::SchemaValidationError.new(
257
+ "Repository validation failed",
258
+ errors: (validation[:errors] || []).map do |e|
259
+ if e.is_a?(Hash)
260
+ msg = e[:message] || "Unknown error"
261
+ type = e[:type] ? "[#{e[:type]}] " : ""
262
+ schema = e[:schema] ? " (schema: #{e[:schema]})" : ""
263
+ ref = e[:referenced_schema] ? " (referenced: #{e[:referenced_schema]})" : ""
264
+ iface = e[:interface_type] ? " (interface: #{e[:interface_type]})" : ""
265
+ "#{type}#{msg}#{schema}#{ref}#{iface}"
266
+ else
267
+ e.to_s
268
+ end
269
+ end,
270
+ )
304
271
  end
305
272
  say " ✓ Validation passed" if options[:verbose]
306
273
  end
@@ -311,10 +278,13 @@ module Expressir
311
278
 
312
279
  say "✓ Package created: #{output}", :green
313
280
  say " Schemas: #{repo.schemas.size}", :green if options[:verbose]
281
+ rescue Expressir::Error
282
+ raise # Re-raise Expressir errors
314
283
  rescue StandardError => e
315
- say "Error building package: #{e.message}", :red
316
- say e.backtrace.join("\n") if options[:verbose]
317
- exit 1
284
+ raise Expressir::PackageBuildError.new(
285
+ "Error building package: #{e.message}",
286
+ command_name: "package build",
287
+ )
318
288
  end
319
289
 
320
290
  desc "info PACKAGE", "Display package metadata and statistics"
@@ -335,9 +305,6 @@ module Expressir
335
305
  enum: ["text", "json", "yaml"],
336
306
  desc: "Output format"
337
307
  def info(package_path)
338
- require_relative "../model/repository"
339
- require_relative "../package/reader"
340
-
341
308
  repo = load_package(package_path)
342
309
  metadata = load_package_metadata(package_path)
343
310
 
@@ -349,9 +316,13 @@ module Expressir
349
316
  else
350
317
  output_text_info(metadata, repo)
351
318
  end
319
+ rescue Expressir::Error
320
+ raise # Re-raise Expressir errors
352
321
  rescue StandardError => e
353
- say "Error reading package info: #{e.message}", :red
354
- exit 1
322
+ raise Expressir::PackageReadError.new(
323
+ "Error reading package info: #{e.message}",
324
+ command_name: "package info",
325
+ )
355
326
  end
356
327
 
357
328
  desc "validate PACKAGE", "Validate package structure and integrity"
@@ -396,8 +367,6 @@ module Expressir
396
367
  enum: ["text", "json", "yaml"],
397
368
  desc: "Output format"
398
369
  def validate(package_path)
399
- require_relative "../model/repository"
400
-
401
370
  repo = load_package(package_path)
402
371
  validation = repo.validate(
403
372
  strict: options[:strict],
@@ -412,10 +381,19 @@ module Expressir
412
381
  output_text_validation(validation)
413
382
  end
414
383
 
415
- exit 1 unless validation[:valid?]
384
+ unless validation[:valid?]
385
+ raise Expressir::PackageValidationError.new(
386
+ "Package validation failed",
387
+ errors: validation[:errors] || [],
388
+ )
389
+ end
390
+ rescue Expressir::Error
391
+ raise # Re-raise Expressir errors
416
392
  rescue StandardError => e
417
- say "Error validating package: #{e.message}", :red
418
- exit 1
393
+ raise Expressir::PackageValidationError.new(
394
+ "Error validating package: #{e.message}",
395
+ command_name: "package validate",
396
+ )
419
397
  end
420
398
 
421
399
  desc "extract PACKAGE", "Extract package contents to directory"
@@ -439,10 +417,10 @@ module Expressir
439
417
  require "fileutils"
440
418
 
441
419
  unless options[:output]
442
- say "Error: output directory is required", :red
443
- say "Usage: expressir package extract PACKAGE --output OUTPUT_DIR",
444
- :yellow
445
- exit 1
420
+ raise Expressir::MissingRequiredArgumentError.new(
421
+ "output directory is required",
422
+ usage_hint: "expressir package extract PACKAGE --output OUTPUT_DIR",
423
+ )
446
424
  end
447
425
 
448
426
  output_dir = options[:output]
@@ -460,9 +438,13 @@ module Expressir
460
438
  say " Files extracted: #{Dir.glob(File.join(output_dir, '**', '*')).select do |f|
461
439
  File.file?(f)
462
440
  end.size}", :green
441
+ rescue Expressir::Error
442
+ raise # Re-raise Expressir errors
463
443
  rescue StandardError => e
464
- say "Error extracting package: #{e.message}", :red
465
- exit 1
444
+ raise Expressir::PackageExtractError.new(
445
+ "Error extracting package: #{e.message}",
446
+ command_name: "package extract",
447
+ )
466
448
  end
467
449
 
468
450
  desc "list PACKAGE", "List all elements of a specific type"
@@ -522,9 +504,13 @@ module Expressir
522
504
  output_text_list(results, options[:type], options[:schema],
523
505
  options[:category])
524
506
  end
507
+ rescue Expressir::Error
508
+ raise # Re-raise Expressir errors
525
509
  rescue StandardError => e
526
- say "Error listing elements: #{e.message}", :red
527
- exit 1
510
+ raise Expressir::PackageListError.new(
511
+ "Error listing elements: #{e.message}",
512
+ command_name: "package list",
513
+ )
528
514
  end
529
515
 
530
516
  desc "search PACKAGE PATTERN", "Search for elements matching a pattern"
@@ -602,9 +588,13 @@ module Expressir
602
588
  else
603
589
  output_text_search_results(results, pattern)
604
590
  end
591
+ rescue Expressir::Error
592
+ raise # Re-raise Expressir errors
605
593
  rescue StandardError => e
606
- say "Error searching: #{e.message}", :red
607
- exit 1
594
+ raise Expressir::PackageSearchError.new(
595
+ "Error searching: #{e.message}",
596
+ command_name: "package search",
597
+ )
608
598
  end
609
599
  desc "tree PACKAGE", "Display hierarchical tree view of package contents"
610
600
  long_desc <<~DESC
@@ -669,9 +659,13 @@ module Expressir
669
659
  is_last_schema = idx == schemas.size - 1
670
660
  display_schema_tree(schema, is_last_schema, "", 1)
671
661
  end
662
+ rescue Expressir::Error
663
+ raise # Re-raise Expressir errors
672
664
  rescue StandardError => e
673
- say "Error displaying tree: #{e.message}", :red
674
- exit 1
665
+ raise Expressir::PackageTreeError.new(
666
+ "Error displaying tree: #{e.message}",
667
+ command_name: "package tree",
668
+ )
675
669
  end
676
670
 
677
671
  private
@@ -694,8 +688,7 @@ module Expressir
694
688
  # @return [Model::Repository] Loaded repository
695
689
  def load_package(package_path)
696
690
  unless File.exist?(package_path)
697
- say "Package file not found: #{package_path}", :red
698
- exit 1
691
+ raise Expressir::PackageNotFoundError.new(package_path)
699
692
  end
700
693
 
701
694
  Expressir::Model::Repository.from_package(package_path)
@@ -706,7 +699,6 @@ module Expressir
706
699
  # @return [Package::Metadata] Package metadata
707
700
  def load_package_metadata(package_path)
708
701
  require "zip"
709
- require_relative "../package/metadata"
710
702
 
711
703
  Zip::File.open(package_path) do |zip|
712
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
@@ -559,8 +559,7 @@ module Expressir
559
559
 
560
560
  def validate_from_manifest(manifest_path)
561
561
  unless File.exist?(manifest_path)
562
- say "Error: Manifest file not found: #{manifest_path}", :red
563
- exit 1
562
+ raise Expressir::ManifestNotFoundError.new(manifest_path)
564
563
  end
565
564
 
566
565
  say "Loading manifest: #{manifest_path}..." if options[:verbose]
@@ -574,8 +573,7 @@ module Expressir
574
573
  end
575
574
 
576
575
  if exp_files.empty?
577
- say "Error: No valid schema paths found in manifest", :red
578
- exit 1
576
+ raise Expressir::NoValidSchemaPathsError.new("No valid schema paths found in manifest")
579
577
  end
580
578
 
581
579
  say "Validating #{exp_files.size} schema(s) from manifest for ASCII compliance..." if options[:verbose]
@@ -16,8 +16,7 @@ module Expressir
16
16
 
17
17
  def validate_from_manifest(manifest_path)
18
18
  unless File.exist?(manifest_path)
19
- say "Error: Manifest file not found: #{manifest_path}", :red
20
- exit 1
19
+ raise Expressir::ManifestNotFoundError.new(manifest_path)
21
20
  end
22
21
 
23
22
  say "Loading manifest: #{manifest_path}..." if options[:verbose]
@@ -29,8 +28,7 @@ module Expressir
29
28
  paths = manifest.schemas.map(&:path).reject { |p| p.nil? || p.empty? }
30
29
 
31
30
  if paths.empty?
32
- say "Error: No valid schema paths found in manifest", :red
33
- exit 1
31
+ raise Expressir::NoValidSchemaPathsError.new("No valid schema paths found in manifest")
34
32
  end
35
33
 
36
34
  say "Validating #{paths.size} schema(s) from manifest..." if options[:verbose]
@@ -60,7 +58,12 @@ module Expressir
60
58
  print_validation_errors(:failed_to_parse, no_valid)
61
59
  print_validation_errors(:missing_version_string, no_version)
62
60
 
63
- exit 1 unless [no_valid, no_version].all?(&:empty?)
61
+ unless [no_valid, no_version].all?(&:empty?)
62
+ raise Expressir::SchemaValidationError.new(
63
+ "Schema validation failed",
64
+ errors: no_valid + no_version,
65
+ )
66
+ end
64
67
 
65
68
  say "Validation passed for all EXPRESS schemas."
66
69
  end
@@ -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