abroad 4.5.1 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.
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"