activefacts-cql 1.9.3 → 1.9.4

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
  SHA1:
3
- metadata.gz: b7b7e191eaad678aeb89be0ca8743eb90dfe8d5b
4
- data.tar.gz: 3a777616625aa25805d2f50ae25cf7633e3a0099
3
+ metadata.gz: 0b7e982dad70afb43fd9171c3c6cc198dd98fd06
4
+ data.tar.gz: af7013320edfcd4de82ad25ef640539da87b8198
5
5
  SHA512:
6
- metadata.gz: 88ac4c71766457a0995f1bbddf00a650187fae4eacfe9e3c87ef9648737c72db756e80fab41097980fa70cffb583ccc1211d1bcea9b34fabcee18cab07af18cc
7
- data.tar.gz: e1c94deab6e96e52a0a4ec88568f3549181855de3e04fec9a06dc62e318a4317339128e70f7067e6361c701864146d6afb34ed90fc82687c44744ee564f6f6d6
6
+ metadata.gz: 4ac31ed75cd632ec21c464b802db0ea4a9b5a06bffef119bf9736163bad1b55d67ec7be5fd03fa03cec6fd3bd1defd3ab22c1e378229c1e4127c6f109d3f5201
7
+ data.tar.gz: f7d592f347a8c5e556ab1107597f2db6751ac466083f9ac07100b0701e32b4805c9edc187af0a05924e561c08437303d8afa311503f5f30cf4f167896f4a7f47
@@ -24,7 +24,6 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  spec.add_development_dependency "rspec", "~> 3.3"
26
26
 
27
- spec.add_runtime_dependency "activefacts-metamodel", "~> 1", ">= 1.9.20"
28
- spec.add_runtime_dependency "treetop", [">= 1.4.14", "~> 1.4"]
27
+ spec.add_runtime_dependency "activefacts-metamodel", "~> 1", ">= 1.9.21"
28
+ spec.add_runtime_dependency "treetop", ["~> 1.6", ">= 1.6.9"]
29
29
  end
30
-
@@ -134,7 +134,7 @@ module ActiveFacts
134
134
  start_line = @string.line_of(node.interval.first)
135
135
  end_line = @string.line_of(node.interval.last-1)
136
136
  lines = start_line != end_line ? "s #{start_line}-#{end_line}" : " #{start_line.to_s}"
137
- ne = StandardError.new("at line#{lines} #{e.message.strip}")
137
+ ne = StandardError.new("at line#{lines}, #{e.message.strip}")
138
138
  ne.set_backtrace(e.backtrace)
139
139
  raise ne
140
140
  end
@@ -518,16 +518,6 @@ module ActiveFacts
518
518
  @regular_expression = ast[:regular_expression]
519
519
  end
520
520
 
521
- def assert_value(val)
522
- if val.is_a?(String)
523
- @constellation.Value(eval(val), true, nil)
524
- elsif val
525
- @constellation.Value(val.to_s, false , nil)
526
- else
527
- nil
528
- end
529
- end
530
-
531
521
  def compile
532
522
  @constraint = @constellation.ValueConstraint(:new)
533
523
  raise "Units on value constraints are not yet processed (at line #{'REVISIT'})" if @units
@@ -537,8 +527,8 @@ module ActiveFacts
537
527
  @value_ranges.each do |range|
538
528
  min, max = Array === range ? range : [range, range]
539
529
  v_range = @constellation.ValueRange(
540
- min && @constellation.Bound(:value => assert_value(min), :is_inclusive => true),
541
- max && @constellation.Bound(:value => assert_value(max), :is_inclusive => true))
530
+ min && @constellation.Bound(:value => assert_literal_value(min), :is_inclusive => true),
531
+ max && @constellation.Bound(:value => assert_literal_value(max), :is_inclusive => true))
542
532
  ar = @constellation.AllowedRange(@constraint, v_range)
543
533
  end
544
534
  else
@@ -39,13 +39,16 @@ module ActiveFacts
39
39
  def build_step query, clause, roles_by_binding = {}, parent_variable = nil
40
40
  return unless clause.refs.size > 0 # Empty clause... really?
41
41
 
42
- step = @constellation.Step(
43
- query, query.all_step.size,
44
- :fact_type => clause.fact_type,
45
- :alternative_set => nil,
46
- :is_disallowed => clause.certainty == false,
47
- :is_optional => clause.certainty == nil
48
- )
42
+ # A bare object type is a valid clause, but it contains no fact type hence no step
43
+ if clause.fact_type
44
+ step = @constellation.Step(
45
+ query, query.all_step.size,
46
+ :fact_type => clause.fact_type,
47
+ :alternative_set => nil,
48
+ :is_disallowed => clause.certainty == false,
49
+ :is_optional => clause.certainty == nil
50
+ )
51
+ end
49
52
 
50
53
  trace :query, "Creating Plays for #{clause.inspect} with #{clause.refs.size} refs" do
51
54
  is_input = true
@@ -108,6 +108,16 @@ module ActiveFacts
108
108
  def source
109
109
  @tree.text_value
110
110
  end
111
+
112
+ def assert_literal_value(val)
113
+ if val.is_a?(String)
114
+ @constellation.Value(eval(val), true, nil)
115
+ elsif val
116
+ @constellation.Value(val.to_s, false , nil)
117
+ else
118
+ nil
119
+ end
120
+ end
111
121
  end
112
122
 
113
123
  class Vocabulary < Definition
@@ -99,27 +99,44 @@ module ActiveFacts
99
99
  end
100
100
 
101
101
  def compile
102
- length, scale = *@parameters
102
+ ordered_parameters, named_parameters = @parameters.partition{|p| Integer === p}
103
+ length, scale = *ordered_parameters
103
104
 
104
105
  # Create the base type unless it already exists:
105
106
  base_type = nil
106
107
  if (@base_type_name != @name)
107
108
  unless base_type = @vocabulary.valid_value_type_name(@base_type_name)
108
109
  base_type = @constellation.ValueType(@vocabulary, @base_type_name, :concept => :new)
109
- return base_type if @base_type_name == @name
110
110
  end
111
111
  end
112
112
 
113
113
  # Create and initialise the ValueType:
114
114
  vt = @vocabulary.valid_value_type_name(@name) ||
115
115
  @constellation.ValueType(@vocabulary, @name, :concept => :new)
116
+
117
+ # Apply independence:
116
118
  vt.is_independent = true if @pragmas.delete('independent')
119
+
120
+ # Apply pragmas:
117
121
  @pragmas.each do |p|
118
122
  @constellation.ConceptAnnotation(:concept => vt.concept, :mapping_annotation => p)
119
123
  end if @pragmas
120
- vt.supertype = base_type if base_type
121
- vt.length = length if length
122
- vt.scale = scale if scale
124
+
125
+ # Apply supertype
126
+ if base_type and base_type != vt
127
+ raise "You may not change the supertype of #{vt.name} from #{vt.supertype.name} to #{base_type.name}" if vt.supertype && vt.supertype != base_type
128
+ vt.supertype = base_type
129
+ end
130
+
131
+ # Apply ordered parameters:
132
+ if length
133
+ raise "You may not change the length of #{vt.name} from #{vt.length} to #{length}" if vt.length && vt.length != length
134
+ vt.length = length
135
+ end
136
+ if scale
137
+ raise "You may not change the scale of #{vt.name} from #{vt.scale} to #{scale}" if vt.scale && vt.scale != scale
138
+ vt.scale = scale
139
+ end
123
140
  vt.transaction_phase = @auto_assigned_at
124
141
 
125
142
  unless @unit.empty?
@@ -140,18 +157,110 @@ module ActiveFacts
140
157
  @constellation.Derivation(unit, base_unit).exponent = exponent
141
158
  end
142
159
  end
160
+ raise "You may not change the units of #{vt.name} from #{vt.unit.describe} to #{unit.describe}" if vt.unit && vt.unit != unit
143
161
  vt.unit = unit
144
162
  end
145
163
 
164
+ # Apply a value constraint:
146
165
  if @value_constraint
147
- @value_constraint.constellation = @constellation
166
+ @value_constraint.constellation = @constellation # Pass constellation to the value_constraint compiler
167
+ raise "#{vt.name} is already constrained to #{vt.value_constraint.describe} so you can't change it to #{@value_constraint.describe}" if vt.value_constraint && vt.value_constraint != value_constraint
148
168
  vt.value_constraint = @value_constraint.compile
149
169
  end
150
170
 
171
+ # Apply a context note:
151
172
  if @context_note
152
173
  @context_note.compile(@constellation, vt)
153
174
  end
154
175
 
176
+ # Apply named parameter (definitions, restrictions, and settings):
177
+ trace :vtp, "Applying named parameters for #{@name}" do
178
+ named_parameters.each do |(kind, vtp_name, *rest)|
179
+ # Look up an existing definition of the parameter:
180
+ vtp = nil
181
+ vt.supertypes_transitive.detect do |st|
182
+ vtp = st.all_value_type_parameter.detect{|evtp| evtp.name == vtp_name}
183
+ end
184
+
185
+ trace :vtp, "Applying #{kind} of named parameter #{vtp_name}" do
186
+ restrictions = nil
187
+ case kind
188
+ when :definition
189
+ raise "You may not redefine parameter #{vtp_name} of #{vt.name}" if vtp
190
+ trace :vtp, "Defining parameter #{vtp_name} for #{vt.name}" do
191
+ parameter_value_type_name = rest.shift.term
192
+ parameter_value_type = @vocabulary.valid_value_type_name(parameter_value_type_name)
193
+ raise "Type #{parameter_value_type_name} for parameter #{vtp_name} of #{vt.name} is not defined" unless parameter_value_type
194
+ vtp = @constellation.ValueTypeParameter(value_type: vt, name: vtp_name, parameter_value_type: parameter_value_type)
195
+ restrictions = rest[0]
196
+ end
197
+
198
+ when :restriction
199
+ raise "parameter #{vtp_name} of #{vt.name} is not defined" unless vtp
200
+ trace :vtp, "Restricting parameter #{vtp_name} for #{vt.name} to #{rest[0].inspect}"
201
+ restrictions = rest[0]
202
+
203
+ when :setting
204
+ raise "parameter #{vtp_name} of #{vt.name} is not defined" unless vtp
205
+ # A Setting is a single-valued restriction
206
+ trace :vtp, "Setting parameter #{vtp_name} for #{vt.name} to #{[rest[0]].inspect}"
207
+ restrictions = [rest[0]]
208
+ else
209
+ raise "AST error: unknown valuetype parameter #{kind}"
210
+ end
211
+
212
+ if restrictions && restrictions[0] == :value
213
+ # This is a value restriction which perhaps sets the RestrictionStyle
214
+ value = restrictions[1]
215
+ vtp.restriction_style = restrictions[2]
216
+ case restrictions[2]
217
+ when '', nil
218
+ restrictions = [[value, value]]
219
+ when 'min'
220
+ restrictions = [[value, nil]]
221
+ when 'max'
222
+ restrictions = [[nil, value]] # Or should it be [0, value]? But we can get that using a range...
223
+ end
224
+ trace :vtp, "Setting value for parameter #{vtp_name} for #{vt.name} to #{value.inspect} with style #{vtp.restriction_style.inspect}"
225
+ end
226
+
227
+ if restrictions
228
+ # Find all ValueTypeParameterRestrictions for this parameter in this type's closest restricted supertype
229
+ vtprs = nil
230
+ restricted_supertype = nil
231
+ vt.supertypes_transitive.detect do |st|
232
+ vtprs = st.all_value_type_parameter_restriction.select{|evtpr| evtpr.value_type_parameter == vtp}
233
+ vtprs = nil if vtprs.empty?
234
+ restricted_supertype = st
235
+ trace :vtp, "Existing #{vtp_name} restriction on #{st.name} allows #{vt.name} to use #{vtprs.map(&:value_range).inspect}" if vtprs
236
+ vtprs
237
+ end
238
+
239
+ if vtprs && vt == restricted_supertype
240
+ raise "You can't change the existing restrictions on parameter #{vtp_name} of #{vt.name}"
241
+ end
242
+
243
+ trace :vtp, "Restricting parameter #{vtp_name}#{vt != vtp.value_type ? " (of #{vtp.value_type.name})" : ''} for #{vt.name} to #{restrictions.inspect}" do
244
+ restrictions.each do |restriction|
245
+
246
+ min, max = Array === restriction ? restriction : [restriction, restriction]
247
+ value_range = @constellation.ValueRange(
248
+ min && @constellation.Bound(:value => assert_literal_value(min), :is_inclusive => true),
249
+ max && @constellation.Bound(:value => assert_literal_value(max), :is_inclusive => true)
250
+ )
251
+
252
+ # This restriction may not widen the supertype's restriction:
253
+ if vtprs && !vtprs.detect{|r| r.value_range.includes?(value_range)}
254
+ raise "#{vtp_name} of #{@name} may not be set to #{restriction} because #{vtprs[0].value_type.name} restricts it to #{vtprs.map(&:value_range).map(&:inspect)*', '}"
255
+ end
256
+ @constellation.ValueTypeParameterRestriction(value_type: vt, value_type_parameter: vtp, value_range: value_range)
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
262
+ end
263
+
155
264
  vt
156
265
  end
157
266
 
@@ -258,7 +258,7 @@ module ActiveFacts
258
258
  begin
259
259
  node = parse(InputProxy.new(input, context, self), :index => @index)
260
260
  unless node
261
- raise failure_reason unless @index == input.size
261
+ raise failure_reason || "not all input was understood" unless @index == input.size
262
262
  return nil # No input, or no more input
263
263
  end
264
264
  if @block
@@ -54,7 +54,8 @@ module ActiveFacts
54
54
  rule definition_body
55
55
  vocabulary_definition
56
56
  / import_definition
57
- / prescan # Always fails, but its side-effects are needed in the following
57
+ # Magic here to avoid a Treetop bug with sem-preds, which require a sequence (this doesn't need to make a sequence)
58
+ / '' &{|s| _nt_prescan; false } # Always fails, but its side-effects are needed in the following
58
59
  / constraint
59
60
  / unit_definition # REVISIT: Move this above the prescan?
60
61
  / object_type
@@ -160,23 +161,34 @@ module ActiveFacts
160
161
 
161
162
  rule informal_description
162
163
  informally s ',' s
163
- subject:(
164
- signifier:each S term # Informal definition of an object type
165
- /
166
- signifier:when S reading:phrase+ s ',' # or a fact type
167
- ) s
168
- text:(!(!. / '.' [ \t\r]* "\n") (string / .))* # Allow . inside a string
169
- (!. / '.' [ \t\r]* "\n") # The description terminates in a fullstop at the end of a line, or EOF
164
+ subject:informal_description_subject s
165
+ informal_description_body
166
+ informal_description_closer
170
167
  {
171
168
  def ast
172
169
  kind = subject.signifier.text_value.to_sym
173
170
  subject_name = (kind == :each ? subject.term.text_value : subject.reading.text_value)
174
171
  phrases = subject.reading.elements.map(&:ast) if kind == :when
175
- Compiler::InformalDefinition.new(kind, subject_name, phrases, text.text_value)
172
+ Compiler::InformalDefinition.new(kind, subject_name, phrases, informal_description_body.text_value)
176
173
  end
177
174
  }
178
175
  end
179
176
 
177
+ rule informal_description_subject
178
+ signifier:each S term # Informal definition of an object type
179
+ /
180
+ signifier:when S reading:phrase+ s ',' # or a fact type
181
+ end
182
+
183
+ rule informal_description_body
184
+ (!informal_description_closer (string / .))* # Allow . inside a string
185
+ end
186
+
187
+ # The description terminates in a fullstop at the end of a line, or EOF
188
+ rule informal_description_closer
189
+ (!. / '.' [ \t\r]* "\n")
190
+ end
191
+
180
192
  rule constraint
181
193
  subset_constraint /
182
194
  equality_constraint /
@@ -225,7 +225,7 @@ module ActiveFacts
225
225
 
226
226
  rule agg_of of end
227
227
  rule agg_in in end
228
- rule restricted_to 'restricted' s 'to' s !alphanumeric end
228
+ rule restricted_to restricted s 'to' s !alphanumeric end
229
229
  # any is optionally used in an identifying role_list
230
230
  rule any one / a end
231
231
 
@@ -254,6 +254,7 @@ module ActiveFacts
254
254
  rule some 'some' !alphanumeric end
255
255
 
256
256
  # >>>>>>>>>>>>>>>>>>>> External vocabulary <<<<<<<<<<<<<<<<<<<<
257
+ rule accepts 'accepts' !alphanumeric end
257
258
  rule according_to 'according' S to end
258
259
  rule acyclic 'acyclic' !alphanumeric end
259
260
  rule alias 'alias' !alphanumeric end
@@ -284,7 +285,9 @@ module ActiveFacts
284
285
  rule it 'it' !alphanumeric end
285
286
  rule its 'its' !alphanumeric end
286
287
  rule masculine 'masculine' !alphanumeric end
288
+ rule max 'max' !alphanumeric end
287
289
  rule maybe 'maybe' !alphanumeric end
290
+ rule min 'min' !alphanumeric end
288
291
  rule only 'only' !alphanumeric end
289
292
  rule or 'or' !alphanumeric end
290
293
  rule of 'of' !alphanumeric end
@@ -294,6 +297,8 @@ module ActiveFacts
294
297
  rule personal 'personal' !alphanumeric end
295
298
  rule radix_point '.' end
296
299
  rule reflexive 'reflexive' !alphanumeric end
300
+ rule restricted 'restricted' !alphanumeric end
301
+ rule restricts 'restricts' !alphanumeric end
297
302
  rule returning 'returning' !alphanumeric end
298
303
  rule schema 'schema' !alphanumeric end
299
304
  rule separate 'separate' !alphanumeric end
@@ -312,11 +317,12 @@ module ActiveFacts
312
317
  rule true 'true' !alphanumeric end
313
318
  rule version 'version' !alphanumeric end
314
319
  rule vocabulary 'vocabulary' !alphanumeric end
320
+ rule was 'was' !alphanumeric end
315
321
  rule when 'when' !alphanumeric end
316
322
  rule where 'where' !alphanumeric end
317
323
  rule which 'which' !alphanumeric end
318
- rule was 'was' !alphanumeric end
319
324
  rule who 'who' !alphanumeric end
325
+ rule with 'with' !alphanumeric end
320
326
 
321
327
  end
322
328
  end
@@ -256,6 +256,7 @@ module ActiveFacts
256
256
  rule according_to 'selon' !alphanumeric end
257
257
  rule acyclic 'acyclique' !alphanumeric end
258
258
  rule alias 'alias' !alphanumeric end
259
+ rule accepts 'accepte' !alphanumeric end
259
260
  rule and 'et' !alphanumeric end
260
261
  rule antisymmetric 'antisymmetric' !alphanumeric end
261
262
  rule approximately 'environ' !alphanumeric end # REVISIT: google translate
@@ -282,7 +283,9 @@ module ActiveFacts
282
283
  rule is est end # Called from ObjectTypes.treetop in "is identified by"
283
284
  rule its ('sa' / 'son') !alphanumeric end
284
285
  rule masculine 'masculin' !alphanumeric end
286
+ rule max 'max' !alphanumeric end
285
287
  rule maybe 'peut-être' !alphanumeric end # REVISIT: eventuellement = possibly?
288
+ rule min 'min' !alphanumeric end
286
289
  rule only 'que' !alphanumeric end # REVISIT: Used in constraints
287
290
  rule or 'ou' !alphanumeric end
288
291
  rule ordering_prefix by s (ascending/descending)? s end
@@ -291,6 +294,8 @@ module ActiveFacts
291
294
  rule personal 'personelle' !alphanumeric end
292
295
  rule radix_point ',' end
293
296
  rule reflexive 'réflexive' !alphanumeric end
297
+ rule restricted 'limité' !alphanumeric s end
298
+ rule restricts 'limit' [ée] !alphanumeric s end
294
299
  rule returning 'retour' !alphanumeric end
295
300
  rule separate 'distincte' !alphanumeric end
296
301
  rule schema 'schema' !alphanumeric end
@@ -312,6 +317,7 @@ module ActiveFacts
312
317
  rule vocabulary 'vocabulaire' !alphanumeric end
313
318
  rule where 'où' !alphanumeric end
314
319
  rule who 'qui' !alphanumeric end
320
+ rule with 'avec' !alphanumeric end
315
321
 
316
322
  end
317
323
  end
@@ -31,6 +31,8 @@ module ActiveFacts
31
31
  end
32
32
 
33
33
  rule prescan
34
+ informally_prescan
35
+ /
34
36
  s each?
35
37
  s (
36
38
  term_definition_name mapping_pragmas entity_prefix
@@ -50,14 +52,27 @@ module ActiveFacts
50
52
  prescan_rest
51
53
  &{|s|
52
54
  # Wipe any terminal failures that were added:
53
- @terminal_failures = []
54
- @max_terminal_failure_index = start_index
55
+ forget_failures_to_here
55
56
 
56
57
  # puts "========== prescan is complete on #{(s.map{|e|e.text_value}*" ").inspect} =========="
57
58
  false
58
59
  }
59
60
  end
60
61
 
62
+ rule informally_prescan
63
+ informally s ',' s
64
+ informal_description_subject_prescan s
65
+ informal_description_body
66
+ informal_description_closer
67
+ end
68
+
69
+ rule informal_description_subject_prescan
70
+ each S term_definition_name # Informal definition of an object type
71
+ /
72
+ when S phrase+ s ',' # or a fact type; we can't forward-reference these
73
+ # This could memoize a bad parse for 'phrase'!!!
74
+ end
75
+
61
76
  # Do a first-pass mainly lexical analysis, looking for role name definitions and adjectives,
62
77
  # for use in detecting terms later.
63
78
  rule prescan_rest
@@ -74,9 +89,8 @@ module ActiveFacts
74
89
  / id
75
90
  # / literal # REVISIT: Literals might contain "(as Foo)" and mess things up
76
91
  / range # Covers all numbers and strings
77
- / comparator # handle two-character operators
78
92
  / S # White space and comments, must precede / and *
79
- / [-+{}\[\].,:^/%*()] # All other punctuation and operators
93
+ / [^;] # Skip anything else, we want the prescan to finish
80
94
  )* [?;] s
81
95
  end
82
96
 
@@ -62,12 +62,51 @@ module ActiveFacts
62
62
  end
63
63
 
64
64
  rule type_parameter_list
65
- head:number s tail:( ',' s number s )*
66
- {
65
+ head:parameter s tail:( ',' s parameter s)*
66
+ {
67
67
  def values
68
- [head.value, *tail.elements.map{|i| i.number.value}]
68
+ [head.value, *tail.elements.map{|i| i.parameter.value}]
69
69
  end
70
- }
70
+ }
71
+ end
72
+
73
+ rule parameter
74
+ number / named_parameter
75
+ end
76
+
77
+ rule ordered_parameter
78
+ number
79
+ end
80
+
81
+ rule named_parameter
82
+ ( # Set the value for a parameter
83
+ with s parameter_name as s literal:parameter_literal
84
+ /
85
+ parameter_name ':' s literal:parameter_literal
86
+ ) <Parser::ValueTypeParameterSetting>
87
+ / # Define a new parameter
88
+ accepts s parameter_name as value_type:term s vr:(restricted s to s parameter_restriction)? <Parser::ValueTypeParameterDefinition>
89
+ / # Restrict values for a parameter
90
+ restricts s parameter_name to s parameter_restriction <Parser::ValueTypeParameterRestriction>
91
+ end
92
+
93
+ rule parameter_name
94
+ !(with/accepts/restricts/as/term) id s
95
+ { def value; id.text_value; end }
96
+ end
97
+
98
+ rule parameter_literal
99
+ number
100
+ / # We need the text_value of a string here, not the result of parsing it
101
+ string { def value; text_value; end }
102
+ end
103
+
104
+ rule parameter_restriction
105
+ range_list s
106
+ { def values; range_list.ranges; end}
107
+ /
108
+ parameter_literal s direction:(min / max)? s
109
+ { def values; [:value, parameter_literal.value, direction.text_value]; end}
71
110
  end
72
111
 
73
112
  rule unit_definition
@@ -44,6 +44,24 @@ module ActiveFacts
44
44
  :term
45
45
  end
46
46
  end
47
+
48
+ module ValueTypeParameterSetting
49
+ def value
50
+ [:setting, parameter_name.value, literal.value]
51
+ end
52
+ end
53
+
54
+ module ValueTypeParameterDefinition
55
+ def value
56
+ [:definition, parameter_name.value, value_type.ast, vr.empty? ? nil : vr.parameter_restriction.values]
57
+ end
58
+ end
59
+
60
+ module ValueTypeParameterRestriction
61
+ def value
62
+ [:restriction, parameter_name.value, parameter_restriction.values]
63
+ end
64
+ end
47
65
  end
48
66
  end
49
67
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveFacts
2
2
  module CQL
3
- VERSION = "1.9.3"
3
+ VERSION = "1.9.4"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activefacts-cql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.3
4
+ version: 1.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clifford Heath
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-10 00:00:00.000000000 Z
11
+ date: 2018-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -61,7 +61,7 @@ dependencies:
61
61
  version: '1'
62
62
  - - ">="
63
63
  - !ruby/object:Gem::Version
64
- version: 1.9.20
64
+ version: 1.9.21
65
65
  type: :runtime
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
@@ -71,27 +71,27 @@ dependencies:
71
71
  version: '1'
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: 1.9.20
74
+ version: 1.9.21
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: treetop
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: 1.4.14
82
79
  - - "~>"
83
80
  - !ruby/object:Gem::Version
84
- version: '1.4'
81
+ version: '1.6'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 1.6.9
85
85
  type: :runtime
86
86
  prerelease: false
87
87
  version_requirements: !ruby/object:Gem::Requirement
88
88
  requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: 1.4.14
92
89
  - - "~>"
93
90
  - !ruby/object:Gem::Version
94
- version: '1.4'
91
+ version: '1.6'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.6.9
95
95
  description: Compiler for the Constellation Query Language, part of the ActiveFacts
96
96
  suite for Fact Modeling
97
97
  email: