expressir 0.2.24 → 0.2.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce50a374ee7552fa79d80e286765681ed1cb808bea2a6833c53e0ddf626ab5bc
4
- data.tar.gz: 6856209fcb72eb146ac4408e8f58d4aa45f74ccf54adbe4d7c6fd5653bcacc7b
3
+ metadata.gz: a32b6c4d99c4dd5082bf3bf9d2e7f6a93f86eae043a9dda49e8ffe37e1082479
4
+ data.tar.gz: 0eef9e070668c5ec37daff443516ea9c8afa1b01ed63d85833bdff0e1b5755cc
5
5
  SHA512:
6
- metadata.gz: 3a4a7554be0d0348f65ca086a3238104bdd36f13c33e719f0cfb01d28724b3487f764ebd0ebf49b2f59b49112180cce512a05e36442ec90c62828f82cf805a0a
7
- data.tar.gz: e871ff00c28957c32823c7b4ff0f3222270d1a7471426dfb335d6077a1c4fbcbb078b3924a2029502c671a54d9fb97740187be85f1cdc64993f3ed2bcacf8d4d
6
+ metadata.gz: 89180457dad6e288d406ebb565cf13bc11366205d4bcd9b99a3b5d994fba26c3db6b599cf1da4c084e5ccc2323eedc9df871b1c79f126048da52aa9e38be8a25
7
+ data.tar.gz: 343ee264593bde6ba7f459eb2170cc37db44a2fdc322814cedcd1b59a009b642d8ca9814cc21db2d6d733db127e7ad3484f46a62c7967a475be21c9869485bd6
@@ -1502,7 +1502,7 @@ module Expressir
1502
1502
  [
1503
1503
  '(*',
1504
1504
  '"',
1505
- node.path,
1505
+ node.path || node.id,
1506
1506
  '"',
1507
1507
  ].join(''),
1508
1508
  remark,
@@ -1512,7 +1512,7 @@ module Expressir
1512
1512
  [
1513
1513
  '--',
1514
1514
  '"',
1515
- node.path,
1515
+ node.path || node.id,
1516
1516
  '"',
1517
1517
  ' ',
1518
1518
  remark
@@ -2,25 +2,20 @@ module Expressir
2
2
  module ExpressExp
3
3
  module HyperlinkFormatter
4
4
  def format_expressions_simple_reference(node)
5
- return node.id if node.parent.is_a? Model::Expressions::AttributeReference
5
+ return node.id unless node.base_path
6
6
 
7
- # skip hyperlink if target node can't be found
8
- target_node = if node.parent.is_a? Model::InterfaceItem
9
- node.find("#{node.parent.parent.schema.id}.#{node.parent.ref.id}")
10
- else
11
- node.find(node.id)
7
+ # find closest node with path
8
+ current_node = node
9
+ while !current_node.path
10
+ current_node = current_node.parent
12
11
  end
13
- return node.id unless target_node
14
12
 
15
- # skip hyperlink for implicit scopes
16
- return node.id if target_node.is_a? Model::Statements::Alias or target_node.is_a? Model::Statements::Repeat or target_node.is_a? Model::Expressions::QueryExpression
13
+ # skip if this reference and target node are in the same node with path
14
+ node_base_path_parts = node.base_path.split(".")
15
+ current_node_path_parts = current_node.path.split(".")
16
+ return node.id if node_base_path_parts[0..1] == current_node_path_parts[0..1]
17
17
 
18
- # skip hyperlink if this node and target node are in the same main item
19
- node_path_parts = node.path.split(".")
20
- target_node_path_parts = target_node.path.split(".")
21
- return node.id if node_path_parts[0..1] == target_node_path_parts[0..1]
22
-
23
- "{{{<<express:#{target_node.path},#{node.id}>>}}}"
18
+ "{{{<<express:#{node.base_path},#{node.id}>>}}}"
24
19
  end
25
20
  end
26
21
  end
@@ -0,0 +1,23 @@
1
+ require "expressir/model"
2
+
3
+ module Expressir
4
+ module ExpressExp
5
+ class ModelVisitor
6
+ def visit(node)
7
+ node.class.model_attrs.each do |variable|
8
+ value = node.send(variable)
9
+
10
+ if value.is_a? Array
11
+ value.each do |value|
12
+ if value.is_a? Model::ModelElement
13
+ visit(value)
14
+ end
15
+ end
16
+ elsif value.is_a? Model::ModelElement
17
+ visit(value)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -5,6 +5,7 @@ rescue LoadError
5
5
  require_relative "express_parser"
6
6
  end
7
7
  require 'expressir/express_exp/visitor'
8
+ require 'expressir/express_exp/resolve_references_model_visitor'
8
9
 
9
10
  =begin
10
11
  char_stream = Antlr4::Runtime::CharStreams.from_string(input, 'String')
@@ -25,6 +26,8 @@ module Expressir
25
26
  module ExpressExp
26
27
  class Parser
27
28
  def self.from_file(file, options = {})
29
+ skip_references = options[:skip_references]
30
+
28
31
  input = File.read(file)
29
32
 
30
33
  parser = ::ExpressParser::Parser.parse(input)
@@ -38,13 +41,20 @@ module Expressir
38
41
  schema.file = file.to_s
39
42
  end
40
43
 
44
+ unless skip_references
45
+ resolve_references_model_visitor = ResolveReferencesModelVisitor.new
46
+ resolve_references_model_visitor.visit(repository)
47
+ end
48
+
41
49
  repository
42
50
  end
43
51
 
44
52
  def self.from_files(files, options = {})
53
+ skip_references = options[:skip_references]
54
+
45
55
  schemas = files.each_with_index.map do |file, i|
46
56
  # start = Time.now
47
- repository = self.from_file(file, options)
57
+ repository = self.from_file(file, options.merge(skip_references: true))
48
58
  # STDERR.puts "#{i+1}/#{files.length} #{file} #{Time.now - start}"
49
59
  repository.schemas
50
60
  end.flatten
@@ -53,8 +63,9 @@ module Expressir
53
63
  schemas: schemas
54
64
  })
55
65
 
56
- repository.schemas.each do |schema|
57
- schema.parent = repository
66
+ unless skip_references
67
+ resolve_references_model_visitor = ResolveReferencesModelVisitor.new
68
+ resolve_references_model_visitor.visit(repository)
58
69
  end
59
70
 
60
71
  repository
@@ -0,0 +1,33 @@
1
+ require "expressir/express_exp/model_visitor"
2
+ require "expressir/model"
3
+
4
+ module Expressir
5
+ module ExpressExp
6
+ class ResolveReferencesModelVisitor < ModelVisitor
7
+ def visit(node)
8
+ if node.is_a? Model::Expressions::SimpleReference
9
+ visit_expressions_simple_reference(node)
10
+ end
11
+
12
+ super
13
+ end
14
+
15
+ def visit_expressions_simple_reference(node)
16
+ return if node.parent.is_a? Model::Expressions::AttributeReference
17
+
18
+ if node.parent.is_a? Model::InterfaceItem
19
+ base_item = node.find("#{node.parent.parent.schema.id}.#{node.parent.ref.id}")
20
+ else
21
+ base_item = node.find(node.id)
22
+ end
23
+ return unless base_item
24
+
25
+ if base_item.is_a? Model::InterfacedItem
26
+ base_item = base_item.base_item
27
+ end
28
+
29
+ node.base_path = base_item.path
30
+ end
31
+ end
32
+ end
33
+ end
@@ -4,9 +4,13 @@ module Expressir
4
4
  class SimpleReference < ModelElement
5
5
  model_attr_accessor :id
6
6
 
7
+ model_attr_accessor :base_path
8
+
7
9
  def initialize(options = {})
8
10
  @id = options[:id]
9
11
 
12
+ @base_path = options[:base_path]
13
+
10
14
  super
11
15
  end
12
16
  end
@@ -17,10 +17,6 @@ module Expressir
17
17
  super
18
18
  end
19
19
 
20
- def path
21
- base_item.path
22
- end
23
-
24
20
  def children
25
21
  [
26
22
  *remark_items
@@ -14,12 +14,13 @@ module Expressir
14
14
  end
15
15
 
16
16
  def path
17
- return id if is_a? Statements::Alias or is_a? Statements::Repeat or is_a? Expressions::QueryExpression
17
+ # this creates an implicit scope
18
+ return if is_a? Statements::Alias or is_a? Statements::Repeat or is_a? Expressions::QueryExpression
18
19
 
19
20
  current_node = self
20
21
  path_parts = []
21
22
  loop do
22
- if current_node.class.method_defined? :id
23
+ if current_node.class.method_defined? :id and !(current_node.is_a? Expressions::SimpleReference)
23
24
  path_parts << current_node.id
24
25
  end
25
26
 
@@ -27,6 +28,8 @@ module Expressir
27
28
  break unless current_node
28
29
  end
29
30
 
31
+ return if path_parts.empty?
32
+
30
33
  path_parts.reverse.join(".")
31
34
  end
32
35
 
@@ -1,3 +1,3 @@
1
1
  module Expressir
2
- VERSION = "0.2.24".freeze
2
+ VERSION = "0.2.25".freeze
3
3
  end
@@ -10,26 +10,31 @@ schemas:
10
10
  schema:
11
11
  _class: Expressir::Model::Expressions::SimpleReference
12
12
  id: multiple_schema2
13
+ base_path: multiple_schema2
13
14
  - _class: Expressir::Model::Interface
14
15
  kind: :REFERENCE
15
16
  schema:
16
17
  _class: Expressir::Model::Expressions::SimpleReference
17
18
  id: multiple_schema3
19
+ base_path: multiple_schema3
18
20
  items:
19
21
  - _class: Expressir::Model::InterfaceItem
20
22
  ref:
21
23
  _class: Expressir::Model::Expressions::SimpleReference
22
24
  id: attribute_entity3
25
+ base_path: multiple_schema3.attribute_entity3
23
26
  - _class: Expressir::Model::Interface
24
27
  kind: :REFERENCE
25
28
  schema:
26
29
  _class: Expressir::Model::Expressions::SimpleReference
27
30
  id: multiple_schema4
31
+ base_path: multiple_schema4
28
32
  items:
29
33
  - _class: Expressir::Model::InterfaceItem
30
34
  ref:
31
35
  _class: Expressir::Model::Expressions::SimpleReference
32
36
  id: attribute_entity
37
+ base_path: multiple_schema4.attribute_entity
33
38
  id: attribute_entity4
34
39
  entities:
35
40
  - _class: Expressir::Model::Entity
@@ -49,11 +54,13 @@ schemas:
49
54
  subtype_of:
50
55
  - _class: Expressir::Model::Expressions::SimpleReference
51
56
  id: empty_entity
57
+ base_path: multiple_schema1.empty_entity
52
58
  - _class: Expressir::Model::Entity
53
59
  id: subtype_attribute_entity
54
60
  subtype_of:
55
61
  - _class: Expressir::Model::Expressions::SimpleReference
56
62
  id: attribute_entity
63
+ base_path: multiple_schema1.attribute_entity
57
64
  attributes:
58
65
  - _class: Expressir::Model::Attribute
59
66
  kind: :EXPLICIT
@@ -67,6 +74,7 @@ schemas:
67
74
  entity:
68
75
  _class: Expressir::Model::Expressions::SimpleReference
69
76
  id: attribute_entity
77
+ base_path: multiple_schema1.attribute_entity
70
78
  attribute:
71
79
  _class: Expressir::Model::Expressions::SimpleReference
72
80
  id: test
@@ -77,6 +85,7 @@ schemas:
77
85
  subtype_of:
78
86
  - _class: Expressir::Model::Expressions::SimpleReference
79
87
  id: attribute_entity2
88
+ base_path: multiple_schema2.attribute_entity2
80
89
  attributes:
81
90
  - _class: Expressir::Model::Attribute
82
91
  kind: :EXPLICIT
@@ -90,6 +99,7 @@ schemas:
90
99
  entity:
91
100
  _class: Expressir::Model::Expressions::SimpleReference
92
101
  id: attribute_entity2
102
+ base_path: multiple_schema2.attribute_entity2
93
103
  attribute:
94
104
  _class: Expressir::Model::Expressions::SimpleReference
95
105
  id: test
@@ -100,6 +110,7 @@ schemas:
100
110
  subtype_of:
101
111
  - _class: Expressir::Model::Expressions::SimpleReference
102
112
  id: attribute_entity3
113
+ base_path: multiple_schema3.attribute_entity3
103
114
  attributes:
104
115
  - _class: Expressir::Model::Attribute
105
116
  kind: :EXPLICIT
@@ -113,6 +124,7 @@ schemas:
113
124
  entity:
114
125
  _class: Expressir::Model::Expressions::SimpleReference
115
126
  id: attribute_entity3
127
+ base_path: multiple_schema3.attribute_entity3
116
128
  attribute:
117
129
  _class: Expressir::Model::Expressions::SimpleReference
118
130
  id: test
@@ -123,6 +135,7 @@ schemas:
123
135
  subtype_of:
124
136
  - _class: Expressir::Model::Expressions::SimpleReference
125
137
  id: attribute_entity4
138
+ base_path: multiple_schema4.attribute_entity
126
139
  attributes:
127
140
  - _class: Expressir::Model::Attribute
128
141
  kind: :EXPLICIT
@@ -136,6 +149,7 @@ schemas:
136
149
  entity:
137
150
  _class: Expressir::Model::Expressions::SimpleReference
138
151
  id: attribute_entity4
152
+ base_path: multiple_schema4.attribute_entity
139
153
  attribute:
140
154
  _class: Expressir::Model::Expressions::SimpleReference
141
155
  id: test
@@ -107,9 +107,11 @@ schemas:
107
107
  type:
108
108
  _class: Expressir::Model::Expressions::SimpleReference
109
109
  id: remark_entity
110
+ base_path: remark_schema.remark_entity
110
111
  expression:
111
112
  _class: Expressir::Model::Expressions::SimpleReference
112
113
  id: remark_attribute
114
+ base_path: remark_schema.remark_entity.remark_attribute
113
115
  unique:
114
116
  - _class: Expressir::Model::Unique
115
117
  id: UR1
@@ -120,6 +122,7 @@ schemas:
120
122
  attributes:
121
123
  - _class: Expressir::Model::Expressions::SimpleReference
122
124
  id: remark_attribute
125
+ base_path: remark_schema.remark_entity.remark_attribute
123
126
  where:
124
127
  - _class: Expressir::Model::Where
125
128
  id: WR1
@@ -152,6 +155,7 @@ schemas:
152
155
  applies_to:
153
156
  _class: Expressir::Model::Expressions::SimpleReference
154
157
  id: remark_entity
158
+ base_path: remark_schema.remark_entity
155
159
  functions:
156
160
  - _class: Expressir::Model::Function
157
161
  id: remark_function
@@ -218,6 +222,7 @@ schemas:
218
222
  expression:
219
223
  _class: Expressir::Model::Expressions::SimpleReference
220
224
  id: remark_variable
225
+ base_path: remark_schema.remark_function.remark_variable
221
226
  statements:
222
227
  - _class: Expressir::Model::Statements::Null
223
228
  - _class: Expressir::Model::Statements::Repeat
@@ -236,6 +241,7 @@ schemas:
236
241
  ref:
237
242
  _class: Expressir::Model::Expressions::SimpleReference
238
243
  id: remark_variable
244
+ base_path: remark_schema.remark_function.remark_variable
239
245
  expression:
240
246
  _class: Expressir::Model::Expressions::QueryExpression
241
247
  id: remark_query
@@ -244,6 +250,7 @@ schemas:
244
250
  aggregate_source:
245
251
  _class: Expressir::Model::Expressions::SimpleReference
246
252
  id: remark_variable
253
+ base_path: remark_schema.remark_function.remark_variable
247
254
  expression:
248
255
  _class: Expressir::Model::Literals::Logical
249
256
  value: :TRUE
@@ -256,6 +263,7 @@ schemas:
256
263
  applies_to:
257
264
  - _class: Expressir::Model::Expressions::SimpleReference
258
265
  id: remark_entity
266
+ base_path: remark_schema.remark_entity
259
267
  types:
260
268
  - _class: Expressir::Model::Type
261
269
  id: remark_type
@@ -304,6 +312,7 @@ schemas:
304
312
  expression:
305
313
  _class: Expressir::Model::Expressions::SimpleReference
306
314
  id: remark_variable
315
+ base_path: remark_schema.remark_rule.remark_variable
307
316
  statements:
308
317
  - _class: Expressir::Model::Statements::Null
309
318
  - _class: Expressir::Model::Statements::Repeat
@@ -322,6 +331,7 @@ schemas:
322
331
  ref:
323
332
  _class: Expressir::Model::Expressions::SimpleReference
324
333
  id: remark_variable
334
+ base_path: remark_schema.remark_rule.remark_variable
325
335
  expression:
326
336
  _class: Expressir::Model::Expressions::QueryExpression
327
337
  id: remark_query
@@ -330,6 +340,7 @@ schemas:
330
340
  aggregate_source:
331
341
  _class: Expressir::Model::Expressions::SimpleReference
332
342
  id: remark_variable
343
+ base_path: remark_schema.remark_rule.remark_variable
333
344
  expression:
334
345
  _class: Expressir::Model::Literals::Logical
335
346
  value: :TRUE
@@ -421,6 +432,7 @@ schemas:
421
432
  expression:
422
433
  _class: Expressir::Model::Expressions::SimpleReference
423
434
  id: remark_variable
435
+ base_path: remark_schema.remark_procedure.remark_variable
424
436
  statements:
425
437
  - _class: Expressir::Model::Statements::Null
426
438
  - _class: Expressir::Model::Statements::Repeat
@@ -439,6 +451,7 @@ schemas:
439
451
  ref:
440
452
  _class: Expressir::Model::Expressions::SimpleReference
441
453
  id: remark_variable
454
+ base_path: remark_schema.remark_procedure.remark_variable
442
455
  expression:
443
456
  _class: Expressir::Model::Expressions::QueryExpression
444
457
  id: remark_query
@@ -447,6 +460,7 @@ schemas:
447
460
  aggregate_source:
448
461
  _class: Expressir::Model::Expressions::SimpleReference
449
462
  id: remark_variable
463
+ base_path: remark_schema.remark_procedure.remark_variable
450
464
  expression:
451
465
  _class: Expressir::Model::Literals::Logical
452
466
  value: :TRUE
@@ -1,3 +1,4 @@
1
1
  SCHEMA single_schema;
2
2
  ENTITY empty_entity; END_ENTITY;
3
+ ENTITY subtype_empty_entity SUBTYPE OF (empty_entity); END_ENTITY;
3
4
  END_SCHEMA;
@@ -7,3 +7,9 @@ schemas:
7
7
  entities:
8
8
  - _class: Expressir::Model::Entity
9
9
  id: empty_entity
10
+ - _class: Expressir::Model::Entity
11
+ id: subtype_empty_entity
12
+ subtype_of:
13
+ - _class: Expressir::Model::Expressions::SimpleReference
14
+ id: empty_entity
15
+ base_path: single_schema.empty_entity