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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f0a35002bd8c8d2126673c796bd280aaa873a32d182f6f47d29ba2843540f96d
4
- data.tar.gz: cfc465bf70de136e509b7f6ebf048fd5d82250a2d06579be5ee6943a2f4b057e
3
+ metadata.gz: 5eec9b86e92064221115136a2bf8405efff02d00a3f086e7e7b1e6bf8d672c9f
4
+ data.tar.gz: ec259696892c01a1dfa395a98f6a15d95e0a1fd411f29a540b5654755fd88a6c
5
5
  SHA512:
6
- metadata.gz: 442cc1ea0585f26f0cc714a4111e6fc134aa65ee89b15d034ec71e57908a7659e4983fb115e2e7d8fb7af54c212b4ae13777d0f65225535d845bbfd5a09efffd
7
- data.tar.gz: dc1629d4c1a14039ade81ef9a40cd1ec257148647ab3c2e1d9b02e27c6f8392984a1d10f68ec8a7c577e589ac528fb83755ab9ab1199cd12c20ed817d0198b48
6
+ metadata.gz: 2657536bfb1d870a23b79436f4db877e3e268d29351aa979d58c9bec4edb59f6575c32768794770d7643d568dddead12f625af2b7d66e5b03b3dc457db69a691
7
+ data.tar.gz: ff37008d623e1807eca7cf09f1b2b2244c8cf5b6a5af86a409f346e25446265d416418049c2933a7fa11e86b7f2741aa8cd3e1933b1806d514026988d10f817e
@@ -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', '~> 1.2'
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
- 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
8
+ def each_entry(options = {}, &block)
9
+ walk(parse, [], options, &block)
10
+ end
20
11
 
21
- case nesting_stack.last
22
- when :object
23
- key.pop
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
- when :array
26
- key[-1] += 1
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
- 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
25
+ when Array
26
+ if options[:preserve_arrays] && string_array?(obj)
27
+ yield cur_path.join('.'), obj
41
28
  else
42
- key[-1] += 1
29
+ obj.each_with_index do |val, idx|
30
+ walk(val, cur_path + [idx.to_s], options, &block)
31
+ end
43
32
  end
44
- end
45
-
46
- parser.start_object do
47
- nesting_stack.push(:object)
48
- end
33
+ else
34
+ yield cur_path.join('.'), obj
35
+ end
36
+ end
49
37
 
50
- parser.end_object do
51
- nesting_stack.pop
52
- key.pop
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
- if block_given?
8
- walk(parse, [], options, &block)
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
- write_sequence(node, parent_key)
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 write_sequence(node, parent_key)
78
+ def write_array(node, parent_key)
79
79
  if writer.in_object?
80
- writer.write_sequence(parent_key)
80
+ writer.write_array(parent_key)
81
81
  else
82
- writer.write_sequence
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.close_sequence
89
+ writer.close_array
90
90
  end
91
91
 
92
92
  def children_are_sequence?(node)
@@ -9,7 +9,7 @@ module Abroad
9
9
 
10
10
  def initialize(stream, locale, options = {})
11
11
  super
12
- @writer = JsonWriteStream.from_stream(stream, encoding)
12
+ @writer = JsonWriteStream.from_stream(stream, options)
13
13
  end
14
14
 
15
15
  def write_raw(text)
@@ -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), write_options
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
 
@@ -1,3 +1,3 @@
1
1
  module Abroad
2
- VERSION = '4.5.1'
2
+ VERSION = '4.6.0'
3
3
  end
@@ -1,10 +1,4 @@
1
1
  :yaml/dotted-key:
2
- invalid_single_quote_escape_array.yml:
3
- - key: foo.bar.0
4
- string: baz'boo
5
- invalid_single_quote_escape.yml:
6
- - key: foo.bar
7
- string: baz'boo
8
2
  short.yml:
9
3
  - key: foo.bar
10
4
  string: baz
@@ -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("{\"com\":{\"foo\":{\"bar\":\"baz\"}}}")
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 \"foo\": \"bar\"}")
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.5.1
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: 2018-06-04 00:00:00.000000000 Z
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: '1.2'
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: '1.2'
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
@@ -1,2 +0,0 @@
1
- foo:
2
- bar: "baz\'boo"