diff --git a/lib/valkyrie.rb b/lib/valkyrie.rb index 2c40d47ab..c3c7352e7 100644 --- a/lib/valkyrie.rb +++ b/lib/valkyrie.rb @@ -68,6 +68,11 @@ def logger=(logger) @logger = logger end + def warn_about_standard_queries! + warn "[DEPRECATION] Please enable query normalization to avoid inconsistent results between different adapters by adding `standardize_query_results: true` to your environment block" \ + " in config\/valkyrie.yml. This will be the behavior in Valkyrie 2.0." + end + class Config < OpenStruct def initialize(hsh = {}) super(defaults.merge(hsh)) @@ -85,9 +90,10 @@ def storage_adapter def defaults { + standardize_query_result: false } end end - module_function :config, :logger, :logger=, :config_root_path, :environment, :config_file, :config_hash + module_function :config, :logger, :logger=, :config_root_path, :environment, :warn_about_standard_queries!, :config_file, :config_hash end diff --git a/lib/valkyrie/id.rb b/lib/valkyrie/id.rb index c6f326bbb..83f65067b 100644 --- a/lib/valkyrie/id.rb +++ b/lib/valkyrie/id.rb @@ -21,6 +21,14 @@ def eql?(other) end alias == eql? + # @deprecated Please use {.uri_for} instead + def to_uri + return RDF::Literal.new(id.to_s, datatype: RDF::URI("http://example.com/valkyrie_id")) if id.to_s.include?("://") + warn "[DEPRECATION] `to_uri` is deprecated and will be removed in the next major release. " \ + "Called from #{Gem.location_of_caller.join(':')}" + ::RDF::URI(ActiveFedora::Base.id_to_uri(id)) + end + protected def state diff --git a/lib/valkyrie/persistence/fedora.rb b/lib/valkyrie/persistence/fedora.rb index 0f57be30c..7f0c9c413 100644 --- a/lib/valkyrie/persistence/fedora.rb +++ b/lib/valkyrie/persistence/fedora.rb @@ -4,7 +4,7 @@ module Valkyrie::Persistence # Implements the DataMapper Pattern to store metadata into Fedora module Fedora require 'active_triples' - require 'ldp' + require 'active_fedora' require 'valkyrie/persistence/fedora/permissive_schema' require 'valkyrie/persistence/fedora/metadata_adapter' require 'valkyrie/persistence/fedora/persister' diff --git a/lib/valkyrie/persistence/fedora/metadata_adapter.rb b/lib/valkyrie/persistence/fedora/metadata_adapter.rb index b68e5a89e..9d01ff351 100644 --- a/lib/valkyrie/persistence/fedora/metadata_adapter.rb +++ b/lib/valkyrie/persistence/fedora/metadata_adapter.rb @@ -15,11 +15,13 @@ class MetadataAdapter # @param [String] base_path # @param [Valkyrie::Persistence::Fedora::PermissiveSchema] schema # @param [Integer] fedora_version - def initialize(connection:, base_path: "/", schema: Valkyrie::Persistence::Fedora::PermissiveSchema.new, fedora_version: 5) + def initialize(connection:, base_path: "/", schema: Valkyrie::Persistence::Fedora::PermissiveSchema.new, fedora_version: 4) @connection = connection @base_path = base_path @schema = schema @fedora_version = fedora_version + + warn "[DEPRECATION] `fedora_version` will default to 5 in the next major release." unless fedora_version end # Construct the query service object using this adapter @@ -76,5 +78,10 @@ def pair_path(id) def connection_prefix "#{connection.http.url_prefix}/#{base_path}" end + + def standardize_query_result? + Valkyrie.warn_about_standard_queries! if Valkyrie.config.standardize_query_result != true + Valkyrie.config.standardize_query_result == true + end end end diff --git a/lib/valkyrie/persistence/fedora/permissive_schema.rb b/lib/valkyrie/persistence/fedora/permissive_schema.rb index 47f9329de..3b8a8530d 100644 --- a/lib/valkyrie/persistence/fedora/permissive_schema.rb +++ b/lib/valkyrie/persistence/fedora/permissive_schema.rb @@ -22,11 +22,27 @@ def self.id uri_for(:id) end + # @deprecated Please use {.uri_for} instead + def self.alternate_ids + warn "[DEPRECATION] `alternate_ids` is deprecated and will be removed in the next major release. " \ + "It was never used internally - please use `uri_for(:alternate_ids)` " \ + "Called from #{Gem.location_of_caller.join(':')}" + uri_for(:alternate_ids) + end + # @return [RDF::URI] def self.member_ids uri_for(:member_ids) end + # @deprecated Please use {.uri_for} instead + def self.references + warn "[DEPRECATION] `references` is deprecated and will be removed in the next major release. " \ + "It was never used internally - please use `uri_for(:references)` " \ + "Called from #{Gem.location_of_caller.join(':')}" + uri_for(:references) + end + # @return [RDF::URI] def self.valkyrie_bool uri_for(:valkyrie_bool) diff --git a/lib/valkyrie/persistence/fedora/query_service.rb b/lib/valkyrie/persistence/fedora/query_service.rb index 7460beaa3..838388f25 100644 --- a/lib/valkyrie/persistence/fedora/query_service.rb +++ b/lib/valkyrie/persistence/fedora/query_service.rb @@ -29,7 +29,7 @@ def find_by_alternate_identifier(alternate_identifier:) # (see Valkyrie::Persistence::Memory::QueryService#find_many_by_ids) def find_many_by_ids(ids:) - ids = ids.uniq + ids = ids.uniq if adapter.standardize_query_result? ids.map do |id| begin find_by(id: id) @@ -43,7 +43,7 @@ def find_many_by_ids(ids:) def find_parents(resource:) content = content_with_inbound(id: resource.id) parent_ids = content.graph.query([nil, RDF::Vocab::ORE.proxyFor, nil]).map(&:subject).map { |x| x.to_s.gsub(/#.*/, '') }.map { |x| adapter.uri_to_id(x) } - parent_ids.uniq! + parent_ids.uniq! if adapter.standardize_query_result? parent_ids.lazy.map do |id| find_by(id: id) end @@ -131,14 +131,14 @@ def find_inverse_references_by_unordered(resource:, property:) content = content_with_inbound(id: resource.id) property_uri = adapter.schema.predicate_for(property: property, resource: nil) ids = content.graph.query([nil, property_uri, adapter.id_to_uri(resource.id)]).map(&:subject).map { |x| x.to_s.gsub(/#.*/, '') }.map { |x| adapter.uri_to_id(x) } - ids.uniq! + ids.uniq! if adapter.standardize_query_result? ids.lazy.map { |id| find_by(id: id) } end def find_inverse_references_by_ordered(resource:, property:) content = content_with_inbound(id: resource.id) ids = content.graph.query([nil, ::RDF::Vocab::ORE.proxyFor, adapter.id_to_uri(resource.id)]).map(&:subject).map { |x| x.to_s.gsub(/#.*/, '') }.map { |x| adapter.uri_to_id(x) } - ids.uniq! + ids.uniq! if adapter.standardize_query_result? ids.lazy.map { |id| find_by(id: id) }.select { |o| o[property].include?(resource.id) } end diff --git a/lib/valkyrie/persistence/memory/metadata_adapter.rb b/lib/valkyrie/persistence/memory/metadata_adapter.rb index 1609269cc..2d919bf7b 100644 --- a/lib/valkyrie/persistence/memory/metadata_adapter.rb +++ b/lib/valkyrie/persistence/memory/metadata_adapter.rb @@ -29,5 +29,10 @@ def cache def id @id ||= Valkyrie::ID.new(Digest::MD5.hexdigest(self.class.to_s)) end + + def standardize_query_result? + Valkyrie.warn_about_standard_queries! if Valkyrie.config.standardize_query_result != true + Valkyrie.config.standardize_query_result == true + end end end diff --git a/lib/valkyrie/persistence/memory/persister.rb b/lib/valkyrie/persistence/memory/persister.rb index b4c88c400..4ef0ecf4e 100644 --- a/lib/valkyrie/persistence/memory/persister.rb +++ b/lib/valkyrie/persistence/memory/persister.rb @@ -86,7 +86,7 @@ def normalize_date_value(value) def generate_lock_token(resource) return unless resource.optimistic_locking_enabled? token = Valkyrie::Persistence::OptimisticLockToken.new(adapter_id: adapter.id, token: Time.now.to_r) - resource.set_value(Valkyrie::Persistence::Attributes::OPTIMISTIC_LOCK, token) + resource.send("#{Valkyrie::Persistence::Attributes::OPTIMISTIC_LOCK}=", token) end # Check whether a resource is current. diff --git a/lib/valkyrie/persistence/memory/query_service.rb b/lib/valkyrie/persistence/memory/query_service.rb index 322fd131e..1c704f9ab 100644 --- a/lib/valkyrie/persistence/memory/query_service.rb +++ b/lib/valkyrie/persistence/memory/query_service.rb @@ -44,7 +44,7 @@ def find_by_alternate_identifier(alternate_identifier:) # @raise [ArgumentError] Raised when any ID is not a String or a Valkyrie::ID # @return [Array] All requested objects that were found def find_many_by_ids(ids:) - ids = ids.uniq + ids = ids.uniq if adapter.standardize_query_result? ids.map do |id| begin find_by(id: id) @@ -97,7 +97,7 @@ def find_references_by(resource:, property:) nil end end.reject(&:nil?) - refs.uniq! unless ordered_property?(resource: resource, property: property) + refs.uniq! if adapter.standardize_query_result? && !ordered_property?(resource: resource, property: property) refs end diff --git a/lib/valkyrie/persistence/postgres/metadata_adapter.rb b/lib/valkyrie/persistence/postgres/metadata_adapter.rb index 8d48e311c..16106d427 100644 --- a/lib/valkyrie/persistence/postgres/metadata_adapter.rb +++ b/lib/valkyrie/persistence/postgres/metadata_adapter.rb @@ -35,5 +35,10 @@ def id Valkyrie::ID.new(Digest::MD5.hexdigest(to_hash)) end end + + def standardize_query_result? + Valkyrie.warn_about_standard_queries! if Valkyrie.config.standardize_query_result != true + Valkyrie.config.standardize_query_result == true + end end end diff --git a/lib/valkyrie/persistence/postgres/query_service.rb b/lib/valkyrie/persistence/postgres/query_service.rb index 0624e6c95..ef0f21500 100644 --- a/lib/valkyrie/persistence/postgres/query_service.rb +++ b/lib/valkyrie/persistence/postgres/query_service.rb @@ -189,7 +189,7 @@ def find_inverse_references_query # @return [String] def find_references_query <<-SQL - SELECT DISTINCT member.* FROM orm_resources a, + SELECT #{adapter.standardize_query_result? ? 'DISTINCT' : ''} member.* FROM orm_resources a, jsonb_array_elements(a.metadata->?) AS b(member) JOIN orm_resources member ON (b.member->>'id')::#{id_type} = member.id WHERE a.id = ? SQL diff --git a/lib/valkyrie/persistence/solr/metadata_adapter.rb b/lib/valkyrie/persistence/solr/metadata_adapter.rb index 950b9a337..6c1c34efa 100644 --- a/lib/valkyrie/persistence/solr/metadata_adapter.rb +++ b/lib/valkyrie/persistence/solr/metadata_adapter.rb @@ -64,6 +64,11 @@ def resource_factory Valkyrie::Persistence::Solr::ResourceFactory.new(resource_indexer: resource_indexer, adapter: self) end + def standardize_query_result? + Valkyrie.warn_about_standard_queries! if Valkyrie.config.standardize_query_result != true + Valkyrie.config.standardize_query_result == true + end + # Class modeling the indexer for cases where indexing is *not* performed class NullIndexer # @note this is a no-op diff --git a/lib/valkyrie/persistence/solr/queries/find_members_query.rb b/lib/valkyrie/persistence/solr/queries/find_members_query.rb index 945bbb864..08b6d674a 100644 --- a/lib/valkyrie/persistence/solr/queries/find_members_query.rb +++ b/lib/valkyrie/persistence/solr/queries/find_members_query.rb @@ -3,17 +3,18 @@ module Valkyrie::Persistence::Solr::Queries # Responsible for returning all members of a given resource as # {Valkyrie::Resource}s class FindMembersQuery - attr_reader :resource, :connection, :resource_factory, :model + attr_reader :resource, :connection, :resource_factory, :model, :standardize_query_result # @param [Valkyrie::Resource] resource # @param [RSolr::Client] connection # @param [ResourceFactory] resource_factory # @param [Class] model - def initialize(resource:, connection:, resource_factory:, model:) + def initialize(resource:, connection:, resource_factory:, model:, standardize_query_result:) @resource = resource @connection = connection @resource_factory = resource_factory @model = model + @standardize_query_result = standardize_query_result end # Iterate over each Solr Document and convert each Document into a Valkyrie Resource @@ -28,8 +29,14 @@ def run # @yield [Valkyrie::Resource] def each return [] unless resource.id.present? - member_ids.map { |id| unordered_members.find { |member| member.id == id } }.reject(&:nil?).each do |member| - yield member + if standardize_query_result + member_ids.map { |id| unordered_members.find { |member| member.id == id } }.reject(&:nil?).each do |member| + yield member + end + else + unordered_members.sort_by { |x| member_ids.index(x.id) }.each do |member| + yield member + end end end diff --git a/lib/valkyrie/persistence/solr/query_service.rb b/lib/valkyrie/persistence/solr/query_service.rb index f0927e019..f044461f9 100644 --- a/lib/valkyrie/persistence/solr/query_service.rb +++ b/lib/valkyrie/persistence/solr/query_service.rb @@ -70,7 +70,8 @@ def find_members(resource:, model: nil) resource: resource, model: model, connection: connection, - resource_factory: resource_factory + resource_factory: resource_factory, + standardize_query_result: adapter.standardize_query_result? ).run end diff --git a/lib/valkyrie/resource.rb b/lib/valkyrie/resource.rb index d51899136..f5b9075fb 100644 --- a/lib/valkyrie/resource.rb +++ b/lib/valkyrie/resource.rb @@ -15,26 +15,13 @@ module Valkyrie # @see lib/valkyrie/specs/shared_specs/resource.rb class Resource < Dry::Struct include Draper::Decoratable - # Allows a Valkyrie::Resource to be instantiated without providing every - # available key, and makes sure the defaults are set up if no value is - # given. - def self.allow_nonexistent_keys - nil_2_undef = ->(v) { v.nil? ? Dry::Types::Undefined : v } - transform_types do |type| - current_meta = type.meta.merge(omittable: true) - if type.default? - type.constructor(nil_2_undef).meta(current_meta) - else - type.meta(current_meta) - end - end - end + constructor_type :schema # Overridden to provide default attributes. # @note The current theory is that we should use this sparingly. def self.inherited(subclass) super(subclass) - subclass.allow_nonexistent_keys + subclass.constructor_type :schema subclass.attribute :id, Valkyrie::Types::ID.optional, internal: true subclass.attribute :internal_resource, Valkyrie::Types::Any.default(subclass.to_s), internal: true subclass.attribute :created_at, Valkyrie::Types::DateTime.optional, internal: true @@ -47,6 +34,17 @@ def self.fields schema.keys.without(:new_record) end + def self.new(attributes = default_attributes) + if attributes.is_a?(Hash) && attributes.keys.map(&:class).uniq.include?(String) + warn "[DEPRECATION] Instantiating a Valkyrie::Resource with strings as keys has " \ + "been deprecated and will be removed in the next major release. " \ + "Please use symbols instead." \ + "Called from #{Gem.location_of_caller.join(':')}" + attributes = attributes.symbolize_keys + end + super + end + # Define an attribute. Attributes are used to describe resources. # @param name [Symbol] # @param type [Dry::Types::Type] @@ -99,12 +97,55 @@ def optimistic_locking_enabled? self.class.optimistic_locking_enabled? end - def attributes - super.dup.freeze + class DeprecatedHashWrite < Hash + def []=(_k, _v) + if @soft_frozen + warn "[DEPRECATION] Writing directly to attributes has been deprecated." \ + " Please use #set_value(k, v) instead or #dup first." \ + " In the next major version, this hash will be frozen. \n" \ + "Called from #{Gem.location_of_caller.join(':')}" + end + super + end + + def delete(*_args) + if @soft_frozen + warn "[DEPRECATION] Writing directly to attributes has been deprecated." \ + " Please use #set_value(k, v) instead or #dup first." \ + " In the next major version, this hash will be frozen. \n" \ + "Called from #{Gem.location_of_caller.join(':')}" + end + super + end + + def delete_if(*_args) + if @soft_frozen + warn "[DEPRECATION] Writing directly to attributes has been deprecated." \ + " Please use #set_value(k, v) instead or #dup first." \ + " In the next major version, this hash will be frozen. \n" \ + "Called from #{Gem.location_of_caller.join(':')}" + end + super + end + + def soft_freeze! + @soft_frozen = true + self + end + + def soft_thaw! + @soft_frozen = false + self + end + + def dup + super.soft_thaw! + end end - def dup - new({}) + # @return [Hash] Hash of attributes + def attributes + DeprecatedHashWrite.new.merge(to_h).soft_freeze! end # @param name [Symbol] Attribute name @@ -155,7 +196,7 @@ def human_readable_type # @param name [#to_sym] the name of the attribute to read def [](name) super(name.to_sym) - rescue Dry::Struct::MissingAttributeError + rescue NoMethodError nil end @@ -164,7 +205,7 @@ def [](name) # @param key [#to_sym] the name of the attribute to set # @param value [] the value to set key to. def set_value(key, value) - @attributes[key.to_sym] = self.class.schema[key.to_sym].call(value) + instance_variable_set(:"@#{key}", self.class.schema[key.to_sym].call(value)) end end end diff --git a/lib/valkyrie/specs/shared_specs/queries.rb b/lib/valkyrie/specs/shared_specs/queries.rb index f74f12c1a..d5d5017f7 100644 --- a/lib/valkyrie/specs/shared_specs/queries.rb +++ b/lib/valkyrie/specs/shared_specs/queries.rb @@ -22,6 +22,8 @@ class SecondResource < Valkyrie::Resource let(:persister) { adapter.persister } subject { adapter.query_service } + before { allow(Valkyrie.config).to receive(:standardize_query_result).and_return(true) } + it { is_expected.to respond_to(:find_all).with(0).arguments } it { is_expected.to respond_to(:find_all_of_model).with_keywords(:model) } it { is_expected.to respond_to(:find_by).with_keywords(:id) } diff --git a/lib/valkyrie/specs/shared_specs/resource.rb b/lib/valkyrie/specs/shared_specs/resource.rb index 5dee1e3d9..ba6dd8c1b 100644 --- a/lib/valkyrie/specs/shared_specs/resource.rb +++ b/lib/valkyrie/specs/shared_specs/resource.rb @@ -117,11 +117,14 @@ class MyCustomResource < Valkyrie::Resource expect(resource.symbol_property).to eq ["bla"] resource_klass.schema.delete(:symbol_property) end - it "can not set values with string properties" do + it "can set values with string properties, but will throw a deprecation error" do resource_klass.attribute :string_property resource = nil - expect(resource).not_to respond_to :string_property + expect { resource = resource_klass.new("string_property" => "bla") }.to output(/\[DEPRECATION\]/).to_stderr + + expect(resource.string_property).to eq ["bla"] + resource_klass.schema.delete(:string_property) end end @@ -131,9 +134,11 @@ class MyCustomResource < Valkyrie::Resource resource = resource_klass.new - expect(resource.attributes).to be_frozen expect(resource.attributes).to have_key(:bla) expect(resource.attributes[:internal_resource]).to eq resource_klass.to_s + expect { resource.attributes[:internal_resource] = "bla" }.to output(/\[DEPRECATION\]/).to_stderr + expect { resource.attributes.delete_if { true } }.to output(/\[DEPRECATION\]/).to_stderr + expect { resource.attributes.delete(:internal_resource) }.to output(/\[DEPRECATION\]/).to_stderr expect { resource.attributes.dup[:internal_resource] = "bla" }.not_to output.to_stderr resource_klass.schema.delete(:bla) diff --git a/lib/valkyrie/storage/fedora.rb b/lib/valkyrie/storage/fedora.rb index ae96dc492..ac5a638cb 100644 --- a/lib/valkyrie/storage/fedora.rb +++ b/lib/valkyrie/storage/fedora.rb @@ -6,10 +6,12 @@ class Fedora PROTOCOL = 'fedora://' # @param [Ldp::Client] connection - def initialize(connection:, base_path: "/", fedora_version: 5) + def initialize(connection:, base_path: "/", fedora_version: 4) @connection = connection @base_path = base_path @fedora_version = fedora_version + + warn "[DEPRECATION] `fedora_version` will default to 5 in the next major release." unless fedora_version end # @param id [Valkyrie::ID] diff --git a/lib/valkyrie/types.rb b/lib/valkyrie/types.rb index 38ec75803..02ecf1a2a 100644 --- a/lib/valkyrie/types.rb +++ b/lib/valkyrie/types.rb @@ -96,11 +96,12 @@ def of(type) super.default([].freeze) end - # Override optional to provide a default because without it an - # instantiated Valkyrie::Resource's internal hash does not have values for - # every possible attribute, resulting in `MissingAttributeError`. - def optional - super.default(nil) + def member(type) + warn "[DEPRECATION] .member has been renamed to .of in dry-types and this " \ + "method will be removed in the next major version of Valkyrie. Please use " \ + ".of instead. " \ + "Called from #{Gem.location_of_caller.join(':')}" + super.default([].freeze) end end Array.singleton_class.include(ArrayDefault) @@ -111,5 +112,21 @@ def optional SingleValuedString = Valkyrie::Types::String.constructor do |value| ::Array.wrap(value).first.to_s end + Valkyrie::Types::Integer = Dry::Types["int"] + Valkyrie::Types::Coercible::Integer = Dry::Types["coercible.int"] + Int = Dry::Types["int"].constructor do |value| + warn "[DEPRECATION] Valkyrie::Types::Int has been renamed in dry-types and this " \ + "reference will be removed in the next major version of Valkyrie. Please use " \ + "Valkyrie::Types::Integer instead. " \ + "Called from #{Gem.location_of_caller.join(':')}" + Dry::Types["int"][value] + end + Coercible::Int = Dry::Types["coercible.int"].constructor do |value| + warn "[DEPRECATION] Valkyrie::Types::Coercible::Int has been renamed in dry-types and this " \ + "reference will be removed in the next major version of Valkyrie. Please use " \ + "Valkyrie::Types::Coercible::Integer instead. " \ + "Called from #{Gem.location_of_caller.join(':')}" + Dry::Types["coercible.int"][value] + end end end diff --git a/lib/valkyrie/version.rb b/lib/valkyrie/version.rb index 14b9c3369..7d216d836 100644 --- a/lib/valkyrie/version.rb +++ b/lib/valkyrie/version.rb @@ -1,4 +1,4 @@ # frozen_string_literal: true module Valkyrie - VERSION = "2.0.0.RC1" + VERSION = "1.4.0" end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e3a1fd80f..3cb844de1 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -14,6 +14,7 @@ add_filter 'vendor' end $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__) +require 'active_fedora' require "valkyrie" require 'pry' require 'action_dispatch' diff --git a/spec/valkyrie/id_spec.rb b/spec/valkyrie/id_spec.rb new file mode 100644 index 000000000..667955bf4 --- /dev/null +++ b/spec/valkyrie/id_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe Valkyrie::ID do + subject(:id) { described_class.new("test") } + + describe "#to_uri" do + context "when given a plain ID" do + it "delegates down to AF" do + expect(id.to_uri).to eq RDF::URI("http://localhost:8986/rest/test/test") + end + end + context "when given an external ID protocol" do + subject(:id) { described_class.new("memory://test") } + it "returns it as an RDF literal with a datatype" do + uri = id.to_uri + + expect(uri.to_s).to eq "memory://test" + expect(uri.datatype).to eq RDF::URI("http://example.com/valkyrie_id") + end + end + end +end diff --git a/spec/valkyrie/persistence/fedora/metadata_adapter_spec.rb b/spec/valkyrie/persistence/fedora/metadata_adapter_spec.rb index 6d374fb83..11346b6c3 100644 --- a/spec/valkyrie/persistence/fedora/metadata_adapter_spec.rb +++ b/spec/valkyrie/persistence/fedora/metadata_adapter_spec.rb @@ -54,6 +54,15 @@ expect(adapter.id.to_s).to eq expected end end + + # rubocop:disable Metrics/LineLength + describe "#standardize_query_result?" do + it "throws a deprecation warning when it's set to false" do + allow(Valkyrie.config).to receive(:standardize_query_result).and_return(false) + expect { adapter.standardize_query_result? }.to output(/Please enable query normalization to avoid inconsistent results between different adapters by adding `standardize_query_results: true` to your environment block in config\/valkyrie.yml. This will be the behavior in Valkyrie 2.0./).to_stderr + end + end + # rubocop:enable Metrics/LineLength end end end diff --git a/spec/valkyrie/persistence/fedora/permissive_schema_spec.rb b/spec/valkyrie/persistence/fedora/permissive_schema_spec.rb index b7d0627e9..327846b2d 100644 --- a/spec/valkyrie/persistence/fedora/permissive_schema_spec.rb +++ b/spec/valkyrie/persistence/fedora/permissive_schema_spec.rb @@ -2,6 +2,18 @@ require 'spec_helper' RSpec.describe Valkyrie::Persistence::Fedora::PermissiveSchema do + describe ".references" do + it "returns the expected temporary URI" do + expect(described_class.references).to eq RDF::URI("http://example.com/predicate/references") + end + end + + describe ".alternate_ids" do + it "returns the expected temporary URI" do + expect(described_class.alternate_ids).to eq RDF::URI("http://example.com/predicate/alternate_ids") + end + end + describe ".optimistic_lock_token" do it "returns the expected temporary URI" do expect(described_class.optimistic_lock_token).to eq RDF::URI("http://example.com/predicate/optimistic_lock_token") diff --git a/spec/valkyrie/persistence/memory/metadata_adapter_spec.rb b/spec/valkyrie/persistence/memory/metadata_adapter_spec.rb index b325dee79..68b71849e 100644 --- a/spec/valkyrie/persistence/memory/metadata_adapter_spec.rb +++ b/spec/valkyrie/persistence/memory/metadata_adapter_spec.rb @@ -12,4 +12,13 @@ expect(adapter.id.to_s).to eq expected end end + + # rubocop:disable Metrics/LineLength + describe "#standardize_query_result?" do + it "throws a deprecation warning when it's set to false" do + allow(Valkyrie.config).to receive(:standardize_query_result).and_return(false) + expect { adapter.standardize_query_result? }.to output(/Please enable query normalization to avoid inconsistent results between different adapters by adding `standardize_query_results: true` to your environment block in config\/valkyrie.yml. This will be the behavior in Valkyrie 2.0./).to_stderr + end + end + # rubocop:enable Metrics/LineLength end diff --git a/spec/valkyrie/persistence/postgres/metadata_adapter_spec.rb b/spec/valkyrie/persistence/postgres/metadata_adapter_spec.rb index 89e8a75cf..43d02a61b 100644 --- a/spec/valkyrie/persistence/postgres/metadata_adapter_spec.rb +++ b/spec/valkyrie/persistence/postgres/metadata_adapter_spec.rb @@ -13,4 +13,13 @@ expect(adapter.id.to_s).to eq expected end end + + # rubocop:disable Metrics/LineLength + describe "#standardize_query_result?" do + it "throws a deprecation warning when it's set to false" do + allow(Valkyrie.config).to receive(:standardize_query_result).and_return(false) + expect { adapter.standardize_query_result? }.to output(/Please enable query normalization to avoid inconsistent results between different adapters by adding `standardize_query_results: true` to your environment block in config\/valkyrie.yml. This will be the behavior in Valkyrie 2.0./).to_stderr + end + end + # rubocop:enable Metrics/LineLength end diff --git a/spec/valkyrie/persistence/solr/metadata_adapter_spec.rb b/spec/valkyrie/persistence/solr/metadata_adapter_spec.rb index 000e8ba2e..da2d1d46e 100644 --- a/spec/valkyrie/persistence/solr/metadata_adapter_spec.rb +++ b/spec/valkyrie/persistence/solr/metadata_adapter_spec.rb @@ -13,4 +13,13 @@ expect(adapter.id.to_s).to eq expected end end + + # rubocop:disable Metrics/LineLength + describe "#standardize_query_result?" do + it "throws a deprecation warning when it's set to false" do + allow(Valkyrie.config).to receive(:standardize_query_result).and_return(false) + expect { adapter.standardize_query_result? }.to output(/Please enable query normalization to avoid inconsistent results between different adapters by adding `standardize_query_results: true` to your environment block in config\/valkyrie.yml. This will be the behavior in Valkyrie 2.0./).to_stderr + end + end + # rubocop:enable Metrics/LineLength end diff --git a/spec/valkyrie/persistence/solr/query_service_spec.rb b/spec/valkyrie/persistence/solr/query_service_spec.rb index 96f28f8b4..b9e69f4d9 100644 --- a/spec/valkyrie/persistence/solr/query_service_spec.rb +++ b/spec/valkyrie/persistence/solr/query_service_spec.rb @@ -42,6 +42,7 @@ class CustomLockingResource < Valkyrie::Resource class CustomResource < Valkyrie::Resource attribute :member_ids, Valkyrie::Types::Array end + allow(Valkyrie.config).to receive(:standardize_query_result).and_return(false) end after do diff --git a/spec/valkyrie/types_spec.rb b/spec/valkyrie/types_spec.rb index 4b5ab4616..8c6cf165c 100644 --- a/spec/valkyrie/types_spec.rb +++ b/spec/valkyrie/types_spec.rb @@ -108,6 +108,10 @@ class Resource < Valkyrie::Resource resource = Resource.new(authors: {}) expect(resource.authors).to eq [] end + it "can use .member, but yells that it's deprecated" do + expect { Valkyrie::Types::Array.member(Valkyrie::Types::String) }.not_to raise_error + expect { Valkyrie::Types::Array.member(Valkyrie::Types::String) }.to output(/DEPRECATION/).to_stderr + end end describe "the DateTime type" do @@ -134,6 +138,10 @@ class Resource < Valkyrie::Resource resource = Resource.new(set_of_values: {}) expect(resource.set_of_values).to eq [] end + it "can use .member, but outputs a deprecation" do + expect { Valkyrie::Types::Set.member(Valkyrie::Types::String) }.not_to raise_error + expect { Valkyrie::Types::Set.member(Valkyrie::Types::String) }.to output(/DEPRECATION/).to_stderr + end end describe "A boolean value" do @@ -142,4 +150,18 @@ class Resource < Valkyrie::Resource expect(resource.my_flag).to be true end end + + describe "The INT type" do + it "works, but says it's deprecated" do + expect { Valkyrie::Types::Int[1] }.to output(/DEPRECATION/).to_stderr + expect { Valkyrie::Types::Coercible::Int[1] }.to output(/DEPRECATION/).to_stderr + end + end + + describe "the INTEGER type" do + it "works and doesn't say it's deprecated" do + expect { Valkyrie::Types::Integer[1] }.not_to output(/DEPRECATION/).to_stderr + expect { Valkyrie::Types::Coercible::Integer[1] }.not_to output(/DEPRECATION/).to_stderr + end + end end diff --git a/valkyrie.gemspec b/valkyrie.gemspec index 6394f83cc..ea390e45d 100644 --- a/valkyrie.gemspec +++ b/valkyrie.gemspec @@ -22,8 +22,9 @@ Gem::Specification.new do |spec| spec.add_dependency 'dry-struct' spec.add_dependency 'draper' spec.add_dependency 'activemodel' - spec.add_dependency 'dry-types', '~> 0.13.0' + spec.add_dependency 'dry-types', '~> 0.12.0' spec.add_dependency 'rdf' + spec.add_dependency 'active-fedora' spec.add_dependency 'activesupport' spec.add_dependency 'activerecord' spec.add_dependency 'railties' # To use generators and engines @@ -33,8 +34,6 @@ Gem::Specification.new do |spec| spec.add_dependency 'json-ld' spec.add_dependency 'json' spec.add_dependency 'active-triples' - spec.add_dependency 'ldp' - spec.add_dependency 'rsolr' spec.add_development_dependency "bundler", "~> 1.13" spec.add_development_dependency "rake", "~> 10.0"