diff --git a/lib/wings/active_fedora_converter.rb b/lib/wings/active_fedora_converter.rb index be7ba6b008..0364fab8c6 100644 --- a/lib/wings/active_fedora_converter.rb +++ b/lib/wings/active_fedora_converter.rb @@ -69,7 +69,7 @@ def active_fedora_class return klass if klass <= ActiveFedora::Base - ModelRegistry.lookup(klass) || DefaultWork + ModelRegistry.lookup(klass) || Wings::ActiveFedoraConverter::DefaultWork(klass) end ## @@ -84,6 +84,16 @@ def id resource.alternate_ids.first.to_s end + def self.DefaultWork(valkyrie_class) + "Wings::#{dynamic_active_fedora_class_name(valkyrie_class)}".constantize + rescue NameError + Wings.const_set(dynamic_active_fedora_class_name(valkyrie_class), Class.new(DefaultWork)) + end + + def self.dynamic_active_fedora_class_name(valkyrie_class) + valkyrie_class.name.gsub('::', '__') + end + # A dummy work class for valkyrie resources that don't have corresponding # hyrax ActiveFedora::Base models. # diff --git a/lib/wings/orm_converter.rb b/lib/wings/orm_converter.rb index 248cdc2c53..18dfdec11b 100644 --- a/lib/wings/orm_converter.rb +++ b/lib/wings/orm_converter.rb @@ -29,7 +29,17 @@ def self.relationship_keys_for(reflections:) # # @return [Class] def self.base_for(klass:) - ModelRegistry.reverse_lookup(klass) || Hyrax::Resource + ModelRegistry.reverse_lookup(klass) || valkyrie_resource_class(klass) + end + + def self.valkyrie_resource_class(klass) + if klass.name.starts_with?('Wings::') + klass.name.gsub('Wings::', '').gsub('__', '::').constantize + else + Hyrax::Resource + end + rescue NameError + Hyrax::Resource end ## diff --git a/spec/wings/active_fedora_converter_spec.rb b/spec/wings/active_fedora_converter_spec.rb index 2a8cd4e121..3e3ffa9196 100644 --- a/spec/wings/active_fedora_converter_spec.rb +++ b/spec/wings/active_fedora_converter_spec.rb @@ -47,7 +47,7 @@ class ConverterDummyResource < Valkyrie::Resource; end it 'gives a default work' do expect(converter.convert) - .to be_a Wings::ActiveFedoraConverter::DefaultWork + .to be_a Wings::ConverterDummyResource end context 'and it is registered' do diff --git a/spec/wings/model_transformer_spec.rb b/spec/wings/model_transformer_spec.rb index ab8fce0265..021e5f9afe 100644 --- a/spec/wings/model_transformer_spec.rb +++ b/spec/wings/model_transformer_spec.rb @@ -54,6 +54,29 @@ end describe '#build' do + context 'when it was saved as a generated Valkyrie Resource' do + let(:work) { Wings::ActiveFedoraConverter.new(resource: Monograph.new(id: id, **attributes)).convert } + + it 'returns a Monograph' do + expect(factory.build).to be_a Monograph + end + end + + context 'when it was saved as a generated and Namespaced Valkyrie Resource' do + before do + module My + class SpecialMonograph < Valkyrie::Resource + end + end + end + let(:ns_class) { My::SpecialMonograph } + let(:work) { Wings::ActiveFedoraConverter.new(resource: ns_class.new(id: id, **attributes)).convert } + + it 'returns a My::SpecialMonograph' do + expect(factory.build).to be_a ns_class + end + end + it 'returns a Valkyrie::Resource' do expect(factory.build).to be_a Valkyrie::Resource end diff --git a/spec/wings/valkyrie/persister_spec.rb b/spec/wings/valkyrie/persister_spec.rb index 0e5f4e8bf9..094325c488 100644 --- a/spec/wings/valkyrie/persister_spec.rb +++ b/spec/wings/valkyrie/persister_spec.rb @@ -102,12 +102,25 @@ class Book < ActiveFedora::Base end end + context 'when passing a Valkyrie::Resource generated with hyrax:work_resource' do + subject(:persister) { described_class.new(adapter: adapter) } + let(:adapter) { Wings::Valkyrie::MetadataAdapter.new } + let(:query_service) { adapter.query_service } + let(:resource_class) { Monograph } + let(:resource) { resource_class.new } + + it 'returns the correct Class after save' do + expect(persister.save(resource: resource)).to be_a(resource_class) + end + + end + context "When passing a Valkyrie::Resource that was never an ActiveFedora::Base" do subject(:persister) { described_class.new(adapter: adapter) } let(:adapter) { Wings::Valkyrie::MetadataAdapter.new } let(:query_service) { adapter.query_service } before do - class CustomResource < Valkyrie::Resource + class CustomResource < Hyrax::Resource attribute :title attribute :author attribute :member_ids