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
|
@@ -84,10 +84,10 @@ module Expressir
|
|
|
84
84
|
# @param max_depth [Integer] Maximum path depth (1=schema, 2=entity, 3=attribute)
|
|
85
85
|
# @param options [Hash] Additional search options
|
|
86
86
|
# @return [Array<Hash>] Filtered results
|
|
87
|
-
def search_with_depth(pattern:, max_depth:, **
|
|
87
|
+
def search_with_depth(pattern:, max_depth:, **)
|
|
88
88
|
return [] if max_depth <= 0
|
|
89
89
|
|
|
90
|
-
results = search(pattern: pattern, **
|
|
90
|
+
results = search(pattern: pattern, **)
|
|
91
91
|
filter_by_depth(results, max_depth)
|
|
92
92
|
end
|
|
93
93
|
|
|
@@ -97,8 +97,8 @@ module Expressir
|
|
|
97
97
|
# @param boost_prefix [Integer] Score boost for prefix matches
|
|
98
98
|
# @param options [Hash] Additional search options
|
|
99
99
|
# @return [Array<Hash>] Ranked results with :relevance_score
|
|
100
|
-
def search_ranked(pattern:, boost_exact: 10, boost_prefix: 5, **
|
|
101
|
-
results = search(pattern: pattern, **
|
|
100
|
+
def search_ranked(pattern:, boost_exact: 10, boost_prefix: 5, **)
|
|
101
|
+
results = search(pattern: pattern, **)
|
|
102
102
|
rank_results(results, pattern, boost_exact, boost_prefix)
|
|
103
103
|
end
|
|
104
104
|
|
|
@@ -108,8 +108,8 @@ module Expressir
|
|
|
108
108
|
# @param ranked [Boolean] Enable relevance ranking
|
|
109
109
|
# @param options [Hash] Additional filters and search options
|
|
110
110
|
# @return [Array<Hash>] Filtered and optionally ranked results
|
|
111
|
-
def search_advanced(pattern:, max_depth: nil, ranked: false, **
|
|
112
|
-
results = search(pattern: pattern, **
|
|
111
|
+
def search_advanced(pattern:, max_depth: nil, ranked: false, **)
|
|
112
|
+
results = search(pattern: pattern, **)
|
|
113
113
|
|
|
114
114
|
results = filter_by_depth(results, max_depth) if max_depth
|
|
115
115
|
results = rank_results(results, pattern, 10, 5) if ranked
|
|
@@ -352,9 +352,7 @@ module Expressir
|
|
|
352
352
|
return [] unless schemas
|
|
353
353
|
|
|
354
354
|
entities = collect_from_schemas(schemas, :entities)
|
|
355
|
-
entities.flat_map { |e| e.attributes || [] }.
|
|
356
|
-
attr.is_a?(Declarations::DerivedAttribute)
|
|
357
|
-
end
|
|
355
|
+
entities.flat_map { |e| e.attributes || [] }.grep(Declarations::DerivedAttribute)
|
|
358
356
|
end
|
|
359
357
|
|
|
360
358
|
# Collect inverse attributes from entities
|
|
@@ -365,9 +363,7 @@ module Expressir
|
|
|
365
363
|
return [] unless schemas
|
|
366
364
|
|
|
367
365
|
entities = collect_from_schemas(schemas, :entities)
|
|
368
|
-
entities.flat_map { |e| e.attributes || [] }.
|
|
369
|
-
attr.is_a?(Declarations::InverseAttribute)
|
|
370
|
-
end
|
|
366
|
+
entities.flat_map { |e| e.attributes || [] }.grep(Declarations::InverseAttribute)
|
|
371
367
|
end
|
|
372
368
|
|
|
373
369
|
# Collect parameters from functions and procedures
|
|
@@ -488,31 +484,12 @@ module Expressir
|
|
|
488
484
|
def find_parent_schema(element)
|
|
489
485
|
current = element
|
|
490
486
|
while current
|
|
491
|
-
|
|
492
|
-
# A schema has no parent or is explicitly a Schema type
|
|
493
|
-
begin
|
|
494
|
-
# First check using is_a? for real objects
|
|
495
|
-
if current.is_a?(Declarations::Schema)
|
|
496
|
-
return current
|
|
497
|
-
end
|
|
487
|
+
return current if current.is_a?(Declarations::Schema)
|
|
498
488
|
|
|
499
|
-
|
|
500
|
-
if !current.respond_to?(:parent) || current.parent.nil?
|
|
501
|
-
# This might be a schema - check if it has an id
|
|
502
|
-
if current.respond_to?(:id) && current.id
|
|
503
|
-
return current
|
|
504
|
-
end
|
|
505
|
-
end
|
|
506
|
-
rescue StandardError
|
|
507
|
-
# Ignore errors from type checking
|
|
508
|
-
end
|
|
509
|
-
|
|
510
|
-
current = begin
|
|
511
|
-
current.parent
|
|
512
|
-
rescue StandardError
|
|
513
|
-
nil
|
|
514
|
-
end
|
|
489
|
+
current = current.parent
|
|
515
490
|
end
|
|
491
|
+
rescue StandardError
|
|
492
|
+
# Handle objects that don't fully implement the interface
|
|
516
493
|
nil
|
|
517
494
|
end
|
|
518
495
|
|
|
@@ -8,7 +8,7 @@ module Expressir
|
|
|
8
8
|
|
|
9
9
|
attribute :expression, ModelElement
|
|
10
10
|
attribute :statements, ModelElement, collection: true
|
|
11
|
-
attribute :_class, :string, default: -> {
|
|
11
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
12
12
|
|
|
13
13
|
key_value do
|
|
14
14
|
map "_class", to: :_class, render_default: true
|
|
@@ -6,7 +6,7 @@ module Expressir
|
|
|
6
6
|
class Assignment < ModelElement
|
|
7
7
|
attribute :ref, ModelElement
|
|
8
8
|
attribute :expression, ModelElement
|
|
9
|
-
attribute :_class, :string, default: -> {
|
|
9
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
10
10
|
|
|
11
11
|
key_value do
|
|
12
12
|
map "_class", to: :_class, render_default: true
|
|
@@ -7,7 +7,7 @@ module Expressir
|
|
|
7
7
|
attribute :expression, ModelElement
|
|
8
8
|
attribute :actions, CaseAction, collection: true
|
|
9
9
|
attribute :otherwise_statement, ModelElement
|
|
10
|
-
attribute :_class, :string, default: -> {
|
|
10
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
11
11
|
|
|
12
12
|
key_value do
|
|
13
13
|
map "_class", to: :_class, render_default: true
|
|
@@ -6,7 +6,7 @@ module Expressir
|
|
|
6
6
|
class CaseAction < ModelElement
|
|
7
7
|
attribute :labels, ModelElement, collection: true
|
|
8
8
|
attribute :statement, ModelElement
|
|
9
|
-
attribute :_class, :string, default: -> {
|
|
9
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
10
10
|
|
|
11
11
|
key_value do
|
|
12
12
|
map "_class", to: :_class, render_default: true
|
|
@@ -5,7 +5,7 @@ module Expressir
|
|
|
5
5
|
# - section 13.5 Compound statement
|
|
6
6
|
class Compound < ModelElement
|
|
7
7
|
attribute :statements, ModelElement, collection: true
|
|
8
|
-
attribute :_class, :string, default: -> {
|
|
8
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
9
9
|
|
|
10
10
|
key_value do
|
|
11
11
|
map "_class", to: :_class, render_default: true
|
|
@@ -4,7 +4,7 @@ module Expressir
|
|
|
4
4
|
# Specified in ISO 10303-11:2004
|
|
5
5
|
# - section 13.6 Escape statement
|
|
6
6
|
class Escape < ModelElement
|
|
7
|
-
attribute :_class, :string, default: -> {
|
|
7
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
8
8
|
|
|
9
9
|
key_value do
|
|
10
10
|
map "_class", to: :_class, render_default: true
|
|
@@ -7,7 +7,7 @@ module Expressir
|
|
|
7
7
|
attribute :expression, ModelElement
|
|
8
8
|
attribute :statements, ModelElement, collection: true
|
|
9
9
|
attribute :else_statements, ModelElement, collection: true
|
|
10
|
-
attribute :_class, :string, default: -> {
|
|
10
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
11
11
|
|
|
12
12
|
key_value do
|
|
13
13
|
map "_class", to: :_class, render_default: true
|
|
@@ -4,7 +4,7 @@ module Expressir
|
|
|
4
4
|
# Specified in ISO 10303-11:2004
|
|
5
5
|
# - section 13.1 Null (statement)
|
|
6
6
|
class Null < ModelElement
|
|
7
|
-
attribute :_class, :string, default: -> {
|
|
7
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
8
8
|
|
|
9
9
|
key_value do
|
|
10
10
|
map "_class", to: :_class, render_default: true
|
|
@@ -6,7 +6,7 @@ module Expressir
|
|
|
6
6
|
class ProcedureCall < ModelElement
|
|
7
7
|
attribute :procedure, ModelElement
|
|
8
8
|
attribute :parameters, ModelElement, collection: true
|
|
9
|
-
attribute :_class, :string, default: -> {
|
|
9
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
10
10
|
|
|
11
11
|
key_value do
|
|
12
12
|
map "_class", to: :_class, render_default: true
|
|
@@ -12,7 +12,7 @@ module Expressir
|
|
|
12
12
|
attribute :while_expression, ModelElement
|
|
13
13
|
attribute :until_expression, ModelElement
|
|
14
14
|
attribute :statements, ModelElement, collection: true
|
|
15
|
-
attribute :_class, :string, default: -> {
|
|
15
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
16
16
|
|
|
17
17
|
key_value do
|
|
18
18
|
map "_class", to: :_class, render_default: true
|
|
@@ -5,7 +5,7 @@ module Expressir
|
|
|
5
5
|
# - section 13.10 Return statement
|
|
6
6
|
class Return < ModelElement
|
|
7
7
|
attribute :expression, ModelElement
|
|
8
|
-
attribute :_class, :string, default: -> {
|
|
8
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
9
9
|
|
|
10
10
|
key_value do
|
|
11
11
|
map "_class", to: :_class, render_default: true
|
|
@@ -4,7 +4,7 @@ module Expressir
|
|
|
4
4
|
# Specified in ISO 10303-11:2004
|
|
5
5
|
# - section 13.11 Skip statement
|
|
6
6
|
class Skip < ModelElement
|
|
7
|
-
attribute :_class, :string, default: -> {
|
|
7
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
8
8
|
|
|
9
9
|
key_value do
|
|
10
10
|
map "_class", to: :_class, render_default: true
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Expressir
|
|
4
|
+
module Model
|
|
5
|
+
module Statements
|
|
6
|
+
autoload :Alias, "#{__dir__}/statements/alias"
|
|
7
|
+
autoload :Assignment, "#{__dir__}/statements/assignment"
|
|
8
|
+
autoload :Case, "#{__dir__}/statements/case"
|
|
9
|
+
autoload :CaseAction, "#{__dir__}/statements/case_action"
|
|
10
|
+
autoload :Compound, "#{__dir__}/statements/compound"
|
|
11
|
+
autoload :Escape, "#{__dir__}/statements/escape"
|
|
12
|
+
autoload :If, "#{__dir__}/statements/if"
|
|
13
|
+
autoload :Null, "#{__dir__}/statements/null"
|
|
14
|
+
autoload :ProcedureCall, "#{__dir__}/statements/procedure_call"
|
|
15
|
+
autoload :Repeat, "#{__dir__}/statements/repeat"
|
|
16
|
+
autoload :Return, "#{__dir__}/statements/return"
|
|
17
|
+
autoload :Skip, "#{__dir__}/statements/skip"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -11,7 +11,7 @@ module Expressir
|
|
|
11
11
|
attribute :operator, :string, values: %w[AND ANDOR]
|
|
12
12
|
attribute :operand1, ModelElement
|
|
13
13
|
attribute :operand2, ModelElement
|
|
14
|
-
attribute :_class, :string, default: -> {
|
|
14
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
15
15
|
|
|
16
16
|
key_value do
|
|
17
17
|
map "_class", to: :_class, render_default: true
|
|
@@ -5,7 +5,7 @@ module Expressir
|
|
|
5
5
|
# - section 9.2.5.2 ONEOF
|
|
6
6
|
class OneofSupertypeExpression < ModelElement
|
|
7
7
|
attribute :operands, ModelElement, collection: true
|
|
8
|
-
attribute :_class, :string, default: -> {
|
|
8
|
+
attribute :_class, :string, default: -> { self.class.name }
|
|
9
9
|
|
|
10
10
|
key_value do
|
|
11
11
|
map "_class", to: :_class, render_default: true
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Expressir
|
|
4
|
+
module Model
|
|
5
|
+
module SupertypeExpressions
|
|
6
|
+
autoload :BinarySupertypeExpression,
|
|
7
|
+
"#{__dir__}/supertype_expressions/binary_supertype_expression"
|
|
8
|
+
autoload :OneofSupertypeExpression,
|
|
9
|
+
"#{__dir__}/supertype_expressions/oneof_supertype_expression"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
data/lib/expressir/model.rb
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
|
-
#
|
|
1
|
+
# lib/expressir/model.rb
|
|
2
2
|
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
# Load marker modules for type checking
|
|
4
|
+
require_relative "model/concerns"
|
|
5
|
+
|
|
6
|
+
module Expressir
|
|
7
|
+
module Model
|
|
8
|
+
autoload :ModelElement, "#{__dir__}/model/model_element"
|
|
9
|
+
autoload :Cache, "#{__dir__}/model/cache"
|
|
10
|
+
autoload :ExpFile, "#{__dir__}/model/exp_file"
|
|
11
|
+
autoload :Identifier, "#{__dir__}/model/identifier"
|
|
12
|
+
autoload :Repository, "#{__dir__}/model/repository"
|
|
13
|
+
autoload :RepositoryValidator, "#{__dir__}/model/repository_validator"
|
|
14
|
+
autoload :DependencyResolver, "#{__dir__}/model/dependency_resolver"
|
|
15
|
+
autoload :RemarkInfo, "#{__dir__}/model/remark_info"
|
|
16
|
+
autoload :InterfaceValidator, "#{__dir__}/model/interface_validator"
|
|
17
|
+
autoload :SearchEngine, "#{__dir__}/model/search_engine"
|
|
18
|
+
|
|
19
|
+
# Submodules - autoload their namespace files
|
|
20
|
+
autoload :Indexes, "#{__dir__}/model/indexes"
|
|
21
|
+
autoload :DataTypes, "#{__dir__}/model/data_types"
|
|
22
|
+
autoload :Declarations, "#{__dir__}/model/declarations"
|
|
23
|
+
autoload :Expressions, "#{__dir__}/model/expressions"
|
|
24
|
+
autoload :Literals, "#{__dir__}/model/literals"
|
|
25
|
+
autoload :References, "#{__dir__}/model/references"
|
|
26
|
+
autoload :Statements, "#{__dir__}/model/statements"
|
|
27
|
+
autoload :SupertypeExpressions, "#{__dir__}/model/supertype_expressions"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
require "zip"
|
|
4
4
|
require "time"
|
|
5
|
-
require_relative "metadata"
|
|
6
5
|
|
|
7
6
|
module Expressir
|
|
8
7
|
module Package
|
|
@@ -119,22 +118,54 @@ module Expressir
|
|
|
119
118
|
# @param format [String] Serialization format
|
|
120
119
|
# @return [void]
|
|
121
120
|
def add_serialized_repository(zip, repository, format)
|
|
121
|
+
# Normalize repository - ensure all schemas are in files for serialization
|
|
122
|
+
normalized_repo = normalize_repository(repository)
|
|
123
|
+
|
|
122
124
|
case format
|
|
123
125
|
when "marshal"
|
|
124
126
|
zip.get_output_stream("repository.marshal") do |stream|
|
|
125
|
-
stream.write(Marshal.dump(
|
|
127
|
+
stream.write(Marshal.dump(normalized_repo))
|
|
126
128
|
end
|
|
127
129
|
when "json"
|
|
128
130
|
zip.get_output_stream("repository.json") do |stream|
|
|
129
|
-
stream.write(
|
|
131
|
+
stream.write(normalized_repo.to_json)
|
|
130
132
|
end
|
|
131
133
|
when "yaml"
|
|
132
134
|
zip.get_output_stream("repository.yaml") do |stream|
|
|
133
|
-
stream.write(
|
|
135
|
+
stream.write(normalized_repo.to_yaml)
|
|
134
136
|
end
|
|
135
137
|
end
|
|
136
138
|
end
|
|
137
139
|
|
|
140
|
+
# Normalize repository for serialization
|
|
141
|
+
# Ensures all schemas are in files (not in @_schemas)
|
|
142
|
+
# @param repository [Model::Repository] Repository to normalize
|
|
143
|
+
# @return [Model::Repository] Normalized repository
|
|
144
|
+
def normalize_repository(repository)
|
|
145
|
+
# Create a new repository with proper file structure
|
|
146
|
+
normalized = Model::Repository.new(base_dir: repository.base_dir)
|
|
147
|
+
|
|
148
|
+
# Copy existing files
|
|
149
|
+
repository.files&.each do |file|
|
|
150
|
+
normalized.files << file
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Get schemas that are not already in files
|
|
154
|
+
file_schema_ids = normalized.files.flat_map(&:schemas).compact.map(&:id)
|
|
155
|
+
direct_schemas = repository.schemas.reject do |s|
|
|
156
|
+
file_schema_ids.include?(s.id)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Create an ExpFile for direct schemas
|
|
160
|
+
if direct_schemas.any?
|
|
161
|
+
exp_file = Model::ExpFile.new(path: "direct_schemas.exp")
|
|
162
|
+
exp_file.schemas = direct_schemas
|
|
163
|
+
normalized.files << exp_file
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
normalized
|
|
167
|
+
end
|
|
168
|
+
|
|
138
169
|
# Add EXPRESS files to package
|
|
139
170
|
# @param zip [Zip::File] ZIP archive
|
|
140
171
|
# @param repository [Model::Repository] Repository instance
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "lutaml/model"
|
|
4
|
-
require_relative "schema_manifest_entry"
|
|
5
|
-
|
|
6
3
|
module Expressir
|
|
7
4
|
class SchemaManifest < Lutaml::Model::Serializable
|
|
8
|
-
attribute :schemas, SchemaManifestEntry,
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
attribute :schemas, "Expressir::SchemaManifestEntry",
|
|
6
|
+
collection: true,
|
|
7
|
+
initialize_empty: true
|
|
8
|
+
attribute :path, :string
|
|
11
9
|
attr_accessor :output_path
|
|
12
10
|
|
|
13
11
|
def initialize(**args)
|
|
@@ -28,7 +26,7 @@ module Expressir
|
|
|
28
26
|
x.set_initial_path(path)
|
|
29
27
|
end
|
|
30
28
|
rescue StandardError => e
|
|
31
|
-
raise
|
|
29
|
+
raise ManifestValidationError,
|
|
32
30
|
"Invalid schema manifest format: #{e.message}"
|
|
33
31
|
end
|
|
34
32
|
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "lutaml/model"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
class SchemaManifestEntry < Lutaml::Model::Serializable
|
|
7
|
-
attribute :id,
|
|
8
|
-
attribute :path,
|
|
9
|
-
# attribute :schemas_only,
|
|
5
|
+
attribute :id, :string
|
|
6
|
+
attribute :path, :string
|
|
7
|
+
# attribute :schemas_only, :boolean
|
|
10
8
|
|
|
11
9
|
# container_path is a copy of Expressir::SchemaManifest.path,
|
|
12
10
|
# used to resolve the path of each schema within
|
data/lib/expressir/version.rb
CHANGED