json_parser 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -4
- data/lib/json_parser.rb +6 -4
- data/lib/json_parser/builder.rb +13 -15
- data/lib/json_parser/class_methods.rb +2 -5
- data/lib/json_parser/crawler.rb +34 -41
- data/lib/json_parser/exception.rb +3 -0
- data/lib/json_parser/fetcher.rb +4 -5
- data/lib/json_parser/reader.rb +44 -0
- data/lib/json_parser/version.rb +1 -1
- data/spec/fixtures/accounts_missing.json +3 -0
- data/spec/fixtures/complete_person.json +9 -0
- data/spec/lib/json_parser/builder_spec.rb +1 -17
- data/spec/lib/json_parser/crawler_spec.rb +27 -6
- data/spec/lib/json_parser/fetcher_spec.rb +1 -1
- data/spec/lib/json_parser/reader_spec.rb +120 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54a56224cff688292d5d7fcedba88d3056155295
|
4
|
+
data.tar.gz: 8ce6c70f4cf77f9c4b9f051a126589958aee78c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afe03643bf563a8c063d59b8f0c87233918a1811feb58eee1549b5006c2ec910c8170761463a6c0756638a2a983d4041ed9968c1ab3af48c49274c6f68b8c099
|
7
|
+
data.tar.gz: 47563cda0362ea10fdf25b3ecf26ef1c370f0cd5ad8161713b7662b3ceede19fa869d0f6face2596bb31efd5490b8e84a1ac11a94e129e81bb501fbf411543dd
|
data/README.md
CHANGED
@@ -85,8 +85,7 @@ Options
|
|
85
85
|
- type: Type that the value must be cast into ([TypeCast](#typecast))
|
86
86
|
- default: Default value (prior to casting and wrapping, see [Default](#default))
|
87
87
|
|
88
|
-
TypeCast
|
89
|
-
--------
|
88
|
+
## TypeCast
|
90
89
|
The type casting, when the option `type` is passed, is done through the `JsonParser::TypeCast` which can
|
91
90
|
be extended
|
92
91
|
|
@@ -140,8 +139,7 @@ end
|
|
140
139
|
#returns 1050.36
|
141
140
|
```
|
142
141
|
|
143
|
-
Default
|
144
|
-
-------
|
142
|
+
## Default
|
145
143
|
Default value returned before typecasting or class wrapping
|
146
144
|
|
147
145
|
```ruby
|
data/lib/json_parser.rb
CHANGED
@@ -5,10 +5,12 @@ require 'sinclair'
|
|
5
5
|
module JsonParser
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
|
-
autoload :
|
8
|
+
autoload :Builder, 'json_parser/builder'
|
9
|
+
autoload :ClassMethods, 'json_parser/class_methods'
|
9
10
|
autoload :Crawler, 'json_parser/crawler'
|
10
|
-
autoload :
|
11
|
+
autoload :Exception, 'json_parser/exception'
|
11
12
|
autoload :Fetcher, 'json_parser/fetcher'
|
12
|
-
autoload :
|
13
|
-
autoload :
|
13
|
+
autoload :Reader, 'json_parser/reader'
|
14
|
+
autoload :Wrapper, 'json_parser/wrapper'
|
15
|
+
autoload :TypeCast, 'json_parser/type_cast'
|
14
16
|
end
|
data/lib/json_parser/builder.rb
CHANGED
@@ -1,45 +1,42 @@
|
|
1
1
|
class JsonParser::Builder < Sinclair
|
2
2
|
|
3
|
-
attr_reader :attr_names
|
3
|
+
attr_reader :attr_names, :path, :full_path, :cached
|
4
4
|
|
5
|
-
def initialize(attr_names, clazz, options)
|
5
|
+
def initialize(attr_names, clazz, path: nil, full_path: nil, cached: false, **options)
|
6
6
|
super(clazz, {
|
7
7
|
after: false,
|
8
|
-
cached: false,
|
9
8
|
case: :lower_camel,
|
10
9
|
class: nil,
|
11
10
|
compact: false,
|
12
11
|
default: nil,
|
13
12
|
flatten: false,
|
14
|
-
full_path: nil,
|
15
13
|
json: :json,
|
16
|
-
path: nil,
|
17
14
|
type: :none
|
18
15
|
}.merge(options.symbolize_keys))
|
19
16
|
|
20
17
|
@attr_names = attr_names
|
18
|
+
@path = path
|
19
|
+
@full_path = full_path
|
20
|
+
@cached = cached
|
21
21
|
init
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
25
25
|
|
26
|
-
delegate :path, :full_path, :cached, :compact,
|
27
|
-
:type, :after, to: :options_object
|
28
|
-
|
29
26
|
def init
|
30
27
|
attr_names.each do |attr|
|
31
28
|
add_attr(attr)
|
32
29
|
end
|
33
30
|
end
|
34
31
|
|
35
|
-
def json_name
|
36
|
-
options[:json]
|
37
|
-
end
|
38
|
-
|
39
32
|
def real_path(attribute)
|
40
33
|
full_path || [path, attribute].compact.join('.')
|
41
34
|
end
|
42
35
|
|
36
|
+
def json_name
|
37
|
+
options[:json]
|
38
|
+
end
|
39
|
+
|
43
40
|
def wrapper_clazz
|
44
41
|
options[:class]
|
45
42
|
end
|
@@ -48,10 +45,11 @@ class JsonParser::Builder < Sinclair
|
|
48
45
|
options[:case]
|
49
46
|
end
|
50
47
|
|
51
|
-
def fetcher_options
|
48
|
+
def fetcher_options(attribute)
|
52
49
|
options.slice(:compact, :after, :type, :flatten, :default).merge({
|
53
50
|
clazz: wrapper_clazz,
|
54
|
-
case_type: case_type
|
51
|
+
case_type: case_type,
|
52
|
+
path: real_path(attribute)
|
55
53
|
})
|
56
54
|
end
|
57
55
|
|
@@ -62,7 +60,7 @@ class JsonParser::Builder < Sinclair
|
|
62
60
|
def attr_fetcher(attribute)
|
63
61
|
<<-CODE
|
64
62
|
::JsonParser::Fetcher.new(
|
65
|
-
#{json_name},
|
63
|
+
#{json_name}, self, #{fetcher_options(attribute)}
|
66
64
|
).fetch
|
67
65
|
CODE
|
68
66
|
end
|
@@ -1,10 +1,7 @@
|
|
1
1
|
module JsonParser
|
2
2
|
module ClassMethods
|
3
|
-
def json_parse(*attr_names)
|
4
|
-
|
5
|
-
|
6
|
-
builder = Builder.new(attr_names, self, options)
|
7
|
-
builder.build
|
3
|
+
def json_parse(*attr_names, **options)
|
4
|
+
Builder.new(attr_names, self, options).build
|
8
5
|
end
|
9
6
|
end
|
10
7
|
end
|
data/lib/json_parser/crawler.rb
CHANGED
@@ -1,52 +1,45 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def crawl(json, index = 0)
|
13
|
-
return wrap(json) if is_ended?(index)
|
14
|
-
return crawl_array(json, index) if json.is_a? Array
|
1
|
+
module JsonParser
|
2
|
+
class Crawler
|
3
|
+
attr_reader :post_process, :path, :case_type, :compact, :default
|
4
|
+
|
5
|
+
def initialize(path:, case_type: :lower_camel, compact: false, default: nil, &block)
|
6
|
+
@case_type = case_type
|
7
|
+
@compact = compact
|
8
|
+
@default = default
|
9
|
+
@path = path
|
10
|
+
@post_process = block
|
11
|
+
end
|
15
12
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
def value(json, index = 0)
|
14
|
+
crawl(json, index)
|
15
|
+
rescue Exception::KeyNotFound
|
16
|
+
wrap(default)
|
17
|
+
end
|
20
18
|
|
21
|
-
|
19
|
+
private
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
21
|
+
def crawl(json, index = 0)
|
22
|
+
return wrap(json) if reader.is_ended?(index)
|
23
|
+
return crawl_array(json, index) if json.is_a?(Array)
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
25
|
+
crawl(reader.read(json, index), index + 1)
|
26
|
+
end
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
def reader
|
29
|
+
@reader ||= JsonParser::Reader.new(
|
30
|
+
path: path,
|
31
|
+
case_type: case_type
|
32
|
+
)
|
33
|
+
end
|
35
34
|
|
36
|
-
|
37
|
-
|
38
|
-
when :lower_camel
|
39
|
-
key.camelize(:lower)
|
40
|
-
when :upper_camel
|
41
|
-
key.camelize(:upper)
|
42
|
-
when :snake
|
43
|
-
key.underscore
|
35
|
+
def wrap(json)
|
36
|
+
post_process.call(json)
|
44
37
|
end
|
45
|
-
end
|
46
38
|
|
47
|
-
|
48
|
-
|
49
|
-
|
39
|
+
def crawl_array(array, index)
|
40
|
+
array.map { |j| value(j, index) }.tap do |a|
|
41
|
+
a.compact! if compact
|
42
|
+
end
|
50
43
|
end
|
51
44
|
end
|
52
45
|
end
|
data/lib/json_parser/fetcher.rb
CHANGED
@@ -5,9 +5,8 @@ class JsonParser::Fetcher
|
|
5
5
|
|
6
6
|
delegate :after, :flatten, to: :options_object
|
7
7
|
delegate :wrap, to: :wrapper
|
8
|
-
delegate :crawl, to: :crawler
|
9
8
|
|
10
|
-
def initialize(json,
|
9
|
+
def initialize(json, instance, path:, **options)
|
11
10
|
@path = path.to_s.split('.')
|
12
11
|
@json = json
|
13
12
|
@instance = instance
|
@@ -15,7 +14,7 @@ class JsonParser::Fetcher
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def fetch
|
18
|
-
value =
|
17
|
+
value = crawler.value(json)
|
19
18
|
value.flatten! if flatten && value.respond_to?(:flatten!)
|
20
19
|
value = instance.send(after, value) if after
|
21
20
|
value
|
@@ -28,13 +27,13 @@ class JsonParser::Fetcher
|
|
28
27
|
end
|
29
28
|
|
30
29
|
def buidl_crawler
|
31
|
-
JsonParser::Crawler.new(
|
30
|
+
JsonParser::Crawler.new(crawler_options) do |value|
|
32
31
|
wrap(value)
|
33
32
|
end
|
34
33
|
end
|
35
34
|
|
36
35
|
def crawler_options
|
37
|
-
options.slice(:case_type, :compact, :default)
|
36
|
+
options.slice(:case_type, :compact, :default).merge(path: path)
|
38
37
|
end
|
39
38
|
|
40
39
|
def wrapper
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module JsonParser
|
2
|
+
class Reader
|
3
|
+
attr_reader :path, :case_type
|
4
|
+
|
5
|
+
def initialize(path:, case_type:)
|
6
|
+
@case_type = case_type
|
7
|
+
@path = path.map(&self.method(:change_case))
|
8
|
+
end
|
9
|
+
|
10
|
+
def read(json, index)
|
11
|
+
key = path[index]
|
12
|
+
|
13
|
+
check_key!(json, key)
|
14
|
+
|
15
|
+
json.key?(key) ? json[key] : json[key.to_sym]
|
16
|
+
end
|
17
|
+
|
18
|
+
def is_ended?(index)
|
19
|
+
index >= path.size
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def check_key!(json, key)
|
25
|
+
return if has_key?(json, key)
|
26
|
+
raise Exception::KeyNotFound
|
27
|
+
end
|
28
|
+
|
29
|
+
def has_key?(json, key)
|
30
|
+
json&.key?(key) || json&.key?(key.to_sym)
|
31
|
+
end
|
32
|
+
|
33
|
+
def change_case(key)
|
34
|
+
case case_type
|
35
|
+
when :lower_camel
|
36
|
+
key.camelize(:lower)
|
37
|
+
when :upper_camel
|
38
|
+
key.camelize(:upper)
|
39
|
+
when :snake
|
40
|
+
key.underscore
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/json_parser/version.rb
CHANGED
@@ -18,7 +18,7 @@ describe JsonParser::Builder do
|
|
18
18
|
let(:instance) { clazz.new(json) }
|
19
19
|
|
20
20
|
subject do
|
21
|
-
described_class.new(attr_names, clazz, options)
|
21
|
+
described_class.new(attr_names, clazz, **options)
|
22
22
|
end
|
23
23
|
|
24
24
|
describe '#build' do
|
@@ -79,14 +79,6 @@ describe JsonParser::Builder do
|
|
79
79
|
it 'fetches the value within the json' do
|
80
80
|
expect(instance.the_name).to eq(name)
|
81
81
|
end
|
82
|
-
|
83
|
-
context 'when option key is a string' do
|
84
|
-
let(:options) { { 'full_path' => 'user.name' } }
|
85
|
-
|
86
|
-
it 'fetches the value within the json' do
|
87
|
-
expect(instance.the_name).to eq(name)
|
88
|
-
end
|
89
|
-
end
|
90
82
|
end
|
91
83
|
end
|
92
84
|
|
@@ -102,14 +94,6 @@ describe JsonParser::Builder do
|
|
102
94
|
it 'fills the new instance with the information fetched' do
|
103
95
|
expect(instance.person.name).to eq(name)
|
104
96
|
end
|
105
|
-
|
106
|
-
context 'when option key is a string' do
|
107
|
-
let(:options) { { 'class' => Person } }
|
108
|
-
|
109
|
-
it 'fills the new instance with the information fetched' do
|
110
|
-
expect(instance.person.name).to eq(name)
|
111
|
-
end
|
112
|
-
end
|
113
97
|
end
|
114
98
|
end
|
115
99
|
end
|
@@ -2,15 +2,15 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe JsonParser::Crawler do
|
4
4
|
let(:subject) do
|
5
|
-
described_class.new
|
5
|
+
described_class.new default_options.merge(options), &block
|
6
6
|
end
|
7
7
|
let(:block) { proc { |v| v } }
|
8
8
|
let(:path) { '' }
|
9
|
-
let(:default_options) { { case_type: :lower_camel} }
|
9
|
+
let(:default_options) { { path: path, case_type: :lower_camel} }
|
10
10
|
let(:options) { {} }
|
11
11
|
let(:json_file) { 'json_parser.json' }
|
12
12
|
let(:json) { load_json_fixture_file(json_file) }
|
13
|
-
let(:value) { subject.
|
13
|
+
let(:value) { subject.value(json) }
|
14
14
|
|
15
15
|
context 'when parsing with a path' do
|
16
16
|
let(:path) { %w(user name) }
|
@@ -20,7 +20,7 @@ describe JsonParser::Crawler do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
context 'when calling twice' do
|
23
|
-
before { subject.
|
23
|
+
before { subject.value(json) }
|
24
24
|
|
25
25
|
it 'can still crawl' do
|
26
26
|
expect(value).to eq(json['user']['name'])
|
@@ -52,14 +52,14 @@ describe JsonParser::Crawler do
|
|
52
52
|
let(:json_file) { 'accounts_missing.json' }
|
53
53
|
|
54
54
|
it 'returns the missing values as nil' do
|
55
|
-
expect(value).to eq([[1000.0, nil], nil, nil])
|
55
|
+
expect(value).to eq([[1000.0, nil, nil], nil, nil])
|
56
56
|
end
|
57
57
|
|
58
58
|
context 'when setting a default' do
|
59
59
|
let(:options) { { default: 10 } }
|
60
60
|
|
61
61
|
it 'returns the missing values as default' do
|
62
|
-
expect(value).to eq([[1000.0, nil], 10, 10])
|
62
|
+
expect(value).to eq([[1000.0, 10, nil], 10, 10])
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -180,6 +180,27 @@ describe JsonParser::Crawler do
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
+
context 'when the key last key is missing but the value is nil' do
|
184
|
+
let(:json_file) { 'person.json' }
|
185
|
+
let(:path) { %w(user nick_name) }
|
186
|
+
|
187
|
+
it 'returns the default value' do
|
188
|
+
expect(value).to eq(default_value)
|
189
|
+
end
|
190
|
+
|
191
|
+
context 'when wrapping it with a class' do
|
192
|
+
let(:block) { proc { |v| Person.new(v) } }
|
193
|
+
|
194
|
+
it 'wrap it with the class' do
|
195
|
+
expect(value).to be_a(Person)
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'wraps the default value' do
|
199
|
+
expect(value.name).to eq(default_value)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
183
204
|
context 'when the node is missing but default has the same node' do
|
184
205
|
let(:default_value) { { node: { value: 1 } } }
|
185
206
|
let(:path) { %w(node node node) }
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe JsonParser::Fetcher do
|
4
4
|
let(:subject) do
|
5
|
-
described_class.new json,
|
5
|
+
described_class.new json, instance, options.merge(path: path)
|
6
6
|
end
|
7
7
|
let(:path) { '' }
|
8
8
|
let(:instance) { JsonParser::Fetcher::Dummy.new }
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
shared_examples 'reader fetchin value' do
|
4
|
+
it do
|
5
|
+
expect { subject.read(json, index) }.not_to raise_error
|
6
|
+
end
|
7
|
+
|
8
|
+
it do
|
9
|
+
expect(subject.read(json, index)).not_to be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns the evaluated value' do
|
13
|
+
expect(subject.read(json, index)).to eq(expected)
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'and the json has symbolized_keys' do
|
17
|
+
it 'returns the evaluated value' do
|
18
|
+
expect(subject.read(sym_json, index)).to eq(expected)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe JsonParser::Reader do
|
24
|
+
subject do
|
25
|
+
described_class.new(path: path, case_type: case_type)
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:path) { %w(user full_name) }
|
29
|
+
let(:json_file) { 'complete_person.json' }
|
30
|
+
let(:full_json) { load_json_fixture_file(json_file) }
|
31
|
+
let(:json) { full_json }
|
32
|
+
let(:sym_json) { json.symbolize_keys }
|
33
|
+
let(:case_type) { :snake }
|
34
|
+
let(:index) { 0 }
|
35
|
+
|
36
|
+
describe '#read' do
|
37
|
+
context 'when the key is found' do
|
38
|
+
let(:expected) { json['user'] }
|
39
|
+
|
40
|
+
it_behaves_like 'reader fetchin value'
|
41
|
+
|
42
|
+
context 'when the path case is changed' do
|
43
|
+
let(:json) { full_json['user'] }
|
44
|
+
let(:index) { 1 }
|
45
|
+
|
46
|
+
context 'to snake_case' do
|
47
|
+
let(:path) { %w(user FullName) }
|
48
|
+
let(:expected) { json['full_name'] }
|
49
|
+
|
50
|
+
it_behaves_like 'reader fetchin value'
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'to upper_camel' do
|
54
|
+
let(:case_type) { :upper_camel }
|
55
|
+
let(:path) { %w(user login_name) }
|
56
|
+
let(:expected) { json['LoginName'] }
|
57
|
+
|
58
|
+
it_behaves_like 'reader fetchin value'
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'to lower_camel' do
|
62
|
+
let(:case_type) { :lower_camel }
|
63
|
+
let(:path) { %w(user birth_date) }
|
64
|
+
let(:expected) { json['birthDate'] }
|
65
|
+
|
66
|
+
it_behaves_like 'reader fetchin value'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when key is found but value is null' do
|
71
|
+
let(:json) { full_json['user'] }
|
72
|
+
let(:index) { 1 }
|
73
|
+
let(:path) { %w(user password_reminder) }
|
74
|
+
|
75
|
+
it do
|
76
|
+
expect(subject.read(json, index)).to be_nil
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'but keys are symbol' do
|
80
|
+
it do
|
81
|
+
expect(subject.read(sym_json, index)).to be_nil
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'when json has both string and symble' do
|
87
|
+
let(:path) { %w(key) }
|
88
|
+
let(:json) { { key: 'symbol', 'key' => 'string' } }
|
89
|
+
|
90
|
+
it 'fetches the string key first' do
|
91
|
+
expect(subject.read(json, index)).to eq('string')
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when the key is missing' do
|
97
|
+
let(:path) { %w(age) }
|
98
|
+
|
99
|
+
it do
|
100
|
+
expect do
|
101
|
+
subject.read(json, index)
|
102
|
+
end.to raise_error(JsonParser::Exception::KeyNotFound)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe 'is_ended?' do
|
108
|
+
context 'when index is within path' do
|
109
|
+
let(:index) { 1 }
|
110
|
+
|
111
|
+
it { expect(subject.is_ended?(index)).to be_falsey }
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'when index is outside path' do
|
115
|
+
let(:index) { 2 }
|
116
|
+
|
117
|
+
it { expect(subject.is_ended?(index)).to be_truthy }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bidu Dev's Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -143,12 +143,15 @@ files:
|
|
143
143
|
- lib/json_parser/builder.rb
|
144
144
|
- lib/json_parser/class_methods.rb
|
145
145
|
- lib/json_parser/crawler.rb
|
146
|
+
- lib/json_parser/exception.rb
|
146
147
|
- lib/json_parser/fetcher.rb
|
148
|
+
- lib/json_parser/reader.rb
|
147
149
|
- lib/json_parser/type_cast.rb
|
148
150
|
- lib/json_parser/version.rb
|
149
151
|
- lib/json_parser/wrapper.rb
|
150
152
|
- spec/fixtures/accounts.json
|
151
153
|
- spec/fixtures/accounts_missing.json
|
154
|
+
- spec/fixtures/complete_person.json
|
152
155
|
- spec/fixtures/json_parser.json
|
153
156
|
- spec/fixtures/person.json
|
154
157
|
- spec/integration/readme/default_spec.rb
|
@@ -156,6 +159,7 @@ files:
|
|
156
159
|
- spec/lib/json_parser/builder_spec.rb
|
157
160
|
- spec/lib/json_parser/crawler_spec.rb
|
158
161
|
- spec/lib/json_parser/fetcher_spec.rb
|
162
|
+
- spec/lib/json_parser/reader_spec.rb
|
159
163
|
- spec/lib/json_parser/wrapper_spec.rb
|
160
164
|
- spec/lib/json_parser_spec.rb
|
161
165
|
- spec/spec_helper.rb
|
@@ -198,6 +202,7 @@ summary: Json Parser
|
|
198
202
|
test_files:
|
199
203
|
- spec/fixtures/accounts.json
|
200
204
|
- spec/fixtures/accounts_missing.json
|
205
|
+
- spec/fixtures/complete_person.json
|
201
206
|
- spec/fixtures/json_parser.json
|
202
207
|
- spec/fixtures/person.json
|
203
208
|
- spec/integration/readme/default_spec.rb
|
@@ -205,6 +210,7 @@ test_files:
|
|
205
210
|
- spec/lib/json_parser/builder_spec.rb
|
206
211
|
- spec/lib/json_parser/crawler_spec.rb
|
207
212
|
- spec/lib/json_parser/fetcher_spec.rb
|
213
|
+
- spec/lib/json_parser/reader_spec.rb
|
208
214
|
- spec/lib/json_parser/wrapper_spec.rb
|
209
215
|
- spec/lib/json_parser_spec.rb
|
210
216
|
- spec/spec_helper.rb
|