hydra-pcdm 0.5.0 → 0.6.0

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: 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