libxml-ruby 2.3.3 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +11 -0
- data/ext/libxml/ruby_xml_document.c +2 -3
- data/ext/libxml/ruby_xml_encoding.c +4 -4
- data/ext/libxml/ruby_xml_node.c +10 -2
- data/ext/libxml/ruby_xml_schema.c +190 -0
- data/ext/libxml/ruby_xml_schema.h +799 -1
- data/ext/libxml/ruby_xml_schema_attribute.c +109 -0
- data/ext/libxml/ruby_xml_schema_attribute.h +15 -0
- data/ext/libxml/ruby_xml_schema_element.c +94 -0
- data/ext/libxml/ruby_xml_schema_element.h +14 -0
- data/ext/libxml/ruby_xml_schema_facet.c +52 -0
- data/ext/libxml/ruby_xml_schema_facet.h +13 -0
- data/ext/libxml/ruby_xml_schema_type.c +252 -0
- data/ext/libxml/ruby_xml_schema_type.h +9 -0
- data/ext/libxml/ruby_xml_version.h +4 -4
- data/lib/libxml.rb +6 -0
- data/lib/libxml/schema.rb +67 -0
- data/lib/libxml/schema/attribute.rb +19 -0
- data/lib/libxml/schema/element.rb +27 -0
- data/lib/libxml/schema/type.rb +29 -0
- data/test/model/shiporder.xsd +37 -28
- data/test/tc_encoding.rb +6 -1
- data/test/tc_html_parser.rb +1 -1
- data/test/tc_node.rb +8 -1
- data/test/tc_schema.rb +76 -4
- metadata +14 -2
@@ -1,9 +1,9 @@
|
|
1
1
|
/* Don't nuke this block! It is used for automatically updating the
|
2
2
|
* versions below. VERSION = string formatting, VERNUM = numbered
|
3
3
|
* version for inline testing: increment both or none at all.*/
|
4
|
-
#define RUBY_LIBXML_VERSION "2.
|
5
|
-
#define RUBY_LIBXML_VERNUM
|
4
|
+
#define RUBY_LIBXML_VERSION "2.4.0"
|
5
|
+
#define RUBY_LIBXML_VERNUM 240
|
6
6
|
#define RUBY_LIBXML_VER_MAJ 2
|
7
|
-
#define RUBY_LIBXML_VER_MIN
|
8
|
-
#define RUBY_LIBXML_VER_MIC
|
7
|
+
#define RUBY_LIBXML_VER_MIN 4
|
8
|
+
#define RUBY_LIBXML_VER_MIC 0
|
9
9
|
#define RUBY_LIBXML_VER_PATCH 0
|
data/lib/libxml.rb
CHANGED
@@ -25,5 +25,11 @@ require 'libxml/sax_parser'
|
|
25
25
|
require 'libxml/sax_callbacks'
|
26
26
|
require 'libxml/xpath_object'
|
27
27
|
|
28
|
+
#Schema Interface
|
29
|
+
require 'libxml/schema'
|
30
|
+
require 'libxml/schema/type'
|
31
|
+
require 'libxml/schema/element'
|
32
|
+
require 'libxml/schema/attribute'
|
33
|
+
|
28
34
|
# Deprecated
|
29
35
|
require 'libxml/properties'
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module LibXML
|
2
|
+
module XML
|
3
|
+
class Schema
|
4
|
+
module Types
|
5
|
+
XML_SCHEMA_TYPE_BASIC = 1 # A built-in datatype
|
6
|
+
XML_SCHEMA_TYPE_ANY = 2
|
7
|
+
XML_SCHEMA_TYPE_FACET = 3
|
8
|
+
XML_SCHEMA_TYPE_SIMPLE = 4
|
9
|
+
XML_SCHEMA_TYPE_COMPLEX = 5
|
10
|
+
XML_SCHEMA_TYPE_SEQUENCE = 6
|
11
|
+
XML_SCHEMA_TYPE_CHOICE = 7
|
12
|
+
XML_SCHEMA_TYPE_ALL = 8
|
13
|
+
XML_SCHEMA_TYPE_SIMPLE_CONTENT = 9
|
14
|
+
XML_SCHEMA_TYPE_COMPLEX_CONTENT = 10
|
15
|
+
XML_SCHEMA_TYPE_UR = 11
|
16
|
+
XML_SCHEMA_TYPE_RESTRICTION = 12
|
17
|
+
XML_SCHEMA_TYPE_EXTENSION = 13
|
18
|
+
XML_SCHEMA_TYPE_ELEMENT = 14
|
19
|
+
XML_SCHEMA_TYPE_ATTRIBUTE = 15
|
20
|
+
XML_SCHEMA_TYPE_ATTRIBUTEGROUP = 16
|
21
|
+
XML_SCHEMA_TYPE_GROUP = 17
|
22
|
+
XML_SCHEMA_TYPE_NOTATION = 18
|
23
|
+
XML_SCHEMA_TYPE_LIST = 19
|
24
|
+
XML_SCHEMA_TYPE_UNION = 20
|
25
|
+
XML_SCHEMA_TYPE_ANY_ATTRIBUTE = 21
|
26
|
+
XML_SCHEMA_TYPE_IDC_UNIQUE = 22
|
27
|
+
XML_SCHEMA_TYPE_IDC_KEY = 23
|
28
|
+
XML_SCHEMA_TYPE_IDC_KEYREF = 24
|
29
|
+
XML_SCHEMA_TYPE_PARTICLE = 25
|
30
|
+
XML_SCHEMA_TYPE_ATTRIBUTE_USE = 26
|
31
|
+
XML_SCHEMA_FACET_MININCLUSIVE = 1000
|
32
|
+
XML_SCHEMA_FACET_MINEXCLUSIVE = 1001
|
33
|
+
XML_SCHEMA_FACET_MAXINCLUSIVE = 1002
|
34
|
+
XML_SCHEMA_FACET_MAXEXCLUSIVE = 1003
|
35
|
+
XML_SCHEMA_FACET_TOTALDIGITS = 1004
|
36
|
+
XML_SCHEMA_FACET_FRACTIONDIGITS = 1005
|
37
|
+
XML_SCHEMA_FACET_PATTERN = 1006
|
38
|
+
XML_SCHEMA_FACET_ENUMERATION = 1007
|
39
|
+
XML_SCHEMA_FACET_WHITESPACE = 1008
|
40
|
+
XML_SCHEMA_FACET_LENGTH = 1009
|
41
|
+
XML_SCHEMA_FACET_MAXLENGTH = 1010
|
42
|
+
XML_SCHEMA_FACET_MINLENGTH = 1011
|
43
|
+
XML_SCHEMA_EXTRA_QNAMEREF = 2000
|
44
|
+
XML_SCHEMA_EXTRA_ATTR_USE_PROHIB = 2001
|
45
|
+
end
|
46
|
+
|
47
|
+
class Namespaces < Array
|
48
|
+
def find_by_href(href)
|
49
|
+
find { |n| n.href == href }
|
50
|
+
end
|
51
|
+
|
52
|
+
def find_by_prefix(prefix)
|
53
|
+
find { |n| n.prefix == prefix }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def namespaces
|
58
|
+
Namespaces.new(_namespaces.uniq { |n| n.href })
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.cached(location)
|
62
|
+
@_schemas ||= {}
|
63
|
+
@_schemas[location] ||= new(location)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module LibXML
|
4
|
+
module XML
|
5
|
+
class Schema::Element
|
6
|
+
def required?
|
7
|
+
!min_occurs.zero?
|
8
|
+
end
|
9
|
+
|
10
|
+
def array?
|
11
|
+
max_occurs > 1
|
12
|
+
end
|
13
|
+
|
14
|
+
def elements
|
15
|
+
type.elements
|
16
|
+
end
|
17
|
+
|
18
|
+
def annotation
|
19
|
+
return if node.nil?
|
20
|
+
annotations = node.children.select { |n| n.name == 'annotation' }
|
21
|
+
annotations.map do |annotation|
|
22
|
+
annotation.children.map(&:content).join("\n")
|
23
|
+
end.join("\n")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module LibXML
|
2
|
+
module XML
|
3
|
+
class Schema::Type
|
4
|
+
def kind_name
|
5
|
+
Schema::Types.constants.find { |k| Schema::Types.const_get(k) == kind }
|
6
|
+
end
|
7
|
+
|
8
|
+
def annotation
|
9
|
+
return if node.nil?
|
10
|
+
annotations = node.children.select { |n| n.name == 'annotation' }
|
11
|
+
annotations.map do |annotation|
|
12
|
+
annotation.children.map(&:content).join("\n")
|
13
|
+
end.join("\n")
|
14
|
+
end
|
15
|
+
|
16
|
+
def annonymus_subtypes
|
17
|
+
elements.select { |_, e| e.type.name.nil? }
|
18
|
+
end
|
19
|
+
|
20
|
+
def annonymus_subtypes_recursively(parent=nil)
|
21
|
+
annonymus_subtypes.map do |element_name, e|
|
22
|
+
[{[parent, element_name].compact.join('::') => e.type},
|
23
|
+
e.type.annonymus_subtypes_recursively(element_name)]
|
24
|
+
end.flatten
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/test/model/shiporder.xsd
CHANGED
@@ -1,31 +1,40 @@
|
|
1
1
|
<?xml version="1.0" encoding="iso-8859-1" ?>
|
2
2
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
3
|
-
<xs:element name="shiporder"
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
<xs:
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
3
|
+
<xs:element name="shiporder" type="shiporder"/>
|
4
|
+
|
5
|
+
<xs:complexType name="shiporder">
|
6
|
+
<xs:annotation>
|
7
|
+
<xs:documentation>Shiporder type documentation</xs:documentation>
|
8
|
+
</xs:annotation>
|
9
|
+
<xs:sequence>
|
10
|
+
<xs:element name="orderperson" type="xs:string">
|
11
|
+
<xs:annotation>
|
12
|
+
<xs:documentation>orderperson element documentation</xs:documentation>
|
13
|
+
</xs:annotation>
|
14
|
+
</xs:element>
|
15
|
+
<xs:element name="shipto">
|
16
|
+
<xs:complexType>
|
17
|
+
<xs:sequence>
|
18
|
+
<xs:element name="name" type="xs:string"/>
|
19
|
+
<xs:element name="address" type="xs:string"/>
|
20
|
+
<xs:element name="city" type="xs:string"/>
|
21
|
+
<xs:element name="country" type="xs:string"/>
|
22
|
+
</xs:sequence>
|
23
|
+
</xs:complexType>
|
24
|
+
</xs:element>
|
25
|
+
<xs:element name="item" maxOccurs="unbounded">
|
26
|
+
<xs:complexType>
|
27
|
+
<xs:sequence>
|
28
|
+
<xs:element name="title" type="xs:string"/>
|
29
|
+
<xs:element name="note" type="xs:string" minOccurs="0"/>
|
30
|
+
<xs:element name="quantity" type="xs:positiveInteger"/>
|
31
|
+
<xs:element name="price" type="xs:decimal"/>
|
32
|
+
</xs:sequence>
|
33
|
+
</xs:complexType>
|
34
|
+
</xs:element>
|
35
|
+
</xs:sequence>
|
36
|
+
<xs:attribute name="orderid" type="xs:string" use="required"/>
|
37
|
+
<xs:attribute name="foo" default="1" type="xs:integer" use="optional"/>
|
38
|
+
<xs:attribute name="bar" use="prohibited"/>
|
39
|
+
</xs:complexType>
|
31
40
|
</xs:schema>
|
data/test/tc_encoding.rb
CHANGED
@@ -118,4 +118,9 @@ class TestEncoding < Test::Unit::TestCase
|
|
118
118
|
assert_equal("109 246 116 108 101 121 95 99 114 252 101",
|
119
119
|
name.bytes.to_a.join(" "))
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
|
+
def test_encoding_conversions
|
123
|
+
assert_equal("UTF-8", XML::Encoding.to_s(XML::Encoding::UTF_8))
|
124
|
+
assert_equal(XML::Encoding::UTF_8, XML::Encoding.from_s("UTF-8"))
|
125
|
+
end
|
126
|
+
end
|
data/test/tc_html_parser.rb
CHANGED
@@ -99,7 +99,7 @@ class HTMLParserTest < Test::Unit::TestCase
|
|
99
99
|
<body>Hello<br>World</html>
|
100
100
|
EOS
|
101
101
|
|
102
|
-
parser = XML::HTMLParser.string(html)
|
102
|
+
parser = XML::HTMLParser.string(html, :options => XML::HTMLParser::Options::NOBLANKS)
|
103
103
|
doc = parser.parse
|
104
104
|
assert_instance_of XML::Document, doc
|
105
105
|
|
data/test/tc_node.rb
CHANGED
@@ -206,4 +206,11 @@ class TestNode < Test::Unit::TestCase
|
|
206
206
|
text_node = node.first
|
207
207
|
assert(text_node.empty?)
|
208
208
|
end
|
209
|
-
|
209
|
+
|
210
|
+
def test_set_content
|
211
|
+
node = XML::Node.new('test')
|
212
|
+
node.content = "unescaped & string"
|
213
|
+
assert_equal("unescaped & string", node.content)
|
214
|
+
assert_equal("<test>unescaped & string</test>", node.to_s)
|
215
|
+
end
|
216
|
+
end
|
data/test/tc_schema.rb
CHANGED
@@ -8,17 +8,17 @@ class TestSchema < Test::Unit::TestCase
|
|
8
8
|
file = File.join(File.dirname(__FILE__), 'model/shiporder.xml')
|
9
9
|
@doc = XML::Document.file(file)
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def teardown
|
13
13
|
@doc = nil
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def schema
|
17
17
|
document = XML::Document.file(File.join(File.dirname(__FILE__), 'model/shiporder.xsd'))
|
18
18
|
XML::Schema.document(document)
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
def check_error(error)
|
22
22
|
assert_not_nil(error)
|
23
23
|
assert(error.message.match(/Error: Element 'invalid': This element is not expected. Expected is \( item \)/))
|
24
24
|
assert_kind_of(XML::Error, error)
|
@@ -26,7 +26,6 @@ class TestSchema < Test::Unit::TestCase
|
|
26
26
|
assert_equal(XML::Error::SCHEMAV_ELEMENT_CONTENT, error.code)
|
27
27
|
assert_equal(XML::Error::ERROR, error.level)
|
28
28
|
assert(error.file.match(/shiporder.xml/)) if error.file
|
29
|
-
assert_nil(error.line)
|
30
29
|
assert_nil(error.str1)
|
31
30
|
assert_nil(error.str2)
|
32
31
|
assert_nil(error.str3)
|
@@ -51,6 +50,7 @@ class TestSchema < Test::Unit::TestCase
|
|
51
50
|
end
|
52
51
|
|
53
52
|
check_error(error)
|
53
|
+
assert_nil(error.line)
|
54
54
|
assert_not_nil(error.node)
|
55
55
|
assert_equal('invalid', error.node.name)
|
56
56
|
end
|
@@ -84,7 +84,79 @@ class TestSchema < Test::Unit::TestCase
|
|
84
84
|
|
85
85
|
error = errors.first
|
86
86
|
check_error(error)
|
87
|
+
assert_equal(21, error.line)
|
87
88
|
ensure
|
88
89
|
XML::Error.set_handler(&LibXML::XML::Error::VERBOSE_HANDLER)
|
89
90
|
end
|
91
|
+
|
92
|
+
|
93
|
+
# Schema meta-data tests
|
94
|
+
|
95
|
+
def test_elements
|
96
|
+
assert_instance_of(Hash, schema.elements)
|
97
|
+
assert_equal(1, schema.elements.length)
|
98
|
+
assert_instance_of(XML::Schema::Element, schema.elements['shiporder'])
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_types
|
102
|
+
assert_instance_of(Hash, schema.types)
|
103
|
+
assert_equal(1, schema.types.length)
|
104
|
+
assert_instance_of(XML::Schema::Type, schema.types['shiporder'])
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_schema_type
|
108
|
+
type = schema.types['shiporder']
|
109
|
+
|
110
|
+
assert_equal('shiporder', type.name)
|
111
|
+
assert_equal(nil, type.namespace)
|
112
|
+
assert_equal("Shiporder type documentation", type.annotation)
|
113
|
+
assert_instance_of(XML::Node, type.node)
|
114
|
+
assert_equal(XML::Schema::Types::XML_SCHEMA_TYPE_COMPLEX, type.kind)
|
115
|
+
assert_instance_of(XML::Schema::Type, type.base)
|
116
|
+
assert_equal("anyType", type.base.name)
|
117
|
+
assert_equal(XML::Schema::Types::XML_SCHEMA_TYPE_BASIC, type.base.kind)
|
118
|
+
|
119
|
+
assert_instance_of(Hash, type.elements)
|
120
|
+
assert_equal(3, type.elements.length)
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_schema_element
|
124
|
+
element = schema.types['shiporder'].elements['orderperson']
|
125
|
+
|
126
|
+
assert_equal('orderperson', element.name)
|
127
|
+
assert_equal(nil, element.namespace)
|
128
|
+
assert_equal("orderperson element documentation", element.annotation)
|
129
|
+
assert_equal(1, element.min_occurs)
|
130
|
+
assert_equal(1, element.max_occurs)
|
131
|
+
|
132
|
+
|
133
|
+
element = schema.types['shiporder'].elements['item']
|
134
|
+
assert_equal(Float::INFINITY, element.max_occurs)
|
135
|
+
|
136
|
+
element = schema.types['shiporder'].elements['item'].type.elements['note']
|
137
|
+
assert_equal(0, element.min_occurs)
|
138
|
+
assert_equal('string', element.type.name)
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_schema_attributes
|
142
|
+
type = schema.types['shiporder']
|
143
|
+
|
144
|
+
assert_instance_of(Array, type.attributes)
|
145
|
+
assert_equal(2, type.attributes.length)
|
146
|
+
assert_instance_of(XML::Schema::Attribute, type.attributes.first)
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_schema_attribute
|
150
|
+
attribute = schema.types['shiporder'].attributes.first
|
151
|
+
|
152
|
+
assert_equal("orderid", attribute.name)
|
153
|
+
assert_equal(nil, attribute.namespace)
|
154
|
+
assert_equal(1, attribute.occurs)
|
155
|
+
assert_equal('string', attribute.type.name)
|
156
|
+
|
157
|
+
attribute = schema.types['shiporder'].attributes[1]
|
158
|
+
assert_equal(2, attribute.occurs)
|
159
|
+
assert_equal('1', attribute.default)
|
160
|
+
assert_equal('integer', attribute.type.name)
|
161
|
+
end
|
90
162
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libxml-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-12-14 00:00:00.000000000 Z
|
19
19
|
dependencies: []
|
20
20
|
description: ! " The Libxml-Ruby project provides Ruby language bindings for the
|
21
21
|
GNOME\n Libxml2 XML toolkit. It is free software, released under the MIT License.\n
|
@@ -62,6 +62,10 @@ files:
|
|
62
62
|
- ext/libxml/ruby_xml_sax2_handler.h
|
63
63
|
- ext/libxml/ruby_xml_sax_parser.h
|
64
64
|
- ext/libxml/ruby_xml_schema.h
|
65
|
+
- ext/libxml/ruby_xml_schema_attribute.h
|
66
|
+
- ext/libxml/ruby_xml_schema_element.h
|
67
|
+
- ext/libxml/ruby_xml_schema_facet.h
|
68
|
+
- ext/libxml/ruby_xml_schema_type.h
|
65
69
|
- ext/libxml/ruby_xml_version.h
|
66
70
|
- ext/libxml/ruby_xml_xinclude.h
|
67
71
|
- ext/libxml/ruby_xml_xpath.h
|
@@ -95,6 +99,10 @@ files:
|
|
95
99
|
- ext/libxml/ruby_xml_sax2_handler.c
|
96
100
|
- ext/libxml/ruby_xml_sax_parser.c
|
97
101
|
- ext/libxml/ruby_xml_schema.c
|
102
|
+
- ext/libxml/ruby_xml_schema_attribute.c
|
103
|
+
- ext/libxml/ruby_xml_schema_element.c
|
104
|
+
- ext/libxml/ruby_xml_schema_facet.c
|
105
|
+
- ext/libxml/ruby_xml_schema_type.c
|
98
106
|
- ext/libxml/ruby_xml_xinclude.c
|
99
107
|
- ext/libxml/ruby_xml_xpath.c
|
100
108
|
- ext/libxml/ruby_xml_xpath_context.c
|
@@ -119,6 +127,10 @@ files:
|
|
119
127
|
- lib/libxml/reader.rb
|
120
128
|
- lib/libxml/sax_callbacks.rb
|
121
129
|
- lib/libxml/sax_parser.rb
|
130
|
+
- lib/libxml/schema/attribute.rb
|
131
|
+
- lib/libxml/schema/element.rb
|
132
|
+
- lib/libxml/schema/type.rb
|
133
|
+
- lib/libxml/schema.rb
|
122
134
|
- lib/libxml/tree.rb
|
123
135
|
- lib/libxml/xpath_object.rb
|
124
136
|
- lib/libxml.rb
|