ddr-models 2.3.2 → 2.4.0.rc1

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -3
  3. data/ddr-models.gemspec +1 -1
  4. data/lib/ddr/auth.rb +10 -6
  5. data/lib/ddr/auth/group.rb +2 -1
  6. data/lib/ddr/auth/grouper_gateway.rb +7 -6
  7. data/lib/ddr/auth/permissions.rb +2 -1
  8. data/lib/ddr/auth/roles.rb +3 -2
  9. data/lib/ddr/auth/roles/role_set.rb +3 -2
  10. data/lib/ddr/datastreams/administrative_metadata_datastream.rb +3 -0
  11. data/lib/ddr/derivatives/png_generator.rb +1 -1
  12. data/lib/ddr/index/fields.rb +11 -1
  13. data/lib/ddr/index/filter.rb +4 -3
  14. data/lib/ddr/index/legacy_license_fields.rb +0 -2
  15. data/lib/ddr/index/query_clause.rb +2 -2
  16. data/lib/ddr/index/query_value.rb +6 -3
  17. data/lib/ddr/jobs.rb +5 -1
  18. data/lib/ddr/jobs/fits_file_characterization.rb +2 -40
  19. data/lib/ddr/jobs/fixity_check.rb +13 -0
  20. data/lib/ddr/jobs/job.rb +36 -0
  21. data/lib/ddr/jobs/queue.rb +27 -0
  22. data/lib/ddr/jobs/update_index.rb +13 -0
  23. data/lib/ddr/managers/derivatives_manager.rb +21 -17
  24. data/lib/ddr/models.rb +14 -2
  25. data/lib/ddr/models/access_controllable.rb +3 -6
  26. data/lib/ddr/models/admin_set.rb +5 -3
  27. data/lib/ddr/models/base.rb +2 -3
  28. data/lib/ddr/models/contact.rb +17 -0
  29. data/lib/ddr/models/file_characterization.rb +37 -0
  30. data/lib/ddr/models/has_admin_metadata.rb +2 -1
  31. data/lib/ddr/models/has_content.rb +4 -2
  32. data/lib/ddr/models/indexing.rb +5 -0
  33. data/lib/ddr/models/licenses/license.rb +5 -3
  34. data/lib/ddr/models/solr_document.rb +1 -1
  35. data/lib/ddr/models/version.rb +1 -1
  36. data/lib/ddr/models/with_content_file.rb +37 -0
  37. data/lib/ddr/vocab/asset.rb +3 -0
  38. data/spec/derivatives/png_generator_spec.rb +7 -0
  39. data/spec/factories/test_model_factories.rb +1 -1
  40. data/spec/fixtures/arrow1rightred_e0.gif +0 -0
  41. data/spec/fixtures/bird.jpg +0 -0
  42. data/spec/index/query_value_spec.rb +33 -0
  43. data/spec/jobs/fits_file_characterization_spec.rb +8 -44
  44. data/spec/jobs/fixity_check_spec.rb +22 -0
  45. data/spec/jobs/job_spec.rb +40 -0
  46. data/spec/jobs/update_index_spec.rb +22 -0
  47. data/spec/managers/derivatives_manager_spec.rb +16 -12
  48. data/spec/models/admin_set_spec.rb +3 -3
  49. data/spec/models/contact_spec.rb +22 -0
  50. data/spec/models/effective_license_spec.rb +17 -7
  51. data/spec/models/file_characterization_spec.rb +39 -0
  52. data/spec/models/has_admin_metadata_spec.rb +8 -5
  53. data/spec/models/indexing_spec.rb +2 -0
  54. data/spec/models/license_spec.rb +3 -1
  55. data/spec/models/solr_document_spec.rb +6 -3
  56. data/spec/models/with_content_file_spec.rb +37 -0
  57. data/spec/spec_helper.rb +2 -0
  58. metadata +43 -30
  59. data/lib/ddr/contacts.rb +0 -25
  60. data/lib/ddr/index_fields.rb +0 -14
  61. data/spec/auth/ldap_gateway_spec.rb +0 -9
  62. data/spec/contacts/contacts_spec.rb +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c40588942cc626434d5d5bc410f991abfa7812ef
4
- data.tar.gz: 4d3493e03aabe5491942e1b25d0736e5716c8a3a
3
+ metadata.gz: b1f085bb5aae0c19afb4bb644fd674800bce2a9e
4
+ data.tar.gz: 11d41a2e56d71b9087d5cc8d7154f52c86a2f28c
5
5
  SHA512:
6
- metadata.gz: c1a5295caad330a619c2c6098f02a8b1d97bceba0381dae6d0c9302529b3b12cac4429f896a4c38f06fdc5b75b69a173f59c4246b432f6f035059ef755c4240a
7
- data.tar.gz: adcd58ffd35e5718ecc65aa5125c90c7930ee2b5b6061125db15c5fc41f5315f97a8e3b88a9f25369c850a3734d5357f47df954a3794ec8e94d66a737b78d37c
6
+ metadata.gz: 50dd901a973431067800bbbbc33f1f4b9fb2fd8f1a53eb6797132197b410bccefdf9a6f5d6d5717d6c03441e0bded2e4e0ce59e5394e929f1b26d2809194c0bc
7
+ data.tar.gz: 587d288987202fd4c8f9375bdd4d37e1bcc044ac11573a76d7b84730618ee2cbd234f0c4cb7e8e845ec8b69711c468ac824f5640de47822981aaa0ffaa353dac
@@ -7,6 +7,5 @@ script: "bundle exec rake ci"
7
7
  cache:
8
8
  - bundler
9
9
  - apt
10
- notifications:
11
- email:
12
- - lib-drs@duke.edu
10
+ env:
11
+ - DDR_AUX_API_URL=http://localhost:3000/api
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib", "app/models"]
20
20
 
21
21
  s.add_dependency "rails", "~> 4.1.6"
22
+ s.add_dependency "activeresource"
22
23
  s.add_dependency "active-fedora", "~> 7.0"
23
24
  s.add_dependency "hydra-core", "~> 7.2"
24
25
  s.add_dependency "hydra-validations", "~> 0.5"
@@ -30,7 +31,6 @@ Gem::Specification.new do |s|
30
31
  s.add_dependency "rdf-vocab", "~> 0.8"
31
32
  s.add_dependency "net-ldap", "~> 0.11"
32
33
  s.add_dependency "cancancan", "~> 1.12"
33
- s.add_dependency "ddr-aux-client", "~> 1.2", ">= 1.2.2"
34
34
  s.add_dependency "ddr-antivirus", "~> 2.1.1"
35
35
 
36
36
  s.add_development_dependency "bundler", "~> 1.7"
@@ -1,6 +1,7 @@
1
1
  module Ddr
2
2
  module Auth
3
3
  extend ActiveSupport::Autoload
4
+ extend Deprecation
4
5
 
5
6
  autoload :Ability
6
7
  autoload :AbilityDefinitions
@@ -58,22 +59,25 @@ module Ddr
58
59
 
59
60
  # Group of which everyone (including anonymous users) is a member
60
61
  def self.everyone_group
61
- warn "[DEPRECATION] `Ddr::Auth.everyone_group` is deprecated." \
62
- " Use `Ddr::Auth::Groups::PUBLIC` instead."
62
+ Deprecation.warn(Ddr::Auth,
63
+ "`Ddr::Auth.everyone_group` is deprecated and will be removed in ddr-models 3.0." \
64
+ " Use `Ddr::Auth::Groups::PUBLIC` instead.")
63
65
  Groups::PUBLIC
64
66
  end
65
67
 
66
68
  # Group of authenticated users
67
69
  def self.authenticated_users_group
68
- warn "[DEPRECATION] `Ddr::Auth.authenticated_users_group` is deprecated." \
69
- " Use `Ddr::Auth::Groups::REGISTERED` instead."
70
+ Deprecation.warn(Ddr::Auth,
71
+ "`Ddr::Auth.authenticated_users_group` is deprecated and will be removed in ddr-models 3.0." \
72
+ " Use `Ddr::Auth::Groups::REGISTERED` instead.")
70
73
  Groups::REGISTERED
71
74
  end
72
75
 
73
76
  def self.const_missing(name)
74
77
  if name == :Superuser
75
- warn "[DEPRECATION] `Ddr::Auth::Superuser` is deprecated." \
76
- " Use `Ddr::Auth::SuperuserAbility` instead."
78
+ Deprecation.warn(Ddr::Auth,
79
+ "`Ddr::Auth::Superuser` is deprecated and will be removed in ddr-models 3.0." \
80
+ " Use `Ddr::Auth::SuperuserAbility` instead.")
77
81
  return SuperuserAbility
78
82
  end
79
83
  super
@@ -4,6 +4,7 @@ module Ddr
4
4
  module Auth
5
5
  # Wraps a String
6
6
  class Group < SimpleDelegator
7
+ extend Deprecation
7
8
 
8
9
  attr_reader :rule
9
10
 
@@ -32,7 +33,7 @@ module Ddr
32
33
  end
33
34
 
34
35
  def to_agent
35
- warn "[DEPRECATION] `#{self.class.name}#to_agent` is deprecated. Use `#{self.class.name}#agent instead."
36
+ Deprecation.warn(self.class, "`to_agent` is deprecated. Use `agent` instead.")
36
37
  agent
37
38
  end
38
39
 
@@ -4,14 +4,15 @@ require "delegate"
4
4
  module Ddr
5
5
  module Auth
6
6
  class GrouperGateway < SimpleDelegator
7
+ extend Deprecation
7
8
 
8
9
  SUBJECT_ID_RE = Regexp.new('[^@]+(?=@duke\.edu)')
9
10
  DEFAULT_TIMEOUT = 5
10
11
 
11
12
  def self.const_missing(name)
12
13
  if name == :REPOSITORY_GROUP_FILTER
13
- warn "[DEPRECATION] The constant `#{name}` is deprecated and will be removed in ddr-models 3.0." \
14
- " Use `Ddr::Auth.repository_group_filter` instead."
14
+ Deprecation.warn(self, "The constant `#{name}` is deprecated and will be removed in ddr-models 3.0." \
15
+ " Use `Ddr::Auth.repository_group_filter` instead.")
15
16
  return Ddr::Auth.repository_group_filter
16
17
  end
17
18
  super
@@ -47,8 +48,8 @@ module Ddr
47
48
 
48
49
  # @deprecated Use {#repository_groups} instead.
49
50
  def repository_group_names
50
- warn "[DEPRECATION] `Ddr::Auth::GrouperGateway#repository_group_names` is deprecated." \
51
- " Use `#repository_groups` instead."
51
+ Deprecation.warn(self.class, "`Ddr::Auth::GrouperGateway#repository_group_names` is deprecated." \
52
+ " Use `#repository_groups` instead.")
52
53
  repository_groups
53
54
  end
54
55
 
@@ -83,8 +84,8 @@ module Ddr
83
84
 
84
85
  # @deprecated Use {#user_groups} instead.
85
86
  def user_group_names(user)
86
- warn "[DEPRECATION] `Ddr::Auth::GrouperGateway#user_group_names` is deprecated." \
87
- " Use `#user_groups` instead."
87
+ Deprecation.warn(self.class, "`Ddr::Auth::GrouperGateway#user_group_names` is deprecated." \
88
+ " Use `#user_groups` instead.")
88
89
  user_groups(user)
89
90
  end
90
91
 
@@ -1,5 +1,6 @@
1
1
  module Ddr::Auth
2
2
  class Permissions
3
+ extend Deprecation
3
4
 
4
5
  READ = :read
5
6
  DOWNLOAD = :download
@@ -14,7 +15,7 @@ module Ddr::Auth
14
15
 
15
16
  def self.const_missing(name)
16
17
  if name == :EDIT
17
- warn "[DEPRECATION] `EDIT` is deprecated. Use `UPDATE` instead."
18
+ Deprecation.warn(self, "`EDIT` is deprecated. Use `UPDATE` instead.")
18
19
  return UPDATE
19
20
  end
20
21
  super
@@ -1,6 +1,7 @@
1
1
  module Ddr::Auth
2
2
  module Roles
3
3
  extend ActiveSupport::Autoload
4
+ extend Deprecation
4
5
 
5
6
  autoload :DetachedRoleSet
6
7
  autoload :PropertyRoleSet
@@ -20,8 +21,8 @@ module Ddr::Auth
20
21
 
21
22
  def const_missing(name)
22
23
  if name == :ArrayRoleSet
23
- warn "[DEPRECATION] `Ddr::Auth::Roles::ArrayRoleSet` is deprecated." \
24
- " Use `Ddr::Auth::Roles::DetachedRoleSet` instead."
24
+ Deprecation.warn(Ddr::Auth::Roles, "`Ddr::Auth::Roles::ArrayRoleSet` is deprecated." \
25
+ " Use `Ddr::Auth::Roles::DetachedRoleSet` instead.")
25
26
  DetachedRoleSet
26
27
  else
27
28
  super
@@ -1,5 +1,6 @@
1
1
  module Ddr::Auth
2
2
  module Roles
3
+ extend Deprecation
3
4
  #
4
5
  # Wraps a set of Roles
5
6
  #
@@ -21,8 +22,8 @@ module Ddr::Auth
21
22
  end
22
23
 
23
24
  def granted
24
- warn "[DEPRECATION] `granted` is deprecated." \
25
- " Use the RoleSet object directly (#{caller.first})."
25
+ Deprecation.warn(self.class, "`granted` is deprecated." \
26
+ " Use the RoleSet object directly.")
26
27
  self
27
28
  end
28
29
 
@@ -46,6 +46,9 @@ module Ddr
46
46
  property :ead_id,
47
47
  predicate: Ddr::Vocab::Asset.eadId
48
48
 
49
+ property :aspace_id,
50
+ predicate: Ddr::Vocab::Asset.archivesSpaceId
51
+
49
52
  end
50
53
  end
51
54
  end
@@ -9,7 +9,7 @@ module Ddr
9
9
  end
10
10
 
11
11
  def generate
12
- command = "convert #{Ddr::Utils.file_path(source)} #{options} png:#{Ddr::Utils.file_path(output)}"
12
+ command = "convert #{Ddr::Utils.file_path(source)}[0] #{options} png:#{Ddr::Utils.file_path(output)}"
13
13
  out, err, s = Open3.capture3(command)
14
14
  GeneratorResult.new(out, err, s)
15
15
  end
@@ -1,7 +1,16 @@
1
1
  module Ddr::Index
2
2
  module Fields
3
+ extend Deprecation
3
4
 
4
- include LegacyLicenseFields
5
+ def self.const_missing(name)
6
+ if const = LegacyLicenseFields.const_get(name)
7
+ Deprecation.warn(Ddr::Index::Fields,
8
+ "The constant `#{name}` is deprecated and will be removed in ddr-models 3.0.")
9
+ const
10
+ else
11
+ super
12
+ end
13
+ end
5
14
 
6
15
  def self.get(name)
7
16
  const_get(name.to_s.upcase, false)
@@ -20,6 +29,7 @@ module Ddr::Index
20
29
  ACTIVE_FEDORA_MODEL = Field.new :active_fedora_model, :stored_sortable
21
30
  ADMIN_SET = Field.new :admin_set, :stored_sortable
22
31
  ADMIN_SET_FACET = Field.new :admin_set_facet, :facetable
32
+ ASPACE_ID = Field.new :aspace_id, :stored_sortable
23
33
  BOX_NUMBER_FACET = Field.new :box_number_facet, :facetable
24
34
  COLLECTION_FACET = Field.new :collection_facet, :facetable
25
35
  COLLECTION_URI = Field.new :collection_uri, :symbol
@@ -13,10 +13,11 @@ module Ddr::Index
13
13
 
14
14
  def where(conditions)
15
15
  clauses = conditions.map do |field, value|
16
- if value.respond_to?(:each)
17
- QueryClause.or_values(field, *value)
16
+ values = Array(value)
17
+ if values.size > 1
18
+ QueryClause.or_values(field, values)
18
19
  else
19
- QueryClause.term(field, value)
20
+ QueryClause.term(field, values.first)
20
21
  end
21
22
  end
22
23
  raw *clauses
@@ -1,8 +1,6 @@
1
1
  module Ddr::Index
2
2
  module LegacyLicenseFields
3
3
 
4
- warn "[DEPRECATION] `Ddr::Index::LegacyLicenseFields` is deprecated and will be removed from ddr-models 3.0."
5
-
6
4
  DEFAULT_LICENSE_DESCRIPTION = Field.new :default_license_description, type: :string
7
5
  DEFAULT_LICENSE_TITLE = Field.new :default_license_title, type: :string
8
6
  DEFAULT_LICENSE_URL = Field.new :default_license_url, type: :string
@@ -29,8 +29,8 @@ module Ddr::Index
29
29
  negative field, PRESENT
30
30
  end
31
31
 
32
- def or_values(field, *values)
33
- build field, QueryValue.or_values(*values)
32
+ def or_values(field, values)
33
+ build field, QueryValue.or_values(values)
34
34
  end
35
35
 
36
36
  def before(field, date_time)
@@ -6,9 +6,12 @@ module Ddr::Index
6
6
  RSolr.solr_escape(value)
7
7
  end
8
8
 
9
- def or_values(*values)
10
- value = values.map { |v| build(v) }.join(" OR ")
11
- "(#{value})"
9
+ # @param values [Enumerable<String>]
10
+ def or_values(values)
11
+ unless values.is_a?(::Enumerable) && values.present?
12
+ raise ArgumentError, "`#{self.name}.or_values` requires a non-empty enumerable of strings."
13
+ end
14
+ "(%s)" % values.map { |value| build(value) }.join(" OR ")
12
15
  end
13
16
  end
14
17
 
@@ -2,8 +2,12 @@ module Ddr
2
2
  module Jobs
3
3
  extend ActiveSupport::Autoload
4
4
 
5
- autoload :PermanentId
6
5
  autoload :FitsFileCharacterization
6
+ autoload :FixityCheck
7
+ autoload :Job
8
+ autoload :PermanentId
9
+ autoload :Queue
10
+ autoload :UpdateIndex
7
11
 
8
12
  autoload_at 'ddr/jobs/permanent_id' do
9
13
  autoload :MakeUnavailable
@@ -1,50 +1,12 @@
1
- require 'open3'
2
-
3
1
  module Ddr::Jobs
4
2
  class FitsFileCharacterization
3
+ extend Job
5
4
 
6
5
  @queue = :file_characterization
7
6
 
8
- EVENT_SUMMARY = 'FITS characterization of content file'.freeze
9
-
10
7
  def self.perform(pid)
11
8
  obj = ActiveFedora::Base.find(pid)
12
- tmp_filename = Ddr::Utils::sanitize_filename(obj.original_filename) || obj.content.default_file_name
13
- Dir.mktmpdir(nil, Ddr::Models.tempdir) do |dir|
14
- infile = create_temp_infile(dir, tmp_filename, obj.content.content)
15
- fits_output, err, status = Open3.capture3(fits_command, '-i', infile)
16
- if status.success? && fits_output.present?
17
- obj.reload
18
- obj.fits.content = fits_output
19
- obj.save!
20
- end
21
- notify_event(pid, err, status)
22
- end
23
- end
24
-
25
- def self.fits_command
26
- File.join(Ddr::Models.fits_home, 'fits.sh')
27
- end
28
-
29
- def self.fits_version
30
- `#{fits_command} -v`.strip
31
- end
32
-
33
- private
34
-
35
- def self.create_temp_infile(dir, tmp_filename, content)
36
- temp_infile = File.join(dir, tmp_filename)
37
- File.open(temp_infile, 'wb') do |f|
38
- f.write content
39
- end
40
- temp_infile
41
- end
42
-
43
- def self.notify_event(pid, err, status)
44
- details = status.success? ? nil : err
45
- event_args = { pid: pid, summary: EVENT_SUMMARY, software: "fits #{fits_version}", detail: details }
46
- event_args[:outcome] = status.success? ? Ddr::Events::Event::SUCCESS : Ddr::Events::Event::FAILURE
47
- Ddr::Notifications.notify_event(:update, event_args)
9
+ Ddr::Models::FileCharacterization.call(obj)
48
10
  end
49
11
 
50
12
  end
@@ -0,0 +1,13 @@
1
+ module Ddr::Jobs
2
+ class FixityCheck
3
+ extend Job
4
+
5
+ @queue = :fixity
6
+
7
+ def self.perform(id)
8
+ obj = ActiveFedora::Base.find(id)
9
+ obj.fixity_check
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,36 @@
1
+ require "resque"
2
+
3
+ module Ddr::Jobs
4
+ module Job
5
+
6
+ def self.extended(base)
7
+ base.extend ClassMethods
8
+ end
9
+
10
+ module ClassMethods
11
+ # @return [Array<String>] list of object ids queued for this job type.
12
+ # @note Assumes that the object_id is the first argument of the .perform method.
13
+ def queued_object_ids(**args)
14
+ args[:type] = self
15
+ __queue__.jobs(**args).map { |job| job["args"].first }
16
+ end
17
+
18
+ protected
19
+
20
+ def method_missing(name, *args, &block)
21
+ # If .queue method not defined, do the right thing
22
+ if name == :queue
23
+ return Resque.queue_from_class(self)
24
+ end
25
+ super
26
+ end
27
+
28
+ private
29
+
30
+ def __queue__
31
+ Queue.new(queue)
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,27 @@
1
+ require "resque"
2
+
3
+ module Ddr::Jobs
4
+ class Queue
5
+
6
+ attr_reader :name
7
+
8
+ def initialize(name)
9
+ @name = name
10
+ end
11
+
12
+ def size
13
+ Resque.size(name)
14
+ end
15
+
16
+ # @return [Array<Hash>] jobs in the queue, optionally filtered by type,
17
+ # start position, and count.
18
+ def jobs(type: nil, start: 0, count: nil)
19
+ jobs = Resque.peek(name, start, count || size)
20
+ if type
21
+ jobs.select! { |job| job["class"] == type.to_s }
22
+ end
23
+ jobs
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ module Ddr::Jobs
2
+ class UpdateIndex
3
+ extend Job
4
+
5
+ @queue = :index
6
+
7
+ def self.perform(id)
8
+ obj = ActiveFedora::Base.find(id)
9
+ obj.update_index
10
+ end
11
+
12
+ end
13
+ end