rdf-rdfxml 0.3.2.1 → 0.3.3
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.
- data/.yardopts +2 -1
- data/History.rdoc +5 -0
- data/README +95 -0
- data/README.md +31 -11
- data/Rakefile +5 -7
- data/VERSION +1 -1
- data/lib/rdf/rdfxml/format.rb +1 -1
- data/lib/rdf/rdfxml/reader.rb +0 -13
- data/lib/rdf/rdfxml/writer.rb +67 -56
- data/lib/rdf/rdfxml.rb +15 -1
- data/rdf-rdfxml.gemspec +13 -11
- data/script/tc +1 -1
- data/spec/format_spec.rb +9 -9
- data/spec/matchers.rb +72 -54
- data/spec/rdf_test.rb +1 -22
- data/spec/reader_spec.rb +17 -23
- data/spec/spec_helper.rb +6 -18
- data/spec/writer_spec.rb +448 -238
- metadata +8 -6
data/.yardopts
CHANGED
data/History.rdoc
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
=== 0.3.3
|
2
|
+
* Change licensing to UNLICENSE.
|
3
|
+
* Only generate prefix definitions for prefixes actually used within a serialization.
|
4
|
+
* Make sure that only valid QNames are generated in writer.
|
5
|
+
|
1
6
|
=== 0.3.2.1
|
2
7
|
* Fix collection serialization bug
|
3
8
|
* Assert :xml as a format type (by creating RDF::RDFXML::XML as a sub-class of Format that uses RDFXML::Reader/Writer)
|
data/README
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# RDF::RDFXML reader/writer
|
2
|
+
|
3
|
+
[RDF/XML][RDF/XML] parser for [RDF.rb][RDF.rb].
|
4
|
+
|
5
|
+
## DESCRIPTION
|
6
|
+
|
7
|
+
RDF::RDFXML is an [RDF/XML][RDF/XML] reader/writer for Ruby using the [RDF.rb][RDF.rb] library suite.
|
8
|
+
|
9
|
+
## FEATURES
|
10
|
+
RDF::RDFXML parses [RDF/XML][RDF/XML] into statements or triples and serializes triples, statements or graphs.
|
11
|
+
|
12
|
+
Fully compliant [RDF/XML][RDF/XML] parser and serializer.
|
13
|
+
|
14
|
+
Install with `gem install rdf-rdfxml`
|
15
|
+
|
16
|
+
## Usage:
|
17
|
+
Instantiate a parser and parse source, specifying type and base-URL
|
18
|
+
|
19
|
+
RDF::RDFXML::Reader.open("./etc/doap.xml") do |reader|
|
20
|
+
reader.each_statement do |statement|
|
21
|
+
puts statement.inspect
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
## Dependencies
|
26
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.1)
|
27
|
+
* [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.4.4)
|
28
|
+
|
29
|
+
## Documentation
|
30
|
+
Full documentation available on [RubyForge](http://rdf.rubyforge.org/rdfxml)
|
31
|
+
|
32
|
+
### Principle Classes
|
33
|
+
* {RDF::RDFXML}
|
34
|
+
* {RDF::RDFXML::Format}
|
35
|
+
* {RDF::RDFXML::Reader}
|
36
|
+
* {RDF::RDFXML::Writer}
|
37
|
+
|
38
|
+
### Additional vocabularies
|
39
|
+
* {RDF::XML}
|
40
|
+
|
41
|
+
### Patches
|
42
|
+
* {Array}
|
43
|
+
* {RDF::Graph}
|
44
|
+
* {RDF::Literal::XML}
|
45
|
+
* {Nokogiri::XML::Node}
|
46
|
+
|
47
|
+
## TODO
|
48
|
+
* Add support for LibXML and REXML bindings, and use the best available
|
49
|
+
* Consider a SAX-based parser for improved performance
|
50
|
+
|
51
|
+
## Resources
|
52
|
+
* [RDF.rb][RDF.rb]
|
53
|
+
* [RDF/XML][RDF/XML]
|
54
|
+
* [Distiller](http://distiller.kellogg-assoc)
|
55
|
+
* [Documentation](http://rdf.rubyforge.org/rdfxml)
|
56
|
+
* [History](file:file.History.html)
|
57
|
+
* [RDF Tests](http://www.w3.org/2000/10/rdf-tests/rdfcore/allTestCases.html)
|
58
|
+
|
59
|
+
## Author
|
60
|
+
* [Gregg Kellogg](http://github.com/gkellogg) - <http://kellogg-assoc.com/>
|
61
|
+
|
62
|
+
## Contributors
|
63
|
+
* [Nicholas Humfrey](http://github.com/njh)
|
64
|
+
|
65
|
+
## Contributing
|
66
|
+
|
67
|
+
* Do your best to adhere to the existing coding conventions and idioms.
|
68
|
+
* Don't use hard tabs, and don't leave trailing whitespace on any line.
|
69
|
+
* Do document every method you add using [YARD][] annotations. Read the
|
70
|
+
[tutorial][YARD-GS] or just look at the existing code for examples.
|
71
|
+
* Don't touch the `.gemspec`, `VERSION` or `AUTHORS` files. If you need to
|
72
|
+
change them, do so on your private branch only.
|
73
|
+
* Do feel free to add yourself to the `CREDITS` file and the corresponding
|
74
|
+
list in the the `README`. Alphabetical order applies.
|
75
|
+
* Do note that in order for us to merge any non-trivial changes (as a rule
|
76
|
+
of thumb, additions larger than about 15 lines of code), we need an
|
77
|
+
explicit [public domain dedication][PDD] on record from you.
|
78
|
+
|
79
|
+
## License
|
80
|
+
|
81
|
+
This is free and unencumbered public domain software. For more information,
|
82
|
+
see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
83
|
+
|
84
|
+
## FEEDBACK
|
85
|
+
|
86
|
+
* gregg@kellogg-assoc.com
|
87
|
+
* <http://rubygems.org/rdf-rdfxml>
|
88
|
+
* <http://github.com/gkellogg/rdf-rdfxml>
|
89
|
+
* <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
|
90
|
+
|
91
|
+
[RDF.rb]: http://rdf.rubyforge.org/
|
92
|
+
[RDF/XML]: http://www.w3.org/TR/REC-rdf-syntax/ "RDF/XML Syntax Specification"
|
93
|
+
[YARD]: http://yardoc.org/
|
94
|
+
[YARD-GS]: http://rubydoc.info/docs/yard/file/docs/GettingStarted.md
|
95
|
+
[PDD]: http://lists.w3.org/Archives/Public/public-rdf-ruby/2010May/0013.html
|
data/README.md
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
# RDF::RDFXML reader/writer
|
2
2
|
|
3
|
-
RDF/XML parser for RDF.rb.
|
3
|
+
[RDF/XML][RDF/XML] parser for [RDF.rb][RDF.rb].
|
4
4
|
|
5
5
|
## DESCRIPTION
|
6
6
|
|
7
|
-
RDF::RDFXML is an RDF/XML reader/writer for Ruby using the RDF.rb library suite.
|
7
|
+
RDF::RDFXML is an [RDF/XML][RDF/XML] reader/writer for Ruby using the [RDF.rb][RDF.rb] library suite.
|
8
8
|
|
9
9
|
## FEATURES
|
10
|
-
RDF::RDFXML parses RDF/XML into statements or triples and serializes triples, statements or graphs.
|
10
|
+
RDF::RDFXML parses [RDF/XML][RDF/XML] into statements or triples and serializes triples, statements or graphs.
|
11
11
|
|
12
|
-
Fully compliant RDF/XML parser and serializer.
|
12
|
+
Fully compliant [RDF/XML][RDF/XML] parser and serializer.
|
13
13
|
|
14
|
-
Install with
|
14
|
+
Install with `gem install rdf-rdfxml`
|
15
15
|
|
16
16
|
## Usage:
|
17
17
|
Instantiate a parser and parse source, specifying type and base-URL
|
@@ -49,19 +49,33 @@ Full documentation available on [RubyForge](http://rdf.rubyforge.org/rdfxml)
|
|
49
49
|
* Consider a SAX-based parser for improved performance
|
50
50
|
|
51
51
|
## Resources
|
52
|
-
* [RDF.rb]
|
52
|
+
* [RDF.rb][RDF.rb]
|
53
|
+
* [RDF/XML][RDF/XML]
|
53
54
|
* [Distiller](http://distiller.kellogg-assoc)
|
54
|
-
* [Documentation](http://rdf.rubyforge.org/
|
55
|
+
* [Documentation](http://rdf.rubyforge.org/rdfxml)
|
55
56
|
* [History](file:file.History.html)
|
56
|
-
* [XHTML+RDFXML 1.1 Core](http://www.w3.org/TR/2010/WD-xhtml-rdfa-20100422/)
|
57
57
|
* [RDF Tests](http://www.w3.org/2000/10/rdf-tests/rdfcore/allTestCases.html)
|
58
58
|
|
59
|
-
##
|
59
|
+
## Author
|
60
60
|
* [Gregg Kellogg](http://github.com/gkellogg) - <http://kellogg-assoc.com/>
|
61
61
|
|
62
|
-
##
|
62
|
+
## Contributors
|
63
63
|
* [Nicholas Humfrey](http://github.com/njh)
|
64
64
|
|
65
|
+
## Contributing
|
66
|
+
|
67
|
+
* Do your best to adhere to the existing coding conventions and idioms.
|
68
|
+
* Don't use hard tabs, and don't leave trailing whitespace on any line.
|
69
|
+
* Do document every method you add using [YARD][] annotations. Read the
|
70
|
+
[tutorial][YARD-GS] or just look at the existing code for examples.
|
71
|
+
* Don't touch the `.gemspec`, `VERSION` or `AUTHORS` files. If you need to
|
72
|
+
change them, do so on your private branch only.
|
73
|
+
* Do feel free to add yourself to the `CREDITS` file and the corresponding
|
74
|
+
list in the the `README`. Alphabetical order applies.
|
75
|
+
* Do note that in order for us to merge any non-trivial changes (as a rule
|
76
|
+
of thumb, additions larger than about 15 lines of code), we need an
|
77
|
+
explicit [public domain dedication][PDD] on record from you.
|
78
|
+
|
65
79
|
## License
|
66
80
|
|
67
81
|
This is free and unencumbered public domain software. For more information,
|
@@ -72,4 +86,10 @@ see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
|
72
86
|
* gregg@kellogg-assoc.com
|
73
87
|
* <http://rubygems.org/rdf-rdfxml>
|
74
88
|
* <http://github.com/gkellogg/rdf-rdfxml>
|
75
|
-
* <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
|
89
|
+
* <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
|
90
|
+
|
91
|
+
[RDF.rb]: http://rdf.rubyforge.org/
|
92
|
+
[RDF/XML]: http://www.w3.org/TR/REC-rdf-syntax/ "RDF/XML Syntax Specification"
|
93
|
+
[YARD]: http://yardoc.org/
|
94
|
+
[YARD-GS]: http://rubydoc.info/docs/yard/file/docs/GettingStarted.md
|
95
|
+
[PDD]: http://lists.w3.org/Archives/Public/public-rdf-ruby/2010May/0013.html
|
data/Rakefile
CHANGED
@@ -7,19 +7,19 @@ begin
|
|
7
7
|
Jeweler::Tasks.new do |gemspec|
|
8
8
|
gemspec.name = "rdf-rdfxml"
|
9
9
|
gemspec.summary = "RDF/XML reader/writer for RDF.rb."
|
10
|
-
gemspec.description = %q(RDF::RDFXML is an RDF/XML reader and writer for
|
10
|
+
gemspec.description = %q(RDF::RDFXML is an RDF/XML reader and writer for the RDF.rb library suite.)
|
11
11
|
gemspec.email = "gregg@kellogg-assoc.com"
|
12
12
|
gemspec.homepage = "http://github.com/gkellogg/rdf-rdfxml"
|
13
13
|
gemspec.authors = ["Gregg Kellogg"]
|
14
|
-
gemspec.add_dependency('rdf', '>= 0.3.
|
14
|
+
gemspec.add_dependency('rdf', '>= 0.3.3')
|
15
15
|
gemspec.add_dependency('nokogiri', '>= 1.4.4')
|
16
16
|
gemspec.add_development_dependency('open-uri-cached')
|
17
17
|
gemspec.add_development_dependency('spira', '>= 0.0.12')
|
18
18
|
gemspec.add_development_dependency('rspec', '>= 2.5.0')
|
19
|
-
gemspec.add_development_dependency('rdf-spec', '>= 0.3.
|
19
|
+
gemspec.add_development_dependency('rdf-spec', '>= 0.3.3')
|
20
20
|
gemspec.add_development_dependency('rdf-isomorphic', '>= 0.3.4')
|
21
21
|
gemspec.add_development_dependency('yard', '>= 0.6.4')
|
22
|
-
gemspec.extra_rdoc_files = %w(README.md History.rdoc AUTHORS CONTRIBUTORS)
|
22
|
+
gemspec.extra_rdoc_files = %w(README.md History.rdoc AUTHORS CONTRIBUTORS UNLICENSE)
|
23
23
|
end
|
24
24
|
Jeweler::GemcutterTasks.new
|
25
25
|
rescue LoadError
|
@@ -40,9 +40,7 @@ RSpec::Core::RakeTask.new("doc:spec") do |spec|
|
|
40
40
|
spec.rspec_opts = ["--format", "html", "-o", "doc/spec.html"]
|
41
41
|
end
|
42
42
|
|
43
|
-
YARD::Rake::YardocTask.new
|
44
|
-
t.files = %w(lib/**/*.rb README.md History.txt AUTHORS CONTRIBUTORS) # optional
|
45
|
-
end
|
43
|
+
YARD::Rake::YardocTask.new
|
46
44
|
|
47
45
|
desc "Generate RDF Core Manifest.yml"
|
48
46
|
namespace :spec do
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.3
|
data/lib/rdf/rdfxml/format.rb
CHANGED
@@ -33,7 +33,7 @@ module RDF::RDFXML
|
|
33
33
|
# This allows the following:
|
34
34
|
#
|
35
35
|
# @example Obtaining an RDFXML format class
|
36
|
-
# RDF::Format.for(:xml) # RDF::RDFXML::XML
|
36
|
+
# RDF::Format.for(:xml) # RDF::RDFXML::XML
|
37
37
|
# RDF::Format.for(:xml).reader # RDF::RDFXML::Reader
|
38
38
|
# RDF::Format.for(:xml).writer # RDF::RDFXML::Writer
|
39
39
|
class XML < RDF::Format
|
data/lib/rdf/rdfxml/reader.rb
CHANGED
@@ -13,19 +13,6 @@ module RDF::RDFXML
|
|
13
13
|
CORE_SYNTAX_TERMS = %w(RDF ID about parseType resource nodeID datatype).map {|n| "http://www.w3.org/1999/02/22-rdf-syntax-ns##{n}"}
|
14
14
|
OLD_TERMS = %w(aboutEach aboutEachPrefix bagID).map {|n| "http://www.w3.org/1999/02/22-rdf-syntax-ns##{n}"}
|
15
15
|
|
16
|
-
NC_REGEXP = Regexp.new(
|
17
|
-
%{^
|
18
|
-
(?!\\\\u0301) # ́ is a non-spacing acute accent.
|
19
|
-
# It is legal within an XML Name, but not as the first character.
|
20
|
-
( [a-zA-Z_]
|
21
|
-
| \\\\u[0-9a-fA-F]
|
22
|
-
)
|
23
|
-
( [0-9a-zA-Z_\.-]
|
24
|
-
| \\\\u([0-9a-fA-F]{4})
|
25
|
-
)*
|
26
|
-
$},
|
27
|
-
Regexp::EXTENDED)
|
28
|
-
|
29
16
|
# The Recursive Baggage
|
30
17
|
class EvaluationContext # :nodoc:
|
31
18
|
attr_reader :base
|
data/lib/rdf/rdfxml/writer.rb
CHANGED
@@ -87,7 +87,7 @@ module RDF::RDFXML
|
|
87
87
|
super do
|
88
88
|
@graph = RDF::Graph.new
|
89
89
|
@uri_to_qname = {}
|
90
|
-
|
90
|
+
@uri_to_prefix = {}
|
91
91
|
block.call(self) if block_given?
|
92
92
|
end
|
93
93
|
end
|
@@ -138,7 +138,8 @@ module RDF::RDFXML
|
|
138
138
|
|
139
139
|
doc = Nokogiri::XML::Document.new
|
140
140
|
|
141
|
-
add_debug "\nserialize: graph
|
141
|
+
add_debug "\nserialize: graph of size #{@graph.size}"
|
142
|
+
add_debug "options: #{@options.inspect}"
|
142
143
|
|
143
144
|
preprocess
|
144
145
|
|
@@ -165,32 +166,46 @@ module RDF::RDFXML
|
|
165
166
|
end
|
166
167
|
end
|
167
168
|
|
169
|
+
add_debug "doc:\n #{doc.to_xml(:encoding => "UTF-8", :indent => 2)}"
|
168
170
|
doc.write_xml_to(@output, :encoding => "UTF-8", :indent => 2)
|
169
171
|
end
|
170
172
|
|
171
173
|
# Return a QName for the URI, or nil. Adds namespace of QName to defined prefixes
|
172
|
-
# @param [URI,#to_s]
|
173
|
-
# @
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
174
|
+
# @param [URI,#to_s] resource
|
175
|
+
# @param [Hash<Symbol => Object>] options
|
176
|
+
# @option [Boolean] :with_default (false) If a default mapping exists, use it, otherwise if a prefixed mapping exists, use it
|
177
|
+
# @return [String, nil] value to use to identify URI
|
178
|
+
def get_qname(resource, options = {})
|
179
|
+
case resource
|
180
|
+
when RDF::Node
|
181
|
+
add_debug "qname(#{resource.inspect}): #{resource}"
|
182
|
+
return resource.to_s
|
183
|
+
when RDF::URI
|
184
|
+
uri = resource.to_s
|
185
|
+
else
|
186
|
+
add_debug "qname(#{resource.inspect}): nil"
|
187
|
+
return nil
|
188
|
+
end
|
189
|
+
|
190
|
+
qname = case
|
191
|
+
when options[:with_default] && prefix(nil) && uri.index(prefix(nil)) == 0
|
192
|
+
# Don't cache
|
193
|
+
add_debug "qname(#{resource.inspect}): #{uri.sub(prefix(nil), '').inspect} (default)"
|
194
|
+
return uri.sub(prefix(nil), '')
|
195
|
+
when @uri_to_qname.has_key?(uri)
|
196
|
+
add_debug "qname(#{resource.inspect}): #{@uri_to_qname[uri].inspect} (cached)"
|
197
|
+
return @uri_to_qname[uri]
|
198
|
+
when u = @uri_to_prefix.keys.detect {|u| uri.index(u.to_s) == 0 && NC_REGEXP.match(uri[u.to_s.length..-1])}
|
199
|
+
# Use a defined prefix
|
200
|
+
prefix = @uri_to_prefix[u]
|
201
|
+
prefix(prefix, u) # Define for output
|
202
|
+
uri.sub(u.to_s, "#{prefix}:")
|
203
|
+
when @options[:standard_prefixes] && vocab = RDF::Vocabulary.detect {|v| uri.index(v.to_uri.to_s) == 0 && NC_REGEXP.match(uri[v.to_uri.to_s.length..-1])}
|
204
|
+
prefix = vocab.__name__.to_s.split('::').last.downcase
|
205
|
+
@uri_to_prefix[vocab.to_uri.to_s] = prefix
|
206
|
+
prefix(prefix, vocab.to_uri) # Define for output
|
207
|
+
uri.sub(vocab.to_uri.to_s, "#{prefix}:")
|
208
|
+
else
|
194
209
|
|
195
210
|
# No vocabulary found, invent one
|
196
211
|
# Add bindings for predicates not already having bindings
|
@@ -200,20 +215,20 @@ module RDF::RDFXML
|
|
200
215
|
# in order to break a URI into a namespace name and a local name, split it after the last XML non-NCName
|
201
216
|
# character, ensuring that the first character of the name is a Letter or '_'. If the URI ends in a
|
202
217
|
# non-NCName character then throw a "this graph cannot be serialized in RDF/XML" exception or error.
|
203
|
-
separation = uri.
|
218
|
+
separation = uri.rindex(%r{[^a-zA-Z_0-9-][a-zA-Z_][a-z0-9A-Z_-]*$})
|
204
219
|
return @uri_to_qname[uri] = nil unless separation
|
205
220
|
base_uri = uri.to_s[0..separation]
|
206
221
|
suffix = uri.to_s[separation+1..-1]
|
207
222
|
@gen_prefix = @gen_prefix ? @gen_prefix.succ : "ns0"
|
208
|
-
|
223
|
+
@uri_to_prefix[base_uri] = @gen_prefix
|
209
224
|
prefix(@gen_prefix, base_uri)
|
210
|
-
|
211
|
-
return @uri_to_qname[uri] = [@gen_prefix.to_sym, suffix.to_sym]
|
225
|
+
"#{@gen_prefix}:#{suffix}"
|
212
226
|
end
|
213
227
|
|
214
|
-
|
215
|
-
|
216
|
-
|
228
|
+
add_debug "qname(#{resource.inspect}): #{qname.inspect}"
|
229
|
+
@uri_to_qname[uri] = qname
|
230
|
+
rescue Addressable::URI::InvalidURIError => e
|
231
|
+
raise RDF::WriterError, "Invalid URI #{uri.inspect}: #{e.message}"
|
217
232
|
end
|
218
233
|
|
219
234
|
protected
|
@@ -261,6 +276,19 @@ module RDF::RDFXML
|
|
261
276
|
|
262
277
|
# Perform any preprocessing of statements required
|
263
278
|
def preprocess
|
279
|
+
default_namespace = @options[:default_namespace] || prefix(nil)
|
280
|
+
|
281
|
+
# Load defined prefixes
|
282
|
+
(@options[:prefixes] || {}).each_pair do |k, v|
|
283
|
+
@uri_to_prefix[v.to_s] = k
|
284
|
+
end
|
285
|
+
@options[:prefixes] = {} # Will define actual used when matched
|
286
|
+
|
287
|
+
if default_namespace
|
288
|
+
add_debug("preprocess: default_namespace: #{default_namespace}")
|
289
|
+
prefix(nil, default_namespace)
|
290
|
+
end
|
291
|
+
|
264
292
|
@graph.each {|statement| preprocess_statement(statement)}
|
265
293
|
end
|
266
294
|
|
@@ -307,11 +335,10 @@ module RDF::RDFXML
|
|
307
335
|
end
|
308
336
|
|
309
337
|
rdf_type, *rest = properties.fetch(RDF.type.to_s, [])
|
310
|
-
qname =
|
311
|
-
add_debug "=> qname: #{qname.inspect}"
|
338
|
+
qname = get_qname(rdf_type, :with_default => true)
|
312
339
|
if rdf_type.is_a?(RDF::Node)
|
313
340
|
# Must serialize with an element
|
314
|
-
rdf_type = nil
|
341
|
+
qname = rdf_type = nil
|
315
342
|
elsif rest.empty?
|
316
343
|
properties.delete(RDF.type.to_s)
|
317
344
|
else
|
@@ -319,7 +346,6 @@ module RDF::RDFXML
|
|
319
346
|
end
|
320
347
|
prop_list = order_properties(properties)
|
321
348
|
add_debug "=> property order: #{prop_list.to_sentence}"
|
322
|
-
|
323
349
|
|
324
350
|
if qname
|
325
351
|
rdf_type = nil
|
@@ -374,7 +400,7 @@ module RDF::RDFXML
|
|
374
400
|
def predicate(prop, object, node, is_unique)
|
375
401
|
as_attr = predicate_as_attribute?(prop, object) && is_unique
|
376
402
|
|
377
|
-
qname =
|
403
|
+
qname = get_qname(prop, :with_default => !as_attr)
|
378
404
|
raise RDF::WriterError, "No qname generated for <#{prop}>" unless qname
|
379
405
|
|
380
406
|
add_debug "predicate: #{qname}, as_attr: #{as_attr}, object: #{object.inspect}, done: #{is_done?(object)}, subject: #{@subjects.include?(object)}"
|
@@ -475,8 +501,8 @@ module RDF::RDFXML
|
|
475
501
|
def order_properties(properties)
|
476
502
|
properties.keys.each do |k|
|
477
503
|
properties[k] = properties[k].sort do |a, b|
|
478
|
-
a_li = a.is_a?(RDF::URI) && get_qname(a) && get_qname(a).
|
479
|
-
b_li = b.is_a?(RDF::URI) && get_qname(b) && get_qname(b).
|
504
|
+
a_li = a.is_a?(RDF::URI) && get_qname(a) && get_qname(a).to_s =~ /:_\d+$/ ? a.to_i : a.to_s
|
505
|
+
b_li = b.is_a?(RDF::URI) && get_qname(b) && get_qname(b).to_s =~ /:_\d+$/ ? b.to_i : b.to_s
|
480
506
|
|
481
507
|
a_li <=> b_li
|
482
508
|
end
|
@@ -525,24 +551,9 @@ module RDF::RDFXML
|
|
525
551
|
#
|
526
552
|
# @param [String] message::
|
527
553
|
def add_debug(message)
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
# Return string representation of QName pair
|
533
|
-
#
|
534
|
-
# @option [Boolean] :with_default (false) If a default mapping exists, use it, otherwise if a prefixed mapping exists, use it
|
535
|
-
def get_qname_string(uri, options = {})
|
536
|
-
if qname = get_qname(uri)
|
537
|
-
if options[:with_default]
|
538
|
-
qname[0] = nil if !qname.first.nil? && prefix(qname.first).to_s == prefix(nil).to_s
|
539
|
-
elsif qname.first.nil?
|
540
|
-
prefix = nil
|
541
|
-
prefixes.each_pair {|k, v| prefix = k if !k.nil? && v.to_s == prefix(nil).to_s}
|
542
|
-
qname[0] = prefix if prefix
|
543
|
-
end
|
544
|
-
qname.first == nil ? qname.last.to_s : qname.map(&:to_s).join(":")
|
545
|
-
end
|
554
|
+
msg = "#{indent}#{message}"
|
555
|
+
STDERR.puts msg if ::RDF::RDFXML.debug?
|
556
|
+
@debug << msg if @debug.is_a?(Array)
|
546
557
|
end
|
547
558
|
end
|
548
559
|
end
|
data/lib/rdf/rdfxml.rb
CHANGED
@@ -29,7 +29,21 @@ module RDF
|
|
29
29
|
autoload :Writer, 'rdf/rdfxml/writer'
|
30
30
|
autoload :VERSION, 'rdf/rdfxml/version'
|
31
31
|
autoload :XML, 'rdf/rdfxml/vocab'
|
32
|
-
|
32
|
+
|
33
|
+
# Regexp matching an NCName.
|
34
|
+
NC_REGEXP = Regexp.new(
|
35
|
+
%{^
|
36
|
+
(?!\\\\u0301) # ́ is a non-spacing acute accent.
|
37
|
+
# It is legal within an XML Name, but not as the first character.
|
38
|
+
( [a-zA-Z_]
|
39
|
+
| \\\\u[0-9a-fA-F]
|
40
|
+
)
|
41
|
+
( [0-9a-zA-Z_\.-]
|
42
|
+
| \\\\u([0-9a-fA-F]{4})
|
43
|
+
)*
|
44
|
+
$},
|
45
|
+
Regexp::EXTENDED)
|
46
|
+
|
33
47
|
def self.debug?; @debug; end
|
34
48
|
def self.debug=(value); @debug = value; end
|
35
49
|
end
|
data/rdf-rdfxml.gemspec
CHANGED
@@ -5,24 +5,26 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rdf-rdfxml}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.3"
|
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{2011-
|
13
|
-
s.description = %q{RDF::RDFXML is an RDF/XML reader and writer for
|
12
|
+
s.date = %q{2011-04-25}
|
13
|
+
s.description = %q{RDF::RDFXML is an RDF/XML reader and writer for the RDF.rb library suite.}
|
14
14
|
s.email = %q{gregg@kellogg-assoc.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"AUTHORS",
|
17
17
|
"CONTRIBUTORS",
|
18
18
|
"History.rdoc",
|
19
|
-
"README.md"
|
19
|
+
"README.md",
|
20
|
+
"UNLICENSE"
|
20
21
|
]
|
21
22
|
s.files = [
|
22
23
|
".yardopts",
|
23
24
|
"AUTHORS",
|
24
25
|
"CONTRIBUTORS",
|
25
26
|
"History.rdoc",
|
27
|
+
"README",
|
26
28
|
"README.md",
|
27
29
|
"Rakefile",
|
28
30
|
"UNLICENSE",
|
@@ -58,7 +60,7 @@ Gem::Specification.new do |s|
|
|
58
60
|
]
|
59
61
|
s.homepage = %q{http://github.com/gkellogg/rdf-rdfxml}
|
60
62
|
s.require_paths = ["lib"]
|
61
|
-
s.rubygems_version = %q{1.
|
63
|
+
s.rubygems_version = %q{1.6.2}
|
62
64
|
s.summary = %q{RDF/XML reader/writer for RDF.rb.}
|
63
65
|
s.test_files = [
|
64
66
|
"spec/format_spec.rb",
|
@@ -75,31 +77,31 @@ Gem::Specification.new do |s|
|
|
75
77
|
s.specification_version = 3
|
76
78
|
|
77
79
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
78
|
-
s.add_runtime_dependency(%q<rdf>, [">= 0.3.
|
80
|
+
s.add_runtime_dependency(%q<rdf>, [">= 0.3.3"])
|
79
81
|
s.add_runtime_dependency(%q<nokogiri>, [">= 1.4.4"])
|
80
82
|
s.add_development_dependency(%q<open-uri-cached>, [">= 0"])
|
81
83
|
s.add_development_dependency(%q<spira>, [">= 0.0.12"])
|
82
84
|
s.add_development_dependency(%q<rspec>, [">= 2.5.0"])
|
83
|
-
s.add_development_dependency(%q<rdf-spec>, [">= 0.3.
|
85
|
+
s.add_development_dependency(%q<rdf-spec>, [">= 0.3.3"])
|
84
86
|
s.add_development_dependency(%q<rdf-isomorphic>, [">= 0.3.4"])
|
85
87
|
s.add_development_dependency(%q<yard>, [">= 0.6.4"])
|
86
88
|
else
|
87
|
-
s.add_dependency(%q<rdf>, [">= 0.3.
|
89
|
+
s.add_dependency(%q<rdf>, [">= 0.3.3"])
|
88
90
|
s.add_dependency(%q<nokogiri>, [">= 1.4.4"])
|
89
91
|
s.add_dependency(%q<open-uri-cached>, [">= 0"])
|
90
92
|
s.add_dependency(%q<spira>, [">= 0.0.12"])
|
91
93
|
s.add_dependency(%q<rspec>, [">= 2.5.0"])
|
92
|
-
s.add_dependency(%q<rdf-spec>, [">= 0.3.
|
94
|
+
s.add_dependency(%q<rdf-spec>, [">= 0.3.3"])
|
93
95
|
s.add_dependency(%q<rdf-isomorphic>, [">= 0.3.4"])
|
94
96
|
s.add_dependency(%q<yard>, [">= 0.6.4"])
|
95
97
|
end
|
96
98
|
else
|
97
|
-
s.add_dependency(%q<rdf>, [">= 0.3.
|
99
|
+
s.add_dependency(%q<rdf>, [">= 0.3.3"])
|
98
100
|
s.add_dependency(%q<nokogiri>, [">= 1.4.4"])
|
99
101
|
s.add_dependency(%q<open-uri-cached>, [">= 0"])
|
100
102
|
s.add_dependency(%q<spira>, [">= 0.0.12"])
|
101
103
|
s.add_dependency(%q<rspec>, [">= 2.5.0"])
|
102
|
-
s.add_dependency(%q<rdf-spec>, [">= 0.3.
|
104
|
+
s.add_dependency(%q<rdf-spec>, [">= 0.3.3"])
|
103
105
|
s.add_dependency(%q<rdf-isomorphic>, [">= 0.3.4"])
|
104
106
|
s.add_dependency(%q<yard>, [">= 0.6.4"])
|
105
107
|
end
|
data/script/tc
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'rubygems'
|
3
3
|
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", 'lib')))
|
4
4
|
require 'rdf/rdfxml'
|
5
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "..", 'spec', '
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", 'spec', 'rdf_helper'))
|
6
6
|
require 'getoptlong'
|
7
7
|
|
8
8
|
def run_tc(tc)
|
data/spec/format_spec.rb
CHANGED
@@ -4,15 +4,15 @@ require File.join(File.dirname(__FILE__), 'spec_helper')
|
|
4
4
|
describe RDF::RDFXML::Format do
|
5
5
|
context "discovery" do
|
6
6
|
{
|
7
|
-
"rdf"
|
8
|
-
"rdfxml"
|
9
|
-
"etc/foaf.xml"
|
10
|
-
"etc/foaf.rdf"
|
11
|
-
"foaf.xml"
|
12
|
-
"foaf.rdf"
|
13
|
-
".xml"
|
14
|
-
".rdf"
|
15
|
-
"application/xml"
|
7
|
+
"rdf" => RDF::Format.for(:rdf),
|
8
|
+
"rdfxml" => RDF::Format.for(:rdfxml),
|
9
|
+
"etc/foaf.xml" => RDF::Format.for("etc/foaf.xml"),
|
10
|
+
"etc/foaf.rdf" => RDF::Format.for("etc/foaf.rdf"),
|
11
|
+
"foaf.xml" => RDF::Format.for(:file_name => "foaf.xml"),
|
12
|
+
"foaf.rdf" => RDF::Format.for(:file_name => "foaf.xml"),
|
13
|
+
".xml" => RDF::Format.for(:file_extension => "xml"),
|
14
|
+
".rdf" => RDF::Format.for(:file_extension => "rdf"),
|
15
|
+
"application/xml" => RDF::Format.for(:content_type => "application/xml"),
|
16
16
|
"application/rdf+xml" => RDF::Format.for(:content_type => "application/rdf+xml"),
|
17
17
|
}.each_pair do |label, format|
|
18
18
|
it "should discover '#{label}'" do
|