expressir 0.2.19-x64-mingw32 → 0.2.27-x64-mingw32

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +7 -6
  3. data/.github/workflows/release.yml +31 -3
  4. data/README.adoc +3 -3
  5. data/exe/format +2 -49
  6. data/exe/format-test +81 -0
  7. data/lib/expressir/express_exp/2.4/express_parser.so +0 -0
  8. data/lib/expressir/express_exp/2.5/express_parser.so +0 -0
  9. data/lib/expressir/express_exp/2.6/express_parser.so +0 -0
  10. data/lib/expressir/express_exp/2.7/express_parser.so +0 -0
  11. data/lib/expressir/express_exp/3.0/express_parser.so +0 -0
  12. data/lib/expressir/express_exp/cache.rb +48 -0
  13. data/lib/expressir/express_exp/formatter.rb +12 -2
  14. data/lib/expressir/express_exp/hyperlink_formatter.rb +10 -15
  15. data/lib/expressir/express_exp/model_visitor.rb +23 -0
  16. data/lib/expressir/express_exp/parser.rb +14 -3
  17. data/lib/expressir/express_exp/resolve_references_model_visitor.rb +29 -0
  18. data/lib/expressir/express_exp/visitor.rb +46 -19
  19. data/lib/expressir/model.rb +5 -1
  20. data/lib/expressir/model/attribute.rb +13 -6
  21. data/lib/expressir/model/cache.rb +13 -0
  22. data/lib/expressir/model/constant.rb +10 -3
  23. data/lib/expressir/model/entity.rb +16 -14
  24. data/lib/expressir/model/enumeration_item.rb +8 -1
  25. data/lib/expressir/model/expressions/aggregate_initializer.rb +2 -2
  26. data/lib/expressir/model/expressions/aggregate_item.rb +2 -2
  27. data/lib/expressir/model/expressions/attribute_reference.rb +2 -2
  28. data/lib/expressir/model/expressions/binary_expression.rb +3 -3
  29. data/lib/expressir/model/expressions/call.rb +3 -3
  30. data/lib/expressir/model/expressions/entity_constructor.rb +3 -3
  31. data/lib/expressir/model/expressions/group_reference.rb +2 -2
  32. data/lib/expressir/model/expressions/index_reference.rb +3 -3
  33. data/lib/expressir/model/expressions/interval.rb +5 -5
  34. data/lib/expressir/model/expressions/query_expression.rb +6 -4
  35. data/lib/expressir/model/expressions/simple_reference.rb +5 -1
  36. data/lib/expressir/model/expressions/unary_expression.rb +2 -2
  37. data/lib/expressir/model/function.rb +23 -21
  38. data/lib/expressir/model/identifier.rb +6 -3
  39. data/lib/expressir/model/interface.rb +4 -4
  40. data/lib/expressir/model/interface_item.rb +2 -2
  41. data/lib/expressir/model/interfaced_item.rb +10 -9
  42. data/lib/expressir/model/literals/binary.rb +1 -1
  43. data/lib/expressir/model/literals/integer.rb +1 -1
  44. data/lib/expressir/model/literals/logical.rb +1 -1
  45. data/lib/expressir/model/literals/real.rb +1 -1
  46. data/lib/expressir/model/literals/string.rb +2 -2
  47. data/lib/expressir/model/model_element.rb +38 -26
  48. data/lib/expressir/model/parameter.rb +10 -3
  49. data/lib/expressir/model/procedure.rb +22 -20
  50. data/lib/expressir/model/remark_item.rb +15 -0
  51. data/lib/expressir/model/repository.rb +2 -2
  52. data/lib/expressir/model/rule.rb +26 -24
  53. data/lib/expressir/model/schema.rb +24 -20
  54. data/lib/expressir/model/schema_version.rb +15 -0
  55. data/lib/expressir/model/schema_version_item.rb +15 -0
  56. data/lib/expressir/model/statements/alias.rb +7 -5
  57. data/lib/expressir/model/statements/assignment.rb +2 -2
  58. data/lib/expressir/model/statements/call.rb +3 -3
  59. data/lib/expressir/model/statements/case.rb +4 -4
  60. data/lib/expressir/model/statements/case_action.rb +3 -3
  61. data/lib/expressir/model/statements/compound.rb +2 -2
  62. data/lib/expressir/model/statements/if.rb +5 -5
  63. data/lib/expressir/model/statements/repeat.rb +11 -9
  64. data/lib/expressir/model/statements/return.rb +1 -1
  65. data/lib/expressir/model/subtype_constraint.rb +13 -6
  66. data/lib/expressir/model/type.rb +9 -7
  67. data/lib/expressir/model/types/aggregate.rb +9 -2
  68. data/lib/expressir/model/types/array.rb +5 -5
  69. data/lib/expressir/model/types/bag.rb +3 -3
  70. data/lib/expressir/model/types/binary.rb +2 -2
  71. data/lib/expressir/model/types/enumeration.rb +6 -6
  72. data/lib/expressir/model/types/generic.rb +8 -1
  73. data/lib/expressir/model/types/generic_entity.rb +8 -1
  74. data/lib/expressir/model/types/list.rb +4 -4
  75. data/lib/expressir/model/types/real.rb +1 -1
  76. data/lib/expressir/model/types/select.rb +7 -7
  77. data/lib/expressir/model/types/set.rb +3 -3
  78. data/lib/expressir/model/types/string.rb +2 -2
  79. data/lib/expressir/model/unique.rb +10 -3
  80. data/lib/expressir/model/variable.rb +10 -3
  81. data/lib/expressir/model/where.rb +9 -2
  82. data/lib/expressir/version.rb +1 -1
  83. data/original/examples/syntax/multiple.exp +1 -1
  84. data/original/examples/syntax/multiple.yaml +15 -1
  85. data/original/examples/syntax/multiple_formatted.exp +1 -1
  86. data/original/examples/syntax/multiple_hyperlink_formatted.exp +4 -4
  87. data/original/examples/syntax/multiple_schema_head_hyperlink_formatted.exp +1 -1
  88. data/original/examples/syntax/remark.exp +12 -10
  89. data/original/examples/syntax/remark.yaml +23 -3
  90. data/original/examples/syntax/remark_formatted.exp +3 -1
  91. data/original/examples/syntax/single.exp +2 -1
  92. data/original/examples/syntax/single.yaml +9 -0
  93. data/original/examples/syntax/single_formatted.exp +5 -1
  94. data/original/examples/syntax/single_formatted.yaml +18 -1
  95. data/original/examples/syntax/syntax.exp +1 -1
  96. data/original/examples/syntax/syntax.yaml +99 -2
  97. data/original/examples/syntax/syntax_formatted.exp +1 -1
  98. data/original/examples/syntax/syntax_hyperlink_formatted.exp +902 -0
  99. data/original/examples/syntax/syntax_schema_head_formatted.exp +1 -1
  100. data/spec/expressir/express_exp/cache_spec.rb +64 -0
  101. data/spec/expressir/express_exp/formatter_spec.rb +16 -0
  102. data/spec/expressir/express_exp/parser_spec.rb +1 -1
  103. data/spec/expressir/model/model_element_spec.rb +73 -21
  104. metadata +12 -3
  105. data/lib/expressir/model/informal_proposition.rb +0 -18
@@ -2,11 +2,15 @@ module Expressir
2
2
  module Model
3
3
  module Expressions
4
4
  class SimpleReference < ModelElement
5
- attr_accessor :id
5
+ model_attr_accessor :id
6
+
7
+ model_attr_accessor :base_path
6
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
@@ -6,8 +6,8 @@ module Expressir
6
6
  NOT = :NOT
7
7
  PLUS = :PLUS
8
8
 
9
- attr_accessor :operator
10
- attr_accessor :operand
9
+ model_attr_accessor :operator
10
+ model_attr_accessor :operand
11
11
 
12
12
  def initialize(options = {})
13
13
  @operator = options[:operator]
@@ -3,32 +3,33 @@ module Expressir
3
3
  class Function < ModelElement
4
4
  include Identifier
5
5
 
6
- attr_accessor :parameters
7
- attr_accessor :return_type
8
- attr_accessor :types
9
- attr_accessor :entities
10
- attr_accessor :subtype_constraints
11
- attr_accessor :functions
12
- attr_accessor :procedures
13
- attr_accessor :constants
14
- attr_accessor :variables
15
- attr_accessor :statements
6
+ model_attr_accessor :parameters
7
+ model_attr_accessor :return_type
8
+ model_attr_accessor :types
9
+ model_attr_accessor :entities
10
+ model_attr_accessor :subtype_constraints
11
+ model_attr_accessor :functions
12
+ model_attr_accessor :procedures
13
+ model_attr_accessor :constants
14
+ model_attr_accessor :variables
15
+ model_attr_accessor :statements
16
16
 
17
17
  def initialize(options = {})
18
18
  @id = options[:id]
19
- @remarks = options.fetch(:remarks, [])
19
+ @remarks = options[:remarks] || []
20
+ @remark_items = options[:remark_items] || []
20
21
  @source = options[:source]
21
22
 
22
- @parameters = options.fetch(:parameters, [])
23
+ @parameters = options[:parameters] || []
23
24
  @return_type = options[:return_type]
24
- @types = options.fetch(:types, [])
25
- @entities = options.fetch(:entities, [])
26
- @subtype_constraints = options.fetch(:subtype_constraints, [])
27
- @functions = options.fetch(:functions, [])
28
- @procedures = options.fetch(:procedures, [])
29
- @constants = options.fetch(:constants, [])
30
- @variables = options.fetch(:variables, [])
31
- @statements = options.fetch(:statements, [])
25
+ @types = options[:types] || []
26
+ @entities = options[:entities] || []
27
+ @subtype_constraints = options[:subtype_constraints] || []
28
+ @functions = options[:functions] || []
29
+ @procedures = options[:procedures] || []
30
+ @constants = options[:constants] || []
31
+ @variables = options[:variables] || []
32
+ @statements = options[:statements] || []
32
33
 
33
34
  super
34
35
  end
@@ -47,7 +48,8 @@ module Expressir
47
48
  *functions,
48
49
  *procedures,
49
50
  *constants,
50
- *variables
51
+ *variables,
52
+ *remark_items
51
53
  ]
52
54
  end
53
55
  end
@@ -1,9 +1,12 @@
1
1
  module Expressir
2
2
  module Model
3
3
  module Identifier
4
- attr_accessor :id
5
- attr_accessor :remarks
6
- attr_accessor :source
4
+ def self.included(mod)
5
+ mod.model_attr_accessor :id
6
+ mod.model_attr_accessor :remarks
7
+ mod.model_attr_accessor :remark_items
8
+ mod.model_attr_accessor :source
9
+ end
7
10
  end
8
11
  end
9
12
  end
@@ -4,14 +4,14 @@ module Expressir
4
4
  USE = :USE
5
5
  REFERENCE = :REFERENCE
6
6
 
7
- attr_accessor :kind
8
- attr_accessor :schema
9
- attr_accessor :items
7
+ model_attr_accessor :kind
8
+ model_attr_accessor :schema
9
+ model_attr_accessor :items
10
10
 
11
11
  def initialize(options = {})
12
12
  @kind = options[:kind]
13
13
  @schema = options[:schema]
14
- @items = options.fetch(:items, [])
14
+ @items = options[:items] || []
15
15
 
16
16
  super
17
17
  end
@@ -1,8 +1,8 @@
1
1
  module Expressir
2
2
  module Model
3
3
  class InterfaceItem < ModelElement
4
- attr_accessor :ref
5
- attr_accessor :id
4
+ model_attr_accessor :ref
5
+ model_attr_accessor :id
6
6
 
7
7
  def initialize(options = {})
8
8
  @ref = options[:ref]
@@ -1,25 +1,26 @@
1
1
  module Expressir
2
2
  module Model
3
3
  class InterfacedItem < ModelElement
4
- include Identifier
4
+ model_attr_accessor :id
5
+ model_attr_accessor :remarks
6
+ model_attr_accessor :remark_items
5
7
 
6
- undef :source
7
- undef :source=
8
-
9
- attr_accessor :base_item
8
+ model_attr_accessor :base_item
10
9
 
11
10
  def initialize(options = {})
12
11
  @id = options[:id]
13
- @remarks = options.fetch(:remarks, [])
14
- # @source = options[:source]
12
+ @remarks = options[:remarks] || []
13
+ @remark_items = options[:remark_items] || []
15
14
 
16
15
  @base_item = options[:base_item]
17
16
 
18
17
  super
19
18
  end
20
19
 
21
- def path
22
- base_item.path
20
+ def children
21
+ [
22
+ *remark_items
23
+ ]
23
24
  end
24
25
  end
25
26
  end
@@ -2,7 +2,7 @@ module Expressir
2
2
  module Model
3
3
  module Literals
4
4
  class Binary < ModelElement
5
- attr_accessor :value
5
+ model_attr_accessor :value
6
6
 
7
7
  def initialize(options = {})
8
8
  @value = options[:value]
@@ -2,7 +2,7 @@ module Expressir
2
2
  module Model
3
3
  module Literals
4
4
  class Integer < ModelElement
5
- attr_accessor :value
5
+ model_attr_accessor :value
6
6
 
7
7
  def initialize(options = {})
8
8
  @value = options[:value]
@@ -6,7 +6,7 @@ module Expressir
6
6
  FALSE = :FALSE
7
7
  UNKNOWN = :UNKNOWN
8
8
 
9
- attr_accessor :value
9
+ model_attr_accessor :value
10
10
 
11
11
  def initialize(options = {})
12
12
  @value = options[:value]
@@ -2,7 +2,7 @@ module Expressir
2
2
  module Model
3
3
  module Literals
4
4
  class Real < ModelElement
5
- attr_accessor :value
5
+ model_attr_accessor :value
6
6
 
7
7
  def initialize(options = {})
8
8
  @value = options[:value]
@@ -2,8 +2,8 @@ module Expressir
2
2
  module Model
3
3
  module Literals
4
4
  class String < ModelElement
5
- attr_accessor :value
6
- attr_accessor :encoded
5
+ model_attr_accessor :value
6
+ model_attr_accessor :encoded
7
7
 
8
8
  def initialize(options = {})
9
9
  @value = options[:value]
@@ -5,8 +5,6 @@ module Expressir
5
5
  class ModelElement
6
6
  CLASS_KEY = '_class'
7
7
  FILE_KEY = 'file'
8
- PARENT_KEY = 'parent'
9
- CHILDREN_BY_ID_KEY = 'children_by_id'
10
8
  SOURCE_KEY = 'source'
11
9
 
12
10
  attr_accessor :parent
@@ -15,18 +13,14 @@ module Expressir
15
13
  attach_parent_to_children
16
14
  end
17
15
 
18
- def model_instance_variables
19
- skip_variables = [FILE_KEY, PARENT_KEY, CHILDREN_BY_ID_KEY].map{|x| "@#{x}".to_sym}
20
- instance_variables.select{|x| !skip_variables.include?(x)}
21
- end
22
-
23
16
  def path
24
- 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
25
19
 
26
20
  current_node = self
27
21
  path_parts = []
28
22
  loop do
29
- if current_node.class.method_defined? :id
23
+ if current_node.class.method_defined? :id and !(current_node.is_a? Expressions::SimpleReference)
30
24
  path_parts << current_node.id
31
25
  end
32
26
 
@@ -34,12 +28,14 @@ module Expressir
34
28
  break unless current_node
35
29
  end
36
30
 
31
+ return if path_parts.empty?
32
+
37
33
  path_parts.reverse.join(".")
38
34
  end
39
35
 
40
36
  def attach_parent_to_children
41
- model_instance_variables.each do |variable|
42
- value = instance_variable_get(variable)
37
+ self.class.model_attrs.each do |variable|
38
+ value = self.send(variable)
43
39
 
44
40
  if value.is_a? Array
45
41
  value.each do |value|
@@ -78,6 +74,10 @@ module Expressir
78
74
  break unless current_scope
79
75
  end
80
76
 
77
+ if target_node.is_a? Model::InterfacedItem
78
+ target_node = target_node.base_item
79
+ end
80
+
81
81
  target_node
82
82
  end
83
83
 
@@ -100,18 +100,14 @@ module Expressir
100
100
 
101
101
  hash = {}
102
102
  hash[CLASS_KEY] = self.class.name
103
- if self.is_a? Schema and file
104
- hash[FILE_KEY] = root_path ? Pathname.new(file).relative_path_from(root_path).to_s : file
105
- end
106
103
 
107
- model_instance_variables.each do |variable|
108
- key = variable.to_s.sub(/^@/, '')
109
- value = instance_variable_get(variable)
104
+ self.class.model_attrs.each do |variable|
105
+ value = self.send(variable)
110
106
  empty = value.nil? || (value.is_a?(Array) && value.count == 0)
111
107
 
112
108
  # skip empty values
113
109
  if !empty or include_empty
114
- hash[key] = if value.is_a? Array
110
+ hash[variable.to_s] = if value.is_a? Array
115
111
  value.map do |value|
116
112
  if value.is_a? ModelElement
117
113
  value.to_hash(options)
@@ -127,6 +123,10 @@ module Expressir
127
123
  end
128
124
  end
129
125
 
126
+ if self.is_a? Schema and file
127
+ hash[FILE_KEY] = root_path ? Pathname.new(file).relative_path_from(root_path).to_s : file
128
+ end
129
+
130
130
  if self.class.method_defined? :source and formatter
131
131
  hash[SOURCE_KEY] = formatter.format(self)
132
132
  end
@@ -137,16 +137,13 @@ module Expressir
137
137
  def self.from_hash(hash, options = {})
138
138
  root_path = options[:root_path]
139
139
 
140
- node_class = hash[CLASS_KEY]
140
+ node_class = Object.const_get(hash[CLASS_KEY])
141
141
  node_options = {}
142
- if node_class == 'Expressir::Model::Schema' and hash[FILE_KEY]
143
- node_options[FILE_KEY.to_sym] = root_path ? File.expand_path("#{root_path}/#{hash[FILE_KEY]}") : hash[FILE_KEY]
144
- end
145
142
 
146
- hash.select{|x| x != CLASS_KEY && x != FILE_KEY}.each do |variable, value|
147
- key = variable.to_sym
143
+ node_class.model_attrs.each do |variable|
144
+ value = hash[variable.to_s]
148
145
 
149
- node_options[key] = if value.is_a? Array
146
+ node_options[variable] = if value.is_a? Array
150
147
  value.map do |value|
151
148
  if value.is_a? Hash
152
149
  self.from_hash(value, options)
@@ -161,10 +158,25 @@ module Expressir
161
158
  end
162
159
  end
163
160
 
164
- node = Object.const_get(node_class).new(node_options)
161
+ if node_class == Schema and hash[FILE_KEY]
162
+ node_options[FILE_KEY.to_sym] = root_path ? File.expand_path("#{root_path}/#{hash[FILE_KEY]}") : hash[FILE_KEY]
163
+ end
164
+
165
+ node = node_class.new(node_options)
165
166
 
166
167
  node
167
168
  end
169
+
170
+ def self.model_attrs
171
+ @model_attrs ||= []
172
+ end
173
+
174
+ def self.model_attr_accessor(*vars)
175
+ @model_attrs ||= []
176
+ @model_attrs.concat(vars)
177
+
178
+ attr_accessor *vars
179
+ end
168
180
  end
169
181
  end
170
182
  end
@@ -3,12 +3,13 @@ module Expressir
3
3
  class Parameter < ModelElement
4
4
  include Identifier
5
5
 
6
- attr_accessor :var
7
- attr_accessor :type
6
+ model_attr_accessor :var
7
+ model_attr_accessor :type
8
8
 
9
9
  def initialize(options = {})
10
10
  @id = options[:id]
11
- @remarks = options.fetch(:remarks, [])
11
+ @remarks = options[:remarks] || []
12
+ @remark_items = options[:remark_items] || []
12
13
  @source = options[:source]
13
14
 
14
15
  @var = options[:var]
@@ -16,6 +17,12 @@ module Expressir
16
17
 
17
18
  super
18
19
  end
20
+
21
+ def children
22
+ [
23
+ *remark_items
24
+ ]
25
+ end
19
26
  end
20
27
  end
21
28
  end
@@ -3,30 +3,31 @@ module Expressir
3
3
  class Procedure < ModelElement
4
4
  include Identifier
5
5
 
6
- attr_accessor :parameters
7
- attr_accessor :types
8
- attr_accessor :entities
9
- attr_accessor :subtype_constraints
10
- attr_accessor :functions
11
- attr_accessor :procedures
12
- attr_accessor :constants
13
- attr_accessor :variables
14
- attr_accessor :statements
6
+ model_attr_accessor :parameters
7
+ model_attr_accessor :types
8
+ model_attr_accessor :entities
9
+ model_attr_accessor :subtype_constraints
10
+ model_attr_accessor :functions
11
+ model_attr_accessor :procedures
12
+ model_attr_accessor :constants
13
+ model_attr_accessor :variables
14
+ model_attr_accessor :statements
15
15
 
16
16
  def initialize(options = {})
17
17
  @id = options[:id]
18
- @remarks = options.fetch(:remarks, [])
18
+ @remarks = options[:remarks] || []
19
+ @remark_items = options[:remark_items] || []
19
20
  @source = options[:source]
20
21
 
21
- @parameters = options.fetch(:parameters, [])
22
- @types = options.fetch(:types, [])
23
- @entities = options.fetch(:entities, [])
24
- @subtype_constraints = options.fetch(:subtype_constraints, [])
25
- @functions = options.fetch(:functions, [])
26
- @procedures = options.fetch(:procedures, [])
27
- @constants = options.fetch(:constants, [])
28
- @variables = options.fetch(:variables, [])
29
- @statements = options.fetch(:statements, [])
22
+ @parameters = options[:parameters] || []
23
+ @types = options[:types] || []
24
+ @entities = options[:entities] || []
25
+ @subtype_constraints = options[:subtype_constraints] || []
26
+ @functions = options[:functions] || []
27
+ @procedures = options[:procedures] || []
28
+ @constants = options[:constants] || []
29
+ @variables = options[:variables] || []
30
+ @statements = options[:statements] || []
30
31
 
31
32
  super
32
33
  end
@@ -45,7 +46,8 @@ module Expressir
45
46
  *functions,
46
47
  *procedures,
47
48
  *constants,
48
- *variables
49
+ *variables,
50
+ *remark_items
49
51
  ]
50
52
  end
51
53
  end