From d9a9ab3be2bd979ccd090a3d379be120a9df5140 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Sat, 7 Nov 2015 08:58:41 -0800 Subject: [PATCH] Handle `Enumerable` values on `Repository#delete` A test for `RDF::Enumerable` inputs was added by https://github.com/ruby-rdf/rdf-spec/pull/39. This adds conformance, and allows `SPARQL::Client::Repository` to use the new `Mutable#delete_insert` interface. It does not yet implement an effecient SPARQL `#delete_insert`. It may be possible to refactor `#delete_statements` in response to these changes, to remove the code smells called out in the comment in that method. --- lib/sparql/client/repository.rb | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/sparql/client/repository.rb b/lib/sparql/client/repository.rb index d9445fe6..e53cd704 100644 --- a/lib/sparql/client/repository.rb +++ b/lib/sparql/client/repository.rb @@ -192,10 +192,27 @@ def clear_statements # considered to be a pattern, and used to query # self to find matching statements to delete. # - # @param [Enumerable] statements - # @raise [TypeError] if `self` is immutable - # @return [Mutable] + # @overload delete(*statements) + # @param [Array] statements + # @raise [TypeError] if `self` is immutable + # @return [self] + # + # @overload delete(statements) + # @param [Enumerable] statements + # @raise [TypeError] if `self` is immutable + # @return [self] + # + # @see RDF::Mutable#delete def delete(*statements) + statements.map! do |value| + if value.respond_to?(:each_statement) + delete_statements(value) + nil + else + value + end + end + statements.compact! delete_statements(statements) unless statements.empty? return self end @@ -263,7 +280,6 @@ def query_pattern(pattern, options = {}, &block) # @param [RDF::Enumerable] statements # @return [void] def delete_statements(statements) - constant = statements.all? do |value| # needs to be flattened... urgh !value.respond_to?(:each_statement) && begin