From f605434a8abf36a33e5adf741343eb1e2dbd90c9 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Fri, 28 Jan 2022 11:49:50 -0800 Subject: [PATCH 01/10] Update documentation links to use gh-pages, and add action to publish gh-pages from Yard docs. --- .github/workflows/ci.yml | 2 +- .github/workflows/generate-docs.yml | 27 +++++++++++++++++++++++++++ README.md | 6 +++--- lib/rdf/trig.rb | 4 ++-- rdf-trig.gemspec | 7 +++++++ 5 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/generate-docs.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0aaedb9..9a760e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: ruby: - 2.6 - 2.7 - - 3.0 + - "3.0" - 3.1 - ruby-head - jruby diff --git a/.github/workflows/generate-docs.yml b/.github/workflows/generate-docs.yml new file mode 100644 index 0000000..b8d16ed --- /dev/null +++ b/.github/workflows/generate-docs.yml @@ -0,0 +1,27 @@ +name: Build & deploy documentation +on: + push: + branches: + - master + workflow_dispatch: +jobs: + build: + runs-on: ubuntu-latest + name: Update gh-pages with docs + steps: + - name: Clone repository + uses: actions/checkout@v2 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.1" + - name: Install required gem dependencies + run: gem install yard --no-document + - name: Build YARD Ruby Documentation + run: yardoc + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./doc/yard + publish_branch: gh-pages diff --git a/README.md b/README.md index 834d431..3551d00 100755 --- a/README.md +++ b/README.md @@ -111,10 +111,10 @@ A copy of the [TriG EBNF][] and derived parser files are included in the reposit [YARD]: https://yardoc.org/ [YARD-GS]: https://rubydoc.info/docs/yard/file/docs/GettingStarted.md [PDD]: https://unlicense.org/#unlicensing-contributions -[RDF.rb]: https://rubydoc.info/github/ruby-rdf/rdf/master/frames +[RDF.rb]: https://ruby-rdf.github.io/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 doc]: https://ruby-rdf.github.io/rdf-trig/master/file/README.markdown [TriG EBNF]: https://dvcs.w3.org/hg/rdf/raw-file/default/trig/trig.bnf -[Turtle doc]: https://rubydoc.info/github/ruby-rdf/rdf-turtle/master/file/README.markdown +[Turtle doc]: https://ruby-rdf.github.io/rdf-turtle/master/file/README.markdown diff --git a/lib/rdf/trig.rb b/lib/rdf/trig.rb index 9485e04..968b1b1 100644 --- a/lib/rdf/trig.rb +++ b/lib/rdf/trig.rb @@ -15,8 +15,8 @@ module RDF # end # end # - # @see https://rubydoc.info/github/ruby-rdf/rdf-turtle/ - # @see https://rubydoc.info/github/ruby-rdf/rdf/master/ + # @see https://ruby-rdf.github.io/rdf-turtle/ + # @see https://ruby-rdf.github.io/rdf/master/ # @see https://www.w3.org/TR/trig/ # # @author [Gregg Kellogg](https://greggkellogg.net/) diff --git a/rdf-trig.gemspec b/rdf-trig.gemspec index fc52080..c7e0dc6 100755 --- a/rdf-trig.gemspec +++ b/rdf-trig.gemspec @@ -10,6 +10,13 @@ Gem::Specification.new do |gem| gem.license = 'Unlicense' gem.summary = "TriG reader/writer for Ruby." gem.description = %q{RDF::TriG is an TriG reader/writer for the RDF.rb library suite.} + gem.metadata = { + "documentation_uri" => "https://ruby-rdf.github.io/rdf-trig", + "bug_tracker_uri" => "https://github.com/ruby-rdf/rdf-trig/issues", + "homepage_uri" => "https://github.com/ruby-rdf/rdf-trig", + "mailing_list_uri" => "https://lists.w3.org/Archives/Public/public-rdf-ruby/", + "source_code_uri" => "https://github.com/ruby-rdf/rdf-trig", + } gem.authors = ['Gregg Kellogg'] gem.email = 'public-rdf-ruby@w3.org' From 6bfd4fae2af2997c87ed9879d469701c58f39021 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Tue, 29 Mar 2022 13:34:45 -0700 Subject: [PATCH 02/10] Define the format URI to http://www.w3.org/ns/formats/TriG. --- lib/rdf/trig/format.rb | 5 ++++- spec/format_spec.rb | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/rdf/trig/format.rb b/lib/rdf/trig/format.rb index d4ff66d..49a81c1 100644 --- a/lib/rdf/trig/format.rb +++ b/lib/rdf/trig/format.rb @@ -16,7 +16,10 @@ module RDF::TriG # # @see https://www.w3.org/TR/rdf-testcases/#ntriples class Format < RDF::Format - content_type 'application/trig', extension: :trig, alias: 'application/x-trig;q=0.2' + content_type 'application/trig', + extension: :trig, + uri: 'http://www.w3.org/ns/formats/TriG', + alias: 'application/x-trig;q=0.2' content_encoding 'utf-8' reader { RDF::TriG::Reader } diff --git a/spec/format_spec.rb b/spec/format_spec.rb index 48869a2..be49b9f 100644 --- a/spec/format_spec.rb +++ b/spec/format_spec.rb @@ -46,6 +46,10 @@ specify {expect(described_class.to_sym).to eq :trig} end + describe "#to_uri" do + specify {expect(described_class.to_uri).to eq RDF::URI('http://www.w3.org/ns/formats/TriG')} + end + describe ".detect" do { :statement => "{ .}", From 20e07eb9090d7ff3c6fcef6669a9fadfb470940e Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Wed, 4 Jan 2023 13:36:35 -0800 Subject: [PATCH 03/10] CI on 3.2. --- .github/workflows/ci.yml | 10 ++-------- .github/workflows/generate-docs.yml | 2 +- script/tc | 4 ++-- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a760e1..c3e9a06 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,16 +19,10 @@ jobs: strategy: fail-fast: false matrix: - ruby: - - 2.6 - - 2.7 - - "3.0" - - 3.1 - - ruby-head - - jruby + ruby: [2.6, 2.7, '3.0', 3.1, 3.2, ruby-head, jruby] steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: diff --git a/.github/workflows/generate-docs.yml b/.github/workflows/generate-docs.yml index b8d16ed..65aea93 100644 --- a/.github/workflows/generate-docs.yml +++ b/.github/workflows/generate-docs.yml @@ -10,7 +10,7 @@ jobs: name: Update gh-pages with docs steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: diff --git a/script/tc b/script/tc index 2fc5169..1fdda84 100755 --- a/script/tc +++ b/script/tc @@ -149,8 +149,8 @@ OPT_ARGS = [ def usage(**options) STDERR.puts %{ - Turtle version #{RDF::N3::VERSION} - Run Turtle tests. + TriG version #{RDF::TriG::VERSION} + Run TriG tests. Usage: #{$0} [options] [test-number ...] }.gsub(/^ /, '') From 74b9fe486ba4bc3f35c11cec2c3bf68572fc6184 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Wed, 3 May 2023 15:17:59 -0700 Subject: [PATCH 04/10] Update badges --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3551d00..c051b29 100755 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [TriG][] reader/writer for [RDF.rb][RDF.rb] . -[![Gem Version](https://badge.fury.io/rb/rdf-trig.png)](https://badge.fury.io/rb/rdf-trig) +[![Gem Version](https://badge.fury.io/rb/rdf-trig.svg)](https://badge.fury.io/rb/rdf-trig) [![Build Status](https://github.com/ruby-rdf/rdf-trig/workflows/CI/badge.svg?branch=develop)](https://github.com/ruby-rdf/rdf-trig/actions?query=workflow%3ACI) [![Coverage Status](https://coveralls.io/repos/ruby-rdf/rdf-trig/badge.svg?branch=develop)](https://coveralls.io/github/ruby-rdf/rdf-trig?branch=develop) [![Gitter chat](https://badges.gitter.im/ruby-rdf/rdf.png)](https://gitter.im/ruby-rdf/rdf) From 32e12911851d3b4d601e128e0d310916d13dc088 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Mon, 17 Jul 2023 14:49:54 -0700 Subject: [PATCH 05/10] Adjust test suite locations and address local caching issues. --- .github/workflows/ci.yml | 2 +- etc/earl-nquads.ttl | 2 +- etc/earl.ttl | 8 +- etc/trig.bnf | 188 +++++++++++++++++++-------------------- lib/rdf/trig/reader.rb | 2 +- spec/star_spec.rb | 6 +- spec/suite_helper.rb | 12 +-- spec/w3c-rdf-tests | 1 + 8 files changed, 111 insertions(+), 110 deletions(-) create mode 120000 spec/w3c-rdf-tests diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3e9a06..0ac8b1a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: - name: Run tests run: ruby --version; bundle exec rspec spec || $ALLOW_FAILURES - name: Coveralls GitHub Action - uses: coverallsapp/github-action@v1.1.2 + uses: coverallsapp/github-action@v2 if: "matrix.ruby == '3.0'" with: github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/etc/earl-nquads.ttl b/etc/earl-nquads.ttl index 4b9bb91..d3c8628 100644 --- a/etc/earl-nquads.ttl +++ b/etc/earl-nquads.ttl @@ -919,7 +919,7 @@ [ a earl:Assertion; earl:assertedBy ; earl:subject ; - earl:test ; + earl:test ; earl:result [ a earl:TestResult; earl:outcome earl:passed; diff --git a/etc/earl.ttl b/etc/earl.ttl index a38c560..2dd7f5b 100644 --- a/etc/earl.ttl +++ b/etc/earl.ttl @@ -1072,7 +1072,7 @@ [ a earl:Assertion; earl:assertedBy ; earl:subject ; - earl:test ; + earl:test ; earl:result [ a earl:TestResult; earl:outcome earl:passed; @@ -1082,7 +1082,7 @@ [ a earl:Assertion; earl:assertedBy ; earl:subject ; - earl:test ; + earl:test ; earl:result [ a earl:TestResult; earl:outcome earl:passed; @@ -1192,7 +1192,7 @@ [ a earl:Assertion; earl:assertedBy ; earl:subject ; - earl:test ; + earl:test ; earl:result [ a earl:TestResult; earl:outcome earl:passed; @@ -1212,7 +1212,7 @@ [ a earl:Assertion; earl:assertedBy ; earl:subject ; - earl:test ; + earl:test ; earl:result [ a earl:TestResult; earl:outcome earl:passed; diff --git a/etc/trig.bnf b/etc/trig.bnf index 197f048..7441d2f 100644 --- a/etc/trig.bnf +++ b/etc/trig.bnf @@ -1,97 +1,97 @@ -[1g] trigDoc ::= ( directive | block )* -[2g] block ::= triplesOrGraph - | wrappedGraph - | 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 | 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 annotation? ( "," object annotation? )* -[9] verb ::= predicate | "a" -[10] subject ::= iri | blank | quotedTriple -[11] predicate ::= iri -[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 -[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 -[27] quotedTriple ::= "<<" qtSubject predicate qtObject ">>" -[28] qtSubject ::= iri | BlankNode | quotedTriple -[29] qtObject ::= iri | BlankNode | literal | quotedTriple -[30] annotation ::= '{|' predicateObjectList '|}' +trigDoc ::= ( directive | block )* +block ::= triplesOrGraph + | wrappedGraph + | triples2 + | GRAPH labelOrSubject wrappedGraph +triplesOrGraph ::= labelOrSubject ( wrappedGraph | predicateObjectList '.' ) + | quotedTriple predicateObjectList '.' +triples2 ::= blankNodePropertyList predicateObjectList? '.' + | collection predicateObjectList '.' +wrappedGraph ::= '{' triplesBlock? '}' +triplesBlock ::= triples ( '.' triplesBlock? )? +labelOrSubject ::= ( iri | BlankNode ) +directive ::= prefixID | base | sparqlPrefix | sparqlBase +prefixID ::= PREFIX PNAME_NS IRIREF "."? +base ::= BASE IRIREF "."? +sparqlPrefix ::= "PREFIX" PNAME_NS IRIREF +sparqlBase ::= "BASE" IRIREF +triples ::= subject predicateObjectList + | blankNodePropertyList predicateObjectList? +predicateObjectList ::= verb objectList (';' (verb objectList)? )* +objectList ::= object annotation? ( "," object annotation? )* +verb ::= predicate | "a" +subject ::= iri | blank | quotedTriple +predicate ::= iri +object ::= iri | blank | blankNodePropertyList | literal | quotedTriple +literal ::= RDFLiteral | NumericLiteral | BooleanLiteral +blank ::= BlankNode | collection +blankNodePropertyList ::= "[" predicateObjectList "]" +collection ::= "(" object* ")" +NumericLiteral ::= INTEGER | DECIMAL | DOUBLE +RDFLiteral ::= String ( LANG_DIR | ( "^^" iri ) )? +BooleanLiteral ::= "true" | "false" +String ::= STRING_LITERAL_QUOTE + | STRING_LITERAL_SINGLE_QUOTE + | STRING_LITERAL_LONG_SINGLE_QUOTE + | STRING_LITERAL_LONG_QUOTE +iri ::= IRIREF | PrefixedName +PrefixedName ::= PNAME_LN | PNAME_NS +BlankNode ::= BLANK_NODE_LABEL | ANON +quotedTriple ::= "<<" qtSubject predicate qtObject ">>" +qtSubject ::= iri | BlankNode | quotedTriple +qtObject ::= iri | BlankNode | literal | quotedTriple +annotation ::= '{|' predicateObjectList '|}' @terminals -[1t] GRAPH ::= [Gg][Rr][Aa][Pp][Hh] -[19] IRIREF ::= '<' ([^#x00-#x20<>"{}|^`\] | UCHAR)* '>' -[139s] PNAME_NS ::= PN_PREFIX? ":" -[140s] PNAME_LN ::= PNAME_NS PN_LOCAL -[141s] BLANK_NODE_LABEL ::= '_:' ( PN_CHARS_U | [0-9] ) ((PN_CHARS|'.')* PN_CHARS)? -[144s] LANGTAG ::= "@" [a-zA-Z]+ ( "-" [a-zA-Z0-9]+ )* -[20] INTEGER ::= [+-]? [0-9]+ -[21] DECIMAL ::= [+-]? ( ([0-9])* '.' ([0-9])+ ) -[22] DOUBLE ::= [+-]? ( [0-9]+ '.' [0-9]* EXPONENT | '.' ([0-9])+ EXPONENT | ([0-9])+ EXPONENT ) -[154s] EXPONENT ::= [eE] [+-]? [0-9]+ -[23] STRING_LITERAL_QUOTE ::= '"' ( [^#x22#x5C#xA#xD] | ECHAR | UCHAR )* '"' -[24] STRING_LITERAL_SINGLE_QUOTE ::= "'" ( [^#x27#x5C#xA#xD] | ECHAR | UCHAR )* "'" -[25] STRING_LITERAL_LONG_SINGLE_QUOTE ::= "'''" ( ( "'" | "''" )? ( [^'\] | ECHAR | UCHAR ) )* "'''" -[26] STRING_LITERAL_LONG_QUOTE ::= '"""' ( ( '"' | '""' )? ( [^"\] | ECHAR | UCHAR ) )* '"""' -[27] UCHAR ::= ( "\u" HEX HEX HEX HEX ) - | ( "\U" HEX HEX HEX HEX HEX HEX HEX HEX ) -[159s] ECHAR ::= "\" [tbnrf\"'] -[160s] NIL ::= "(" WS* ")" -[161s] WS ::= #x20 | #x9 | #xD | #xA -[162s] ANON ::= "[" WS* "]" -[163s] PN_CHARS_BASE ::= [A-Z] - | [a-z] - | [#x00C0-#x00D6] - | [#x00D8-#x00F6] - | [#x00F8-#x02FF] - | [#x0370-#x037D] - | [#x037F-#x1FFF] - | [#x200C-#x200D] - | [#x2070-#x218F] - | [#x2C00-#x2FEF] - | [#x3001-#xD7FF] - | [#xF900-#xFDCF] - | [#xFDF0-#xFFFD] - | [#x10000-#xEFFFF] -[164s] PN_CHARS_U ::= PN_CHARS_BASE - | '_' -[166s] PN_CHARS ::= PN_CHARS_U - | "-" - | [0-9] - | #x00B7 - | [#x0300-#x036F] - | [#x203F-#x2040] -[167s] PN_PREFIX ::= PN_CHARS_BASE ( ( PN_CHARS | "." )* PN_CHARS )? -[168s] PN_LOCAL ::= ( PN_CHARS_U | ':' | [0-9] | PLX ) ( ( PN_CHARS | '.' | ':' | PLX )* ( PN_CHARS | ':' | PLX ) ) ? -[169s] PLX ::= PERCENT - | PN_LOCAL_ESC -[170s] PERCENT ::= '%' HEX HEX -[171s] HEX ::= [0-9] | [A-F] | [a-f] -[172s] PN_LOCAL_ESC ::= '\' ( '_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%' ) -[28t] PREFIX ::= "@"?[Pp][Rr][Ee][Ff][Ii][Xx] -[29t] BASE ::= "@"?[Bb][Aa][Ss][Ee] +RAPH ::= [Gg][Rr][Aa][Pp][Hh] +RIREF ::= '<' ([^#x00-#x20<>"{}|^`\] | UCHAR)* '>' +PNAME_NS ::= PN_PREFIX? ":" +PNAME_LN ::= PNAME_NS PN_LOCAL +BLANK_NODE_LABEL ::= '_:' ( PN_CHARS_U | [0-9] ) ((PN_CHARS|'.')* PN_CHARS)? +LANG_DIR ::= "@" [a-zA-Z]+ ( "-" [a-zA-Z0-9]+ )* ('--' [a-zA-Z]+)?` +INTEGER ::= [+-]? [0-9]+ +DECIMAL ::= [+-]? ( ([0-9])* '.' ([0-9])+ ) +DOUBLE ::= [+-]? ( [0-9]+ '.' [0-9]* EXPONENT | '.' ([0-9])+ EXPONENT | ([0-9])+ EXPONENT ) +EXPONENT ::= [eE] [+-]? [0-9]+ +STRING_LITERAL_QUOTE ::= '"' ( [^#x22#x5C#xA#xD] | ECHAR | UCHAR )* '"' +STRING_LITERAL_SINGLE_QUOTE ::= "'" ( [^#x27#x5C#xA#xD] | ECHAR | UCHAR )* "'" +STRING_LITERAL_LONG_SINGLE_QUOTE ::= "'''" ( ( "'" | "''" )? ( [^'\] | ECHAR | UCHAR ) )* "'''" +STRING_LITERAL_LONG_QUOTE ::= '"""' ( ( '"' | '""' )? ( [^"\] | ECHAR | UCHAR ) )* '"""' +UCHAR ::= ( "\u" HEX HEX HEX HEX ) + | ( "\U" HEX HEX HEX HEX HEX HEX HEX HEX ) +ECHAR ::= "\" [tbnrf\"'] +NIL ::= "(" WS* ")" +WS ::= #x20 | #x9 | #xD | #xA +ANON ::= "[" WS* "]" +PN_CHARS_BASE ::= [A-Z] + | [a-z] + | [#x00C0-#x00D6] + | [#x00D8-#x00F6] + | [#x00F8-#x02FF] + | [#x0370-#x037D] + | [#x037F-#x1FFF] + | [#x200C-#x200D] + | [#x2070-#x218F] + | [#x2C00-#x2FEF] + | [#x3001-#xD7FF] + | [#xF900-#xFDCF] + | [#xFDF0-#xFFFD] + | [#x10000-#xEFFFF] +PN_CHARS_U ::= PN_CHARS_BASE + | '_' +PN_CHARS ::= PN_CHARS_U + | "-" + | [0-9] + | #x00B7 + | [#x0300-#x036F] + | [#x203F-#x2040] +PN_PREFIX ::= PN_CHARS_BASE ( ( PN_CHARS | "." )* PN_CHARS )? +PN_LOCAL ::= ( PN_CHARS_U | ':' | [0-9] | PLX ) ( ( PN_CHARS | '.' | ':' | PLX )* ( PN_CHARS | ':' | PLX ) ) ? +PLX ::= PERCENT + | PN_LOCAL_ESC +PERCENT ::= '%' HEX HEX +HEX ::= [0-9] | [A-F] | [a-f] +PN_LOCAL_ESC ::= '\' ( '_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%' ) +PREFIX ::= "@"?[Pp][Rr][Ee][Ff][Ii][Xx] +BASE ::= "@"?[Bb][Aa][Ss][Ee] diff --git a/lib/rdf/trig/reader.rb b/lib/rdf/trig/reader.rb index 4af5b4e..97b8ece 100644 --- a/lib/rdf/trig/reader.rb +++ b/lib/rdf/trig/reader.rb @@ -36,7 +36,7 @@ class Reader < RDF::Turtle::Reader terminal(:GRAPH, /graph/i) terminal(:PREFIX, PREFIX) terminal(:BASE, BASE) - terminal(:LANGTAG, LANGTAG) + terminal(:LANG_DIR, LANG_DIR) ## # Iterates the given block for each RDF statement in the input. diff --git a/spec/star_spec.rb b/spec/star_spec.rb index 64c09dd..547f4a4 100644 --- a/spec/star_spec.rb +++ b/spec/star_spec.rb @@ -2,8 +2,8 @@ require 'spec_helper' describe RDF::TriG::Reader do - # W3C Turtle Test suite from http://w3c.github.io/rdf-tests/turtle/manifest.ttl - describe "rdfstar turtle tests" do + # W3C Turtle Test suite from http://w3c.github.io/rdf-tests/rdf/rdf11/rdf-trig/manifest.ttl + describe "rdfstar TriG tests" do require 'suite_helper' %w(nt/syntax turtle/syntax turtle/eval trig/syntax trig/eval).each do |man| @@ -15,7 +15,7 @@ t.logger.info t.inspect t.logger.info "source:\n#{t.input}" - reader = RDF::TriG::Reader.new(t.input, + reader = RDF::Reader.for(t.action).new(t.input, base_uri: t.base, canonicalize: false, validate: true, diff --git a/spec/suite_helper.rb b/spec/suite_helper.rb index 161326a..c1ce5cd 100644 --- a/spec/suite_helper.rb +++ b/spec/suite_helper.rb @@ -6,10 +6,10 @@ # For now, override RDF::Utils::File.open_file to look for the file locally before attempting to retrieve it module RDF::Util module File - REMOTE_PATH = "http://w3c.github.io/rdf-tests/trig/" - LOCAL_PATH = ::File.expand_path("../w3c-rdf/trig", __FILE__) + '/' - REMOTE_PATH_NQ = "http://w3c.github.io/rdf-tests/nquads/" - LOCAL_PATH_NQ = ::File.expand_path("../w3c-rdf/nquads", __FILE__) + '/' + REMOTE_PATH = "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-trig/" + LOCAL_PATH = ::File.expand_path("../w3c-rdf-tests/rdf/rdf11/rdf-trig", __FILE__) + '/' + REMOTE_PATH_NQ = "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-n-quads/" + LOCAL_PATH_NQ = ::File.expand_path("../w3c-rdf/rdf/rdf11/rdf-n-quads", __FILE__) + '/' REMOTE_PATH_STAR = "https://w3c.github.io/rdf-star/" LOCAL_PATH_STAR = ::File.expand_path("../w3c-rdf-star/", __FILE__) + '/' @@ -140,8 +140,8 @@ def self.open_file(filename_or_url, **options, &block) module Fixtures module SuiteTest - BASE = "http://w3c.github.io/rdf-tests/trig/" - NQBASE = "http://w3c.github.io/rdf-tests/nquads/" + BASE = "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-trig/" + NQBASE = "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-n-quads/" FRAME = JSON.parse(%q({ "@context": { "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/spec/w3c-rdf-tests b/spec/w3c-rdf-tests new file mode 120000 index 0000000..562eb32 --- /dev/null +++ b/spec/w3c-rdf-tests @@ -0,0 +1 @@ +../../w3c-rdf-tests \ No newline at end of file From 5bdd183377303788f13300670d39438efd67418d Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Tue, 18 Jul 2023 13:38:29 -0700 Subject: [PATCH 06/10] Adjust test suite locations and address local caching issues. --- script/tc | 4 ++-- spec/nquads_spec.rb | 38 ++++++++++++++++++++------------------ spec/suite_helper.rb | 5 ++--- spec/suite_spec.rb | 2 +- spec/writer_spec.rb | 2 +- 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/script/tc b/script/tc index 1fdda84..48ba316 100755 --- a/script/tc +++ b/script/tc @@ -196,9 +196,9 @@ manifests = if options[:rdfstar] |man| "https://w3c.github.io/rdf-star/tests/#{man}/" end elsif options[:nquads] - [Fixtures::SuiteTest::NQBASE] + [Fixtures::SuiteTest::BASE + "rdf11/rdf-n-quads/"] else - [Fixtures::SuiteTest::BASE] + [Fixtures::SuiteTest::BASE + "rdf11/rdf-trig/"] end.map {|m| "#{m}manifest.ttl"} earl_preamble(**options) if options[:earl] diff --git a/spec/nquads_spec.rb b/spec/nquads_spec.rb index 72371b0..8c43610 100644 --- a/spec/nquads_spec.rb +++ b/spec/nquads_spec.rb @@ -6,29 +6,31 @@ describe "w3c N-Quads tests" do require 'suite_helper' - Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::NQBASE}manifest.ttl") do |m| - describe m.comment do - m.entries.each do |t| - specify "#{t.name}: #{t.comment}" do - t.logger = RDF::Spec.logger - t.logger.info t.inspect - t.logger.info "source:\n#{t.input}" + %w(rdf11/rdf-n-quads/manifest.ttl).each do |man| + Fixtures::SuiteTest::Manifest.open(Fixtures::SuiteTest::BASE + man) do |m| + describe m.comment do + m.entries.each do |t| + specify "#{t.name}: #{t.comment}" do + t.logger = RDF::Spec.logger + t.logger.info t.inspect + t.logger.info "source:\n#{t.input}" - reader = RDF::NQuads::Reader.new(t.input, logger: t.logger, validate: true) + reader = RDF::NQuads::Reader.new(t.input, logger: t.logger, validate: true) - repo = RDF::Repository.new + repo = RDF::Repository.new - if t.positive_test? - begin - repo << reader - rescue Exception => e - expect(e.message).to produce("Not exception #{e.inspect}", t.logger) + if t.positive_test? + begin + repo << reader + rescue Exception => e + expect(e.message).to produce("Not exception #{e.inspect}", t.logger) + end + else + expect {repo << reader}.to raise_error(RDF::ReaderError) end - else - expect {repo << reader}.to raise_error(RDF::ReaderError) - end - expect(repo).to be_a(RDF::Enumerable) + expect(repo).to be_a(RDF::Enumerable) + end end end end diff --git a/spec/suite_helper.rb b/spec/suite_helper.rb index c1ce5cd..7bed7ed 100644 --- a/spec/suite_helper.rb +++ b/spec/suite_helper.rb @@ -140,8 +140,7 @@ def self.open_file(filename_or_url, **options, &block) module Fixtures module SuiteTest - BASE = "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-trig/" - NQBASE = "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-n-quads/" + BASE = "https://w3c.github.io/rdf-tests/rdf/" FRAME = JSON.parse(%q({ "@context": { "xsd": "http://www.w3.org/2001/XMLSchema#", @@ -187,7 +186,7 @@ class Entry < JSON::LD::Resource attr_accessor :logger def base - BASE + action.split('/').last + RDF::URI(action) end # Alias data and query diff --git a/spec/suite_spec.rb b/spec/suite_spec.rb index 0b13b84..09caab2 100644 --- a/spec/suite_spec.rb +++ b/spec/suite_spec.rb @@ -6,7 +6,7 @@ require 'suite_helper' # TriG/manifest.ttl - %w(manifest.ttl).each do |man| + %w(rdf11/rdf-trig/manifest.ttl).each do |man| Fixtures::SuiteTest::Manifest.open(Fixtures::SuiteTest::BASE + man) do |m| describe m.comment do m.entries.each do |t| diff --git a/spec/writer_spec.rb b/spec/writer_spec.rb index 1adf2ae..b311723 100644 --- a/spec/writer_spec.rb +++ b/spec/writer_spec.rb @@ -309,7 +309,7 @@ describe "w3c trig tests" do require 'suite_helper' - %w(manifest.ttl).each do |man| + %w(rdf11/rdf-trig/manifest.ttl).each do |man| Fixtures::SuiteTest::Manifest.open(Fixtures::SuiteTest::BASE + man) do |m| describe m.comment do m.entries.each do |t| From faa35dbf333085b08b94ed2eeda10ff56b7aefa2 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Tue, 18 Jul 2023 13:53:21 -0700 Subject: [PATCH 07/10] Don't keep w3c-rdf-tests symlink in repo. --- spec/.gitignore | 1 + spec/w3c-rdf-tests | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 120000 spec/w3c-rdf-tests diff --git a/spec/.gitignore b/spec/.gitignore index 926071c..a1f60e7 100644 --- a/spec/.gitignore +++ b/spec/.gitignore @@ -1,3 +1,4 @@ /uri-cache/ /w3c-rdf +/w3c-rdf-tests /w3c-rdf-star diff --git a/spec/w3c-rdf-tests b/spec/w3c-rdf-tests deleted file mode 120000 index 562eb32..0000000 --- a/spec/w3c-rdf-tests +++ /dev/null @@ -1 +0,0 @@ -../../w3c-rdf-tests \ No newline at end of file From b6fb8db0b7e74d81a82645685987d227dd7528bc Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Sat, 26 Aug 2023 13:16:45 -0700 Subject: [PATCH 08/10] Update test suite locations. --- lib/rdf/trig/reader.rb | 2 +- script/tc | 15 ++++--- spec/star_spec.rb | 7 +++- spec/suite_helper.rb | 92 +++++++----------------------------------- 4 files changed, 28 insertions(+), 88 deletions(-) diff --git a/lib/rdf/trig/reader.rb b/lib/rdf/trig/reader.rb index 97b8ece..ec3c4a8 100644 --- a/lib/rdf/trig/reader.rb +++ b/lib/rdf/trig/reader.rb @@ -36,7 +36,7 @@ class Reader < RDF::Turtle::Reader terminal(:GRAPH, /graph/i) terminal(:PREFIX, PREFIX) terminal(:BASE, BASE) - terminal(:LANG_DIR, LANG_DIR) + terminal(:LANG_DIR, LANG_DIR) ## # Iterates the given block for each RDF statement in the input. diff --git a/script/tc b/script/tc index 48ba316..852f63e 100755 --- a/script/tc +++ b/script/tc @@ -61,6 +61,7 @@ def run_tc(tc, **options) options = { base_uri: tc.base, validate: true, + rdfstar: true, logger: logger }.merge(options) @@ -140,7 +141,6 @@ OPT_ARGS = [ ["--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"], @@ -183,7 +183,6 @@ opts.each do |opt, arg| when '--quiet' options[:quiet] = 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 @@ -191,14 +190,14 @@ opts.each do |opt, arg| end end -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] +manifests = if options[:nquads] [Fixtures::SuiteTest::BASE + "rdf11/rdf-n-quads/"] else - [Fixtures::SuiteTest::BASE + "rdf11/rdf-trig/"] + [ + Fixtures::SuiteTest::BASE + "rdf11/rdf-trig/", + Fixtures::SuiteTest::BASE + "rdf12/rdf-trig/syntax/", + Fixtures::SuiteTest::BASE + "rdf12/rdf-trig/eval/", + ] end.map {|m| "#{m}manifest.ttl"} earl_preamble(**options) if options[:earl] diff --git a/spec/star_spec.rb b/spec/star_spec.rb index 547f4a4..a70b095 100644 --- a/spec/star_spec.rb +++ b/spec/star_spec.rb @@ -6,8 +6,11 @@ describe "rdfstar TriG tests" do require 'suite_helper' - %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| + %w( + rdf12/rdf-n-triples/syntax/manifest.ttl + rdf12/rdf-trig/syntax/manifest.ttl + rdf12/rdf-trig/eval/manifest.ttl).each do |man| + Fixtures::SuiteTest::Manifest.open(Fixtures::SuiteTest::BASE + man) do |m| describe [m.label, m.comment].compact.join(': ') do m.entries.each do |t| specify "#{t.name}: #{t.comment}" do diff --git a/spec/suite_helper.rb b/spec/suite_helper.rb index 7bed7ed..e673a84 100644 --- a/spec/suite_helper.rb +++ b/spec/suite_helper.rb @@ -6,12 +6,8 @@ # For now, override RDF::Utils::File.open_file to look for the file locally before attempting to retrieve it module RDF::Util module File - REMOTE_PATH = "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-trig/" - LOCAL_PATH = ::File.expand_path("../w3c-rdf-tests/rdf/rdf11/rdf-trig", __FILE__) + '/' - REMOTE_PATH_NQ = "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-n-quads/" - LOCAL_PATH_NQ = ::File.expand_path("../w3c-rdf/rdf/rdf11/rdf-n-quads", __FILE__) + '/' - REMOTE_PATH_STAR = "https://w3c.github.io/rdf-star/" - LOCAL_PATH_STAR = ::File.expand_path("../w3c-rdf-star/", __FILE__) + '/' + REMOTE_PATH = "https://w3c.github.io/rdf-tests/rdf/" + LOCAL_PATH = ::File.expand_path("../w3c-rdf-tests/rdf/", __FILE__) + '/' class << self alias_method :original_open_file, :open_file @@ -59,72 +55,6 @@ def self.open_file(filename_or_url, **options, &block) # For overriding content type from test data document_options[:headers][:content_type] = options[:contentType] if options[:contentType] - remote_document = RDF::Util::File::RemoteDocument.new(response.read, **document_options) - if block_given? - yield remote_document - else - remote_document - end - when (filename_or_url.to_s =~ %r{^#{REMOTE_PATH_NQ}} && Dir.exist?(LOCAL_PATH_NQ)) - #puts "attempt to open #{filename_or_url} locally" - localpath = filename_or_url.to_s.sub(REMOTE_PATH_NQ, LOCAL_PATH_NQ) - response = begin - ::File.open(localpath) - rescue Errno::ENOENT => e - raise IOError, e.message - end - document_options = { - base_uri: RDF::URI(filename_or_url), - charset: Encoding::UTF_8, - code: 200, - headers: {} - } - #puts "use #{filename_or_url} locally" - document_options[:headers][:content_type] = case filename_or_url.to_s - when /\.ttl$/ then 'text/turtle' - when /\.trig$/ then 'application/trig' - when /\.nt$/ then 'application/n-triples' - when /\.nq$/ then 'application/n-quads' - when /\.jsonld$/ then 'application/ld+json' - else 'unknown' - end - - document_options[:headers][:content_type] = response.content_type if response.respond_to?(:content_type) - # For overriding content type from test data - document_options[:headers][:content_type] = options[:contentType] if options[:contentType] - - remote_document = RDF::Util::File::RemoteDocument.new(response.read, **document_options) - if block_given? - yield remote_document - else - remote_document - end - when (filename_or_url.to_s =~ %r{^#{REMOTE_PATH_STAR}} && Dir.exist?(LOCAL_PATH_STAR)) - #puts "attempt to open #{filename_or_url} locally" - localpath = filename_or_url.to_s.sub(REMOTE_PATH_STAR, LOCAL_PATH_STAR) - response = begin - ::File.open(localpath) - rescue Errno::ENOENT => e - raise IOError, e.message - end - document_options = { - base_uri: RDF::URI(filename_or_url), - charset: Encoding::UTF_8, - code: 200, - headers: {} - } - #puts "use #{filename_or_url} locally" - document_options[:headers][:content_type] = case filename_or_url.to_s - when /\.ttl$/ then 'text/turtle' - when /\.nt$/ then 'application/n-triples' - when /\.jsonld$/ then 'application/ld+json' - else 'unknown' - end - - document_options[:headers][:content_type] = response.content_type if response.respond_to?(:content_type) - # For overriding content type from test data - document_options[:headers][:content_type] = options[:contentType] if options[:contentType] - remote_document = RDF::Util::File::RemoteDocument.new(response.read, **document_options) if block_given? yield remote_document @@ -134,6 +64,8 @@ def self.open_file(filename_or_url, **options, &block) else original_open_file(filename_or_url, **options, &block) end + rescue IOError => e + raise IOError, "Error opening #{filename_or_url.inspect}: #{e.message}" end end end @@ -150,6 +82,7 @@ module SuiteTest "rdft": "http://www.w3.org/ns/rdftest#", "label": "rdfs:label", + "baseIri": {"@id": "mf:assumedTestBase", "@type": "@id"}, "comment": "rdfs:comment", "entries": {"@id": "mf:entries", "@container": "@list"}, "name": "mf:name", @@ -178,15 +111,20 @@ def self.from_jsonld(json) def entries # Map entries to resources - attributes['entries'].map {|e| Entry.new(e)} + attributes['entries'].map {|e| Entry.new(e, base_iri: attributes['baseIri'])} end end class Entry < JSON::LD::Resource attr_accessor :logger + def initialize(json, base_iri:) + @base_iri = base_iri + super + end + def base - RDF::URI(action) + RDF::URI(@base_iri || action) end # Alias data and query @@ -195,15 +133,15 @@ def input end def expected - @expected ||= RDF::Util::File.open_file(result) {|f| f.read} + @expected ||= RDF::Util::File.open_file(result) {|f| f.read} if result end def evaluate? - attributes['@type'].to_s.match(/Eval/) + !!attributes['@type'].to_s.match(/Eval/) end def syntax? - attributes['@type'].to_s.match(/Syntax/) + !!attributes['@type'].to_s.match(/Syntax/) end def positive_test? From 0baf6b8aa635e1ed9badae4b6870db851db4ae59 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Sat, 26 Aug 2023 13:17:22 -0700 Subject: [PATCH 09/10] Updates for version 3.3.0 with minimum Ruby version 3.0. --- .github/workflows/ci.yml | 4 ++-- README.md | 6 +++--- VERSION | 2 +- rdf-trig.gemspec | 16 ++++++++-------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0ac8b1a..00b888b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - ruby: [2.6, 2.7, '3.0', 3.1, 3.2, ruby-head, jruby] + ruby: ['3.0', 3.1, 3.2, ruby-head, jruby] steps: - name: Clone repository uses: actions/checkout@v3 @@ -33,6 +33,6 @@ jobs: run: ruby --version; bundle exec rspec spec || $ALLOW_FAILURES - name: Coveralls GitHub Action uses: coverallsapp/github-action@v2 - if: "matrix.ruby == '3.0'" + if: "matrix.ruby == '3.2'" with: github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index c051b29..e9bf84f 100755 --- a/README.md +++ b/README.md @@ -68,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.6) -* [RDF.rb](https://rubygems.org/gems/rdf) (~> 3.2) -* [rdf-turtle](https://rubygems.org/gems/rdf-turtle) (~> 3.2) +* [Ruby](https://ruby-lang.org/) (>= 3.0) +* [RDF.rb](https://rubygems.org/gems/rdf) (~> 3.3) +* [rdf-turtle](https://rubygems.org/gems/rdf-turtle) (~> 3.3) ## Installation diff --git a/VERSION b/VERSION index 944880f..15a2799 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.2.0 +3.3.0 diff --git a/rdf-trig.gemspec b/rdf-trig.gemspec index c7e0dc6..df1b9b6 100755 --- a/rdf-trig.gemspec +++ b/rdf-trig.gemspec @@ -25,17 +25,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.6' + gem.required_ruby_version = '>= 3.0' gem.requirements = [] - 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_runtime_dependency 'rdf', '~> 3.3' + gem.add_runtime_dependency 'ebnf', '~> 2.4' + gem.add_runtime_dependency 'rdf-turtle', '~> 3.3' + gem.add_development_dependency 'json-ld', '~> 3.3' + gem.add_development_dependency 'rspec', '~> 3.12' gem.add_development_dependency 'rspec-its', '~> 1.3' - gem.add_development_dependency 'rdf-isomorphic', '~> 3.2' + gem.add_development_dependency 'rdf-isomorphic', '~> 3.3' gem.add_development_dependency 'yard' , '~> 0.9' - gem.add_development_dependency 'rdf-spec', '~> 3.2' + gem.add_development_dependency 'rdf-spec', '~> 3.3' gem.post_install_message = nil end From 54b3c1630a76046eba2aaaceb63e3fe552115965 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Fri, 1 Sep 2023 13:21:56 -0700 Subject: [PATCH 10/10] Use simplecov 0.22. --- Gemfile | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 532aefd..298dd97 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', '~> 0.21', platforms: :mri + gem 'simplecov', '~> 0.22', platforms: :mri gem 'simplecov-lcov', '~> 0.8', platforms: :mri end diff --git a/README.md b/README.md index e9bf84f..8a9bfa4 100755 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Install with `gem install rdf-trig` * 100% free and unencumbered [public domain](https://unlicense.org/) software. * Implements a complete parser and serializer for [TriG][]. -* Compatible with Ruby 2.x, and JRuby 1.7+. +* Compatible with Ruby 3.x, and JRuby 9+. * Optional streaming writer, to serialize large graphs ## Usage