json-stream 0.2.1 → 0.2.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 +5 -5
- data/Gemfile +2 -0
- data/LICENSE +1 -1
- data/README.md +11 -8
- data/json-stream.gemspec +6 -4
- data/lib/json/stream/buffer.rb +0 -2
- data/lib/json/stream/builder.rb +0 -2
- data/lib/json/stream/parser.rb +6 -8
- data/lib/json/stream/version.rb +1 -3
- metadata +39 -19
- data/spec/buffer_spec.rb +0 -110
- data/spec/builder_spec.rb +0 -157
- data/spec/fixtures/repository.json +0 -107
- data/spec/parser_spec.rb +0 -913
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: f1db3759d432092d3f1cac4dd90fe23551f14cd33bff1fa209a4f32cb2399025
|
|
4
|
+
data.tar.gz: 5c9532adaae5591585b756686463e93e24beb371d7a78e15cf45ffe09e6b4247
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9ac6519d888a81802453b964bc36db7639728c83ad67604516045fd6756c64c34579caa16050f1df32f1b9c8e6b4723433d81db8b2c63f59a2b846d9ab00eeb5
|
|
7
|
+
data.tar.gz: 7079d8a588958e49c016cc051f27b0ce6f24a902bbe3759702d50da1329815ae1ef929d41968ad24132eb748830062070cdf58b47261d05f4528caed7ad465da
|
data/Gemfile
ADDED
data/LICENSE
CHANGED
data/README.md
CHANGED
|
@@ -40,7 +40,7 @@ Again, while JSON::Stream can be used this way, if we just need to stream the
|
|
|
40
40
|
document from disk or the network, we're better off using the yajl-ruby gem.
|
|
41
41
|
|
|
42
42
|
Huge documents arriving over the network in small chunks to an EventMachine
|
|
43
|
-
receive_data loop is where JSON::Stream is really useful. Inside an
|
|
43
|
+
`receive_data` loop is where JSON::Stream is really useful. Inside an
|
|
44
44
|
EventMachine::Connection subclass we might have:
|
|
45
45
|
|
|
46
46
|
```ruby
|
|
@@ -52,8 +52,8 @@ def post_init
|
|
|
52
52
|
end_object { puts "end object" }
|
|
53
53
|
start_array { puts "start array" }
|
|
54
54
|
end_array { puts "end array" }
|
|
55
|
-
key {|k| puts "key: #{k}" }
|
|
56
|
-
value {|v| puts "value: #{v}" }
|
|
55
|
+
key { |k| puts "key: #{k}" }
|
|
56
|
+
value { |v| puts "value: #{v}" }
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
59
|
|
|
@@ -77,16 +77,19 @@ imagine the callbacks looking for an array named `rows` and processing sets
|
|
|
77
77
|
of these row objects in small batches. Millions of rows, streaming over the
|
|
78
78
|
network, can be processed in constant memory space this way.
|
|
79
79
|
|
|
80
|
-
## Dependencies
|
|
81
|
-
|
|
82
|
-
* ruby >= 1.9.2
|
|
83
|
-
* jruby >= 1.7
|
|
84
|
-
|
|
85
80
|
## Alternatives
|
|
86
81
|
|
|
87
82
|
* [json](https://github.com/flori/json)
|
|
88
83
|
* [yajl-ruby](https://github.com/brianmario/yajl-ruby)
|
|
89
84
|
* [yajl-ffi](https://github.com/dgraham/yajl-ffi)
|
|
85
|
+
* [application/json-seq](http://www.rfc-editor.org/rfc/rfc7464.txt)
|
|
86
|
+
|
|
87
|
+
## Development
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
$ bin/setup
|
|
91
|
+
$ bin/rake test
|
|
92
|
+
```
|
|
90
93
|
|
|
91
94
|
## License
|
|
92
95
|
|
data/json-stream.gemspec
CHANGED
|
@@ -11,10 +11,12 @@ Gem::Specification.new do |s|
|
|
|
11
11
|
s.homepage = 'http://dgraham.github.io/json-stream/'
|
|
12
12
|
s.license = 'MIT'
|
|
13
13
|
|
|
14
|
-
s.files = Dir['[A-Z]*', 'json-stream.gemspec', '{lib}/**/*']
|
|
15
|
-
s.test_files = Dir['spec/**/*']
|
|
14
|
+
s.files = Dir['[A-Z]*', 'json-stream.gemspec', '{lib}/**/*'] - ['Gemfile.lock']
|
|
16
15
|
s.require_path = 'lib'
|
|
17
16
|
|
|
18
|
-
s.add_development_dependency '
|
|
19
|
-
s.
|
|
17
|
+
s.add_development_dependency 'bundler', '~> 2.1'
|
|
18
|
+
s.add_development_dependency 'minitest', '~> 5.10'
|
|
19
|
+
s.add_development_dependency 'rake', '~> 12.1'
|
|
20
|
+
|
|
21
|
+
s.required_ruby_version = '>= 2.0.0'
|
|
20
22
|
end
|
data/lib/json/stream/buffer.rb
CHANGED
data/lib/json/stream/builder.rb
CHANGED
data/lib/json/stream/parser.rb
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
|
|
3
1
|
module JSON
|
|
4
2
|
module Stream
|
|
5
3
|
# Raised on any invalid JSON text.
|
|
@@ -12,8 +10,8 @@ module JSON
|
|
|
12
10
|
# Examples
|
|
13
11
|
#
|
|
14
12
|
# parser = JSON::Stream::Parser.new
|
|
15
|
-
# parser.key {|key| puts key }
|
|
16
|
-
# parser.value {|value| puts value }
|
|
13
|
+
# parser.key { |key| puts key }
|
|
14
|
+
# parser.value { |value| puts value }
|
|
17
15
|
# parser << '{"answer":'
|
|
18
16
|
# parser << ' 42}'
|
|
19
17
|
class Parser
|
|
@@ -85,8 +83,8 @@ module JSON
|
|
|
85
83
|
# end_object { puts "end object" }
|
|
86
84
|
# start_array { puts "start array" }
|
|
87
85
|
# end_array { puts "end array" }
|
|
88
|
-
# key {|k| puts "key: #{k}" }
|
|
89
|
-
# value {|v| puts "value: #{v}" }
|
|
86
|
+
# key { |k| puts "key: #{k}" }
|
|
87
|
+
# value { |v| puts "value: #{v}" }
|
|
90
88
|
# end
|
|
91
89
|
def initialize(&block)
|
|
92
90
|
@state = :start_document
|
|
@@ -220,12 +218,12 @@ module JSON
|
|
|
220
218
|
if @unicode.size == 4
|
|
221
219
|
codepoint = @unicode.slice!(0, 4).hex
|
|
222
220
|
if codepoint >= 0xD800 && codepoint <= 0xDBFF
|
|
223
|
-
error('Expected low surrogate pair half') if @stack[-1].is_a?(
|
|
221
|
+
error('Expected low surrogate pair half') if @stack[-1].is_a?(Integer)
|
|
224
222
|
@state = :start_surrogate_pair
|
|
225
223
|
@stack.push(codepoint)
|
|
226
224
|
elsif codepoint >= 0xDC00 && codepoint <= 0xDFFF
|
|
227
225
|
high = @stack.pop
|
|
228
|
-
error('Expected high surrogate pair half') unless high.is_a?(
|
|
226
|
+
error('Expected high surrogate pair half') unless high.is_a?(Integer)
|
|
229
227
|
pair = ((high - 0xD800) * 0x400) + (codepoint - 0xDC00) + 0x10000
|
|
230
228
|
@buf << pair
|
|
231
229
|
@state = :start_string
|
data/lib/json/stream/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,29 +1,57 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: json-stream
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- David Graham
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-04-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.1'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.1'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: minitest
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '5.10'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '5.10'
|
|
13
41
|
- !ruby/object:Gem::Dependency
|
|
14
42
|
name: rake
|
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
|
16
44
|
requirements:
|
|
17
45
|
- - "~>"
|
|
18
46
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
47
|
+
version: '12.1'
|
|
20
48
|
type: :development
|
|
21
49
|
prerelease: false
|
|
22
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
51
|
requirements:
|
|
24
52
|
- - "~>"
|
|
25
53
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
54
|
+
version: '12.1'
|
|
27
55
|
description: A parser best suited for huge JSON documents that don't fit in memory.
|
|
28
56
|
email:
|
|
29
57
|
- david.malcom.graham@gmail.com
|
|
@@ -31,6 +59,7 @@ executables: []
|
|
|
31
59
|
extensions: []
|
|
32
60
|
extra_rdoc_files: []
|
|
33
61
|
files:
|
|
62
|
+
- Gemfile
|
|
34
63
|
- LICENSE
|
|
35
64
|
- README.md
|
|
36
65
|
- Rakefile
|
|
@@ -40,15 +69,11 @@ files:
|
|
|
40
69
|
- lib/json/stream/builder.rb
|
|
41
70
|
- lib/json/stream/parser.rb
|
|
42
71
|
- lib/json/stream/version.rb
|
|
43
|
-
- spec/buffer_spec.rb
|
|
44
|
-
- spec/builder_spec.rb
|
|
45
|
-
- spec/fixtures/repository.json
|
|
46
|
-
- spec/parser_spec.rb
|
|
47
72
|
homepage: http://dgraham.github.io/json-stream/
|
|
48
73
|
licenses:
|
|
49
74
|
- MIT
|
|
50
75
|
metadata: {}
|
|
51
|
-
post_install_message:
|
|
76
|
+
post_install_message:
|
|
52
77
|
rdoc_options: []
|
|
53
78
|
require_paths:
|
|
54
79
|
- lib
|
|
@@ -56,20 +81,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
56
81
|
requirements:
|
|
57
82
|
- - ">="
|
|
58
83
|
- !ruby/object:Gem::Version
|
|
59
|
-
version:
|
|
84
|
+
version: 2.0.0
|
|
60
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
61
86
|
requirements:
|
|
62
87
|
- - ">="
|
|
63
88
|
- !ruby/object:Gem::Version
|
|
64
89
|
version: '0'
|
|
65
90
|
requirements: []
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
signing_key:
|
|
91
|
+
rubygems_version: 3.5.4
|
|
92
|
+
signing_key:
|
|
69
93
|
specification_version: 4
|
|
70
94
|
summary: A streaming JSON parser that generates SAX-like events.
|
|
71
|
-
test_files:
|
|
72
|
-
- spec/buffer_spec.rb
|
|
73
|
-
- spec/builder_spec.rb
|
|
74
|
-
- spec/fixtures/repository.json
|
|
75
|
-
- spec/parser_spec.rb
|
|
95
|
+
test_files: []
|
data/spec/buffer_spec.rb
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
|
|
3
|
-
require 'json/stream'
|
|
4
|
-
require 'minitest/autorun'
|
|
5
|
-
|
|
6
|
-
describe JSON::Stream::Buffer do
|
|
7
|
-
subject { JSON::Stream::Buffer.new }
|
|
8
|
-
|
|
9
|
-
it 'accepts single byte characters' do
|
|
10
|
-
assert_equal "", subject << ""
|
|
11
|
-
assert_equal "abc", subject << "abc"
|
|
12
|
-
assert_equal "\u0000abc", subject << "\u0000abc"
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# The é character can be a single codepoint \u00e9 or two codepoints
|
|
16
|
-
# \u0065\u0301. The first is encoded in 2 bytes, the second in 3 bytes.
|
|
17
|
-
# The json and yajl-ruby gems and CouchDB do not normalize unicode text
|
|
18
|
-
# so neither will we. Although, a good way to normalize is by calling
|
|
19
|
-
# ActiveSupport::Multibyte::Chars.new("é").normalize(:c).
|
|
20
|
-
it 'accepts combined characters' do
|
|
21
|
-
assert_equal "\u0065\u0301", subject << "\u0065\u0301"
|
|
22
|
-
assert_equal 3, (subject << "\u0065\u0301").bytesize
|
|
23
|
-
assert_equal 2, (subject << "\u0065\u0301").size
|
|
24
|
-
|
|
25
|
-
assert_equal "\u00e9", subject << "\u00e9"
|
|
26
|
-
assert_equal 2, (subject << "\u00e9").bytesize
|
|
27
|
-
assert_equal 1, (subject << "\u00e9").size
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it 'accepts valid two byte characters' do
|
|
31
|
-
assert_equal "abcé", subject << "abcé"
|
|
32
|
-
assert_equal "a", subject << "a\xC3"
|
|
33
|
-
assert_equal "é", subject << "\xA9"
|
|
34
|
-
assert_equal "", subject << "\xC3"
|
|
35
|
-
assert_equal "é", subject << "\xA9"
|
|
36
|
-
assert_equal "é", subject << "\xC3\xA9"
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it 'accepts valid three byte characters' do
|
|
40
|
-
assert_equal "abcé\u2603", subject << "abcé\u2603"
|
|
41
|
-
assert_equal "a", subject << "a\xE2"
|
|
42
|
-
assert_equal "", subject << "\x98"
|
|
43
|
-
assert_equal "\u2603", subject << "\x83"
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it 'accepts valid four byte characters' do
|
|
47
|
-
assert_equal "abcé\u2603\u{10102}é", subject << "abcé\u2603\u{10102}é"
|
|
48
|
-
assert_equal "a", subject << "a\xF0"
|
|
49
|
-
assert_equal "", subject << "\x90"
|
|
50
|
-
assert_equal "", subject << "\x84"
|
|
51
|
-
assert_equal "\u{10102}", subject << "\x82"
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
it 'rejects valid utf-8 followed by partial two byte sequence' do
|
|
55
|
-
assert_equal '[', subject << '['
|
|
56
|
-
assert_equal '"', subject << '"'
|
|
57
|
-
assert_equal '', subject << "\xC3"
|
|
58
|
-
-> { subject << '"' }.must_raise JSON::Stream::ParserError
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it 'rejects invalid two byte start characters' do
|
|
62
|
-
-> { subject << "\xC3\xC3" }.must_raise JSON::Stream::ParserError
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it 'rejects invalid three byte start characters' do
|
|
66
|
-
-> { subject << "\xE2\xE2" }.must_raise JSON::Stream::ParserError
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it 'rejects invalid four byte start characters' do
|
|
70
|
-
-> { subject << "\xF0\xF0" }.must_raise JSON::Stream::ParserError
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it 'rejects a two byte start with single byte continuation character' do
|
|
74
|
-
-> { subject << "\xC3\u0000" }.must_raise JSON::Stream::ParserError
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it 'rejects a three byte start with single byte continuation character' do
|
|
78
|
-
-> { subject << "\xE2\u0010" }.must_raise JSON::Stream::ParserError
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it 'rejects a four byte start with single byte continuation character' do
|
|
82
|
-
-> { subject << "\xF0a" }.must_raise JSON::Stream::ParserError
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
it 'rejects an invalid continuation character' do
|
|
86
|
-
-> { subject << "\xA9" }.must_raise JSON::Stream::ParserError
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it 'rejects an overlong form' do
|
|
90
|
-
-> { subject << "\xC0\x80" }.must_raise JSON::Stream::ParserError
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
describe 'checking for empty buffers' do
|
|
94
|
-
it 'is initially empty' do
|
|
95
|
-
assert subject.empty?
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it 'is empty after processing complete characters' do
|
|
99
|
-
subject << 'test'
|
|
100
|
-
assert subject.empty?
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
it 'is not empty after processing partial multi-byte characters' do
|
|
104
|
-
subject << "\xC3"
|
|
105
|
-
refute subject.empty?
|
|
106
|
-
subject << "\xA9"
|
|
107
|
-
assert subject.empty?
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
end
|
data/spec/builder_spec.rb
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
|
|
3
|
-
require 'json/stream'
|
|
4
|
-
require 'minitest/autorun'
|
|
5
|
-
|
|
6
|
-
describe JSON::Stream::Builder do
|
|
7
|
-
let(:parser) { JSON::Stream::Parser.new }
|
|
8
|
-
subject { JSON::Stream::Builder.new(parser) }
|
|
9
|
-
|
|
10
|
-
it 'builds a false value' do
|
|
11
|
-
assert_nil subject.result
|
|
12
|
-
subject.start_document
|
|
13
|
-
subject.value(false)
|
|
14
|
-
assert_nil subject.result
|
|
15
|
-
subject.end_document
|
|
16
|
-
assert_equal false, subject.result
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it 'builds a string value' do
|
|
20
|
-
assert_nil subject.result
|
|
21
|
-
subject.start_document
|
|
22
|
-
subject.value("test")
|
|
23
|
-
assert_nil subject.result
|
|
24
|
-
subject.end_document
|
|
25
|
-
assert_equal "test", subject.result
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it 'builds an empty array' do
|
|
29
|
-
assert_nil subject.result
|
|
30
|
-
subject.start_document
|
|
31
|
-
subject.start_array
|
|
32
|
-
subject.end_array
|
|
33
|
-
assert_nil subject.result
|
|
34
|
-
subject.end_document
|
|
35
|
-
assert_equal [], subject.result
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it 'builds an array of numbers' do
|
|
39
|
-
subject.start_document
|
|
40
|
-
subject.start_array
|
|
41
|
-
subject.value(1)
|
|
42
|
-
subject.value(2)
|
|
43
|
-
subject.value(3)
|
|
44
|
-
subject.end_array
|
|
45
|
-
subject.end_document
|
|
46
|
-
assert_equal [1, 2, 3], subject.result
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
it 'builds nested empty arrays' do
|
|
50
|
-
subject.start_document
|
|
51
|
-
subject.start_array
|
|
52
|
-
subject.start_array
|
|
53
|
-
subject.end_array
|
|
54
|
-
subject.end_array
|
|
55
|
-
subject.end_document
|
|
56
|
-
assert_equal [[]], subject.result
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
it 'builds nested arrays of numbers' do
|
|
60
|
-
subject.start_document
|
|
61
|
-
subject.start_array
|
|
62
|
-
subject.value(1)
|
|
63
|
-
subject.start_array
|
|
64
|
-
subject.value(2)
|
|
65
|
-
subject.end_array
|
|
66
|
-
subject.value(3)
|
|
67
|
-
subject.end_array
|
|
68
|
-
subject.end_document
|
|
69
|
-
assert_equal [1, [2], 3], subject.result
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
it 'builds an empty object' do
|
|
73
|
-
subject.start_document
|
|
74
|
-
subject.start_object
|
|
75
|
-
subject.end_object
|
|
76
|
-
subject.end_document
|
|
77
|
-
assert_equal({}, subject.result)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it 'builds a complex object' do
|
|
81
|
-
subject.start_document
|
|
82
|
-
subject.start_object
|
|
83
|
-
subject.key("k1")
|
|
84
|
-
subject.value(1)
|
|
85
|
-
subject.key("k2")
|
|
86
|
-
subject.value(nil)
|
|
87
|
-
subject.key("k3")
|
|
88
|
-
subject.value(true)
|
|
89
|
-
subject.key("k4")
|
|
90
|
-
subject.value(false)
|
|
91
|
-
subject.key("k5")
|
|
92
|
-
subject.value("string value")
|
|
93
|
-
subject.end_object
|
|
94
|
-
subject.end_document
|
|
95
|
-
expected = {
|
|
96
|
-
"k1" => 1,
|
|
97
|
-
"k2" => nil,
|
|
98
|
-
"k3" => true,
|
|
99
|
-
"k4" => false,
|
|
100
|
-
"k5" => "string value"
|
|
101
|
-
}
|
|
102
|
-
assert_equal expected, subject.result
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
it 'builds a nested object' do
|
|
106
|
-
subject.start_document
|
|
107
|
-
subject.start_object
|
|
108
|
-
subject.key("k1")
|
|
109
|
-
subject.value(1)
|
|
110
|
-
|
|
111
|
-
subject.key("k2")
|
|
112
|
-
subject.start_object
|
|
113
|
-
subject.end_object
|
|
114
|
-
|
|
115
|
-
subject.key("k3")
|
|
116
|
-
subject.start_object
|
|
117
|
-
subject.key("sub1")
|
|
118
|
-
subject.start_array
|
|
119
|
-
subject.value(12)
|
|
120
|
-
subject.end_array
|
|
121
|
-
subject.end_object
|
|
122
|
-
|
|
123
|
-
subject.key("k4")
|
|
124
|
-
subject.start_array
|
|
125
|
-
subject.value(1)
|
|
126
|
-
subject.start_object
|
|
127
|
-
subject.key("sub2")
|
|
128
|
-
subject.start_array
|
|
129
|
-
subject.value(nil)
|
|
130
|
-
subject.end_array
|
|
131
|
-
subject.end_object
|
|
132
|
-
subject.end_array
|
|
133
|
-
|
|
134
|
-
subject.key("k5")
|
|
135
|
-
subject.value("string value")
|
|
136
|
-
subject.end_object
|
|
137
|
-
subject.end_document
|
|
138
|
-
expected = {
|
|
139
|
-
"k1" => 1,
|
|
140
|
-
"k2" => {},
|
|
141
|
-
"k3" => {"sub1" => [12]},
|
|
142
|
-
"k4" => [1, {"sub2" => [nil]}],
|
|
143
|
-
"k5" => "string value"
|
|
144
|
-
}
|
|
145
|
-
assert_equal expected, subject.result
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
it 'builds a real document' do
|
|
149
|
-
refute_nil subject
|
|
150
|
-
parser << File.read('spec/fixtures/repository.json')
|
|
151
|
-
refute_nil subject.result
|
|
152
|
-
assert_equal 'rails', subject.result['name']
|
|
153
|
-
assert_equal 4223, subject.result['owner']['id']
|
|
154
|
-
assert_equal false, subject.result['fork']
|
|
155
|
-
assert_equal nil, subject.result['mirror_url']
|
|
156
|
-
end
|
|
157
|
-
end
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": 8514,
|
|
3
|
-
"name": "rails",
|
|
4
|
-
"full_name": "rails/rails",
|
|
5
|
-
"owner": {
|
|
6
|
-
"login": "rails",
|
|
7
|
-
"id": 4223,
|
|
8
|
-
"avatar_url": "https://avatars.githubusercontent.com/u/4223?",
|
|
9
|
-
"gravatar_id": "30f39a09e233e8369dddf6feb4be0308",
|
|
10
|
-
"url": "https://api.github.com/users/rails",
|
|
11
|
-
"html_url": "https://github.com/rails",
|
|
12
|
-
"followers_url": "https://api.github.com/users/rails/followers",
|
|
13
|
-
"following_url": "https://api.github.com/users/rails/following{/other_user}",
|
|
14
|
-
"gists_url": "https://api.github.com/users/rails/gists{/gist_id}",
|
|
15
|
-
"starred_url": "https://api.github.com/users/rails/starred{/owner}{/repo}",
|
|
16
|
-
"subscriptions_url": "https://api.github.com/users/rails/subscriptions",
|
|
17
|
-
"organizations_url": "https://api.github.com/users/rails/orgs",
|
|
18
|
-
"repos_url": "https://api.github.com/users/rails/repos",
|
|
19
|
-
"events_url": "https://api.github.com/users/rails/events{/privacy}",
|
|
20
|
-
"received_events_url": "https://api.github.com/users/rails/received_events",
|
|
21
|
-
"type": "Organization",
|
|
22
|
-
"site_admin": false
|
|
23
|
-
},
|
|
24
|
-
"private": false,
|
|
25
|
-
"html_url": "https://github.com/rails/rails",
|
|
26
|
-
"description": "Ruby on Rails",
|
|
27
|
-
"fork": false,
|
|
28
|
-
"url": "https://api.github.com/repos/rails/rails",
|
|
29
|
-
"forks_url": "https://api.github.com/repos/rails/rails/forks",
|
|
30
|
-
"keys_url": "https://api.github.com/repos/rails/rails/keys{/key_id}",
|
|
31
|
-
"collaborators_url": "https://api.github.com/repos/rails/rails/collaborators{/collaborator}",
|
|
32
|
-
"teams_url": "https://api.github.com/repos/rails/rails/teams",
|
|
33
|
-
"hooks_url": "https://api.github.com/repos/rails/rails/hooks",
|
|
34
|
-
"issue_events_url": "https://api.github.com/repos/rails/rails/issues/events{/number}",
|
|
35
|
-
"events_url": "https://api.github.com/repos/rails/rails/events",
|
|
36
|
-
"assignees_url": "https://api.github.com/repos/rails/rails/assignees{/user}",
|
|
37
|
-
"branches_url": "https://api.github.com/repos/rails/rails/branches{/branch}",
|
|
38
|
-
"tags_url": "https://api.github.com/repos/rails/rails/tags",
|
|
39
|
-
"blobs_url": "https://api.github.com/repos/rails/rails/git/blobs{/sha}",
|
|
40
|
-
"git_tags_url": "https://api.github.com/repos/rails/rails/git/tags{/sha}",
|
|
41
|
-
"git_refs_url": "https://api.github.com/repos/rails/rails/git/refs{/sha}",
|
|
42
|
-
"trees_url": "https://api.github.com/repos/rails/rails/git/trees{/sha}",
|
|
43
|
-
"statuses_url": "https://api.github.com/repos/rails/rails/statuses/{sha}",
|
|
44
|
-
"languages_url": "https://api.github.com/repos/rails/rails/languages",
|
|
45
|
-
"stargazers_url": "https://api.github.com/repos/rails/rails/stargazers",
|
|
46
|
-
"contributors_url": "https://api.github.com/repos/rails/rails/contributors",
|
|
47
|
-
"subscribers_url": "https://api.github.com/repos/rails/rails/subscribers",
|
|
48
|
-
"subscription_url": "https://api.github.com/repos/rails/rails/subscription",
|
|
49
|
-
"commits_url": "https://api.github.com/repos/rails/rails/commits{/sha}",
|
|
50
|
-
"git_commits_url": "https://api.github.com/repos/rails/rails/git/commits{/sha}",
|
|
51
|
-
"comments_url": "https://api.github.com/repos/rails/rails/comments{/number}",
|
|
52
|
-
"issue_comment_url": "https://api.github.com/repos/rails/rails/issues/comments/{number}",
|
|
53
|
-
"contents_url": "https://api.github.com/repos/rails/rails/contents/{+path}",
|
|
54
|
-
"compare_url": "https://api.github.com/repos/rails/rails/compare/{base}...{head}",
|
|
55
|
-
"merges_url": "https://api.github.com/repos/rails/rails/merges",
|
|
56
|
-
"archive_url": "https://api.github.com/repos/rails/rails/{archive_format}{/ref}",
|
|
57
|
-
"downloads_url": "https://api.github.com/repos/rails/rails/downloads",
|
|
58
|
-
"issues_url": "https://api.github.com/repos/rails/rails/issues{/number}",
|
|
59
|
-
"pulls_url": "https://api.github.com/repos/rails/rails/pulls{/number}",
|
|
60
|
-
"milestones_url": "https://api.github.com/repos/rails/rails/milestones{/number}",
|
|
61
|
-
"notifications_url": "https://api.github.com/repos/rails/rails/notifications{?since,all,participating}",
|
|
62
|
-
"labels_url": "https://api.github.com/repos/rails/rails/labels{/name}",
|
|
63
|
-
"releases_url": "https://api.github.com/repos/rails/rails/releases{/id}",
|
|
64
|
-
"created_at": "2008-04-11T02:19:47Z",
|
|
65
|
-
"updated_at": "2014-06-25T21:08:45Z",
|
|
66
|
-
"pushed_at": "2014-06-25T17:47:52Z",
|
|
67
|
-
"git_url": "git://github.com/rails/rails.git",
|
|
68
|
-
"ssh_url": "git@github.com:rails/rails.git",
|
|
69
|
-
"clone_url": "https://github.com/rails/rails.git",
|
|
70
|
-
"svn_url": "https://github.com/rails/rails",
|
|
71
|
-
"homepage": "http://rubyonrails.org",
|
|
72
|
-
"size": 331047,
|
|
73
|
-
"stargazers_count": 22248,
|
|
74
|
-
"watchers_count": 22248,
|
|
75
|
-
"language": "Ruby",
|
|
76
|
-
"has_issues": true,
|
|
77
|
-
"has_downloads": true,
|
|
78
|
-
"has_wiki": false,
|
|
79
|
-
"forks_count": 8278,
|
|
80
|
-
"mirror_url": null,
|
|
81
|
-
"open_issues_count": 625,
|
|
82
|
-
"forks": 8278,
|
|
83
|
-
"open_issues": 625,
|
|
84
|
-
"watchers": 22248,
|
|
85
|
-
"default_branch": "master",
|
|
86
|
-
"organization": {
|
|
87
|
-
"login": "rails",
|
|
88
|
-
"id": 4223,
|
|
89
|
-
"avatar_url": "https://avatars.githubusercontent.com/u/4223?",
|
|
90
|
-
"gravatar_id": "30f39a09e233e8369dddf6feb4be0308",
|
|
91
|
-
"url": "https://api.github.com/users/rails",
|
|
92
|
-
"html_url": "https://github.com/rails",
|
|
93
|
-
"followers_url": "https://api.github.com/users/rails/followers",
|
|
94
|
-
"following_url": "https://api.github.com/users/rails/following{/other_user}",
|
|
95
|
-
"gists_url": "https://api.github.com/users/rails/gists{/gist_id}",
|
|
96
|
-
"starred_url": "https://api.github.com/users/rails/starred{/owner}{/repo}",
|
|
97
|
-
"subscriptions_url": "https://api.github.com/users/rails/subscriptions",
|
|
98
|
-
"organizations_url": "https://api.github.com/users/rails/orgs",
|
|
99
|
-
"repos_url": "https://api.github.com/users/rails/repos",
|
|
100
|
-
"events_url": "https://api.github.com/users/rails/events{/privacy}",
|
|
101
|
-
"received_events_url": "https://api.github.com/users/rails/received_events",
|
|
102
|
-
"type": "Organization",
|
|
103
|
-
"site_admin": false
|
|
104
|
-
},
|
|
105
|
-
"network_count": 8278,
|
|
106
|
-
"subscribers_count": 1521
|
|
107
|
-
}
|