expressir 2.2.1 → 2.3.1
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 +681 -78
- data/Gemfile +4 -1
- data/README.adoc +63 -26
- data/benchmark/srl_benchmark.rb +399 -0
- data/benchmark/srl_native_benchmark.rb +146 -0
- data/benchmark/srl_ruby_benchmark.rb +132 -0
- data/expressir.gemspec +3 -2
- data/lib/expressir/benchmark.rb +1 -1
- data/lib/expressir/changes/item_change.rb +0 -2
- data/lib/expressir/changes/mapping_change.rb +0 -2
- data/lib/expressir/changes/schema_change.rb +0 -3
- data/lib/expressir/changes/version_change.rb +0 -4
- data/lib/expressir/changes.rb +5 -6
- data/lib/expressir/cli.rb +10 -24
- data/lib/expressir/commands/changes.rb +0 -2
- data/lib/expressir/commands/changes_import_eengine.rb +2 -5
- data/lib/expressir/commands/changes_validate.rb +0 -2
- data/lib/expressir/commands/format.rb +1 -1
- data/lib/expressir/commands/manifest.rb +0 -7
- data/lib/expressir/commands/package.rb +16 -29
- data/lib/expressir/commands/validate.rb +0 -2
- data/lib/expressir/commands/validate_ascii.rb +0 -1
- data/lib/expressir/commands/validate_load.rb +1 -1
- 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 -5
- data/lib/expressir/eengine/changes_section.rb +1 -4
- data/lib/expressir/eengine/compare_report.rb +1 -13
- data/lib/expressir/eengine/mim_compare_report.rb +1 -5
- data/lib/expressir/eengine/modified_object.rb +1 -3
- data/lib/expressir/eengine.rb +9 -0
- data/lib/expressir/errors.rb +3 -5
- data/lib/expressir/express/builder.rb +82 -24
- 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 +5 -18
- 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 +11 -13
- data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
- data/lib/expressir/express/builders/expression_builder.rb +25 -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 +18 -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 +174 -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 +266 -47
- data/lib/expressir/express/pretty_formatter.rb +68 -47
- data/lib/expressir/express/remark_attacher.rb +254 -162
- data/lib/expressir/express/streaming_builder.rb +0 -3
- data/lib/expressir/express/transformer/remark_handling.rb +1 -3
- 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 +39 -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 +76 -41
- data/lib/expressir/model/repository_validator.rb +0 -2
- data/lib/expressir/model/search_engine.rb +12 -35
- 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 +35 -4
- data/lib/expressir/package/metadata.rb +0 -2
- data/lib/expressir/package/reader.rb +0 -1
- data/lib/expressir/package.rb +8 -0
- data/lib/expressir/schema_manifest.rb +5 -7
- data/lib/expressir/schema_manifest_entry.rb +3 -5
- data/lib/expressir/transformer.rb +7 -0
- data/lib/expressir/version.rb +1 -1
- data/lib/expressir.rb +23 -171
- metadata +46 -6
- 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
|
|
@@ -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,9 +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
|
-
|
|
7
3
|
module Expressir
|
|
8
4
|
module Eengine
|
|
9
5
|
# Represents an Eengine ARM comparison XML report
|
|
@@ -13,7 +9,7 @@ module Expressir
|
|
|
13
9
|
attribute :deletions, ChangesSection
|
|
14
10
|
|
|
15
11
|
xml do
|
|
16
|
-
|
|
12
|
+
element "arm.changes"
|
|
17
13
|
map_element "arm.modifications", to: :modifications
|
|
18
14
|
map_element "arm.additions", to: :additions
|
|
19
15
|
map_element "arm.deletions", to: :deletions
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "lutaml/model"
|
|
4
|
-
require_relative "modified_object"
|
|
5
|
-
|
|
6
3
|
module Expressir
|
|
7
4
|
module Eengine
|
|
8
5
|
# Represents a section of changes (modifications, additions, or deletions)
|
|
@@ -11,7 +8,7 @@ module Expressir
|
|
|
11
8
|
attribute :modified_objects, ModifiedObject, collection: true
|
|
12
9
|
|
|
13
10
|
xml do
|
|
14
|
-
|
|
11
|
+
element "changes.section"
|
|
15
12
|
map_element "modified.object", to: :modified_objects
|
|
16
13
|
end
|
|
17
14
|
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,9 +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
|
-
|
|
7
3
|
module Expressir
|
|
8
4
|
module Eengine
|
|
9
5
|
# Represents an Eengine MIM comparison XML report
|
|
@@ -13,7 +9,7 @@ module Expressir
|
|
|
13
9
|
attribute :deletions, ChangesSection
|
|
14
10
|
|
|
15
11
|
xml do
|
|
16
|
-
|
|
12
|
+
element "mim.changes"
|
|
17
13
|
map_element "mim.modifications", to: :modifications
|
|
18
14
|
map_element "mim.additions", to: :additions
|
|
19
15
|
map_element "mim.deletions", to: :deletions
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "lutaml/model"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Eengine
|
|
7
5
|
# Represents a modified EXPRESS object in an Eengine comparison report
|
|
@@ -12,7 +10,7 @@ module Expressir
|
|
|
12
10
|
attribute :description, :string
|
|
13
11
|
|
|
14
12
|
xml do
|
|
15
|
-
|
|
13
|
+
element "modified.object"
|
|
16
14
|
map_attribute "type", to: :type
|
|
17
15
|
map_attribute "name", to: :name
|
|
18
16
|
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
|
data/lib/expressir/errors.rb
CHANGED
|
@@ -80,7 +80,8 @@ module Expressir
|
|
|
80
80
|
class ReferentialIntegrityError < ValidationError
|
|
81
81
|
attr_reader :unresolved_references
|
|
82
82
|
|
|
83
|
-
def initialize(unresolved_references,
|
|
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
|
|
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.
|
|
@@ -28,6 +26,21 @@ module Expressir
|
|
|
28
26
|
# @param source [String, nil] The original source code
|
|
29
27
|
# @param include_source [Boolean, nil] Whether to include source
|
|
30
28
|
# @return [Model::ModelElement] The built model object
|
|
29
|
+
# Operator tokens that return nil (separators, punctuation)
|
|
30
|
+
# When these appear as the first key in a multi-key hash, they should be
|
|
31
|
+
# skipped in favor of the content key. This handles grammar patterns like
|
|
32
|
+
# `element >> (op_comma >> element).repeat` which produce
|
|
33
|
+
# {:op_comma => ..., :element => {...}}.
|
|
34
|
+
OPERATOR_TOKENS = Set.new(%i[
|
|
35
|
+
op_comma op_colon op_decl op_delim op_leftparen op_rightparen
|
|
36
|
+
op_leftbracket op_rightbracket op_left_curly_brace op_right_curly_brace
|
|
37
|
+
op_period op_pipe op_double_backslash op_double_pipe op_double_asterisk
|
|
38
|
+
op_asterisk op_slash op_plus op_minus op_less_equal op_greater_equal
|
|
39
|
+
op_less_greater op_less_than op_greater_than op_equals
|
|
40
|
+
op_colon_less_greater_colon op_colon_equals_colon
|
|
41
|
+
op_query_begin op_query_end op_question_mark
|
|
42
|
+
]).freeze
|
|
43
|
+
|
|
31
44
|
def build(ast, source: nil, include_source: nil)
|
|
32
45
|
return nil unless ast
|
|
33
46
|
|
|
@@ -46,25 +59,41 @@ module Expressir
|
|
|
46
59
|
snake_data = fast_convert_keys(node_data)
|
|
47
60
|
|
|
48
61
|
builder = @register[handler_key]
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
if builder
|
|
63
|
+
result = builder.call(snake_data)
|
|
64
|
+
|
|
65
|
+
# Fast path: single-key hash or non-nil result
|
|
66
|
+
if !result.nil? || ast.keys.length <= 1
|
|
67
|
+
attach_source_info(result, node_data)
|
|
68
|
+
return result
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Slow path: operator token returned nil in multi-key hash.
|
|
72
|
+
# Try other keys for actual content. This handles
|
|
73
|
+
# {:op_comma => ..., :element => {...}} where the first key
|
|
74
|
+
# is an operator separator rather than a content key.
|
|
75
|
+
if OPERATOR_TOKENS.include?(handler_key)
|
|
76
|
+
ast.each_key do |key|
|
|
77
|
+
next if key == node_type
|
|
78
|
+
|
|
79
|
+
h_key = cached_snake_case(key)
|
|
80
|
+
h_builder = @register[h_key]
|
|
81
|
+
next unless h_builder
|
|
82
|
+
|
|
83
|
+
n_data = ast[key]
|
|
84
|
+
s_data = fast_convert_keys(n_data)
|
|
85
|
+
result = h_builder.call(s_data)
|
|
86
|
+
|
|
87
|
+
unless result.nil?
|
|
88
|
+
attach_source_info(result, n_data)
|
|
89
|
+
return result
|
|
90
|
+
end
|
|
63
91
|
end
|
|
64
92
|
end
|
|
93
|
+
else
|
|
94
|
+
raise Error::UnknownNodeTypeError, node_type
|
|
65
95
|
end
|
|
66
|
-
|
|
67
|
-
result
|
|
96
|
+
nil
|
|
68
97
|
when Array
|
|
69
98
|
ast.map do |item|
|
|
70
99
|
build(item)
|
|
@@ -85,7 +114,9 @@ module Expressir
|
|
|
85
114
|
|
|
86
115
|
result = build(ast)
|
|
87
116
|
|
|
88
|
-
if
|
|
117
|
+
# Only attach remarks if include_source is explicitly true
|
|
118
|
+
# (nil means use default behavior - attach remarks)
|
|
119
|
+
if source && result && include_source != false
|
|
89
120
|
attacher = RemarkAttacher.new(source)
|
|
90
121
|
attacher.attach(result)
|
|
91
122
|
end
|
|
@@ -110,14 +141,29 @@ module Expressir
|
|
|
110
141
|
build(ast)
|
|
111
142
|
end
|
|
112
143
|
|
|
144
|
+
# Normalize a value to an Array for iteration.
|
|
145
|
+
# Handles: nil → [], Parsanol::Slice → [], Array → Array, other → [other]
|
|
146
|
+
def ensure_array(value)
|
|
147
|
+
return [] if value.nil?
|
|
148
|
+
return [] if value.is_a?(Parsanol::Slice)
|
|
149
|
+
|
|
150
|
+
value.is_a?(Array) ? value : [value]
|
|
151
|
+
end
|
|
152
|
+
|
|
113
153
|
# Build children (array of AST nodes)
|
|
114
154
|
# Optimized to avoid intermediate array allocations
|
|
115
155
|
def build_children(ast_array)
|
|
116
|
-
return []
|
|
156
|
+
return [] if ast_array.nil?
|
|
157
|
+
|
|
158
|
+
# Handle Parsanol::Slice (empty Slices from optional rules)
|
|
159
|
+
# Convert to empty Array
|
|
160
|
+
if ast_array.is_a?(Parsanol::Slice)
|
|
161
|
+
return []
|
|
162
|
+
end
|
|
117
163
|
|
|
118
164
|
# Handle single element (common case)
|
|
119
165
|
unless ast_array.is_a?(Array)
|
|
120
|
-
return
|
|
166
|
+
return [build(ast_array)].compact
|
|
121
167
|
end
|
|
122
168
|
|
|
123
169
|
# Build result in single pass, avoiding flatten/compact/map chain
|
|
@@ -125,6 +171,11 @@ module Expressir
|
|
|
125
171
|
ast_array.each do |item|
|
|
126
172
|
next if item.nil?
|
|
127
173
|
|
|
174
|
+
# Empty Slices from optional rules should be treated as empty arrays
|
|
175
|
+
if item.is_a?(Parsanol::Slice)
|
|
176
|
+
next
|
|
177
|
+
end
|
|
178
|
+
|
|
128
179
|
case item
|
|
129
180
|
when Array
|
|
130
181
|
item.each do |sub|
|
|
@@ -310,6 +361,16 @@ module Expressir
|
|
|
310
361
|
}
|
|
311
362
|
end
|
|
312
363
|
|
|
364
|
+
def attach_source_info(result, data)
|
|
365
|
+
return unless @source && result.is_a?(Model::ModelElement)
|
|
366
|
+
|
|
367
|
+
source_info = extract_source_info(data)
|
|
368
|
+
return unless source_info
|
|
369
|
+
|
|
370
|
+
result.source_offset = source_info[:offset]
|
|
371
|
+
result.source = source_info[:text] if @include_source
|
|
372
|
+
end
|
|
373
|
+
|
|
313
374
|
def find_slice(data, depth = 0)
|
|
314
375
|
return nil if depth > 10
|
|
315
376
|
|
|
@@ -345,6 +406,3 @@ module Expressir
|
|
|
345
406
|
end
|
|
346
407
|
end
|
|
347
408
|
end
|
|
348
|
-
|
|
349
|
-
# Top-level alias for convenience in builder files
|
|
350
|
-
Builder = Expressir::Express::Builder
|