active-fedora 9.12.0 → 9.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/active-fedora.gemspec +1 -0
  4. data/lib/active_fedora.rb +1 -0
  5. data/lib/active_fedora/associations.rb +38 -3
  6. data/lib/active_fedora/associations/basic_contains_association.rb +12 -51
  7. data/lib/active_fedora/associations/builder/aggregation.rb +1 -1
  8. data/lib/active_fedora/associations/builder/basic_contains.rb +7 -0
  9. data/lib/active_fedora/associations/builder/{contains.rb → has_subresource.rb} +2 -2
  10. data/lib/active_fedora/associations/contains_association.rb +19 -1
  11. data/lib/active_fedora/associations/directly_contains_association.rb +1 -15
  12. data/lib/active_fedora/associations/has_subresource_association.rb +61 -0
  13. data/lib/active_fedora/attached_files.rb +6 -9
  14. data/lib/active_fedora/autosave_association.rb +1 -1
  15. data/lib/active_fedora/base.rb +0 -1
  16. data/lib/active_fedora/common.rb +1 -0
  17. data/lib/active_fedora/fedora.rb +14 -19
  18. data/lib/active_fedora/file.rb +1 -1
  19. data/lib/active_fedora/file/attributes.rb +4 -0
  20. data/lib/active_fedora/file_persistence.rb +9 -1
  21. data/lib/active_fedora/initializing_connection.rb +64 -0
  22. data/lib/active_fedora/ldp_cache.rb +1 -2
  23. data/lib/active_fedora/ldp_resource_service.rb +7 -1
  24. data/lib/active_fedora/persistence.rb +12 -1
  25. data/lib/active_fedora/reflection.rb +22 -6
  26. data/lib/active_fedora/simple_datastream.rb +2 -0
  27. data/lib/active_fedora/version.rb +1 -1
  28. data/lib/generators/active_fedora/config/fedora/fedora_generator.rb +1 -0
  29. data/lib/generators/active_fedora/config/fedora/templates/.fcrepo_wrapper +1 -0
  30. data/lib/generators/active_fedora/config/fedora/templates/fcrepo_wrapper_test.yml +4 -0
  31. data/lib/generators/active_fedora/config/solr/solr_generator.rb +1 -0
  32. data/lib/generators/active_fedora/config/solr/templates/.solr_wrapper +3 -0
  33. data/lib/generators/active_fedora/config/solr/templates/solr_wrapper_test.yml +8 -0
  34. data/spec/integration/attached_files_spec.rb +77 -18
  35. data/spec/integration/attributes_spec.rb +3 -4
  36. data/spec/integration/autosave_association_spec.rb +0 -1
  37. data/spec/integration/base_spec.rb +19 -66
  38. data/spec/integration/basic_contains_association_spec.rb +108 -0
  39. data/spec/integration/complex_rdf_datastream_spec.rb +1 -1
  40. data/spec/integration/field_to_solr_name_spec.rb +12 -11
  41. data/spec/integration/file_fixity_spec.rb +1 -1
  42. data/spec/integration/file_spec.rb +4 -1
  43. data/spec/integration/generators/fedora_generator_spec.rb +26 -0
  44. data/spec/integration/generators/solr_generator_spec.rb +26 -0
  45. data/spec/integration/has_and_belongs_to_many_associations_spec.rb +6 -16
  46. data/spec/integration/has_many_associations_spec.rb +6 -16
  47. data/spec/integration/{contains_association_spec.rb → has_subresource_spec.rb} +1 -1
  48. data/spec/integration/json_serialization_spec.rb +11 -5
  49. data/spec/integration/model_spec.rb +7 -13
  50. data/spec/integration/ntriples_datastream_spec.rb +2 -2
  51. data/spec/integration/om_datastream_spec.rb +1 -1
  52. data/spec/integration/persistence_spec.rb +0 -3
  53. data/spec/integration/query_result_builder_spec.rb +1 -1
  54. data/spec/integration/relation_delegation_spec.rb +3 -8
  55. data/spec/integration/scoped_query_spec.rb +5 -7
  56. data/spec/integration/solr_hit_spec.rb +10 -4
  57. data/spec/integration/solr_instance_loader_spec.rb +11 -4
  58. data/spec/integration/versionable_spec.rb +3 -3
  59. data/spec/spec_helper.rb +5 -1
  60. data/spec/unit/active_fedora_spec.rb +1 -1
  61. data/spec/unit/attached_files_spec.rb +32 -21
  62. data/spec/unit/attributes_spec.rb +21 -23
  63. data/spec/unit/base_active_model_spec.rb +13 -10
  64. data/spec/unit/base_spec.rb +2 -24
  65. data/spec/unit/callback_spec.rb +0 -8
  66. data/spec/unit/core_spec.rb +3 -5
  67. data/spec/unit/inheritance_spec.rb +15 -9
  68. data/spec/unit/ntriples_datastream_spec.rb +1 -1
  69. data/spec/unit/om_datastream_spec.rb +1 -1
  70. data/spec/unit/persistence_spec.rb +21 -0
  71. data/spec/unit/query_spec.rb +8 -0
  72. data/spec/unit/rdf_datastream_spec.rb +1 -1
  73. data/spec/unit/rdf_resource_datastream_spec.rb +1 -1
  74. data/spec/unit/simple_datastream_spec.rb +8 -2
  75. data/spec/unit/solr_config_options_spec.rb +1 -1
  76. data/spec/unit/validations_spec.rb +2 -8
  77. metadata +27 -6
  78. data/spec/integration/bug_spec.rb +0 -40
  79. data/spec/integration/full_featured_model_spec.rb +0 -160
@@ -203,7 +203,7 @@ module ActiveFedora
203
203
  end
204
204
 
205
205
  def build_ldp_resource_via_uri(uri = nil, content = '')
206
- Ldp::Resource::BinarySource.new(ldp_connection, uri, content, ActiveFedora.fedora.host + ActiveFedora.fedora.base_path)
206
+ Ldp::Resource::BinarySource.new(ldp_connection, uri, content, base_path_for_resource)
207
207
  end
208
208
 
209
209
  def uploaded_file?(payload)
@@ -1,6 +1,10 @@
1
1
  module ActiveFedora::File::Attributes
2
2
  attr_writer :mime_type
3
3
 
4
+ def assign_attributes(_)
5
+ # nop
6
+ end
7
+
4
8
  def mime_type
5
9
  @mime_type ||= fetch_mime_type
6
10
  end
@@ -8,7 +8,7 @@ module ActiveFedora
8
8
 
9
9
  def _create_record(_options = {})
10
10
  return false if content.nil?
11
- ldp_source.content = content
11
+ @ldp_source = build_ldp_binary_source
12
12
  ldp_source.create do |req|
13
13
  req.headers.merge!(ldp_headers)
14
14
  end
@@ -23,5 +23,13 @@ module ActiveFedora
23
23
  end
24
24
  refresh
25
25
  end
26
+
27
+ def build_ldp_binary_source
28
+ if id
29
+ build_ldp_resource_via_uri(uri, content)
30
+ else
31
+ build_ldp_resource_via_uri(nil, content)
32
+ end
33
+ end
26
34
  end
27
35
  end
@@ -0,0 +1,64 @@
1
+ module ActiveFedora
2
+ class InitializingConnection < Delegator
3
+ attr_reader :connection, :root_resource_path
4
+
5
+ def initialize(connection, root_resource_path)
6
+ super(connection)
7
+ @connection = connection
8
+ @root_resource_path = root_resource_path
9
+ @initialized = false
10
+ end
11
+
12
+ def __getobj__
13
+ @connection
14
+ end
15
+
16
+ def __setobj__(connection)
17
+ @connection = connection
18
+ end
19
+
20
+ def head(*)
21
+ init_base_path
22
+ super
23
+ end
24
+
25
+ def get(*)
26
+ init_base_path
27
+ super
28
+ end
29
+
30
+ def delete(*)
31
+ init_base_path
32
+ super
33
+ end
34
+
35
+ def post(*)
36
+ init_base_path
37
+ super
38
+ end
39
+
40
+ def put(*)
41
+ init_base_path
42
+ super
43
+ end
44
+
45
+ def patch(*)
46
+ init_base_path
47
+ super
48
+ end
49
+
50
+ private
51
+
52
+ # Call this to create a Container Resource to act as the base path for this connection
53
+ def init_base_path
54
+ return if @initialized
55
+
56
+ connection.head(root_resource_path)
57
+ ActiveFedora::Base.logger.info "Attempted to init base path `#{root_resource_path}`, but it already exists" if ActiveFedora::Base.logger
58
+ @initialized = true
59
+ false
60
+ rescue Ldp::NotFound
61
+ @initialized = connection.put(root_resource_path, '').success?
62
+ end
63
+ end
64
+ end
@@ -29,9 +29,8 @@ module ActiveFedora
29
29
  end
30
30
 
31
31
  response
32
- rescue StandardError => e
32
+ ensure
33
33
  reset_cache_settings
34
- raise e
35
34
  end
36
35
 
37
36
  private
@@ -10,10 +10,16 @@ module ActiveFedora
10
10
  if id
11
11
  LdpResource.new(connection, to_uri(klass, id))
12
12
  else
13
- LdpResource.new(connection, nil, nil, ActiveFedora.fedora.host + ActiveFedora.fedora.base_path)
13
+ parent_uri = ActiveFedora.fedora.host + ActiveFedora.fedora.base_path
14
+ LdpResource.new(connection, nil, nil, parent_uri)
14
15
  end
15
16
  end
16
17
 
18
+ def build_resource_under_path(graph, parent_uri)
19
+ parent_uri ||= ActiveFedora.fedora.host + ActiveFedora.fedora.base_path
20
+ LdpResource.new(connection, nil, graph, parent_uri)
21
+ end
22
+
17
23
  def update(change_set, klass, id)
18
24
  SparqlInsert.new(change_set.changes).execute(to_uri(klass, id))
19
25
  end
@@ -5,6 +5,8 @@ module ActiveFedora
5
5
 
6
6
  def new_record?
7
7
  @ldp_source.new?
8
+ rescue Ldp::Gone
9
+ false
8
10
  end
9
11
 
10
12
  def persisted?
@@ -85,6 +87,11 @@ module ActiveFedora
85
87
  self.class.eradicate(id)
86
88
  end
87
89
 
90
+ # Used when setting containment
91
+ def base_path_for_resource=(path)
92
+ @base_path = path
93
+ end
94
+
88
95
  module ClassMethods
89
96
  # Creates an object (or multiple objects) and saves it to the repository, if validations pass.
90
97
  # The resulting object is returned whether the object was saved successfully to the repository or not.
@@ -199,11 +206,15 @@ module ActiveFedora
199
206
  @ldp_source = if !id && new_id = assign_id
200
207
  LdpResource.new(ActiveFedora.fedora.connection, self.class.id_to_uri(new_id), @resource)
201
208
  else
202
- LdpResource.new(ActiveFedora.fedora.connection, @ldp_source.subject, @resource, ActiveFedora.fedora.host + base_path_for_resource)
209
+ LdpResource.new(ActiveFedora.fedora.connection, @ldp_source.subject, @resource, base_path_for_resource)
203
210
  end
204
211
  end
205
212
 
206
213
  def base_path_for_resource
214
+ @base_path ||= ActiveFedora.fedora.host + default_base_path_for_resource
215
+ end
216
+
217
+ def default_base_path_for_resource
207
218
  init_root_path if has_uri_prefix?
208
219
  root_resource_path
209
220
  end
@@ -20,14 +20,16 @@ module ActiveFedora
20
20
  BelongsToReflection
21
21
  when :has_and_belongs_to_many
22
22
  HasAndBelongsToManyReflection
23
- when :contains
24
- ContainsReflection
23
+ when :has_subresource
24
+ HasSubresourceReflection
25
25
  when :directly_contains
26
26
  DirectlyContainsReflection
27
27
  when :directly_contains_one
28
28
  DirectlyContainsOneReflection
29
29
  when :indirectly_contains
30
30
  IndirectlyContainsReflection
31
+ when :is_a_container
32
+ BasicContainsReflection
31
33
  when :rdf
32
34
  RDFPropertyReflection
33
35
  when :singular_rdf
@@ -107,11 +109,11 @@ module ActiveFedora
107
109
  end
108
110
 
109
111
  def child_resource_reflections
110
- reflect_on_all_associations(:contains).select { |_, reflection| reflection.klass <= ActiveFedora::File }
112
+ reflect_on_all_associations(:has_subresource).select { |_, reflection| reflection.klass <= ActiveFedora::File }
111
113
  end
112
114
 
113
115
  def contained_rdf_source_reflections
114
- reflect_on_all_associations(:contains).select { |_, reflection| !(reflection.klass <= ActiveFedora::File) }
116
+ reflect_on_all_associations(:has_subresource).select { |_, reflection| !(reflection.klass <= ActiveFedora::File) }
115
117
  end
116
118
 
117
119
  # Returns the AssociationReflection object for the +association+ (use the symbol).
@@ -503,9 +505,23 @@ module ActiveFedora
503
505
  end
504
506
  end
505
507
 
506
- class ContainsReflection < AssociationReflection # :nodoc:
508
+ class HasSubresourceReflection < AssociationReflection # :nodoc:
507
509
  def macro
508
- :contains
510
+ :has_subresource
511
+ end
512
+
513
+ def association_class
514
+ Associations::HasSubresourceAssociation
515
+ end
516
+ end
517
+
518
+ class BasicContainsReflection < AssociationReflection # :nodoc:
519
+ def macro
520
+ :is_a_container
521
+ end
522
+
523
+ def collection?
524
+ true
509
525
  end
510
526
 
511
527
  def association_class
@@ -1,6 +1,7 @@
1
1
  module ActiveFedora
2
2
  # This class represents a simple xml datastream.
3
3
  class SimpleDatastream < OmDatastream
4
+ extend Deprecation
4
5
  class_attribute :class_fields
5
6
  attr_accessor :fields
6
7
  self.class_fields = []
@@ -18,6 +19,7 @@ module ActiveFedora
18
19
  # Constructor. this class will call self.field for each DCTERM. In short, all DCTERMS fields will already exist
19
20
  # when this method returns. Each term is marked as a multivalue string.
20
21
  def initialize(digital_object = nil, dsid = nil, options = {}, &block)
22
+ Deprecation.warn(SimpleDatastream, "ActiveFedora::SimpleDatastream is deprecated and will be removed in ActiveFedora 10.0")
21
23
  self.fields = {}
22
24
  super
23
25
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = "9.12.0".freeze
2
+ VERSION = "9.13.0".freeze
3
3
  end
@@ -10,6 +10,7 @@ module ActiveFedora
10
10
 
11
11
  def fcrepo_wrapper_config
12
12
  copy_file '.fcrepo_wrapper', '.fcrepo_wrapper'
13
+ copy_file 'fcrepo_wrapper_test.yml', 'config/fcrepo_wrapper_test.yml'
13
14
  end
14
15
  end
15
16
  end
@@ -1,3 +1,4 @@
1
1
  # Place any default configuration for solr_wrapper here
2
2
  port: 8984
3
3
  enable_jms: false
4
+ fcrepo_home_dir: tmp/fcrepo4-development-data
@@ -0,0 +1,4 @@
1
+ #config/fcrepo_wrapper_test.yml.sample
2
+ port: 8986
3
+ enable_jms: false
4
+ fcrepo_home_dir: tmp/fcrepo4-test-data
@@ -12,6 +12,7 @@ module ActiveFedora
12
12
 
13
13
  def solr_wrapper_config
14
14
  copy_file '.solr_wrapper', '.solr_wrapper'
15
+ copy_file 'solr_wrapper_test.yml', 'config/solr_wrapper_test.yml'
15
16
  end
16
17
  end
17
18
  end
@@ -1,5 +1,8 @@
1
1
  # Place any default configuration for solr_wrapper here
2
+ # version: 6.0.0
2
3
  # port: 8983
4
+ instance_dir: tmp/solr-development
3
5
  collection:
6
+ persist: true
4
7
  dir: solr/config/
5
8
  name: hydra-development
@@ -0,0 +1,8 @@
1
+ #config/solr_wrapper_test.yml
2
+ # version: 6.0.0
3
+ port: 8985
4
+ instance_dir: tmp/solr-test
5
+ collection:
6
+ persist: false
7
+ dir: solr/config
8
+ name: hydra-test
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActiveFedora::AttachedFiles do
4
- describe "#contains" do
4
+ describe "#has_subresource" do
5
5
  before do
6
6
  class FooHistory < ActiveFedora::Base
7
- contains 'child'
7
+ has_subresource 'child'
8
8
  end
9
9
  end
10
10
  after do
@@ -25,32 +25,91 @@ describe ActiveFedora::AttachedFiles do
25
25
  end
26
26
  end
27
27
  end
28
- describe "serializing datastreams" do
29
- before do
30
- class TestingMetadataSerializing < ActiveFedora::Base
31
- has_metadata "nokogiri_autocreate_on", autocreate: true, type: ActiveFedora::OmDatastream
32
- has_metadata "nokogiri_autocreate_off", autocreate: false, type: ActiveFedora::OmDatastream
28
+
29
+ describe "#has_metadata" do
30
+ describe "autosave" do
31
+ before :each do
32
+ class MockAFBaseRelationship < ActiveFedora::Base
33
+ extend Deprecation
34
+ Deprecation.silence(MockAFBaseRelationship) do
35
+ has_metadata 'foo', type: Hydra::ModsArticleDatastream
36
+ end
37
+ end
33
38
  end
34
- end
39
+ after :each do
40
+ Object.send(:remove_const, :MockAFBaseRelationship)
41
+ end
42
+ describe "a new document" do
43
+ before do
44
+ @obj = MockAFBaseRelationship.new
35
45
 
36
- after do
37
- Object.send(:remove_const, :TestingMetadataSerializing)
46
+ @obj.foo.person = "bob"
47
+ @obj.save
48
+ end
49
+
50
+ it "saves the datastream." do
51
+ obj = MockAFBaseRelationship.find(@obj.id)
52
+ expect(obj.foo).to_not be_new_record
53
+ expect(obj.foo.person).to eq ['bob']
54
+ person_field = ActiveFedora.index_field_mapper.solr_name('foo__person', type: :string)
55
+ solr_result = ActiveFedora::SolrService.query("{!field f=id}#{@obj.id}", fl: "id #{person_field}").first
56
+ expect(solr_result).to eq("id" => @obj.id, person_field => ['bob'])
57
+ end
58
+ end
59
+
60
+ describe "that already exists in the repo" do
61
+ before do
62
+ @release = MockAFBaseRelationship.create
63
+ @release.foo.person = "test foo content"
64
+ @release.save
65
+ end
66
+ describe "and has been changed" do
67
+ before do
68
+ @release.foo.person = 'frank'
69
+ @release.save!
70
+ end
71
+ it "saves the datastream." do
72
+ expect(MockAFBaseRelationship.find(@release.id).foo.person).to eq ['frank']
73
+ person_field = ActiveFedora.index_field_mapper.solr_name('foo__person', type: :string)
74
+ expect(ActiveFedora::SolrService.query("id:\"#{@release.id}\"", fl: "id #{person_field}").first).to eq("id" => @release.id, person_field => ['frank'])
75
+ end
76
+ end
77
+ end
38
78
  end
39
79
 
40
- subject { TestingMetadataSerializing.new }
80
+ describe "serializing datastreams" do
81
+ before do
82
+ class TestingMetadataSerializing < ActiveFedora::Base
83
+ extend Deprecation
84
+ Deprecation.silence(TestingMetadataSerializing) do
85
+ has_metadata "nokogiri_autocreate_on", autocreate: true, type: ActiveFedora::OmDatastream
86
+ has_metadata "nokogiri_autocreate_off", autocreate: false, type: ActiveFedora::OmDatastream
87
+ end
88
+ end
89
+ end
41
90
 
42
- it "works" do
43
- subject.save(validate: false)
44
- expect(subject.nokogiri_autocreate_on).to_not be_new_record
45
- expect(subject.nokogiri_autocreate_off).to be_new_record
91
+ after do
92
+ Object.send(:remove_const, :TestingMetadataSerializing)
93
+ end
94
+
95
+ subject { TestingMetadataSerializing.new }
96
+
97
+ it "works" do
98
+ subject.save(validate: false)
99
+ expect(subject.nokogiri_autocreate_on).to_not be_new_record
100
+ expect(subject.nokogiri_autocreate_off).to be_new_record
101
+ end
46
102
  end
47
103
  end
48
104
 
49
105
  describe "#has_file_datastream" do
50
106
  before do
51
107
  class HasFile < ActiveFedora::Base
52
- has_file_datastream "file_ds"
53
- has_file_datastream "file_ds2", autocreate: false
108
+ extend Deprecation
109
+ Deprecation.silence(HasFile) do
110
+ has_file_datastream "file_ds"
111
+ has_file_datastream "file_ds2", autocreate: false
112
+ end
54
113
  end
55
114
  end
56
115
 
@@ -127,7 +186,7 @@ describe ActiveFedora::AttachedFiles do
127
186
  end
128
187
 
129
188
  describe ".metadata_streams" do
130
- let(:mds1) { ActiveFedora::SimpleDatastream.new }
189
+ let(:mds1) { ActiveFedora::QualifiedDublinCoreDatastream.new }
131
190
  let(:mds2) { ActiveFedora::QualifiedDublinCoreDatastream.new }
132
191
  let(:fds) { ActiveFedora::File.new }
133
192
  before do
@@ -10,15 +10,14 @@ describe "delegating attributes" do
10
10
  end
11
11
  end
12
12
  class TitledObject < ActiveFedora::Base
13
- has_metadata 'foo', type: ActiveFedora::SimpleDatastream do |m|
14
- m.field "title", :string
15
- end
13
+ has_subresource 'foo', class_name: 'ActiveFedora::QualifiedDublinCoreDatastream'
16
14
  Deprecation.silence(ActiveFedora::Attributes) do
17
15
  has_attributes :title, datastream: 'foo', multiple: false
18
16
  end
19
17
  end
18
+
20
19
  class RdfObject < ActiveFedora::Base
21
- contains 'foo', class_name: 'PropertiesDatastream'
20
+ has_subresource 'foo', class_name: 'PropertiesDatastream'
22
21
  Deprecation.silence(ActiveFedora::Attributes) do
23
22
  has_attributes :depositor, datastream: :foo, multiple: false do |index|
24
23
  index.as :stored_searchable