diff --git a/.travis.yml b/.travis.yml index 3e17ac6..59bdc60 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,20 +1,17 @@ language: ruby -bundler_args: --without debug script: "bundle exec rspec spec" -before_install: "gem update --system" env: - CI=true rvm: - - 2.2 - - 2.3 - 2.4 - 2.5 - - jruby-9 - - rbx-3 + - 2.6 + - 2.7 + - jruby cache: bundler sudo: false matrix: allow_failures: - - rvm: jruby-9 - - rvm: rbx-3 + - rvm: jruby + - rvm: 2.7 dist: trusty 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 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/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/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| 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 9e05746..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 ## @@ -187,17 +188,17 @@ 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 RSpec::Matchers.define :write do |message| - chain(:to) { |io| @io = io } + chain(:to) { |io| @rdf_matcher_iv_io = io } supports_block_expectations { true } - match do |block| + match(notify_expectation_failures: true) do |block| @output = case io when :output then fake_stdout(&block) @@ -256,7 +257,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 @@ -265,7 +266,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 +275,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 +297,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 +311,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 @@ -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/lib/rdf/spec/mutable.rb b/lib/rdf/spec/mutable.rb index 1611a73..c8275bb 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 } @@ -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 @@ -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 @@ -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..8aa0846 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(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({}).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 @@ -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 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 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/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/lib/rdf/spec/writer.rb b/lib/rdf/spec/writer.rb index d0182c5..92d515a 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 + @rdf_writer_iv_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 + @rdf_writer_iv_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,25 +59,43 @@ 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 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 @@ -80,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 @@ -90,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 @@ -102,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 diff --git a/rdf-spec.gemspec b/rdf-spec.gemspec index 6519f41..4f8d23e 100755 --- a/rdf-spec.gemspec +++ b/rdf-spec.gemspec @@ -16,21 +16,16 @@ 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.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 'awesome_print', '~> 1.8' 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.post_install_message = nil + 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 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