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.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.rubocop_todo.yml +681 -78
  4. data/Gemfile +4 -1
  5. data/README.adoc +63 -26
  6. data/benchmark/srl_benchmark.rb +399 -0
  7. data/benchmark/srl_native_benchmark.rb +146 -0
  8. data/benchmark/srl_ruby_benchmark.rb +132 -0
  9. data/expressir.gemspec +3 -2
  10. data/lib/expressir/benchmark.rb +1 -1
  11. data/lib/expressir/changes/item_change.rb +0 -2
  12. data/lib/expressir/changes/mapping_change.rb +0 -2
  13. data/lib/expressir/changes/schema_change.rb +0 -3
  14. data/lib/expressir/changes/version_change.rb +0 -4
  15. data/lib/expressir/changes.rb +5 -6
  16. data/lib/expressir/cli.rb +10 -24
  17. data/lib/expressir/commands/changes.rb +0 -2
  18. data/lib/expressir/commands/changes_import_eengine.rb +2 -5
  19. data/lib/expressir/commands/changes_validate.rb +0 -2
  20. data/lib/expressir/commands/format.rb +1 -1
  21. data/lib/expressir/commands/manifest.rb +0 -7
  22. data/lib/expressir/commands/package.rb +16 -29
  23. data/lib/expressir/commands/validate.rb +0 -2
  24. data/lib/expressir/commands/validate_ascii.rb +0 -1
  25. data/lib/expressir/commands/validate_load.rb +1 -1
  26. data/lib/expressir/commands.rb +20 -0
  27. data/lib/expressir/config.rb +0 -2
  28. data/lib/expressir/coverage.rb +11 -4
  29. data/lib/expressir/eengine/arm_compare_report.rb +1 -5
  30. data/lib/expressir/eengine/changes_section.rb +1 -4
  31. data/lib/expressir/eengine/compare_report.rb +1 -13
  32. data/lib/expressir/eengine/mim_compare_report.rb +1 -5
  33. data/lib/expressir/eengine/modified_object.rb +1 -3
  34. data/lib/expressir/eengine.rb +9 -0
  35. data/lib/expressir/errors.rb +3 -5
  36. data/lib/expressir/express/builder.rb +82 -24
  37. data/lib/expressir/express/builder_registry.rb +411 -0
  38. data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
  39. data/lib/expressir/express/builders/built_in_builder.rb +5 -18
  40. data/lib/expressir/express/builders/constant_builder.rb +4 -19
  41. data/lib/expressir/express/builders/declaration_builder.rb +0 -4
  42. data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
  43. data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
  44. data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
  45. data/lib/expressir/express/builders/entity_decl_builder.rb +11 -13
  46. data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
  47. data/lib/expressir/express/builders/expression_builder.rb +25 -67
  48. data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
  49. data/lib/expressir/express/builders/interface_builder.rb +0 -20
  50. data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
  51. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
  52. data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
  53. data/lib/expressir/express/builders/literal_builder.rb +1 -15
  54. data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
  55. data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
  56. data/lib/expressir/express/builders/reference_builder.rb +1 -10
  57. data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
  58. data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
  59. data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
  60. data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
  61. data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
  62. data/lib/expressir/express/builders/statement_builder.rb +4 -32
  63. data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
  64. data/lib/expressir/express/builders/syntax_builder.rb +18 -7
  65. data/lib/expressir/express/builders/type_builder.rb +3 -45
  66. data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
  67. data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
  68. data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
  69. data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
  70. data/lib/expressir/express/builders.rb +47 -35
  71. data/lib/expressir/express/error.rb +0 -3
  72. data/lib/expressir/express/formatter.rb +17 -19
  73. data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
  74. data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
  75. data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
  76. data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
  77. data/lib/expressir/express/formatters/references_formatter.rb +34 -32
  78. data/lib/expressir/express/formatters/remark_formatter.rb +174 -209
  79. data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
  80. data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
  81. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
  82. data/lib/expressir/express/formatters.rb +22 -0
  83. data/lib/expressir/express/parser.rb +266 -47
  84. data/lib/expressir/express/pretty_formatter.rb +68 -47
  85. data/lib/expressir/express/remark_attacher.rb +254 -162
  86. data/lib/expressir/express/streaming_builder.rb +0 -3
  87. data/lib/expressir/express/transformer/remark_handling.rb +1 -3
  88. data/lib/expressir/express.rb +29 -0
  89. data/lib/expressir/manifest/resolver.rb +0 -3
  90. data/lib/expressir/manifest/validator.rb +0 -3
  91. data/lib/expressir/manifest.rb +6 -0
  92. data/lib/expressir/model/cache.rb +1 -1
  93. data/lib/expressir/model/concerns.rb +19 -0
  94. data/lib/expressir/model/data_types/aggregate.rb +1 -1
  95. data/lib/expressir/model/data_types/array.rb +1 -1
  96. data/lib/expressir/model/data_types/bag.rb +1 -1
  97. data/lib/expressir/model/data_types/binary.rb +1 -1
  98. data/lib/expressir/model/data_types/boolean.rb +1 -1
  99. data/lib/expressir/model/data_types/enumeration.rb +1 -1
  100. data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
  101. data/lib/expressir/model/data_types/generic.rb +1 -1
  102. data/lib/expressir/model/data_types/generic_entity.rb +1 -1
  103. data/lib/expressir/model/data_types/integer.rb +1 -1
  104. data/lib/expressir/model/data_types/list.rb +1 -1
  105. data/lib/expressir/model/data_types/logical.rb +1 -1
  106. data/lib/expressir/model/data_types/number.rb +1 -1
  107. data/lib/expressir/model/data_types/real.rb +1 -1
  108. data/lib/expressir/model/data_types/select.rb +1 -1
  109. data/lib/expressir/model/data_types/set.rb +1 -1
  110. data/lib/expressir/model/data_types/string.rb +1 -1
  111. data/lib/expressir/model/data_types.rb +25 -0
  112. data/lib/expressir/model/declarations/attribute.rb +1 -1
  113. data/lib/expressir/model/declarations/constant.rb +1 -1
  114. data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
  115. data/lib/expressir/model/declarations/entity.rb +4 -1
  116. data/lib/expressir/model/declarations/function.rb +3 -1
  117. data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
  118. data/lib/expressir/model/declarations/interface.rb +1 -1
  119. data/lib/expressir/model/declarations/interface_item.rb +1 -1
  120. data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
  121. data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
  122. data/lib/expressir/model/declarations/parameter.rb +1 -1
  123. data/lib/expressir/model/declarations/procedure.rb +3 -1
  124. data/lib/expressir/model/declarations/remark_item.rb +1 -1
  125. data/lib/expressir/model/declarations/rule.rb +4 -1
  126. data/lib/expressir/model/declarations/schema.rb +2 -1
  127. data/lib/expressir/model/declarations/schema_version.rb +1 -1
  128. data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
  129. data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
  130. data/lib/expressir/model/declarations/type.rb +4 -1
  131. data/lib/expressir/model/declarations/unique_rule.rb +1 -1
  132. data/lib/expressir/model/declarations/variable.rb +1 -1
  133. data/lib/expressir/model/declarations/where_rule.rb +1 -1
  134. data/lib/expressir/model/declarations.rb +31 -0
  135. data/lib/expressir/model/dependency_resolver.rb +0 -2
  136. data/lib/expressir/model/exp_file.rb +39 -0
  137. data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
  138. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
  139. data/lib/expressir/model/expressions/binary_expression.rb +1 -1
  140. data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
  141. data/lib/expressir/model/expressions/function_call.rb +1 -1
  142. data/lib/expressir/model/expressions/interval.rb +1 -1
  143. data/lib/expressir/model/expressions/query_expression.rb +1 -1
  144. data/lib/expressir/model/expressions/unary_expression.rb +1 -1
  145. data/lib/expressir/model/expressions.rb +18 -0
  146. data/lib/expressir/model/identifier.rb +5 -1
  147. data/lib/expressir/model/indexes.rb +11 -0
  148. data/lib/expressir/model/literals/binary.rb +1 -1
  149. data/lib/expressir/model/literals/integer.rb +1 -1
  150. data/lib/expressir/model/literals/logical.rb +1 -1
  151. data/lib/expressir/model/literals/real.rb +1 -1
  152. data/lib/expressir/model/literals/string.rb +1 -1
  153. data/lib/expressir/model/literals.rb +13 -0
  154. data/lib/expressir/model/model_element.rb +7 -15
  155. data/lib/expressir/model/references/attribute_reference.rb +1 -1
  156. data/lib/expressir/model/references/group_reference.rb +1 -1
  157. data/lib/expressir/model/references/index_reference.rb +1 -1
  158. data/lib/expressir/model/references/simple_reference.rb +1 -1
  159. data/lib/expressir/model/references.rb +12 -0
  160. data/lib/expressir/model/remark_info.rb +1 -7
  161. data/lib/expressir/model/repository.rb +76 -41
  162. data/lib/expressir/model/repository_validator.rb +0 -2
  163. data/lib/expressir/model/search_engine.rb +12 -35
  164. data/lib/expressir/model/statements/alias.rb +1 -1
  165. data/lib/expressir/model/statements/assignment.rb +1 -1
  166. data/lib/expressir/model/statements/case.rb +1 -1
  167. data/lib/expressir/model/statements/case_action.rb +1 -1
  168. data/lib/expressir/model/statements/compound.rb +1 -1
  169. data/lib/expressir/model/statements/escape.rb +1 -1
  170. data/lib/expressir/model/statements/if.rb +1 -1
  171. data/lib/expressir/model/statements/null.rb +1 -1
  172. data/lib/expressir/model/statements/procedure_call.rb +1 -1
  173. data/lib/expressir/model/statements/repeat.rb +1 -1
  174. data/lib/expressir/model/statements/return.rb +1 -1
  175. data/lib/expressir/model/statements/skip.rb +1 -1
  176. data/lib/expressir/model/statements.rb +20 -0
  177. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
  178. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
  179. data/lib/expressir/model/supertype_expressions.rb +12 -0
  180. data/lib/expressir/model.rb +28 -4
  181. data/lib/expressir/package/builder.rb +35 -4
  182. data/lib/expressir/package/metadata.rb +0 -2
  183. data/lib/expressir/package/reader.rb +0 -1
  184. data/lib/expressir/package.rb +8 -0
  185. data/lib/expressir/schema_manifest.rb +5 -7
  186. data/lib/expressir/schema_manifest_entry.rb +3 -5
  187. data/lib/expressir/transformer.rb +7 -0
  188. data/lib/expressir/version.rb +1 -1
  189. data/lib/expressir.rb +23 -171
  190. metadata +46 -6
  191. 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:, **options)
87
+ def search_with_depth(pattern:, max_depth:, **)
88
88
  return [] if max_depth <= 0
89
89
 
90
- results = search(pattern: pattern, **options)
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, **options)
101
- results = search(pattern: pattern, **options)
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, **options)
112
- results = search(pattern: pattern, **options)
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 || [] }.select do |attr|
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 || [] }.select do |attr|
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
- # Duck typing - check if this looks like a schema
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
- # For mock objects, check if parent is nil and has id (likely a schema)
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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: -> { send(:name) }
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
@@ -1,5 +1,29 @@
1
- # frozen_string_literal: true
1
+ # lib/expressir/model.rb
2
2
 
3
- # This file is kept for backward compatibility when explicitly requiring 'expressir/model'
4
- # The actual autoload definitions are in lib/expressir.rb
5
- # This file does nothing - autoload handles everything automatically
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(repository))
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(repository.to_json)
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(repository.to_yaml)
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,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "lutaml/model"
4
-
5
3
  module Expressir
6
4
  module Package
7
5
  # Package metadata with serialization support
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "zip"
4
- require_relative "metadata"
5
4
 
6
5
  module Expressir
7
6
  module Package
@@ -0,0 +1,8 @@
1
+ # lib/expressir/package.rb
2
+ module Expressir
3
+ module Package
4
+ autoload :Metadata, "#{__dir__}/package/metadata"
5
+ autoload :Builder, "#{__dir__}/package/builder"
6
+ autoload :Reader, "#{__dir__}/package/reader"
7
+ end
8
+ end
@@ -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, collection: true,
9
- initialize_empty: true
10
- attribute :path, Lutaml::Model::Type::String
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 InvalidSchemaManifestError,
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, Lutaml::Model::Type::String
8
- attribute :path, Lutaml::Model::Type::String
9
- # attribute :schemas_only, Lutaml::Model::Type::Boolean
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
@@ -0,0 +1,7 @@
1
+ module Expressir
2
+ module Express
3
+ module Transformer
4
+ autoload :RemarkHandling, "#{__dir__}/express/transformer/remark_handling"
5
+ end
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module Expressir
2
- VERSION = "2.2.1".freeze
2
+ VERSION = "2.3.1".freeze
3
3
  end