diff --git a/.travis.yml b/.travis.yml index 0eecaf5..9e1f468 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,20 +4,15 @@ script: "bundle exec rspec spec" env: - CI=true rvm: - - 2.0 - - 2.1 - - 2.2.4 - - 2.3.0 - - jruby-9.0.4.0 - - rbx-2 -gemfile: - - Gemfile - - Gemfile-pure -env: - global: - - CI=true + - 2.2 + - 2.3 + - 2.4 + - jruby-9 + - rbx-3 cache: bundler sudo: false matrix: allow_failures: - - rvm: rbx-2 + - rvm: jruby-9 + - rvm: rbx-3 +dist: trusty diff --git a/Gemfile b/Gemfile index b28da4d..9ae9858 100644 --- a/Gemfile +++ b/Gemfile @@ -15,13 +15,12 @@ group :development do gem 'rdf-turtle', github: "ruby-rdf/rdf-turtle", branch: "develop" gem 'rdf-vocab', github: "ruby-rdf/rdf-vocab", branch: "develop" gem "rdf-xsd", github: "ruby-rdf/rdf-xsd", branch: "develop" - gem 'sxp', github: "gkellogg/sxp-ruby", branch: "develop" + gem 'sxp', github: "dryruby/sxp.rb", branch: "develop" gem "equivalent-xml" end group :debug do - gem "wirble" gem "ruby-debug", platforms: :jruby gem "byebug", platform: :mri end diff --git a/Gemfile-pure b/Gemfile-pure index 1f8f25a..91c89fb 100644 --- a/Gemfile-pure +++ b/Gemfile-pure @@ -15,13 +15,12 @@ group :development do gem 'rdf-turtle', github: "ruby-rdf/rdf-turtle", branch: "develop" gem 'rdf-vocab', github: "ruby-rdf/rdf-vocab", branch: "develop" gem "rdf-xsd", github: "ruby-rdf/rdf-xsd", branch: "develop" - gem 'sxp', github: "gkellogg/sxp-ruby", branch: "develop" + gem 'sxp', github: "dryruby/sxp.rb", branch: "develop" gem "equivalent-xml" end group :debug do - gem "wirble" gem "ruby-debug", platforms: :jruby gem "byebug", platform: :mri end diff --git a/README.md b/README.md index 37df1dd..0f46a9f 100755 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Install with `gem install rdf-rdfxml` * 100% free and unencumbered [public domain](http://unlicense.org/) software. * Implements a complete parser for [RDF/XML][]. -* Compatible with Ruby >= 2.0. +* Compatible with Ruby >= 2.2.2. ## Usage: Instantiate a parser and parse source, specifying type and base-URL diff --git a/VERSION b/VERSION index 227cea2..7ec1d6d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.0 +2.1.0 diff --git a/dependencyci.yml b/dependencyci.yml new file mode 100644 index 0000000..0c67c1b --- /dev/null +++ b/dependencyci.yml @@ -0,0 +1,5 @@ +platform: + Rubygems: + rdf-isomorphic: + tests: + unmaintained: skip \ No newline at end of file diff --git a/example-files/example07.rdf b/example-files/example07.rdf new file mode 100644 index 0000000..75c3256 --- /dev/null +++ b/example-files/example07.rdf @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/example-files/example08.rdf b/example-files/example08.rdf new file mode 100644 index 0000000..4974387 --- /dev/null +++ b/example-files/example08.rdf @@ -0,0 +1,15 @@ + + + + RDF/XML Syntax Specification (Revised) + RDF/XML Syntax Specification (Revised) + RDF/XML Syntax Specification (Revised) + + + + Der Baum + Das Buch ist außergewöhnlich + The Tree + + diff --git a/example-files/example09.rdf b/example-files/example09.rdf new file mode 100644 index 0000000..12697ef --- /dev/null +++ b/example-files/example09.rdf @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/example-files/example10.rdf b/example-files/example10.rdf new file mode 100644 index 0000000..0e172f9 --- /dev/null +++ b/example-files/example10.rdf @@ -0,0 +1,7 @@ + + + + 123 + + diff --git a/example-files/example11.rdf b/example-files/example11.rdf new file mode 100644 index 0000000..73ca564 --- /dev/null +++ b/example-files/example11.rdf @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/example-files/example12.rdf b/example-files/example12.rdf new file mode 100644 index 0000000..be34647 --- /dev/null +++ b/example-files/example12.rdf @@ -0,0 +1,12 @@ + + + + + Dave Beckett + + + + diff --git a/example-files/example13.rdf b/example-files/example13.rdf new file mode 100644 index 0000000..8fb5f08 --- /dev/null +++ b/example-files/example13.rdf @@ -0,0 +1,10 @@ + + + + + + + diff --git a/example-files/example14.rdf b/example-files/example14.rdf new file mode 100644 index 0000000..672af81 --- /dev/null +++ b/example-files/example14.rdf @@ -0,0 +1,9 @@ + + + + + A marvelous thing + + diff --git a/example-files/example15.rdf b/example-files/example15.rdf new file mode 100644 index 0000000..b00bec2 --- /dev/null +++ b/example-files/example15.rdf @@ -0,0 +1,8 @@ + + + + A marvelous thing + + diff --git a/example-files/example16.rdf b/example-files/example16.rdf new file mode 100644 index 0000000..7a47816 --- /dev/null +++ b/example-files/example16.rdf @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/example-files/example17.rdf b/example-files/example17.rdf new file mode 100644 index 0000000..c5b7ffc --- /dev/null +++ b/example-files/example17.rdf @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/example-files/example18.rdf b/example-files/example18.rdf new file mode 100644 index 0000000..94126d7 --- /dev/null +++ b/example-files/example18.rdf @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/example-files/example19.rdf b/example-files/example19.rdf new file mode 100644 index 0000000..0224350 --- /dev/null +++ b/example-files/example19.rdf @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/example-files/example20.rdf b/example-files/example20.rdf new file mode 100644 index 0000000..8493447 --- /dev/null +++ b/example-files/example20.rdf @@ -0,0 +1,8 @@ + + + + blah + + diff --git a/lib/rdf/rdfxml/reader.rb b/lib/rdf/rdfxml/reader.rb index 1e58910..427f3a9 100644 --- a/lib/rdf/rdfxml/reader.rb +++ b/lib/rdf/rdfxml/reader.rb @@ -337,8 +337,8 @@ def nodeElement(el, ec) # Determine the content type of this property element log_fatal "child must be a proxy not a #{child.class}" unless child.is_a?(@implementation::NodeProxy) - text_nodes = child.children.select {|e| e.text? && !e.blank?} - element_nodes = child.children.select {|c| c.element? } + text_nodes = child.children.select(&:text?) + element_nodes = child.children.select(&:element?) add_debug(child) {"#{text_nodes.to_a.length} text nodes, #{element_nodes.to_a.length} element nodes"} text_nodes.each do |node| diff --git a/lib/rdf/rdfxml/reader/nokogiri.rb b/lib/rdf/rdfxml/reader/nokogiri.rb index ed91a22..b57f0d1 100644 --- a/lib/rdf/rdfxml/reader/nokogiri.rb +++ b/lib/rdf/rdfxml/reader/nokogiri.rb @@ -81,6 +81,14 @@ def display_path end end + ## + # Return true of this is a text node + # + # @return [Array<:text, :element, :attribute>] + def text? + (@node.text? || @node.cdata?) && !@node.blank? + end + ## # Return true of all child elements are text # @@ -104,7 +112,7 @@ def namespaces def children @children ||= NodeSetProxy.new(@node.children, self) end - + # Ancestors of this element, in order def ancestors @ancestors ||= parent ? parent.ancestors + [parent] : [] diff --git a/lib/rdf/rdfxml/writer/haml_templates.rb b/lib/rdf/rdfxml/writer/haml_templates.rb index a981926..9dbaf89 100644 --- a/lib/rdf/rdfxml/writer/haml_templates.rb +++ b/lib/rdf/rdfxml/writer/haml_templates.rb @@ -38,7 +38,8 @@ class Writer - if expanded_type.start_with?('_:') - haml_tag(get_qname(RDF.type), "rdf:nodeID" => expanded_type[2..-1]) -else - - haml_tag(get_qname(RDF.type), "rdf:resource" => expanded_type) + - # FIXME: closing tag forces close tag, as :/ is not honored in 5.0.1 + - haml_tag(get_qname(RDF.type), "", "rdf:resource" => expanded_type) - predicates.each do |p| = yield(p) ), @@ -59,9 +60,11 @@ class Writer - haml_tag(property, :"<", "xml:lang" => object.language, "rdf:datatype" => (object.datatype unless object.plain?)) do = object.value.to_s.encode(xml: :text) - elsif object.node? - - haml_tag(property, :"/", "rdf:nodeID" => object.id) + - # FIXME: closing tag forces close tag, as :/ is not honored in 5.0.1 + - haml_tag(property, "", "rdf:nodeID" => object.id) - else - - haml_tag(property, :"/", "rdf:resource" => relativize(object)) + - # FIXME: closing tag forces close tag, as :/ is not honored in 5.0.1 + - haml_tag(property, "", "rdf:resource" => relativize(object)) ), # Outpust for a list @@ -75,9 +78,11 @@ class Writer - if recurse && res = yield(object) = res - elsif object.node? - - haml_tag(get_qname(RDF.Description), :"/", "rdf:nodeID" => (object.id if ref_count(object) > 1)) + - # FIXME: closing tag forces close tag, as :/ is not honored in 5.0.1 + - haml_tag(get_qname(RDF.Description), "", "rdf:nodeID" => (object.id if ref_count(object) > 1)) - else - - haml_tag(get_qname(RDF.Description), :"/", "rdf:about" => relativize(object)) + - # FIXME: closing tag forces close tag, as :/ is not honored in 5.0.1 + - haml_tag(get_qname(RDF.Description), "", "rdf:about" => relativize(object)) ), } HAML_TEMPLATES = {base: BASE_HAML} diff --git a/rdf-rdfxml.gemspec b/rdf-rdfxml.gemspec index adce721..3d375b8 100755 --- a/rdf-rdfxml.gemspec +++ b/rdf-rdfxml.gemspec @@ -20,7 +20,7 @@ Gem::Specification.new do |gem| gem.require_paths = %w(lib) gem.has_rdoc = false - gem.required_ruby_version = '>= 2.0' + gem.required_ruby_version = '>= 2.2.2' gem.requirements = [] gem.add_runtime_dependency 'rdf', '~> 2.0' diff --git a/spec/reader_spec.rb b/spec/reader_spec.rb index 264dfe0..f897dce 100644 --- a/spec/reader_spec.rb +++ b/spec/reader_spec.rb @@ -202,6 +202,24 @@ expect(graph).to be_equivalent_graph(expected, logger: logger) end + it "reads text from CDATA" do + sampledoc = %( + + + + + ) + expected = %( + . + "Text" . + ) + graph = parse(sampledoc, validate: true) + expect(graph).to be_equivalent_graph(expected, logger: logger) + end + context :exceptions do it "should raise an error if rdf:aboutEach is used, as per the negative parser test rdfms-abouteach-error001 (rdf:aboutEach attribute)" do sampledoc = %q( diff --git a/spec/writer_spec.rb b/spec/writer_spec.rb index d355bab..632314c 100644 --- a/spec/writer_spec.rb +++ b/spec/writer_spec.rb @@ -691,9 +691,9 @@ class FOO < RDF::Vocabulary("http://foo/"); end m.entries.each do |t| next unless t.positive_test? && t.evaluate? # Literal serialization adds namespace definitions - next if t.subject =~ /rdfms-xml-literal-namespaces|xml-canon/ specify "#{t.name}" do + pending if t.name == 'xml-canon-test001' unless defined?(::Nokogiri) pending("XML-C14XL") if t.name == "xml-canon-test001" end