roxml 3.1.1 → 3.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +12 -0
- data/LICENSE +20 -0
- data/README.rdoc +15 -0
- data/TODO +1 -5
- data/VERSION +1 -1
- data/lib/roxml.rb +16 -9
- data/lib/roxml/xml/references.rb +20 -14
- data/roxml.gemspec +3 -3
- data/spec/definition_spec.rb +9 -1
- data/spec/xml/namespace_spec.rb +47 -18
- data/spec/xml/namespaces_spec.rb +52 -24
- data/tasks/rdoc.rake +1 -1
- data/tasks/test.rake +5 -12
- metadata +3 -3
- data/MIT-LICENSE +0 -18
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
== 3.1.2 (October 18, 2009)
|
2
|
+
|
3
|
+
* minor enhancements
|
4
|
+
|
5
|
+
* Retain whitespace in element contents, but still default on blank (rather than entirely empty) elements
|
6
|
+
|
7
|
+
* bug fixes
|
8
|
+
|
9
|
+
* Include namespaces in xml output
|
10
|
+
* Fix that auto-wrapped collections weren't output with their wrappers
|
11
|
+
(which requires introducing the roxml_references accessor on the instance)
|
12
|
+
|
1
13
|
== 3.1.1 (October 17, 2009)
|
2
14
|
|
3
15
|
* bug fix
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2004-2009 Ben Woosley, Zak Mandhro and Anders Engstrom
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -159,3 +159,18 @@ explicitly require one or the other, you may do the following:
|
|
159
159
|
require 'roxml'
|
160
160
|
|
161
161
|
For more information on available annotations, see ROXML::ClassMethods::Declarations
|
162
|
+
|
163
|
+
== Note on Patches/Pull Requests
|
164
|
+
|
165
|
+
* Fork the project.
|
166
|
+
* Make your feature addition or bug fix.
|
167
|
+
* Add specs for it. This is important so I don't break it in a
|
168
|
+
future version unintentionally.
|
169
|
+
* Commit, do not mess with rakefile, version, or history.
|
170
|
+
(if you want to have your own version, that is fine but
|
171
|
+
bump version in a commit by itself I can ignore when I pull)
|
172
|
+
* Send me a pull request. Bonus points for topic branches.
|
173
|
+
|
174
|
+
== Copyright
|
175
|
+
|
176
|
+
Copyright (c) 2004-2009 Ben Woosley, Zak Mandhro and Anders Engstrom. See LICENSE for details.
|
data/TODO
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
Planned:
|
2
2
|
|
3
|
-
v 3.
|
4
|
-
|
5
|
-
* Add xml_namespaces to allow declaration of distinct prefx/url namespace pairs
|
3
|
+
v 3.2
|
6
4
|
|
7
5
|
* Consider class_inheritable_attribute rather than superclass.try stuff.
|
8
6
|
|
@@ -35,5 +33,3 @@ v 3.x
|
|
35
33
|
a singular specification has multiple possible node references
|
36
34
|
|
37
35
|
* Use lazy evaluation to minimize parsing time for large files
|
38
|
-
|
39
|
-
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.2
|
data/lib/roxml.rb
CHANGED
@@ -13,15 +13,20 @@ module ROXML # :nodoc:
|
|
13
13
|
ClassMethods::Declarations,
|
14
14
|
ClassMethods::Operations
|
15
15
|
include InstanceMethods
|
16
|
+
|
17
|
+
attr_accessor :roxml_references
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
21
|
module InstanceMethods # :nodoc:
|
20
22
|
# Returns an XML object representing this object
|
21
|
-
def to_xml(
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
def to_xml(params = {})
|
24
|
+
params.reverse_merge!(:name => self.class.tag_name, :namespace => self.class.roxml_namespace)
|
25
|
+
XML::Node.create([params[:namespace], params[:name]].compact.join(':')).tap do |root|
|
26
|
+
refs = (self.roxml_references.present? \
|
27
|
+
? self.roxml_references \
|
28
|
+
: self.class.roxml_attrs.map {|attr| attr.to_ref(self) })
|
29
|
+
refs.each do |ref|
|
25
30
|
value = ref.to_xml(self)
|
26
31
|
unless value.nil?
|
27
32
|
ref.update_xml(root, value)
|
@@ -530,11 +535,13 @@ module ROXML # :nodoc:
|
|
530
535
|
xml = XML::Node.from(data)
|
531
536
|
|
532
537
|
new(*initialization_args).tap do |inst|
|
533
|
-
roxml_attrs.
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
+
inst.roxml_references = roxml_attrs.map {|attr| attr.to_ref(inst) }
|
539
|
+
|
540
|
+
inst.roxml_references.each do |ref|
|
541
|
+
value = ref.value_in(xml)
|
542
|
+
inst.respond_to?(ref.opts.setter) \
|
543
|
+
? inst.send(ref.opts.setter, value) \
|
544
|
+
: inst.instance_variable_set(ref.opts.instance_variable_name, value)
|
538
545
|
end
|
539
546
|
inst.send(:after_parse) if inst.respond_to?(:after_parse, true)
|
540
547
|
end
|
data/lib/roxml/xml/references.rb
CHANGED
@@ -6,6 +6,7 @@ module ROXML
|
|
6
6
|
# Internal base class that represents an XML - Class binding.
|
7
7
|
#
|
8
8
|
class XMLRef # :nodoc:
|
9
|
+
attr_reader :opts
|
9
10
|
delegate :required?, :array?, :blocks, :accessor, :default, :wrapper, :to => :opts
|
10
11
|
|
11
12
|
def initialize(opts, instance)
|
@@ -41,8 +42,6 @@ module ROXML
|
|
41
42
|
end
|
42
43
|
|
43
44
|
private
|
44
|
-
attr_reader :opts
|
45
|
-
|
46
45
|
def conventionize(what)
|
47
46
|
convention ||= @instance.class.respond_to?(:roxml_naming_convention) && @instance.class.roxml_naming_convention
|
48
47
|
if !what.blank? && convention.respond_to?(:call)
|
@@ -84,8 +83,12 @@ module ROXML
|
|
84
83
|
opts.wrapper ? "#{namespacify(opts.wrapper)}/#{xpath_name}" : xpath_name.to_s
|
85
84
|
end
|
86
85
|
|
86
|
+
def auto_wrapper
|
87
|
+
namespacify(conventionize(opts.name.pluralize))
|
88
|
+
end
|
89
|
+
|
87
90
|
def auto_xpath
|
88
|
-
"#{
|
91
|
+
"#{auto_wrapper}/#{xpath_name}" if array?
|
89
92
|
end
|
90
93
|
|
91
94
|
def several?
|
@@ -93,11 +96,13 @@ module ROXML
|
|
93
96
|
end
|
94
97
|
|
95
98
|
def wrap(xml)
|
96
|
-
|
97
|
-
|
99
|
+
wrap_with = @auto_vals ? auto_wrapper : wrapper
|
100
|
+
|
101
|
+
return xml if !wrap_with || xml.name == wrap_with
|
102
|
+
if child = xml.children.find {|c| c.name == wrap_with }
|
98
103
|
return child
|
99
104
|
end
|
100
|
-
xml.add_child(XML::Node.create(
|
105
|
+
xml.add_child(XML::Node.create(wrap_with.to_s))
|
101
106
|
end
|
102
107
|
|
103
108
|
def nodes_in(xml)
|
@@ -166,10 +171,10 @@ module ROXML
|
|
166
171
|
xml.name = value
|
167
172
|
elsif array?
|
168
173
|
value.each do |v|
|
169
|
-
add(xml.add_child(XML::Node.create(
|
174
|
+
add(xml.add_child(XML::Node.create(xpath_name)), v)
|
170
175
|
end
|
171
176
|
else
|
172
|
-
add(xml.add_child(XML::Node.create(
|
177
|
+
add(xml.add_child(XML::Node.create(xpath_name)), value)
|
173
178
|
end
|
174
179
|
end
|
175
180
|
|
@@ -177,12 +182,12 @@ module ROXML
|
|
177
182
|
if content? || name?
|
178
183
|
value =
|
179
184
|
if content?
|
180
|
-
xml.content.to_s
|
185
|
+
xml.content.to_s
|
181
186
|
elsif name?
|
182
187
|
xml.name
|
183
188
|
end
|
184
189
|
|
185
|
-
if value.
|
190
|
+
if value.blank?
|
186
191
|
raise RequiredElementMissing, "#{name} from #{xml} for #{accessor}" if required?
|
187
192
|
default
|
188
193
|
else
|
@@ -190,7 +195,7 @@ module ROXML
|
|
190
195
|
end
|
191
196
|
else
|
192
197
|
nodes_in(xml) do |node|
|
193
|
-
node.content
|
198
|
+
node.content
|
194
199
|
end
|
195
200
|
end
|
196
201
|
end
|
@@ -271,14 +276,15 @@ module ROXML
|
|
271
276
|
# Updates the composed XML object in the given XML block to
|
272
277
|
# the value provided.
|
273
278
|
def write_xml(xml, value)
|
279
|
+
params = {:name => name, :namespace => opts.namespace}
|
274
280
|
if array?
|
275
281
|
value.each do |v|
|
276
|
-
xml.add_child(v.to_xml(
|
282
|
+
xml.add_child(v.to_xml(params))
|
277
283
|
end
|
278
284
|
elsif value.is_a?(ROXML)
|
279
|
-
xml.add_child(value.to_xml(
|
285
|
+
xml.add_child(value.to_xml(params))
|
280
286
|
else
|
281
|
-
node = XML::Node.create(
|
287
|
+
node = XML::Node.create(xpath_name)
|
282
288
|
node.content = value.to_xml
|
283
289
|
xml.add_child(node)
|
284
290
|
end
|
data/roxml.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{roxml}
|
8
|
-
s.version = "3.1.
|
8
|
+
s.version = "3.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ben Woosley", "Zak Mandhro", "Anders Engstrom", "Russ Olsen"]
|
12
|
-
s.date = %q{2009-10-
|
12
|
+
s.date = %q{2009-10-18}
|
13
13
|
s.description = %q{ROXML is a Ruby library designed to make it easier for Ruby developers to work with XML.
|
14
14
|
Using simple annotations, it enables Ruby classes to be mapped to XML. ROXML takes care
|
15
15
|
of the marshalling and unmarshalling of mapped attributes so that developers can focus on
|
@@ -25,7 +25,7 @@ RESTful applications, Web Services, and XML-RPC.
|
|
25
25
|
".gitignore",
|
26
26
|
".gitmodules",
|
27
27
|
"History.txt",
|
28
|
-
"
|
28
|
+
"LICENSE",
|
29
29
|
"README.rdoc",
|
30
30
|
"Rakefile",
|
31
31
|
"TODO",
|
data/spec/definition_spec.rb
CHANGED
@@ -51,7 +51,15 @@ describe ROXML::Definition do
|
|
51
51
|
<question>"Wickard & Filburn" ></question>
|
52
52
|
<question> < McCulloch & Maryland?</question>
|
53
53
|
</xml>
|
54
|
-
}).should == ["\"Wickard & Filburn\" >", "< McCulloch & Maryland?"]
|
54
|
+
}).should == ["\"Wickard & Filburn\" >", " < McCulloch & Maryland?"]
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should unescape utf characters in xml" do
|
58
|
+
ROXML::Definition.new(:questions, :as => []).to_ref(RoxmlObject.new).value_in(%{
|
59
|
+
<xml>
|
60
|
+
<question>ROXML\342\204\242</question>
|
61
|
+
</xml>
|
62
|
+
}).should == ["ROXML™"]
|
55
63
|
end
|
56
64
|
|
57
65
|
describe "attr name" do
|
data/spec/xml/namespace_spec.rb
CHANGED
@@ -1,32 +1,61 @@
|
|
1
1
|
require 'spec/spec_helper.rb'
|
2
2
|
|
3
3
|
describe ROXML, "with namespaces" do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
describe "for writing" do
|
5
|
+
before do
|
6
|
+
@xml = <<EOS
|
7
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
8
|
+
<gronk:VApp name="My new vApp" status="1" href="https://vcloud.example.com/vapp/833" type="application/vnd.vmware.vcloud.vapp+xml" xmlns:vmw="http://foo.example.com" xmlns:gronk="http://gronk.example.com">
|
9
|
+
<gronk:NetworkConfig name="Network 1">
|
10
|
+
<vmw:FenceMode>allowInOut</vmw:FenceMode>
|
11
|
+
<vmw:Dhcp>true</vmw:Dhcp>
|
12
|
+
<gronk:errors>
|
13
|
+
<gronk:error>OhNo!</gronk:error>
|
14
|
+
<gronk:error>Another!</gronk:error>
|
15
|
+
</gronk:errors>
|
16
|
+
</gronk:NetworkConfig>
|
17
|
+
<foo />
|
18
|
+
<bar>
|
19
|
+
gronk
|
20
|
+
</bar>
|
21
|
+
</gronk:VApp>
|
22
|
+
EOS
|
23
|
+
end
|
7
24
|
|
8
|
-
|
9
|
-
|
10
|
-
|
25
|
+
class NetworkConfig
|
26
|
+
include ROXML
|
27
|
+
xml_namespace :gronk
|
28
|
+
|
29
|
+
xml_name 'NetworkConfig'
|
30
|
+
xml_reader :name, :from => '@name'
|
31
|
+
xml_reader :errors, :as => []
|
32
|
+
xml_accessor :fence_mode, :from => 'vmw:FenceMode'
|
33
|
+
xml_accessor :dhcp?, :from => 'vmw:Dhcp'
|
11
34
|
end
|
12
|
-
|
13
|
-
context "where the missing namespace is included in a namespacey from" do
|
14
|
-
it "should raise"
|
15
35
|
|
16
|
-
|
17
|
-
|
18
|
-
|
36
|
+
class VApp
|
37
|
+
include ROXML
|
38
|
+
xml_namespace :gronk
|
39
|
+
|
40
|
+
xml_name "VApp"
|
41
|
+
xml_reader :name, :from => '@name'
|
42
|
+
xml_reader :status, :from => '@status'
|
43
|
+
xml_reader :href, :from => '@href'
|
44
|
+
xml_reader :type, :from => '@type'
|
45
|
+
xml_accessor :foo, :from => 'foo', :namespace => false
|
46
|
+
xml_accessor :bar, :from => 'bar', :namespace => false
|
47
|
+
xml_accessor :network_configs, :as => [NetworkConfig], :namespace => :gronk
|
19
48
|
end
|
20
|
-
|
21
|
-
context "where the missing namespace is included in an explicit :namespace" do
|
22
|
-
it "should raise"
|
23
49
|
|
24
|
-
|
25
|
-
|
50
|
+
describe "#to_xml" do
|
51
|
+
it "should reproduce the input xml" do
|
52
|
+
output = ROXML::XML::Document.new
|
53
|
+
output.root = VApp.from_xml(@xml).to_xml
|
54
|
+
output.should == ROXML::XML::Parser.parse(@xml)
|
26
55
|
end
|
27
56
|
end
|
28
57
|
end
|
29
|
-
|
58
|
+
|
30
59
|
describe "roxml namespacey declaration", :shared => true do
|
31
60
|
context "with a namespacey :from" do
|
32
61
|
context "and an explicit :namespace" do
|
data/spec/xml/namespaces_spec.rb
CHANGED
@@ -1,32 +1,60 @@
|
|
1
1
|
require 'spec/spec_helper.rb'
|
2
2
|
|
3
3
|
describe ROXML, "#xml_namespaces" do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
4
|
+
describe "for reading" do
|
5
|
+
class Tires
|
6
|
+
include ROXML
|
7
|
+
|
8
|
+
xml_namespaces \
|
9
|
+
:bobsbike => 'http://bobsbikes.example.com',
|
10
|
+
:alicesauto => 'http://alicesautosupply.example.com/'
|
11
|
+
|
12
|
+
xml_reader :bike_tires, :as => [], :from => '@name', :in => 'bobsbike:tire'
|
13
|
+
xml_reader :car_tires, :as => [], :from => '@name', :in => 'alicesauto:tire'
|
14
|
+
end
|
15
|
+
|
16
|
+
before do
|
17
|
+
@xml = %{<?xml version="1.0"?>
|
18
|
+
<inventory xmlns="http://alicesautosupply.example.com/" xmlns:bike="http://bobsbikes.example.com">
|
19
|
+
<tire name="super slick racing tire" />
|
20
|
+
<tire name="all weather tire" />
|
21
|
+
<bike:tire name="skinny street" />
|
22
|
+
</inventory>
|
23
|
+
}
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
26
|
+
it "should remap default namespaces" do
|
27
|
+
Tires.from_xml(@xml).car_tires.should =~ ['super slick racing tire', 'all weather tire']
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should remap prefix namespaces" do
|
31
|
+
Tires.from_xml(@xml).bike_tires.should == ['skinny street']
|
32
|
+
end
|
27
33
|
end
|
28
34
|
|
29
|
-
|
30
|
-
|
35
|
+
context "when an included namespace is not defined in the xml" do
|
36
|
+
context "where the missing namespace is the default" do
|
37
|
+
it "should raise"
|
38
|
+
|
39
|
+
context "but the namespace is declared in the body" do
|
40
|
+
it "should succeed"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "where the missing namespace is included in a namespacey from" do
|
45
|
+
it "should raise"
|
46
|
+
|
47
|
+
context "but the namespace is declared in the body" do
|
48
|
+
it "should succeed"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "where the missing namespace is included in an explicit :namespace" do
|
53
|
+
it "should raise"
|
54
|
+
|
55
|
+
context "but the namespace is declared in the body" do
|
56
|
+
it "should succeed"
|
57
|
+
end
|
58
|
+
end
|
31
59
|
end
|
32
60
|
end
|
data/tasks/rdoc.rake
CHANGED
data/tasks/test.rake
CHANGED
@@ -1,30 +1,23 @@
|
|
1
1
|
require 'rake/testtask'
|
2
|
-
Rake::TestTask.new(:bugs) do |test|
|
3
|
-
test.libs << 'lib' << 'test'
|
4
|
-
test.pattern = 'test/bugs/*_bugs.rb'
|
5
|
-
test.verbose = true
|
6
|
-
end
|
7
|
-
|
8
2
|
desc "Test ROXML using the default parser selection behavior"
|
9
3
|
task :test do
|
10
4
|
require 'rake/runtest'
|
5
|
+
$LOAD_PATH << 'lib'
|
11
6
|
Rake.run_tests 'test/unit/*_test.rb'
|
12
7
|
end
|
13
8
|
|
14
9
|
namespace :test do
|
15
10
|
desc "Test ROXML under the Nokogiri parser"
|
16
11
|
task :nokogiri do
|
17
|
-
|
18
|
-
|
19
|
-
end
|
12
|
+
$LOAD_PATH << 'spec'
|
13
|
+
require 'spec/support/nokogiri'
|
20
14
|
Rake::Task["test"].invoke
|
21
15
|
end
|
22
16
|
|
23
17
|
desc "Test ROXML under the LibXML parser"
|
24
18
|
task :libxml do
|
25
|
-
|
26
|
-
|
27
|
-
end
|
19
|
+
$LOAD_PATH << 'spec'
|
20
|
+
require 'spec/support/libxml'
|
28
21
|
Rake::Task["test"].invoke
|
29
22
|
end
|
30
23
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roxml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Woosley
|
@@ -12,7 +12,7 @@ autorequire:
|
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
14
|
|
15
|
-
date: 2009-10-
|
15
|
+
date: 2009-10-18 00:00:00 -04:00
|
16
16
|
default_executable:
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
@@ -84,7 +84,7 @@ files:
|
|
84
84
|
- .gitignore
|
85
85
|
- .gitmodules
|
86
86
|
- History.txt
|
87
|
-
-
|
87
|
+
- LICENSE
|
88
88
|
- README.rdoc
|
89
89
|
- Rakefile
|
90
90
|
- TODO
|
data/MIT-LICENSE
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
The MIT License
|
2
|
-
|
3
|
-
Copyright (c) 2004-2009 by Ben Woosley, Zak Mandhro and Anders Engstrom
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
6
|
-
and associated documentation files (the "Software"), to deal in the Software without restriction,
|
7
|
-
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
8
|
-
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
9
|
-
subject to the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be included in all copies or substantial
|
12
|
-
portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
15
|
-
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
|
16
|
-
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
17
|
-
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
18
|
-
USE OR OTHER DEALINGS IN THE SOFTWARE.
|