expressir 2.3.5 → 2.3.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 055f0b5a07f8fdbd0f078d9010e4dc4d119058a0301016bf93254d86e96c38af
4
- data.tar.gz: 5f340ae55403cb3115536299cacce02fb102661035b875e251975eb8334e06a8
3
+ metadata.gz: 6af1982d1df8fc35cf696c67614f670e45386121feb42b962290a8b40acbc7f6
4
+ data.tar.gz: c03425e140c7b68391efef97105a3c86124d4269a8bb564515b0e83596a62932
5
5
  SHA512:
6
- metadata.gz: 0e6f194e91f9db5c9fdf5d1f25777a054e040dd015e66a7ba253503d80bdd73f04f872041cb3f7e6b415c0e9ff80660619c7ea7f1751de6ed0469bd73e7b2310
7
- data.tar.gz: b49300bb99f04eea589b524affa6a96f4ba2dc37773c583042e047b2682b1e9eab64dbe2e9ce0dfbc37f47ddffb3d83c0240a03b72090654e8ed56d88db8c024
6
+ metadata.gz: a330cbcd461ed7099e473a4a3d8c689f238096afce4c581b35a198bc487ddf5bd7a8bb777af698b1553efc1950eb878aa03874cc0b6904cb451b95a128962998
7
+ data.tar.gz: 1c995702e07eb2756811f35cbde5dfad4f1d32452c77a45404d551a1bfce1e374789219c72be5383eb5f804cf4489aee05cb2e29def2245ddd2d40cf591fa4c3
@@ -354,7 +354,7 @@ module Expressir
354
354
  end
355
355
 
356
356
  def attach_source_info(result, data)
357
- return unless @source && result.is_a?(Model::ModelElement)
357
+ return unless @source && result.is_a?(Expressir::Model::ModelElement)
358
358
 
359
359
  source_info = extract_source_info(data)
360
360
  return unless source_info
@@ -181,18 +181,18 @@ module Expressir
181
181
  Builder.register(:interval_high) { |d| expression.build_interval_high(d) }
182
182
  Builder.register(:interval_item) { |d| expression.build_interval_item(d) }
183
183
  Builder.register(:interval_op) do |d|
184
- expression.send(:extract_interval_op, d)
184
+ expression.extract_interval_op(d)
185
185
  end
186
186
 
187
187
  # Operators
188
188
  Builder.register(:add_like_op) do |d|
189
- expression.send(:extract_operator, d)
189
+ expression.extract_operator(d)
190
190
  end
191
191
  Builder.register(:mul_like_op) do |d|
192
- expression.send(:extract_operator, d)
192
+ expression.extract_operator(d)
193
193
  end
194
- Builder.register(:unary_op) { |d| expression.send(:extract_unary_op, d) }
195
- Builder.register(:rel_op) { |d| expression.send(:extract_rel_op, d) }
194
+ Builder.register(:unary_op) { |d| expression.extract_unary_op(d) }
195
+ Builder.register(:rel_op) { |d| expression.extract_rel_op(d) }
196
196
 
197
197
  # ========================================================================
198
198
  # Interface Builder (closures)
@@ -319,45 +319,20 @@ module Expressir
319
319
  subtype_constraint.build_total_over(d)
320
320
  end
321
321
 
322
- Builder.register(:subtype_constraint_decl) do |d|
323
- subtype_constraint.build_subtype_constraint_decl(d)
324
- end
325
- Builder.register(:total_over) do |d|
326
- subtype_constraint.build_total_over(d)
327
- end
328
- Builder.register(:supertype_expression) do |d|
329
- subtype_constraint.build_supertype_expression(d)
330
- end
331
- Builder.register(:supertype_factor) do |d|
332
- subtype_constraint.build_supertype_factor(d)
333
- end
334
- Builder.register(:supertype_term) do |d|
335
- subtype_constraint.build_supertype_term(d)
336
- end
337
- Builder.register(:one_of) { |d| subtype_constraint.build_one_of(d) }
338
- Builder.register(:supertype_rule) do |d|
339
- subtype_constraint.build_supertype_rule(d)
340
- end
341
- Builder.register(:subtype_constraint) do |d|
342
- subtype_constraint.build_subtype_constraint(d)
343
- end
344
- Builder.register(:subtype_declaration) do |d|
345
- subtype_constraint.build_subtype_declaration(d)
346
- end
347
-
348
322
  # ========================================================================
349
323
  # Type Builder (closures)
350
324
  # ========================================================================
351
325
 
352
326
  # Simple types
353
- %i[boolean_type integer_type logical_type number_type].each do |type|
354
- Builder.register(type) { |d| type_builder.send(:"build_#{type}", d) }
355
- end
327
+ Builder.register(:boolean_type) { |d| type_builder.build_boolean_type(d) }
328
+ Builder.register(:integer_type) { |d| type_builder.build_integer_type(d) }
329
+ Builder.register(:logical_type) { |d| type_builder.build_logical_type(d) }
330
+ Builder.register(:number_type) { |d| type_builder.build_number_type(d) }
356
331
 
357
332
  # Type constructors
358
333
  Builder.register(:generic_type) { |_d| Expressir::Model::DataTypes::Generic.new }
359
334
  Builder.register(:generic_entity_type) { |_d| Expressir::Model::DataTypes::GenericEntity.new }
360
- Builder.register(:aggregate_type) { |_d| Expressir::Model::DataTypes::Aggregate.new }
335
+ Builder.register(:aggregate_type) { |d| type_builder.build_aggregate_type(d) }
361
336
  Builder.register(:general_set_type) do |d|
362
337
  type_builder.build_general_set_type(d)
363
338
  end
@@ -36,7 +36,10 @@ module Expressir
36
36
  ids = if ids_data.is_a?(Hash)
37
37
  [Builder.build({ variable_id: ids_data })]
38
38
  elsif ids_data.is_a?(Array)
39
- ids_data.map { |id| Builder.build({ variable_id: id }) }
39
+ ids_data.filter_map do |elem|
40
+ actual_id = elem[:variable_id] || elem
41
+ Builder.build({ variable_id: actual_id })
42
+ end
40
43
  else
41
44
  []
42
45
  end
@@ -64,7 +67,10 @@ module Expressir
64
67
  ids = if ids_data.is_a?(Hash)
65
68
  [Builder.build({ parameter_id: ids_data })]
66
69
  elsif ids_data.is_a?(Array)
67
- ids_data.map { |id| Builder.build({ parameter_id: id }) }
70
+ ids_data.filter_map do |elem|
71
+ actual_id = elem[:parameter_id] || elem
72
+ Builder.build({ parameter_id: actual_id })
73
+ end
68
74
  else
69
75
  []
70
76
  end
@@ -62,7 +62,8 @@ module Expressir
62
62
 
63
63
  parameters = []
64
64
  Builder.ensure_array(params_data).each do |param|
65
- result = Builder.build({ procedure_head_parameter: param })
65
+ actual_param = param[:procedure_head_parameter] || param
66
+ result = Builder.build({ procedure_head_parameter: actual_param })
66
67
  parameters.concat(Builder.ensure_array(result)) if result
67
68
  end
68
69
  parameters
@@ -85,12 +85,14 @@ module Expressir
85
85
  def build_case_stmt(ast_data)
86
86
  selector = Builder.build_optional(ast_data[:selector])
87
87
  actions = Builder.build_children(ast_data[:case_action])
88
- otherwise = Builder.build_children(ast_data[:otherwise]&.dig(:stmt))
88
+ otherwise_stmt = if ast_data[:t_otherwise] && ast_data[:stmt].is_a?(Hash)
89
+ Builder.build({ stmt: ast_data[:stmt] })
90
+ end
89
91
 
90
92
  Expressir::Model::Statements::Case.new(
91
93
  expression: selector,
92
94
  actions: actions.compact,
93
- otherwise: otherwise.compact,
95
+ otherwise_statement: otherwise_stmt,
94
96
  )
95
97
  end
96
98
 
@@ -101,12 +103,23 @@ module Expressir
101
103
  end
102
104
 
103
105
  def build_case_action(ast_data)
104
- labels = Builder.build_children(ast_data[:case_label])
105
- statements = Builder.build_children(ast_data[:stmt])
106
+ label_data = ast_data[:list_of_case_label]
107
+ labels = if label_data.is_a?(Hash)
108
+ Builder.build_children(label_data[:case_label])
109
+ elsif label_data.is_a?(Array)
110
+ label_data.flat_map do |item|
111
+ Builder.build_children(item.is_a?(Hash) ? item[:case_label] : item)
112
+ end
113
+ else
114
+ []
115
+ end
116
+ stmt = if ast_data[:stmt].is_a?(Hash)
117
+ Builder.build({ stmt: ast_data[:stmt] })
118
+ end
106
119
 
107
120
  Expressir::Model::Statements::CaseAction.new(
108
121
  labels: labels.compact,
109
- statements: statements.compact,
122
+ statement: stmt,
110
123
  )
111
124
  end
112
125
 
@@ -7,18 +7,20 @@ module Expressir
7
7
  class TypeBuilder
8
8
  include ::Expressir::Express::Builders::Helpers
9
9
 
10
- # Simple types
11
- {
12
- boolean_type: Expressir::Model::DataTypes::Boolean,
13
- integer_type: Expressir::Model::DataTypes::Integer,
14
- logical_type: Expressir::Model::DataTypes::Logical,
15
- number_type: Expressir::Model::DataTypes::Number,
16
- generic_type: Expressir::Model::DataTypes::Generic,
17
- generic_entity_type: Expressir::Model::DataTypes::GenericEntity,
18
- }.each do |type_name, klass|
19
- define_method(:"build_#{type_name}") do |_ast_data|
20
- klass.new
21
- end
10
+ def build_boolean_type(_ast_data)
11
+ Expressir::Model::DataTypes::Boolean.new
12
+ end
13
+
14
+ def build_integer_type(_ast_data)
15
+ Expressir::Model::DataTypes::Integer.new
16
+ end
17
+
18
+ def build_logical_type(_ast_data)
19
+ Expressir::Model::DataTypes::Logical.new
20
+ end
21
+
22
+ def build_number_type(_ast_data)
23
+ Expressir::Model::DataTypes::Number.new
22
24
  end
23
25
 
24
26
  # String type
@@ -49,6 +51,12 @@ module Expressir
49
51
  end
50
52
  end
51
53
 
54
+ # Aggregate type (AGGREGATE OF type)
55
+ def build_aggregate_type(ast_data)
56
+ base_type = Builder.build_optional(ast_data[:parameter_type])
57
+ Expressir::Model::DataTypes::Aggregate.new(base_type: base_type)
58
+ end
59
+
52
60
  # Aggregation types
53
61
  def build_array_type(ast_data)
54
62
  build_aggregation_type(ast_data, Expressir::Model::DataTypes::Array)
@@ -4,8 +4,18 @@ module Expressir
4
4
  module DataTypesFormatter
5
5
  private
6
6
 
7
- def format_data_types_aggregate(_node)
8
- "AGGREGATE"
7
+ def format_data_types_aggregate(node)
8
+ [
9
+ "AGGREGATE",
10
+ *if node.base_type
11
+ [
12
+ " ",
13
+ "OF",
14
+ " ",
15
+ format(node.base_type),
16
+ ]
17
+ end,
18
+ ].join
9
19
  end
10
20
 
11
21
  def format_data_types_array(node)
@@ -257,7 +267,7 @@ module Expressir
257
267
  ].join
258
268
  end,
259
269
  ].join
260
- else
270
+ elsif node.items&.length&.positive?
261
271
  indent_char = self.class.const_get(:INDENT_CHAR)
262
272
  item_indent = indent_char * "(".length
263
273
  [
@@ -24,9 +24,9 @@ module Expressir
24
24
  def format_expressions_binary_expression(node)
25
25
  operator_precedence = self.class.const_get(:OPERATOR_PRECEDENCE)
26
26
  op1_bin_exp = node.operand1.is_a?(Model::Expressions::BinaryExpression) &&
27
- (operator_precedence[node.operand1.operator] > operator_precedence[node.operator])
27
+ (operator_precedence[node.operand1.operator] >= operator_precedence[node.operator])
28
28
  op2_bin_exp = node.operand2.is_a?(Model::Expressions::BinaryExpression) &&
29
- (operator_precedence[node.operand2.operator] > operator_precedence[node.operator])
29
+ (operator_precedence[node.operand2.operator] >= operator_precedence[node.operator])
30
30
 
31
31
  [
32
32
  *if op1_bin_exp
@@ -138,6 +138,9 @@ module Expressir
138
138
  end
139
139
 
140
140
  def format_expressions_unary_expression(node)
141
+ needs_parens = node.operand.is_a?(Model::Expressions::BinaryExpression) ||
142
+ node.operand.is_a?(Model::Expressions::Interval)
143
+
141
144
  [
142
145
  case node.operator
143
146
  when Model::Expressions::UnaryExpression::MINUS then "-"
@@ -147,11 +150,11 @@ module Expressir
147
150
  if node.operator == Model::Expressions::UnaryExpression::NOT
148
151
  " "
149
152
  end,
150
- *if node.operand.is_a? Model::Expressions::BinaryExpression
153
+ *if needs_parens
151
154
  "("
152
155
  end,
153
156
  format(node.operand),
154
- *if node.operand.is_a? Model::Expressions::BinaryExpression
157
+ *if needs_parens
155
158
  ")"
156
159
  end,
157
160
  ].join
@@ -5,10 +5,7 @@ module Expressir
5
5
  private
6
6
 
7
7
  def format_literals_binary(node)
8
- [
9
- "%",
10
- node.value,
11
- ].join
8
+ node.value
12
9
  end
13
10
 
14
11
  def format_literals_integer(node)
@@ -525,7 +525,7 @@ module Expressir
525
525
  def find_target_in_where_clause(scope, tag, remark_line)
526
526
  return nil unless supports_where_rules?(scope)
527
527
 
528
- where_rules = scope.where_rules
528
+ where_rules = safe_get_collection(scope, :where_rules)
529
529
  return nil unless where_rules&.any?
530
530
 
531
531
  # Search source text for WHERE clause containing this remark
@@ -6,7 +6,6 @@ module Expressir
6
6
  class Function < ModelElement
7
7
  include Identifier
8
8
  include ScopeContainer
9
- include HasWhereRules
10
9
 
11
10
  attribute :parameters, Parameter, collection: true
12
11
  attribute :return_type, ModelElement
@@ -6,7 +6,6 @@ module Expressir
6
6
  class Procedure < ModelElement
7
7
  include Identifier
8
8
  include ScopeContainer
9
- include HasWhereRules
10
9
 
11
10
  attribute :parameters, Parameter, collection: true
12
11
  attribute :types, ModelElement, collection: true
@@ -1,3 +1,3 @@
1
1
  module Expressir
2
- VERSION = "2.3.5".freeze
2
+ VERSION = "2.3.6".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: expressir
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.5
4
+ version: 2.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-05-12 00:00:00.000000000 Z
11
+ date: 2026-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64