From 4ba5756cd7e30c6eb080f3c7746c2895dc1480f4 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Tue, 7 Aug 2018 16:53:32 -0700 Subject: [PATCH 01/18] Remove deprections from gemspec. --- rdf-spec.gemspec | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rdf-spec.gemspec b/rdf-spec.gemspec index 6519f41..3b9f47e 100755 --- a/rdf-spec.gemspec +++ b/rdf-spec.gemspec @@ -16,13 +16,7 @@ Gem::Specification.new do |gem| gem.platform = Gem::Platform::RUBY gem.files = %w(AUTHORS CREDITS README.md UNLICENSE VERSION) + Dir.glob('etc/*') + Dir.glob('lib/**/*.rb') + Dir.glob('spec/*.rb') - gem.bindir = %q(bin) - gem.executables = %w() - gem.default_executable = gem.executables.first gem.require_paths = %w(lib) - gem.extensions = %w() - gem.test_files = %w() - gem.has_rdoc = false gem.required_ruby_version = '>= 2.2.2' gem.requirements = [] From 91bc9eee912a69e20cc03bb815b89ba084ccb92c Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Tue, 7 Aug 2018 16:53:55 -0700 Subject: [PATCH 02/18] Make sure buffer encoding set using format or passed option. --- lib/rdf/spec/writer.rb | 51 ++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/lib/rdf/spec/writer.rb b/lib/rdf/spec/writer.rb index d0182c5..203a6b6 100644 --- a/lib/rdf/spec/writer.rb +++ b/lib/rdf/spec/writer.rb @@ -13,6 +13,27 @@ let(:reader_class) { writer_class.format.reader} let(:format_class) { writer_class.format } + let(:graph) do + @graph ||= begin + n1 = RDF::Node("a") + n2 = RDF::Node("a") + p = RDF::URI("http://example/pred") + s1 = RDF::Statement(n1, p, n1) + s2 = RDF::Statement(n2, p, n2) + s3 = RDF::Statement(n1, p, n2) + s4 = RDF::Statement(n2, p, n1) + RDF::Graph.new.insert(s1, s2, s3, s4) + end + end + + let(:serialized) do + @serialized ||= begin + writer_class.buffer do |w| + w << graph + end + end + end + describe ".each" do it "yields each writer" do writer_class.each do |r| @@ -31,18 +52,6 @@ it "should serialize different BNodes sharing a common identifier to using different BNode ids" do if reader_class - n1 = RDF::Node("a") - n2 = RDF::Node("a") - p = RDF::URI("http://example/pred") - s1 = RDF::Statement(n1, p, n1) - s2 = RDF::Statement(n2, p, n2) - s3 = RDF::Statement(n1, p, n2) - s4 = RDF::Statement(n2, p, n1) - graph = RDF::Graph.new.insert(s1, s2, s3, s4) - expect(graph.count).to eql 4 - serialized = writer_class.buffer do |w| - w << graph - end expect(serialized).not_to be_empty graph2 = RDF::Graph.new do |g| g << reader_class.new(serialized) @@ -50,6 +59,24 @@ expect(graph2.count).to eql 4 end end + + it "returns a string" do + expect(serialized).to be_a(String) + end + + it "should use encoding defined for format by default" do + writer_class.new do |w| + expect(serialized.encoding).to eql w.encoding + end + end + + it "should use provided encoding if specified" do + str = writer_class.buffer(encoding: Encoding::ASCII_8BIT) do |w| + w << graph + end + + expect(str.encoding).to eql Encoding::ASCII_8BIT + end end describe ".open" do From 6d45c362fe4ccd78c00e77f4707b7454cea85db8 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Tue, 7 Aug 2018 17:29:59 -0700 Subject: [PATCH 03/18] Fix transaction check and enable local running of spec. --- lib/rdf/spec/transaction.rb | 4 ++-- spec/transaction_spec.rb | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/rdf/spec/transaction.rb b/lib/rdf/spec/transaction.rb index ef9ca0f..b7a681c 100644 --- a/lib/rdf/spec/transaction.rb +++ b/lib/rdf/spec/transaction.rb @@ -212,10 +212,10 @@ with_name = st.dup with_name.graph_name = graph_uri - expect do + expect do subject.insert(st) subject.execute - end.to change { subject.repository } + end.to change { subject.repository.statements } expect(subject.repository).to have_statement(with_name) end diff --git a/spec/transaction_spec.rb b/spec/transaction_spec.rb index 770cff8..afead26 100644 --- a/spec/transaction_spec.rb +++ b/spec/transaction_spec.rb @@ -1,7 +1,8 @@ require File.join(File.dirname(__FILE__), 'spec_helper') require 'rdf/spec/transaction' -describe RDF::Transaction, skip: "pending fixes to immutability errors" do +describe RDF::Transaction do + let(:repository) { RDF::Repository.new } # @see lib/rdf/spec/transaction.rb in rdf-spec it_behaves_like "an RDF::Transaction", RDF::Transaction end From 266178176aa3096738836afd835f588f4b0d57aa Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Mon, 20 Aug 2018 17:49:07 -0700 Subject: [PATCH 04/18] Rename instance variables used in specs to be localized so as not to confuse with the same variable that could be named in the surrounding context. --- lib/rdf/spec/enumerable.rb | 51 ++++++++++++++++++------------------ lib/rdf/spec/matchers.rb | 4 +-- lib/rdf/spec/mutable.rb | 16 +++++------ lib/rdf/spec/queryable.rb | 26 +++++++++--------- lib/rdf/spec/repository.rb | 3 +-- lib/rdf/spec/transactable.rb | 4 +-- lib/rdf/spec/writer.rb | 24 ++++++++--------- 7 files changed, 63 insertions(+), 65 deletions(-) diff --git a/lib/rdf/spec/enumerable.rb b/lib/rdf/spec/enumerable.rb index 7e934e8..b8ca852 100644 --- a/lib/rdf/spec/enumerable.rb +++ b/lib/rdf/spec/enumerable.rb @@ -7,25 +7,24 @@ raise 'enumerable must be set with `let(:enumerable)' unless defined? enumerable - @statements ||= RDF::Spec.quads + @rdf_enumerable_iv_statements ||= RDF::Spec.quads if enumerable.empty? if (enumerable.writable? rescue false) - enumerable.insert(*@statements) + enumerable.insert(*@rdf_enumerable_iv_statements) elsif enumerable.respond_to?(:<<) - @statements.each { |statement| enumerable << statement } + @rdf_enumerable_iv_statements.each { |statement| enumerable << statement } else raise "@enumerable must respond to #<< or be pre-populated with the statements in #{RDF::Spec::TRIPLES_FILE} in a before(:each) block" end end - - @supports_named_graphs = enumerable.supports?(:graph_name) rescue true end - let(:subject_count) {@statements.map(&:subject).uniq.length} - let(:bnode_subject_count) {@statements.map(&:subject).uniq.select(&:node?).length} - let(:non_bnode_statements) {@statements.reject(&:node?)} - let(:non_bnode_terms) {@statements.map(&:to_quad).flatten.compact.reject(&:node?).uniq} + let(:supports_named_graphs) {enumerable.supports?(:graph_name) rescue true} + let(:subject_count) {@rdf_enumerable_iv_statements.map(&:subject).uniq.length} + let(:bnode_subject_count) {@rdf_enumerable_iv_statements.map(&:subject).uniq.select(&:node?).length} + let(:non_bnode_statements) {@rdf_enumerable_iv_statements.reject(&:node?)} + let(:non_bnode_terms) {@rdf_enumerable_iv_statements.map(&:to_quad).flatten.compact.reject(&:node?).uniq} subject { enumerable } it {is_expected.to respond_to(:supports?)} @@ -57,9 +56,9 @@ it {is_expected.to respond_to(:empty?)} it {is_expected.to_not be_empty} it {is_expected.to respond_to(:count)} - its(:count) {is_expected.to eq @statements.size} + its(:count) {is_expected.to eq @rdf_enumerable_iv_statements.size} it {is_expected.to respond_to(:size)} - its(:size) {is_expected.to eq @statements.size} + its(:size) {is_expected.to eq @rdf_enumerable_iv_statements.size} context "and empty" do subject {[].extend(RDF::Enumerable)} @@ -74,7 +73,7 @@ its(:statements) {is_expected.to be_a(Array)} context "#statements" do - specify {expect(subject.statements.size).to eq @statements.size} + specify {expect(subject.statements.size).to eq @rdf_enumerable_iv_statements.size} specify {expect(subject.statements).to all(be_a_statement)} end @@ -89,7 +88,7 @@ end it "does not have statement in different named graph" do - if @supports_named_graphs + if supports_named_graphs graph_name = RDF::URI.new("urn:graph_name:1") non_bnode_statements.each do |statement| s = statement.dup @@ -132,7 +131,7 @@ its(:triples) {is_expected.to be_a(Array)} context "#triples" do - specify {expect(subject.triples.size).to eq @statements.size} + specify {expect(subject.triples.size).to eq @rdf_enumerable_iv_statements.size} specify {expect(subject.triples).to all(be_a_triple)} end @@ -176,13 +175,13 @@ its(:quads) {is_expected.to be_a(Array)} context "#quads" do - specify {expect(subject.quads.size).to eq @statements.size} + specify {expect(subject.quads.size).to eq @rdf_enumerable_iv_statements.size} specify {expect(subject.quads).to all(be_a_quad)} end context "#has_quad?" do specify do - if @supports_named_graphs + if supports_named_graphs non_bnode_statements.each do |statement| is_expected.to have_quad(statement.to_quad) end @@ -265,7 +264,7 @@ end context "when enumerating predicates" do - let(:predicates) {@statements.map { |s| s.predicate }.uniq} + let(:predicates) {@rdf_enumerable_iv_statements.map { |s| s.predicate }.uniq} it {is_expected.to respond_to(:predicates)} it {is_expected.to respond_to(:has_predicate?)} it {is_expected.to respond_to(:each_predicate)} @@ -285,7 +284,7 @@ context "#has_predicate?" do specify do checked = [] - @statements.each do |statement| + @rdf_enumerable_iv_statements.each do |statement| expect(enumerable).to have_predicate(statement.predicate) unless checked.include?(statement.predicate) checked << statement.predicate end @@ -434,8 +433,8 @@ end it "should implement #has_graph?" do - if @supports_named_graphs - @statements.each do |statement| + if supports_named_graphs + @rdf_enumerable_iv_statements.each do |statement| if statement.has_graph? expect(enumerable).to have_graph(statement.graph_name) end @@ -480,21 +479,21 @@ context "non-existing graph" do let(:graph_name) {RDF::URI.new('http://example.org/does/not/have/this/uri')} - specify {expect(subject.project_graph(graph_name)).to be_empty if @supports_named_graphs} + specify {expect(subject.project_graph(graph_name)).to be_empty if supports_named_graphs} end end its(:each_graph) {is_expected.to be_an_enumerator} describe "#each_graph" do - let(:graph_names) {@statements.map { |s| s.graph_name }.uniq.compact} + let(:graph_names) {@rdf_enumerable_iv_statements.map { |s| s.graph_name }.uniq.compact} subject { enumerable.each_graph } it {is_expected.to be_an_enumerator} - specify {is_expected.to all(be_a_graph) if @supports_named_graphs} + specify {is_expected.to all(be_a_graph) if supports_named_graphs} it "has appropriate number of graphs" do - if @supports_named_graphs - graph_names = @statements.map { |s| s.graph_name }.uniq.compact + if supports_named_graphs + graph_names = @rdf_enumerable_iv_statements.map { |s| s.graph_name }.uniq.compact expect(subject.to_a.size).to eq (graph_names.size + 1) end end @@ -505,7 +504,7 @@ it {is_expected.to be_an_enumerator} it {is_expected.to be_countable} it "enumerates the same as #each_graph" do - expect(subject.to_a).to include(*enumerable.each_graph.to_a) if @supports_named_graphs # expect with match problematic + expect(subject.to_a).to include(*enumerable.each_graph.to_a) if supports_named_graphs # expect with match problematic end end end diff --git a/lib/rdf/spec/matchers.rb b/lib/rdf/spec/matchers.rb index 9e05746..3565b5f 100644 --- a/lib/rdf/spec/matchers.rb +++ b/lib/rdf/spec/matchers.rb @@ -193,7 +193,7 @@ module Matchers end RSpec::Matchers.define :write do |message| - chain(:to) { |io| @io = io } + chain(:to) { |io| @rdf_matcher_iv_io = io } supports_block_expectations { true } @@ -256,7 +256,7 @@ def fake_stdout # default IO is standard output def io - @io ||= :output + @rdf_matcher_iv_io ||= :output end # IO name is used for description message diff --git a/lib/rdf/spec/mutable.rb b/lib/rdf/spec/mutable.rb index 1611a73..d12d49f 100644 --- a/lib/rdf/spec/mutable.rb +++ b/lib/rdf/spec/mutable.rb @@ -9,14 +9,14 @@ defined? mutable skip "Immutable resource" unless mutable.mutable? - @statements = RDF::Spec.triples + @rdf_mutable_iv_statements = RDF::Spec.triples @supports_named_graphs = mutable.respond_to?(:supports?) && mutable.supports?(:graph_name) @supports_literal_equality = mutable.respond_to?(:supports?) && mutable.supports?(:literal_equality) end let(:resource) { RDF::URI('http://rubygems.org/gems/rdf') } let(:graph_name) { RDF::URI('http://example.org/graph_name') } - let(:non_bnode_statements) {@statements.reject(&:node?)} + let(:non_bnode_statements) {@rdf_mutable_iv_statements.reject(&:node?)} describe RDF::Mutable do subject { mutable } @@ -139,7 +139,7 @@ context "when deleting statements" do before :each do - subject.insert(*@statements) + subject.insert(*@rdf_mutable_iv_statements) end it "should not raise errors" do @@ -152,7 +152,7 @@ end it "should support deleting multiple statements at a time" do - subject.delete(*@statements) + subject.delete(*@rdf_mutable_iv_statements) expect(subject.find { |s| subject.has_statement?(s) }).to be_nil end @@ -234,13 +234,13 @@ end it 'deletes and inserts' do - subject.delete_insert(@statements, [statement]) + subject.delete_insert(@rdf_mutable_iv_statements, [statement]) is_expected.to contain_exactly statement end it 'deletes before inserting' do - subject.delete_insert(@statements, [@statements.first]) - is_expected.to contain_exactly @statements.first + subject.delete_insert(@rdf_mutable_iv_statements, [@rdf_mutable_iv_statements.first]) + is_expected.to contain_exactly @rdf_mutable_iv_statements.first end it 'deletes patterns' do @@ -276,7 +276,7 @@ if subject.mutable? && subject.supports?(:atomic_write) contents = subject.statements.to_a - expect { subject.delete_insert(@statements, [nil]) } + expect { subject.delete_insert(@rdf_mutable_iv_statements, [nil]) } .to raise_error ArgumentError expect(subject.statements).to contain_exactly(*contents) end diff --git a/lib/rdf/spec/queryable.rb b/lib/rdf/spec/queryable.rb index 510bc56..c1d5a40 100644 --- a/lib/rdf/spec/queryable.rb +++ b/lib/rdf/spec/queryable.rb @@ -7,16 +7,16 @@ raise 'querable must be set with `let(:queryable)' unless defined? queryable - @doap = RDF::Spec::QUADS_FILE - @statements = RDF::Spec.quads + @rdf_queryable_iv_doap = RDF::Spec::QUADS_FILE + @rdf_queryable_iv_statements = RDF::Spec.quads if queryable.empty? if (queryable.writable? rescue false) - queryable.insert(*@statements) + queryable.insert(*@rdf_queryable_iv_statements) elsif queryable.respond_to?(:<<) - @statements.each { |statement| queryable << statement } + @rdf_queryable_iv_statements.each { |statement| queryable << statement } else - raise "queryable must respond to #<< or be pre-populated with the statements in #{@doap} in a before(:each) block" + raise "queryable must respond to #<< or be pre-populated with the statements in #{@rdf_queryable_iv_doap} in a before(:each) block" end end end @@ -95,7 +95,7 @@ pattern = RDF::Query::Pattern.new(nil, nil, nil, graph_name: nil) solutions = [] subject.send(method, pattern) {|s| solutions << s} - expect(solutions.size).to eq @statements.size + expect(solutions.size).to eq @rdf_queryable_iv_statements.size end it "returns statements from named graphs with variable graph_name" do @@ -114,7 +114,7 @@ pattern = RDF::Query::Pattern.new(nil, nil, nil, graph_name: RDF::URI("http://ar.to/#self")) solutions = [] subject.send(method, pattern) {|s| solutions << s} - expect(solutions.size).to eq File.readlines(@doap).grep(/^/).size + expect(solutions.size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^/).size end end end @@ -233,22 +233,22 @@ end it "returns the correct number of results for array queries" do - expect(subject.query([nil, nil, nil]).size).to eq @statements.size - expect(subject.query([resource, nil, nil]).size).to eq File.readlines(@doap).grep(/^/).size - expect(subject.query([RDF::URI("http://ar.to/#self"), nil, nil]).size).to eq File.readlines(@doap).grep(/^/).size + expect(subject.query([nil, nil, nil]).size).to eq @rdf_queryable_iv_statements.size + expect(subject.query([resource, nil, nil]).size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^/).size + expect(subject.query([RDF::URI("http://ar.to/#self"), nil, nil]).size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^/).size expect(subject.query([resource, RDF::URI("http://usefulinc.com/ns/doap#name"), nil]).size).to eq 1 expect(subject.query([nil, nil, RDF::URI("http://usefulinc.com/ns/doap#Project")]).size).to eq 1 end it "returns the correct number of results for hash queries" do - expect(subject.query({}).size).to eq @statements.size - expect(subject.query(subject: resource).size).to eq File.readlines(@doap).grep(/^/).size + expect(subject.query({}).size).to eq @rdf_queryable_iv_statements.size + expect(subject.query(subject: resource).size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^/).size expect(subject.query(subject: resource, predicate: RDF::URI("http://usefulinc.com/ns/doap#name")).size).to eq 1 expect(subject.query(object: RDF::URI("http://usefulinc.com/ns/doap#Project")).size).to eq 1 end it "returns the correct number of results for query queries" do - expect(subject.query(query).size).to eq @statements.size + expect(subject.query(query).size).to eq @rdf_queryable_iv_statements.size end end end diff --git a/lib/rdf/spec/repository.rb b/lib/rdf/spec/repository.rb index fbedb16..eeea688 100644 --- a/lib/rdf/spec/repository.rb +++ b/lib/rdf/spec/repository.rb @@ -7,9 +7,8 @@ raise 'repository must be set with `let(:repository)' unless defined? repository - @statements = RDF::Spec.quads if repository.empty? && repository.writable? - repository.insert(*@statements) + repository.insert(*RDF::Spec.quads) elsif repository.empty? raise "+@repository+ must respond to #<< or be pre-populated with the statements in #{RDF::Spec::TRIPLES_FILE} in a before(:each) block" end diff --git a/lib/rdf/spec/transactable.rb b/lib/rdf/spec/transactable.rb index 8d2a35b..8e60b5c 100644 --- a/lib/rdf/spec/transactable.rb +++ b/lib/rdf/spec/transactable.rb @@ -3,7 +3,7 @@ RSpec.shared_examples 'an RDF::Transactable' do include RDF::Spec::Matchers - let(:statements) { RDF::Spec.quads } + let(:statements) { @rdf_transactable_iv_statements = RDF::Spec.quads } before do raise '`transactable` must be set with `let(:transactable)`' unless @@ -34,7 +34,7 @@ expect do subject.transaction(mutable: true) do - delete(*@statements) + delete(*statements) raise 'my error' end end.to raise_error RuntimeError diff --git a/lib/rdf/spec/writer.rb b/lib/rdf/spec/writer.rb index 203a6b6..92d515a 100644 --- a/lib/rdf/spec/writer.rb +++ b/lib/rdf/spec/writer.rb @@ -14,7 +14,7 @@ let(:format_class) { writer_class.format } let(:graph) do - @graph ||= begin + @rdf_writer_iv_graph ||= begin n1 = RDF::Node("a") n2 = RDF::Node("a") p = RDF::URI("http://example/pred") @@ -27,7 +27,7 @@ end let(:serialized) do - @serialized ||= begin + @rdf_writer_iv_serialized ||= begin writer_class.buffer do |w| w << graph end @@ -82,20 +82,20 @@ describe ".open" do before(:each) do allow(RDF::Util::File).to receive(:open_file).and_yield(StringIO.new("foo")) - @dir = Dir.mktmpdir - @basename = File.join(@dir, "foo") + @rdf_writer_iv_dir = Dir.mktmpdir + @rdf_writer_iv_basename = File.join(@rdf_writer_iv_dir, "foo") end after(:each) do - FileUtils.rm_rf(@dir) + FileUtils.rm_rf(@rdf_writer_iv_dir) end it "yields writer given file_name" do format_class.file_extensions.each_pair do |sym, content_type| writer_mock = double("writer") expect(writer_mock).to receive(:got_here) - expect(writer_class).to receive(:for).with(file_name: "#{@basename}.#{sym}").and_return(writer_class) - writer_class.open("#{@basename}.#{sym}") do |r| + expect(writer_class).to receive(:for).with(file_name: "#{@rdf_writer_iv_basename}.#{sym}").and_return(writer_class) + writer_class.open("#{@rdf_writer_iv_basename}.#{sym}") do |r| expect(r).to be_a(RDF::Writer) writer_mock.got_here end @@ -107,7 +107,7 @@ writer_mock = double("writer") expect(writer_mock).to receive(:got_here) expect(writer_class).to receive(:for).with(sym).and_return(writer_class) - writer_class.open("#{@basename}.#{sym}", format: sym) do |r| + writer_class.open("#{@rdf_writer_iv_basename}.#{sym}", format: sym) do |r| expect(r).to be_a(RDF::Writer) writer_mock.got_here end @@ -117,8 +117,8 @@ format_class.file_extensions.each_pair do |sym, content_type| writer_mock = double("writer") expect(writer_mock).to receive(:got_here) - expect(writer_class).to receive(:for).with(file_name: "#{@basename}.#{sym}").and_return(writer_class) - writer_class.open("#{@basename}.#{sym}", file_name: "#{@basename}.#{sym}") do |r| + expect(writer_class).to receive(:for).with(file_name: "#{@rdf_writer_iv_basename}.#{sym}").and_return(writer_class) + writer_class.open("#{@rdf_writer_iv_basename}.#{sym}", file_name: "#{@rdf_writer_iv_basename}.#{sym}") do |r| expect(r).to be_a(RDF::Writer) writer_mock.got_here end @@ -129,8 +129,8 @@ format_class.content_types.each_pair do |content_type, formats| writer_mock = double("writer") expect(writer_mock).to receive(:got_here) - expect(writer_class).to receive(:for).with(content_type: content_type, file_name: @basename).and_return(writer_class) - writer_class.open(@basename, content_type: content_type) do |r| + expect(writer_class).to receive(:for).with(content_type: content_type, file_name: @rdf_writer_iv_basename).and_return(writer_class) + writer_class.open(@rdf_writer_iv_basename, content_type: content_type) do |r| expect(r).to be_a(RDF::Writer) writer_mock.got_here end From ab2aa521dd4665bf7091423dda437693716cf403 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Mon, 15 Oct 2018 10:37:26 -0700 Subject: [PATCH 05/18] Run 2.2.2 on Travis. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3e17ac6..0a90f4a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ before_install: "gem update --system" env: - CI=true rvm: - - 2.2 + - 2.2.2 - 2.3 - 2.4 - 2.5 From 18df1859275219a1b11d19115e0c559505a18b6a Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Thu, 20 Dec 2018 16:53:41 -0800 Subject: [PATCH 06/18] Update travis config to deal with rubygems not supporting ruby < 2.3 any longer. See https://github.com/rubygems/rubygems/issues/2534. --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0a90f4a..657afad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,9 @@ language: ruby bundler_args: --without debug script: "bundle exec rspec spec" -before_install: "gem update --system" +before_install: + - 'gem update --system --conservative || (gem i "rubygems-update:~>2.7" --no-document && update_rubygems)' + - 'gem update bundler --conservative' env: - CI=true rvm: From a5dbe34ab76f59c6934e8f5bc2bf81ad4f56eae0 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Mon, 24 Dec 2018 15:17:26 -0800 Subject: [PATCH 07/18] Add 2.6 to travis RVM matrix. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 657afad..3a1eb50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ rvm: - 2.3 - 2.4 - 2.5 + - 2.6 - jruby-9 - rbx-3 cache: bundler From 1b54f9c9555a723d417616c509f3ed955821ac66 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Thu, 10 Jan 2019 10:17:37 -0800 Subject: [PATCH 08/18] Allow readers to define more default prefixes. --- lib/rdf/spec/reader.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rdf/spec/reader.rb b/lib/rdf/spec/reader.rb index 42a4d10..2871b41 100644 --- a/lib/rdf/spec/reader.rb +++ b/lib/rdf/spec/reader.rb @@ -207,7 +207,7 @@ expect(reader_mock).to receive(:got_here) reader_class.new(reader_input, prefixes: {a: "b"}) do |r| reader_mock.got_here - expect(r.prefixes).to eq({a: "b"}) + expect(r.prefixes).to include({a: "b"}) end end end From f8914d7608d94afa3616c2c101bd4ad0f5b7335f Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Mon, 1 Jul 2019 14:33:06 -0700 Subject: [PATCH 09/18] Allow dump format to be specified in `be_equivalent_graph`. --- lib/rdf/spec/matchers.rb | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/rdf/spec/matchers.rb b/lib/rdf/spec/matchers.rb index 3565b5f..f103d90 100644 --- a/lib/rdf/spec/matchers.rb +++ b/lib/rdf/spec/matchers.rb @@ -265,7 +265,7 @@ def io_name end end - Info = Struct.new(:id, :logger, :action, :result) + Info = Struct.new(:id, :logger, :action, :result, :format) RSpec::Matchers.define :be_equivalent_graph do |expected, info| match do |actual| @@ -274,21 +274,21 @@ def io_name elsif info.is_a?(Logger) Info.new("", info) elsif info.is_a?(Hash) - Info.new(info[:id], info[:logger], info[:action], info[:result]) + Info.new(info[:id], info[:logger], info[:action], info[:result], info[:format]) else Info.new(info) end + @info.format ||= case + when RDF.const_defined?(:TriG) then :trig + when RDF.const_defined?(:Turtle) then :ttl + else :nquads + end @expected = normalize(expected) @actual = normalize(actual) @actual.isomorphic_with?(@expected) rescue false end failure_message do |actual| - format = case - when RDF.const_defined?(:TriG) then :trig - when RDF.const_defined?(:Turtle) then :ttl - else :nquads - end info = @info.respond_to?(:information) ? @info.information : @info.inspect if @expected.is_a?(RDF::Enumerable) && @actual.size != @expected.size "Graph entry counts differ:\nexpected: #{@expected.size}\nactual: #{@actual.size}\n" @@ -296,8 +296,8 @@ def io_name "Graphs differ\n" end + "\n#{info + "\n" unless info.empty?}" + - "Expected:\n#{@expected.dump(format, standard_prefixes: true, literal_shorthand: false, validate: false) rescue @expected.inspect}" + - "Results:\n#{@actual.dump(format, standard_prefixes: true, literal_shorthand: false, validate: false) rescue @actual.inspect}" + + "Expected:\n#{@expected.dump(@info.format, standard_prefixes: true, literal_shorthand: false, validate: false) rescue @expected.inspect}" + + "Results:\n#{@actual.dump(@info.format, standard_prefixes: true, literal_shorthand: false, validate: false) rescue @actual.inspect}" + "\nDebug:\n#{@info.logger}" end @@ -310,7 +310,7 @@ def io_name info = @info.respond_to?(:information) ? @info.information : @info.inspect "Graphs identical\n" + "\n#{info + "\n" unless info.empty?}" + - "Results:\n#{actual.dump(format, standard_prefixes: true, literal_shorthand: false, validate: false) rescue @actual.inspect}" + + "Results:\n#{actual.dump(@info.format, standard_prefixes: true, literal_shorthand: false, validate: false) rescue @actual.inspect}" + "\nDebug:\n#{@info.logger}" end From fc9710e70bc674ec240c62b5bba560f3fe5fa1fb Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Mon, 1 Jul 2019 14:33:22 -0700 Subject: [PATCH 10/18] Add check for default and user-specified User-Agent. --- lib/rdf/spec/http_adapter.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/rdf/spec/http_adapter.rb b/lib/rdf/spec/http_adapter.rb index 97ba7b8..917026e 100644 --- a/lib/rdf/spec/http_adapter.rb +++ b/lib/rdf/spec/http_adapter.rb @@ -63,6 +63,24 @@ end end + it "adds User-Agent header using default" do + WebMock.stub_request(:get, uri).with do |request| + expect(request.headers['User-Agent']).to eq "Ruby RDF.rb/#{RDF::VERSION}" + end.to_return(body: "foo") + RDF::Util::File.open_file(uri) do |f| + opened.opened + end + end + + it "used provided User-Agent header" do + WebMock.stub_request(:get, uri).with do |request| + expect(request.headers["User-Agent"]).to eq "Foo" + end.to_return(body: "foo") + RDF::Util::File.open_file(uri, headers: {"User-Agent" => "Foo"}) do |f| + opened.opened + end + end + it "sets content_type and encoding to utf-8 if absent" do WebMock.stub_request(:get, uri).to_return(body: "foo", headers: {"Content-Type" => "text/turtle"}) RDF::Util::File.open_file(uri) do |f| From 484d46c7a4742b70e4012496ee9777336d290f65 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Sun, 29 Sep 2019 16:49:43 -0700 Subject: [PATCH 11/18] Fix write matcher to handle exceptions in block. --- lib/rdf/spec/matchers.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rdf/spec/matchers.rb b/lib/rdf/spec/matchers.rb index f103d90..c72b2db 100644 --- a/lib/rdf/spec/matchers.rb +++ b/lib/rdf/spec/matchers.rb @@ -187,7 +187,7 @@ module Matchers RSpec::Matchers.define :write_each do |*messages| supports_block_expectations { true } - match do |block| + match(notify_expectation_failures: true) do |block| messages.each { |message| expect(&block).to write(message) } end end @@ -197,7 +197,7 @@ module Matchers supports_block_expectations { true } - match do |block| + match(notify_expectation_failures: true) do |block| @output = case io when :output then fake_stdout(&block) From 4cf4b20be6745d8d1c9a7b6a92003907d94faede Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Sun, 8 Dec 2019 13:03:25 -0800 Subject: [PATCH 12/18] Prep for 3.1 release. * Update VERSION to 3.1.0. * Remove 2.2 and 2.3 Ruby versions from travis config * require Ruby >= 2.4 in gemspec --- .travis.yml | 13 +++---------- VERSION | 2 +- rdf-spec.gemspec | 12 ++++++------ 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3a1eb50..83a126b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,23 +1,16 @@ language: ruby -bundler_args: --without debug script: "bundle exec rspec spec" -before_install: - - 'gem update --system --conservative || (gem i "rubygems-update:~>2.7" --no-document && update_rubygems)' - - 'gem update bundler --conservative' env: - CI=true rvm: - - 2.2.2 - - 2.3 - 2.4 - 2.5 - 2.6 - - jruby-9 - - rbx-3 + - 2.7 + - jruby cache: bundler sudo: false matrix: allow_failures: - - rvm: jruby-9 - - rvm: rbx-3 + - rvm: jruby dist: trusty diff --git a/VERSION b/VERSION index 4a36342..fd2a018 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.0.0 +3.1.0 diff --git a/rdf-spec.gemspec b/rdf-spec.gemspec index 3b9f47e..13c1ead 100755 --- a/rdf-spec.gemspec +++ b/rdf-spec.gemspec @@ -18,13 +18,13 @@ Gem::Specification.new do |gem| gem.files = %w(AUTHORS CREDITS README.md UNLICENSE VERSION) + Dir.glob('etc/*') + Dir.glob('lib/**/*.rb') + Dir.glob('spec/*.rb') gem.require_paths = %w(lib) - gem.required_ruby_version = '>= 2.2.2' + gem.required_ruby_version = '>= 2.4' gem.requirements = [] - gem.add_runtime_dependency 'rdf', '~> 3.0' + gem.add_runtime_dependency 'rdf', '~> 3.1' gem.add_runtime_dependency 'rdf-isomorphic', '~> 3.0' - gem.add_runtime_dependency 'rspec', '~> 3.7' - gem.add_runtime_dependency 'rspec-its', '~> 1.2' - gem.add_runtime_dependency 'webmock', '~> 3.1' - gem.add_development_dependency 'yard' , '~> 0.9.12' + gem.add_runtime_dependency 'rspec', '~> 3.9' + gem.add_runtime_dependency 'rspec-its', '~> 1.3' + gem.add_runtime_dependency 'webmock', '~> 3.7' + gem.add_development_dependency 'yard' , '~> 0.9.20' gem.post_install_message = nil end From 07a0aed796222119552e2faf2a7c730012d949dc Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Mon, 9 Dec 2019 17:33:14 -0800 Subject: [PATCH 13/18] Update hash used as **. --- lib/rdf/spec/mutable.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rdf/spec/mutable.rb b/lib/rdf/spec/mutable.rb index d12d49f..1513ee4 100644 --- a/lib/rdf/spec/mutable.rb +++ b/lib/rdf/spec/mutable.rb @@ -56,7 +56,7 @@ end it "should accept an optional hash argument" do - expect { subject.load(RDF::Spec::TRIPLES_FILE, {}) }.not_to raise_error + expect { subject.load(RDF::Spec::TRIPLES_FILE, **{}) }.not_to raise_error end it "should load statements" do From b07ec2c50581d6f777213875f84a6b81ebdd290b Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Tue, 10 Dec 2019 15:59:20 -0800 Subject: [PATCH 14/18] Don't override Array.inspect, and use awesome_print in `produce` matcher. --- lib/rdf/spec/inspects.rb | 32 -------------------------------- lib/rdf/spec/matchers.rb | 16 ++++------------ rdf-spec.gemspec | 9 +++++---- 3 files changed, 9 insertions(+), 48 deletions(-) diff --git a/lib/rdf/spec/inspects.rb b/lib/rdf/spec/inspects.rb index cca56d1..2e36617 100644 --- a/lib/rdf/spec/inspects.rb +++ b/lib/rdf/spec/inspects.rb @@ -31,38 +31,6 @@ def inspect end end -class Array - alias_method :inspect_without_formatting, :inspect - def inspect_with_formatting - if all? { |item| item.is_a?(Hash) } - string = "[\n" - each do |item| - string += " {\n" - item.keys.sort_by(&:to_s).each do |key| - string += " #{key.inspect}: #{item[key].inspect}\n" - end - string += " },\n" - end - string += "]" - string - elsif all? { |item| item.is_a?(RDF::Query::Solution)} - string = "[\n" - each do |item| - string += " {\n" - item.bindings.keys.sort_by(&:to_s).each do |key| - string += " #{key.inspect}: #{item.bindings[key].inspect}\n" - end - string += " },\n" - end - string += "]" - string - else - inspect_without_formatting - end - end - alias_method :inspect, :inspect_with_formatting -end - class RDF::Query::Solutions def inspect string = "vars: #{variable_names.join(",")}\n#{to_a.inspect}" diff --git a/lib/rdf/spec/matchers.rb b/lib/rdf/spec/matchers.rb index c72b2db..ee2e20e 100644 --- a/lib/rdf/spec/matchers.rb +++ b/lib/rdf/spec/matchers.rb @@ -1,4 +1,5 @@ require 'rspec/matchers' # @see http://rubygems.org/gems/rspec +require 'awesome_print' module RDF; module Spec ## @@ -329,15 +330,6 @@ def normalize(graph) end end - require 'json' - JSON_STATE = ::JSON::State.new( - indent: " ", - space: " ", - space_before: "", - object_nl: "\n", - array_nl: "\n" - ) - RSpec::Matchers.define :produce do |expected, info| match do |actual| @info = if (info.id rescue false) @@ -355,8 +347,8 @@ def normalize(graph) failure_message do |actual| info = @info.respond_to?(:information) ? @info.information : @info.inspect - "Expected: #{expected.is_a?(String) ? expected : expected.to_json(JSON_STATE) rescue 'malformed json'}\n" + - "Actual : #{actual.is_a?(String) ? actual : actual.to_json(JSON_STATE) rescue 'malformed json'}\n" + + "Expected: #{expected.ai}\n" + + "Actual : #{actual.ai}\n" + "\n#{info + "\n" unless info.empty?}" + "\nDebug:\n#{@info.logger}" end @@ -365,7 +357,7 @@ def normalize(graph) info = @info.respond_to?(:information) ? @info.information : @info.inspect "Expected not to produce the following:\n" + - "Actual : #{actual.is_a?(String) ? actual : actual.to_json(JSON_STATE) rescue 'malformed json'}\n" + + "Actual : #{actual.ai}\n" + "\n#{info + "\n" unless info.empty?}" + "\nDebug:\n#{@info.logger}" end diff --git a/rdf-spec.gemspec b/rdf-spec.gemspec index 13c1ead..cc24039 100755 --- a/rdf-spec.gemspec +++ b/rdf-spec.gemspec @@ -21,10 +21,11 @@ Gem::Specification.new do |gem| gem.required_ruby_version = '>= 2.4' gem.requirements = [] gem.add_runtime_dependency 'rdf', '~> 3.1' - gem.add_runtime_dependency 'rdf-isomorphic', '~> 3.0' - gem.add_runtime_dependency 'rspec', '~> 3.9' - gem.add_runtime_dependency 'rspec-its', '~> 1.3' - gem.add_runtime_dependency 'webmock', '~> 3.7' + gem.add_runtime_dependency 'awesome_print', '~> 1.8' + gem.add_development_dependency 'rdf-isomorphic', '~> 3.0' + gem.add_development_dependency 'rspec', '~> 3.9' + gem.add_development_dependency 'rspec-its', '~> 1.3' + gem.add_development_dependency 'webmock', '~> 3.7' gem.add_development_dependency 'yard' , '~> 0.9.20' gem.post_install_message = nil end From 27dbfe9f2304fa08c8424787c80ffd59b42b38e5 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Wed, 11 Dec 2019 11:59:13 -0800 Subject: [PATCH 15/18] Make some development dependencies runtime dependencies, so they get used by depending gems. --- rdf-spec.gemspec | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rdf-spec.gemspec b/rdf-spec.gemspec index cc24039..4f8d23e 100755 --- a/rdf-spec.gemspec +++ b/rdf-spec.gemspec @@ -22,10 +22,10 @@ Gem::Specification.new do |gem| gem.requirements = [] gem.add_runtime_dependency 'rdf', '~> 3.1' gem.add_runtime_dependency 'awesome_print', '~> 1.8' - gem.add_development_dependency 'rdf-isomorphic', '~> 3.0' - gem.add_development_dependency 'rspec', '~> 3.9' - gem.add_development_dependency 'rspec-its', '~> 1.3' - gem.add_development_dependency 'webmock', '~> 3.7' + gem.add_runtime_dependency 'rdf-isomorphic', '~> 3.0' + gem.add_runtime_dependency 'rspec', '~> 3.9' + gem.add_runtime_dependency 'rspec-its', '~> 1.3' + gem.add_runtime_dependency 'webmock', '~> 3.7' gem.add_development_dependency 'yard' , '~> 0.9.20' - gem.post_install_message = nil + gem.post_install_message = nil end From ac5467c4d0ff4028060682fe71f171050fe62143 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Wed, 11 Dec 2019 14:59:30 -0800 Subject: [PATCH 16/18] Allow 2.7 to fail, for now. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 83a126b..59bdc60 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,5 @@ sudo: false matrix: allow_failures: - rvm: jruby + - rvm: 2.7 dist: trusty From c997f6c8fabbd9a1c199fc350527ee7b8698f11b Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Wed, 11 Dec 2019 17:25:46 -0800 Subject: [PATCH 17/18] Be explicit when argument is a hash and not keyword arguments. --- lib/rdf/spec/mutable.rb | 2 +- lib/rdf/spec/queryable.rb | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/rdf/spec/mutable.rb b/lib/rdf/spec/mutable.rb index 1513ee4..c8275bb 100644 --- a/lib/rdf/spec/mutable.rb +++ b/lib/rdf/spec/mutable.rb @@ -69,7 +69,7 @@ if @supports_named_graphs subject.load RDF::Spec::TRIPLES_FILE, graph_name: graph_name is_expected.to have_graph(graph_name) - expect(subject.query(graph_name: graph_name).size).to eq subject.size + expect(subject.query({graph_name: graph_name}).size).to eq subject.size end end end diff --git a/lib/rdf/spec/queryable.rb b/lib/rdf/spec/queryable.rb index c1d5a40..8aa0846 100644 --- a/lib/rdf/spec/queryable.rb +++ b/lib/rdf/spec/queryable.rb @@ -242,9 +242,9 @@ it "returns the correct number of results for hash queries" do expect(subject.query({}).size).to eq @rdf_queryable_iv_statements.size - expect(subject.query(subject: resource).size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^/).size - expect(subject.query(subject: resource, predicate: RDF::URI("http://usefulinc.com/ns/doap#name")).size).to eq 1 - expect(subject.query(object: RDF::URI("http://usefulinc.com/ns/doap#Project")).size).to eq 1 + expect(subject.query({subject: resource}).size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^/).size + expect(subject.query({subject: resource, predicate: RDF::URI("http://usefulinc.com/ns/doap#name")}).size).to eq 1 + expect(subject.query({object: RDF::URI("http://usefulinc.com/ns/doap#Project")}).size).to eq 1 end it "returns the correct number of results for query queries" do @@ -256,13 +256,13 @@ context "with specific patterns from SPARQL" do context "triple pattern combinations" do it "?s p o" do - expect(subject.query(predicate: RDF::URI("http://example.org/p"), object: RDF::Literal.new(1)).to_a).to( + expect(subject.query({predicate: RDF::URI("http://example.org/p"), object: RDF::Literal.new(1)}).to_a).to( include *[RDF::Statement.new(RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1), RDF::Statement.new(RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1)] ) end it "s ?p o" do - expect(subject.query(subject: RDF::URI("http://example.org/xi2"), object: RDF::Literal.new(1)).to_a).to( + expect(subject.query({subject: RDF::URI("http://example.org/xi2"), object: RDF::Literal.new(1)}).to_a).to( include *[RDF::Statement.new(RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1)] ) end @@ -272,8 +272,8 @@ context "data/r2/expr-equals" do context "graph-1" do let(:result) do - queryable.query(predicate: RDF::URI("http://example.org/p"), - object: RDF::Literal::Integer.new(1)).to_a + queryable.query({predicate: RDF::URI("http://example.org/p"), + object: RDF::Literal::Integer.new(1)}).to_a end it 'has two solutions' do @@ -293,8 +293,8 @@ context "graph-2" do let(:result) do - queryable.query(predicate: RDF::URI("http://example.org/p"), - object: RDF::Literal::Double.new("1.0e0")) + queryable.query({predicate: RDF::URI("http://example.org/p"), + object: RDF::Literal::Double.new("1.0e0")}) .to_a end From 84a9cbe1d0cf832f668b2915ed889fd22323faf3 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Sat, 14 Dec 2019 10:40:17 -0800 Subject: [PATCH 18/18] Fix bundler args in travis. --- Gemfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index a78d207..b2d5b08 100644 --- a/Gemfile +++ b/Gemfile @@ -10,6 +10,6 @@ group :debug do end group :development, :test do - gem 'simplecov', require: false, platform: :mri - gem 'coveralls', require: false, platform: :mri + gem 'simplecov', platforms: :mri + gem 'coveralls', '~> 0.8', platforms: :mri end \ No newline at end of file