gql 0.0.7 → 0.0.8

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: 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