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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +254 -77
- data/Gemfile +4 -1
- data/README.adoc +63 -26
- data/benchmark/srl_benchmark.rb +386 -0
- data/benchmark/srl_native_benchmark.rb +142 -0
- data/benchmark/srl_ruby_benchmark.rb +130 -0
- data/expressir.gemspec +4 -2
- data/lib/expressir/benchmark.rb +1 -1
- data/lib/expressir/changes/item_change.rb +0 -1
- data/lib/expressir/changes/mapping_change.rb +0 -1
- data/lib/expressir/changes/schema_change.rb +0 -2
- data/lib/expressir/changes/version_change.rb +0 -3
- data/lib/expressir/changes.rb +5 -6
- data/lib/expressir/cli.rb +10 -24
- data/lib/expressir/commands/base.rb +2 -9
- data/lib/expressir/commands/changes.rb +0 -2
- data/lib/expressir/commands/changes_import_eengine.rb +0 -3
- data/lib/expressir/commands/changes_validate.rb +0 -2
- data/lib/expressir/commands/format.rb +5 -3
- data/lib/expressir/commands/manifest.rb +0 -7
- data/lib/expressir/commands/package.rb +93 -101
- data/lib/expressir/commands/validate.rb +0 -2
- data/lib/expressir/commands/validate_ascii.rb +2 -4
- data/lib/expressir/commands/validate_load.rb +8 -5
- data/lib/expressir/commands.rb +20 -0
- data/lib/expressir/config.rb +0 -2
- data/lib/expressir/coverage.rb +11 -4
- data/lib/expressir/eengine/arm_compare_report.rb +1 -4
- data/lib/expressir/eengine/changes_section.rb +1 -3
- data/lib/expressir/eengine/compare_report.rb +1 -13
- data/lib/expressir/eengine/mim_compare_report.rb +1 -4
- data/lib/expressir/eengine/modified_object.rb +1 -2
- data/lib/expressir/eengine.rb +9 -0
- data/lib/expressir/errors.rb +113 -0
- data/lib/expressir/express/builder.rb +22 -7
- data/lib/expressir/express/builder_registry.rb +411 -0
- data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
- data/lib/expressir/express/builders/built_in_builder.rb +1 -16
- data/lib/expressir/express/builders/constant_builder.rb +4 -19
- data/lib/expressir/express/builders/declaration_builder.rb +0 -4
- data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
- data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
- data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
- data/lib/expressir/express/builders/entity_decl_builder.rb +7 -13
- data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
- data/lib/expressir/express/builders/expression_builder.rb +31 -67
- data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
- data/lib/expressir/express/builders/interface_builder.rb +0 -20
- data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
- data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
- data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
- data/lib/expressir/express/builders/literal_builder.rb +1 -15
- data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
- data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
- data/lib/expressir/express/builders/reference_builder.rb +1 -10
- data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
- data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
- data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
- data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
- data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
- data/lib/expressir/express/builders/statement_builder.rb +4 -32
- data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
- data/lib/expressir/express/builders/syntax_builder.rb +60 -7
- data/lib/expressir/express/builders/type_builder.rb +3 -45
- data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
- data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
- data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
- data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
- data/lib/expressir/express/builders.rb +47 -35
- data/lib/expressir/express/error.rb +0 -3
- data/lib/expressir/express/formatter.rb +17 -19
- data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
- data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
- data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
- data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
- data/lib/expressir/express/formatters/references_formatter.rb +34 -32
- data/lib/expressir/express/formatters/remark_formatter.rb +176 -209
- data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
- data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
- data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
- data/lib/expressir/express/formatters.rb +22 -0
- data/lib/expressir/express/parser.rb +40 -41
- data/lib/expressir/express/pretty_formatter.rb +68 -47
- data/lib/expressir/express/remark_attacher.rb +210 -147
- data/lib/expressir/express/streaming_builder.rb +0 -3
- data/lib/expressir/express/transformer/remark_handling.rb +1 -2
- data/lib/expressir/express.rb +29 -0
- data/lib/expressir/manifest/resolver.rb +0 -3
- data/lib/expressir/manifest/validator.rb +0 -3
- data/lib/expressir/manifest.rb +6 -0
- data/lib/expressir/model/cache.rb +1 -1
- data/lib/expressir/model/concerns.rb +19 -0
- data/lib/expressir/model/data_types/aggregate.rb +1 -1
- data/lib/expressir/model/data_types/array.rb +1 -1
- data/lib/expressir/model/data_types/bag.rb +1 -1
- data/lib/expressir/model/data_types/binary.rb +1 -1
- data/lib/expressir/model/data_types/boolean.rb +1 -1
- data/lib/expressir/model/data_types/enumeration.rb +1 -1
- data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
- data/lib/expressir/model/data_types/generic.rb +1 -1
- data/lib/expressir/model/data_types/generic_entity.rb +1 -1
- data/lib/expressir/model/data_types/integer.rb +1 -1
- data/lib/expressir/model/data_types/list.rb +1 -1
- data/lib/expressir/model/data_types/logical.rb +1 -1
- data/lib/expressir/model/data_types/number.rb +1 -1
- data/lib/expressir/model/data_types/real.rb +1 -1
- data/lib/expressir/model/data_types/select.rb +1 -1
- data/lib/expressir/model/data_types/set.rb +1 -1
- data/lib/expressir/model/data_types/string.rb +1 -1
- data/lib/expressir/model/data_types.rb +25 -0
- data/lib/expressir/model/declarations/attribute.rb +1 -1
- data/lib/expressir/model/declarations/constant.rb +1 -1
- data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
- data/lib/expressir/model/declarations/entity.rb +4 -1
- data/lib/expressir/model/declarations/function.rb +3 -1
- data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
- data/lib/expressir/model/declarations/interface.rb +1 -1
- data/lib/expressir/model/declarations/interface_item.rb +1 -1
- data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
- data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
- data/lib/expressir/model/declarations/parameter.rb +1 -1
- data/lib/expressir/model/declarations/procedure.rb +3 -1
- data/lib/expressir/model/declarations/remark_item.rb +1 -1
- data/lib/expressir/model/declarations/rule.rb +4 -1
- data/lib/expressir/model/declarations/schema.rb +2 -1
- data/lib/expressir/model/declarations/schema_version.rb +1 -1
- data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
- data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
- data/lib/expressir/model/declarations/type.rb +4 -1
- data/lib/expressir/model/declarations/unique_rule.rb +1 -1
- data/lib/expressir/model/declarations/variable.rb +1 -1
- data/lib/expressir/model/declarations/where_rule.rb +1 -1
- data/lib/expressir/model/declarations.rb +31 -0
- data/lib/expressir/model/dependency_resolver.rb +0 -2
- data/lib/expressir/model/exp_file.rb +38 -0
- data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
- data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
- data/lib/expressir/model/expressions/binary_expression.rb +1 -1
- data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
- data/lib/expressir/model/expressions/function_call.rb +1 -1
- data/lib/expressir/model/expressions/interval.rb +1 -1
- data/lib/expressir/model/expressions/query_expression.rb +1 -1
- data/lib/expressir/model/expressions/unary_expression.rb +1 -1
- data/lib/expressir/model/expressions.rb +18 -0
- data/lib/expressir/model/identifier.rb +5 -1
- data/lib/expressir/model/indexes.rb +11 -0
- data/lib/expressir/model/literals/binary.rb +1 -1
- data/lib/expressir/model/literals/integer.rb +1 -1
- data/lib/expressir/model/literals/logical.rb +1 -1
- data/lib/expressir/model/literals/real.rb +1 -1
- data/lib/expressir/model/literals/string.rb +1 -1
- data/lib/expressir/model/literals.rb +13 -0
- data/lib/expressir/model/model_element.rb +7 -15
- data/lib/expressir/model/references/attribute_reference.rb +1 -1
- data/lib/expressir/model/references/group_reference.rb +1 -1
- data/lib/expressir/model/references/index_reference.rb +1 -1
- data/lib/expressir/model/references/simple_reference.rb +1 -1
- data/lib/expressir/model/references.rb +12 -0
- data/lib/expressir/model/remark_info.rb +1 -7
- data/lib/expressir/model/repository.rb +72 -36
- data/lib/expressir/model/repository_validator.rb +0 -2
- data/lib/expressir/model/search_engine.rb +6 -30
- data/lib/expressir/model/statements/alias.rb +1 -1
- data/lib/expressir/model/statements/assignment.rb +1 -1
- data/lib/expressir/model/statements/case.rb +1 -1
- data/lib/expressir/model/statements/case_action.rb +1 -1
- data/lib/expressir/model/statements/compound.rb +1 -1
- data/lib/expressir/model/statements/escape.rb +1 -1
- data/lib/expressir/model/statements/if.rb +1 -1
- data/lib/expressir/model/statements/null.rb +1 -1
- data/lib/expressir/model/statements/procedure_call.rb +1 -1
- data/lib/expressir/model/statements/repeat.rb +1 -1
- data/lib/expressir/model/statements/return.rb +1 -1
- data/lib/expressir/model/statements/skip.rb +1 -1
- data/lib/expressir/model/statements.rb +20 -0
- data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
- data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
- data/lib/expressir/model/supertype_expressions.rb +12 -0
- data/lib/expressir/model.rb +28 -4
- data/lib/expressir/package/builder.rb +33 -4
- data/lib/expressir/package/metadata.rb +0 -1
- data/lib/expressir/package/reader.rb +0 -1
- data/lib/expressir/package.rb +8 -0
- data/lib/expressir/schema_manifest.rb +5 -6
- data/lib/expressir/schema_manifest_entry.rb +3 -4
- data/lib/expressir/transformer.rb +7 -0
- data/lib/expressir/version.rb +1 -1
- data/lib/expressir.rb +23 -173
- metadata +64 -9
- 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
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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
|
-
|
|
354
|
-
|
|
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
|
-
|
|
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
|
-
|
|
418
|
-
|
|
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
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
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
|
-
|
|
465
|
-
|
|
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
|
-
|
|
527
|
-
|
|
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
|
-
|
|
607
|
-
|
|
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
|
-
|
|
674
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
data/lib/expressir/config.rb
CHANGED
data/lib/expressir/coverage.rb
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
316
|
-
schema_or_repo.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|