active-fedora 10.0.0.beta2 → 10.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 07a8d037c8e741276cd1c890062704b44b83bb7f
4
- data.tar.gz: cd0aeb9d41cc43935197ab09ad3799092efeee75
3
+ metadata.gz: 02a7ebf7a35811e4066a8fe6c45d1ac3c295c35b
4
+ data.tar.gz: ff66c823b1eada725f5d49a91bcb024c394a19e0
5
5
  SHA512:
6
- metadata.gz: 87513e6d099c60a8337df0583cc7b2cd00f35624bd11d5c953700752860c7f7e822814cfe0eff28398fde92c63a9ba3b22e14a2b5ef4bb269cd02774c709418a
7
- data.tar.gz: 0cff0bacb41cb397745b83638e4d4bc42038a706cf45e3c0f26d014249f22b24d72aef3bfe7fb35beb9030b9e5f8df9f30bfd4924e0e98eefdedcc9e98a3df08
6
+ metadata.gz: fa74e8f37edda9ac76f75f7171314ec8fa3d5ecbe3777acc9634ede021ae598475bbc9632b82da45a661584cd651b1ca31b9c8641134e45bbbed1af4de760550
7
+ data.tar.gz: 531c7c807e725d6186d37954185b3045d5790c392d39ef23ee7489642cbfa1bde0c5786b1bb66688f845780f8dd1904f62fc96c4db2d54ccc5f8a9000d1ec556
data/README.md CHANGED
@@ -9,7 +9,7 @@ Description
9
9
  ActiveFedora is a Ruby gem for creating and
10
10
  managing objects in the Fedora Repository Architecture
11
11
  ([http://fedora-commons.org](http://fedora-commons.org)). ActiveFedora
12
- is loosely based on “ActiveRecord” in Rails. Version 9.0+ works with Fedora 4 and prior versions work on Fedora 3. Version 9.2+ works with Solr 4.10.
12
+ is loosely based on “ActiveRecord” in Rails. Version 9.0+ works with Fedora 4 and prior versions work on Fedora 3. Version 9.2+ works with Solr 4.10. Version 10.0+ works with Fedora >= 4.5.1.
13
13
 
14
14
  Getting Help
15
15
  ------------
@@ -101,4 +101,3 @@ Creator: Matt Zumwalt ([MediaShelf](http://yourmediashelf.com))
101
101
  Developers:
102
102
  Justin Coyne, McClain Looney & Eddie Shin
103
103
  ([MediaShelf](http://yourmediashelf.com)), Rick Johnson (Notre Dame)
104
-
@@ -29,9 +29,10 @@ module ActiveFedora
29
29
  end
30
30
 
31
31
  # Implements the ids reader method, e.g. foo.item_ids for Foo.has_many :items
32
+ # it discards any ids where the record it belongs to was marked for destruction.
32
33
  def ids_reader
33
34
  if loaded?
34
- load_target.map(&:id)
35
+ load_target.reject(&:marked_for_destruction?).map(&:id)
35
36
  else
36
37
  load_from_solr.map(&:id)
37
38
  end
@@ -17,7 +17,8 @@ module ActiveFedora
17
17
  # @return [Hash<RDF::URI, RDF::Queryable::Enumerator>] hash of predicate uris to statements
18
18
  def changes
19
19
  @changes ||= changed_attributes.each_with_object({}) do |key, result|
20
- if object.respond_to?(:association) && object.association(key.to_sym).present?
20
+ if object.association(key.to_sym).present?
21
+ # This is always an ActiveFedora::Reflection::RDFPropertyReflection
21
22
  predicate = object.association(key.to_sym).reflection.predicate
22
23
  result[predicate] = graph.query(subject: object.rdf_subject, predicate: predicate)
23
24
  elsif object.class.properties.keys.include?(key)
@@ -1,5 +1,3 @@
1
- require 'deprecation'
2
-
3
1
  module ActiveFedora
4
2
  # An LDP NonRDFSource. The base class for a bytestream stored in the repository.
5
3
  class File
@@ -50,6 +48,12 @@ module ActiveFedora
50
48
  end
51
49
  end
52
50
 
51
+ def save
52
+ super.tap do
53
+ metadata.save if metadata.changed?
54
+ end
55
+ end
56
+
53
57
  def described_by
54
58
  raise "#{self} isn't persisted yet" if new_record?
55
59
  links['describedby'].first
@@ -99,11 +103,8 @@ module ActiveFedora
99
103
  end
100
104
 
101
105
  def attribute_will_change!(attr)
102
- if attr == 'content'
103
- changed_attributes['content'] = true
104
- else
105
- super
106
- end
106
+ return super unless attr == 'content'
107
+ changed_attributes['content'] = true
107
108
  end
108
109
 
109
110
  def remote_content
@@ -124,8 +125,13 @@ module ActiveFedora
124
125
  local_or_remote_content(false) != @ds_content
125
126
  end
126
127
 
128
+ def metadata_changed?
129
+ return false if new_record? || links['describedby'].blank?
130
+ metadata.changed?
131
+ end
132
+
127
133
  def changed?
128
- super || content_changed?
134
+ super || content_changed? || metadata_changed?
129
135
  end
130
136
 
131
137
  def inspect
@@ -201,17 +207,7 @@ module ActiveFedora
201
207
  return @content if new_record?
202
208
 
203
209
  @content ||= ensure_fetch ? remote_content : @ds_content
204
-
205
- if behaves_like_io?(@content)
206
- begin
207
- @content.rewind
208
- @content.read
209
- ensure
210
- @content.rewind
211
- end
212
- else
213
- @content
214
- end
210
+ @content.rewind if behaves_like_io?(@content)
215
211
  @content
216
212
  end
217
213
  end
@@ -1,12 +1,12 @@
1
1
  module ActiveFedora::File::Attributes
2
- attr_writer :mime_type
2
+ delegate :mime_type=, to: :metadata
3
3
 
4
4
  def assign_attributes(_)
5
5
  # nop
6
6
  end
7
7
 
8
8
  def mime_type
9
- @mime_type ||= fetch_mime_type
9
+ fetch_mime_type
10
10
  end
11
11
 
12
12
  def original_name
@@ -29,7 +29,7 @@ module ActiveFedora::File::Attributes
29
29
  end
30
30
 
31
31
  def dirty_size
32
- content.size if changed? && content.respond_to?(:size)
32
+ content.size if content_changed? && content.respond_to?(:size)
33
33
  end
34
34
 
35
35
  def size
@@ -72,8 +72,8 @@ module ActiveFedora::File::Attributes
72
72
  end
73
73
 
74
74
  def fetch_mime_type
75
- return default_mime_type if new_record?
76
- ldp_source.head.content_type
75
+ return default_mime_type if new_record? && metadata.mime_type.blank?
76
+ metadata.mime_type.first
77
77
  end
78
78
 
79
79
  def fetch_original_name
@@ -8,7 +8,10 @@ module ActiveFedora
8
8
  end
9
9
 
10
10
  initializer "active_fedora.logger" do
11
- ActiveSupport.on_load(:active_fedora) { self.logger ||= ::Rails.logger }
11
+ ActiveSupport.on_load(:active_fedora) do
12
+ self.logger ||= ::Rails.logger
13
+ Solrizer.logger ||= logger
14
+ end
12
15
  end
13
16
 
14
17
  generators do
@@ -9,7 +9,12 @@ def with_server(environment)
9
9
 
10
10
  ENV["#{environment}_SERVER_STARTED"] = 'true'
11
11
 
12
- SolrWrapper.wrap(load_config(:solr, environment)) do |solr|
12
+ # setting port: nil assigns a random port.
13
+ solr_defaults = { port: nil, verbose: true, managed: true }
14
+ fcrepo_defaults = { port: nil, verbose: true, managed: true,
15
+ enable_jms: false, fcrepo_home_dir: "fcrepo4-#{environment}-data" }
16
+
17
+ SolrWrapper.wrap(load_config(:solr, environment, solr_defaults)) do |solr|
13
18
  ENV["SOLR_#{environment.upcase}_PORT"] = solr.port.to_s
14
19
  solr_config_path = File.join('solr', 'config')
15
20
  # Check to see if configs exist in a path relative to the working directory
@@ -19,7 +24,7 @@ def with_server(environment)
19
24
  solr_config_path = File.join(File.expand_path("../..", File.dirname(__FILE__)), "solr", "config")
20
25
  end
21
26
  solr.with_collection(name: "hydra-#{environment}", dir: solr_config_path) do
22
- FcrepoWrapper.wrap(load_config(:fcrepo, environment)) do |fcrepo|
27
+ FcrepoWrapper.wrap(load_config(:fcrepo, environment, fcrepo_defaults)) do |fcrepo|
23
28
  ENV["FCREPO_#{environment.upcase}_PORT"] = fcrepo.port.to_s
24
29
  yield
25
30
  end
@@ -30,8 +35,8 @@ end
30
35
 
31
36
  private
32
37
 
33
- def load_config(service, environment)
38
+ def load_config(service, environment, defaults)
34
39
  config_file = environment == 'test' ? "config/#{service}_wrapper_test.yml" : ".#{service}_wrapper"
35
40
  return { config: config_file } if File.exist?(config_file)
36
- {}
41
+ defaults
37
42
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = "10.0.0.beta2".freeze
2
+ VERSION = "10.0.0.beta3".freeze
3
3
  end
@@ -7,7 +7,6 @@ module ActiveFedora::WithMetadata
7
7
  property :file_name, predicate: ::RDF::Vocab::EBUCore.filename
8
8
  property :file_size, predicate: ::RDF::Vocab::EBUCore.fileSize
9
9
  property :date_created, predicate: ::RDF::Vocab::EBUCore.dateCreated
10
- property :has_mime_type, predicate: ::RDF::Vocab::EBUCore.hasMimeType
11
10
  property :date_modified, predicate: ::RDF::Vocab::EBUCore.dateModified
12
11
  property :byte_order, predicate: SweetJPLTerms.byteOrder
13
12
  # This is a server-managed predicate which means Fedora does not let us change it.
@@ -4,6 +4,12 @@ module ActiveFedora
4
4
  include ActiveModel::Dirty
5
5
  attr_reader :file
6
6
 
7
+ # mime_type is treated differently than all the other metadata properties,
8
+ # in that it can be set at file-create time (as a HTTP post header) and be
9
+ # updated (using SPARQL update) on the metadata-node. Therefore, it is in
10
+ # this class rather than being in the DefaultSchema.
11
+ property :mime_type, predicate: ::RDF::Vocab::EBUCore.hasMimeType
12
+
7
13
  def initialize(file)
8
14
  @file = file
9
15
  super(file.uri, ldp_source.graph)
@@ -45,10 +51,15 @@ module ActiveFedora
45
51
 
46
52
  def changed_attributes
47
53
  super.tap do |changed|
48
- changed['type'] = true if type.present?
54
+ changed['type'] = true if type.present? && new_record?
49
55
  end
50
56
  end
51
57
 
58
+ # Conform to the ActiveFedora::Base API
59
+ def association(_)
60
+ []
61
+ end
62
+
52
63
  private
53
64
 
54
65
  def changes_for_update
@@ -122,7 +122,7 @@ describe ActiveFedora::File do
122
122
  end
123
123
 
124
124
  it "is not changed" do
125
- expect(test_object.attached_files[path]).to_not be_changed
125
+ expect(test_object.attached_files[path]).to_not be_content_changed
126
126
  end
127
127
 
128
128
  it "is able to read the content from fedora" do
@@ -56,4 +56,35 @@ describe ActiveFedora::Base do
56
56
  end
57
57
  end
58
58
  end
59
+
60
+ describe "with an autosave association, where some records are deleted" do
61
+ before do
62
+ class GenericFile < ActiveFedora::Base
63
+ has_many :permissions, predicate: ::RDF::Vocab::ACL.accessTo
64
+ accepts_nested_attributes_for :permissions, allow_destroy: true
65
+ property :title, predicate: ::RDF::DC.title
66
+
67
+ def to_solr
68
+ super.tap do |doc|
69
+ doc['permissions_ssim'] = permission_ids
70
+ end
71
+ end
72
+ end
73
+
74
+ class Permission < ActiveFedora::Base
75
+ belongs_to :generic_file, predicate: ::RDF::Vocab::ACL.accessTo
76
+ end
77
+ end
78
+
79
+ let(:p1) { Permission.create! }
80
+ let(:p2) { Permission.create! }
81
+ let(:gf) { GenericFile.create(permissions: [p1, p2]) }
82
+
83
+ before { gf.update(permissions_attributes: [{ id: p1.id, _destroy: 'true' }]) }
84
+
85
+ it "saves to solr correctly" do
86
+ result = ActiveFedora::SolrService.query("id:#{gf.id}").first['permissions_ssim']
87
+ expect(result).to eq [p2.id]
88
+ end
89
+ end
59
90
  end
@@ -21,24 +21,24 @@ describe ActiveFedora::OmDatastream do
21
21
  subject { obj.descMetadata }
22
22
 
23
23
  describe "#changed?" do
24
- it "does not be changed when no fields have been set" do
24
+ it "is not changed when no fields have been set" do
25
25
  expect(subject).to_not be_content_changed
26
26
  end
27
27
  it "is changed when a field has been set" do
28
28
  subject.title = 'Foobar'
29
29
  expect(subject).to be_content_changed
30
30
  end
31
- it "does not be changed if the new xml matches the old xml" do
31
+ it "is not changed if the new xml matches the old xml" do
32
32
  subject.content = subject.content
33
- expect(subject).to_not be_changed
33
+ expect(subject).to_not be_content_changed
34
34
  end
35
35
 
36
36
  it "is changed if there are minor differences in whitespace" do
37
37
  subject.content = "<a><b>1</b></a>"
38
38
  obj.save
39
- expect(subject).to_not be_changed
39
+ expect(subject).to_not be_content_changed
40
40
  subject.content = "<a>\n<b>1</b>\n</a>"
41
- expect(subject).to be_changed
41
+ expect(subject).to be_content_changed
42
42
  end
43
43
  end
44
44
 
@@ -56,11 +56,11 @@ describe ActiveFedora::OmDatastream do
56
56
  obj.reload
57
57
  end
58
58
 
59
- it "does not be dirty after .update_values is saved" do
59
+ it "is not dirty after .update_values is saved" do
60
60
  obj.descMetadata.update_values([{ name: 0 }, { role: 0 }, :text] => "Funder")
61
- expect(obj.descMetadata).to be_changed
61
+ expect(obj.descMetadata).to be_content_changed
62
62
  obj.save
63
- expect(obj.descMetadata).to_not be_changed
63
+ expect(obj.descMetadata).to_not be_content_changed
64
64
  expect(obj.descMetadata.term_values({ name: 0 }, { role: 0 }, :text)).to eq ["Funder"]
65
65
  end
66
66
  end
@@ -43,7 +43,7 @@ describe ActiveFedora::WithMetadata do
43
43
  it { is_expected.to respond_to(:file_name) }
44
44
  it { is_expected.to respond_to(:file_size) }
45
45
  it { is_expected.to respond_to(:date_created) }
46
- it { is_expected.to respond_to(:has_mime_type) }
46
+ it { is_expected.to respond_to(:mime_type) }
47
47
  it { is_expected.to respond_to(:date_modified) }
48
48
  it { is_expected.to respond_to(:byte_order) }
49
49
  it { is_expected.to respond_to(:file_hash) }
@@ -179,6 +179,25 @@ describe ActiveFedora::File do
179
179
  end
180
180
  end
181
181
 
182
+ describe "#mime_type" do
183
+ let(:parent) { ActiveFedora::Base.create }
184
+ before do
185
+ parent.add_file('banana', path: 'apple', mime_type: 'video/webm')
186
+ parent.save!
187
+ end
188
+ it "persists" do
189
+ expect(parent.reload.apple.mime_type).to eq "video/webm"
190
+ end
191
+ it "can be updated" do
192
+ parent.reload
193
+ parent.apple.mime_type = "text/awesome"
194
+ expect(parent.apple.mime_type).to eq "text/awesome"
195
+ parent.save
196
+
197
+ expect(parent.reload.apple.mime_type).to eq "text/awesome"
198
+ end
199
+ end
200
+
182
201
  context "original_name" do
183
202
  subject { file.original_name }
184
203
 
@@ -93,4 +93,24 @@ describe ActiveFedora::Associations::HasManyAssociation do
93
93
  it { is_expected.to be_kind_of ActiveFedora::NullRelation }
94
94
  end
95
95
  end
96
+
97
+ describe "#ids_reader" do
98
+ let(:owner) { double('owner') }
99
+ let(:reflection) { double('reflection', check_validity!: true) }
100
+ let(:association) { described_class.new(owner, reflection) }
101
+
102
+ let(:r1) { ActiveFedora::Base.new(id: 'r1-id', &:mark_for_destruction) }
103
+ let(:r2) { ActiveFedora::Base.new(id: 'r2-id') }
104
+
105
+ context "when some records are marked_for_destruction" do
106
+ before do
107
+ allow(association).to receive(:loaded?).and_return(true)
108
+ allow(association).to receive(:load_target).and_return([r1, r2])
109
+ end
110
+
111
+ it "only returns the records not marked for destruction" do
112
+ expect(association.ids_reader).to eq ['r2-id']
113
+ end
114
+ end
115
+ end
96
116
  end
@@ -12,7 +12,16 @@ describe ActiveFedora::WithMetadata::DefaultMetadataClassFactory do
12
12
  describe "::build" do
13
13
  it "sets MetadataNode to the default schema using the default strategy" do
14
14
  expect(parent).to receive(:const_set)
15
- expect(parent).to receive(:delegate).at_least(8).times
15
+ expect(parent).to receive(:delegate).with(:label, :label=, :label_changed?, to: :metadata_node)
16
+ expect(parent).to receive(:delegate).with(:file_name, :file_name=, :file_name_changed?, to: :metadata_node)
17
+ expect(parent).to receive(:delegate).with(:file_size, :file_size=, :file_size_changed?, to: :metadata_node)
18
+ expect(parent).to receive(:delegate).with(:date_created, :date_created=, :date_created_changed?, to: :metadata_node)
19
+ expect(parent).to receive(:delegate).with(:date_modified,
20
+ :date_modified=,
21
+ :date_modified_changed?,
22
+ to: :metadata_node)
23
+ expect(parent).to receive(:delegate).with(:byte_order, :byte_order=, :byte_order_changed?, to: :metadata_node)
24
+ expect(parent).to receive(:delegate).with(:file_hash, :file_hash=, :file_hash_changed?, to: :metadata_node)
16
25
  subject.class.build(parent)
17
26
  end
18
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active-fedora
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.0.0.beta2
4
+ version: 10.0.0.beta3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Zumwalt
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-05-12 00:00:00.000000000 Z
13
+ date: 2016-05-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rsolr