From 8898065f7ec31584d0d54953fdac693c547e56d8 Mon Sep 17 00:00:00 2001 From: Gregg Kellogg Date: Sat, 19 Aug 2023 14:25:39 -0700 Subject: [PATCH] Add Enumerable#canonicaliza method, which can be overridden by rdf-normalize, which normalizes each statement in an enumerable. --- lib/rdf/mixin/enumerable.rb | 22 +++++++++++++++++++++- spec/model_value_spec.rb | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/rdf/mixin/enumerable.rb b/lib/rdf/mixin/enumerable.rb index 708db66b..7400ffea 100644 --- a/lib/rdf/mixin/enumerable.rb +++ b/lib/rdf/mixin/enumerable.rb @@ -721,13 +721,33 @@ def enum_graph end alias_method :enum_graphs, :enum_graph + ## + # Enumerates each statement using its canonical representation. + # + # @note This is updated by `RDF::Normalize` to also canonicalize blank nodes. + # + # @return [RDF::Enumerable] + def canonicalize + this = self + Enumerable::Enumerator.new do |yielder| + this.send(:each_statement) {|y| yielder << y.canonicalize} + end + end + + ## + # Mutating canonicalization not supported + # + # @raise NotImplementedError + def canonicalize! + raise NotImplementedError, "Canonicalizing enumerables not supported" + end + ## # Returns all RDF statements in `self` as an array. # # Mixes in `RDF::Enumerable` into the returned object. # # @return [Array] - # @since 0.2.0 def to_a super.extend(RDF::Enumerable) end diff --git a/spec/model_value_spec.rb b/spec/model_value_spec.rb index af400945..b23775d9 100644 --- a/spec/model_value_spec.rb +++ b/spec/model_value_spec.rb @@ -135,9 +135,10 @@ end it "#canonicalize!" do - [statement, uri, node, literal, graph, statement, variable, list].each do |v| + [statement, uri, node, literal, statement, variable, list].each do |v| expect(v.canonicalize!).to equal v end + expect {graph.canonicalize!}.to raise_error(NotImplementedError) end it "#to_rdf" do