libis-tools 0.9.1
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 +7 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +16 -0
- data/.rspec +2 -0
- data/.travis.yml +37 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +289 -0
- data/Rakefile +6 -0
- data/lib/libis-tools.rb +1 -0
- data/lib/libis/tools.rb +16 -0
- data/lib/libis/tools/assert.rb +41 -0
- data/lib/libis/tools/checksum.rb +84 -0
- data/lib/libis/tools/command.rb +40 -0
- data/lib/libis/tools/config.rb +160 -0
- data/lib/libis/tools/dc_record.rb +47 -0
- data/lib/libis/tools/extend/empty.rb +7 -0
- data/lib/libis/tools/extend/hash.rb +107 -0
- data/lib/libis/tools/extend/ostruct.rb +3 -0
- data/lib/libis/tools/extend/string.rb +85 -0
- data/lib/libis/tools/extend/struct.rb +29 -0
- data/lib/libis/tools/logger.rb +71 -0
- data/lib/libis/tools/mets_file.rb +575 -0
- data/lib/libis/tools/parameter.rb +172 -0
- data/lib/libis/tools/sharepoint_mapping.rb +118 -0
- data/lib/libis/tools/sharepoint_record.rb +260 -0
- data/lib/libis/tools/version.rb +5 -0
- data/lib/libis/tools/xml_document.rb +574 -0
- data/libis-tools.gemspec +39 -0
- data/spec/assert_spec.rb +65 -0
- data/spec/checksum_spec.rb +132 -0
- data/spec/command_spec.rb +68 -0
- data/spec/config_spec.rb +86 -0
- data/spec/data/test.data +9 -0
- data/spec/data/test.xml +8 -0
- data/spec/data/test.yml +1 -0
- data/spec/logger_spec.rb +107 -0
- data/spec/parameter_container_spec.rb +83 -0
- data/spec/parameter_spec.rb +139 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/test.xsd +20 -0
- data/spec/xmldocument_spec.rb +413 -0
- data/test/test_helper.rb +7 -0
- data/test/webservices/test_ca_item_info.rb +59 -0
- data/test/webservices/test_ca_search.rb +35 -0
- metadata +244 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
require 'libis/tools/parameter'
|
4
|
+
|
5
|
+
describe 'ParameterContainer' do
|
6
|
+
|
7
|
+
before :context do
|
8
|
+
class TestContainer
|
9
|
+
include ::Libis::Tools::ParameterContainer
|
10
|
+
|
11
|
+
parameter check: true
|
12
|
+
parameter count: 0
|
13
|
+
parameter price: 1.0
|
14
|
+
parameter name: 'nobody'
|
15
|
+
parameter calendar: Date.new(2014, 01, 01)
|
16
|
+
parameter clock: Time.parse('10:10')
|
17
|
+
parameter timestamp: DateTime.new(2014, 01, 01, 10, 10)
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
before :example do
|
23
|
+
@test_container = TestContainer.new
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'class should return parameter if only name is given' do
|
27
|
+
[:check, :count, :price, :name, :calendar, :clock, :timestamp].each do |v|
|
28
|
+
expect(TestContainer.parameter(v)).to be_a ::Libis::Tools::Parameter
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should have default parameters' do
|
33
|
+
expect(@test_container.parameter(:check)).to be_truthy
|
34
|
+
expect(@test_container.parameter(:count)).to eq 0
|
35
|
+
expect(@test_container.parameter(:price)).to eq 1.0
|
36
|
+
expect(@test_container.parameter(:name)).to eq 'nobody'
|
37
|
+
expect(@test_container.parameter(:calendar).year).to eq 2014
|
38
|
+
expect(@test_container.parameter(:calendar).month).to eq 1
|
39
|
+
expect(@test_container.parameter(:calendar).day).to eq 1
|
40
|
+
expect(@test_container.parameter(:clock).hour).to eq 10
|
41
|
+
expect(@test_container.parameter(:clock).min).to eq 10
|
42
|
+
expect(@test_container.parameter(:clock).sec).to eq 0
|
43
|
+
expect(@test_container.parameter(:timestamp).year).to eq 2014
|
44
|
+
expect(@test_container.parameter(:timestamp).month).to eq 1
|
45
|
+
expect(@test_container.parameter(:timestamp).day).to eq 1
|
46
|
+
expect(@test_container.parameter(:timestamp).hour).to eq 10
|
47
|
+
expect(@test_container.parameter(:timestamp).min).to eq 10
|
48
|
+
expect(@test_container.parameter(:timestamp).sec).to eq 0
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should allow to set values' do
|
52
|
+
@test_container.parameter(:check, false)
|
53
|
+
expect(@test_container.parameter(:check)).to be_falsey
|
54
|
+
|
55
|
+
@test_container.parameter(:count, 99)
|
56
|
+
expect(@test_container.parameter(:count)).to eq 99
|
57
|
+
|
58
|
+
@test_container.parameter(:price, 99.99)
|
59
|
+
expect(@test_container.parameter(:price)).to eq 99.99
|
60
|
+
|
61
|
+
@test_container.parameter(:name, 'everybody')
|
62
|
+
expect(@test_container.parameter(:name)).to eq 'everybody'
|
63
|
+
|
64
|
+
@test_container.parameter(:calendar, Date.new(2015, 02, 03))
|
65
|
+
expect(@test_container.parameter(:calendar).year).to eq 2015
|
66
|
+
expect(@test_container.parameter(:calendar).month).to eq 2
|
67
|
+
expect(@test_container.parameter(:calendar).day).to eq 3
|
68
|
+
|
69
|
+
@test_container.parameter(:clock, Time.parse('14:40:23'))
|
70
|
+
expect(@test_container.parameter(:clock).hour).to eq 14
|
71
|
+
expect(@test_container.parameter(:clock).min).to eq 40
|
72
|
+
expect(@test_container.parameter(:clock).sec).to eq 23
|
73
|
+
|
74
|
+
@test_container.parameter(:timestamp, DateTime.new(2015, 02, 03, 14, 40, 23))
|
75
|
+
expect(@test_container.parameter(:timestamp).year).to eq 2015
|
76
|
+
expect(@test_container.parameter(:timestamp).month).to eq 2
|
77
|
+
expect(@test_container.parameter(:timestamp).day).to eq 3
|
78
|
+
expect(@test_container.parameter(:timestamp).hour).to eq 14
|
79
|
+
expect(@test_container.parameter(:timestamp).min).to eq 40
|
80
|
+
expect(@test_container.parameter(:timestamp).sec).to eq 23
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
require 'libis/tools/parameter'
|
4
|
+
|
5
|
+
describe 'Parameter' do
|
6
|
+
|
7
|
+
before :context do
|
8
|
+
@parameter_types = %w'bool string int float datetime'
|
9
|
+
|
10
|
+
@bool_parameter = ::Libis::Tools::Parameter.new('BoolParam', true)
|
11
|
+
@string_parameter = ::Libis::Tools::Parameter.new('StringParam', 'default string')
|
12
|
+
@int_parameter = ::Libis::Tools::Parameter.new('IntParam', 5)
|
13
|
+
@float_parameter = ::Libis::Tools::Parameter.new('FloatParam', 1.0)
|
14
|
+
@datetime_parameter = ::Libis::Tools::Parameter.new('DateTimeParam', DateTime.now)
|
15
|
+
|
16
|
+
@constrained_bool_parameter = ::Libis::Tools::Parameter.new('BoolParam', true, nil, nil, true)
|
17
|
+
@constrained_string_parameter = ::Libis::Tools::Parameter.new('StringParam', 'default string', nil, nil, /^ABC.*XYZ$/i)
|
18
|
+
@constrained_int_parameter = ::Libis::Tools::Parameter.new('IntParam', 5, nil, nil, [1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37])
|
19
|
+
@constrained_float_parameter = ::Libis::Tools::Parameter.new('FloatParam', 0.0, nil, nil, 1.0...3.1415927)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should detect datatype from default value' do
|
23
|
+
@parameter_types.each do |dtype|
|
24
|
+
expect(eval("@#{dtype}_parameter").guess_datatype).to eq dtype
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should return default value' do
|
29
|
+
@parameter_types.each do |dtype|
|
30
|
+
expect(eval("@#{dtype}_parameter").parse).to eq eval("@#{dtype}_parameter").default
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should test if boolean value is valid' do
|
35
|
+
[false, true, nil, 'true', 'false', 'T', 'F', 'y', 'n', 1, 0].each do |v|
|
36
|
+
# noinspection RubyResolve
|
37
|
+
expect(@bool_parameter).to be_valid_value(v)
|
38
|
+
end
|
39
|
+
|
40
|
+
[5, 0.1, 'abc'].each do |v|
|
41
|
+
# noinspection RubyResolve
|
42
|
+
expect(@bool_parameter).not_to be_valid_value(v)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should test if string value is valid' do
|
47
|
+
['abc', true, false, nil, 1, 1.0, Object.new].each do |v|
|
48
|
+
# noinspection RubyResolve
|
49
|
+
expect(@string_parameter).to be_valid_value(v)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should test if integer value is valid' do
|
54
|
+
[0, 5, -6, 3.1415926, '3', nil, Rational('1/3')].each do |v|
|
55
|
+
# noinspection RubyResolve
|
56
|
+
expect(@int_parameter).to be_valid_value(v)
|
57
|
+
end
|
58
|
+
|
59
|
+
['abc', '3.1415926', '1 meter', false, true, Object.new].each do |v|
|
60
|
+
# noinspection RubyResolve
|
61
|
+
expect(@int_parameter).not_to be_valid_value(v)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should test if float value is valid' do
|
66
|
+
[1.1, Rational('1/3'), 3.1415926, '3.1415926', nil].each do |v|
|
67
|
+
# noinspection RubyResolve
|
68
|
+
expect(@float_parameter).to be_valid_value(v)
|
69
|
+
end
|
70
|
+
|
71
|
+
['abc', '1.0.0', false, true, Object.new].each do |v|
|
72
|
+
# noinspection RubyResolve
|
73
|
+
expect(@float_parameter).not_to be_valid_value(v)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should test if datetime value is valid' do
|
78
|
+
[Time.now, Date.new, '10:10', '2014/01/01', '2014/01/01 10:10:10.000001', nil].each do |v|
|
79
|
+
# noinspection RubyResolve
|
80
|
+
expect(@datetime_parameter).to be_valid_value(v)
|
81
|
+
end
|
82
|
+
|
83
|
+
['abc', 5, false].each do |v|
|
84
|
+
# noinspection RubyResolve
|
85
|
+
expect(@datetime_parameter).not_to be_valid_value(v)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should accept and convert value for boolean parameter' do
|
90
|
+
['true', 'True', 'TRUE','tRuE', 't', 'T', 'y', 'Y', '1', 1].each do |v|
|
91
|
+
expect(@bool_parameter.parse(v)).to be_truthy
|
92
|
+
end
|
93
|
+
|
94
|
+
['false', 'False', 'FALSE','fAlSe', 'f', 'F', 'n', 'N', '0', 0].each do |v|
|
95
|
+
expect(@bool_parameter.parse(v)).to be_falsey
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# noinspection RubyResolve
|
100
|
+
it 'should check values against constraint' do
|
101
|
+
expect(@constrained_bool_parameter).to be_valid_value(true)
|
102
|
+
expect(@constrained_bool_parameter).to be_valid_value('y')
|
103
|
+
|
104
|
+
expect(@constrained_bool_parameter).not_to be_valid_value(false)
|
105
|
+
expect(@constrained_bool_parameter).not_to be_valid_value('n')
|
106
|
+
|
107
|
+
%w'ABCXYZ ABC123XYZ abcxyz AbC__++__xYz'.each do |v|
|
108
|
+
# noinspection RubyResolve
|
109
|
+
expect(@constrained_string_parameter).to be_valid_value(v)
|
110
|
+
end
|
111
|
+
|
112
|
+
%w'ABC XYZ ABC123'.each do |v|
|
113
|
+
# noinspection RubyResolve
|
114
|
+
expect(@constrained_string_parameter).not_to be_valid_value(v)
|
115
|
+
end
|
116
|
+
|
117
|
+
[1, 7, 11, nil].each do |v|
|
118
|
+
# noinspection RubyResolve
|
119
|
+
expect(@constrained_int_parameter).to be_valid_value(v)
|
120
|
+
end
|
121
|
+
|
122
|
+
[0, 4, 9, 43].each do |v|
|
123
|
+
# noinspection RubyResolve
|
124
|
+
expect(@constrained_int_parameter).not_to be_valid_value(v)
|
125
|
+
end
|
126
|
+
|
127
|
+
[1.0, 3.1415, 2.718281828459].each do |v|
|
128
|
+
# noinspection RubyResolve
|
129
|
+
expect(@constrained_float_parameter).to be_valid_value(v)
|
130
|
+
end
|
131
|
+
|
132
|
+
[nil, 0.5, -2.5].each do |v|
|
133
|
+
# noinspection RubyResolve
|
134
|
+
expect(@constrained_float_parameter).not_to be_valid_value(v)
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/test.xsd
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
2
|
+
<xs:element name="patron">
|
3
|
+
<xs:complexType>
|
4
|
+
<xs:sequence>
|
5
|
+
<xs:element type="xs:string" name="name"/>
|
6
|
+
<xs:element name="barcode">
|
7
|
+
<xs:complexType>
|
8
|
+
<xs:simpleContent>
|
9
|
+
<xs:extension base="xs:int">
|
10
|
+
<xs:attribute type="xs:string" name="library"/>
|
11
|
+
</xs:extension>
|
12
|
+
</xs:simpleContent>
|
13
|
+
</xs:complexType>
|
14
|
+
</xs:element>
|
15
|
+
<xs:element type="xs:string" name="access_level"/>
|
16
|
+
<xs:element type="xs:string" name="email" maxOccurs="unbounded" minOccurs="0"/>
|
17
|
+
</xs:sequence>
|
18
|
+
</xs:complexType>
|
19
|
+
</xs:element>
|
20
|
+
</xs:schema>
|
@@ -0,0 +1,413 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
require 'libis/tools/xml_document'
|
4
|
+
require 'libis/tools/extend/string'
|
5
|
+
|
6
|
+
require 'rspec/matchers'
|
7
|
+
require 'equivalent-xml'
|
8
|
+
|
9
|
+
describe 'XML Document' do
|
10
|
+
|
11
|
+
test_file = File.join(File.dirname(__FILE__), 'data', 'test.xml')
|
12
|
+
test_xsd = File.join(File.dirname(__FILE__), 'test.xsd')
|
13
|
+
|
14
|
+
def match_xml(doc1, doc2)
|
15
|
+
doc1 = ::Nokogiri::XML(doc1) if doc1.is_a?(String)
|
16
|
+
doc2 = ::Nokogiri::XML(doc2) if doc2.is_a?(String)
|
17
|
+
# noinspection RubyResolve
|
18
|
+
# expect(doc1).to be_equivalent_to(doc2).respecting_element_order
|
19
|
+
expect(doc1).to be_equivalent_to(doc2)
|
20
|
+
end
|
21
|
+
|
22
|
+
before :context do
|
23
|
+
@xml_template = <<-END.align_left
|
24
|
+
<?xml version="1.0" encoding="utf-8"?>
|
25
|
+
<patron>
|
26
|
+
<name>Harry Potter</name>
|
27
|
+
<barcode library="Hogwarts Library">1234567890</barcode>
|
28
|
+
<access_level>student</access_level>
|
29
|
+
<email>harry.potter@hogwarts.edu</email>
|
30
|
+
<email>hpotter@JKRowling.com</email>
|
31
|
+
</patron>
|
32
|
+
END
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should create new empty XML document' do
|
36
|
+
|
37
|
+
xml_doc = ::Libis::Tools::XmlDocument.new
|
38
|
+
|
39
|
+
expect(xml_doc.document).not_to be_nil
|
40
|
+
# noinspection RubyResolve
|
41
|
+
expect(xml_doc).not_to be_valid
|
42
|
+
# noinspection RubyResolve
|
43
|
+
expect(xml_doc).to be_invalid
|
44
|
+
|
45
|
+
match_xml xml_doc.document, <<-END.align_left
|
46
|
+
<?xml version="1.0" encoding="utf-8"?>
|
47
|
+
END
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should load test file' do
|
52
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
53
|
+
# noinspection RubyResolve
|
54
|
+
expect(xml_doc).to be_valid
|
55
|
+
match_xml xml_doc.document, @xml_template
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should parse XML from string' do
|
60
|
+
xml_doc = ::Libis::Tools::XmlDocument.parse(<<-END.align_left)
|
61
|
+
<patron>
|
62
|
+
<name>Harry Potter</name>
|
63
|
+
<barcode library="Hogwarts Library">1234567890</barcode>
|
64
|
+
<access_level>student</access_level>
|
65
|
+
<email>harry.potter@hogwarts.edu</email>
|
66
|
+
<email>hpotter@JKRowling.com</email>
|
67
|
+
</patron>
|
68
|
+
END
|
69
|
+
|
70
|
+
match_xml xml_doc.document, @xml_template
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should parse XML from Hash' do
|
74
|
+
xml_doc = ::Libis::Tools::XmlDocument.from_hash({patron: {
|
75
|
+
name: 'Harry Potter',
|
76
|
+
barcode: {
|
77
|
+
'@library' => 'Hogwarts Library',
|
78
|
+
content!: '1234567890',
|
79
|
+
},
|
80
|
+
access_level: 'student',
|
81
|
+
email: %w'harry.potter@hogwarts.edu hpotter@JKRowling.com'
|
82
|
+
}},
|
83
|
+
{:key_converter => :none}
|
84
|
+
)
|
85
|
+
|
86
|
+
match_xml xml_doc.document, @xml_template
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should validate document against schema' do
|
91
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
92
|
+
|
93
|
+
expect(xml_doc.validates_against? test_xsd).to be_truthy
|
94
|
+
# noinspection RubyResolve
|
95
|
+
expect(xml_doc.validate test_xsd).to be_empty
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should allow to add a processing instruction' do
|
100
|
+
xml_doc = ::Libis::Tools::XmlDocument.parse '<patron/>'
|
101
|
+
xml_doc.add_processing_instruction 'xml-stylesheet', 'type="text/xsl" href="style.xsl"'
|
102
|
+
|
103
|
+
match_xml xml_doc.document, <<-END.align_left
|
104
|
+
<?xml version="1.0" encoding="utf-8"?>
|
105
|
+
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
|
106
|
+
<patron/>
|
107
|
+
END
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should get the root node of the document' do
|
111
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
112
|
+
root = xml_doc.root
|
113
|
+
|
114
|
+
expect(root.name).to eq 'patron'
|
115
|
+
match_xml root.document, <<-END.align_left
|
116
|
+
<patron>
|
117
|
+
<name>Harry Potter</name>
|
118
|
+
<barcode library="Hogwarts Library">1234567890</barcode>
|
119
|
+
<access_level>student</access_level>
|
120
|
+
<email>harry.potter@hogwarts.edu</email>
|
121
|
+
<email>hpotter@JKRowling.com</email>
|
122
|
+
</patron>
|
123
|
+
END
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should set the root node of the document' do
|
128
|
+
xml_doc = ::Libis::Tools::XmlDocument.new
|
129
|
+
patron = ::Nokogiri::XML::Node.new 'patron', xml_doc.document
|
130
|
+
xml_doc.root = patron
|
131
|
+
|
132
|
+
match_xml xml_doc.document, <<-END.align_left
|
133
|
+
<?xml version="1.0" encoding="utf-8"?>
|
134
|
+
<patron/>
|
135
|
+
END
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should enable Nokogiri Build syntax' do
|
140
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
141
|
+
|
142
|
+
xml_doc.build(xml_doc.root) do
|
143
|
+
# noinspection RubyResolve
|
144
|
+
books do
|
145
|
+
book title: 'Quidditch Through the Ages', author: 'Kennilworthy Whisp', due_date: '1992-4-23'
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
match_xml xml_doc.document, <<-END.align_left
|
150
|
+
<?xml version="1.0" encoding="utf-8"?>
|
151
|
+
<patron>
|
152
|
+
<name>Harry Potter</name>
|
153
|
+
<barcode library="Hogwarts Library">1234567890</barcode>
|
154
|
+
<access_level>student</access_level>
|
155
|
+
<email>harry.potter@hogwarts.edu</email>
|
156
|
+
<email>hpotter@JKRowling.com</email>
|
157
|
+
<books>
|
158
|
+
<book title="Quidditch Through the Ages" author="Kennilworthy Whisp" due_date="1992-4-23"/>
|
159
|
+
</books>
|
160
|
+
</patron>
|
161
|
+
END
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'should enable Nokogiri Build syntax for new document' do
|
166
|
+
xml_doc = ::Libis::Tools::XmlDocument.build do
|
167
|
+
# noinspection RubyResolve
|
168
|
+
patron {
|
169
|
+
name 'Harry Potter'
|
170
|
+
barcode( '1234567890', library: 'Hogwarts Library')
|
171
|
+
access_level 'student'
|
172
|
+
email 'harry.potter@hogwarts.edu'
|
173
|
+
email 'hpotter@JKRowling.com'
|
174
|
+
# noinspection RubyResolve
|
175
|
+
books {
|
176
|
+
book title: 'Quidditch Through the Ages', author: 'Kennilworthy Whisp', due_date: '1992-4-23'
|
177
|
+
}
|
178
|
+
}
|
179
|
+
end
|
180
|
+
|
181
|
+
match_xml xml_doc.document, <<-END.align_left
|
182
|
+
<?xml version="1.0" encoding="utf-8"?>
|
183
|
+
<patron>
|
184
|
+
<name>Harry Potter</name>
|
185
|
+
<barcode library="Hogwarts Library">1234567890</barcode>
|
186
|
+
<access_level>student</access_level>
|
187
|
+
<email>harry.potter@hogwarts.edu</email>
|
188
|
+
<email>hpotter@JKRowling.com</email>
|
189
|
+
<books>
|
190
|
+
<book title="Quidditch Through the Ages" author="Kennilworthy Whisp" due_date="1992-4-23"/>
|
191
|
+
</books>
|
192
|
+
</patron>
|
193
|
+
END
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'should add a new node to the document' do
|
198
|
+
xml_doc = ::Libis::Tools::XmlDocument.new
|
199
|
+
|
200
|
+
xml_doc.add_node :patron
|
201
|
+
xml_doc.add_node :name, 'Harry Potter'
|
202
|
+
books = xml_doc.add_node :books, nil, nil, namespaces: { jkr: 'http://JKRowling.com' , node_ns: 'jkr' }
|
203
|
+
xml_doc.add_node :book, nil, books,
|
204
|
+
title: 'Quidditch Through the Ages', author: 'Kennilworthy Whisp', due_date: '1992-4-23',
|
205
|
+
namespaces: {node_ns: 'jkr'}
|
206
|
+
|
207
|
+
match_xml xml_doc.document, <<-END.align_left
|
208
|
+
<?xml version="1.0" encoding="utf-8"?>
|
209
|
+
<patron>
|
210
|
+
<name>Harry Potter</name>
|
211
|
+
<jkr:books xmlns:jkr="http://JKRowling.com">
|
212
|
+
<jkr:book author="Kennilworthy Whisp" due_date="1992-4-23" title="Quidditch Through the Ages"/>
|
213
|
+
</jkr:books>
|
214
|
+
</patron>
|
215
|
+
END
|
216
|
+
|
217
|
+
expect(xml_doc.root.name).to eq 'patron'
|
218
|
+
expect(xml_doc.root.children.size).to be 2
|
219
|
+
expect(xml_doc.root.children[0].name).to eq 'name'
|
220
|
+
expect(xml_doc.root.children[0].content).to eq 'Harry Potter'
|
221
|
+
expect(xml_doc.root.children[1].name).to eq 'books'
|
222
|
+
expect(xml_doc.root.children[1].namespace.prefix).to eq 'jkr'
|
223
|
+
expect(xml_doc.root.children[1].namespace.href).to eq 'http://JKRowling.com'
|
224
|
+
expect(xml_doc.root.children[1].namespaces.size).to be 1
|
225
|
+
expect(xml_doc.root.children[1].namespaces['xmlns:jkr']).to eq 'http://JKRowling.com'
|
226
|
+
expect(xml_doc.root.children[1].children.size).to be 1
|
227
|
+
expect(xml_doc.root.children[1].children[0].name).to eq 'book'
|
228
|
+
expect(xml_doc.root.children[1].children[0].namespace.prefix).to eq 'jkr'
|
229
|
+
expect(xml_doc.root.children[1].children[0].namespace.href).to eq 'http://JKRowling.com'
|
230
|
+
expect(xml_doc.root.children[1].children[0]['title']).to eq 'Quidditch Through the Ages'
|
231
|
+
expect(xml_doc.root.children[1].children[0]['author']).to eq 'Kennilworthy Whisp'
|
232
|
+
expect(xml_doc.root.children[1].children[0]['due_date']).to eq '1992-4-23'
|
233
|
+
|
234
|
+
end
|
235
|
+
|
236
|
+
it 'should add attributes to a node' do
|
237
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
238
|
+
|
239
|
+
xml_doc.add_attributes xml_doc.root, id: '123456', status: 'active'
|
240
|
+
|
241
|
+
match_xml xml_doc.document, <<-END.align_left
|
242
|
+
<?xml version="1.0" encoding="utf-8"?>
|
243
|
+
<patron status="active" id="123456">
|
244
|
+
<name>Harry Potter</name>
|
245
|
+
<barcode library="Hogwarts Library">1234567890</barcode>
|
246
|
+
<access_level>student</access_level>
|
247
|
+
<email>harry.potter@hogwarts.edu</email>
|
248
|
+
<email>hpotter@JKRowling.com</email>
|
249
|
+
</patron>
|
250
|
+
END
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'should add namespaces to a node' do
|
255
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
256
|
+
|
257
|
+
xml_doc.add_namespaces xml_doc.root, jkr: 'http://JKRowling.com', node_ns: 'jkr'
|
258
|
+
# noinspection RubyResolve
|
259
|
+
xml_doc.add_namespaces xml_doc.barcode, nil => 'http://hogwarts.edu'
|
260
|
+
|
261
|
+
match_xml xml_doc.document, <<-END.align_left
|
262
|
+
<?xml version="1.0" encoding="utf-8"?>
|
263
|
+
<jkr:patron xmlns:jkr="http://JKRowling.com">
|
264
|
+
<name>Harry Potter</name>
|
265
|
+
<barcode library="Hogwarts Library" xmlns="http://hogwarts.edu">1234567890</barcode>
|
266
|
+
<access_level>student</access_level>
|
267
|
+
<email>harry.potter@hogwarts.edu</email>
|
268
|
+
<email>hpotter@JKRowling.com</email>
|
269
|
+
</jkr:patron>
|
270
|
+
END
|
271
|
+
|
272
|
+
expect(xml_doc.document.root.namespace.prefix).to eq 'jkr'
|
273
|
+
expect(xml_doc.document.root.namespace.href).to eq 'http://JKRowling.com'
|
274
|
+
expect(xml_doc.document.root.elements[1].namespace.prefix).to be_nil
|
275
|
+
expect(xml_doc.document.root.elements[1].namespace.href).to eq 'http://hogwarts.edu'
|
276
|
+
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'should search for nodes in the current document root' do
|
280
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
281
|
+
|
282
|
+
nodes = xml_doc.xpath('//email')
|
283
|
+
expect(nodes.size).to be 2
|
284
|
+
expect(nodes.map(&:content)).to eq %w'harry.potter@hogwarts.edu hpotter@JKRowling.com'
|
285
|
+
|
286
|
+
end
|
287
|
+
|
288
|
+
it 'should check if the XML document contains certain element(s)' do
|
289
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
290
|
+
|
291
|
+
expect(xml_doc.has_element? 'barcode[@library="Hogwarts Library"]').to be_truthy
|
292
|
+
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'should return the content of the first element found' do
|
296
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
297
|
+
|
298
|
+
expect(xml_doc.value('//email')).to eq 'harry.potter@hogwarts.edu'
|
299
|
+
|
300
|
+
end
|
301
|
+
|
302
|
+
it 'should return the content of all elements found' do
|
303
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
304
|
+
|
305
|
+
expect(xml_doc.values('//email')).to eq %w'harry.potter@hogwarts.edu hpotter@JKRowling.com'
|
306
|
+
|
307
|
+
end
|
308
|
+
|
309
|
+
it 'should return the content of the first element in the set of nodes' do
|
310
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
311
|
+
|
312
|
+
expect(::Libis::Tools::XmlDocument.get_content(xml_doc.xpath('//email'))).to eq 'harry.potter@hogwarts.edu'
|
313
|
+
end
|
314
|
+
|
315
|
+
it 'should Find a node and set its content' do
|
316
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
317
|
+
|
318
|
+
xml_doc['//access_level'] = 'postgraduate'
|
319
|
+
|
320
|
+
match_xml xml_doc.document, <<-END.align_left
|
321
|
+
<?xml version="1.0" encoding="utf-8"?>
|
322
|
+
<patron>
|
323
|
+
<name>Harry Potter</name>
|
324
|
+
<barcode library="Hogwarts Library">1234567890</barcode>
|
325
|
+
<access_level>postgraduate</access_level>
|
326
|
+
<email>harry.potter@hogwarts.edu</email>
|
327
|
+
<email>hpotter@JKRowling.com</email>
|
328
|
+
</patron>
|
329
|
+
END
|
330
|
+
|
331
|
+
end
|
332
|
+
|
333
|
+
# noinspection RubyResolve
|
334
|
+
it 'should allow node access by method name' do
|
335
|
+
xml_doc = ::Libis::Tools::XmlDocument.open(test_file)
|
336
|
+
|
337
|
+
expect(xml_doc.email.content).to eq 'harry.potter@hogwarts.edu'
|
338
|
+
expect(xml_doc.barcode 'library').to eq 'Hogwarts Library'
|
339
|
+
|
340
|
+
xml_doc.access_level = 'postgraduate'
|
341
|
+
xml_doc.barcode 'library', 'Hogwarts Dumbledore Library'
|
342
|
+
# noinspection RubyResolve
|
343
|
+
xml_doc.dates do |dates|
|
344
|
+
dates.birth_date '1980-07-31'
|
345
|
+
dates.member_since '1991-09-01'
|
346
|
+
end
|
347
|
+
|
348
|
+
match_xml xml_doc.document, <<-END.align_left
|
349
|
+
<?xml version="1.0" encoding="utf-8"?>
|
350
|
+
<patron>
|
351
|
+
<name>Harry Potter</name>
|
352
|
+
<barcode library="Hogwarts Dumbledore Library">1234567890</barcode>
|
353
|
+
<access_level>postgraduate</access_level>
|
354
|
+
<email>harry.potter@hogwarts.edu</email>
|
355
|
+
<email>hpotter@JKRowling.com</email>
|
356
|
+
<dates>
|
357
|
+
<birth_date>1980-07-31</birth_date>
|
358
|
+
<member_since>1991-09-01</member_since>
|
359
|
+
</dates>
|
360
|
+
</patron>
|
361
|
+
END
|
362
|
+
|
363
|
+
end
|
364
|
+
|
365
|
+
it 'should work' do
|
366
|
+
xml_doc = ::Libis::Tools::XmlDocument.parse(<<-END.align_left)
|
367
|
+
<patron>
|
368
|
+
<name>Harry Potter</name>
|
369
|
+
<barcode library="Hogwarts Library">1234567890</barcode>
|
370
|
+
<access_level>student</access_level>
|
371
|
+
<email>harry.potter@hogwarts.edu</email>
|
372
|
+
<email>hpotter@JKRowling.com</email>
|
373
|
+
</patron>
|
374
|
+
END
|
375
|
+
|
376
|
+
match_xml xml_doc.document, @xml_template
|
377
|
+
|
378
|
+
xml_doc.save('/tmp/test.xml')
|
379
|
+
|
380
|
+
xml_doc = ::Libis::Tools::XmlDocument.open('/tmp/test.xml')
|
381
|
+
|
382
|
+
match_xml xml_doc.document, @xml_template
|
383
|
+
|
384
|
+
xml_doc = ::Libis::Tools::XmlDocument.build do
|
385
|
+
# noinspection RubyResolve
|
386
|
+
patron {
|
387
|
+
name 'Harry Potter'
|
388
|
+
barcode( '1234567890', library: 'Hogwarts Library')
|
389
|
+
access_level 'student'
|
390
|
+
email 'harry.potter@hogwarts.edu'
|
391
|
+
email 'hpotter@JKRowling.com'
|
392
|
+
}
|
393
|
+
end
|
394
|
+
|
395
|
+
match_xml xml_doc.document, @xml_template
|
396
|
+
|
397
|
+
xml_doc = ::Libis::Tools::XmlDocument.new
|
398
|
+
xml_doc.add_node :patron
|
399
|
+
xml_doc.name = 'Harry Potter'
|
400
|
+
# noinspection RubyResolve
|
401
|
+
xml_doc.barcode = '1234567890'
|
402
|
+
# noinspection RubyResolve
|
403
|
+
xml_doc.barcode :library, 'Hogwarts Library'
|
404
|
+
# noinspection RubyResolve
|
405
|
+
xml_doc.access_level = 'student'
|
406
|
+
xml_doc.email = 'harry.potter@hogwarts.edu'
|
407
|
+
xml_doc.add_node :email, 'hpotter@JKRowling.com'
|
408
|
+
|
409
|
+
match_xml xml_doc.document, @xml_template
|
410
|
+
|
411
|
+
end
|
412
|
+
|
413
|
+
end
|