sparkql 0.1.8 → 0.3.2
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 +15 -0
- data/.gitignore +2 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +11 -0
- data/GRAMMAR.md +208 -0
- data/Gemfile +1 -1
- data/README.md +2 -2
- data/Rakefile +17 -4
- data/VERSION +1 -1
- data/lib/sparkql/errors.rb +10 -8
- data/lib/sparkql/expression_state.rb +7 -4
- data/lib/sparkql/function_resolver.rb +172 -3
- data/lib/sparkql/geo/record_circle.rb +18 -0
- data/lib/sparkql/geo.rb +1 -0
- data/lib/sparkql/lexer.rb +10 -14
- data/lib/sparkql/parser.rb +171 -97
- data/lib/sparkql/parser.y +111 -8
- data/lib/sparkql/parser_compatibility.rb +68 -28
- data/lib/sparkql/parser_tools.rb +104 -20
- data/lib/sparkql/token.rb +7 -5
- data/script/bootstrap +7 -0
- data/script/ci_build +7 -0
- data/script/markdownify.rb +63 -0
- data/script/release +6 -0
- data/sparkql.gemspec +7 -2
- data/test/test_helper.rb +2 -1
- data/test/unit/errors_test.rb +30 -0
- data/test/unit/expression_state_test.rb +38 -0
- data/test/unit/function_resolver_test.rb +112 -6
- data/test/unit/geo/record_circle_test.rb +15 -0
- data/test/unit/lexer_test.rb +44 -1
- data/test/unit/parser_compatability_test.rb +88 -17
- data/test/unit/parser_test.rb +259 -0
- metadata +127 -126
- data/.rvmrc +0 -2
data/test/unit/parser_test.rb
CHANGED
@@ -21,6 +21,10 @@ class ParserTest < Test::Unit::TestCase
|
|
21
21
|
assert_equal 10.to_s, expression.first[:value]
|
22
22
|
assert_equal 11.to_s, expression.last[:value]
|
23
23
|
assert_equal 'Or', expression.last[:conjunction]
|
24
|
+
expression = @parser.parse('Test Eq 10 Not Test Ne 11')
|
25
|
+
assert_equal 10.to_s, expression.first[:value]
|
26
|
+
assert_equal 11.to_s, expression.last[:value]
|
27
|
+
assert_equal 'Not', expression.last[:conjunction]
|
24
28
|
end
|
25
29
|
|
26
30
|
def test_tough_conjunction
|
@@ -28,6 +32,7 @@ class ParserTest < Test::Unit::TestCase
|
|
28
32
|
expression = @parser.parse('Test Eq 10 Or Test Ne 11 And Test Ne 9')
|
29
33
|
assert_equal 9.to_s, expression.last[:value]
|
30
34
|
assert_equal 'And', expression.last[:conjunction]
|
35
|
+
assert_equal '9', expression.last[:condition]
|
31
36
|
end
|
32
37
|
|
33
38
|
def test_grouping
|
@@ -48,6 +53,7 @@ class ParserTest < Test::Unit::TestCase
|
|
48
53
|
@parser = Parser.new
|
49
54
|
expression = @parser.parse('(Test Eq 10,11,12)').first
|
50
55
|
assert_equal [10.to_s,11.to_s,12.to_s], expression[:value]
|
56
|
+
assert_equal '10,11,12', expression[:condition]
|
51
57
|
end
|
52
58
|
|
53
59
|
def parse(q,v)
|
@@ -69,6 +75,14 @@ class ParserTest < Test::Unit::TestCase
|
|
69
75
|
[0,1,1,0,0]
|
70
76
|
)
|
71
77
|
end
|
78
|
+
|
79
|
+
def test_nesting_and_functions
|
80
|
+
# Nesting with a function thrown in. Yes, this was a problem.
|
81
|
+
assert_nesting(
|
82
|
+
"City Eq 'Fargo' Or (BathsFull Eq 1 And Location Eq rectangle('35.12 -68.33, 35.13 -68.32')) Or Location Eq radius('35.12 -68.33',10.0) Or City Eq 'Dilworth'",
|
83
|
+
[0,1,1,0,0]
|
84
|
+
)
|
85
|
+
end
|
72
86
|
|
73
87
|
def test_multilevel_nesting
|
74
88
|
assert_nesting(
|
@@ -111,6 +125,26 @@ class ParserTest < Test::Unit::TestCase
|
|
111
125
|
assert @parser.fatal_errors?, "Should be nil: #{@parser.errors.inspect}"
|
112
126
|
end
|
113
127
|
|
128
|
+
def test_function_months
|
129
|
+
dt = DateTime.new(2014, 1, 5, 0, 0, 0, 0)
|
130
|
+
DateTime.expects(:now).returns(dt)
|
131
|
+
@parser = Parser.new
|
132
|
+
expressions = @parser.parse "ExpirationDate Gt months(-3)"
|
133
|
+
assert !@parser.errors?, "errors :( #{@parser.errors.inspect}"
|
134
|
+
assert_equal "2013-10-05", expressions.first[:value]
|
135
|
+
assert_equal 'months(-3)', expressions.first[:condition]
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_function_years
|
139
|
+
dt = DateTime.new(2014, 1, 5, 0, 0, 0, 0)
|
140
|
+
DateTime.expects(:now).returns(dt)
|
141
|
+
@parser = Parser.new
|
142
|
+
expressions = @parser.parse "SoldDate Lt years(2)"
|
143
|
+
assert !@parser.errors?, "errors :( #{@parser.errors.inspect}"
|
144
|
+
assert_equal "2016-01-05", expressions.first[:value]
|
145
|
+
assert_equal 'years(2)', expressions.first[:condition]
|
146
|
+
end
|
147
|
+
|
114
148
|
def test_function_days
|
115
149
|
d = Date.today
|
116
150
|
dt = DateTime.new(d.year, d.month,d.day, 0,0,0, DateTime.now.offset)
|
@@ -119,6 +153,8 @@ class ParserTest < Test::Unit::TestCase
|
|
119
153
|
@parser = Parser.new
|
120
154
|
expressions = @parser.parse(filter)
|
121
155
|
assert !@parser.errors?, "errors #{@parser.errors.inspect}"
|
156
|
+
assert_equal 'days(-7)', expressions.first[:condition]
|
157
|
+
|
122
158
|
test_time = Time.parse(expressions.first[:value])
|
123
159
|
|
124
160
|
assert (-605000 < test_time - start && -604000 > test_time - start), "Time range off by more than five seconds #{test_time - start} '#{test_time} - #{start}'"
|
@@ -130,10 +166,135 @@ class ParserTest < Test::Unit::TestCase
|
|
130
166
|
@parser = Parser.new
|
131
167
|
expressions = @parser.parse(filter)
|
132
168
|
assert !@parser.errors?, "errors #{@parser.errors.inspect}"
|
169
|
+
assert_equal 'now()', expressions.first[:condition]
|
133
170
|
test_time = Time.parse(expressions.first[:value])
|
134
171
|
assert 5 > test_time - start, "Time range off by more than five seconds #{test_time - start}"
|
135
172
|
assert -5 < test_time - start, "Time range off by more than five seconds #{test_time - start}"
|
136
173
|
end
|
174
|
+
|
175
|
+
test "function data preserved in expression" do
|
176
|
+
filter = "OriginalEntryTimestamp Ge days(-7)"
|
177
|
+
@parser = Parser.new
|
178
|
+
expressions = @parser.parse(filter)
|
179
|
+
assert_equal 'days', expressions.first[:function_name]
|
180
|
+
assert_equal 'days(-7)', expressions.first[:condition]
|
181
|
+
assert_equal([-7], expressions.first[:function_parameters])
|
182
|
+
end
|
183
|
+
|
184
|
+
test "function rangeable " do
|
185
|
+
filter = "OriginalEntryTimestamp Bt days(-7),days(-1)"
|
186
|
+
@parser = Parser.new
|
187
|
+
expressions = @parser.parse(filter)
|
188
|
+
assert_equal(2, expressions.first[:value].size)
|
189
|
+
assert_equal 'days(-7),days(-1)', expressions.first[:condition]
|
190
|
+
end
|
191
|
+
|
192
|
+
test "mixed rangeable " do
|
193
|
+
filter = "OriginalEntryTimestamp Bt days(-7),2013-07-26"
|
194
|
+
@parser = Parser.new
|
195
|
+
expressions = @parser.parse(filter)
|
196
|
+
assert_equal(2, expressions.first[:value].size)
|
197
|
+
assert_equal("2013-07-26", expressions.first[:value].last)
|
198
|
+
assert_equal 'days(-7),2013-07-26', expressions.first[:condition]
|
199
|
+
end
|
200
|
+
|
201
|
+
test "function list" do
|
202
|
+
filter = "OriginalEntryTimestamp Eq days(-1),days(-7),days(-30)"
|
203
|
+
@parser = Parser.new
|
204
|
+
expressions = @parser.parse(filter)
|
205
|
+
assert_equal(3, expressions.first[:value].size)
|
206
|
+
assert_equal 'days(-1),days(-7),days(-30)', expressions.first[:condition]
|
207
|
+
end
|
208
|
+
|
209
|
+
test "mixed list" do
|
210
|
+
# TODO This is an unrealistic example. We need number functions or support
|
211
|
+
# for dates in lists
|
212
|
+
filter = "OriginalEntryTimestamp Eq 2014,days(-7)"
|
213
|
+
@parser = Parser.new
|
214
|
+
expressions = @parser.parse(filter)
|
215
|
+
assert_equal(2, expressions.first[:value].size)
|
216
|
+
assert_equal("2014", expressions.first[:value].first)
|
217
|
+
assert_equal '2014,days(-7)', expressions.first[:condition]
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
test "allow timezone offsets" do
|
222
|
+
values = [
|
223
|
+
"2013-07-26T10:22",
|
224
|
+
"2013-07-26T10:22Z",
|
225
|
+
"2013-07-26T10:22+01:00",
|
226
|
+
"2013-07-26T10:22:15+01:00",
|
227
|
+
"2013-07-26T10:22:15.1-01:00",
|
228
|
+
"2013-07-26T10:22:15.11+0100",
|
229
|
+
"2013-07-26T10:22:15.111-0100",
|
230
|
+
"2013-07-26T10:22:15.1111Z",
|
231
|
+
"2013-07-26T10:22:15.11111+01:00",
|
232
|
+
"2013-07-26T10:22:15.111111+01:00"
|
233
|
+
]
|
234
|
+
values.each do |value|
|
235
|
+
filter = "DatetimeField Eq #{value}"
|
236
|
+
@parser = Parser.new
|
237
|
+
expressions = @parser.parse(filter)
|
238
|
+
assert_not_nil expressions, "#{value} failed"
|
239
|
+
assert_equal expressions.first[:value], value, "#{value} failed"
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
test "Location Eq polygon()" do
|
244
|
+
filter = "Location Eq polygon('35.12 -68.33, 35.13 -68.33, 35.13 -68.32, 35.12 -68.32')"
|
245
|
+
@parser = Parser.new
|
246
|
+
expressions = @parser.parse(filter)
|
247
|
+
assert !@parser.errors?, "errors #{@parser.errors.inspect}"
|
248
|
+
assert_equal "polygon('35.12 -68.33, 35.13 -68.33, 35.13 -68.32, 35.12 -68.32')", expressions.first[:condition]
|
249
|
+
assert_equal :shape, expressions.first[:type]
|
250
|
+
assert_equal [[-68.33, 35.12], [-68.33, 35.13], [-68.32,35.13], [-68.32,35.12],[-68.33, 35.12]], expressions.first[:value].to_coordinates.first, "#{expressions.first[:value].inspect} "
|
251
|
+
end
|
252
|
+
|
253
|
+
test "Location Eq linestring()" do
|
254
|
+
filter = "Location Eq linestring('35.12 -68.33, 35.13 -68.33')"
|
255
|
+
@parser = Parser.new
|
256
|
+
expressions = @parser.parse(filter)
|
257
|
+
assert !@parser.errors?, "errors #{@parser.errors.inspect}"
|
258
|
+
assert_equal "linestring('35.12 -68.33, 35.13 -68.33')", expressions.first[:condition]
|
259
|
+
assert_equal :shape, expressions.first[:type]
|
260
|
+
assert_equal [[-68.33, 35.12], [-68.33, 35.13]], expressions.first[:value].to_coordinates, "#{expressions.first[:value].inspect} "
|
261
|
+
|
262
|
+
end
|
263
|
+
|
264
|
+
test "Location Eq rectangle()" do
|
265
|
+
filter = "Location Eq rectangle('35.12 -68.33, 35.13 -68.32')"
|
266
|
+
@parser = Parser.new
|
267
|
+
expressions = @parser.parse(filter)
|
268
|
+
assert !@parser.errors?, "errors #{@parser.errors.inspect}"
|
269
|
+
assert_equal :shape, expressions.first[:type]
|
270
|
+
assert_equal [[-68.33,35.12], [-68.32,35.12], [-68.32,35.13], [-68.33,35.13], [-68.33,35.12]], expressions.first[:value].to_coordinates.first, "#{expressions.first[:value].inspect} "
|
271
|
+
end
|
272
|
+
|
273
|
+
test "Location Eq radius()" do
|
274
|
+
# This exposed a funny nesting limit problem FUN!
|
275
|
+
filter = "Location Eq radius('35.12 -68.33',1.0)"
|
276
|
+
@parser = Parser.new
|
277
|
+
expressions = @parser.parse(filter)
|
278
|
+
assert !@parser.errors?, "errors #{@parser.errors.inspect}"
|
279
|
+
assert_equal :shape, expressions.first[:type]
|
280
|
+
assert_equal [-68.33, 35.12], expressions.first[:value].center.to_coordinates, "#{expressions.first[:value].inspect} "
|
281
|
+
assert_equal 1.0, expressions.first[:value].radius, "#{expressions.first[:value].inspect} "
|
282
|
+
end
|
283
|
+
|
284
|
+
test "Location eq radius() error on invalid syntax" do
|
285
|
+
filter = "Location Eq radius('35.12,-68.33',1.0)"
|
286
|
+
@parser = Parser.new
|
287
|
+
expressions = @parser.parse(filter)
|
288
|
+
assert @parser.errors?, "Parser error expected due to comma between radius points"
|
289
|
+
end
|
290
|
+
|
291
|
+
test "Location ALL TOGETHER NOW" do
|
292
|
+
filter = "Location Eq linestring('35.12 -68.33, 35.13 -68.33') And Location Eq radius('35.12 -68.33',1.0) And Location Eq rectangle('35.12 -68.33, 35.13 -68.32') And Location Eq polygon('35.12 -68.33, 35.13 -68.33, 35.13 -68.32, 35.12 -68.32')"
|
293
|
+
@parser = Parser.new
|
294
|
+
expressions = @parser.parse(filter)
|
295
|
+
assert !@parser.errors?, "errors #{@parser.errors.inspect}"
|
296
|
+
assert_equal [:shape,:shape,:shape,:shape], expressions.map{|e| e[:type]}
|
297
|
+
end
|
137
298
|
|
138
299
|
def test_for_reserved_words_first_literals_second
|
139
300
|
["OrOrOr Eq true", "Equador Eq true", "Oregon Ge 10"].each do |filter|
|
@@ -160,6 +321,7 @@ class ParserTest < Test::Unit::TestCase
|
|
160
321
|
'"General \'Property\' Description"."Taxes" Lt 500.0',
|
161
322
|
'"General Property Description"."Taxes #" Lt 500.0',
|
162
323
|
'"General$Description"."Taxes" Lt 500.0',
|
324
|
+
'"Garage Type"."1" Eq true',
|
163
325
|
'" a "." b " Lt 500.0'
|
164
326
|
].each do |filter|
|
165
327
|
@parser = Parser.new
|
@@ -190,6 +352,7 @@ class ParserTest < Test::Unit::TestCase
|
|
190
352
|
parse 'Test eQ true',true.to_s
|
191
353
|
parse 'Test EQ 10 AND Test NE 11', 10.to_s
|
192
354
|
parse 'Test eq 10 or Test ne 11', 10.to_s
|
355
|
+
parse 'Test eq 10 NOT Test ne 11', 10.to_s
|
193
356
|
end
|
194
357
|
|
195
358
|
def test_null
|
@@ -205,6 +368,102 @@ class ParserTest < Test::Unit::TestCase
|
|
205
368
|
end
|
206
369
|
end
|
207
370
|
end
|
371
|
+
|
372
|
+
def test_not_expression
|
373
|
+
@parser = Parser.new
|
374
|
+
expressions = @parser.parse('Test Lt 10 Not Test Eq 2')
|
375
|
+
assert !@parser.errors?, @parser.inspect
|
376
|
+
expression = expressions.last
|
377
|
+
assert_equal 2.to_s, expression[:value]
|
378
|
+
assert_equal "Not", expression[:conjunction]
|
379
|
+
assert_equal expression[:level], expression[:conjunction_level]
|
380
|
+
end
|
381
|
+
|
382
|
+
def test_not_unary_expression
|
383
|
+
@parser = Parser.new
|
384
|
+
expressions = @parser.parse('Not Test Eq 10')
|
385
|
+
assert !@parser.errors?, @parser.inspect
|
386
|
+
expression = expressions.first
|
387
|
+
assert_equal 10.to_s, expression[:value]
|
388
|
+
assert_equal "Not", expression[:unary]
|
389
|
+
assert_equal expression[:level], expression[:unary_level]
|
390
|
+
end
|
391
|
+
|
392
|
+
def test_not_expression_group
|
393
|
+
@parser = Parser.new
|
394
|
+
expressions = @parser.parse('Not (Test Eq 10 Or Test Eq 11)')
|
395
|
+
assert !@parser.errors?, @parser.inspect
|
396
|
+
expression = expressions.first
|
397
|
+
assert_equal 10.to_s, expression[:value]
|
398
|
+
assert_equal "Not", expression[:unary]
|
399
|
+
assert_equal 0, expression[:unary_level]
|
400
|
+
end
|
401
|
+
|
402
|
+
def test_not_unary_expression_keeps_conjunction
|
403
|
+
@parser = Parser.new
|
404
|
+
expressions = @parser.parse('Test Lt 10 Or (Not Test Eq 11)')
|
405
|
+
assert !@parser.errors?, @parser.inspect
|
406
|
+
expression = expressions.last
|
407
|
+
assert_equal 11.to_s, expression[:value]
|
408
|
+
assert_equal "Not", expression[:unary]
|
409
|
+
assert_equal "Or", expression[:conjunction]
|
410
|
+
assert_equal expression[:level], expression[:unary_level]
|
411
|
+
assert_equal 0, expression[:conjunction_level]
|
412
|
+
end
|
413
|
+
|
414
|
+
def test_expression_conditions_attribute
|
415
|
+
conditions = [
|
416
|
+
"1",
|
417
|
+
"1,2",
|
418
|
+
"1.0,2.1,3.1415",
|
419
|
+
"'a '",
|
420
|
+
"'A',' b'",
|
421
|
+
"'A','B ',' c'",
|
422
|
+
"radius('35.12 -68.33',1.0)",
|
423
|
+
"days(-1),days(-7)"
|
424
|
+
]
|
425
|
+
conditions.each do |condition|
|
426
|
+
@parser = Parser.new
|
427
|
+
expressions = @parser.parse("Test Eq #{condition}")
|
428
|
+
assert !@parser.errors?, @parser.inspect
|
429
|
+
expression = expressions.last
|
430
|
+
assert_equal condition, expression[:condition]
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
def test_bad_expressions_with_conditions_attribute
|
435
|
+
conditions = [
|
436
|
+
"BADSTRING",
|
437
|
+
"radius('46.8 -96.8',-20.0)"
|
438
|
+
]
|
439
|
+
conditions.each do |condition|
|
440
|
+
@parser = Parser.new
|
441
|
+
expressions = @parser.parse("Test Eq #{condition}")
|
442
|
+
assert @parser.errors?, @parser.inspect
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
446
|
+
def test_datetimes_as_ranges
|
447
|
+
["DatetimeField Bt 2013-07-26T10:22:15.422804,2013-07-26T10:22:15.422805",
|
448
|
+
"DateTimeField Bt 2013-07-26T10:22:15,2013-07-26T10:22:16",
|
449
|
+
"DateTimeField Bt 2013-07-26T10:22:15.422804-0300,2013-07-26T10:22:15.422805-0300",
|
450
|
+
"DateTimeField Bt 2013-07-26T10:22:15+0400,2013-07-26T10:22:16+0400"].each do |filter|
|
451
|
+
@parser = Parser.new
|
452
|
+
expression = @parser.parse filter
|
453
|
+
assert !@parser.errors?, "Filter '#{filter}' failed: #{@parser.errors.first.inspect}"
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
def test_coercible_types
|
458
|
+
@parser = Parser.new
|
459
|
+
assert_equal :datetime, @parser.coercible_types(:date, :datetime)
|
460
|
+
assert_equal :datetime, @parser.coercible_types(:datetime, :date)
|
461
|
+
assert_equal :decimal, @parser.coercible_types(:decimal, :integer)
|
462
|
+
assert_equal :decimal, @parser.coercible_types(:integer, :decimal)
|
463
|
+
# That covers the gambit, anything else should be null
|
464
|
+
assert_nil @parser.coercible_types(:integer, :date)
|
465
|
+
end
|
466
|
+
|
208
467
|
|
209
468
|
def parser_errors(filter)
|
210
469
|
@parser = Parser.new
|
metadata
CHANGED
@@ -1,129 +1,124 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sparkql
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 8
|
10
|
-
version: 0.1.8
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.2
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Wade McEwen
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
hash: 23
|
28
|
-
segments:
|
29
|
-
- 1
|
30
|
-
- 4
|
31
|
-
- 8
|
32
|
-
version: 1.4.8
|
33
|
-
version_requirements: *id001
|
11
|
+
date: 2015-05-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: georuby
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.0
|
20
|
+
type: :runtime
|
34
21
|
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
35
28
|
name: racc
|
36
|
-
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.4.8
|
37
34
|
type: :development
|
38
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
hash: 5
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
- 2
|
47
|
-
- 9
|
48
|
-
version: 0.2.9
|
49
|
-
version_requirements: *id002
|
50
35
|
prerelease: false
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.4.8
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
57
45
|
- - ~>
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
hash: 63
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
- 9
|
63
|
-
- 2
|
46
|
+
- !ruby/object:Gem::Version
|
64
47
|
version: 0.9.2
|
65
|
-
version_requirements: *id003
|
66
|
-
prerelease: false
|
67
|
-
name: rake
|
68
|
-
- !ruby/object:Gem::Dependency
|
69
48
|
type: :development
|
70
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
-
none: false
|
72
|
-
requirements:
|
73
|
-
- - ~>
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
hash: 11
|
76
|
-
segments:
|
77
|
-
- 2
|
78
|
-
- 1
|
79
|
-
- 0
|
80
|
-
version: 2.1.0
|
81
|
-
version_requirements: *id004
|
82
49
|
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.9.2
|
55
|
+
- !ruby/object:Gem::Dependency
|
83
56
|
name: test-unit
|
84
|
-
|
85
|
-
|
86
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
87
|
-
none: false
|
88
|
-
requirements:
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
89
59
|
- - ~>
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
|
92
|
-
|
93
|
-
- 1
|
94
|
-
- 6
|
95
|
-
version: "1.6"
|
96
|
-
version_requirements: *id005
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.1.0
|
62
|
+
type: :development
|
97
63
|
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.1.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
98
70
|
name: ci_reporter
|
99
|
-
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.6'
|
100
76
|
type: :development
|
101
|
-
|
102
|
-
|
103
|
-
requirements:
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
104
80
|
- - ~>
|
105
|
-
- !ruby/object:Gem::Version
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.6'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mocha
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.12.0
|
90
|
+
type: :development
|
113
91
|
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.12.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
114
98
|
name: rcov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.9.9
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.9.9
|
115
111
|
description: Specification and base implementation of the Spark API parsing system.
|
116
|
-
email:
|
112
|
+
email:
|
117
113
|
- wade@fbsdata.com
|
118
114
|
executables: []
|
119
|
-
|
120
115
|
extensions: []
|
121
|
-
|
122
116
|
extra_rdoc_files: []
|
123
|
-
|
124
|
-
files:
|
117
|
+
files:
|
125
118
|
- .gitignore
|
126
|
-
- .
|
119
|
+
- .ruby-version
|
120
|
+
- CHANGELOG.md
|
121
|
+
- GRAMMAR.md
|
127
122
|
- Gemfile
|
128
123
|
- README.md
|
129
124
|
- Rakefile
|
@@ -132,6 +127,8 @@ files:
|
|
132
127
|
- lib/sparkql/errors.rb
|
133
128
|
- lib/sparkql/expression_state.rb
|
134
129
|
- lib/sparkql/function_resolver.rb
|
130
|
+
- lib/sparkql/geo.rb
|
131
|
+
- lib/sparkql/geo/record_circle.rb
|
135
132
|
- lib/sparkql/lexer.rb
|
136
133
|
- lib/sparkql/parser.rb
|
137
134
|
- lib/sparkql/parser.y
|
@@ -139,45 +136,49 @@ files:
|
|
139
136
|
- lib/sparkql/parser_tools.rb
|
140
137
|
- lib/sparkql/token.rb
|
141
138
|
- lib/sparkql/version.rb
|
139
|
+
- script/bootstrap
|
140
|
+
- script/ci_build
|
141
|
+
- script/markdownify.rb
|
142
|
+
- script/release
|
142
143
|
- sparkql.gemspec
|
143
144
|
- test/test_helper.rb
|
145
|
+
- test/unit/errors_test.rb
|
144
146
|
- test/unit/expression_state_test.rb
|
145
147
|
- test/unit/function_resolver_test.rb
|
148
|
+
- test/unit/geo/record_circle_test.rb
|
146
149
|
- test/unit/lexer_test.rb
|
147
150
|
- test/unit/parser_compatability_test.rb
|
148
151
|
- test/unit/parser_test.rb
|
149
|
-
homepage:
|
150
|
-
licenses:
|
151
|
-
|
152
|
+
homepage: ''
|
153
|
+
licenses:
|
154
|
+
- Apache 2.0
|
155
|
+
metadata: {}
|
152
156
|
post_install_message:
|
153
157
|
rdoc_options: []
|
154
|
-
|
155
|
-
require_paths:
|
158
|
+
require_paths:
|
156
159
|
- lib
|
157
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
none: false
|
168
|
-
requirements:
|
169
|
-
- - ">="
|
170
|
-
- !ruby/object:Gem::Version
|
171
|
-
hash: 3
|
172
|
-
segments:
|
173
|
-
- 0
|
174
|
-
version: "0"
|
160
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - ! '>='
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: '0'
|
165
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
|
+
requirements:
|
167
|
+
- - ! '>='
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: '0'
|
175
170
|
requirements: []
|
176
|
-
|
177
171
|
rubyforge_project: sparkql
|
178
|
-
rubygems_version:
|
172
|
+
rubygems_version: 2.2.1
|
179
173
|
signing_key:
|
180
|
-
specification_version:
|
174
|
+
specification_version: 4
|
181
175
|
summary: API Parser engine for filter searching
|
182
|
-
test_files:
|
183
|
-
|
176
|
+
test_files:
|
177
|
+
- test/test_helper.rb
|
178
|
+
- test/unit/errors_test.rb
|
179
|
+
- test/unit/expression_state_test.rb
|
180
|
+
- test/unit/function_resolver_test.rb
|
181
|
+
- test/unit/geo/record_circle_test.rb
|
182
|
+
- test/unit/lexer_test.rb
|
183
|
+
- test/unit/parser_compatability_test.rb
|
184
|
+
- test/unit/parser_test.rb
|
data/.rvmrc
DELETED