diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e1a059..0aaedb9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,15 +15,15 @@ jobs: runs-on: ubuntu-latest env: CI: true + ALLOW_FAILURES: ${{ endsWith(matrix.ruby, 'head') }} strategy: fail-fast: false matrix: ruby: - - 2.4 - - 2.5 - 2.6 - 2.7 - 3.0 + - 3.1 - ruby-head - jruby steps: @@ -36,5 +36,9 @@ jobs: - name: Install dependencies run: bundle install --jobs 4 --retry 3 - name: Run tests - run: bundle exec rspec spec - + run: ruby --version; bundle exec rspec spec || $ALLOW_FAILURES + - name: Coveralls GitHub Action + uses: coverallsapp/github-action@v1.1.2 + if: "matrix.ruby == '3.0'" + with: + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a649ce7..0000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: ruby -env: - - CI=true -rvm: - - 2.4 - - 2.5 - - 2.6 - - 2.7 - - jruby -cache: bundler -sudo: false -matrix: - allow_failures: - - rvm: jruby -dist: trusty diff --git a/Gemfile b/Gemfile index 903745a..532aefd 100644 --- a/Gemfile +++ b/Gemfile @@ -17,6 +17,6 @@ group :development, :test do gem 'rdf-vocab', git: "https://github.com/ruby-rdf/rdf-vocab", branch: "develop" gem 'sxp', git: "https://github.com/dryruby/sxp.rb", branch: "develop" gem "redcarpet", platform: :ruby - gem 'simplecov', platforms: :mri - gem 'coveralls', '~> 0.8', platforms: :mri + gem 'simplecov', '~> 0.21', platforms: :mri + gem 'simplecov-lcov', '~> 0.8', platforms: :mri end diff --git a/README.md b/README.md index 2788623..834d431 100755 --- a/README.md +++ b/README.md @@ -38,6 +38,16 @@ Write a repository to a file: Note that reading and writing of graphs is also possible, but as graphs have only a single context, it is not particularly interesting for TriG. +## RDF-star + +Both reader and writer include provisional support for [RDF-star][]. + +Internally, an `RDF::Statement` is treated as another resource, along with `RDF::URI` and `RDF::Node`, which allows an `RDF::Statement` to have a `#subject` or `#object` which is also an `RDF::Statement`. + +Note that this requires the `rdfstar` option to be se. + +**Note: This feature is subject to change or elimination as the standards process progresses.** + ## Documentation Full documentation available on [Rubydoc.info][TriG doc]. @@ -58,9 +68,9 @@ There is a new `:stream` option to {RDF::TriG::Writer} which is more efficient f ## Dependencies -* [Ruby](https://ruby-lang.org/) (>= 2.2.2) -* [RDF.rb](https://rubygems.org/gems/rdf) (~> 3.0) -* [rdf-turtle](https://rubygems.org/gems/rdf-turtle) (~> 3.0) +* [Ruby](https://ruby-lang.org/) (>= 2.6) +* [RDF.rb](https://rubygems.org/gems/rdf) (~> 3.2) +* [rdf-turtle](https://rubygems.org/gems/rdf-turtle) (~> 3.2) ## Installation @@ -103,6 +113,7 @@ A copy of the [TriG EBNF][] and derived parser files are included in the reposit [PDD]: https://unlicense.org/#unlicensing-contributions [RDF.rb]: https://rubydoc.info/github/ruby-rdf/rdf/master/frames [Backports]: https://rubygems.org/gems/backports +[RDF-star]: https://w3c.github.io/rdf-star/rdf-star-cg-spec.html [TriG]: https://www.w3.org/TR/trig/ [TriG doc]: https://rubydoc.info/github/ruby-rdf/rdf-trig/master/file/README.markdown [TriG EBNF]: https://dvcs.w3.org/hg/rdf/raw-file/default/trig/trig.bnf diff --git a/VERSION b/VERSION index ef538c2..944880f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.1.2 +3.2.0 diff --git a/etc/rdf-star-earl.ttl b/etc/rdf-star-earl.ttl new file mode 100644 index 0000000..77dceac --- /dev/null +++ b/etc/rdf-star-earl.ttl @@ -0,0 +1,1009 @@ +@base . +@prefix dc: . +@prefix doap: . +@prefix earl: . +@prefix foaf: . +@prefix rdf: . +@prefix xsd: . + + a doap:GitRepository; + dc:title "RDF::TriG"; + doap:browse . + +<> a doap:Project, earl:TestSubject, earl:Software; + doap:name "RDF::TriG"; + doap:shortdesc "TriG reader/writer for the RDF.rb library suite"@en; + doap:description "TriG reader/writer for RDF.rb"; + doap:created "2011-12-22"^^xsd:date; + doap:blog ; + doap:developer ; + doap:documenter ; + doap:maintainer ; + doap:bug-database ; + doap:programming-language "Ruby"; + doap:repository ; + doap:mailing-list ; + doap:implements ; + doap:category , + ; + doap:homepage ; + doap:license ; + foaf:maker ; + dc:creator ; + dc:isPartOf . + + a foaf:OnlineAccount; + dc:created "2009-01-13T08:58:46-08:00"^^xsd:dateTime; + doap:homepage ; + foaf:accountName "gkellogg"; + foaf:accountServiceHomepage ; + foaf:name "GitHub"; + foaf:page . + + a foaf:Person; + foaf:mbox ; + foaf:mbox_sha1sum "35bc44e6d0070e5ad50ccbe0d24403c96af2b9bd"; + foaf:name "Gregg Kellogg"; + foaf:nick "gkellogg"; + foaf:developer _:proj; + foaf:account ; + foaf:based_near "San Rafael, CA"; + foaf:depiction ; + foaf:weblog . + +<> foaf:primaryTopic ; + dc:issued "2021-12-02T13:43:35-08:00"^^xsd:dateTime ; + foaf:maker . + + a foaf:Person, earl:Assertor; + foaf:name "Gregg Kellogg"; + foaf:title "Implementor"; + foaf:homepage . + + + doap:release . + + a doap:Version; + doap:name "rdf-turtle-3.1.2"; + doap:created "2021-02-02"^^xsd:date; + doap:revision "3.1.2" . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . + +[ a earl:Assertion; + earl:assertedBy ; + earl:subject ; + earl:test ; + earl:result [ + a earl:TestResult; + earl:outcome earl:passed; + dc:date "2021-12-02T13:43:35-08:00"^^xsd:dateTime]; + earl:mode earl:automatic ] . diff --git a/etc/trig.bnf b/etc/trig.bnf index ec5343c..197f048 100644 --- a/etc/trig.bnf +++ b/etc/trig.bnf @@ -4,44 +4,43 @@ | triples2 | GRAPH labelOrSubject wrappedGraph [3g] triplesOrGraph ::= labelOrSubject ( wrappedGraph | predicateObjectList '.' ) + | quotedTriple predicateObjectList '.' [4g] triples2 ::= blankNodePropertyList predicateObjectList? '.' | collection predicateObjectList '.' [5g] wrappedGraph ::= '{' triplesBlock? '}' [6g] triplesBlock ::= triples ( '.' triplesBlock? )? [7g] labelOrSubject ::= ( iri | BlankNode ) -[3] directive ::= prefixID | base -[4] prefixID ::= PREFIX PNAME_NS IRIREF "."? -[5] base ::= BASE IRIREF "."? +[3] directive ::= prefixID | base | sparqlPrefix | sparqlBase +[4] prefixID ::= PREFIX PNAME_NS IRIREF "."? +[5] base ::= BASE IRIREF "."? +[5s] sparqlPrefix ::= "PREFIX" PNAME_NS IRIREF +[6s] sparqlBase ::= "BASE" IRIREF [6] triples ::= subject predicateObjectList | blankNodePropertyList predicateObjectList? [7] predicateObjectList ::= verb objectList (';' (verb objectList)? )* -[8] objectList ::= object ( "," object )* +[8] objectList ::= object annotation? ( "," object annotation? )* [9] verb ::= predicate | "a" -[10] subject ::= iri | blank +[10] subject ::= iri | blank | quotedTriple [11] predicate ::= iri -[12] object ::= iri - | blank - | blankNodePropertyList - | literal +[12] object ::= iri | blank | blankNodePropertyList | literal | quotedTriple [13] literal ::= RDFLiteral | NumericLiteral | BooleanLiteral [14] blank ::= BlankNode | collection [15] blankNodePropertyList ::= "[" predicateObjectList "]" [16] collection ::= "(" object* ")" -[17] NumericLiteral ::= INTEGER - | DECIMAL - | DOUBLE +[17] NumericLiteral ::= INTEGER | DECIMAL | DOUBLE [128s] RDFLiteral ::= String ( LANGTAG | ( "^^" iri ) )? [133s] BooleanLiteral ::= "true" | "false" [18] String ::= STRING_LITERAL_QUOTE | STRING_LITERAL_SINGLE_QUOTE | STRING_LITERAL_LONG_SINGLE_QUOTE | STRING_LITERAL_LONG_QUOTE -[135s] iri ::= IRIREF - | PrefixedName -[136s] PrefixedName ::= PNAME_LN - | PNAME_NS -[137s] BlankNode ::= BLANK_NODE_LABEL - | ANON +[135s] iri ::= IRIREF | PrefixedName +[136s] PrefixedName ::= PNAME_LN | PNAME_NS +[137s] BlankNode ::= BLANK_NODE_LABEL | ANON +[27] quotedTriple ::= "<<" qtSubject predicate qtObject ">>" +[28] qtSubject ::= iri | BlankNode | quotedTriple +[29] qtObject ::= iri | BlankNode | literal | quotedTriple +[30] annotation ::= '{|' predicateObjectList '|}' @terminals diff --git a/lib/rdf/trig/reader.rb b/lib/rdf/trig/reader.rb index 352325a..4af5b4e 100644 --- a/lib/rdf/trig/reader.rb +++ b/lib/rdf/trig/reader.rb @@ -193,7 +193,7 @@ def read_triples2 end when '<<' prod(:triples2) do - subject = read_embTriple || error("Failed to parse embedded triple", production: :triples2, token: @lexer.first) + subject = read_quotedTriple || error("Failed to parse embedded triple", production: :triples2, token: @lexer.first) token = @lexer.first case token && (token.type || token.value) when 'a', :IRIREF, :PNAME_LN, :PNAME_NS then read_predicateObjectList(subject) diff --git a/rdf-trig.gemspec b/rdf-trig.gemspec index ae89c7b..fc52080 100755 --- a/rdf-trig.gemspec +++ b/rdf-trig.gemspec @@ -18,17 +18,17 @@ Gem::Specification.new do |gem| gem.files = %w(AUTHORS README.md History UNLICENSE VERSION) + Dir.glob('lib/**/*.rb') gem.require_paths = %w(lib) - gem.required_ruby_version = '>= 2.4' + gem.required_ruby_version = '>= 2.6' gem.requirements = [] - gem.add_runtime_dependency 'rdf', '~> 3.1' - gem.add_runtime_dependency 'ebnf', '~> 2.1' - gem.add_runtime_dependency 'rdf-turtle', '~> 3.1' - gem.add_development_dependency 'json-ld', '~> 3.1' + gem.add_runtime_dependency 'rdf', '~> 3.2' + gem.add_runtime_dependency 'ebnf', '~> 2.3' + gem.add_runtime_dependency 'rdf-turtle', '~> 3.2' + gem.add_development_dependency 'json-ld', '~> 3.2' gem.add_development_dependency 'rspec', '~> 3.10' gem.add_development_dependency 'rspec-its', '~> 1.3' - gem.add_development_dependency 'rdf-isomorphic', '~> 3.1' + gem.add_development_dependency 'rdf-isomorphic', '~> 3.2' gem.add_development_dependency 'yard' , '~> 0.9' - gem.add_development_dependency 'rdf-spec', '~> 3.1' + gem.add_development_dependency 'rdf-spec', '~> 3.2' gem.post_install_message = nil end diff --git a/script/tc b/script/tc index 3162972..2fc5169 100755 --- a/script/tc +++ b/script/tc @@ -48,19 +48,20 @@ def run_tc(tc, **options) if options[:verbose] puts "\nTestCase: #{tc.inspect}" - puts "\nInput:\n" + tc.input - puts "\nExpected:\n" + tc.expected + puts "\nInput:\n" + tc.input + puts "\nExpected:\n" + tc.expected if tc.result end + logger = options[:live] ? Logger.new(STDERR) : RDF::Spec.logger + logger.level = options[:level] + logger.formatter = lambda {|severity, datetime, progname, msg| "%5s %s\n" % [severity, msg]} + begin puts "open #{tc.action}" if options[:verbose] - tc.warnings = [] - tc.errors = [] options = { base_uri: tc.base, - warnings: tc.warnings, - errors: tc.errors, - validate: true + validate: true, + logger: logger }.merge(options) reader = RDF::Reader.for(tc.action).new(tc.input, **options) @@ -86,12 +87,14 @@ def run_tc(tc, **options) end if tc.evaluate? && result.nil? - output_graph = RDF::Repository.load(tc.result, :format => :nquads, :base_uri => tc.base) + output_graph = RDF::Repository.load(tc.result, format: :nquads, base_uri: tc.base, rdfstar: true) result = graph.isomorphic_with?(output_graph) ? "passed" : "failed" else result ||= "passed" end + rescue Interrupt => e + raise e rescue Exception => e STDERR.puts "#{"exception:" unless options[:quiet]}: #{e}" if options[:quiet] @@ -100,6 +103,8 @@ def run_tc(tc, **options) raise end end + + STDERR.puts options[:logger] if options[:verbose] && !options[:live] if options[:earl] options[:output].puts %{ @@ -121,73 +126,98 @@ def run_tc(tc, **options) puts "#{"test result:" unless options[:quiet]} #{result}" end -logger = Logger.new(STDERR) -logger.level = Logger::WARN -logger.formatter = lambda {|severity, datetime, progname, msg| "#{severity}: #{msg}\n"} - options = { output: STDOUT, - logger: logger + level: Logger::WARN } -opts = GetoptLong.new( - ["--help", "-?", GetoptLong::NO_ARGUMENT], - ["--dbg", GetoptLong::NO_ARGUMENT], - ["--earl", GetoptLong::NO_ARGUMENT], - ["--quiet", "-q", GetoptLong::NO_ARGUMENT], - ["--nquads", GetoptLong::NO_ARGUMENT], - ["--output", "-o", GetoptLong::REQUIRED_ARGUMENT], - ["--skip-long", "-s", GetoptLong::NO_ARGUMENT], - ["--validate", GetoptLong::NO_ARGUMENT], - ["--verbose", "-v", GetoptLong::NO_ARGUMENT] -) - -def help(**options) - puts "Usage: #{$0} [options] [test-number ...]" - puts "Options:" - puts " --debug: Display detailed debug output" - puts " --earl: Generate EARL report" - puts " --quiet: Minimal output" - puts " --nquads: Run N-Quads tests" - puts " --output: Output to specified file" - puts " --skip-long: Avoid files taking too much time" - puts " --validate: Validate input" - puts " --verbose: Verbose processing" - puts " --help,-?: This message" - exit(0) +OPT_ARGS = [ + ["--debug", GetoptLong::NO_ARGUMENT, "Debugging output"], + ["--earl", GetoptLong::NO_ARGUMENT, "Generate EARL report"], + ["--help", "-?", GetoptLong::NO_ARGUMENT, "print this message"], + ["--info", GetoptLong::NO_ARGUMENT, "Show progress on execution"], + ["--live", GetoptLong::NO_ARGUMENT, "Show live parsing results, not buffered"], + ["--nquads", GetoptLong::NO_ARGUMENT, "Run N-Quads tests"], + ["--output", "-o", GetoptLong::REQUIRED_ARGUMENT, "Output to specified file"], + ["--quiet", "-q", GetoptLong::NO_ARGUMENT, "Minimal output"], + ["--rdfstar", GetoptLong::NO_ARGUMENT, "Run RDF-star tests"], + ["--skip-slow", "-s", GetoptLong::NO_ARGUMENT, "Avoid files taking too much time"], + ["--validate", GetoptLong::NO_ARGUMENT, "Validate input"], + ["--verbose", "-v", GetoptLong::NO_ARGUMENT, "Verbose output"], + #["--write-manifests", GetoptLong::NO_ARGUMENT, "Write out the parsed manifests for earl reporting"], +] + +def usage(**options) + STDERR.puts %{ + Turtle version #{RDF::N3::VERSION} + Run Turtle tests. + + Usage: #{$0} [options] [test-number ...] + }.gsub(/^ /, '') + width = OPT_ARGS.map do |o| + l = o.first.length + l += o[1].length + 2 if o[1].is_a?(String) + l + end.max + OPT_ARGS.each do |o| + s = " %-*s " % [width, (o[1].is_a?(String) ? "#{o[0,2].join(', ')}" : o[0])] + s += o.last + STDERR.puts s + end + exit(1) end +opts = GetoptLong.new(*OPT_ARGS.map {|o| o[0..-2]}) + opts.each do |opt, arg| case opt - when '--help' then help(**options) - when '--dbg' then logger.level = Logger::DEBUG + when '--help' then usage(**options) + when '--debug' then options[:level] = Logger::DEBUG when '--earl' options[:quiet] = options[:earl] = true - logger.level = Logger::FATAL + options[:level] = Logger::FATAL + when '--info' then options[:level] = Logger::INFO + when '--live' then options[:live] = true when '--nquads' then options[:nquads] = true when '--output' then options[:output] = File.open(arg, "w") when '--quiet' options[:quiet] = true - logger.level = Logger::FATAL - when '--skip-long' then options[:skip] = true + options[:level] = Logger::FATAL + when '--rdfstar' then options[:rdfstar] = true + when '--skip-slow' then options[:slow] = true when '--validate' then options[:validate] = true when '--verbose' then options[:verbose] = true + # when '--write-manifests' then options[:write_manifests] = true end end -manifests = (options[:nquads] ? [Fixtures::SuiteTest::NQBASE] : [Fixtures::SuiteTest::BASE]).map {|b| b + "manifest.ttl"} +manifests = if options[:rdfstar] + %w{nt/syntax turtle/syntax turtle/eval trig/syntax trig/eval}.map do + |man| "https://w3c.github.io/rdf-star/tests/#{man}/" + end +elsif options[:nquads] + [Fixtures::SuiteTest::NQBASE] +else + [Fixtures::SuiteTest::BASE] +end.map {|m| "#{m}manifest.ttl"} earl_preamble(**options) if options[:earl] result_count = {} -manifests.each do |manifest| - Fixtures::SuiteTest::Manifest.open(manifest) do |m| - m.entries.each do |tc| - next unless ARGV.empty? || ARGV.any? {|n| tc.name.match(/#{n}/)} - run_tc(tc, result_count: result_count, **options) +begin + manifests.each do |manifest| + Fixtures::SuiteTest::Manifest.open(manifest) do |m| + m.entries.each do |tc| + next unless ARGV.empty? || ARGV.any? {|n| tc.name.match(/#{n}/)} + run_tc(tc, result_count: result_count, **options) + end end end +rescue Interrupt => e + STDERR.puts "(interrupt)" + STDERR.puts "Backtrace: " + e.backtrace.join("\n ") if options[:verbose] + exit 1 end result_count.each do |result, count| diff --git a/spec/.gitignore b/spec/.gitignore index f059aaf..926071c 100644 --- a/spec/.gitignore +++ b/spec/.gitignore @@ -1,2 +1,3 @@ /uri-cache/ /w3c-rdf +/w3c-rdf-star diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4ed48fb..f62b791 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -11,10 +11,17 @@ require 'rdf/isomorphic' begin require 'simplecov' - require 'coveralls' + require 'simplecov-lcov' + + SimpleCov::Formatter::LcovFormatter.config do |config| + #Coveralls is coverage by default/lcov. Send info results + config.report_with_single_file = true + config.single_report_path = 'coverage/lcov.info' + end + SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([ SimpleCov::Formatter::HTMLFormatter, - Coveralls::SimpleCov::Formatter + SimpleCov::Formatter::LcovFormatter ]) SimpleCov.start do add_filter "/spec/" diff --git a/spec/star_spec.rb b/spec/star_spec.rb index f94c0b1..64c09dd 100644 --- a/spec/star_spec.rb +++ b/spec/star_spec.rb @@ -6,7 +6,7 @@ describe "rdfstar turtle tests" do require 'suite_helper' - %w(turtle/syntax turtle/eval).each do |man| + %w(nt/syntax turtle/syntax turtle/eval trig/syntax trig/eval).each do |man| Fixtures::SuiteTest::Manifest.open("https://w3c.github.io/rdf-star/tests/#{man}/manifest.ttl") do |m| describe [m.label, m.comment].compact.join(': ') do m.entries.each do |t| @@ -32,7 +32,7 @@ end if t.evaluate? - output_graph = RDF::Repository.load(t.result, format: :ntriples, rdfstar: true, base_uri: t.base) + output_graph = RDF::Repository.load(t.result, format: :nquads, rdfstar: true, base_uri: t.base) expect(graph).to be_equivalent_graph(output_graph, t) else expect(graph).to be_a(RDF::Enumerable) @@ -40,7 +40,7 @@ else expect { graph << reader - expect(graph.dump(:ntriples)).to produce("not this", t) + expect(graph.dump(:nquads, rdfstar: true)).to produce("not this", t) }.to raise_error(RDF::ReaderError) end end diff --git a/spec/suite_helper.rb b/spec/suite_helper.rb index 0e91437..161326a 100644 --- a/spec/suite_helper.rb +++ b/spec/suite_helper.rb @@ -150,6 +150,7 @@ module SuiteTest "mq": "http://www.w3.org/2001/sw/DataAccess/tests/test-query#", "rdft": "http://www.w3.org/ns/rdftest#", + "label": "rdfs:label", "comment": "rdfs:comment", "entries": {"@id": "mf:entries", "@container": "@list"}, "name": "mf:name", diff --git a/spec/writer_spec.rb b/spec/writer_spec.rb index f8ae4c7..1adf2ae 100644 --- a/spec/writer_spec.rb +++ b/spec/writer_spec.rb @@ -315,7 +315,6 @@ m.entries.each do |t| next unless t.positive_test? && t.evaluate? specify "#{t.name}: #{t.comment}" do - pending("native literals canonicalized") if t.name == "trig-subm-26" repo = parse(t.expected, format: :nquads) trig = serialize(repo, [], base_uri: t.base, standard_prefixes: true) logger.info t.inspect @@ -326,7 +325,6 @@ end specify "#{t.name}: #{t.comment} (stream)" do - pending("native literals canonicalized") if t.name == "trig-subm-26" repo = parse(t.expected, format: :nquads) trig = serialize(repo, [], stream: true, base_uri: t.base, standard_prefixes: true) logger.info t.inspect