rdf-rdfxml 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/History.txt +7 -1
- data/README.rdoc +1 -1
- data/Rakefile +10 -4
- data/VERSION +1 -1
- data/lib/rdf/rdfxml.rb +0 -4
- data/lib/rdf/rdfxml/patches/literal_hacks.rb +134 -53
- data/lib/rdf/rdfxml/patches/seq.rb +2 -2
- data/lib/rdf/rdfxml/patches/uri_hacks.rb +0 -1
- data/lib/rdf/rdfxml/reader.rb +13 -18
- data/lib/rdf/rdfxml/version.rb +1 -1
- data/lib/rdf/rdfxml/writer.rb +11 -11
- data/rdf-rdfxml.gemspec +17 -13
- data/spec/format_spec.rb +1 -1
- data/spec/literal_spec.rb +36 -61
- data/spec/matchers.rb +0 -60
- data/spec/rdf_helper.rb +10 -14
- data/spec/reader_spec.rb +12 -4
- data/spec/spec_helper.rb +1 -0
- metadata +24 -26
data/.gitignore
CHANGED
data/History.txt
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
+
=== 0.2.1
|
2
|
+
* Update for RDF 0.2.1
|
3
|
+
* Writer bug fixes:
|
4
|
+
* RDF::Node#identifier => RDF::Node#id
|
5
|
+
* Vocabulary.new(uri) => Vocabulary(uri)
|
6
|
+
|
1
7
|
=== 0.2.0
|
2
8
|
* Updates for RDF 0.2.0
|
3
9
|
* Use URI#intern instead of URI#new
|
4
|
-
* Change use of Graph#predicates and Graph#objects to use as
|
10
|
+
* Change use of Graph#predicates and Graph#objects to use as enumerables
|
5
11
|
|
6
12
|
=== 0.0.3
|
7
13
|
* Added patches for the following:
|
data/README.rdoc
CHANGED
@@ -23,7 +23,7 @@ Instantiate a parser and parse source, specifying type and base-URL
|
|
23
23
|
end
|
24
24
|
|
25
25
|
== Dependencies
|
26
|
-
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.
|
26
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.2.0)
|
27
27
|
* [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.3.3)
|
28
28
|
|
29
29
|
== TODO
|
data/Rakefile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
require 'yard'
|
2
3
|
|
3
4
|
begin
|
4
5
|
gem 'jeweler'
|
@@ -12,12 +13,13 @@ begin
|
|
12
13
|
gemspec.email = "gregg@kellogg-assoc.com"
|
13
14
|
gemspec.homepage = "http://github.com/gkellogg/rdf-rdfxml"
|
14
15
|
gemspec.authors = ["Gregg Kellogg"]
|
15
|
-
gemspec.add_dependency('rdf', '>= 0.2.
|
16
|
+
gemspec.add_dependency('rdf', '>= 0.2.1')
|
16
17
|
gemspec.add_dependency('nokogiri', '>= 1.3.3')
|
17
18
|
gemspec.add_development_dependency('rspec')
|
18
|
-
gemspec.add_development_dependency('rdf-spec')
|
19
|
-
gemspec.add_development_dependency('
|
20
|
-
gemspec.
|
19
|
+
gemspec.add_development_dependency('rdf-spec', '>= 0.2.1')
|
20
|
+
gemspec.add_development_dependency('rdf-isomorphic')
|
21
|
+
gemspec.add_development_dependency('yard')
|
22
|
+
gemspec.extra_rdoc_files = %w(README.rdoc History.txt AUTHORS CONTRIBUTORS)
|
21
23
|
end
|
22
24
|
Jeweler::GemcutterTasks.new
|
23
25
|
rescue LoadError
|
@@ -44,6 +46,10 @@ Spec::Rake::SpecTask.new("doc:spec") do |spec|
|
|
44
46
|
spec.spec_opts = ["--format", "html:doc/spec.html"]
|
45
47
|
end
|
46
48
|
|
49
|
+
YARD::Rake::YardocTask.new do |t|
|
50
|
+
t.files = %w(lib/**/*.rb README.rdoc History.txt AUTHORS CONTRIBUTORS) # optional
|
51
|
+
end
|
52
|
+
|
47
53
|
desc "Generate RDF Core Manifest.yml"
|
48
54
|
namespace :spec do
|
49
55
|
task :prepare do
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
data/lib/rdf/rdfxml.rb
CHANGED
@@ -32,9 +32,5 @@ module RDF
|
|
32
32
|
autoload :Writer, 'rdf/rdfxml/writer'
|
33
33
|
autoload :VERSION, 'rdf/rdfxml/version'
|
34
34
|
autoload :XML, 'rdf/rdfxml/vocab'
|
35
|
-
|
36
|
-
# Fixme: RDF.to_s should generate this, but it doesn't
|
37
|
-
RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
38
|
-
XML_LITERAL = RDF['XMLLiteral']
|
39
35
|
end
|
40
36
|
end
|
@@ -1,66 +1,147 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
# Use Nokogiri or LibXML when available, and REXML otherwise:
|
2
|
+
begin
|
3
|
+
require 'nokogiri'
|
4
|
+
rescue LoadError => e
|
5
|
+
begin
|
6
|
+
require 'libxml'
|
7
|
+
rescue LoadError => e
|
8
|
+
:rexml
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module RDF; class Literal
|
13
|
+
##
|
14
|
+
# An XML literal.
|
15
|
+
#
|
16
|
+
# @see http://www.w3.org/TR/rdf-concepts/#section-XMLLiteral
|
17
|
+
# @see http://www.w3.org/TR/rdfa-core/#s_xml_literals
|
18
|
+
# @since 0.2.1
|
19
|
+
class XML < Literal
|
20
|
+
##
|
21
|
+
# @param [Object] value
|
22
|
+
# @option options [String] :lexical (nil)
|
23
|
+
# @option options [Hash] :namespaces (nil)
|
24
|
+
# @option options [Hash] :namespaces ({})
|
25
|
+
# @option options [Symbol] :language (nil)
|
26
|
+
# @option options [Symbol] :library (:nokogiri, :libxml, or :rexml)
|
27
|
+
def initialize(value, options = {})
|
28
|
+
options[:namespaces] ||= {}
|
29
|
+
|
30
|
+
@library = case options[:library]
|
31
|
+
when nil
|
32
|
+
case
|
33
|
+
when defined?(::Nokogiri) then :nokogiri
|
34
|
+
when defined?(::LibXML) then :libxml
|
35
|
+
else :rexml
|
36
|
+
end
|
37
|
+
when :nokogiri, :libxml, :rexml
|
38
|
+
options[:library]
|
39
|
+
else
|
40
|
+
raise ArgumentError.new("expected :rexml, :libxml or :nokogiri, but got #{options[:library].inspect}")
|
41
|
+
end
|
42
|
+
|
43
|
+
@datatype = options[:datatype] || DATATYPE
|
44
|
+
@string = options[:lexical] if options.has_key?(:lexical)
|
45
|
+
@object = parse_value(value, options)
|
46
|
+
@string = serialize_nodeset(@object)
|
7
47
|
end
|
8
|
-
|
9
|
-
def anonymous?; false; end unless respond_to?(:anonymous?)
|
10
|
-
|
48
|
+
|
11
49
|
##
|
12
|
-
#
|
50
|
+
# Converts the literal into its canonical lexical representation.
|
51
|
+
#
|
52
|
+
# @return [Literal]
|
53
|
+
# @see http://www.w3.org/TR/xml-exc-c14n/
|
54
|
+
def canonicalize
|
55
|
+
# This is the opportunity to use exclusive canonicalization library
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# Returns the value as a string.
|
13
61
|
#
|
14
62
|
# @return [String]
|
15
63
|
def to_s
|
16
|
-
|
17
|
-
output = "\"#{quoted}\""
|
18
|
-
output << "@#{language}" if has_language? && !has_datatype?
|
19
|
-
output << "^^<#{datatype}>" if has_datatype?
|
20
|
-
output
|
64
|
+
@string
|
21
65
|
end
|
22
66
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
options[:namespaces].each_pair do |prefix, uri|
|
34
|
-
attr = prefix.to_s.empty? ? "xmlns" : "xmlns:#{prefix}"
|
35
|
-
ns_hash[attr] = uri.to_s
|
36
|
-
end
|
37
|
-
ns_strs = []
|
38
|
-
ns_hash.each_pair {|a, u| ns_strs << "#{a}=\"#{u}\""}
|
67
|
+
private
|
68
|
+
|
69
|
+
def parse_value(value, options)
|
70
|
+
ns_hash = {}
|
71
|
+
options[:namespaces].each_pair do |prefix, uri|
|
72
|
+
attr = prefix.to_s.empty? ? "xmlns" : "xmlns:#{prefix}"
|
73
|
+
ns_hash[attr] = uri.to_s
|
74
|
+
end
|
75
|
+
ns_strs = []
|
76
|
+
ns_hash.each_pair {|a, u| ns_strs << "#{a}=\"#{u}\""}
|
39
77
|
|
40
|
-
|
41
|
-
|
78
|
+
case @library
|
79
|
+
when :nokogiri then parse_value_nokogiri(value, ns_strs, options[:language])
|
80
|
+
when :libxml then parse_value_libxml(value, ns_strs, options[:language])
|
81
|
+
when :rexml then parse_value_rexml(value, ns_strs, options[:language])
|
82
|
+
else value.to_s
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def serialize_nodeset(object)
|
87
|
+
case @library
|
88
|
+
when :nokogiri then serialize_nodeset_nokogiri(object)
|
89
|
+
when :libxml then serialize_nodeset_libxml(object)
|
90
|
+
when :rexml then serialize_nodeset_rexml(object)
|
91
|
+
else object
|
42
92
|
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Nokogiri implementations
|
96
|
+
if defined?(::Nokogiri)
|
97
|
+
def parse_value_nokogiri(value, ns_strs, language)
|
98
|
+
return value if value.is_a?(Nokogiri::XML::NodeSet)
|
99
|
+
# Add inherited namespaces to created root element so that they're inherited to sub-elements
|
100
|
+
elements = Nokogiri::XML::Document.parse("<foo #{ns_strs.join(" ")}>#{value.to_s}</foo>").root.children
|
43
101
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
102
|
+
elements.map do |c|
|
103
|
+
if c.is_a?(Nokogiri::XML::Element)
|
104
|
+
c = Nokogiri::XML.parse(c.dup.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)).root
|
105
|
+
# Gather namespaces from self and decendant nodes
|
106
|
+
c.traverse do |n|
|
107
|
+
ns = n.namespace
|
108
|
+
next unless ns
|
109
|
+
prefix = ns.prefix ? "xmlns:#{ns.prefix}" : "xmlns"
|
110
|
+
c[prefix] = ns.href.to_s unless c.namespaces[prefix]
|
111
|
+
end
|
112
|
+
|
113
|
+
# Add lanuage
|
114
|
+
if language && c["lang"].to_s.empty?
|
115
|
+
c["xml:lang"] = language
|
116
|
+
end
|
59
117
|
end
|
118
|
+
c
|
60
119
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
120
|
+
end
|
121
|
+
|
122
|
+
def serialize_nodeset_nokogiri(object)
|
123
|
+
object.map {|c| c.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)}.join("")
|
124
|
+
end
|
125
|
+
end # Nokogiri
|
126
|
+
|
127
|
+
if defined?(::LibXML)
|
128
|
+
def parse_value_libxml(value, ns_strs, language)
|
129
|
+
# Fixme
|
130
|
+
end
|
131
|
+
|
132
|
+
def serialize_nodeset_libxml(object)
|
133
|
+
# Fixme
|
134
|
+
end
|
135
|
+
end # LibXML
|
136
|
+
|
137
|
+
# REXML
|
138
|
+
def parse_value_rexml(value, ns_strs, language)
|
139
|
+
# Fixme
|
64
140
|
end
|
65
|
-
|
66
|
-
|
141
|
+
|
142
|
+
def serialize_nodeset_rexml(object)
|
143
|
+
# Fixme
|
144
|
+
end
|
145
|
+
|
146
|
+
end # class XML
|
147
|
+
end; end
|
@@ -6,7 +6,7 @@ module RDF
|
|
6
6
|
props = properties(subject)
|
7
7
|
rdf_type = (props[RDF.type.to_s] || []).map {|t| t.to_s}
|
8
8
|
|
9
|
-
#puts "seq; #{rdf_type} #{rdf_type - [
|
9
|
+
#puts "seq; #{rdf_type} #{rdf_type - [RDF.Seq, RDF.Bag, RDF.Alt]}"
|
10
10
|
if !(rdf_type - [RDF.Seq, RDF.Bag, RDF.Alt]).empty?
|
11
11
|
props.keys.select {|k| k.match(/#{RDF.to_s}_(\d)$/)}.
|
12
12
|
sort_by {|i| i.sub(RDF._.to_s, "").to_i}.
|
@@ -15,7 +15,7 @@ module RDF
|
|
15
15
|
elsif !self.query(:subject => subject, :predicate => RDF.first).empty?
|
16
16
|
# N3-style first/rest chain
|
17
17
|
list = []
|
18
|
-
while subject !=
|
18
|
+
while subject != RDF.nil
|
19
19
|
props = properties(subject)
|
20
20
|
f = props[RDF.first.to_s]
|
21
21
|
if f.to_s.empty? || f.first == RDF.nil
|
data/lib/rdf/rdfxml/reader.rb
CHANGED
@@ -113,11 +113,11 @@ module RDF::RDFXML
|
|
113
113
|
##
|
114
114
|
# Initializes the RDF/XML reader instance.
|
115
115
|
#
|
116
|
-
# @param [IO, File, String]
|
117
|
-
# @
|
118
|
-
#
|
119
|
-
#
|
120
|
-
#
|
116
|
+
# @param [IO, File, String] input
|
117
|
+
# @option options [Array] :debug (nil) Array to place debug messages
|
118
|
+
# @option options [Boolean] :strict (false) Raise Error if true, continue with lax parsing, otherwise
|
119
|
+
# @option options [Boolean] :base_uri (nil) Base URI to use for relative URIs.
|
120
|
+
# @return [reader]
|
121
121
|
# @yield [reader]
|
122
122
|
# @yieldparam [Reader] reader
|
123
123
|
# @raise [Error]:: Raises RDF::ReaderError if _strict_
|
@@ -141,7 +141,6 @@ module RDF::RDFXML
|
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
-
# XXX Invoke the parser, and allow add_triple to make the callback?
|
145
144
|
##
|
146
145
|
# Iterates the given block for each RDF statement in the input.
|
147
146
|
#
|
@@ -156,7 +155,7 @@ module RDF::RDFXML
|
|
156
155
|
|
157
156
|
add_debug(root, "base_uri: #{@base_uri || 'nil'}")
|
158
157
|
|
159
|
-
rdf_nodes = root.xpath("//rdf:RDF", "rdf" =>
|
158
|
+
rdf_nodes = root.xpath("//rdf:RDF", "rdf" => RDF.to_uri.to_s)
|
160
159
|
if rdf_nodes.length == 0
|
161
160
|
# If none found, root element may be processed as an RDF Node
|
162
161
|
|
@@ -196,12 +195,8 @@ module RDF::RDFXML
|
|
196
195
|
|
197
196
|
# Keep track of allocated BNodes
|
198
197
|
def bnode(value = nil)
|
199
|
-
|
200
|
-
|
201
|
-
@bnode_cache[value.to_s] ||= RDF::Node.new(value)
|
202
|
-
else
|
203
|
-
RDF::Node.new
|
204
|
-
end
|
198
|
+
@bnode_cache ||= {}
|
199
|
+
@bnode_cache[value.to_s] ||= RDF::Node.new(value)
|
205
200
|
end
|
206
201
|
|
207
202
|
# Figure out the document path, if it is a Nokogiri::XML::Element or Attribute
|
@@ -314,7 +309,7 @@ module RDF::RDFXML
|
|
314
309
|
#attrs[attr.to_s] = attr.value unless attr.to_s.match?(/^xml/)
|
315
310
|
elsif attr.namespace.href == RDF::XML.to_s
|
316
311
|
# No production. Lang and base elements already extracted
|
317
|
-
elsif attr.namespace.href ==
|
312
|
+
elsif attr.namespace.href == RDF.to_uri.to_s
|
318
313
|
case attr.name
|
319
314
|
when "ID" then id = attr.value
|
320
315
|
when "datatype" then datatype = attr.value
|
@@ -377,7 +372,7 @@ module RDF::RDFXML
|
|
377
372
|
end
|
378
373
|
|
379
374
|
# For element e with possibly empty element content c.
|
380
|
-
n =
|
375
|
+
n = RDF::Node.new
|
381
376
|
add_triple(child, subject, predicate, n)
|
382
377
|
|
383
378
|
# Reification
|
@@ -442,7 +437,7 @@ module RDF::RDFXML
|
|
442
437
|
raise RDF::ReaderError.new(warn) if @strict
|
443
438
|
end
|
444
439
|
|
445
|
-
object = RDF::Literal.
|
440
|
+
object = RDF::Literal.new(child.children, :datatype => RDF.XMLLiteral, :namespaces => child_ec.uri_mappings, :language => ec.language)
|
446
441
|
add_triple(child, subject, predicate, object)
|
447
442
|
elsif text_nodes.length == 0 && element_nodes.length == 0
|
448
443
|
# Production emptyPropertyElt
|
@@ -460,7 +455,7 @@ module RDF::RDFXML
|
|
460
455
|
elsif nodeID
|
461
456
|
resource = bnode(nodeID)
|
462
457
|
else
|
463
|
-
resource =
|
458
|
+
resource = RDF::Node.new
|
464
459
|
end
|
465
460
|
|
466
461
|
# produce triples for attributes
|
@@ -533,7 +528,7 @@ module RDF::RDFXML
|
|
533
528
|
ec.base.join(about)
|
534
529
|
else
|
535
530
|
add_debug(el, "parse_subject, BNode")
|
536
|
-
|
531
|
+
RDF::Node.new
|
537
532
|
end
|
538
533
|
end
|
539
534
|
|
data/lib/rdf/rdfxml/version.rb
CHANGED
data/lib/rdf/rdfxml/writer.rb
CHANGED
@@ -10,7 +10,7 @@ module RDF::RDFXML
|
|
10
10
|
# and then serialize the graph.
|
11
11
|
#
|
12
12
|
# @example Obtaining a RDF/XML writer class
|
13
|
-
# RDF::Writer.for(:rdf) #=> RDF::
|
13
|
+
# RDF::Writer.for(:rdf) #=> RDF::RDFXML::Writer
|
14
14
|
# RDF::Writer.for("etc/test.rdf")
|
15
15
|
# RDF::Writer.for(:file_name => "etc/test.rdf")
|
16
16
|
# RDF::Writer.for(:file_extension => "rdf")
|
@@ -51,7 +51,7 @@ module RDF::RDFXML
|
|
51
51
|
# base_uri:: Base URI of graph, used to shorting URI references
|
52
52
|
# lang:: Output as root xml:lang attribute, and avoid generation _xml:lang_ where possible
|
53
53
|
# attributes:: How to use XML attributes when serializing, one of :none, :untyped, :typed. The default is :none.
|
54
|
-
#
|
54
|
+
# default_namespace:: URI to use as default namespace
|
55
55
|
#
|
56
56
|
# @param [IO, File] output
|
57
57
|
# @param [Hash{Symbol => Object}] options
|
@@ -119,7 +119,7 @@ module RDF::RDFXML
|
|
119
119
|
# Get QNames and necessary namespaces from predicates and objects
|
120
120
|
@graph.predicates.each {|pred| add_debug("serialize pred: #{pred.inspect}"); get_qname(pred)}
|
121
121
|
@graph.objects.each {|obj| add_debug("serialize obj: #{obj.inspect}"); get_qname(obj)}
|
122
|
-
add_namespace(:rdf,
|
122
|
+
add_namespace(:rdf, RDF.to_uri)
|
123
123
|
add_namespace(:xml, RDF::XML) if @base_uri || @lang
|
124
124
|
|
125
125
|
if @default_namespace
|
@@ -174,7 +174,7 @@ module RDF::RDFXML
|
|
174
174
|
end
|
175
175
|
element ||= "rdf:Description"
|
176
176
|
|
177
|
-
node = Nokogiri::XML::Element.new(element, parent_node.document)
|
177
|
+
node = Nokogiri::XML::Element.new(element.to_s, parent_node.document)
|
178
178
|
|
179
179
|
if subject.is_a?(RDF::Node)
|
180
180
|
# Only need nodeID if it's referenced elsewhere
|
@@ -234,7 +234,7 @@ module RDF::RDFXML
|
|
234
234
|
as_attr = false
|
235
235
|
end
|
236
236
|
else
|
237
|
-
qname = prop.qname.last
|
237
|
+
qname = prop.qname.last.to_s
|
238
238
|
end
|
239
239
|
end
|
240
240
|
|
@@ -264,8 +264,8 @@ module RDF::RDFXML
|
|
264
264
|
add_debug " elt attr #{a}=#{av}"
|
265
265
|
pred_node[a] = av.to_s
|
266
266
|
end
|
267
|
-
add_debug " elt #{'xmllit ' if object.is_a?(RDF::Literal) && object.
|
268
|
-
if object.is_a?(RDF::Literal) && object.
|
267
|
+
add_debug " elt #{'xmllit ' if object.is_a?(RDF::Literal) && object.datatype == RDF.XMLLiteral}content=#{args.first}" if !args.empty?
|
268
|
+
if object.is_a?(RDF::Literal) && object.datatype == RDF.XMLLiteral
|
269
269
|
pred_node.add_child(Nokogiri::XML::CharacterData.new(args.first, node.document))
|
270
270
|
elsif args.first
|
271
271
|
pred_node.content = args.first unless args.empty?
|
@@ -295,7 +295,7 @@ module RDF::RDFXML
|
|
295
295
|
subject(object, pred_node)
|
296
296
|
@depth -= 1
|
297
297
|
elsif object.is_a?(RDF::Node)
|
298
|
-
pred_node["rdf:nodeID"] = object.
|
298
|
+
pred_node["rdf:nodeID"] = object.id
|
299
299
|
else
|
300
300
|
pred_node["rdf:resource"] = relativize(object)
|
301
301
|
end
|
@@ -410,7 +410,7 @@ module RDF::RDFXML
|
|
410
410
|
base_uri = uri.to_s[0..-(local_name.length + 1)]
|
411
411
|
@tmp_ns = @tmp_ns ? @tmp_ns.succ : "ns0"
|
412
412
|
add_debug "create namespace definition for #{uri}"
|
413
|
-
uri.vocab = RDF::Vocabulary
|
413
|
+
uri.vocab = RDF::Vocabulary(base_uri)
|
414
414
|
add_namespace(@tmp_ns.to_sym, uri.vocab)
|
415
415
|
add_debug "get_qname(tmp_ns): #{@tmp_ns}:#{local_name}"
|
416
416
|
return "#{@tmp_ns}:#{local_name}"
|
@@ -419,7 +419,7 @@ module RDF::RDFXML
|
|
419
419
|
|
420
420
|
def add_namespace(prefix, ns)
|
421
421
|
add_debug "add_namespace: '#{prefix}', <#{ns}>"
|
422
|
-
@namespaces[prefix.
|
422
|
+
@namespaces[prefix.to_s] = ns.to_s
|
423
423
|
end
|
424
424
|
|
425
425
|
def reset
|
@@ -470,7 +470,7 @@ module RDF::RDFXML
|
|
470
470
|
[object.value, {}]
|
471
471
|
elsif object.has_language?
|
472
472
|
[object.value, {"xml:lang" => object.language}]
|
473
|
-
elsif object.
|
473
|
+
elsif object.datatype == RDF.XMLLiteral
|
474
474
|
[object.value, {"rdf:parseType" => "Literal"}]
|
475
475
|
else
|
476
476
|
[object.value, {"rdf:datatype" => object.datatype.to_s}]
|
data/rdf-rdfxml.gemspec
CHANGED
@@ -5,16 +5,17 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rdf-rdfxml}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Gregg Kellogg"]
|
12
|
-
s.date = %q{2010-06-
|
12
|
+
s.date = %q{2010-06-28}
|
13
13
|
s.description = %q{ RDF::RDFXML is an RDF/XML reader and writer for Ruby using the RDF.rb library suite.
|
14
14
|
}
|
15
15
|
s.email = %q{gregg@kellogg-assoc.com}
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"AUTHORS",
|
18
|
+
"CONTRIBUTORS",
|
18
19
|
"History.txt",
|
19
20
|
"README.rdoc"
|
20
21
|
]
|
@@ -418,7 +419,7 @@ Gem::Specification.new do |s|
|
|
418
419
|
s.homepage = %q{http://github.com/gkellogg/rdf-rdfxml}
|
419
420
|
s.rdoc_options = ["--charset=UTF-8"]
|
420
421
|
s.require_paths = ["lib"]
|
421
|
-
s.rubygems_version = %q{1.3.
|
422
|
+
s.rubygems_version = %q{1.3.6}
|
422
423
|
s.summary = %q{RDF/XML reader/writer for RDF.rb.}
|
423
424
|
s.test_files = [
|
424
425
|
"spec/format_spec.rb",
|
@@ -437,25 +438,28 @@ Gem::Specification.new do |s|
|
|
437
438
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
438
439
|
s.specification_version = 3
|
439
440
|
|
440
|
-
if Gem::Version.new(Gem::
|
441
|
-
s.add_runtime_dependency(%q<rdf>, [">= 0.2.
|
441
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
442
|
+
s.add_runtime_dependency(%q<rdf>, [">= 0.2.1"])
|
442
443
|
s.add_runtime_dependency(%q<nokogiri>, [">= 1.3.3"])
|
443
444
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
444
|
-
s.add_development_dependency(%q<rdf-spec>, [">= 0"])
|
445
|
-
s.add_development_dependency(%q<
|
445
|
+
s.add_development_dependency(%q<rdf-spec>, [">= 0.2.1"])
|
446
|
+
s.add_development_dependency(%q<rdf-isomorphic>, [">= 0"])
|
447
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
446
448
|
else
|
447
|
-
s.add_dependency(%q<rdf>, [">= 0.2.
|
449
|
+
s.add_dependency(%q<rdf>, [">= 0.2.1"])
|
448
450
|
s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
|
449
451
|
s.add_dependency(%q<rspec>, [">= 0"])
|
450
|
-
s.add_dependency(%q<rdf-spec>, [">= 0"])
|
451
|
-
s.add_dependency(%q<
|
452
|
+
s.add_dependency(%q<rdf-spec>, [">= 0.2.1"])
|
453
|
+
s.add_dependency(%q<rdf-isomorphic>, [">= 0"])
|
454
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
452
455
|
end
|
453
456
|
else
|
454
|
-
s.add_dependency(%q<rdf>, [">= 0.2.
|
457
|
+
s.add_dependency(%q<rdf>, [">= 0.2.1"])
|
455
458
|
s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
|
456
459
|
s.add_dependency(%q<rspec>, [">= 0"])
|
457
|
-
s.add_dependency(%q<rdf-spec>, [">= 0"])
|
458
|
-
s.add_dependency(%q<
|
460
|
+
s.add_dependency(%q<rdf-spec>, [">= 0.2.1"])
|
461
|
+
s.add_dependency(%q<rdf-isomorphic>, [">= 0"])
|
462
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
459
463
|
end
|
460
464
|
end
|
461
465
|
|
data/spec/format_spec.rb
CHANGED
data/spec/literal_spec.rb
CHANGED
@@ -1,86 +1,61 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
3
|
+
require 'nokogiri'
|
2
4
|
|
3
5
|
describe RDF::Literal do
|
6
|
+
require 'nokogiri' rescue nil
|
7
|
+
|
8
|
+
before :each do
|
9
|
+
@new = Proc.new { |*args| RDF::Literal.new(*args) }
|
10
|
+
end
|
11
|
+
|
4
12
|
describe "XML Literal" do
|
5
13
|
describe "with no namespace" do
|
6
|
-
subject {
|
7
|
-
it "should
|
8
|
-
|
14
|
+
subject { @new.call("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral) }
|
15
|
+
it "should return input" do subject.to_s.should == "foo <sup>bar</sup> baz!" end
|
16
|
+
|
17
|
+
it "should be equal if they have the same contents" do
|
18
|
+
should == @new.call("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral)
|
9
19
|
end
|
10
|
-
|
11
|
-
it "should return normalized literal" do subject.value.should == "foo <sup>bar</sup> baz!" end
|
12
20
|
end
|
13
|
-
|
21
|
+
|
14
22
|
describe "with a namespace" do
|
15
23
|
subject {
|
16
|
-
|
24
|
+
@new.call("foo <dc:sup>bar</dc:sup> baz!", :datatype => RDF.XMLLiteral,
|
25
|
+
:namespaces => {"dc" => RDF::DC.to_s})
|
17
26
|
}
|
18
|
-
|
19
|
-
it "should
|
20
|
-
|
27
|
+
|
28
|
+
it "should add namespaces" do subject.to_s.should == "foo <dc:sup xmlns:dc=\"http://purl.org/dc/terms/\">bar</dc:sup> baz!" end
|
29
|
+
|
21
30
|
describe "and language" do
|
22
31
|
subject {
|
23
|
-
|
32
|
+
@new.call("foo <dc:sup>bar</dc:sup> baz!", :datatype => RDF.XMLLiteral,
|
33
|
+
:namespaces => {"dc" => RDF::DC.to_s},
|
34
|
+
:language => :fr)
|
24
35
|
}
|
25
36
|
|
26
|
-
it "should
|
37
|
+
it "should add namespaces and language" do subject.to_s.should == "foo <dc:sup xmlns:dc=\"http://purl.org/dc/terms/\" xml:lang=\"fr\">bar</dc:sup> baz!" end
|
27
38
|
end
|
28
|
-
|
39
|
+
|
29
40
|
describe "and language with an existing language embedded" do
|
30
41
|
subject {
|
31
|
-
|
42
|
+
@new.call("foo <dc:sup>bar</dc:sup><dc:sub xml:lang=\"en\">baz</dc:sub>",
|
43
|
+
:datatype => RDF.XMLLiteral,
|
44
|
+
:namespaces => {"dc" => RDF::DC.to_s},
|
45
|
+
:language => :fr)
|
32
46
|
}
|
33
47
|
|
34
|
-
it "should
|
35
|
-
end
|
36
|
-
|
37
|
-
describe "and namespaced element" do
|
38
|
-
subject {
|
39
|
-
root = Nokogiri::XML.parse(%(
|
40
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
41
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
42
|
-
<html xmlns="http://www.w3.org/1999/xhtml"
|
43
|
-
xmlns:dc="http://purl.org/dc/terms/"
|
44
|
-
xmlns:ex="http://example.org/rdf/"
|
45
|
-
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
46
|
-
xmlns:svg="http://www.w3.org/2000/svg">
|
47
|
-
<head profile="http://www.w3.org/1999/xhtml/vocab http://www.w3.org/2005/10/profile">
|
48
|
-
<title>Test 0100</title>
|
49
|
-
</head>
|
50
|
-
<body>
|
51
|
-
<div about="http://www.example.org">
|
52
|
-
<h2 property="ex:example" datatype="rdf:XMLLiteral"><svg:svg/></h2>
|
53
|
-
</div>
|
54
|
-
</body>
|
55
|
-
</html>
|
56
|
-
), nil, nil, Nokogiri::XML::ParseOptions::DEFAULT_XML).root
|
57
|
-
content = root.css("h2").children
|
58
|
-
RDF::Literal.xmlliteral(content, :namespaces => {:svg => "http://www.w3.org/2000/svg", :dc => "http://purl.org/dc/terms"})
|
59
|
-
}
|
60
|
-
it "should add namespace" do subject.value.should == "<svg:svg xmlns:svg=\"http://www.w3.org/2000/svg\"></svg:svg>" end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe "and existing namespace definition" do
|
64
|
-
subject {
|
65
|
-
RDF::Literal.xmlliteral("<svg:svg xmlns:svg=\"http://www.w3.org/2000/svg\"/>", :namespaces => {"svg" => "http://www.w3.org/2000/svg"})
|
66
|
-
}
|
67
|
-
it "should add namespace" do subject.value.should == "<svg:svg xmlns:svg=\"http://www.w3.org/2000/svg\"></svg:svg>" end
|
48
|
+
it "should add namespaces and language" do subject.to_s.should == "foo <dc:sup xmlns:dc=\"http://purl.org/dc/terms/\" xml:lang=\"fr\">bar</dc:sup><dc:sub xmlns:dc=\"http://purl.org/dc/terms/\" xml:lang=\"en\">baz</dc:sub>" end
|
68
49
|
end
|
69
50
|
end
|
70
|
-
|
51
|
+
|
71
52
|
describe "with a default namespace" do
|
72
53
|
subject {
|
73
|
-
|
54
|
+
@new.call("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral,
|
55
|
+
:namespaces => {"" => RDF::DC.to_s})
|
74
56
|
}
|
75
|
-
|
76
|
-
it "should
|
77
|
-
end
|
78
|
-
|
79
|
-
describe "with <br/>" do
|
80
|
-
subject {
|
81
|
-
RDF::Literal.xmlliteral("<br/>")
|
82
|
-
}
|
83
|
-
it "should add namespace" do subject.value.should == "<br></br>" end
|
57
|
+
|
58
|
+
it "should add namespace" do subject.to_s.should == "foo <sup xmlns=\"http://purl.org/dc/terms/\">bar</sup> baz!" end
|
84
59
|
end
|
85
|
-
end
|
86
|
-
end
|
60
|
+
end if defined?(::Nokogiri)
|
61
|
+
end
|
data/spec/matchers.rb
CHANGED
@@ -58,64 +58,4 @@ module Matchers
|
|
58
58
|
def be_equivalent_graph(expected, info = nil)
|
59
59
|
BeEquivalentGraph.new(expected, info)
|
60
60
|
end
|
61
|
-
|
62
|
-
class BeValidXML
|
63
|
-
def initialize(info)
|
64
|
-
@info = info
|
65
|
-
end
|
66
|
-
def matches?(actual)
|
67
|
-
@actual = actual
|
68
|
-
@doc = Nokogiri::XML.parse(actual)
|
69
|
-
@results = @doc.validate
|
70
|
-
@results.nil?
|
71
|
-
rescue
|
72
|
-
false
|
73
|
-
end
|
74
|
-
def failure_message_for_should
|
75
|
-
"#{@info + "\n" unless @info.empty?}" +
|
76
|
-
if @doc.nil?
|
77
|
-
"did not parse"
|
78
|
-
else
|
79
|
-
"\n#{@results}" +
|
80
|
-
"\nParsed:\n#{@doc}"
|
81
|
-
end +
|
82
|
-
"\nActual:\n#{@actual}"
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def be_valid_xml(info = "")
|
87
|
-
BeValidXML.new(info)
|
88
|
-
end
|
89
|
-
|
90
|
-
class BeEquivalentXML
|
91
|
-
def initialize(expected, info)
|
92
|
-
@expected = expected
|
93
|
-
@info = info
|
94
|
-
end
|
95
|
-
|
96
|
-
def matches?(actual)
|
97
|
-
@actual = actual
|
98
|
-
|
99
|
-
a = @actual.index("<") == 0 ? @actual : "<foo>#{@actual}</foo>"
|
100
|
-
e = @expected.index("<") == 0 ? @expected : "<foo>#{@expected}</foo>"
|
101
|
-
a_hash = ActiveSupport::XmlMini.parse(a)
|
102
|
-
e_hash = ActiveSupport::XmlMini.parse(e)
|
103
|
-
a_hash == e_hash
|
104
|
-
rescue
|
105
|
-
puts $!
|
106
|
-
@fault = $!.message
|
107
|
-
false
|
108
|
-
end
|
109
|
-
|
110
|
-
def failure_message_for_should
|
111
|
-
"#{@info + "\n" unless @info.empty?}" +
|
112
|
-
"Fault: #{@fault + "\n" if @fault}" +
|
113
|
-
"Expected:#{@expected}\n" +
|
114
|
-
"Actual:#{@actual}"
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def be_equivalent_xml(expected, info = "")
|
119
|
-
BeEquivalentXML.new(expected, info)
|
120
|
-
end
|
121
61
|
end
|
data/spec/rdf_helper.rb
CHANGED
@@ -119,9 +119,7 @@ module RdfHelper
|
|
119
119
|
@negative_entailment_tests = []
|
120
120
|
|
121
121
|
unless File.file?(File.join(test_dir, test.sub("rdf", "yml")))
|
122
|
-
puts "parse #{File.join(test_dir, test)} @#{Time.now}"
|
123
122
|
graph = RDF::Graph.load(File.join(test_dir, test), :base_uri => test_uri)
|
124
|
-
puts "parsed #{graph.size} statements @#{Time.now}"
|
125
123
|
uri_base = Addressable::URI.join(test_uri, ".").to_s
|
126
124
|
|
127
125
|
# One of:
|
@@ -140,18 +138,16 @@ module RdfHelper
|
|
140
138
|
self.from_yaml(File.join(test_dir, test.sub("rdf", "yml")))
|
141
139
|
end
|
142
140
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
end
|
154
|
-
end
|
141
|
+
@test_cases.each do |tc|
|
142
|
+
next if tc.status && tc.status != "APPROVED"
|
143
|
+
case tc.rdf_type
|
144
|
+
when "PositiveParserTest" then @positive_parser_tests << tc
|
145
|
+
when "NegativeParserTest" then @negative_parser_tests << tc
|
146
|
+
when "PositiveEntailmentTest" then @positive_entailment_tests << tc
|
147
|
+
when "NegativeEntailmentTest" then @negative_entailment_tests << tc
|
148
|
+
else puts "Unknown test type: #{tc.rdf_type}"
|
149
|
+
end
|
150
|
+
end
|
155
151
|
end
|
156
152
|
def self.test_cases(test_uri = nil, test_dir = nil); parse_test_cases(test_uri, test_dir); @test_cases; end
|
157
153
|
def self.positive_parser_tests(test_uri = nil, test_dir = nil); parse_test_cases(test_uri, test_dir); @positive_parser_tests; end
|
data/spec/reader_spec.rb
CHANGED
@@ -329,7 +329,7 @@ EOF
|
|
329
329
|
end
|
330
330
|
|
331
331
|
def self.negative_tests
|
332
|
-
|
332
|
+
RdfHelper::TestCase.negative_parser_tests(RDFCORE_TEST, RDFCORE_DIR) rescue []
|
333
333
|
end
|
334
334
|
|
335
335
|
it "should parse testcase" do
|
@@ -387,7 +387,10 @@ EOF
|
|
387
387
|
t.run_test do |rdf_string|
|
388
388
|
t.debug = []
|
389
389
|
g = RDF::Graph.new
|
390
|
-
RDF::RDFXML::Reader.new(rdf_string,
|
390
|
+
RDF::RDFXML::Reader.new(rdf_string,
|
391
|
+
:base_uri => t.about,
|
392
|
+
:strict => true,
|
393
|
+
:debug => t.debug).each do |statement|
|
391
394
|
g << statement
|
392
395
|
end
|
393
396
|
g
|
@@ -404,8 +407,13 @@ EOF
|
|
404
407
|
specify "test #{t.name}: " + (t.description || t.inputDocument) do
|
405
408
|
t.run_test do |rdf_string, parser|
|
406
409
|
lambda do
|
407
|
-
|
408
|
-
|
410
|
+
g = RDF::Graph.new
|
411
|
+
RDF::RDFXML::Reader.new(rdf_string,
|
412
|
+
:base_uri => t.about,
|
413
|
+
:strict => true).each do |statement|
|
414
|
+
g << statement
|
415
|
+
end
|
416
|
+
g.should be_empty
|
409
417
|
end.should raise_error(RDF::ReaderError)
|
410
418
|
end
|
411
419
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdf-rdfxml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 23
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
8
|
+
- 1
|
9
|
+
version: 0.2.1
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Gregg Kellogg
|
@@ -15,34 +14,30 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-28 00:00:00 -07:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: rdf
|
23
22
|
prerelease: false
|
24
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
24
|
requirements:
|
27
25
|
- - ">="
|
28
26
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 23
|
30
27
|
segments:
|
31
28
|
- 0
|
32
29
|
- 2
|
33
|
-
-
|
34
|
-
version: 0.2.
|
30
|
+
- 1
|
31
|
+
version: 0.2.1
|
35
32
|
type: :runtime
|
36
33
|
version_requirements: *id001
|
37
34
|
- !ruby/object:Gem::Dependency
|
38
35
|
name: nokogiri
|
39
36
|
prerelease: false
|
40
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
38
|
requirements:
|
43
39
|
- - ">="
|
44
40
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 29
|
46
41
|
segments:
|
47
42
|
- 1
|
48
43
|
- 3
|
@@ -54,11 +49,9 @@ dependencies:
|
|
54
49
|
name: rspec
|
55
50
|
prerelease: false
|
56
51
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
52
|
requirements:
|
59
53
|
- - ">="
|
60
54
|
- !ruby/object:Gem::Version
|
61
|
-
hash: 3
|
62
55
|
segments:
|
63
56
|
- 0
|
64
57
|
version: "0"
|
@@ -68,32 +61,40 @@ dependencies:
|
|
68
61
|
name: rdf-spec
|
69
62
|
prerelease: false
|
70
63
|
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
-
none: false
|
72
64
|
requirements:
|
73
65
|
- - ">="
|
74
66
|
- !ruby/object:Gem::Version
|
75
|
-
hash: 3
|
76
67
|
segments:
|
77
68
|
- 0
|
78
|
-
|
69
|
+
- 2
|
70
|
+
- 1
|
71
|
+
version: 0.2.1
|
79
72
|
type: :development
|
80
73
|
version_requirements: *id004
|
81
74
|
- !ruby/object:Gem::Dependency
|
82
|
-
name:
|
75
|
+
name: rdf-isomorphic
|
83
76
|
prerelease: false
|
84
77
|
requirement: &id005 !ruby/object:Gem::Requirement
|
85
|
-
none: false
|
86
78
|
requirements:
|
87
79
|
- - ">="
|
88
80
|
- !ruby/object:Gem::Version
|
89
|
-
hash: 3
|
90
81
|
segments:
|
91
|
-
- 2
|
92
|
-
- 3
|
93
82
|
- 0
|
94
|
-
version:
|
83
|
+
version: "0"
|
95
84
|
type: :development
|
96
85
|
version_requirements: *id005
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: yard
|
88
|
+
prerelease: false
|
89
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
type: :development
|
97
|
+
version_requirements: *id006
|
97
98
|
description: " RDF::RDFXML is an RDF/XML reader and writer for Ruby using the RDF.rb library suite.\n"
|
98
99
|
email: gregg@kellogg-assoc.com
|
99
100
|
executables: []
|
@@ -102,6 +103,7 @@ extensions: []
|
|
102
103
|
|
103
104
|
extra_rdoc_files:
|
104
105
|
- AUTHORS
|
106
|
+
- CONTRIBUTORS
|
105
107
|
- History.txt
|
106
108
|
- README.rdoc
|
107
109
|
files:
|
@@ -510,27 +512,23 @@ rdoc_options:
|
|
510
512
|
require_paths:
|
511
513
|
- lib
|
512
514
|
required_ruby_version: !ruby/object:Gem::Requirement
|
513
|
-
none: false
|
514
515
|
requirements:
|
515
516
|
- - ">="
|
516
517
|
- !ruby/object:Gem::Version
|
517
|
-
hash: 3
|
518
518
|
segments:
|
519
519
|
- 0
|
520
520
|
version: "0"
|
521
521
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
522
|
-
none: false
|
523
522
|
requirements:
|
524
523
|
- - ">="
|
525
524
|
- !ruby/object:Gem::Version
|
526
|
-
hash: 3
|
527
525
|
segments:
|
528
526
|
- 0
|
529
527
|
version: "0"
|
530
528
|
requirements: []
|
531
529
|
|
532
530
|
rubyforge_project:
|
533
|
-
rubygems_version: 1.3.
|
531
|
+
rubygems_version: 1.3.6
|
534
532
|
signing_key:
|
535
533
|
specification_version: 3
|
536
534
|
summary: RDF/XML reader/writer for RDF.rb.
|