gql 0.0.7 → 0.0.8

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
  SHA1:
3
- metadata.gz: c91705621b9dd8b0515c2d72859f30af612d5f24
4
- data.tar.gz: d5f410d2acdc7c18f9832058db5c70fd720f7b08
3
+ metadata.gz: afade4dbb867e9e0a602148b69032b9993271a70
4
+ data.tar.gz: b2fbe5c310949e6f14c76bd736297e8a33c06874
5
5
  SHA512:
6
- metadata.gz: 73cb1ed1e7bb3cdbdb4cb6cbe9eea50c8eeec8aac68d708f9bac42e9feb887bc44a03ed477b2f51da659b370c1bea5a2192490730885eaa33d2d9cee10225e73
7
- data.tar.gz: 2b41f407270151041915c441b9ff6ad790298d43ea925af074b4a7405d3b5475c27db40865c62e37d50d84e4d0fd373d6cd5cd5d26c82c86a9e126f32cb6adc6
6
+ metadata.gz: 8db790c55fb17a480541fb5f10af5133e535452e17dd701d569a47475075f125848ecd62c08194db2f3007aa74281349c26acd0c70e091fbb49ad8aca9291b8b
7
+ data.tar.gz: 4ac70838a5ac05d0f46362ddd98ee0834e2c5bab6ca49c98e6ddfe91400191f4730e7281553a025d43c05a5abaaf2fcfb0df365cfb29d45e32f0bb2cb280c30a
data/README.md CHANGED
@@ -148,8 +148,6 @@ This should result in the following JSON (after prettyfication):
148
148
 
149
149
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
150
150
 
151
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
152
-
153
151
 
154
152
  ## Contributing
155
153
 
data/Rakefile CHANGED
@@ -1,22 +1,35 @@
1
+ dir = File.dirname(__FILE__)
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rake/testtask'
3
5
 
4
- file 'lib/gql/tokenizer.rb' => 'lib/gql/tokenizer.rex' do |t|
6
+ file 'lib/gql/tokenizer.rb' => 'support/tokenizer.rex' do |t|
5
7
  sh "bundle exec rex #{t.prerequisites.first} --output-file #{t.name}"
8
+
9
+ # use custom scan error class
10
+ sh "sed --in-place 's/class ScanError/class Unused/' #{t.name}"
11
+ sh "sed --in-place 's/ScanError/GQL::Errors::ScanError/' #{t.name}"
6
12
  end
7
13
 
8
- file 'lib/gql/parser.rb' => 'lib/gql/parser.y' do |t|
14
+ file 'lib/gql/parser.rb' => 'support/parser.racc' do |t|
9
15
  if ENV['DEBUG']
10
16
  sh "bundle exec racc --debug --verbose --output-file=#{t.name} #{t.prerequisites.first}"
11
17
  else
12
18
  sh "bundle exec racc --output-file=#{t.name} #{t.prerequisites.first}"
13
19
  end
14
- end
15
20
 
16
- task :compile => ['lib/gql/tokenizer.rb', 'lib/gql/parser.rb']
21
+ # fix indentation of generated parser code to silence test warning
22
+ sh "sed --in-place 's/ end\s*# module/end #/g' #{t.name}"
23
+ end
17
24
 
18
- Rake::TestTask.new :test => :compile do |t|
25
+ Rake::TestTask.new :test do |t|
19
26
  t.libs << 'test'
27
+ t.test_files = Dir.glob("#{dir}/test/cases/**/*_test.rb")
28
+ # t.warning = true
29
+ # t.verbose = true
20
30
  end
21
31
 
32
+ task :compile => ['lib/gql/tokenizer.rb', 'lib/gql/parser.rb']
33
+ task :test => :compile
34
+ task :release => :test
22
35
  task :default => :test
data/bin/rake ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rake' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rake', 'rake')
data/gql.gemspec CHANGED
@@ -16,13 +16,12 @@ Gem::Specification.new do |spec|
16
16
 
17
17
  spec.required_ruby_version = '>= 2.2.0'
18
18
 
19
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|support)/}) }
20
20
  spec.bindir = 'exe'
21
21
  spec.require_paths = ['lib']
22
22
 
23
23
  spec.add_development_dependency 'bundler', '~> 1.8'
24
24
  spec.add_development_dependency 'rake', '~> 10.0'
25
- spec.add_development_dependency 'minitest'
26
25
  spec.add_development_dependency 'rexical', '~> 1.0'
27
26
  spec.add_development_dependency 'racc', '~> 1.4'
28
27
 
data/lib/gql.rb CHANGED
@@ -14,11 +14,12 @@ module GQL
14
14
  autoload :Parser, 'gql/parser'
15
15
  autoload :Simple, 'gql/simple'
16
16
  autoload :String, 'gql/string'
17
- autoload :Tokenizer, 'gql/tokenizer'
17
+ autoload :TestCase, 'gql/test_case'
18
18
  autoload :VERSION, 'gql/version'
19
19
 
20
20
  module Errors
21
21
  autoload :InvalidNodeClass, 'gql/errors'
22
+ autoload :ScanError, 'gql/errors'
22
23
  autoload :SyntaxError, 'gql/errors'
23
24
  autoload :UndefinedCall, 'gql/errors'
24
25
  autoload :UndefinedField, 'gql/errors'
@@ -61,23 +62,14 @@ module GQL
61
62
  end
62
63
 
63
64
  def parse(input)
64
- input = input.read if input.respond_to?(:read)
65
-
66
- tokenizer = Tokenizer.new
67
- tokenizer.scan_setup input
68
-
69
- parser = Parser.new(tokenizer)
70
- parser.parse
65
+ Parser.new(input).parse
71
66
  end
72
67
 
73
68
  def tokenize(input)
74
- input = input.read if input.respond_to?(:read)
75
-
76
- tokenizer = Tokenizer.new
77
- tokenizer.scan_setup input
69
+ parser = Parser.new(input)
78
70
 
79
71
  [].tap do |result|
80
- while token = tokenizer.next_token
72
+ while token = parser.next_token
81
73
  result << token
82
74
  yield token if block_given?
83
75
  end
data/lib/gql/call.rb CHANGED
@@ -2,7 +2,7 @@ require 'active_support/core_ext/class/attribute'
2
2
 
3
3
  module GQL
4
4
  class Call
5
- class_attribute :result_class, :proc, instance_accessor: false, instance_predicate: false
5
+ class_attribute :id, :result_class, :proc, instance_accessor: false, instance_predicate: false
6
6
 
7
7
  class << self
8
8
  def returns(result_class)
data/lib/gql/errors.rb CHANGED
@@ -52,11 +52,14 @@ module GQL
52
52
  end
53
53
 
54
54
  class SyntaxError < Error
55
- def initialize(value, token)
55
+ def initialize(lineno, value, token)
56
56
  token = 'character' if token == 'error' || token == %Q{"#{value}"}
57
57
 
58
- super("Unexpected #{token}: `#{value}`.")
58
+ super("Unexpected #{token}: `#{value}` (line #{lineno}).")
59
59
  end
60
60
  end
61
+
62
+ class ScanError < Error
63
+ end
61
64
  end
62
65
  end
data/lib/gql/node.rb CHANGED
@@ -25,13 +25,13 @@ module GQL
25
25
  class << self
26
26
  def call(id, *args)
27
27
  if id.is_a? Hash
28
- id.each do |id, call_class|
29
- call id, call_class
28
+ id.each do |name, call_class|
29
+ call name, call_class
30
30
  end
31
31
  else
32
32
  options = args.extract_options!
33
33
 
34
- proc_or_class = args.shift || -> (*args) { target.public_send(id, *args) }
34
+ proc_or_class = args.shift || -> (*pargs) { target.public_send(id, *pargs) }
35
35
  result_class = options[:returns] || proc_or_class.try(:result_class)
36
36
 
37
37
  if result_class.is_a? ::Array
@@ -51,8 +51,8 @@ module GQL
51
51
 
52
52
  call_class =
53
53
  if proc_or_class.is_a? Proc
54
- Class.new(Call).tap do |call_class|
55
- call_class.class_eval do
54
+ Class.new(Call).tap do |klass|
55
+ klass.class_eval do
56
56
  self.proc = proc_or_class
57
57
 
58
58
  def execute(*args)
@@ -60,12 +60,13 @@ module GQL
60
60
  end
61
61
  end
62
62
 
63
- self.const_set "#{id.to_s.camelize}Call", call_class
63
+ self.const_set "#{id.to_s.camelize}Call", klass
64
64
  end
65
65
  else
66
66
  proc_or_class
67
67
  end
68
68
 
69
+ call_class.id = id.to_s
69
70
  call_class.result_class = result_class
70
71
 
71
72
  self.calls = calls.merge(id.to_sym => call_class)
@@ -114,7 +115,7 @@ module GQL
114
115
  else
115
116
  super
116
117
  end
117
- rescue NoMethodError => exc
118
+ rescue NoMethodError
118
119
  raise Errors::UndefinedFieldType, method
119
120
  end
120
121
  end
data/lib/gql/parser.rb CHANGED
@@ -6,16 +6,17 @@
6
6
 
7
7
  require 'racc/parser.rb'
8
8
 
9
-
10
9
  require 'active_support/json'
11
10
  require 'active_support/core_ext/object/blank'
12
11
  require 'active_support/core_ext/object/try'
13
12
  require 'active_support/core_ext/object/json'
14
13
 
14
+ require 'gql/tokenizer'
15
+
15
16
  module GQL
16
17
  class Parser < Racc::Parser
17
18
 
18
- module_eval(<<'...end parser.y/module_eval...', 'parser.y', 134)
19
+ module_eval(<<'...end parser.racc/module_eval...', 'parser.racc', 135)
19
20
 
20
21
  class Query < Struct.new(:root, :variables)
21
22
  def as_json(*)
@@ -48,34 +49,9 @@ module_eval(<<'...end parser.y/module_eval...', 'parser.y', 134)
48
49
  end
49
50
  end
50
51
 
51
- UNESCAPE_MAP = Hash.new { |h, k| h[k] = k.chr }
52
-
53
- UNESCAPE_MAP.update(
54
- ?" => '"',
55
- ?\\ => '\\',
56
- ?/ => '/',
57
- ?b => "\b",
58
- ?f => "\f",
59
- ?n => "\n",
60
- ?r => "\r",
61
- ?t => "\t",
62
- ?u => nil,
63
- )
64
-
65
- EMPTY_8BIT_STRING = ''
66
-
67
- if String.method_defined? :encode
68
- EMPTY_8BIT_STRING.force_encoding Encoding::ASCII_8BIT
69
- end
70
-
71
- def initialize(tokenizer)
52
+ def initialize(str)
72
53
  super()
73
-
74
- @tokenizer = tokenizer
75
- end
76
-
77
- def next_token
78
- @tokenizer.next_token
54
+ scan_setup str
79
55
  end
80
56
 
81
57
  def parse
@@ -83,38 +59,14 @@ module_eval(<<'...end parser.y/module_eval...', 'parser.y', 134)
83
59
  end
84
60
 
85
61
  def on_error(token, value, vstack)
86
- raise Errors::SyntaxError.new(value, token_to_str(token))
62
+ raise Errors::SyntaxError.new(lineno, value, token_to_str(token))
87
63
  end
88
64
 
89
65
  private
90
- def unescape_string(str)
91
- string = str.gsub(%r((?:\\[\\bfnrt"/]|(?:\\u(?:[A-Fa-f\d]{4}))+|\\[\x20-\xff]))n) do |c|
92
- if u = UNESCAPE_MAP[$&[1]]
93
- u
94
- else # \uXXXX
95
- bytes = EMPTY_8BIT_STRING.dup
96
- i = 0
97
-
98
- while c[6 * i] == ?\\ && c[6 * i + 1] == ?u
99
- bytes << c[6 * i + 2, 2].to_i(16) << c[6 * i + 4, 2].to_i(16)
100
- i += 1
101
- end
102
-
103
- JSON.iconv('utf-8', 'utf-16be', bytes)
104
- end
105
- end
106
-
107
- if string.respond_to? :force_encoding
108
- string.force_encoding ::Encoding::UTF_8
109
- end
110
-
111
- string
112
- end
113
-
114
66
  def convert_number(str)
115
67
  str.count('.') > 0 ? str.to_f : str.to_i
116
68
  end
117
- ...end parser.y/module_eval...
69
+ ...end parser.racc/module_eval...
118
70
  ##### State transition tables begin ###
119
71
 
120
72
  racc_action_table = [
@@ -339,77 +291,77 @@ Racc_debug_parser = false
339
291
 
340
292
  # reduce 0 omitted
341
293
 
342
- module_eval(<<'.,.,', 'parser.y', 4)
294
+ module_eval(<<'.,.,', 'parser.racc', 4)
343
295
  def _reduce_1(val, _values, result)
344
296
  result = Query.new(val[1], val[0].merge(val[2]))
345
297
  result
346
298
  end
347
299
  .,.,
348
300
 
349
- module_eval(<<'.,.,', 'parser.y', 8)
301
+ module_eval(<<'.,.,', 'parser.racc', 8)
350
302
  def _reduce_2(val, _values, result)
351
303
  result = Field.new(nil, nil, val[0], nil )
352
304
  result
353
305
  end
354
306
  .,.,
355
307
 
356
- module_eval(<<'.,.,', 'parser.y', 9)
308
+ module_eval(<<'.,.,', 'parser.racc', 9)
357
309
  def _reduce_3(val, _values, result)
358
310
  result = Field.new(nil, nil, nil, val[1])
359
311
  result
360
312
  end
361
313
  .,.,
362
314
 
363
- module_eval(<<'.,.,', 'parser.y', 13)
315
+ module_eval(<<'.,.,', 'parser.racc', 13)
364
316
  def _reduce_4(val, _values, result)
365
317
  result = Call.new(val[0], val[1], nil, val[2].presence)
366
318
  result
367
319
  end
368
320
  .,.,
369
321
 
370
- module_eval(<<'.,.,', 'parser.y', 14)
322
+ module_eval(<<'.,.,', 'parser.racc', 14)
371
323
  def _reduce_5(val, _values, result)
372
324
  result = Call.new(val[0], val[1], val[3], nil )
373
325
  result
374
326
  end
375
327
  .,.,
376
328
 
377
- module_eval(<<'.,.,', 'parser.y', 15)
329
+ module_eval(<<'.,.,', 'parser.racc', 15)
378
330
  def _reduce_6(val, _values, result)
379
331
  result = Call.new(val[0], val[1], nil, nil )
380
332
  result
381
333
  end
382
334
  .,.,
383
335
 
384
- module_eval(<<'.,.,', 'parser.y', 19)
336
+ module_eval(<<'.,.,', 'parser.racc', 19)
385
337
  def _reduce_7(val, _values, result)
386
338
  result = []
387
339
  result
388
340
  end
389
341
  .,.,
390
342
 
391
- module_eval(<<'.,.,', 'parser.y', 20)
343
+ module_eval(<<'.,.,', 'parser.racc', 20)
392
344
  def _reduce_8(val, _values, result)
393
345
  result = []
394
346
  result
395
347
  end
396
348
  .,.,
397
349
 
398
- module_eval(<<'.,.,', 'parser.y', 21)
350
+ module_eval(<<'.,.,', 'parser.racc', 21)
399
351
  def _reduce_9(val, _values, result)
400
352
  result = val[1]
401
353
  result
402
354
  end
403
355
  .,.,
404
356
 
405
- module_eval(<<'.,.,', 'parser.y', 25)
357
+ module_eval(<<'.,.,', 'parser.racc', 25)
406
358
  def _reduce_10(val, _values, result)
407
359
  result.push val[2]
408
360
  result
409
361
  end
410
362
  .,.,
411
363
 
412
- module_eval(<<'.,.,', 'parser.y', 26)
364
+ module_eval(<<'.,.,', 'parser.racc', 26)
413
365
  def _reduce_11(val, _values, result)
414
366
  result = val
415
367
  result
@@ -420,84 +372,84 @@ module_eval(<<'.,.,', 'parser.y', 26)
420
372
 
421
373
  # reduce 13 omitted
422
374
 
423
- module_eval(<<'.,.,', 'parser.y', 35)
375
+ module_eval(<<'.,.,', 'parser.racc', 35)
424
376
  def _reduce_14(val, _values, result)
425
377
  result = []
426
378
  result
427
379
  end
428
380
  .,.,
429
381
 
430
- module_eval(<<'.,.,', 'parser.y', 36)
382
+ module_eval(<<'.,.,', 'parser.racc', 36)
431
383
  def _reduce_15(val, _values, result)
432
384
  result = val[1]
433
385
  result
434
386
  end
435
387
  .,.,
436
388
 
437
- module_eval(<<'.,.,', 'parser.y', 40)
389
+ module_eval(<<'.,.,', 'parser.racc', 40)
438
390
  def _reduce_16(val, _values, result)
439
391
  result.push val[2]
440
392
  result
441
393
  end
442
394
  .,.,
443
395
 
444
- module_eval(<<'.,.,', 'parser.y', 41)
396
+ module_eval(<<'.,.,', 'parser.racc', 41)
445
397
  def _reduce_17(val, _values, result)
446
398
  result = val
447
399
  result
448
400
  end
449
401
  .,.,
450
402
 
451
- module_eval(<<'.,.,', 'parser.y', 45)
403
+ module_eval(<<'.,.,', 'parser.racc', 45)
452
404
  def _reduce_18(val, _values, result)
453
405
  result = Field.new(val[0], val[2], nil, val[1].presence)
454
406
  result
455
407
  end
456
408
  .,.,
457
409
 
458
- module_eval(<<'.,.,', 'parser.y', 46)
410
+ module_eval(<<'.,.,', 'parser.racc', 46)
459
411
  def _reduce_19(val, _values, result)
460
412
  result = Field.new(val[0], val[3], val[2], nil )
461
413
  result
462
414
  end
463
415
  .,.,
464
416
 
465
- module_eval(<<'.,.,', 'parser.y', 47)
417
+ module_eval(<<'.,.,', 'parser.racc', 47)
466
418
  def _reduce_20(val, _values, result)
467
419
  result = Field.new(val[0], val[1], nil, nil )
468
420
  result
469
421
  end
470
422
  .,.,
471
423
 
472
- module_eval(<<'.,.,', 'parser.y', 48)
424
+ module_eval(<<'.,.,', 'parser.racc', 48)
473
425
  def _reduce_21(val, _values, result)
474
426
  result = Field.new(val[0], nil, nil, val[1].presence)
475
427
  result
476
428
  end
477
429
  .,.,
478
430
 
479
- module_eval(<<'.,.,', 'parser.y', 49)
431
+ module_eval(<<'.,.,', 'parser.racc', 49)
480
432
  def _reduce_22(val, _values, result)
481
433
  result = Field.new(val[0], nil, val[2], nil )
482
434
  result
483
435
  end
484
436
  .,.,
485
437
 
486
- module_eval(<<'.,.,', 'parser.y', 50)
438
+ module_eval(<<'.,.,', 'parser.racc', 50)
487
439
  def _reduce_23(val, _values, result)
488
440
  result = Field.new(val[0], nil, nil, nil )
489
441
  result
490
442
  end
491
443
  .,.,
492
444
 
493
- module_eval(<<'.,.,', 'parser.y', 54)
445
+ module_eval(<<'.,.,', 'parser.racc', 54)
494
446
  def _reduce_24(val, _values, result)
495
447
  result = val[1]
496
448
  result
497
449
  end
498
450
  .,.,
499
451
 
500
- module_eval(<<'.,.,', 'parser.y', 58)
452
+ module_eval(<<'.,.,', 'parser.racc', 58)
501
453
  def _reduce_25(val, _values, result)
502
454
  result = {}
503
455
  result
@@ -508,21 +460,21 @@ module_eval(<<'.,.,', 'parser.y', 58)
508
460
 
509
461
  # reduce 27 omitted
510
462
 
511
- module_eval(<<'.,.,', 'parser.y', 64)
463
+ module_eval(<<'.,.,', 'parser.racc', 64)
512
464
  def _reduce_28(val, _values, result)
513
465
  result.update val[1]
514
466
  result
515
467
  end
516
468
  .,.,
517
469
 
518
- module_eval(<<'.,.,', 'parser.y', 68)
470
+ module_eval(<<'.,.,', 'parser.racc', 68)
519
471
  def _reduce_29(val, _values, result)
520
472
  result = { val[0] => val[2] }
521
473
  result
522
474
  end
523
475
  .,.,
524
476
 
525
- module_eval(<<'.,.,', 'parser.y', 72)
477
+ module_eval(<<'.,.,', 'parser.racc', 72)
526
478
  def _reduce_30(val, _values, result)
527
479
  result = val[1]
528
480
  result
@@ -537,21 +489,21 @@ module_eval(<<'.,.,', 'parser.y', 72)
537
489
 
538
490
  # reduce 34 omitted
539
491
 
540
- module_eval(<<'.,.,', 'parser.y', 86)
492
+ module_eval(<<'.,.,', 'parser.racc', 86)
541
493
  def _reduce_35(val, _values, result)
542
494
  result = {}
543
495
  result
544
496
  end
545
497
  .,.,
546
498
 
547
- module_eval(<<'.,.,', 'parser.y', 87)
499
+ module_eval(<<'.,.,', 'parser.racc', 87)
548
500
  def _reduce_36(val, _values, result)
549
501
  result = val[1]
550
502
  result
551
503
  end
552
504
  .,.,
553
505
 
554
- module_eval(<<'.,.,', 'parser.y', 91)
506
+ module_eval(<<'.,.,', 'parser.racc', 91)
555
507
  def _reduce_37(val, _values, result)
556
508
  result.update val[2]
557
509
  result
@@ -560,35 +512,35 @@ module_eval(<<'.,.,', 'parser.y', 91)
560
512
 
561
513
  # reduce 38 omitted
562
514
 
563
- module_eval(<<'.,.,', 'parser.y', 96)
515
+ module_eval(<<'.,.,', 'parser.racc', 96)
564
516
  def _reduce_39(val, _values, result)
565
517
  result = { val[0] => val[2] }
566
518
  result
567
519
  end
568
520
  .,.,
569
521
 
570
- module_eval(<<'.,.,', 'parser.y', 100)
522
+ module_eval(<<'.,.,', 'parser.racc', 100)
571
523
  def _reduce_40(val, _values, result)
572
524
  result = []
573
525
  result
574
526
  end
575
527
  .,.,
576
528
 
577
- module_eval(<<'.,.,', 'parser.y', 101)
529
+ module_eval(<<'.,.,', 'parser.racc', 101)
578
530
  def _reduce_41(val, _values, result)
579
531
  result = val[1]
580
532
  result
581
533
  end
582
534
  .,.,
583
535
 
584
- module_eval(<<'.,.,', 'parser.y', 105)
536
+ module_eval(<<'.,.,', 'parser.racc', 105)
585
537
  def _reduce_42(val, _values, result)
586
538
  result.push val[2]
587
539
  result
588
540
  end
589
541
  .,.,
590
542
 
591
- module_eval(<<'.,.,', 'parser.y', 106)
543
+ module_eval(<<'.,.,', 'parser.racc', 106)
592
544
  def _reduce_43(val, _values, result)
593
545
  result = val
594
546
  result
@@ -597,42 +549,42 @@ module_eval(<<'.,.,', 'parser.y', 106)
597
549
 
598
550
  # reduce 44 omitted
599
551
 
600
- module_eval(<<'.,.,', 'parser.y', 111)
552
+ module_eval(<<'.,.,', 'parser.racc', 111)
601
553
  def _reduce_45(val, _values, result)
602
554
  result = convert_number(val[0])
603
555
  result
604
556
  end
605
557
  .,.,
606
558
 
607
- module_eval(<<'.,.,', 'parser.y', 112)
559
+ module_eval(<<'.,.,', 'parser.racc', 112)
608
560
  def _reduce_46(val, _values, result)
609
561
  result = true
610
562
  result
611
563
  end
612
564
  .,.,
613
565
 
614
- module_eval(<<'.,.,', 'parser.y', 113)
566
+ module_eval(<<'.,.,', 'parser.racc', 113)
615
567
  def _reduce_47(val, _values, result)
616
568
  result = false
617
569
  result
618
570
  end
619
571
  .,.,
620
572
 
621
- module_eval(<<'.,.,', 'parser.y', 114)
573
+ module_eval(<<'.,.,', 'parser.racc', 114)
622
574
  def _reduce_48(val, _values, result)
623
575
  result = nil
624
576
  result
625
577
  end
626
578
  .,.,
627
579
 
628
- module_eval(<<'.,.,', 'parser.y', 118)
580
+ module_eval(<<'.,.,', 'parser.racc', 118)
629
581
  def _reduce_49(val, _values, result)
630
582
  result = unescape_string(val[0])
631
583
  result
632
584
  end
633
585
  .,.,
634
586
 
635
- module_eval(<<'.,.,', 'parser.y', 121)
587
+ module_eval(<<'.,.,', 'parser.racc', 121)
636
588
  def _reduce_50(val, _values, result)
637
589
  result = val[0].to_sym
638
590
  result
@@ -644,4 +596,4 @@ def _reduce_none(val, _values, result)
644
596
  end
645
597
 
646
598
  end # class Parser
647
- end # module GQL
599
+ end # GQL
@@ -5,8 +5,16 @@ module GQL
5
5
 
6
6
  string :id
7
7
  string :type, -> { target.name }
8
- array :parameters, -> { target.method.parameters }, item_class: Parameter
9
8
  object :result_class, -> { target.result_class || Placeholder }, node_class: Node
9
+
10
+
11
+ array :parameters, -> {
12
+ if target.proc
13
+ target.proc.parameters
14
+ else
15
+ target.instance_method(:execute).parameters
16
+ end
17
+ }, item_class: Parameter
10
18
  end
11
19
  end
12
20
  end
@@ -0,0 +1,4 @@
1
+ module GQL
2
+ class TestCase < ActiveSupport::TestCase
3
+ end
4
+ end
data/lib/gql/tokenizer.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  #--
2
2
  # DO NOT MODIFY!!!!
3
3
  # This file is automatically generated by rex 1.0.5
4
- # from lexical definition file "lib/gql/tokenizer.rex".
4
+ # from lexical definition file "support/tokenizer.rex".
5
5
  #++
6
6
 
7
7
  require 'racc/parser'
8
- class GQL::Tokenizer < Racc::Parser
8
+ class GQL::Parser < Racc::Parser
9
9
  require 'strscan'
10
10
 
11
- class ScanError < StandardError ; end
11
+ class Unused < StandardError ; end
12
12
 
13
13
  attr_reader :lineno
14
14
  attr_reader :filename
@@ -63,8 +63,8 @@ class GQL::Tokenizer < Racc::Parser
63
63
  when (text = @ss.scan(/\/\//))
64
64
  action { @state = :REM; nil }
65
65
 
66
- when (text = @ss.scan(/"(?:[^"\\]|\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4}))*"/))
67
- action { [:STRING, text.gsub(/^"|"$/, '')] }
66
+ when (text = @ss.scan(/"(?:[^"\\]|\\["\\\/bfnrt]|\\u[0-9a-fA-F]{4})*"/))
67
+ action { [:STRING, unescape_string(text)] }
68
68
 
69
69
  when (text = @ss.scan(/-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/))
70
70
  action { [:NUMBER, text] }
@@ -92,7 +92,7 @@ class GQL::Tokenizer < Racc::Parser
92
92
 
93
93
  else
94
94
  text = @ss.string[@ss.pos .. -1]
95
- raise ScanError, "can not match: '" + text + "'"
95
+ raise GQL::Errors::ScanError, "can not match: '" + text + "'"
96
96
  end # if
97
97
 
98
98
  when :REMS
@@ -103,9 +103,12 @@ class GQL::Tokenizer < Racc::Parser
103
103
  when (text = @ss.scan(/.*(?=\*\/)/))
104
104
  ;
105
105
 
106
+ when (text = @ss.scan(/(.|\n)*(?=\*\/)/))
107
+ ;
108
+
106
109
  else
107
110
  text = @ss.string[@ss.pos .. -1]
108
- raise ScanError, "can not match: '" + text + "'"
111
+ raise GQL::Errors::ScanError, "can not match: '" + text + "'"
109
112
  end # if
110
113
 
111
114
  when :REM
@@ -118,13 +121,49 @@ class GQL::Tokenizer < Racc::Parser
118
121
 
119
122
  else
120
123
  text = @ss.string[@ss.pos .. -1]
121
- raise ScanError, "can not match: '" + text + "'"
124
+ raise GQL::Errors::ScanError, "can not match: '" + text + "'"
122
125
  end # if
123
126
 
124
127
  else
125
- raise ScanError, "undefined state: '" + state.to_s + "'"
128
+ raise GQL::Errors::ScanError, "undefined state: '" + state.to_s + "'"
126
129
  end # case state
127
130
  token
128
131
  end # def _next_token
129
132
 
133
+ private
134
+ UNESCAPE_MAP = Hash.new { |h, k| h[k] = k.chr }
135
+ UNESCAPE_MAP.update(
136
+ ?" => '"',
137
+ ?\\ => '\\',
138
+ ?/ => '/',
139
+ ?b => "\b",
140
+ ?f => "\f",
141
+ ?n => "\n",
142
+ ?r => "\r",
143
+ ?t => "\t",
144
+ ?u => nil,
145
+ )
146
+ EMPTY_8BIT_STRING = ''
147
+ if String.method_defined? :encode
148
+ EMPTY_8BIT_STRING.force_encoding Encoding::ASCII_8BIT
149
+ end
150
+ def unescape_string(str)
151
+ string = str.gsub(/^"|"$/, '').gsub(%r((?:\\[\\bfnrt"/]|(?:\\u(?:[A-Fa-f\d]{4}))+|\\[\x20-\xff]))n) do |c|
152
+ if u = UNESCAPE_MAP[$&[1]]
153
+ u
154
+ else # \uXXXX
155
+ bytes = EMPTY_8BIT_STRING.dup
156
+ i = 0
157
+ while c[6 * i] == ?\\ && c[6 * i + 1] == ?u
158
+ bytes << c[6 * i + 2, 2].to_i(16) << c[6 * i + 4, 2].to_i(16)
159
+ i += 1
160
+ end
161
+ JSON.iconv('utf-8', 'utf-16be', bytes)
162
+ end
163
+ end
164
+ if string.respond_to? :force_encoding
165
+ string.force_encoding ::Encoding::UTF_8
166
+ end
167
+ string
168
+ end
130
169
  end # class
data/lib/gql/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module GQL
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.8'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Andert
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-03-06 00:00:00.000000000 Z
11
+ date: 2015-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
- - !ruby/object:Gem::Dependency
42
- name: minitest
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: rexical
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -107,6 +93,7 @@ files:
107
93
  - README.md
108
94
  - Rakefile
109
95
  - bin/console
96
+ - bin/rake
110
97
  - bin/setup
111
98
  - gql.gemspec
112
99
  - lib/gql.rb
@@ -122,7 +109,6 @@ files:
122
109
  - lib/gql/number.rb
123
110
  - lib/gql/object.rb
124
111
  - lib/gql/parser.rb
125
- - lib/gql/parser.y
126
112
  - lib/gql/schema/call.rb
127
113
  - lib/gql/schema/field.rb
128
114
  - lib/gql/schema/list.rb
@@ -131,8 +117,8 @@ files:
131
117
  - lib/gql/schema/placeholder.rb
132
118
  - lib/gql/simple.rb
133
119
  - lib/gql/string.rb
120
+ - lib/gql/test_case.rb
134
121
  - lib/gql/tokenizer.rb
135
- - lib/gql/tokenizer.rex
136
122
  - lib/gql/version.rb
137
123
  homepage: https://github.com/martinandert/gql
138
124
  licenses:
data/lib/gql/parser.y DELETED
@@ -1,231 +0,0 @@
1
- class GQL::Parser
2
- token STRING NUMBER TRUE FALSE NULL AS IDENT
3
- rule
4
- query
5
- : variables root variables { result = Query.new(val[1], val[0].merge(val[2])) }
6
- ;
7
-
8
- root
9
- : call { result = Field.new(nil, nil, val[0], nil ) }
10
- | '{' field_list '}' { result = Field.new(nil, nil, nil, val[1]) }
11
- ;
12
-
13
- call
14
- : identifier arguments fields { result = Call.new(val[0], val[1], nil, val[2].presence) }
15
- | identifier arguments '.' call { result = Call.new(val[0], val[1], val[3], nil ) }
16
- | identifier arguments { result = Call.new(val[0], val[1], nil, nil ) }
17
- ;
18
-
19
- arguments
20
- : /* empty */ { result = [] }
21
- | '(' ')' { result = [] }
22
- | '(' argument_list ')' { result = val[1] }
23
- ;
24
-
25
- argument_list
26
- : argument_list ',' argument { result.push val[2] }
27
- | argument { result = val }
28
- ;
29
-
30
- argument
31
- : variable_identifier
32
- | json_value
33
- ;
34
-
35
- fields
36
- : '{' '}' { result = [] }
37
- | '{' field_list '}' { result = val[1] }
38
- ;
39
-
40
- field_list
41
- : field_list ',' field { result.push val[2] }
42
- | field { result = val }
43
- ;
44
-
45
- field
46
- : identifier fields alias_identifier { result = Field.new(val[0], val[2], nil, val[1].presence) }
47
- | identifier '.' call alias_identifier { result = Field.new(val[0], val[3], val[2], nil ) }
48
- | identifier alias_identifier { result = Field.new(val[0], val[1], nil, nil ) }
49
- | identifier fields { result = Field.new(val[0], nil, nil, val[1].presence) }
50
- | identifier '.' call { result = Field.new(val[0], nil, val[2], nil ) }
51
- | identifier { result = Field.new(val[0], nil, nil, nil ) }
52
- ;
53
-
54
- alias_identifier
55
- : AS identifier { result = val[1] }
56
- ;
57
-
58
- variables
59
- : /* empty */ { result = {} }
60
- | variable_list
61
- ;
62
-
63
- variable_list
64
- : variable
65
- | variable_list variable { result.update val[1] }
66
- ;
67
-
68
- variable
69
- : variable_identifier '=' variable_value { result = { val[0] => val[2] } }
70
- ;
71
-
72
- variable_identifier
73
- : '<' identifier '>' { result = val[1] }
74
- ;
75
-
76
- variable_value
77
- : json_value
78
- ;
79
-
80
- json_value
81
- : object
82
- | array
83
- | scalar
84
- ;
85
-
86
- object
87
- : '{' '}' { result = {} }
88
- | '{' pairs '}' { result = val[1] }
89
- ;
90
-
91
- pairs
92
- : pairs ',' pair { result.update val[2] }
93
- | pair
94
- ;
95
-
96
- pair
97
- : string ':' json_value { result = { val[0] => val[2] } }
98
- ;
99
-
100
- array
101
- : '[' ']' { result = [] }
102
- | '[' values ']' { result = val[1] }
103
- ;
104
-
105
- values
106
- : values ',' json_value { result.push val[2] }
107
- | json_value { result = val }
108
- ;
109
-
110
- scalar
111
- : string
112
- | NUMBER { result = convert_number(val[0]) }
113
- | TRUE { result = true }
114
- | FALSE { result = false }
115
- | NULL { result = nil }
116
- ;
117
-
118
- string
119
- : STRING { result = unescape_string(val[0]) }
120
-
121
- identifier
122
- : IDENT { result = val[0].to_sym }
123
- ;
124
- end
125
-
126
- ---- header
127
-
128
- require 'active_support/json'
129
- require 'active_support/core_ext/object/blank'
130
- require 'active_support/core_ext/object/try'
131
- require 'active_support/core_ext/object/json'
132
-
133
- ---- inner
134
-
135
- class Query < Struct.new(:root, :variables)
136
- def as_json(*)
137
- {
138
- root: root.as_json,
139
- variables: variables
140
- }
141
- end
142
- end
143
-
144
- class Field < Struct.new(:id, :alias_id, :call, :fields)
145
- def as_json(*)
146
- {
147
- id: id,
148
- alias_id: alias_id,
149
- call: call.as_json,
150
- fields: fields.as_json
151
- }
152
- end
153
- end
154
-
155
- class Call < Struct.new(:id, :arguments, :call, :fields)
156
- def as_json(*)
157
- {
158
- id: id,
159
- arguments: arguments,
160
- call: call.as_json,
161
- fields: fields.as_json
162
- }
163
- end
164
- end
165
-
166
- UNESCAPE_MAP = Hash.new { |h, k| h[k] = k.chr }
167
-
168
- UNESCAPE_MAP.update(
169
- ?" => '"',
170
- ?\\ => '\\',
171
- ?/ => '/',
172
- ?b => "\b",
173
- ?f => "\f",
174
- ?n => "\n",
175
- ?r => "\r",
176
- ?t => "\t",
177
- ?u => nil,
178
- )
179
-
180
- EMPTY_8BIT_STRING = ''
181
-
182
- if String.method_defined? :encode
183
- EMPTY_8BIT_STRING.force_encoding Encoding::ASCII_8BIT
184
- end
185
-
186
- def initialize(tokenizer)
187
- super()
188
-
189
- @tokenizer = tokenizer
190
- end
191
-
192
- def next_token
193
- @tokenizer.next_token
194
- end
195
-
196
- def parse
197
- do_parse
198
- end
199
-
200
- def on_error(token, value, vstack)
201
- raise Errors::SyntaxError.new(value, token_to_str(token))
202
- end
203
-
204
- private
205
- def unescape_string(str)
206
- string = str.gsub(%r((?:\\[\\bfnrt"/]|(?:\\u(?:[A-Fa-f\d]{4}))+|\\[\x20-\xff]))n) do |c|
207
- if u = UNESCAPE_MAP[$&[1]]
208
- u
209
- else # \uXXXX
210
- bytes = EMPTY_8BIT_STRING.dup
211
- i = 0
212
-
213
- while c[6 * i] == ?\\ && c[6 * i + 1] == ?u
214
- bytes << c[6 * i + 2, 2].to_i(16) << c[6 * i + 4, 2].to_i(16)
215
- i += 1
216
- end
217
-
218
- JSON.iconv('utf-8', 'utf-16be', bytes)
219
- end
220
- end
221
-
222
- if string.respond_to? :force_encoding
223
- string.force_encoding ::Encoding::UTF_8
224
- end
225
-
226
- string
227
- end
228
-
229
- def convert_number(str)
230
- str.count('.') > 0 ? str.to_f : str.to_i
231
- end
@@ -1,46 +0,0 @@
1
- class GQL::Tokenizer
2
- macro
3
- BLANK \s+
4
- REM_IN \/\*
5
- REM_OUT \*\/
6
- REM \/\/
7
- STRING "(?:[^"\\]|\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4}))*"
8
- NUMBER -?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?
9
- TRUE true
10
- FALSE false
11
- NULL null
12
- IDENT [a-zA-Z_][a-zA-Z0-9_]*
13
- AS [aA][sS]
14
-
15
- rule
16
-
17
- # [:state] pattern [action]
18
-
19
- # remarks
20
- {REM_IN} { @state = :REMS; nil }
21
- :REMS {REM_OUT} { @state = nil; nil }
22
- :REMS .*(?={REM_OUT}) # ignore
23
- {REM} { @state = :REM; nil }
24
- :REM \n { @state = nil; nil }
25
- :REM .*(?=$) # ignore
26
-
27
- # scalars
28
- {STRING} { [:STRING, text.gsub(/^"|"$/, '')] }
29
- {NUMBER} { [:NUMBER, text] }
30
- {TRUE} { [:TRUE, text] }
31
- {FALSE} { [:FALSE, text] }
32
- {NULL} { [:NULL, text] }
33
-
34
- # keywords
35
- {AS} { [:AS, text] }
36
-
37
- # identifier
38
- {IDENT} { [:IDENT, text] }
39
-
40
- # whitespace
41
- {BLANK} # ignore
42
-
43
- # rest
44
- . { [text, text] }
45
-
46
- end