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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +26 -1
- data/README.md +204 -117
- data/lib/happymapper.rb +318 -343
- data/lib/happymapper/anonymous_mapper.rb +27 -29
- data/lib/happymapper/attribute.rb +7 -5
- data/lib/happymapper/element.rb +19 -24
- data/lib/happymapper/item.rb +18 -20
- data/lib/happymapper/supported_types.rb +20 -19
- data/lib/happymapper/text_node.rb +4 -3
- data/lib/happymapper/version.rb +3 -1
- data/spec/attribute_default_value_spec.rb +14 -15
- data/spec/attributes_spec.rb +14 -15
- data/spec/happymapper/attribute_spec.rb +4 -4
- data/spec/happymapper/element_spec.rb +3 -1
- data/spec/happymapper/item_spec.rb +49 -41
- data/spec/happymapper/text_node_spec.rb +3 -1
- data/spec/happymapper_parse_spec.rb +62 -44
- data/spec/happymapper_spec.rb +270 -263
- data/spec/has_many_empty_array_spec.rb +8 -7
- data/spec/ignay_spec.rb +27 -31
- data/spec/inheritance_spec.rb +30 -24
- data/spec/mixed_namespaces_spec.rb +14 -15
- data/spec/parse_with_object_to_update_spec.rb +37 -38
- data/spec/spec_helper.rb +18 -0
- data/spec/to_xml_spec.rb +64 -63
- data/spec/to_xml_with_namespaces_spec.rb +66 -64
- data/spec/wilcard_tag_name_spec.rb +25 -21
- data/spec/wrap_spec.rb +11 -11
- data/spec/xpath_spec.rb +33 -32
- metadata +33 -5
@@ -1,8 +1,9 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require 'spec_helper'
|
4
4
|
|
5
|
-
|
5
|
+
describe 'Wildcard Root Tag' do
|
6
|
+
generic_class_xml = %(
|
6
7
|
<root>
|
7
8
|
<description>some description</description>
|
8
9
|
<blarg name='blargname1' href='http://blarg.com'/>
|
@@ -11,7 +12,7 @@ describe "Wildcard Root Tag" do
|
|
11
12
|
<subelement>
|
12
13
|
<jello name='subjelloname' href='http://ohnojello.com' other='othertext'/>
|
13
14
|
</subelement>
|
14
|
-
</root>
|
15
|
+
</root>)
|
15
16
|
|
16
17
|
module GenericBase
|
17
18
|
class Base
|
@@ -29,28 +30,31 @@ describe "Wildcard Root Tag" do
|
|
29
30
|
attribute :href, String
|
30
31
|
attribute :other, String
|
31
32
|
|
32
|
-
def <=>(
|
33
|
-
|
33
|
+
def <=>(other)
|
34
|
+
result = name <=> other.name
|
35
|
+
return result unless result == 0
|
36
|
+
result = href <=> other.href
|
37
|
+
return result unless result == 0
|
38
|
+
self.other <=> other.other
|
34
39
|
end
|
35
40
|
end
|
36
41
|
class Sub
|
37
42
|
include HappyMapper
|
38
43
|
tag 'subelement'
|
39
|
-
has_one :jello, Base, :
|
44
|
+
has_one :jello, Base, tag: 'jello'
|
40
45
|
end
|
41
46
|
class Root
|
42
47
|
include HappyMapper
|
43
48
|
tag 'root'
|
44
49
|
element :description, String
|
45
|
-
has_many :blargs, Base, :
|
46
|
-
has_many :jellos, Base, :
|
47
|
-
has_many :subjellos, Base, :
|
50
|
+
has_many :blargs, Base, tag: 'blarg', xpath: '.'
|
51
|
+
has_many :jellos, Base, tag: 'jello', xpath: '.'
|
52
|
+
has_many :subjellos, Base, tag: 'jello', xpath: 'subelement/.', read_only: true
|
48
53
|
has_one :sub_element, Sub
|
49
54
|
end
|
50
55
|
end
|
51
56
|
|
52
57
|
describe "can have generic classes using tag '*'" do
|
53
|
-
|
54
58
|
let(:subject) { GenericBase::Root.parse(generic_class_xml) }
|
55
59
|
let(:xml) { Nokogiri::XML(subject.to_xml) }
|
56
60
|
|
@@ -65,18 +69,18 @@ describe "Wildcard Root Tag" do
|
|
65
69
|
expect(subject.subjellos.size).to eq(1)
|
66
70
|
end
|
67
71
|
|
68
|
-
def base_with(name,href,other)
|
69
|
-
GenericBase::Base.new(:name
|
72
|
+
def base_with(name, href, other)
|
73
|
+
GenericBase::Base.new(name: name, href: href, other: other)
|
70
74
|
end
|
71
75
|
|
72
76
|
it 'should parse correct values onto generic class' do
|
73
|
-
expect(subject.blargs[0]).to eq base_with('blargname1','http://blarg.com',nil)
|
74
|
-
expect(subject.blargs[1]).to eq base_with('blargname2','http://blarg.com',nil)
|
75
|
-
expect(subject.jellos[0]).to eq base_with('jelloname','http://jello.com',nil)
|
76
|
-
expect(subject.subjellos[0]).to eq base_with('subjelloname','http://ohnojello.com','othertext')
|
77
|
+
expect(subject.blargs[0]).to eq base_with('blargname1', 'http://blarg.com', nil)
|
78
|
+
expect(subject.blargs[1]).to eq base_with('blargname2', 'http://blarg.com', nil)
|
79
|
+
expect(subject.jellos[0]).to eq base_with('jelloname', 'http://jello.com', nil)
|
80
|
+
expect(subject.subjellos[0]).to eq base_with('subjelloname', 'http://ohnojello.com', 'othertext')
|
77
81
|
end
|
78
82
|
|
79
|
-
def validate_xpath(xpath,name,href,other)
|
83
|
+
def validate_xpath(xpath, name, href, other)
|
80
84
|
expect(xml.xpath("#{xpath}/@name").text).to eq name
|
81
85
|
expect(xml.xpath("#{xpath}/@href").text).to eq href
|
82
86
|
expect(xml.xpath("#{xpath}/@other").text).to eq other
|
@@ -84,9 +88,9 @@ describe "Wildcard Root Tag" do
|
|
84
88
|
|
85
89
|
it 'should #to_xml using parent element tag name' do
|
86
90
|
expect(xml.xpath('/root/description').text).to eq('some description')
|
87
|
-
validate_xpath(
|
88
|
-
validate_xpath(
|
89
|
-
validate_xpath(
|
91
|
+
validate_xpath('/root/blarg[1]', 'blargname1', 'http://blarg.com', '')
|
92
|
+
validate_xpath('/root/blarg[2]', 'blargname2', 'http://blarg.com', '')
|
93
|
+
validate_xpath('/root/jello[1]', 'jelloname', 'http://jello.com', '')
|
90
94
|
end
|
91
95
|
|
92
96
|
it "should properly respect child HappyMapper tags if tag isn't provided on the element defintion" do
|
data/spec/wrap_spec.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require 'spec_helper'
|
4
4
|
|
5
|
+
describe 'wrap which allows you to specify a wrapper element' do
|
5
6
|
module Wrap
|
6
7
|
class SubClass
|
7
8
|
include HappyMapper
|
8
9
|
tag 'subclass'
|
9
10
|
attribute :myattr, String
|
10
|
-
has_many :items, String, :
|
11
|
+
has_many :items, String, tag: 'item'
|
11
12
|
end
|
12
13
|
class Root
|
13
14
|
include HappyMapper
|
@@ -22,8 +23,8 @@ describe "wrap which allows you to specify a wrapper element" do
|
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
|
-
describe
|
26
|
-
context
|
26
|
+
describe '.parse' do
|
27
|
+
context 'when given valid XML' do
|
27
28
|
let(:subject) { Wrap::Root.parse fixture_file('wrapper.xml') }
|
28
29
|
|
29
30
|
it 'sets the values correctly' do
|
@@ -38,16 +39,16 @@ describe "wrap which allows you to specify a wrapper element" do
|
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
|
-
context
|
42
|
+
context 'when initialized without XML' do
|
42
43
|
let(:subject) { Wrap::Root.new }
|
43
44
|
|
44
|
-
it
|
45
|
+
it 'anonymous classes are created so nil class values does not occur' do
|
45
46
|
expect { subject.description = 'anything' }.to_not raise_error
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
50
|
-
describe
|
51
|
+
describe '.to_xml' do
|
51
52
|
let(:subject) do
|
52
53
|
root = Wrap::Root.new
|
53
54
|
root.attr1 = 'somevalue'
|
@@ -66,7 +67,7 @@ describe "wrap which allows you to specify a wrapper element" do
|
|
66
67
|
root
|
67
68
|
end
|
68
69
|
|
69
|
-
it
|
70
|
+
it 'generates the correct xml' do
|
70
71
|
xml = Nokogiri::XML(subject.to_xml)
|
71
72
|
expect(xml.xpath('/root/@attr1').text).to eq 'somevalue'
|
72
73
|
expect(xml.xpath('/root/name').text).to eq 'myname'
|
@@ -77,6 +78,5 @@ describe "wrap which allows you to specify a wrapper element" do
|
|
77
78
|
expect(xml.xpath('/root/mywraptag/subclass/item[2]').text).to eq 'item2'
|
78
79
|
expect(xml.xpath('/root/number').text).to eq '12345'
|
79
80
|
end
|
80
|
-
|
81
81
|
end
|
82
|
-
end
|
82
|
+
end
|
data/spec/xpath_spec.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require 'spec_helper'
|
4
4
|
|
5
|
+
describe 'Specifying elements and attributes with an xpath' do
|
5
6
|
class Item
|
6
7
|
include HappyMapper
|
7
8
|
|
@@ -9,15 +10,15 @@ describe "Specifying elements and attributes with an xpath" do
|
|
9
10
|
namespace 'amazing'
|
10
11
|
|
11
12
|
element :title, String
|
12
|
-
attribute :link, String, :
|
13
|
-
has_one :different_link, String, :
|
14
|
-
element :detail, String, :
|
15
|
-
has_many :more_details_text, String, :
|
16
|
-
has_many :more_details, String,
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
13
|
+
attribute :link, String, xpath: 'amazing:link/@href'
|
14
|
+
has_one :different_link, String, xpath: 'different:link/@href'
|
15
|
+
element :detail, String, xpath: 'amazing:subitem/amazing:detail'
|
16
|
+
has_many :more_details_text, String, xpath: 'amazing:subitem/amazing:more'
|
17
|
+
has_many :more_details, String,
|
18
|
+
xpath: 'amazing:subitem/amazing:more/@first|amazing:subitem/amazing:more/@alternative'
|
19
|
+
has_many :more_details_alternative, String, xpath: 'amazing:subitem/amazing:more/@*'
|
20
|
+
|
21
|
+
has_one :baby, 'Baby', name: 'baby', namespace: 'amazing'
|
21
22
|
end
|
22
23
|
|
23
24
|
class Baby
|
@@ -26,12 +27,13 @@ describe "Specifying elements and attributes with an xpath" do
|
|
26
27
|
has_one :name, String
|
27
28
|
end
|
28
29
|
|
29
|
-
let(:subject) { Item.parse(xml_string
|
30
|
+
let(:subject) { Item.parse(xml_string, single: true) }
|
30
31
|
|
31
32
|
let(:xml_string) do
|
32
|
-
%
|
33
|
+
%(
|
33
34
|
<rss>
|
34
|
-
<amazing:item xmlns:amazing="http://www.amazing.com/amazing"
|
35
|
+
<amazing:item xmlns:amazing="http://www.amazing.com/amazing"
|
36
|
+
xmlns:different="http://www.different.com/different">
|
35
37
|
<amazing:title>Test XML</amazing:title>
|
36
38
|
<different:link href="different_link" />
|
37
39
|
<amazing:link href="link_to_resources" />
|
@@ -45,45 +47,44 @@ describe "Specifying elements and attributes with an xpath" do
|
|
45
47
|
</amazing:baby>
|
46
48
|
</amazing:item>
|
47
49
|
</rss>
|
48
|
-
|
50
|
+
)
|
49
51
|
end
|
50
52
|
|
51
|
-
it
|
52
|
-
expect(subject.title).to eq
|
53
|
+
it 'should have a title' do
|
54
|
+
expect(subject.title).to eq 'Test XML'
|
53
55
|
end
|
54
56
|
|
55
|
-
it
|
57
|
+
it 'should find the link href value' do
|
56
58
|
expect(subject.link).to eq 'link_to_resources'
|
57
59
|
end
|
58
60
|
|
59
|
-
it
|
61
|
+
it 'should find the link href value' do
|
60
62
|
expect(subject.different_link).to eq 'different_link'
|
61
63
|
end
|
62
64
|
|
63
|
-
it
|
65
|
+
it 'should find this subitem based on the xpath' do
|
64
66
|
expect(subject.detail).to eq 'I want to parse this'
|
65
67
|
end
|
66
68
|
|
67
|
-
it
|
69
|
+
it 'should find the subitems based on the xpath' do
|
68
70
|
expect(subject.more_details_text.size).to eq(2)
|
69
|
-
expect(subject.more_details_text.first).to eq
|
70
|
-
expect(subject.more_details_text.last).to eq
|
71
|
+
expect(subject.more_details_text.first).to eq 'more 1'
|
72
|
+
expect(subject.more_details_text.last).to eq 'more 2'
|
71
73
|
end
|
72
74
|
|
73
|
-
it
|
75
|
+
it 'should find the subitems based on the xpath' do
|
74
76
|
expect(subject.more_details.size).to eq(2)
|
75
|
-
expect(subject.more_details.first).to eq
|
76
|
-
expect(subject.more_details.last).to eq
|
77
|
+
expect(subject.more_details.first).to eq 'this one'
|
78
|
+
expect(subject.more_details.last).to eq 'another one'
|
77
79
|
end
|
78
80
|
|
79
|
-
it
|
81
|
+
it 'should find the subitems based on the xpath' do
|
80
82
|
expect(subject.more_details_alternative.size).to eq(2)
|
81
|
-
expect(subject.more_details_alternative.first).to eq
|
82
|
-
expect(subject.more_details_alternative.last).to eq
|
83
|
+
expect(subject.more_details_alternative.first).to eq 'this one'
|
84
|
+
expect(subject.more_details_alternative.last).to eq 'another one'
|
83
85
|
end
|
84
86
|
|
85
|
-
it
|
86
|
-
expect(subject.baby.name).to eq
|
87
|
+
it 'should have a baby name' do
|
88
|
+
expect(subject.baby.name).to eq 'Jumbo'
|
87
89
|
end
|
88
|
-
|
89
90
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nokogiri-happymapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Damien Le Berrigaud
|
@@ -14,7 +14,7 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date:
|
17
|
+
date: 2018-08-27 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: nokogiri
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '1.5'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rake
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '12.0'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '12.0'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: rspec
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,6 +58,20 @@ dependencies:
|
|
44
58
|
- - "~>"
|
45
59
|
- !ruby/object:Gem::Version
|
46
60
|
version: '3.0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: simplecov
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.16.1
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.16.1
|
47
75
|
description: Object to XML Mapping Library, using Nokogiri (fork from John Nunemaker's
|
48
76
|
Happymapper)
|
49
77
|
email: matijs@matijs.net
|
@@ -124,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
124
152
|
requirements:
|
125
153
|
- - ">="
|
126
154
|
- !ruby/object:Gem::Version
|
127
|
-
version:
|
155
|
+
version: 2.3.0
|
128
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
157
|
requirements:
|
130
158
|
- - ">="
|
@@ -132,9 +160,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
160
|
version: '0'
|
133
161
|
requirements: []
|
134
162
|
rubyforge_project:
|
135
|
-
rubygems_version: 2.6
|
163
|
+
rubygems_version: 2.7.6
|
136
164
|
signing_key:
|
137
|
-
specification_version:
|
165
|
+
specification_version: 4
|
138
166
|
summary: Provides a simple way to map XML to Ruby Objects and back again.
|
139
167
|
test_files:
|
140
168
|
- spec/attribute_default_value_spec.rb
|