saxerator 0.9.4 → 0.9.5

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
  SHA1:
3
- metadata.gz: a0cafde22b9761403aa299dcc6600e6905340929
4
- data.tar.gz: 045107a2d6e516c20b179d868cc1c32d1e01a664
3
+ metadata.gz: 8a9e778a67df70446a761b0c44b299ec71d17767
4
+ data.tar.gz: 4dd1010e6d76ec961dfaaac08b03e5c4e9179658
5
5
  SHA512:
6
- metadata.gz: e700487f042456f67b269e98c872aa4e91a9116f66abb11fe1d28b7569ddefeef14498b74131b05c799ca17a8bf4068704b229798e106a634453ead7052df93c
7
- data.tar.gz: 0f6ba9c8758489f4315027e0878ba0d27f19a0985bb0ad8a24d3a6178f62b72be0c7e88553b86934585732000bee213343d4b4b71a3042f3dad3053493986520
6
+ metadata.gz: f575598f8e4eb2a50a828457107084615cecb12dfc4c1c94bb0b673cf7a6cc0c75771400c38d8b9eb403bc95da1be5f9bfcd7d1ff5be85f171090ef7961a6c30
7
+ data.tar.gz: b33b5a6cd650a36d77ddf69ce33380aad95cc88d9c25d9000a86d1bd88377e4d07f0c7451a592b3b3c8d377c88de2ece5a72dda3c5be4dfdecceb487ee4768b0
@@ -6,7 +6,7 @@ module Saxerator
6
6
  def initialize(config, name, attributes)
7
7
  @config = config
8
8
  @name = config.generate_key_for(name)
9
- @attributes = attributes
9
+ @attributes = normalize_attributes(attributes)
10
10
  @children = []
11
11
  @text = false
12
12
  end
@@ -46,9 +46,9 @@ module Saxerator
46
46
  end
47
47
 
48
48
  def add_to_hash_element( hash, name, element)
49
- name = @config.generate_key_for(name)
49
+ name = generate_key(name)
50
50
  if hash[name]
51
- if !hash[name].is_a?(Array)
51
+ unless hash[name].is_a?(Array)
52
52
  hash[name] = ArrayElement[hash[name]]
53
53
  hash[name].name = name
54
54
  end
@@ -63,6 +63,14 @@ module Saxerator
63
63
  return to_hash if @children.count > 0 || (@attributes.count > 0 && @config.put_attributes_in_hash?)
64
64
  to_empty_element
65
65
  end
66
+
67
+ def normalize_attributes(attributes)
68
+ Hash[attributes.map {|key, value| [generate_key(key), value] }]
69
+ end
70
+
71
+ def generate_key(name)
72
+ @config.generate_key_for(name)
73
+ end
66
74
  end
67
75
  end
68
76
  end
@@ -1,3 +1,3 @@
1
1
  module Saxerator
2
- VERSION = "0.9.4"
2
+ VERSION = "0.9.5"
3
3
  end
@@ -35,5 +35,5 @@ Gem::Specification.new do |s|
35
35
 
36
36
  s.add_runtime_dependency 'nokogiri', '>= 1.4.0'
37
37
 
38
- s.add_development_dependency 'rspec', '>= 2.11.0'
38
+ s.add_development_dependency 'rspec', '~> 3.1'
39
39
  end
@@ -6,87 +6,87 @@ describe "Saxerator (default) hash format" do
6
6
  subject(:entry) { Saxerator.parser(xml).for_tag(:entry).first }
7
7
 
8
8
  # string
9
- specify { entry['title'].should == 'How to eat an airplane' }
9
+ specify { expect(entry['title']).to eq('How to eat an airplane') }
10
10
 
11
11
  # hash and cdata inside name
12
- specify { entry['author'].should == {'name' => 'Soul<utter'} }
12
+ specify { expect(entry['author']).to eq({'name' => 'Soul<utter'}) }
13
13
 
14
14
  # array of hashes
15
- specify { entry['contributor'].should == [{'name' => 'Jane Doe'}, {'name' => 'Leviticus Alabaster'}] }
15
+ specify { expect(entry['contributor']).to eq([{'name' => 'Jane Doe'}, {'name' => 'Leviticus Alabaster'}]) }
16
16
 
17
17
  # attributes on a hash
18
- specify { entry['contributor'][0].attributes['type'].should == 'primary' }
18
+ specify { expect(entry['contributor'][0].attributes['type']).to eq('primary') }
19
19
 
20
20
  # attributes on a string
21
- specify { entry['content'].attributes['type'].should == 'html' }
21
+ specify { expect(entry['content'].attributes['type']).to eq('html') }
22
22
 
23
23
  # name on a hash
24
- specify { entry.name.should == 'entry' }
24
+ specify { expect(entry.name).to eq('entry') }
25
25
 
26
26
  # name on a string
27
- specify { entry['title'].name.should == 'title' }
27
+ specify { expect(entry['title'].name).to eq('title') }
28
28
 
29
29
  describe "#to_s" do
30
30
  it "preserves the element name" do
31
- entry['title'].to_a.name.should == 'title'
31
+ expect(entry['title'].to_a.name).to eq('title')
32
32
  end
33
33
  end
34
34
 
35
35
  describe "#to_h" do
36
36
  it "preserves the element name" do
37
- entry.to_h.name.should == 'entry'
37
+ expect(entry.to_h.name).to eq('entry')
38
38
  end
39
39
  end
40
40
 
41
41
  describe "#to_a" do
42
42
  it "preserves the element name on a parsed hash" do
43
- entry.to_a.name.should == 'entry'
43
+ expect(entry.to_a.name).to eq('entry')
44
44
  end
45
45
 
46
46
  it "converts parsed hashes to nested key/value pairs (just like regular hashes)" do
47
- entry.to_a.first.should == ['id', '1']
47
+ expect(entry.to_a.first).to eq(['id', '1'])
48
48
  end
49
49
 
50
50
  it "preserves the element name on a parsed string" do
51
- entry['title'].to_a.name.should == 'title'
51
+ expect(entry['title'].to_a.name).to eq('title')
52
52
  end
53
53
 
54
54
  it "preserves the element name on an array" do
55
- entry['contributor'].to_a.name.should eq 'contributor'
55
+ expect(entry['contributor'].to_a.name).to eq 'contributor'
56
56
  end
57
57
  end
58
58
 
59
59
  # name on an array
60
- specify { entry['contributor'].name.should == 'contributor' }
60
+ specify { expect(entry['contributor'].name).to eq('contributor') }
61
61
 
62
62
  # character entity decoding
63
- specify { entry['content'].should == "<p>Airplanes are very large — this can present difficulty in digestion.</p>" }
63
+ specify { expect(entry['content']).to eq("<p>Airplanes are very large — this can present difficulty in digestion.</p>") }
64
64
 
65
65
  context "parsing an empty element" do
66
66
  subject(:element) { entry['media:thumbnail'] }
67
67
 
68
68
  it "behaves somewhat like nil" do
69
- element.should be_nil
70
- (!element).should eq true
71
- element.to_s.should eq ''
72
- element.to_h.should eq Hash.new
69
+ expect(element).to be_nil
70
+ expect(!element).to eq true
71
+ expect(element.to_s).to eq ''
72
+ expect(element.to_h).to eq Hash.new
73
73
  end
74
74
 
75
- it { should be_empty }
75
+ it { is_expected.to be_empty }
76
76
 
77
77
  it "has attributes" do
78
- element.attributes.keys.should eq ['url']
78
+ expect(element.attributes.keys).to eq ['url']
79
79
  end
80
80
 
81
81
  [:to_s, :to_h, :to_a].each do |conversion|
82
82
  it "preserves the element name through ##{conversion}" do
83
- element.send(conversion).name.should eq 'media:thumbnail'
83
+ expect(element.send(conversion).name).to eq 'media:thumbnail'
84
84
  end
85
85
  end
86
86
 
87
87
  [:to_s, :to_h].each do |conversion|
88
88
  it "preserves attributes through ##{conversion}" do
89
- element.send(conversion).attributes.keys.should eq ['url']
89
+ expect(element.send(conversion).attributes.keys).to eq ['url']
90
90
  end
91
91
  end
92
92
  end
@@ -9,7 +9,7 @@ describe "Saxerator xml format" do
9
9
  end.for_tag(:entry).first
10
10
  end
11
11
 
12
- it { should be_a(Nokogiri::XML::Node) }
12
+ it { is_expected.to be_a(Nokogiri::XML::Node) }
13
13
  it "looks like the original document" do
14
14
  expected_xml = <<-eos
15
15
  <?xml version="1.0"?>
@@ -32,6 +32,6 @@ describe "Saxerator xml format" do
32
32
  </contributor>
33
33
  </entry>
34
34
  eos
35
- entry.to_xml.should == expected_xml
35
+ expect(entry.to_xml).to eq(expected_xml)
36
36
  end
37
37
  end
@@ -16,7 +16,7 @@ describe "Saxerator::FullDocument#all" do
16
16
  end
17
17
 
18
18
  it "should allow you to parse an entire document" do
19
- parser.all.should == {'blurb' => ['one', 'two', 'three'], 'notablurb' => 'four', 'empty' => {} }
19
+ expect(parser.all).to eq 'blurb' => ['one', 'two', 'three'], 'notablurb' => 'four', 'empty' => {}
20
20
  end
21
21
 
22
22
  context "with_put_attributes_in_hash" do
@@ -25,7 +25,7 @@ describe "Saxerator::FullDocument#all" do
25
25
  end
26
26
 
27
27
  it "should allow you to parse an entire document" do
28
- parser.all.should == {'blurb' => ['one', 'two', 'three'], 'notablurb' => 'four', 'empty' => { "with" => "attribute"}}
28
+ expect(parser.all).to eq 'blurb' => ['one', 'two', 'three'], 'notablurb' => 'four', 'empty' => { "with" => "attribute" }
29
29
  end
30
30
  end
31
31
  end
@@ -19,16 +19,16 @@ describe "Saxerator::DSL#at_depth" do
19
19
  end
20
20
 
21
21
  it "should parse elements at the requested tag depth" do
22
- parser.at_depth(2).inject([], :<<).should == [
22
+ expect(parser.at_depth(2).inject([], :<<)).to eq([
23
23
  'How to eat an airplane', 'Leviticus Alabaster',
24
24
  'To wallop a horse in the face', 'Jeanne Clarewood'
25
- ]
25
+ ])
26
26
  end
27
27
 
28
28
  it "should work in combination with #for_tag" do
29
- parser.at_depth(2).for_tag(:name).inject([], :<<).should == [
29
+ expect(parser.at_depth(2).for_tag(:name).inject([], :<<)).to eq([
30
30
  'How to eat an airplane',
31
31
  'To wallop a horse in the face'
32
- ]
32
+ ])
33
33
  end
34
34
  end
@@ -21,16 +21,16 @@ describe "Saxerator::DSL#child_of" do
21
21
  end
22
22
 
23
23
  it "should only parse children of the specified tag" do
24
- parser.child_of(:grandchildren).inject([], :<<).should == [
24
+ expect(parser.child_of(:grandchildren).inject([], :<<)).to eq([
25
25
  'Mildred Marston'
26
- ]
26
+ ])
27
27
  end
28
28
 
29
29
  it "should work in combination with #for_tag" do
30
- parser.for_tag(:name).child_of(:children).inject([], :<<).should == [
30
+ expect(parser.for_tag(:name).child_of(:children).inject([], :<<)).to eq([
31
31
  'Rudy McMannis',
32
32
  'Tom McMannis',
33
33
  'Anne Welsh'
34
- ]
34
+ ])
35
35
  end
36
36
  end
@@ -15,6 +15,6 @@ describe "Saxerator::DSL#for_tag" do
15
15
  end
16
16
 
17
17
  it "should only select the specified tag" do
18
- parser.for_tag(:blurb).inject([], :<<).should == ['one', 'two', 'three']
18
+ expect(parser.for_tag(:blurb).inject([], :<<)).to eq(['one', 'two', 'three'])
19
19
  end
20
20
  end
@@ -14,10 +14,10 @@ describe "Saxerator::DSL#for_tags" do
14
14
  end
15
15
 
16
16
  it "should only select the specified tags" do
17
- parser.for_tags(%w(blurb1 blurb3)).inject([], :<<).should == ['one', 'three']
17
+ expect(parser.for_tags(%w(blurb1 blurb3)).inject([], :<<)).to eq(['one', 'three'])
18
18
  end
19
19
 
20
20
  it "raises an ArgumentError for a non-Array argument" do
21
- lambda { parser.for_tags("asdf") }.should raise_error ArgumentError
21
+ expect { parser.for_tags("asdf") }.to raise_error ArgumentError
22
22
  end
23
23
  end
@@ -16,13 +16,13 @@ describe "Saxerator::DSL#with_attribute" do
16
16
  end
17
17
 
18
18
  it "should match tags with the specified attributes" do
19
- subject.with_attribute(:type).inject([], :<<).should == [
19
+ expect(subject.with_attribute(:type).inject([], :<<)).to eq([
20
20
  'Leviticus Alabaster',
21
21
  'Eunice Diesel'
22
- ]
22
+ ])
23
23
  end
24
24
 
25
25
  it "should match tags with the specified attributes" do
26
- subject.with_attribute(:type, :primary).inject([], :<<).should == ['Leviticus Alabaster']
26
+ expect(subject.with_attribute(:type, :primary).inject([], :<<)).to eq(['Leviticus Alabaster'])
27
27
  end
28
28
  end
@@ -17,16 +17,16 @@ describe "Saxerator::DSL#with_attributes" do
17
17
  end
18
18
 
19
19
  it "matches tags with the exact specified attributes" do
20
- parser.with_attributes(:type => :primary, :ridiculous => 'true').inject([], :<<).should == [
20
+ expect(parser.with_attributes(:type => :primary, :ridiculous => 'true').inject([], :<<)).to eq([
21
21
  'Leviticus Alabaster'
22
- ]
22
+ ])
23
23
  end
24
24
 
25
25
  it "matches tags which have the specified attributes" do
26
- parser.with_attributes(%w(type ridiculous)).inject([], :<<).should == ['Leviticus Alabaster', 'Eunice Diesel']
26
+ expect(parser.with_attributes(%w(type ridiculous)).inject([], :<<)).to eq(['Leviticus Alabaster', 'Eunice Diesel'])
27
27
  end
28
28
 
29
29
  it "raises ArgumentError if you pass something other than a Hash or Array" do
30
- lambda { parser.with_attributes('asdf') }.should raise_error ArgumentError
30
+ expect { parser.with_attributes('asdf') }.to raise_error ArgumentError
31
31
  end
32
32
  end
@@ -16,13 +16,13 @@ describe "Saxerator::DSL#within" do
16
16
  end
17
17
 
18
18
  it "should only parse elements nested within the specified tag" do
19
- parser.within(:article).inject([], :<<).should == [
19
+ expect(parser.within(:article).inject([], :<<)).to eq([
20
20
  'Is our children learning?',
21
21
  'Hazel Nutt'
22
- ]
22
+ ])
23
23
  end
24
24
 
25
25
  it "should work in combination with #for_tag" do
26
- parser.for_tag(:name).within(:article).inject([], :<<).should == ['Is our children learning?']
26
+ expect(parser.for_tag(:name).within(:article).inject([], :<<)).to eq(['Is our children learning?'])
27
27
  end
28
28
  end
@@ -10,14 +10,14 @@ describe Saxerator do
10
10
  let(:xml) { fixture_file('flat_blurbs.xml') }
11
11
 
12
12
  it "should be able to parse it" do
13
- parser.all.should == {'blurb' => ['one', 'two', 'three']}
13
+ expect(parser.all).to eq({'blurb' => ['one', 'two', 'three']})
14
14
  end
15
15
 
16
16
  it "should allow multiple operations on the same parser" do
17
17
  # This exposes a bug where if a File is not reset only the first
18
18
  # Enumerable method works as expected
19
- parser.for_tag(:blurb).first.should == 'one'
20
- parser.for_tag(:blurb).first.should == 'one'
19
+ expect(parser.for_tag(:blurb).first).to eq('one')
20
+ expect(parser.for_tag(:blurb).first).to eq('one')
21
21
  end
22
22
  end
23
23
 
@@ -32,13 +32,13 @@ describe Saxerator do
32
32
  end
33
33
 
34
34
  it "should be able to parse it" do
35
- parser.all.should == { 'name' => 'Illiterates that can read', 'author' => 'Eunice Diesel' }
35
+ expect(parser.all).to eq({ 'name' => 'Illiterates that can read', 'author' => 'Eunice Diesel' })
36
36
  end
37
37
  end
38
38
  end
39
39
 
40
40
  context "configuration" do
41
- let(:xml) { "<foo><bar>baz</bar></foo>" }
41
+ let(:xml) { '<foo><bar foo="bar">baz</bar></foo>' }
42
42
 
43
43
  context "output type" do
44
44
  subject(:parser) do
@@ -47,7 +47,13 @@ describe Saxerator do
47
47
 
48
48
  context "with config.output_type = :hash" do
49
49
  let(:output_type) { :hash }
50
- specify { parser.all.should == {'bar' => 'baz'} }
50
+ specify { expect(parser.all).to eq('bar' => 'baz') }
51
+ end
52
+
53
+ context "with config.output_type = :xml" do
54
+ let(:output_type) { :xml }
55
+ specify { expect(parser.all).to be_a Nokogiri::XML::Document }
56
+ specify { expect(parser.all.to_s).to include '<bar foo="bar">' }
51
57
  end
52
58
 
53
59
  context "with an invalid config.output_type" do
@@ -58,11 +64,20 @@ describe Saxerator do
58
64
 
59
65
  context "symbolize keys" do
60
66
  subject(:parser) do
61
- Saxerator.parser(xml) { |config| config.symbolize_keys! }
67
+ Saxerator.parser(xml) do |config|
68
+ config.symbolize_keys!
69
+ config.output_type = :hash
70
+ end
62
71
  end
63
72
 
64
- specify { parser.all.should == { :bar => 'baz' } }
65
- specify { parser.all.name.should == :foo }
73
+ specify { expect(parser.all).to eq(:bar => 'baz') }
74
+ specify { expect(parser.all.name).to eq(:foo) }
75
+
76
+ it 'will symbolize attributes' do
77
+ parser.for_tag('bar').each do |tag|
78
+ expect(tag.attributes).to include(:foo => 'bar')
79
+ end
80
+ end
66
81
  end
67
82
 
68
83
  context "with ignore namespaces" do
@@ -75,8 +90,8 @@ describe Saxerator do
75
90
  }
76
91
 
77
92
  subject(:parser) do
78
- Saxerator.parser(xml) { |config|
79
- config.ignore_namespaces!
93
+ Saxerator.parser(xml) { |config|
94
+ config.ignore_namespaces!
80
95
  }
81
96
  end
82
97
 
@@ -85,7 +100,7 @@ describe Saxerator do
85
100
  parser.for_tag("bar").each do |tag|
86
101
  bar_count += 1
87
102
  end
88
- bar_count.should == 2
103
+ expect(bar_count).to eq(2)
89
104
  }
90
105
  end
91
106
 
@@ -95,8 +110,8 @@ describe Saxerator do
95
110
  Saxerator.parser(xml) { |config| config.strip_namespaces! }
96
111
  end
97
112
 
98
- specify { parser.all.should == {'bar' => 'baz'} }
99
- specify { parser.all.name.should == 'foo' }
113
+ specify { expect(parser.all).to eq({'bar' => 'baz'}) }
114
+ specify { expect(parser.all.name).to eq('foo') }
100
115
 
101
116
  context "combined with symbolize keys" do
102
117
  subject(:parser) do
@@ -106,7 +121,7 @@ describe Saxerator do
106
121
  end
107
122
  end
108
123
 
109
- specify { parser.all.should == {:bar => 'baz'} }
124
+ specify { expect(parser.all).to eq({:bar => 'baz'}) }
110
125
  end
111
126
 
112
127
  context "for specific namespaces" do
@@ -122,8 +137,8 @@ describe Saxerator do
122
137
  Saxerator.parser(xml) { |config| config.strip_namespaces! :ns1, :ns3 }
123
138
  end
124
139
 
125
- specify { parser.all.should == {'ns2:bar' => 'baz', 'bar' => 'biz'} }
126
- specify { parser.all.name.should == 'foo' }
140
+ specify { expect(parser.all).to eq({'ns2:bar' => 'baz', 'bar' => 'biz'}) }
141
+ specify { expect(parser.all.name).to eq('foo') }
127
142
  end
128
143
  end
129
144
 
@@ -139,24 +154,33 @@ describe Saxerator do
139
154
  end
140
155
 
141
156
  it "should be able to parse it" do
142
- parser.all.should == { 'bar' => 'baz', 'foo' => 'bar' }
157
+ expect(parser.all).to eq({ 'bar' => 'baz', 'foo' => 'bar' })
143
158
  end
144
159
 
145
- end
146
-
147
- context "configuration with put_attributes_in_hash! and config.output_type = :xml" do
148
- let(:xml) { '<foo foo="bar"><bar>baz</bar></foo>' }
160
+ context 'with configured output_type :xml' do
161
+ subject(:parser) do
162
+ Saxerator.parser(xml) do |config|
163
+ config.put_attributes_in_hash!
164
+ config.output_type = :xml
165
+ end
166
+ end
149
167
 
150
- subject(:parser) do
151
- Saxerator.parser(xml) do |config|
152
- config.put_attributes_in_hash!
153
- config.output_type = :xml
168
+ context "should raise error with " do
169
+ specify { expect { parser }.to raise_error(ArgumentError) }
154
170
  end
155
171
  end
156
172
 
157
- context "should raise error with " do
158
- specify { expect { parser }.to raise_error(ArgumentError) }
173
+ context 'with symbolize_keys!' do
174
+ subject(:parser) do
175
+ Saxerator.parser(xml) do |config|
176
+ config.put_attributes_in_hash!
177
+ config.symbolize_keys!
178
+ end
179
+ end
180
+
181
+ it 'will symbolize attribute hash keys' do
182
+ expect(parser.all).to include(:bar => 'baz', :foo => 'bar')
183
+ end
159
184
  end
160
185
  end
161
-
162
186
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saxerator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bradley Schaefer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-13 00:00:00.000000000 Z
11
+ date: 2014-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.4.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.4.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.11.0
33
+ version: '3.1'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.11.0
40
+ version: '3.1'
41
41
  description: |2
42
42
  Saxerator is a streaming xml-to-hash parser designed for working with very large xml files by
43
43
  giving you Enumerable access to manageable chunks of the document.
@@ -47,8 +47,8 @@ executables: []
47
47
  extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
- - .gitignore
51
- - .travis.yml
50
+ - ".gitignore"
51
+ - ".travis.yml"
52
52
  - Gemfile
53
53
  - LICENSE
54
54
  - README.md
@@ -102,12 +102,12 @@ require_paths:
102
102
  - lib
103
103
  required_ruby_version: !ruby/object:Gem::Requirement
104
104
  requirements:
105
- - - '>='
105
+ - - ">="
106
106
  - !ruby/object:Gem::Version
107
107
  version: '0'
108
108
  required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  requirements:
110
- - - '>='
110
+ - - ">="
111
111
  - !ruby/object:Gem::Version
112
112
  version: '0'
113
113
  requirements: []