hydra-pcdm 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4f5cafbc7a34aee391cc86e7df1d8e0d8a1ff6b6
4
- data.tar.gz: fb1e8456ae3c899a1b48fb79bf6d787becc0e571
3
+ metadata.gz: 1f1369bfcb692088efb9def0d8c89c0a1a44b753
4
+ data.tar.gz: 67ab9ffbc703f41d52cacd272adf6800e624e2f6
5
5
  SHA512:
6
- metadata.gz: e1c4e5cae84a32c3464f3922fe2de541491b6508b43eaed9b83b08f9ef0adcda912ff3c29040e9d09f1c09dd155cbf3cdeb4191e70d99df204a4e8e7d3521e0b
7
- data.tar.gz: 72aa2a31ba96aef2dcabd1237d7558a18e1b8ffadae7cfe8f266ac56235d0eedc9ff531539d3cd47c12c7629ec5c75e4bc7c4777267eb3b18b96ac660ae54e35
6
+ metadata.gz: 61992b4c2732a5f06985514380caf52787e8ebdeeeebb9bc9d1bfabc3771649b34fc0d945ea97f13f129e3a4564f6a970589cce9c161fa19f4966fe90f8a0646
7
+ data.tar.gz: fab13605bffea616cbe355a4f4619769dfd8a7d8abeff9c26b380bea74b3f6ed968d6cf328fcfd67177dc1ab7b2955b6b1ca396d81c3248b0463053866b4b093
data/Gemfile CHANGED
@@ -1,7 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  group :development, :test do
4
- gem 'haml-lint', require: false
5
4
  gem 'rubocop', '~> 0.37.0', require: false
6
5
  gem 'rubocop-rspec', '~> 1.3.1', require: false
7
6
  gem 'pry' unless ENV['CI']
data/hydra-pcdm.gemspec CHANGED
@@ -19,8 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_dependency 'active-fedora', '~> 9.6'
23
- spec.add_dependency 'activefedora-aggregation', '~> 0.10'
22
+ spec.add_dependency 'active-fedora', '~> 9.11'
24
23
  spec.add_dependency 'mime-types', '>= 1'
25
24
 
26
25
  spec.add_development_dependency 'bundler', '~> 1.6'
data/lib/hydra/pcdm.rb CHANGED
@@ -14,6 +14,8 @@ module Hydra
14
14
  end
15
15
  end
16
16
 
17
+ autoload :Config
18
+
17
19
  # models
18
20
  autoload_under 'models' do
19
21
  autoload :Collection
@@ -35,9 +37,6 @@ module Hydra
35
37
  autoload :AddTypeToFile, 'hydra/pcdm/services/file/add_type'
36
38
  autoload :GetMimeTypeForFile, 'hydra/pcdm/services/file/get_mime_type'
37
39
 
38
- # Iterators
39
- autoload :DeepMemberIterator, 'hydra/pcdm/deep_member_iterator'
40
-
41
40
  # Associations
42
41
  autoload :AncestorChecker, 'hydra/pcdm/ancestor_checker'
43
42
  autoload :Validators, 'hydra/pcdm/validators'
@@ -1,18 +1,19 @@
1
1
  module Hydra::PCDM
2
2
  ##
3
3
  # Checks whether or not one object is an ancestor of another.
4
- class AncestorChecker
5
- attr_reader :record
6
-
7
- # @param [ActiveFedora::Base] record The object which may have ancestors.
8
- def initialize(record)
9
- @record = record
4
+ module AncestorChecker
5
+ # @param options [Hash]
6
+ # @option record [#pcdm_behavior?]
7
+ # @option potential_ancestor [#pcdm_behavior?]
8
+ # @return Boolean
9
+ def self.former_is_ancestor_of_latter?(potential_ancestor, record)
10
+ return true if record == potential_ancestor
11
+ return false unless potential_ancestor.respond_to?(:members)
12
+ return true if Array.wrap(potential_ancestor.members).detect { |member| former_is_ancestor_of_latter?(member, record) }
13
+ false
10
14
  end
11
-
12
- # @param [#members] potential_ancestor Object which may be the ancestor of
13
- # the initialized record.
14
- def ancestor?(potential_ancestor)
15
- record == potential_ancestor || Hydra::PCDM::DeepMemberIterator.new(potential_ancestor).include?(record)
15
+ class << self
16
+ alias call former_is_ancestor_of_latter?
16
17
  end
17
18
  end
18
19
  end
@@ -2,10 +2,10 @@ module Hydra::PCDM
2
2
  class CollectionIndexer < ObjectIndexer
3
3
  def generate_solr_document
4
4
  super.tap do |solr_doc|
5
- solr_doc['member_ids_ssim'] ||= []
6
- solr_doc['member_ids_ssim'] += object.member_ids
7
- solr_doc['member_ids_ssim'].uniq!
8
- solr_doc['collection_ids_ssim'] = object.ordered_collection_ids
5
+ solr_doc[Config.indexing_member_ids_key] ||= []
6
+ solr_doc[Config.indexing_member_ids_key] += object.member_ids
7
+ solr_doc[Config.indexing_member_ids_key].uniq!
8
+ solr_doc[Config.indexing_collection_ids_key] = object.ordered_collection_ids
9
9
  end
10
10
  end
11
11
  end
@@ -0,0 +1,21 @@
1
+ module Hydra
2
+ module PCDM
3
+ # A container for configuration options (note configuration is not yet determined).
4
+ module Config
5
+ INDEXING_MEMBER_IDS_KEY = 'member_ids_ssim'.freeze
6
+ def self.indexing_member_ids_key
7
+ INDEXING_MEMBER_IDS_KEY
8
+ end
9
+
10
+ INDEXING_COLLECTION_IDS_KEY = 'collection_ids_ssim'.freeze
11
+ def self.indexing_collection_ids_key
12
+ INDEXING_COLLECTION_IDS_KEY
13
+ end
14
+
15
+ INDEXING_OBJECT_IDS_KEY = 'object_ids_ssim'.freeze
16
+ def self.indexing_object_ids_key
17
+ INDEXING_OBJECT_IDS_KEY
18
+ end
19
+ end
20
+ end
21
+ end
@@ -24,6 +24,7 @@ module Hydra::PCDM
24
24
  end
25
25
 
26
26
  def type_validator
27
+ Validators::PCDMCollectionValidator
27
28
  end
28
29
  end
29
30
 
@@ -25,7 +25,7 @@ module Hydra::PCDM
25
25
  end
26
26
 
27
27
  def type_validator
28
- @type_validator ||= Validators::PCDMObjectValidator
28
+ Validators::PCDMObjectValidator
29
29
  end
30
30
  end
31
31
 
@@ -25,7 +25,7 @@ module Hydra::PCDM
25
25
 
26
26
  def member_of
27
27
  return [] if id.nil?
28
- ActiveFedora::Base.where(member_ids_ssim: id)
28
+ ActiveFedora::Base.where(Config.indexing_member_ids_key => id)
29
29
  end
30
30
 
31
31
  def ordered_member_ids
@@ -37,7 +37,7 @@ module Hydra::PCDM
37
37
  end
38
38
 
39
39
  def object_ids
40
- members.select(&:pcdm_object?).map(&:id)
40
+ objects.map(&:id)
41
41
  end
42
42
 
43
43
  def ordered_objects
@@ -56,12 +56,8 @@ module Hydra::PCDM
56
56
  in_collections.map(&:id)
57
57
  end
58
58
 
59
- def ancestor?(record)
60
- ancestor_checker.ancestor?(record)
61
- end
62
-
63
- def ancestor_checker
64
- @ancestor_checker ||= ::Hydra::PCDM::AncestorChecker.new(self)
59
+ def ancestor?(potential_ancestor)
60
+ ::Hydra::PCDM::AncestorChecker.former_is_ancestor_of_latter?(potential_ancestor, self)
65
61
  end
66
62
  end
67
63
  end
@@ -2,10 +2,10 @@ module Hydra::PCDM
2
2
  class ObjectIndexer < ActiveFedora::IndexingService
3
3
  def generate_solr_document
4
4
  super.tap do |solr_doc|
5
- solr_doc['member_ids_ssim'] ||= []
6
- solr_doc['member_ids_ssim'] += object.member_ids
7
- solr_doc['member_ids_ssim'].uniq!
8
- solr_doc['object_ids_ssim'] = object.ordered_object_ids
5
+ solr_doc[Config.indexing_member_ids_key] ||= []
6
+ solr_doc[Config.indexing_member_ids_key] += object.member_ids
7
+ solr_doc[Config.indexing_member_ids_key].uniq!
8
+ solr_doc[Config.indexing_object_ids_key] = object.ordered_object_ids
9
9
  end
10
10
  end
11
11
  end
@@ -1,5 +1,5 @@
1
1
  module Hydra::PCDM
2
- class AddTypeToFile
2
+ module AddTypeToFile
3
3
  # This adds an additional RDF type to an exsiting Hydra::PCDM::File
4
4
  #
5
5
  # @param [Hydra::PCDM::File] the file object you want to add it to
@@ -1,5 +1,5 @@
1
1
  module Hydra::PCDM
2
- class GetMimeTypeForFile
2
+ module GetMimeTypeForFile
3
3
  def self.call(path)
4
4
  raise ArgumentError, 'supplied argument should be a path to a file' unless path.is_a?(String)
5
5
  mime_types = ::MIME::Types.of(::File.basename(path))
@@ -3,6 +3,7 @@ module Hydra::PCDM
3
3
  autoload :AncestorValidator, 'hydra/pcdm/validators/ancestor_validator'
4
4
  autoload :PCDMValidator, 'hydra/pcdm/validators/pcdm_validator'
5
5
  autoload :CompositeValidator, 'hydra/pcdm/validators/composite_validator'
6
+ autoload :PCDMCollectionValidator, 'hydra/pcdm/validators/pcdm_collection_validator'
6
7
  autoload :PCDMObjectValidator, 'hydra/pcdm/validators/pcdm_object_validator'
7
8
  end
8
9
  end
@@ -0,0 +1,7 @@
1
+ module Hydra::PCDM::Validators
2
+ class PCDMCollectionValidator
3
+ def self.validate!(_association, _record)
4
+ true
5
+ end
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  module Hydra
2
2
  module PCDM
3
- VERSION = '0.5.0'.freeze
3
+ VERSION = '0.6.0'.freeze
4
4
  end
5
5
  end
@@ -103,7 +103,7 @@
103
103
  http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
104
104
  -->
105
105
  <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
106
- geo="true" distErrPct="0.025" maxDistErr="0.000009" units="degrees" />
106
+ geo="true" distErrPct="0.025" maxDistErr="0.000009" distanceUnits="degrees" />
107
107
 
108
108
  <fieldType name="text" class="solr.TextField" omitNorms="false">
109
109
  <analyzer>
@@ -1,29 +1,36 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe Hydra::PCDM::AncestorChecker do
4
- subject { described_class.new(record) }
5
-
6
- describe '#ancestor?' do
4
+ context '.former_is_ancestor_of_latter?' do
5
+ subject { described_class.former_is_ancestor_of_latter?(potential_ancestor, record) }
7
6
  let(:record) { instance_double(Hydra::PCDM::Object) }
8
- let(:member) { record }
9
- let(:result) { subject.ancestor?(member) }
7
+ let(:potential_ancestor) { nil }
8
+
9
+ context 'when the potential_ancestor is the record itself' do
10
+ let(:potential_ancestor) { record }
11
+ it { is_expected.to eq(true) }
12
+ end
10
13
 
11
- context 'when the member is the record itself' do
12
- it 'is true' do
13
- expect(result).to eq true
14
- end
14
+ context 'when the potential_ancestor has no members' do
15
+ let(:potential_ancestor) { instance_double(Hydra::PCDM::Object, members: []) }
16
+ it { is_expected.to eq(false) }
15
17
  end
16
- context 'when the member is not an ancestor' do
17
- let(:member) { instance_double(Hydra::PCDM::Object, members: []) }
18
- it 'is false' do
19
- expect(result).to eq false
20
- end
18
+
19
+ context 'when the potential_ancestor includes the given record' do
20
+ let(:potential_ancestor) { instance_double(Hydra::PCDM::Object, members: [record]) }
21
+ it { is_expected.to eq(true) }
21
22
  end
22
- context 'when the member is an ancestor' do
23
- let(:member) { instance_double(Hydra::PCDM::Object, members: [record]) }
24
- it 'is true' do
25
- expect(result).to eq true
26
- end
23
+
24
+ context 'when the potential_ancestor includes a descendant that includes the given record' do
25
+ let(:descendant) { instance_double(Hydra::PCDM::Object, members: [record]) }
26
+ let(:potential_ancestor) { instance_double(Hydra::PCDM::Object, members: [descendant]) }
27
+ it { is_expected.to eq(true) }
28
+ end
29
+
30
+ context 'when the potential_ancestor only includes descendants that do not include the given record' do
31
+ let(:descendant) { instance_double(Hydra::PCDM::Object, members: [:another]) }
32
+ let(:potential_ancestor) { instance_double(Hydra::PCDM::Object, members: [descendant]) }
33
+ it { is_expected.to eq(false) }
27
34
  end
28
35
  end
29
36
  end
@@ -17,9 +17,9 @@ describe Hydra::PCDM::CollectionIndexer do
17
17
  subject { indexer.generate_solr_document }
18
18
 
19
19
  it 'has fields' do
20
- expect(subject['collection_ids_ssim']).to eq %w(123 456)
21
- expect(subject['object_ids_ssim']).to eq ['789']
22
- expect(subject['member_ids_ssim']).to eq %w(123 456 789)
20
+ expect(subject[Hydra::PCDM::Config.indexing_collection_ids_key]).to eq %w(123 456)
21
+ expect(subject[Hydra::PCDM::Config.indexing_object_ids_key]).to eq ['789']
22
+ expect(subject[Hydra::PCDM::Config.indexing_member_ids_key]).to eq %w(123 456 789)
23
23
  end
24
24
  end
25
25
  end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::PCDM::Config do
4
+ context '.indexing_member_ids_key' do
5
+ subject { described_class.indexing_member_ids_key }
6
+ it { is_expected.to eq(described_class::INDEXING_MEMBER_IDS_KEY) }
7
+ end
8
+
9
+ context '.indexing_collection_ids_key' do
10
+ subject { described_class.indexing_collection_ids_key }
11
+ it { is_expected.to eq(described_class::INDEXING_COLLECTION_IDS_KEY) }
12
+ end
13
+
14
+ context '.indexing_object_ids_key' do
15
+ subject { described_class.indexing_object_ids_key }
16
+ it { is_expected.to eq(described_class::INDEXING_OBJECT_IDS_KEY) }
17
+ end
18
+ end
@@ -14,7 +14,7 @@ describe Hydra::PCDM::ObjectIndexer do
14
14
  subject { indexer.generate_solr_document }
15
15
 
16
16
  it 'has fields' do
17
- expect(subject['object_ids_ssim']).to eq %w(123 456)
17
+ expect(subject[Hydra::PCDM::Config.indexing_object_ids_key]).to eq %w(123 456)
18
18
  end
19
19
  end
20
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hydra-pcdm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - E. Lynette Rayle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-25 00:00:00.000000000 Z
11
+ date: 2016-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active-fedora
@@ -16,28 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '9.6'
19
+ version: '9.11'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '9.6'
27
- - !ruby/object:Gem::Dependency
28
- name: activefedora-aggregation
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '0.10'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '0.10'
26
+ version: '9.11'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: mime-types
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -157,7 +143,7 @@ files:
157
143
  - lib/hydra/pcdm.rb
158
144
  - lib/hydra/pcdm/ancestor_checker.rb
159
145
  - lib/hydra/pcdm/collection_indexer.rb
160
- - lib/hydra/pcdm/deep_member_iterator.rb
146
+ - lib/hydra/pcdm/config.rb
161
147
  - lib/hydra/pcdm/models/collection.rb
162
148
  - lib/hydra/pcdm/models/concerns/collection_behavior.rb
163
149
  - lib/hydra/pcdm/models/concerns/object_behavior.rb
@@ -170,6 +156,7 @@ files:
170
156
  - lib/hydra/pcdm/validators.rb
171
157
  - lib/hydra/pcdm/validators/ancestor_validator.rb
172
158
  - lib/hydra/pcdm/validators/composite_validator.rb
159
+ - lib/hydra/pcdm/validators/pcdm_collection_validator.rb
173
160
  - lib/hydra/pcdm/validators/pcdm_object_validator.rb
174
161
  - lib/hydra/pcdm/validators/pcdm_validator.rb
175
162
  - lib/hydra/pcdm/version.rb
@@ -193,7 +180,7 @@ files:
193
180
  - solr/config/xslt/luke.xsl
194
181
  - spec/hydra/pcdm/ancestor_checker_spec.rb
195
182
  - spec/hydra/pcdm/collection_indexer_spec.rb
196
- - spec/hydra/pcdm/deep_member_iterator_spec.rb
183
+ - spec/hydra/pcdm/config_spec.rb
197
184
  - spec/hydra/pcdm/models/collection_spec.rb
198
185
  - spec/hydra/pcdm/models/file_spec.rb
199
186
  - spec/hydra/pcdm/models/object_spec.rb
@@ -228,7 +215,7 @@ summary: Portland Common Data Model (PCDM)
228
215
  test_files:
229
216
  - spec/hydra/pcdm/ancestor_checker_spec.rb
230
217
  - spec/hydra/pcdm/collection_indexer_spec.rb
231
- - spec/hydra/pcdm/deep_member_iterator_spec.rb
218
+ - spec/hydra/pcdm/config_spec.rb
232
219
  - spec/hydra/pcdm/models/collection_spec.rb
233
220
  - spec/hydra/pcdm/models/file_spec.rb
234
221
  - spec/hydra/pcdm/models/object_spec.rb
@@ -1,31 +0,0 @@
1
- module Hydra::PCDM
2
- ##
3
- # Iterates over a record's members and all of their members in a breadth-first
4
- # search.
5
- class DeepMemberIterator
6
- include Enumerable
7
- attr_reader :record
8
- # @param [#members] record The object whose members are iterated across.
9
- def initialize(record)
10
- @record = HasMembers.new(record)
11
- end
12
-
13
- def each
14
- record.members.each do |member|
15
- yield member
16
- end
17
- record.members.each do |member|
18
- DeepMemberIterator.new(member).each do |deep_member|
19
- yield deep_member
20
- end
21
- end
22
- end
23
- end
24
- ##
25
- # Small decorator to ensure that #members isn't undefined.
26
- class HasMembers < SimpleDelegator
27
- def members
28
- __getobj__.try(:members) || []
29
- end
30
- end
31
- end
@@ -1,52 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe Hydra::PCDM::DeepMemberIterator do
4
- subject { described_class.new(record) }
5
- let(:record) { instance_double(Hydra::PCDM::Object, members: members) }
6
- let(:members) { [] }
7
- describe '#each' do
8
- context 'with no members' do
9
- it 'returns an empty array' do
10
- expect(subject.to_a).to eq []
11
- end
12
- end
13
- context 'with a member' do
14
- let(:members) { [instance_double(Hydra::PCDM::Object, members: [])] }
15
- it 'returns that member' do
16
- expect(subject.to_a).to eq members
17
- end
18
- end
19
- context 'with deep members' do
20
- let(:member_1) { instance_double(Hydra::PCDM::Object, members: [member_3]) }
21
- let(:member_2) { instance_double(Hydra::PCDM::Object, members: [member_4]) }
22
- let(:member_3) { instance_double(Hydra::PCDM::Object, members: []) }
23
- let(:member_4) { instance_double(Hydra::PCDM::Object, members: []) }
24
- let(:members) { [member_1, member_2] }
25
- it 'does a breadth first iteration of members' do
26
- expect(subject.to_a).to eq [member_1, member_2, member_3, member_4]
27
- end
28
- end
29
- context 'with n levels deep' do
30
- let(:member_1) { instance_double(Hydra::PCDM::Object, members: [member_2]) }
31
- let(:member_2) { instance_double(Hydra::PCDM::Object, members: [member_3]) }
32
- let(:member_3) { instance_double(Hydra::PCDM::Object, members: []) }
33
- let(:members) { [member_1] }
34
- it 'traverses it' do
35
- expect(subject.to_a).to eq [member_1, member_2, member_3]
36
- end
37
- end
38
- end
39
- describe '.include?' do
40
- context 'with n levels deep' do
41
- let(:member_1) { instance_double(Hydra::PCDM::Object, members: [member_2]) }
42
- let(:member_2) { instance_double(Hydra::PCDM::Object, members: [member_3]) }
43
- let(:member_3) { instance_double(Hydra::PCDM::Object, members: []) }
44
- let(:members) { [member_1] }
45
- it 'does not go any deeper than necessary' do
46
- expect(subject).to include(member_2)
47
- expect(member_2).not_to have_received(:members)
48
- expect(member_3).not_to have_received(:members)
49
- end
50
- end
51
- end
52
- end