abroad 4.4.0 → 4.5.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/lib/abroad.rb +2 -0
- data/lib/abroad/extractors/json.rb +2 -1
- data/lib/abroad/extractors/json/dotted_key_extractor.rb +64 -0
- data/lib/abroad/serializers/json.rb +1 -0
- data/lib/abroad/serializers/json/dotted_key_serializer.rb +106 -0
- data/lib/abroad/serializers/json/key_value_serializer.rb +1 -1
- data/lib/abroad/version.rb +1 -1
- data/spec/extractors/json/fixtures.yml +29 -0
- data/spec/extractors/json/fixtures/nested_arrays.json +10 -0
- data/spec/extractors/json/fixtures/nested_basic.json +12 -0
- data/spec/serializers/json/dotted_key_serializer_spec.rb +26 -0
- data/spec/spec_helper.rb +2 -0
- metadata +8 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5348d2c2cb1364b7537eff619d098424e7a75b59
|
|
4
|
+
data.tar.gz: 0e81e30e065c6cd40e1f9388e55cdf15336aec38
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f91182af853c8dc4a173138c9edf9910a91da23495d6bfbc1c6a618611c0471de1b9e4c9e6254b3d0886ba20ac93c373499f6993668837382842d8d394c8ba59
|
|
7
|
+
data.tar.gz: ad1c5ccbdd511ef917b1aac506cb6dfea7adc42f0fe90b3043f9c1524f256d157cfd0d53581ee9c549eb82239b720ec5b859a79fb2d2c386b738923e554fc37b
|
data/lib/abroad.rb
CHANGED
|
@@ -7,11 +7,13 @@ module Abroad
|
|
|
7
7
|
Extractors.register('yaml/rails', Extractors::Yaml::RailsExtractor)
|
|
8
8
|
Extractors.register('yaml/dotted-key', Extractors::Yaml::DottedKeyExtractor)
|
|
9
9
|
Extractors.register('json/key-value', Extractors::Json::KeyValueExtractor)
|
|
10
|
+
Extractors.register('json/dotted-key', Extractors::Json::DottedKeyExtractor)
|
|
10
11
|
Extractors.register('xml/android', Extractors::Xml::AndroidExtractor)
|
|
11
12
|
Extractors.register('txt/lines', Extractors::Txt::LinesExtractor)
|
|
12
13
|
|
|
13
14
|
Serializers.register('yaml/rails', Serializers::Yaml::RailsSerializer)
|
|
14
15
|
Serializers.register('json/key-value', Serializers::Json::KeyValueSerializer)
|
|
16
|
+
Serializers.register('json/dotted-key', Serializers::Json::DottedKeySerializer)
|
|
15
17
|
Serializers.register('xml/android', Serializers::Xml::AndroidSerializer)
|
|
16
18
|
Serializers.register('txt/lines', Serializers::Txt::LinesSerializer)
|
|
17
19
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
module Abroad
|
|
2
2
|
module Extractors
|
|
3
3
|
module Json
|
|
4
|
-
autoload :KeyValueExtractor, 'abroad/extractors/json/key_value_extractor'
|
|
5
4
|
autoload :JsonExtractor, 'abroad/extractors/json/json_extractor'
|
|
5
|
+
autoload :KeyValueExtractor, 'abroad/extractors/json/key_value_extractor'
|
|
6
|
+
autoload :DottedKeyExtractor, 'abroad/extractors/json/dotted_key_extractor'
|
|
6
7
|
end
|
|
7
8
|
end
|
|
8
9
|
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'json/stream'
|
|
2
|
+
|
|
3
|
+
module Abroad
|
|
4
|
+
module Extractors
|
|
5
|
+
module Json
|
|
6
|
+
|
|
7
|
+
class DottedKeyExtractor < JsonExtractor
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def each_entry
|
|
12
|
+
key = []
|
|
13
|
+
nesting_stack = []
|
|
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
|
|
20
|
+
|
|
21
|
+
case nesting_stack.last
|
|
22
|
+
when :object
|
|
23
|
+
key.pop
|
|
24
|
+
|
|
25
|
+
when :array
|
|
26
|
+
key[-1] += 1
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
parser.start_array do
|
|
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
|
|
41
|
+
else
|
|
42
|
+
key[-1] += 1
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
parser.start_object do
|
|
47
|
+
nesting_stack.push(:object)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
parser.end_object do
|
|
51
|
+
nesting_stack.pop
|
|
52
|
+
key.pop
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
parser << stream.read
|
|
57
|
+
rescue ::JSON::Stream::ParserError => e
|
|
58
|
+
raise Abroad::SyntaxError, "Syntax error in json: #{e.message}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -3,6 +3,7 @@ module Abroad
|
|
|
3
3
|
module Json
|
|
4
4
|
autoload :JsonSerializer, 'abroad/serializers/json/json_serializer'
|
|
5
5
|
autoload :KeyValueSerializer, 'abroad/serializers/json/key_value_serializer'
|
|
6
|
+
autoload :DottedKeySerializer, 'abroad/serializers/json/dotted_key_serializer'
|
|
6
7
|
end
|
|
7
8
|
end
|
|
8
9
|
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
module Abroad
|
|
2
|
+
module Serializers
|
|
3
|
+
module Json
|
|
4
|
+
|
|
5
|
+
class DottedKeySerializer < JsonSerializer
|
|
6
|
+
attr_reader :trie
|
|
7
|
+
|
|
8
|
+
def initialize(stream, locale, options = {})
|
|
9
|
+
super
|
|
10
|
+
@trie = Abroad::Serializers::Trie.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def write_key_value(key, value)
|
|
14
|
+
trie.add(key.split('.'), encode(value))
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def flush
|
|
18
|
+
write_node(trie.root, nil)
|
|
19
|
+
writer.flush
|
|
20
|
+
stream.flush
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def encode(value)
|
|
26
|
+
case value
|
|
27
|
+
when Array
|
|
28
|
+
value.map { |elem| encode(elem) }
|
|
29
|
+
else
|
|
30
|
+
if value.respond_to?(:encode)
|
|
31
|
+
value.encode(encoding)
|
|
32
|
+
else
|
|
33
|
+
value
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def write_node(node, parent_key)
|
|
39
|
+
if node
|
|
40
|
+
if node.has_children?
|
|
41
|
+
if children_are_sequence?(node)
|
|
42
|
+
write_sequence(node, parent_key)
|
|
43
|
+
else
|
|
44
|
+
write_object(node, parent_key)
|
|
45
|
+
end
|
|
46
|
+
elsif node.has_value?
|
|
47
|
+
write_value(node, parent_key)
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
write_value(node, parent_key)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def write_value(node, parent_key)
|
|
55
|
+
value = node ? node.value : ''
|
|
56
|
+
|
|
57
|
+
if writer.in_object?
|
|
58
|
+
writer.write_key_value(parent_key, value)
|
|
59
|
+
else
|
|
60
|
+
writer.write_element(value)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def write_object(node, parent_key)
|
|
65
|
+
if writer.in_object?
|
|
66
|
+
writer.write_object(parent_key)
|
|
67
|
+
else
|
|
68
|
+
writer.write_object
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
node.each_child do |key, child|
|
|
72
|
+
write_node(child, key)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
writer.close_object
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def write_sequence(node, parent_key)
|
|
79
|
+
if writer.in_object?
|
|
80
|
+
writer.write_sequence(parent_key)
|
|
81
|
+
else
|
|
82
|
+
writer.write_sequence
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
generate_sequence(node).each do |element|
|
|
86
|
+
write_node(element, nil)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
writer.close_sequence
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def children_are_sequence?(node)
|
|
93
|
+
node.children.all? { |key, _| key =~ /\A[\d]+\z/ }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def generate_sequence(node)
|
|
97
|
+
keys = node.children.keys.map(&:to_i)
|
|
98
|
+
keys.each_with_object(Array.new(keys.max)) do |idx, arr|
|
|
99
|
+
arr[idx] = node.children[idx.to_s]
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
data/lib/abroad/version.rb
CHANGED
|
@@ -20,3 +20,32 @@
|
|
|
20
20
|
string: cool string
|
|
21
21
|
- key: jelly.beans
|
|
22
22
|
string: popcorn
|
|
23
|
+
:json/dotted-key:
|
|
24
|
+
nested_basic.json:
|
|
25
|
+
- key: foo.bar
|
|
26
|
+
string: baz
|
|
27
|
+
- key: hello
|
|
28
|
+
string: cool string
|
|
29
|
+
- key: jelly.beans
|
|
30
|
+
string: popcorn
|
|
31
|
+
- key: jelly.and.delicious
|
|
32
|
+
string: red vines
|
|
33
|
+
nested_arrays.json:
|
|
34
|
+
- key: array1.0
|
|
35
|
+
string: first
|
|
36
|
+
- key: array1.1
|
|
37
|
+
string: second
|
|
38
|
+
- key: array1.2
|
|
39
|
+
string: third
|
|
40
|
+
- key: arrayObj.array2.0
|
|
41
|
+
string: fourth
|
|
42
|
+
- key: arrayObj.array2.1
|
|
43
|
+
string: fifth
|
|
44
|
+
- key: jelly.beans
|
|
45
|
+
string: popcorn
|
|
46
|
+
- key: arrayOfArrays.0.0
|
|
47
|
+
string: abc
|
|
48
|
+
- key: arrayOfArrays.0.1
|
|
49
|
+
string: def
|
|
50
|
+
- key: arrayOfArrays.1
|
|
51
|
+
string: ghi
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
include Abroad::Serializers
|
|
4
|
+
|
|
5
|
+
describe Json::DottedKeySerializer do
|
|
6
|
+
let(:stream) { StringIO.new }
|
|
7
|
+
let(:locale) { 'fr-FR' }
|
|
8
|
+
|
|
9
|
+
let(:serializer) do
|
|
10
|
+
Json::DottedKeySerializer.new(stream, locale)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def serialize
|
|
14
|
+
yield
|
|
15
|
+
serializer.flush
|
|
16
|
+
stream.string
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'writes key/value pairs' do
|
|
20
|
+
result = serialize do
|
|
21
|
+
serializer.write_key_value('com.foo.bar', 'baz')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
expect(result).to eq("{\"com\":{\"foo\":{\"bar\":\"baz\"}}}")
|
|
25
|
+
end
|
|
26
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -37,6 +37,8 @@ RSpec.configure do |config|
|
|
|
37
37
|
expected_phrase['key'] == actual_key
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
+
next unless expected_string_index
|
|
41
|
+
|
|
40
42
|
expected_phrase = expected_phrases[expected_string_index]
|
|
41
43
|
expect(expected_phrase).to_not be_nil
|
|
42
44
|
expect(expected_phrase['string']).to eq(actual_string)
|
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.5.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: 2018-05-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: htmlentities
|
|
@@ -113,6 +113,7 @@ files:
|
|
|
113
113
|
- lib/abroad/extractors.rb
|
|
114
114
|
- lib/abroad/extractors/extractor.rb
|
|
115
115
|
- lib/abroad/extractors/json.rb
|
|
116
|
+
- lib/abroad/extractors/json/dotted_key_extractor.rb
|
|
116
117
|
- lib/abroad/extractors/json/json_extractor.rb
|
|
117
118
|
- lib/abroad/extractors/json/key_value_extractor.rb
|
|
118
119
|
- lib/abroad/extractors/txt.rb
|
|
@@ -128,6 +129,7 @@ files:
|
|
|
128
129
|
- lib/abroad/extractors/yaml/yaml_extractor.rb
|
|
129
130
|
- lib/abroad/serializers.rb
|
|
130
131
|
- lib/abroad/serializers/json.rb
|
|
132
|
+
- lib/abroad/serializers/json/dotted_key_serializer.rb
|
|
131
133
|
- lib/abroad/serializers/json/json_serializer.rb
|
|
132
134
|
- lib/abroad/serializers/json/key_value_serializer.rb
|
|
133
135
|
- lib/abroad/serializers/serializer.rb
|
|
@@ -148,6 +150,8 @@ files:
|
|
|
148
150
|
- spec/extractors/json/fixtures.yml
|
|
149
151
|
- spec/extractors/json/fixtures/arrays.json
|
|
150
152
|
- spec/extractors/json/fixtures/basic.json
|
|
153
|
+
- spec/extractors/json/fixtures/nested_arrays.json
|
|
154
|
+
- spec/extractors/json/fixtures/nested_basic.json
|
|
151
155
|
- spec/extractors/json/fixtures/objects.json
|
|
152
156
|
- spec/extractors/json/json_extractor_spec.rb
|
|
153
157
|
- spec/extractors/txt/lines_extractor_spec.rb
|
|
@@ -172,6 +176,7 @@ files:
|
|
|
172
176
|
- spec/extractors/yaml/fixtures/short.yml
|
|
173
177
|
- spec/extractors/yaml/jruby_compat_spec.rb
|
|
174
178
|
- spec/extractors/yaml/yaml_extractor_spec.rb
|
|
179
|
+
- spec/serializers/json/dotted_key_serializer_spec.rb
|
|
175
180
|
- spec/serializers/json/key_value_serializer_spec.rb
|
|
176
181
|
- spec/serializers/txt/lines_serializer_spec.rb
|
|
177
182
|
- spec/serializers/xml/android_serializer_spec.rb
|
|
@@ -196,7 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
196
201
|
version: '0'
|
|
197
202
|
requirements: []
|
|
198
203
|
rubyforge_project:
|
|
199
|
-
rubygems_version: 2.
|
|
204
|
+
rubygems_version: 2.4.5.5
|
|
200
205
|
signing_key:
|
|
201
206
|
specification_version: 4
|
|
202
207
|
summary: A set of parsers and serializers for dealing with localization file formats.
|