abroad 4.5.1 → 4.6.0
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 +4 -4
- data/abroad.gemspec +1 -1
- data/lib/abroad/extractors/json/dotted_key_extractor.rb +35 -43
- data/lib/abroad/extractors/yaml/dotted_key_extractor.rb +2 -5
- data/lib/abroad/serializers/json/dotted_key_serializer.rb +5 -5
- data/lib/abroad/serializers/json/json_serializer.rb +1 -1
- data/lib/abroad/serializers/json/key_value_serializer.rb +1 -23
- data/lib/abroad/serializers/serializer.rb +4 -4
- data/lib/abroad/version.rb +1 -1
- data/spec/extractors/yaml/fixtures.yml +0 -6
- data/spec/serializers/json/dotted_key_serializer_spec.rb +28 -2
- data/spec/serializers/json/key_value_serializer_spec.rb +2 -2
- metadata +4 -6
- data/spec/extractors/yaml/fixtures/invalid_single_quote_escape.yml +0 -2
- data/spec/extractors/yaml/fixtures/invalid_single_quote_escape_array.yml +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5eec9b86e92064221115136a2bf8405efff02d00a3f086e7e7b1e6bf8d672c9f
|
|
4
|
+
data.tar.gz: ec259696892c01a1dfa395a98f6a15d95e0a1fd411f29a540b5654755fd88a6c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2657536bfb1d870a23b79436f4db877e3e268d29351aa979d58c9bec4edb59f6575c32768794770d7643d568dddead12f625af2b7d66e5b03b3dc457db69a691
|
|
7
|
+
data.tar.gz: ff37008d623e1807eca7cf09f1b2b2244c8cf5b6a5af86a409f346e25446265d416418049c2933a7fa11e86b7f2741aa8cd3e1933b1806d514026988d10f817e
|
data/abroad.gemspec
CHANGED
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
|
15
15
|
|
|
16
16
|
s.add_dependency 'htmlentities', '~> 4.0'
|
|
17
17
|
s.add_dependency 'json-stream', '~> 0.0'
|
|
18
|
-
s.add_dependency 'json-write-stream', '~>
|
|
18
|
+
s.add_dependency 'json-write-stream', '~> 2.0'
|
|
19
19
|
s.add_dependency 'nokogiri', '~> 1.8'
|
|
20
20
|
s.add_dependency 'xml-write-stream', '~> 1.0'
|
|
21
21
|
s.add_dependency 'yaml-write-stream', '~> 2.0'
|
|
@@ -1,64 +1,56 @@
|
|
|
1
|
-
require 'json/stream'
|
|
2
|
-
|
|
3
1
|
module Abroad
|
|
4
2
|
module Extractors
|
|
5
3
|
module Json
|
|
6
4
|
|
|
7
5
|
class DottedKeyExtractor < JsonExtractor
|
|
8
|
-
|
|
9
6
|
private
|
|
10
7
|
|
|
11
|
-
def each_entry
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
parser = ::JSON::Stream::Parser.new.tap do |parser|
|
|
16
|
-
parser.key { |k| key.push(k) }
|
|
17
|
-
|
|
18
|
-
parser.value do |val|
|
|
19
|
-
yield key.join('.'), val
|
|
8
|
+
def each_entry(options = {}, &block)
|
|
9
|
+
walk(parse, [], options, &block)
|
|
10
|
+
end
|
|
20
11
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
12
|
+
def parse
|
|
13
|
+
JSON.parse(stream.read)
|
|
14
|
+
rescue JSON::ParserError => e
|
|
15
|
+
raise Abroad::SyntaxError, "Syntax error in yaml: #{e.message}"
|
|
16
|
+
end
|
|
24
17
|
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
def walk(obj, cur_path, options, &block)
|
|
19
|
+
case obj
|
|
20
|
+
when Hash
|
|
21
|
+
obj.each_pair do |key, val|
|
|
22
|
+
segment = is_numeric?(key) ? "'#{key}'" : key
|
|
23
|
+
walk(val, cur_path + [segment], options, &block)
|
|
27
24
|
end
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
nesting_stack.push(:array)
|
|
32
|
-
key.push(0)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
parser.end_array do
|
|
36
|
-
nesting_stack.pop
|
|
37
|
-
key.pop
|
|
38
|
-
|
|
39
|
-
if nesting_stack.last == :object
|
|
40
|
-
key.pop
|
|
25
|
+
when Array
|
|
26
|
+
if options[:preserve_arrays] && string_array?(obj)
|
|
27
|
+
yield cur_path.join('.'), obj
|
|
41
28
|
else
|
|
42
|
-
|
|
29
|
+
obj.each_with_index do |val, idx|
|
|
30
|
+
walk(val, cur_path + [idx.to_s], options, &block)
|
|
31
|
+
end
|
|
43
32
|
end
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
end
|
|
33
|
+
else
|
|
34
|
+
yield cur_path.join('.'), obj
|
|
35
|
+
end
|
|
36
|
+
end
|
|
49
37
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
38
|
+
def string_array?(arr)
|
|
39
|
+
arr.all? do |elem|
|
|
40
|
+
case elem
|
|
41
|
+
when Hash, Array
|
|
42
|
+
false
|
|
43
|
+
else
|
|
44
|
+
true
|
|
53
45
|
end
|
|
54
46
|
end
|
|
55
|
-
|
|
56
|
-
parser << stream.read
|
|
57
|
-
rescue ::JSON::Stream::ParserError => e
|
|
58
|
-
raise Abroad::SyntaxError, "Syntax error in json: #{e.message}"
|
|
59
47
|
end
|
|
60
48
|
|
|
49
|
+
def is_numeric?(str)
|
|
50
|
+
!!(str.to_s =~ /\A\d+\z/)
|
|
51
|
+
end
|
|
61
52
|
end
|
|
53
|
+
|
|
62
54
|
end
|
|
63
55
|
end
|
|
64
56
|
end
|
|
@@ -4,11 +4,8 @@ module Abroad
|
|
|
4
4
|
|
|
5
5
|
class DottedKeyExtractor < YamlExtractor
|
|
6
6
|
def extract_each(options = {}, &block)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
else
|
|
10
|
-
to_enum(__method__, options)
|
|
11
|
-
end
|
|
7
|
+
return to_enum(__method__, options) unless block_given?
|
|
8
|
+
walk(parse, [], options, &block)
|
|
12
9
|
end
|
|
13
10
|
|
|
14
11
|
private
|
|
@@ -39,7 +39,7 @@ module Abroad
|
|
|
39
39
|
if node
|
|
40
40
|
if node.has_children?
|
|
41
41
|
if children_are_sequence?(node)
|
|
42
|
-
|
|
42
|
+
write_array(node, parent_key)
|
|
43
43
|
else
|
|
44
44
|
write_object(node, parent_key)
|
|
45
45
|
end
|
|
@@ -75,18 +75,18 @@ module Abroad
|
|
|
75
75
|
writer.close_object
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
-
def
|
|
78
|
+
def write_array(node, parent_key)
|
|
79
79
|
if writer.in_object?
|
|
80
|
-
writer.
|
|
80
|
+
writer.write_array(parent_key)
|
|
81
81
|
else
|
|
82
|
-
writer.
|
|
82
|
+
writer.write_array
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
generate_sequence(node).each do |element|
|
|
86
86
|
write_node(element, nil)
|
|
87
87
|
end
|
|
88
88
|
|
|
89
|
-
writer.
|
|
89
|
+
writer.close_array
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
def children_are_sequence?(node)
|
|
@@ -12,7 +12,7 @@ module Abroad
|
|
|
12
12
|
|
|
13
13
|
def write_key_value(key, value)
|
|
14
14
|
writer.write_key_value(
|
|
15
|
-
key.encode(encoding), value.encode(encoding)
|
|
15
|
+
key.encode(encoding), value.encode(encoding)
|
|
16
16
|
)
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -21,28 +21,6 @@ module Abroad
|
|
|
21
21
|
writer.close_object
|
|
22
22
|
super
|
|
23
23
|
end
|
|
24
|
-
|
|
25
|
-
private
|
|
26
|
-
|
|
27
|
-
def write_options
|
|
28
|
-
@write_options ||= { before: before_text, between: between_text }
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def before_text
|
|
32
|
-
@before_text ||= pretty? ? "\n#{' ' * indent_spaces}" : ''
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def between_text
|
|
36
|
-
@between_text ||= pretty? ? ' ' : ''
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def indent_spaces
|
|
40
|
-
options.fetch(:indent_spaces, DEFAULT_INDENT_SPACES)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def pretty?
|
|
44
|
-
options.fetch(:pretty, true)
|
|
45
|
-
end
|
|
46
24
|
end
|
|
47
25
|
|
|
48
26
|
end
|
|
@@ -7,8 +7,8 @@ module Abroad
|
|
|
7
7
|
attr_reader :stream, :locale, :options
|
|
8
8
|
|
|
9
9
|
class << self
|
|
10
|
-
def from_stream(stream, locale)
|
|
11
|
-
serializer = new(stream, locale)
|
|
10
|
+
def from_stream(stream, locale, options = {})
|
|
11
|
+
serializer = new(stream, locale, options)
|
|
12
12
|
|
|
13
13
|
if block_given?
|
|
14
14
|
yield(serializer).tap do
|
|
@@ -19,8 +19,8 @@ module Abroad
|
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
def open(file, locale, mode = 'r', &block)
|
|
23
|
-
from_stream(File.open(file, mode), locale, &block)
|
|
22
|
+
def open(file, locale, mode = 'r', options = {}, &block)
|
|
23
|
+
from_stream(File.open(file, mode), locale, options, &block)
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
data/lib/abroad/version.rb
CHANGED
|
@@ -7,7 +7,7 @@ describe Json::DottedKeySerializer do
|
|
|
7
7
|
let(:locale) { 'fr-FR' }
|
|
8
8
|
|
|
9
9
|
let(:serializer) do
|
|
10
|
-
Json::DottedKeySerializer.new(stream, locale)
|
|
10
|
+
Json::DottedKeySerializer.new(stream, locale, pretty: true)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def serialize
|
|
@@ -21,6 +21,32 @@ describe Json::DottedKeySerializer do
|
|
|
21
21
|
serializer.write_key_value('com.foo.bar', 'baz')
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
expect(result).to eq(
|
|
24
|
+
expect(result).to eq(<<~END.strip)
|
|
25
|
+
{
|
|
26
|
+
"com": {
|
|
27
|
+
"foo": {
|
|
28
|
+
"bar": "baz"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
END
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'writes sequences' do
|
|
36
|
+
result = serialize do
|
|
37
|
+
serializer.write_key_value('baz.boo.0', 'elem1')
|
|
38
|
+
serializer.write_key_value('baz.boo.1', 'elem2')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
expect(result).to eq(<<~END.strip)
|
|
42
|
+
{
|
|
43
|
+
"baz": {
|
|
44
|
+
"boo": [
|
|
45
|
+
"elem1",
|
|
46
|
+
"elem2"
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
END
|
|
25
51
|
end
|
|
26
52
|
end
|
|
@@ -7,7 +7,7 @@ describe Json::KeyValueSerializer do
|
|
|
7
7
|
let(:locale) { 'fr-FR' }
|
|
8
8
|
|
|
9
9
|
let(:serializer) do
|
|
10
|
-
Json::KeyValueSerializer.new(stream, locale)
|
|
10
|
+
Json::KeyValueSerializer.new(stream, locale, pretty: true)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def serialize
|
|
@@ -21,6 +21,6 @@ describe Json::KeyValueSerializer do
|
|
|
21
21
|
serializer.write_key_value('foo', 'bar')
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
expect(result).to eq("{\n
|
|
24
|
+
expect(result).to eq("{\n \"foo\": \"bar\"\n}")
|
|
25
25
|
end
|
|
26
26
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: abroad
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.
|
|
4
|
+
version: 4.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Cameron Dutro
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2019-01-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: htmlentities
|
|
@@ -44,14 +44,14 @@ dependencies:
|
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
47
|
+
version: '2.0'
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '
|
|
54
|
+
version: '2.0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: nokogiri
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -163,8 +163,6 @@ files:
|
|
|
163
163
|
- spec/extractors/yaml/fixtures.yml
|
|
164
164
|
- spec/extractors/yaml/fixtures/arrays.yml
|
|
165
165
|
- spec/extractors/yaml/fixtures/arrays_and_hashes.yml
|
|
166
|
-
- spec/extractors/yaml/fixtures/invalid_single_quote_escape.yml
|
|
167
|
-
- spec/extractors/yaml/fixtures/invalid_single_quote_escape_array.yml
|
|
168
166
|
- spec/extractors/yaml/fixtures/nesting.yml
|
|
169
167
|
- spec/extractors/yaml/fixtures/numeric_keys.yml
|
|
170
168
|
- spec/extractors/yaml/fixtures/short.yml
|