nokogiri-happymapper 0.6.0 → 0.7.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.
@@ -1,36 +1,35 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
2
 
3
- describe "Attribute Method Conversion" do
3
+ require 'spec_helper'
4
4
 
5
+ describe 'Attribute Method Conversion' do
5
6
  let(:xml_document) do
6
- %{<document>
7
+ %(<document>
7
8
  <link data-src='http://cooking.com/roastbeef' type='recipe'>Roast Beef</link>
8
- </document>}
9
+ </document>)
9
10
  end
10
11
 
11
12
  module AttributeMethodConversion
12
13
  class Document
13
14
  include HappyMapper
14
15
 
15
- has_many :link, String, :attributes => { :'data-src' => String, :type => String, :href => String }
16
-
16
+ has_many :link, String, attributes: { 'data-src': String, type: String, href: String }
17
17
  end
18
18
  end
19
19
 
20
20
  let(:document) do
21
- AttributeMethodConversion::Document.parse(xml_document,single: true)
21
+ AttributeMethodConversion::Document.parse(xml_document, single: true)
22
22
  end
23
23
 
24
- it "link" do
25
- expect(document.link).to eq ["Roast Beef"]
24
+ it 'link' do
25
+ expect(document.link).to eq ['Roast Beef']
26
26
  end
27
27
 
28
- it "link.data_src" do
29
- expect(document.link.first.data_src).to eq "http://cooking.com/roastbeef"
28
+ it 'link.data_src' do
29
+ expect(document.link.first.data_src).to eq 'http://cooking.com/roastbeef'
30
30
  end
31
31
 
32
- it "link.type" do
33
- expect(document.link.first.type).to eq "recipe"
32
+ it 'link.type' do
33
+ expect(document.link.first.type).to eq 'recipe'
34
34
  end
35
-
36
- end
35
+ end
@@ -1,12 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe HappyMapper::Attribute do
4
-
5
- describe "initialization" do
6
+ describe 'initialization' do
6
7
  it 'accepts :default option' do
7
- attr = described_class.new(:foo, String, :default => 'foobar')
8
+ attr = described_class.new(:foo, String, default: 'foobar')
8
9
  expect(attr.default).to eq('foobar')
9
10
  end
10
11
  end
11
-
12
12
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe HappyMapper::Element do
4
- describe "initialization" do
6
+ describe 'initialization' do
5
7
  before do
6
8
  @attr = HappyMapper::Element.new(:foo, String)
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  module Foo
@@ -5,13 +7,12 @@ module Foo
5
7
  end
6
8
 
7
9
  describe HappyMapper::Item do
8
-
9
- describe "new instance" do
10
+ describe 'new instance' do
10
11
  before do
11
- @item = HappyMapper::Item.new(:foo, String, :tag => 'foobar')
12
+ @item = HappyMapper::Item.new(:foo, String, tag: 'foobar')
12
13
  end
13
14
 
14
- it "should accept a name" do
15
+ it 'should accept a name' do
15
16
  expect(@item.name).to eq('foo')
16
17
  end
17
18
 
@@ -23,112 +24,119 @@ describe HappyMapper::Item do
23
24
  expect(@item.tag).to eq('foobar')
24
25
  end
25
26
 
26
- it "should have a method_name" do
27
+ it 'should have a method_name' do
27
28
  expect(@item.method_name).to eq('foo')
28
29
  end
29
30
  end
30
31
 
31
- describe "#constant" do
32
- it "should just use type if constant" do
32
+ describe '#constant' do
33
+ it 'should just use type if constant' do
33
34
  item = HappyMapper::Item.new(:foo, String)
34
35
  expect(item.constant).to eq(String)
35
36
  end
36
37
 
37
- it "should convert string type to constant" do
38
+ it 'should convert string type to constant' do
38
39
  item = HappyMapper::Item.new(:foo, 'String')
39
40
  expect(item.constant).to eq(String)
40
41
  end
41
42
 
42
- it "should convert string with :: to constant" do
43
+ it 'should convert string with :: to constant' do
43
44
  item = HappyMapper::Item.new(:foo, 'Foo::Bar')
44
45
  expect(item.constant).to eq(Foo::Bar)
45
46
  end
46
47
  end
47
48
 
48
- describe "#method_name" do
49
- it "should convert dashes to underscores" do
50
- item = HappyMapper::Item.new(:'foo-bar', String, :tag => 'foobar')
49
+ describe '#method_name' do
50
+ it 'should convert dashes to underscores' do
51
+ item = HappyMapper::Item.new(:'foo-bar', String, tag: 'foobar')
51
52
  expect(item.method_name).to eq('foo_bar')
52
53
  end
53
54
  end
54
55
 
55
- describe "#xpath" do
56
- it "should default to tag" do
57
- item = HappyMapper::Item.new(:foo, String, :tag => 'foobar')
56
+ describe '#xpath' do
57
+ it 'should default to tag' do
58
+ item = HappyMapper::Item.new(:foo, String, tag: 'foobar')
58
59
  expect(item.xpath).to eq('foobar')
59
60
  end
60
61
 
61
- it "should prepend with .// if options[:deep] true" do
62
- item = HappyMapper::Item.new(:foo, String, :tag => 'foobar', :deep => true)
62
+ it 'should prepend with .// if options[:deep] true' do
63
+ item = HappyMapper::Item.new(:foo, String, tag: 'foobar', deep: true)
63
64
  expect(item.xpath).to eq('.//foobar')
64
65
  end
65
66
 
66
- it "should prepend namespace if namespace exists" do
67
- item = HappyMapper::Item.new(:foo, String, :tag => 'foobar')
67
+ it 'should prepend namespace if namespace exists' do
68
+ item = HappyMapper::Item.new(:foo, String, tag: 'foobar')
68
69
  item.namespace = 'v2'
69
70
  expect(item.xpath).to eq('v2:foobar')
70
71
  end
71
72
  end
72
73
 
73
- describe "typecasting" do
74
- it "should work with Strings" do
74
+ describe 'typecasting' do
75
+ it 'should work with Strings' do
75
76
  item = HappyMapper::Item.new(:foo, String)
76
77
  [21, '21'].each do |a|
77
78
  expect(item.typecast(a)).to eq('21')
78
79
  end
79
80
  end
80
81
 
81
- it "should work with Integers" do
82
+ it 'should work with Integers' do
82
83
  item = HappyMapper::Item.new(:foo, Integer)
83
84
  [21, 21.0, '21'].each do |a|
84
85
  expect(item.typecast(a)).to eq(21)
85
86
  end
86
87
  end
87
88
 
88
- it "should work with Floats" do
89
+ it 'should work with Floats' do
89
90
  item = HappyMapper::Item.new(:foo, Float)
90
91
  [21, 21.0, '21'].each do |a|
91
92
  expect(item.typecast(a)).to eq(21.0)
92
93
  end
93
94
  end
94
95
 
95
- it "should work with Times" do
96
+ it 'should work with Times' do
96
97
  item = HappyMapper::Item.new(:foo, Time)
97
98
  expect(item.typecast('2000-01-01 01:01:01.123456')).to eq(Time.local(2000, 1, 1, 1, 1, 1, 123456))
98
99
  end
99
100
 
100
- it "should work with Dates" do
101
+ it 'should work with Dates' do
101
102
  item = HappyMapper::Item.new(:foo, Date)
102
103
  expect(item.typecast('2000-01-01')).to eq(Date.new(2000, 1, 1))
103
104
  end
104
105
 
105
- it "should handle nil Dates" do
106
+ it 'should handle nil Dates' do
106
107
  item = HappyMapper::Item.new(:foo, Date)
107
108
  expect(item.typecast(nil)).to eq(nil)
108
109
  end
109
110
 
110
- it "should handle empty string Dates" do
111
+ it 'should handle empty string Dates' do
111
112
  item = HappyMapper::Item.new(:foo, Date)
112
- expect(item.typecast("")).to eq(nil)
113
+ expect(item.typecast('')).to eq(nil)
113
114
  end
114
115
 
115
- it "should work with DateTimes" do
116
- item = HappyMapper::Item.new(:foo, DateTime)
117
- expect(item.typecast('2000-01-01 00:00:00')).to eq(DateTime.new(2000, 1, 1, 0, 0, 0))
118
- end
116
+ context 'with DateTime' do
117
+ let(:item) { HappyMapper::Item.new(:foo, DateTime) }
119
118
 
120
- it "should handle nil DateTimes" do
121
- item = HappyMapper::Item.new(:foo, DateTime)
122
- expect(item.typecast(nil)).to eq(nil)
123
- end
119
+ it 'works with a string' do
120
+ result = item.typecast('2000-01-01 13:42:37')
121
+ expect(result.to_time).to eq Time.new(2000, 1, 1, 13, 42, 37, '+00:00')
122
+ end
124
123
 
125
- it "should handle empty string DateTimes" do
126
- item = HappyMapper::Item.new(:foo, DateTime)
127
- expect(item.typecast("")).to eq(nil)
128
- end
124
+ it 'works with a historical date in a string' do
125
+ result = item.typecast('1616-04-23')
126
+ expect(result.to_time).to eq Time.new(1616, 4, 23, 0, 0, 0, '+00:00')
127
+ expect(result).to be_gregorian
128
+ end
129
+
130
+ it 'handles nil' do
131
+ expect(item.typecast(nil)).to eq(nil)
132
+ end
129
133
 
134
+ it 'handles empty strings' do
135
+ expect(item.typecast('')).to eq(nil)
136
+ end
137
+ end
130
138
 
131
- it "should work with Boolean" do
139
+ it 'should work with Boolean' do
132
140
  item = HappyMapper::Item.new(:foo, HappyMapper::Boolean)
133
141
  expect(item.typecast('false')).to eq(false)
134
142
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe HappyMapper::Attribute do
4
- describe "initialization" do
6
+ describe 'initialization' do
5
7
  before do
6
8
  @attr = HappyMapper::TextNode.new(:foo, String)
7
9
  end
@@ -1,88 +1,108 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe HappyMapper do
4
-
5
- context ".parse" do
6
-
7
- context "on a single root node" do
8
-
6
+ context '.parse' do
7
+ context 'on a single root node' do
9
8
  subject { described_class.parse fixture_file('address.xml') }
10
9
 
11
- it "should parse child elements" do
12
- expect(subject.street).to eq("Milchstrasse")
13
- expect(subject.housenumber).to eq("23")
14
- expect(subject.postcode).to eq("26131")
15
- expect(subject.city).to eq("Oldenburg")
10
+ it 'should parse child elements' do
11
+ expect(subject.street).to eq('Milchstrasse')
12
+ expect(subject.housenumber).to eq('23')
13
+ expect(subject.postcode).to eq('26131')
14
+ expect(subject.city).to eq('Oldenburg')
16
15
  end
17
16
 
18
- it "should not create a content entry when the xml contents no text content" do
17
+ it 'should not create a content entry when the xml contents no text content' do
19
18
  expect(subject).not_to respond_to :content
20
19
  end
21
20
 
22
- context "child elements with attributes" do
23
-
24
- it "should parse the attributes" do
25
- expect(subject.country.code).to eq("de")
21
+ context 'child elements with attributes' do
22
+ it 'should parse the attributes' do
23
+ expect(subject.country.code).to eq('de')
26
24
  end
27
25
 
28
- it "should parse the content" do
29
- expect(subject.country.content).to eq("Germany")
26
+ it 'should parse the content' do
27
+ expect(subject.country.content).to eq('Germany')
30
28
  end
31
-
32
29
  end
33
-
34
30
  end
35
31
 
36
- context "element names with special characters" do
32
+ context 'element names with special characters' do
37
33
  subject { described_class.parse fixture_file('ambigous_items.xml') }
38
34
 
39
- it "should create accessor methods with similar names" do
35
+ it 'should create accessor methods with similar names' do
40
36
  expect(subject.my_items.item).to be_kind_of Array
41
37
  end
42
38
  end
43
39
 
44
- context "element names with camelCased elements and Capital Letters" do
45
-
40
+ context 'element names with camelCased elements and Capital Letters' do
46
41
  subject { described_class.parse fixture_file('subclass_namespace.xml') }
47
42
 
48
- it "should parse the elements and values correctly" do
49
- expect(subject.title).to eq("article title")
50
- expect(subject.photo.publish_options.author).to eq("Stephanie")
51
- expect(subject.gallery.photo.title).to eq("photo title")
43
+ it 'parses camel-cased child elements correctly' do
44
+ expect(subject.photo.publish_options.author).to eq('Stephanie')
45
+ expect(subject.gallery.photo.title).to eq('photo title')
46
+ end
47
+
48
+ it 'parses camel-cased child properties correctly' do
49
+ expect(subject.publish_options.created_day).to eq('2011-01-14')
52
50
  end
53
51
  end
54
52
 
55
- context "several elements nested deep" do
56
- subject { described_class.parse fixture_file('ambigous_items.xml') }
53
+ context 'with elements with camelCased attribute names' do
54
+ subject { described_class.parse '<foo barBaz="quuz"/>' }
57
55
 
58
- it "should parse the entire relationship" do
59
- expect(subject.my_items.item.first.item.name).to eq("My first internal item")
56
+ it 'parses attributes correctly' do
57
+ expect(subject.bar_baz).to eq('quuz')
60
58
  end
61
59
  end
62
60
 
63
- context "xml that contains multiple entries" do
61
+ context 'several elements nested deep' do
62
+ subject { described_class.parse fixture_file('ambigous_items.xml') }
63
+
64
+ it 'should parse the entire relationship' do
65
+ expect(subject.my_items.item.first.item.name).to eq('My first internal item')
66
+ end
67
+ end
64
68
 
69
+ context 'xml that contains multiple entries' do
65
70
  subject { described_class.parse fixture_file('multiple_primitives.xml') }
66
71
 
67
72
  it "should parse the elements as it would a 'has_many'" do
73
+ expect(subject.name).to eq('value')
74
+ expect(subject.image).to eq(%w(image1 image2))
75
+ end
76
+ end
68
77
 
69
- expect(subject.name).to eq("value")
70
- expect(subject.image).to eq([ "image1", "image2" ])
78
+ context 'xml with multiple namespaces' do
79
+ subject { described_class.parse fixture_file('subclass_namespace.xml') }
71
80
 
81
+ it 'should parse the elements an values correctly' do
82
+ expect(subject.title).to eq('article title')
72
83
  end
73
84
 
85
+ it 'parses attribute names correctly' do
86
+ expect(subject.name).to eq 'title'
87
+ end
74
88
  end
75
89
 
76
- context "xml with multiple namespaces" do
77
-
78
- subject { described_class.parse fixture_file('subclass_namespace.xml') }
90
+ context 'with value elements with different namespace' do
91
+ let(:xml) do
92
+ <<~XML
93
+ <a:foo xmlns:a="http://foo.org/a" xmlns:b="http://foo.org/b">
94
+ <b:bar>Hello</b:bar>
95
+ </a:foo>
96
+ XML
97
+ end
98
+ let(:result) { described_class.parse xml }
79
99
 
80
- it "should parse the elements an values correctly" do
81
- expect(subject.title).to eq("article title")
100
+ it 'parses the value elements correctly' do
101
+ expect(result.bar).to eq 'Hello'
82
102
  end
83
103
  end
84
104
 
85
- context "after_parse callbacks" do
105
+ context 'after_parse callbacks' do
86
106
  module AfterParseSpec
87
107
  class Address
88
108
  include HappyMapper
@@ -94,7 +114,7 @@ describe HappyMapper do
94
114
  AfterParseSpec::Address.after_parse_callbacks.clear
95
115
  end
96
116
 
97
- it "should callback with the newly created object" do
117
+ it 'should callback with the newly created object' do
98
118
  from_cb = nil
99
119
  called = false
100
120
  cb1 = proc { |object| from_cb = object }
@@ -107,7 +127,5 @@ describe HappyMapper do
107
127
  expect(called).to eq(true)
108
128
  end
109
129
  end
110
-
111
130
  end
112
-
113
- end
131
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'uri'
3
5
 
@@ -39,13 +41,12 @@ module Analytics
39
41
 
40
42
  tag 'entry'
41
43
  element :title, String
42
- element :tableId, String, :namespace => 'dxp'
44
+ element :tableId, String, namespace: 'dxp'
43
45
 
44
46
  has_many :properties, Property
45
47
  has_many :goals, Goal
46
48
  end
47
49
 
48
-
49
50
  class Entry
50
51
  include HappyMapper
51
52
 
@@ -53,7 +54,7 @@ module Analytics
53
54
  element :id, String
54
55
  element :updated, DateTime
55
56
  element :title, String
56
- element :table_id, String, :namespace => 'dxp', :tag => 'tableId'
57
+ element :table_id, String, namespace: 'dxp', tag: 'tableId'
57
58
  has_many :properties, Property
58
59
  end
59
60
 
@@ -73,15 +74,15 @@ module Atom
73
74
  include HappyMapper
74
75
  tag 'feed'
75
76
 
76
- attribute :xmlns, String, :single => true
77
- element :id, String, :single => true
78
- element :title, String, :single => true
79
- element :updated, DateTime, :single => true
80
- element :link, String, :single => false, :attributes => {
81
- :rel => String,
82
- :type => String,
83
- :href => String
84
- }
77
+ attribute :xmlns, String, single: true
78
+ element :id, String, single: true
79
+ element :title, String, single: true
80
+ element :updated, DateTime, single: true
81
+ element :link, String, single: false, attributes: {
82
+ rel: String,
83
+ type: String,
84
+ href: String
85
+ }
85
86
  # has_many :entries, Entry # nothing interesting in the entries
86
87
  end
87
88
  end
@@ -93,7 +94,6 @@ class Country
93
94
  content :name, String
94
95
  end
95
96
 
96
-
97
97
  class State
98
98
  include HappyMapper
99
99
  end
@@ -115,7 +115,7 @@ end
115
115
 
116
116
  class Feature
117
117
  include HappyMapper
118
- element :name, String, :xpath => './/text()'
118
+ element :name, String, xpath: './/text()'
119
119
  end
120
120
 
121
121
  class FeatureBullet
@@ -143,7 +143,7 @@ module FamilySearch
143
143
  include HappyMapper
144
144
 
145
145
  tag 'alternateIds'
146
- has_many :ids, String, :tag => 'id'
146
+ has_many :ids, String, tag: 'id'
147
147
  end
148
148
 
149
149
  class Information
@@ -171,8 +171,8 @@ module FamilySearch
171
171
 
172
172
  tag 'familytree'
173
173
  attribute :version, String
174
- attribute :status_message, String, :tag => 'statusMessage'
175
- attribute :status_code, String, :tag => 'statusCode'
174
+ attribute :status_message, String, tag: 'statusMessage'
175
+ attribute :status_code, String, tag: 'statusCode'
176
176
  has_one :persons, Persons
177
177
  end
178
178
  end
@@ -183,11 +183,11 @@ module FedEx
183
183
 
184
184
  tag 'Address'
185
185
  namespace 'v2'
186
- element :city, String, :tag => 'City'
187
- element :state, String, :tag => 'StateOrProvinceCode'
188
- element :zip, String, :tag => 'PostalCode'
189
- element :countrycode, String, :tag => 'CountryCode'
190
- element :residential, Boolean, :tag => 'Residential'
186
+ element :city, String, tag: 'City'
187
+ element :state, String, tag: 'StateOrProvinceCode'
188
+ element :zip, String, tag: 'PostalCode'
189
+ element :countrycode, String, tag: 'CountryCode'
190
+ element :residential, Boolean, tag: 'Residential'
191
191
  end
192
192
 
193
193
  class Event
@@ -195,9 +195,9 @@ module FedEx
195
195
 
196
196
  tag 'Events'
197
197
  namespace 'v2'
198
- element :timestamp, String, :tag => 'Timestamp'
199
- element :eventtype, String, :tag => 'EventType'
200
- element :eventdescription, String, :tag => 'EventDescription'
198
+ element :timestamp, String, tag: 'Timestamp'
199
+ element :eventtype, String, tag: 'EventType'
200
+ element :eventdescription, String, tag: 'EventDescription'
201
201
  has_one :address, Address
202
202
  end
203
203
 
@@ -206,8 +206,8 @@ module FedEx
206
206
 
207
207
  tag 'PackageWeight'
208
208
  namespace 'v2'
209
- element :units, String, :tag => 'Units'
210
- element :value, Integer, :tag => 'Value'
209
+ element :units, String, tag: 'Units'
210
+ element :value, Integer, tag: 'Value'
211
211
  end
212
212
 
213
213
  class TrackDetails
@@ -215,13 +215,13 @@ module FedEx
215
215
 
216
216
  tag 'TrackDetails'
217
217
  namespace 'v2'
218
- element :tracking_number, String, :tag => 'TrackingNumber'
219
- element :status_code, String, :tag => 'StatusCode'
220
- element :status_desc, String, :tag => 'StatusDescription'
221
- element :carrier_code, String, :tag => 'CarrierCode'
222
- element :service_info, String, :tag => 'ServiceInfo'
223
- has_one :weight, PackageWeight, :tag => 'PackageWeight'
224
- element :est_delivery, String, :tag => 'EstimatedDeliveryTimestamp'
218
+ element :tracking_number, String, tag: 'TrackingNumber'
219
+ element :status_code, String, tag: 'StatusCode'
220
+ element :status_desc, String, tag: 'StatusDescription'
221
+ element :carrier_code, String, tag: 'CarrierCode'
222
+ element :service_info, String, tag: 'ServiceInfo'
223
+ has_one :weight, PackageWeight, tag: 'PackageWeight'
224
+ element :est_delivery, String, tag: 'EstimatedDeliveryTimestamp'
225
225
  has_many :events, Event
226
226
  end
227
227
 
@@ -230,11 +230,11 @@ module FedEx
230
230
 
231
231
  tag 'Notifications'
232
232
  namespace 'v2'
233
- element :severity, String, :tag => 'Severity'
234
- element :source, String, :tag => 'Source'
235
- element :code, Integer, :tag => 'Code'
236
- element :message, String, :tag => 'Message'
237
- element :localized_message, String, :tag => 'LocalizedMessage'
233
+ element :severity, String, tag: 'Severity'
234
+ element :source, String, tag: 'Source'
235
+ element :code, Integer, tag: 'Code'
236
+ element :message, String, tag: 'Message'
237
+ element :localized_message, String, tag: 'LocalizedMessage'
238
238
  end
239
239
 
240
240
  class TransactionDetail
@@ -242,7 +242,7 @@ module FedEx
242
242
 
243
243
  tag 'TransactionDetail'
244
244
  namespace 'v2'
245
- element :cust_tran_id, String, :tag => 'CustomerTransactionId'
245
+ element :cust_tran_id, String, tag: 'CustomerTransactionId'
246
246
  end
247
247
 
248
248
  class TrackReply
@@ -250,11 +250,11 @@ module FedEx
250
250
 
251
251
  tag 'TrackReply'
252
252
  namespace 'v2'
253
- element :highest_severity, String, :tag => 'HighestSeverity'
254
- element :more_data, Boolean, :tag => 'MoreData'
255
- has_many :notifications, Notification, :tag => 'Notifications'
256
- has_many :trackdetails, TrackDetails, :tag => 'TrackDetails'
257
- has_one :tran_detail, TransactionDetail, :tab => 'TransactionDetail'
253
+ element :highest_severity, String, tag: 'HighestSeverity'
254
+ element :more_data, Boolean, tag: 'MoreData'
255
+ has_many :notifications, Notification, tag: 'Notifications'
256
+ has_many :trackdetails, TrackDetails, tag: 'TrackDetails'
257
+ has_one :tran_detail, TransactionDetail, tab: 'TransactionDetail'
258
258
  end
259
259
  end
260
260
 
@@ -265,7 +265,7 @@ end
265
265
 
266
266
  class Radar
267
267
  include HappyMapper
268
- has_many :places, Place, :tag => :place
268
+ has_many :places, Place, tag: :place
269
269
  end
270
270
 
271
271
  class Post
@@ -297,7 +297,7 @@ end
297
297
  class Status
298
298
  include HappyMapper
299
299
 
300
- register_namespace 'fake', "faka:namespace"
300
+ register_namespace 'fake', 'faka:namespace'
301
301
 
302
302
  element :id, Integer
303
303
  element :text, String
@@ -307,7 +307,7 @@ class Status
307
307
  element :in_reply_to_status_id, Integer
308
308
  element :in_reply_to_user_id, Integer
309
309
  element :favorited, Boolean
310
- element :non_existent, String, :tag => 'dummy', :namespace => 'fake'
310
+ element :non_existent, String, tag: 'dummy', namespace: 'fake'
311
311
  has_one :user, User
312
312
  end
313
313
 
@@ -316,9 +316,9 @@ class CurrentWeather
316
316
 
317
317
  tag 'ob'
318
318
  namespace 'aws'
319
- element :temperature, Integer, :tag => 'temp'
320
- element :feels_like, Integer, :tag => 'feels-like'
321
- element :current_condition, String, :tag => 'current-condition', :attributes => {:icon => String}
319
+ element :temperature, Integer, tag: 'temp'
320
+ element :feels_like, Integer, tag: 'feels-like'
321
+ element :current_condition, String, tag: 'current-condition', attributes: { icon: String }
322
322
  end
323
323
 
324
324
  # for type coercion
@@ -329,19 +329,19 @@ module PITA
329
329
  include HappyMapper
330
330
 
331
331
  tag 'Item' # if you put class in module you need tag
332
- element :asin, String, :tag => 'ASIN'
333
- element :detail_page_url, URI, :tag => 'DetailPageURL', :parser => :parse
334
- element :manufacturer, String, :tag => 'Manufacturer', :deep => true
335
- element :point, String, :tag => 'point', :namespace => 'georss'
336
- element :product_group, ProductGroup, :tag => 'ProductGroup', :deep => true, :parser => :new, :raw => true
332
+ element :asin, String, tag: 'ASIN'
333
+ element :detail_page_url, URI, tag: 'DetailPageURL', parser: :parse
334
+ element :manufacturer, String, tag: 'Manufacturer', deep: true
335
+ element :point, String, tag: 'point', namespace: 'georss'
336
+ element :product_group, ProductGroup, tag: 'ProductGroup', deep: true, parser: :new, raw: true
337
337
  end
338
338
 
339
339
  class Items
340
340
  include HappyMapper
341
341
 
342
342
  tag 'Items' # if you put class in module you need tag
343
- element :total_results, Integer, :tag => 'TotalResults'
344
- element :total_pages, Integer, :tag => 'TotalPages'
343
+ element :total_results, Integer, tag: 'TotalResults'
344
+ element :total_pages, Integer, tag: 'TotalPages'
345
345
  has_many :items, Item
346
346
  end
347
347
  end
@@ -350,7 +350,7 @@ module GitHub
350
350
  class Commit
351
351
  include HappyMapper
352
352
 
353
- tag "commit"
353
+ tag 'commit'
354
354
  element :url, String
355
355
  element :tree, String
356
356
  element :message, String
@@ -382,10 +382,10 @@ module QuarterTest
382
382
  # to be used for all these differently named elements is the next
383
383
  # best thing
384
384
  has_one :details, QuarterTest::Details
385
- has_one :q1, QuarterTest::Quarter, :tag => 'q1'
386
- has_one :q2, QuarterTest::Quarter, :tag => 'q2'
387
- has_one :q3, QuarterTest::Quarter, :tag => 'q3'
388
- has_one :q4, QuarterTest::Quarter, :tag => 'q4'
385
+ has_one :q1, QuarterTest::Quarter, tag: 'q1'
386
+ has_one :q2, QuarterTest::Quarter, tag: 'q2'
387
+ has_one :q3, QuarterTest::Quarter, tag: 'q3'
388
+ has_one :q4, QuarterTest::Quarter, tag: 'q4'
389
389
  end
390
390
  end
391
391
 
@@ -394,7 +394,7 @@ class Artist
394
394
  include HappyMapper
395
395
 
396
396
  tag 'artist'
397
- element :images, String, :tag => "image", :single => false
397
+ element :images, String, tag: 'image', single: false
398
398
  element :name, String
399
399
  end
400
400
 
@@ -402,8 +402,8 @@ class Location
402
402
  include HappyMapper
403
403
 
404
404
  tag 'point'
405
- namespace "geo"
406
- element :latitude, String, :tag => "lat"
405
+ namespace 'geo'
406
+ element :latitude, String, tag: 'lat'
407
407
  end
408
408
 
409
409
  # Testing the XmlContent type
@@ -414,7 +414,7 @@ module Dictionary
414
414
  has_xml_content
415
415
 
416
416
  def to_html
417
- xml_content.gsub('<tag>','<em>').gsub('</tag>','</em>')
417
+ xml_content.gsub('<tag>', '<em>').gsub('</tag>', '</em>')
418
418
  end
419
419
  end
420
420
 
@@ -422,7 +422,7 @@ module Dictionary
422
422
  include HappyMapper
423
423
 
424
424
  tag 'def'
425
- element :text, XmlContent, :tag => 'dtext'
425
+ element :text, XmlContent, tag: 'dtext'
426
426
  end
427
427
 
428
428
  class Record
@@ -430,7 +430,7 @@ module Dictionary
430
430
 
431
431
  tag 'record'
432
432
  has_many :definitions, Definition
433
- has_many :variants, Variant, :tag => 'var'
433
+ has_many :variants, Variant, tag: 'var'
434
434
  end
435
435
  end
436
436
 
@@ -449,16 +449,15 @@ class PublishOptions
449
449
 
450
450
  tag 'publishOptions'
451
451
 
452
- element :author, String, :tag => 'author'
453
-
454
- element :draft, Boolean, :tag => 'draft'
455
- element :scheduled_day, String, :tag => 'scheduledDay'
456
- element :scheduled_time, String, :tag => 'scheduledTime'
457
- element :published_day, String, :tag => 'publishDisplayDay'
458
- element :published_time, String, :tag => 'publishDisplayTime'
459
- element :created_day, String, :tag => 'publishDisplayDay'
460
- element :created_time, String, :tag => 'publishDisplayTime'
452
+ element :author, String, tag: 'author'
461
453
 
454
+ element :draft, Boolean, tag: 'draft'
455
+ element :scheduled_day, String, tag: 'scheduledDay'
456
+ element :scheduled_time, String, tag: 'scheduledTime'
457
+ element :published_day, String, tag: 'publishDisplayDay'
458
+ element :published_time, String, tag: 'publishDisplayTime'
459
+ element :created_day, String, tag: 'publishDisplayDay'
460
+ element :created_time, String, tag: 'publishDisplayTime'
462
461
  end
463
462
 
464
463
  class Article
@@ -471,11 +470,10 @@ class Article
471
470
 
472
471
  element :title, String
473
472
  element :text, String
474
- has_many :photos, 'Photo', :tag => 'Photo', :namespace => 'photo', :xpath => '/article:Article'
475
- has_many :galleries, 'Gallery', :tag => 'Gallery', :namespace => 'gallery'
476
-
477
- element :publish_options, PublishOptions, :tag => 'publishOptions', :namespace => 'article'
473
+ has_many :photos, 'Photo', tag: 'Photo', namespace: 'photo', xpath: '/article:Article'
474
+ has_many :galleries, 'Gallery', tag: 'Gallery', namespace: 'gallery'
478
475
 
476
+ element :publish_options, PublishOptions, tag: 'publishOptions', namespace: 'article'
479
477
  end
480
478
 
481
479
  class PartiallyBadArticle
@@ -488,11 +486,10 @@ class PartiallyBadArticle
488
486
 
489
487
  element :title, String
490
488
  element :text, String
491
- has_many :photos, 'Photo', :tag => 'Photo', :namespace => 'photo', :xpath => '/article:Article'
492
- has_many :videos, 'Video', :tag => 'Video', :namespace => 'video'
493
-
494
- element :publish_options, PublishOptions, :tag => 'publishOptions', :namespace => 'article'
489
+ has_many :photos, 'Photo', tag: 'Photo', namespace: 'photo', xpath: '/article:Article'
490
+ has_many :videos, 'Video', tag: 'Video', namespace: 'video'
495
491
 
492
+ element :publish_options, PublishOptions, tag: 'publishOptions', namespace: 'article'
496
493
  end
497
494
 
498
495
  class Photo
@@ -504,8 +501,7 @@ class Photo
504
501
  attr_writer :xml_value
505
502
 
506
503
  element :title, String
507
- element :publish_options, PublishOptions, :tag => 'publishOptions', :namespace => 'photo'
508
-
504
+ element :publish_options, PublishOptions, tag: 'publishOptions', namespace: 'photo'
509
505
  end
510
506
 
511
507
  class Gallery
@@ -517,7 +513,6 @@ class Gallery
517
513
  attr_writer :xml_value
518
514
 
519
515
  element :title, String
520
-
521
516
  end
522
517
 
523
518
  class Video
@@ -529,8 +524,7 @@ class Video
529
524
  attr_writer :xml_value
530
525
 
531
526
  element :title, String
532
- element :publish_options, PublishOptions, :tag => 'publishOptions', :namespace => 'video'
533
-
527
+ element :publish_options, PublishOptions, tag: 'publishOptions', namespace: 'video'
534
528
  end
535
529
 
536
530
  class OptionalAttribute
@@ -543,78 +537,73 @@ end
543
537
  class DefaultNamespaceCombi
544
538
  include HappyMapper
545
539
 
546
-
547
- register_namespace 'bk', "urn:loc.gov:books"
548
- register_namespace 'isbn', "urn:ISBN:0-395-36341-6"
549
- register_namespace 'p', "urn:loc.gov:people"
540
+ register_namespace 'bk', 'urn:loc.gov:books'
541
+ register_namespace 'isbn', 'urn:ISBN:0-395-36341-6'
542
+ register_namespace 'p', 'urn:loc.gov:people'
550
543
  namespace 'bk'
551
544
 
552
545
  tag 'book'
553
546
 
554
- element :title, String, :namespace => 'bk', :tag => "title"
555
- element :number, String, :namespace => 'isbn', :tag => "number"
556
- element :author, String, :namespace => 'p', :tag => "author"
547
+ element :title, String, namespace: 'bk', tag: 'title'
548
+ element :number, String, namespace: 'isbn', tag: 'number'
549
+ element :author, String, namespace: 'p', tag: 'author'
557
550
  end
558
551
 
559
552
  describe HappyMapper do
560
-
561
- describe "being included into another class" do
553
+ describe 'being included into another class' do
562
554
  before do
563
555
  @klass = Class.new do
564
556
  include HappyMapper
565
557
 
566
- def self.to_s
558
+ def self.name
567
559
  'Boo'
568
560
  end
569
561
  end
570
562
  end
571
563
 
572
- class Boo; include HappyMapper end
573
-
574
- it "should set attributes to an array" do
564
+ it 'should set attributes to an array' do
575
565
  expect(@klass.attributes).to eq([])
576
566
  end
577
567
 
578
- it "should set @elements to a hash" do
568
+ it 'should set @elements to a hash' do
579
569
  expect(@klass.elements).to eq([])
580
570
  end
581
571
 
582
- it "should allow adding an attribute" do
583
- expect {
572
+ it 'should allow adding an attribute' do
573
+ expect do
584
574
  @klass.attribute :name, String
585
- }.to change(@klass, :attributes)
575
+ end.to change(@klass, :attributes)
586
576
  end
587
577
 
588
- it "should allow adding an attribute containing a dash" do
589
- expect {
578
+ it 'should allow adding an attribute containing a dash' do
579
+ expect do
590
580
  @klass.attribute :'bar-baz', String
591
- }.to change(@klass, :attributes)
581
+ end.to change(@klass, :attributes)
592
582
  end
593
583
 
594
- it "should be able to get all attributes in array" do
584
+ it 'should be able to get all attributes in array' do
595
585
  @klass.attribute :name, String
596
586
  expect(@klass.attributes.size).to eq(1)
597
587
  end
598
588
 
599
- it "should allow adding an element" do
600
- expect {
589
+ it 'should allow adding an element' do
590
+ expect do
601
591
  @klass.element :name, String
602
- }.to change(@klass, :elements)
592
+ end.to change(@klass, :elements)
603
593
  end
604
594
 
605
- it "should allow adding an element containing a dash" do
606
- expect {
595
+ it 'should allow adding an element containing a dash' do
596
+ expect do
607
597
  @klass.element :'bar-baz', String
608
- }.to change(@klass, :elements)
609
-
598
+ end.to change(@klass, :elements)
610
599
  end
611
600
 
612
- it "should be able to get all elements in array" do
601
+ it 'should be able to get all elements in array' do
613
602
  @klass.element(:name, String)
614
603
  expect(@klass.elements.size).to eq(1)
615
604
  end
616
605
 
617
- it "should allow has one association" do
606
+ it 'should allow has one association' do
618
607
  @klass.has_one(:user, User)
619
608
  element = @klass.elements.first
620
609
  expect(element.name).to eq('user')
@@ -622,7 +611,7 @@ describe HappyMapper do
622
611
  expect(element.options[:single]).to eq(true)
623
612
  end
624
613
 
625
- it "should allow has many association" do
614
+ it 'should allow has many association' do
626
615
  @klass.has_many(:users, User)
627
616
  element = @klass.elements.first
628
617
  expect(element.name).to eq('users')
@@ -630,62 +619,67 @@ describe HappyMapper do
630
619
  expect(element.options[:single]).to eq(false)
631
620
  end
632
621
 
633
- it "should default tag name to lowercase class" do
622
+ it 'should default tag name to lowercase class' do
634
623
  expect(@klass.tag_name).to eq('boo')
635
624
  end
636
625
 
637
- it "should default tag name of class in modules to the last constant lowercase" do
626
+ it 'generates no tag name for anonymous class' do
627
+ @anon = Class.new { include HappyMapper }
628
+ expect(@anon.tag_name).to be_nil
629
+ end
630
+
631
+ it 'should default tag name of class in modules to the last constant lowercase' do
638
632
  module Bar; class Baz; include HappyMapper; end; end
639
633
  expect(Bar::Baz.tag_name).to eq('baz')
640
634
  end
641
635
 
642
- it "should allow setting tag name" do
636
+ it 'should allow setting tag name' do
643
637
  @klass.tag('FooBar')
644
638
  expect(@klass.tag_name).to eq('FooBar')
645
639
  end
646
640
 
647
- it "should allow setting a namespace" do
648
- @klass.namespace(namespace = "boo")
641
+ it 'should allow setting a namespace' do
642
+ @klass.namespace(namespace = 'boo')
649
643
  expect(@klass.namespace).to eq(namespace)
650
644
  end
651
645
 
652
- it "should provide #parse" do
646
+ it 'should provide #parse' do
653
647
  expect(@klass).to respond_to(:parse)
654
648
  end
655
649
  end
656
650
 
657
- describe "#attributes" do
658
- it "should only return attributes for the current class" do
651
+ describe '#attributes' do
652
+ it 'should only return attributes for the current class' do
659
653
  expect(Post.attributes.size).to eq(7)
660
654
  expect(Status.attributes.size).to eq(0)
661
655
  end
662
656
  end
663
657
 
664
- describe "#elements" do
665
- it "should only return elements for the current class" do
658
+ describe '#elements' do
659
+ it 'should only return elements for the current class' do
666
660
  expect(Post.elements.size).to eq(0)
667
661
  expect(Status.elements.size).to eq(10)
668
662
  end
669
663
  end
670
664
 
671
- describe "#content" do
672
- it "should take String as default argument for type" do
673
- State.content :name
674
- address = Address.parse(fixture_file('address.xml'))
675
- expect(address.state.name).to eq("Lower Saxony")
676
- address.state.name.class == String
677
- end
665
+ describe '#content' do
666
+ it 'should take String as default argument for type' do
667
+ State.content :name
668
+ address = Address.parse(fixture_file('address.xml'))
669
+ expect(address.state.name).to eq('Lower Saxony')
670
+ address.state.name.class == String
671
+ end
678
672
 
679
- it "should work when specific type is provided" do
680
- Rate.content :value, Float
681
- Product.has_one :rate, Rate
682
- product = Product.parse(fixture_file('product_default_namespace.xml'), :single => true)
683
- expect(product.rate.value).to eq(120.25)
684
- product.rate.class == Float
685
- end
673
+ it 'should work when specific type is provided' do
674
+ Rate.content :value, Float
675
+ Product.has_one :rate, Rate
676
+ product = Product.parse(fixture_file('product_default_namespace.xml'), single: true)
677
+ expect(product.rate.value).to eq(120.25)
678
+ product.rate.class == Float
679
+ end
686
680
  end
687
681
 
688
- it "should parse xml attributes into ruby objects" do
682
+ it 'should parse xml attributes into ruby objects' do
689
683
  posts = Post.parse(fixture_file('posts.xml'))
690
684
  expect(posts.size).to eq(20)
691
685
  first = posts.first
@@ -695,10 +689,15 @@ describe HappyMapper do
695
689
  expect(first.tag).to eq('ruby xml gems mapping')
696
690
  expect(first.time).to eq(Time.utc(2008, 8, 9, 5, 24, 20))
697
691
  expect(first.others).to eq(56)
698
- expect(first.extended).to eq('ROXML is a Ruby library designed to make it easier for Ruby developers to work with XML. Using simple annotations, it enables Ruby classes to be custom-mapped to XML. ROXML takes care of the marshalling and unmarshalling of mapped attributes so that developers can focus on building first-class Ruby classes.')
692
+ expect(first.extended).
693
+ to eq('ROXML is a Ruby library designed to make it easier for Ruby' \
694
+ ' developers to work with XML. Using simple annotations, it enables' \
695
+ ' Ruby classes to be custom-mapped to XML. ROXML takes care of the' \
696
+ ' marshalling and unmarshalling of mapped attributes so that developers can' \
697
+ ' focus on building first-class Ruby classes.')
699
698
  end
700
699
 
701
- it "should parse xml elements to ruby objcts" do
700
+ it 'should parse xml elements to ruby objcts' do
702
701
  statuses = Status.parse(fixture_file('statuses.xml'))
703
702
  expect(statuses.size).to eq(20)
704
703
  first = statuses.first
@@ -714,14 +713,15 @@ describe HappyMapper do
714
713
  expect(first.user.screen_name).to eq('jnunemaker')
715
714
  expect(first.user.location).to eq('Mishawaka, IN, US')
716
715
  expect(first.user.description).to eq('Loves his wife, ruby, notre dame football and iu basketball')
717
- expect(first.user.profile_image_url).to eq('http://s3.amazonaws.com/twitter_production/profile_images/53781608/Photo_75_normal.jpg')
716
+ expect(first.user.profile_image_url).
717
+ to eq('http://s3.amazonaws.com/twitter_production/profile_images/53781608/Photo_75_normal.jpg')
718
718
  expect(first.user.url).to eq('http://addictedtonew.com')
719
719
  expect(first.user.protected).to be_falsey
720
720
  expect(first.user.followers_count).to eq(486)
721
721
  end
722
722
 
723
- it "should parse xml containing the desired element as root node" do
724
- address = Address.parse(fixture_file('address.xml'), :single => true)
723
+ it 'should parse xml containing the desired element as root node' do
724
+ address = Address.parse(fixture_file('address.xml'), single: true)
725
725
  expect(address.street).to eq('Milchstrasse')
726
726
  expect(address.postcode).to eq('26131')
727
727
  expect(address.housenumber).to eq('23')
@@ -729,21 +729,21 @@ describe HappyMapper do
729
729
  expect(address.country.class).to eq(Country)
730
730
  end
731
731
 
732
- it "should parse text node correctly" do
733
- address = Address.parse(fixture_file('address.xml'), :single => true)
732
+ it 'should parse text node correctly' do
733
+ address = Address.parse(fixture_file('address.xml'), single: true)
734
734
  expect(address.country.name).to eq('Germany')
735
735
  expect(address.country.code).to eq('de')
736
736
  end
737
737
 
738
- it "should treat Nokogiri::XML::Document as root" do
738
+ it 'should treat Nokogiri::XML::Document as root' do
739
739
  doc = Nokogiri::XML(fixture_file('address.xml'))
740
740
  address = Address.parse(doc)
741
741
  expect(address.class).to eq(Address)
742
742
  end
743
743
 
744
- it "should parse xml with default namespace (amazon)" do
744
+ it 'should parse xml with default namespace (amazon)' do
745
745
  file_contents = fixture_file('pita.xml')
746
- items = PITA::Items.parse(file_contents, :single => true)
746
+ items = PITA::Items.parse(file_contents, single: true)
747
747
  expect(items.total_results).to eq(22)
748
748
  expect(items.total_pages).to eq(3)
749
749
  first = items.items[0]
@@ -758,7 +758,7 @@ describe HappyMapper do
758
758
  expect(second.manufacturer).to eq('Wrox')
759
759
  end
760
760
 
761
- it "should parse xml that has attributes of elements" do
761
+ it 'should parse xml that has attributes of elements' do
762
762
  items = CurrentWeather.parse(fixture_file('current_weather.xml'))
763
763
  first = items[0]
764
764
  expect(first.temperature).to eq(51)
@@ -773,22 +773,22 @@ describe HappyMapper do
773
773
  expect(feed.link.last.href).to eq('http://www.example.com/tv_shows.atom')
774
774
  end
775
775
 
776
- it "parses xml with optional elements with embedded attributes" do
777
- expect { CurrentWeather.parse(fixture_file('current_weather_missing_elements.xml')) }.to_not raise_error()
776
+ it 'parses xml with optional elements with embedded attributes' do
777
+ expect { CurrentWeather.parse(fixture_file('current_weather_missing_elements.xml')) }.to_not raise_error
778
778
  end
779
779
 
780
- it "returns nil rather than empty array for absent values when :single => true" do
781
- address = Address.parse('<?xml version="1.0" encoding="UTF-8"?><foo/>', :single => true)
780
+ it 'returns nil rather than empty array for absent values when :single => true' do
781
+ address = Address.parse('<?xml version="1.0" encoding="UTF-8"?><foo/>', single: true)
782
782
  expect(address).to be_nil
783
783
  end
784
784
 
785
- it "should return same result for absent values when :single => true, regardless of :in_groups_of" do
786
- addr1 = Address.parse('<?xml version="1.0" encoding="UTF-8"?><foo/>', :single => true)
787
- addr2 = Address.parse('<?xml version="1.0" encoding="UTF-8"?><foo/>', :single => true, :in_groups_of => 10)
785
+ it 'should return same result for absent values when :single => true, regardless of :in_groups_of' do
786
+ addr1 = Address.parse('<?xml version="1.0" encoding="UTF-8"?><foo/>', single: true)
787
+ addr2 = Address.parse('<?xml version="1.0" encoding="UTF-8"?><foo/>', single: true, in_groups_of: 10)
788
788
  expect(addr1).to eq(addr2)
789
789
  end
790
790
 
791
- it "should parse xml with nested elements" do
791
+ it 'should parse xml with nested elements' do
792
792
  radars = Radar.parse(fixture_file('radar.xml'))
793
793
  first = radars[0]
794
794
  expect(first.places.size).to eq(1)
@@ -801,49 +801,49 @@ describe HappyMapper do
801
801
  expect(third.places[1].name).to eq('Home')
802
802
  end
803
803
 
804
- it "should parse xml with element name different to class name" do
804
+ it 'should parse xml with element name different to class name' do
805
805
  game = QuarterTest::Game.parse(fixture_file('quarters.xml'))
806
806
  expect(game.q1.start).to eq('4:40:15 PM')
807
807
  expect(game.q2.start).to eq('5:18:53 PM')
808
808
  end
809
809
 
810
- it "should parse xml that has elements with dashes" do
810
+ it 'should parse xml that has elements with dashes' do
811
811
  commit = GitHub::Commit.parse(fixture_file('commit.xml'))
812
- expect(commit.message).to eq("move commands.rb and helpers.rb into commands/ dir")
813
- expect(commit.url).to eq("http://github.com/defunkt/github-gem/commit/c26d4ce9807ecf57d3f9eefe19ae64e75bcaaa8b")
814
- expect(commit.id).to eq("c26d4ce9807ecf57d3f9eefe19ae64e75bcaaa8b")
815
- expect(commit.committed_date).to eq(Date.parse("2008-03-02T16:45:41-08:00"))
816
- expect(commit.tree).to eq("28a1a1ca3e663d35ba8bf07d3f1781af71359b76")
812
+ expect(commit.message).to eq('move commands.rb and helpers.rb into commands/ dir')
813
+ expect(commit.url).to eq('http://github.com/defunkt/github-gem/commit/c26d4ce9807ecf57d3f9eefe19ae64e75bcaaa8b')
814
+ expect(commit.id).to eq('c26d4ce9807ecf57d3f9eefe19ae64e75bcaaa8b')
815
+ expect(commit.committed_date).to eq(Date.parse('2008-03-02T16:45:41-08:00'))
816
+ expect(commit.tree).to eq('28a1a1ca3e663d35ba8bf07d3f1781af71359b76')
817
817
  end
818
818
 
819
- it "should parse xml with no namespace" do
820
- product = Product.parse(fixture_file('product_no_namespace.xml'), :single => true)
821
- expect(product.title).to eq("A Title")
819
+ it 'should parse xml with no namespace' do
820
+ product = Product.parse(fixture_file('product_no_namespace.xml'), single: true)
821
+ expect(product.title).to eq('A Title')
822
822
  expect(product.feature_bullets.bug).to eq('This is a bug')
823
823
  expect(product.feature_bullets.features.size).to eq(2)
824
824
  expect(product.feature_bullets.features[0].name).to eq('This is feature text 1')
825
825
  expect(product.feature_bullets.features[1].name).to eq('This is feature text 2')
826
826
  end
827
827
 
828
- it "should parse xml with default namespace" do
829
- product = Product.parse(fixture_file('product_default_namespace.xml'), :single => true)
830
- expect(product.title).to eq("A Title")
828
+ it 'should parse xml with default namespace' do
829
+ product = Product.parse(fixture_file('product_default_namespace.xml'), single: true)
830
+ expect(product.title).to eq('A Title')
831
831
  expect(product.feature_bullets.bug).to eq('This is a bug')
832
832
  expect(product.feature_bullets.features.size).to eq(2)
833
833
  expect(product.feature_bullets.features[0].name).to eq('This is feature text 1')
834
834
  expect(product.feature_bullets.features[1].name).to eq('This is feature text 2')
835
835
  end
836
836
 
837
- it "should parse xml with single namespace" do
838
- product = Product.parse(fixture_file('product_single_namespace.xml'), :single => true)
839
- expect(product.title).to eq("A Title")
837
+ it 'should parse xml with single namespace' do
838
+ product = Product.parse(fixture_file('product_single_namespace.xml'), single: true)
839
+ expect(product.title).to eq('A Title')
840
840
  expect(product.feature_bullets.bug).to eq('This is a bug')
841
841
  expect(product.feature_bullets.features.size).to eq(2)
842
842
  expect(product.feature_bullets.features[0].name).to eq('This is feature text 1')
843
843
  expect(product.feature_bullets.features[1].name).to eq('This is feature text 2')
844
844
  end
845
845
 
846
- it "should parse xml with multiple namespaces" do
846
+ it 'should parse xml with multiple namespaces' do
847
847
  track = FedEx::TrackReply.parse(fixture_file('multiple_namespaces.xml'))
848
848
  expect(track.highest_severity).to eq('SUCCESS')
849
849
  expect(track.more_data).to be_falsey
@@ -885,7 +885,7 @@ describe HappyMapper do
885
885
  expect(track.tran_detail.cust_tran_id).to eq('20090102-111321')
886
886
  end
887
887
 
888
- it "should be able to parse google analytics api xml" do
888
+ it 'should be able to parse google analytics api xml' do
889
889
  data = Analytics::Feed.parse(fixture_file('analytics.xml'))
890
890
  expect(data.id).to eq('http://www.google.com/analytics/feeds/accounts/nunemaker@gmail.com')
891
891
  expect(data.entries.size).to eq(4)
@@ -899,7 +899,7 @@ describe HappyMapper do
899
899
  expect(property.value).to eq('85301')
900
900
  end
901
901
 
902
- it "should be able to parse google analytics profile xml with manually declared namespace" do
902
+ it 'should be able to parse google analytics profile xml with manually declared namespace' do
903
903
  data = Analytics::Profile.parse(fixture_file('analytics_profile.xml'))
904
904
  expect(data.entries.size).to eq(6)
905
905
 
@@ -909,7 +909,7 @@ describe HappyMapper do
909
909
  expect(entry.goals.size).to eq(0)
910
910
  end
911
911
 
912
- it "should allow instantiating with a string" do
912
+ it 'should allow instantiating with a string' do
913
913
  module StringFoo
914
914
  class Bar
915
915
  include HappyMapper
@@ -922,67 +922,65 @@ describe HappyMapper do
922
922
  end
923
923
  end
924
924
 
925
- it "should parse family search xml" do
925
+ it 'should parse family search xml' do
926
926
  tree = FamilySearch::FamilyTree.parse(fixture_file('family_tree.xml'))
927
927
  expect(tree.version).to eq('1.0.20071213.942')
928
928
  expect(tree.status_message).to eq('OK')
929
929
  expect(tree.status_code).to eq('200')
930
930
  expect(tree.persons.person.size).to eq(1)
931
931
  expect(tree.persons.person.first.version).to eq('1199378491000')
932
- expect(tree.persons.person.first.modified).to eq(Time.utc(2008, 1, 3, 16, 41, 31)) # 2008-01-03T09:41:31-07:00
932
+ expect(tree.persons.person.first.modified).
933
+ to eq(Time.utc(2008, 1, 3, 16, 41, 31)) # 2008-01-03T09:41:31-07:00
933
934
  expect(tree.persons.person.first.id).to eq('KWQS-BBQ')
934
935
  expect(tree.persons.person.first.information.alternateIds.ids).not_to be_kind_of(String)
935
936
  expect(tree.persons.person.first.information.alternateIds.ids.size).to eq(8)
936
937
  end
937
938
 
938
- it "should parse multiple images" do
939
+ it 'should parse multiple images' do
939
940
  artist = Artist.parse(fixture_file('multiple_primitives.xml'))
940
- expect(artist.name).to eq("value")
941
+ expect(artist.name).to eq('value')
941
942
  expect(artist.images.size).to eq(2)
942
943
  end
943
944
 
944
- it "should parse lastfm namespaces" do
945
+ it 'should parse lastfm namespaces' do
945
946
  l = Location.parse(fixture_file('lastfm.xml'))
946
- expect(l.first.latitude).to eq("51.53469")
947
+ expect(l.first.latitude).to eq('51.53469')
947
948
  end
948
949
 
949
- describe "Parse optional attributes" do
950
-
951
- it "should parse an empty String as empty" do
950
+ describe 'Parse optional attributes' do
951
+ it 'should parse an empty String as empty' do
952
952
  a = OptionalAttribute.parse(fixture_file('optional_attributes.xml'))
953
- expect(a[0].street).to eq("")
953
+ expect(a[0].street).to eq('')
954
954
  end
955
955
 
956
- it "should parse a String with value" do
956
+ it 'should parse a String with value' do
957
957
  a = OptionalAttribute.parse(fixture_file('optional_attributes.xml'))
958
- expect(a[1].street).to eq("Milchstrasse")
958
+ expect(a[1].street).to eq('Milchstrasse')
959
959
  end
960
960
 
961
- it "should parse a String with value" do
961
+ it 'should parse a String with value' do
962
962
  a = OptionalAttribute.parse(fixture_file('optional_attributes.xml'))
963
963
  expect(a[2].street).to be_nil
964
964
  end
965
-
966
965
  end
967
966
 
968
- describe "Default namespace combi" do
967
+ describe 'Default namespace combi' do
969
968
  before(:each) do
970
969
  file_contents = fixture_file('default_namespace_combi.xml')
971
- @book = DefaultNamespaceCombi.parse(file_contents, :single => true)
970
+ @book = DefaultNamespaceCombi.parse(file_contents, single: true)
972
971
  end
973
972
 
974
- it "should parse author" do
975
- expect(@book.author).to eq("Frank Gilbreth")
973
+ it 'should parse author' do
974
+ expect(@book.author).to eq('Frank Gilbreth')
976
975
  end
977
976
 
978
- it "should parse title" do
979
- expect(@book.title).to eq("Cheaper by the Dozen")
977
+ it 'should parse title' do
978
+ expect(@book.title).to eq('Cheaper by the Dozen')
980
979
  end
981
980
 
982
- it "should parse number" do
983
- expect(@book.number).to eq("1568491379")
981
+ it 'should parse number' do
982
+ expect(@book.number).to eq('1568491379')
984
983
  end
985
-
986
984
  end
987
985
 
988
986
  describe 'Xml Content' do
@@ -991,10 +989,12 @@ describe HappyMapper do
991
989
  @records = Dictionary::Record.parse(file_contents)
992
990
  end
993
991
 
994
- it "should parse XmlContent" do
995
- expect(@records.first.definitions.first.text).to eq(
996
- 'a large common parrot, <bn>Cacatua galerita</bn>, predominantly white, with yellow on the undersides of wings and tail and a forward curving yellow crest, found in Australia, New Guinea and nearby islands.'
997
- )
992
+ it 'should parse XmlContent' do
993
+ expect(@records.first.definitions.first.text).
994
+ to eq('a large common parrot, <bn>Cacatua galerita</bn>, predominantly' \
995
+ ' white, with yellow on the undersides of wings and tail and a' \
996
+ ' forward curving yellow crest, found in Australia, New Guinea' \
997
+ ' and nearby islands.')
998
998
  end
999
999
 
1000
1000
  it "should save object's xml content" do
@@ -1007,91 +1007,87 @@ describe HappyMapper do
1007
1007
  end
1008
1008
  end
1009
1009
 
1010
- it "should parse ambigous items" do
1011
- items = AmbigousItems::Item.parse(fixture_file('ambigous_items.xml'), :xpath => '/ambigous/my-items')
1012
- expect(items.map(&:name)).to eq(%w(first second third).map{|s| "My #{s} item" })
1010
+ it 'should parse ambigous items' do
1011
+ items = AmbigousItems::Item.parse(fixture_file('ambigous_items.xml'), xpath: '/ambigous/my-items')
1012
+ expect(items.map(&:name)).to eq(%w(first second third).map { |s| "My #{s} item" })
1013
1013
  end
1014
1014
 
1015
-
1016
1015
  context Article do
1017
- it "should parse the publish options for Article and Photo" do
1016
+ it 'should parse the publish options for Article and Photo' do
1018
1017
  expect(@article.title).not_to be_nil
1019
1018
  expect(@article.text).not_to be_nil
1020
1019
  expect(@article.photos).not_to be_nil
1021
1020
  expect(@article.photos.first.title).not_to be_nil
1022
1021
  end
1023
1022
 
1024
- it "should parse the publish options for Article" do
1023
+ it 'should parse the publish options for Article' do
1025
1024
  expect(@article.publish_options).not_to be_nil
1026
1025
  end
1027
1026
 
1028
- it "should parse the publish options for Photo" do
1027
+ it 'should parse the publish options for Photo' do
1029
1028
  expect(@article.photos.first.publish_options).not_to be_nil
1030
1029
  end
1031
1030
 
1032
- it "should only find only items at the parent level" do
1031
+ it 'should only find only items at the parent level' do
1033
1032
  expect(@article.photos.length).to eq(1)
1034
1033
  end
1035
1034
 
1036
1035
  before(:all) do
1037
1036
  @article = Article.parse(fixture_file('subclass_namespace.xml'))
1038
1037
  end
1038
+ end
1039
+
1040
+ context 'Namespace is missing because an optional element that uses it is not present' do
1041
+ it 'should parse successfully' do
1042
+ @article = PartiallyBadArticle.parse(fixture_file('subclass_namespace.xml'))
1043
+ expect(@article).not_to be_nil
1044
+ expect(@article.title).not_to be_nil
1045
+ expect(@article.text).not_to be_nil
1046
+ expect(@article.photos).not_to be_nil
1047
+ expect(@article.photos.first.title).not_to be_nil
1048
+ end
1049
+ end
1050
+
1051
+ describe 'with limit option' do
1052
+ it 'should return results with limited size: 6' do
1053
+ sizes = []
1054
+ Post.parse(fixture_file('posts.xml'), in_groups_of: 6) do |a|
1055
+ sizes << a.size
1056
+ end
1057
+ expect(sizes).to eq([6, 6, 6, 2])
1058
+ end
1039
1059
 
1060
+ it 'should return results with limited size: 10' do
1061
+ sizes = []
1062
+ Post.parse(fixture_file('posts.xml'), in_groups_of: 10) do |a|
1063
+ sizes << a.size
1064
+ end
1065
+ expect(sizes).to eq([10, 10])
1066
+ end
1040
1067
  end
1041
1068
 
1042
- context "Namespace is missing because an optional element that uses it is not present" do
1043
- it "should parse successfully" do
1044
- @article = PartiallyBadArticle.parse(fixture_file('subclass_namespace.xml'))
1045
- expect(@article).not_to be_nil
1046
- expect(@article.title).not_to be_nil
1047
- expect(@article.text).not_to be_nil
1048
- expect(@article.photos).not_to be_nil
1049
- expect(@article.photos.first.title).not_to be_nil
1050
- end
1051
- end
1052
-
1053
-
1054
- describe "with limit option" do
1055
- it "should return results with limited size: 6" do
1056
- sizes = []
1057
- Post.parse(fixture_file('posts.xml'), :in_groups_of => 6) do |a|
1058
- sizes << a.size
1059
- end
1060
- expect(sizes).to eq([6, 6, 6, 2])
1061
- end
1062
-
1063
- it "should return results with limited size: 10" do
1064
- sizes = []
1065
- Post.parse(fixture_file('posts.xml'), :in_groups_of => 10) do |a|
1066
- sizes << a.size
1067
- end
1068
- expect(sizes).to eq([10, 10])
1069
- end
1070
- end
1071
-
1072
- context "when letting user set Nokogiri::XML::ParseOptions" do
1073
- let(:default) {
1069
+ context 'when letting user set Nokogiri::XML::ParseOptions' do
1070
+ let(:default) do
1074
1071
  Class.new do
1075
1072
  include HappyMapper
1076
1073
  element :item, String
1077
1074
  end
1078
- }
1079
- let(:custom) {
1075
+ end
1076
+ let(:custom) do
1080
1077
  Class.new do
1081
1078
  include HappyMapper
1082
1079
  element :item, String
1083
- with_nokogiri_config do |config|
1084
- config.default_xml
1085
- end
1080
+ with_nokogiri_config(&:default_xml)
1086
1081
  end
1087
- }
1082
+ end
1088
1083
 
1089
1084
  it 'initializes @nokogiri_config_callback to nil' do
1090
1085
  expect(default.nokogiri_config_callback).to be_nil
1091
1086
  end
1092
1087
 
1093
1088
  it 'defaults to Nokogiri::XML::ParseOptions::STRICT' do
1094
- expect { default.parse(fixture_file('set_config_options.xml')) }.to raise_error(Nokogiri::XML::SyntaxError)
1089
+ expect { default.parse(fixture_file('set_config_options.xml')) }.
1090
+ to raise_error(Nokogiri::XML::SyntaxError)
1095
1091
  end
1096
1092
 
1097
1093
  it 'accepts .on_config callback' do
@@ -1104,7 +1100,8 @@ describe HappyMapper do
1104
1100
 
1105
1101
  it 'can clear @nokogiri_config_callback' do
1106
1102
  custom.with_nokogiri_config {}
1107
- expect { custom.parse(fixture_file('set_config_options.xml')) }.to raise_error(Nokogiri::XML::SyntaxError)
1103
+ expect { custom.parse(fixture_file('set_config_options.xml')) }.
1104
+ to raise_error(Nokogiri::XML::SyntaxError)
1108
1105
  end
1109
1106
  end
1110
1107
 
@@ -1113,7 +1110,8 @@ describe HappyMapper do
1113
1110
  xml = fixture_file('unformatted_address.xml')
1114
1111
  address = Address.parse(xml, single: true)
1115
1112
 
1116
- expect(address.xml_value).to eq %{<address><street>Milchstrasse</street><housenumber>23</housenumber></address>}
1113
+ expect(address.xml_value).
1114
+ to eq %(<address><street>Milchstrasse</street><housenumber>23</housenumber></address>)
1117
1115
  end
1118
1116
  end
1119
1117
 
@@ -1122,8 +1120,17 @@ describe HappyMapper do
1122
1120
  xml = fixture_file('unformatted_address.xml')
1123
1121
  address = Address.parse(xml)
1124
1122
 
1125
- expect(address.xml_content).to eq %{<street>Milchstrasse</street><housenumber>23</housenumber>}
1123
+ expect(address.xml_content).to eq %(<street>Milchstrasse</street><housenumber>23</housenumber>)
1126
1124
  end
1127
1125
  end
1128
1126
 
1127
+ describe '#to_xml' do
1128
+ let(:original) { '<foo><bar>baz</bar></foo>' }
1129
+ let(:parsed) { described_class.parse original }
1130
+
1131
+ it 'has UTF-8 encoding by default' do
1132
+ expect(original.encoding).to eq Encoding::UTF_8
1133
+ expect(parsed.to_xml.encoding).to eq Encoding::UTF_8
1134
+ end
1135
+ end
1129
1136
  end