ddr-models 2.0.1 → 2.1.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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +23 -17
  3. data/app/models/collection.rb +1 -35
  4. data/ddr-models.gemspec +2 -1
  5. data/lib/ddr/actions.rb +1 -0
  6. data/lib/ddr/actions/virus_check.rb +28 -0
  7. data/lib/ddr/auth.rb +4 -0
  8. data/lib/ddr/auth/ability_definitions/datastream_ability_definitions.rb +7 -5
  9. data/lib/ddr/auth/grouper_gateway.rb +9 -1
  10. data/lib/ddr/auth/permissions.rb +2 -1
  11. data/lib/ddr/auth/role_based_access_controls_enforcement.rb +5 -5
  12. data/lib/ddr/auth/roles/role_types.rb +2 -1
  13. data/lib/ddr/datastreams.rb +2 -2
  14. data/lib/ddr/datastreams/administrative_metadata_datastream.rb +27 -14
  15. data/lib/ddr/datastreams/datastream_behavior.rb +13 -0
  16. data/lib/ddr/datastreams/fits_datastream.rb +88 -0
  17. data/lib/ddr/derivatives/png_generator.rb +2 -0
  18. data/lib/ddr/derivatives/ptif_generator.rb +2 -0
  19. data/lib/ddr/events/fixity_check_event.rb +2 -2
  20. data/lib/ddr/events/virus_check_event.rb +2 -14
  21. data/lib/ddr/index.rb +29 -0
  22. data/lib/ddr/index/abstract_query_result.rb +23 -0
  23. data/lib/ddr/index/connection.rb +17 -0
  24. data/lib/ddr/index/csv_query_result.rb +61 -0
  25. data/lib/ddr/index/document_builder.rb +9 -0
  26. data/lib/ddr/index/field.rb +23 -0
  27. data/lib/ddr/index/fields.rb +83 -0
  28. data/lib/ddr/index/filter.rb +48 -0
  29. data/lib/ddr/index/filters.rb +19 -0
  30. data/lib/ddr/index/legacy_license_fields.rb +14 -0
  31. data/lib/ddr/index/query.rb +35 -0
  32. data/lib/ddr/index/query_builder.rb +74 -0
  33. data/lib/ddr/index/query_clause.rb +52 -0
  34. data/lib/ddr/index/query_result.rb +70 -0
  35. data/lib/ddr/index/query_value.rb +16 -0
  36. data/lib/ddr/index/response.rb +13 -0
  37. data/lib/ddr/index/unique_key_field.rb +12 -0
  38. data/lib/ddr/index_fields.rb +7 -53
  39. data/lib/ddr/jobs.rb +1 -1
  40. data/lib/ddr/jobs/fits_file_characterization.rb +51 -0
  41. data/lib/ddr/managers.rb +1 -0
  42. data/lib/ddr/managers/technical_metadata_manager.rb +104 -0
  43. data/lib/ddr/models.rb +39 -23
  44. data/lib/ddr/models/base.rb +0 -2
  45. data/lib/ddr/models/describable.rb +1 -1
  46. data/lib/ddr/models/effective_license.rb +9 -0
  47. data/lib/ddr/models/engine.rb +13 -0
  48. data/lib/ddr/models/file_management.rb +157 -160
  49. data/lib/ddr/models/governable.rb +0 -4
  50. data/lib/ddr/models/has_admin_metadata.rb +80 -72
  51. data/lib/ddr/models/has_children.rb +1 -1
  52. data/lib/ddr/models/has_content.rb +18 -0
  53. data/lib/ddr/models/has_struct_metadata.rb +5 -1
  54. data/lib/ddr/models/indexing.rb +32 -20
  55. data/lib/ddr/models/inherited_license.rb +13 -0
  56. data/lib/ddr/models/license.rb +38 -0
  57. data/lib/ddr/models/solr_document.rb +195 -211
  58. data/lib/ddr/models/version.rb +1 -1
  59. data/lib/ddr/models/year_facet.rb +154 -0
  60. data/lib/ddr/utils.rb +13 -1
  61. data/lib/ddr/vocab/roles.rb +0 -10
  62. data/spec/controllers/including_role_based_access_controls_enforcement_spec.rb +4 -4
  63. data/spec/datastreams/fits_datastream_spec.rb +84 -0
  64. data/spec/fixtures/fits/document.xml +65 -0
  65. data/spec/fixtures/fits/image.xml +59 -0
  66. data/spec/index/filter_spec.rb +47 -0
  67. data/spec/index/filters_spec.rb +17 -0
  68. data/spec/index/query_spec.rb +19 -0
  69. data/spec/jobs/fits_file_characterization_spec.rb +52 -0
  70. data/spec/managers/technical_metadata_manager_spec.rb +140 -0
  71. data/spec/models/active_fedora_datastream_spec.rb +44 -0
  72. data/spec/models/collection_spec.rb +7 -12
  73. data/spec/models/component_spec.rb +3 -6
  74. data/spec/models/effective_license_spec.rb +49 -0
  75. data/spec/models/has_admin_metadata_spec.rb +143 -194
  76. data/spec/models/has_struct_metadata_spec.rb +2 -2
  77. data/spec/models/indexing_spec.rb +40 -0
  78. data/spec/models/solr_document_spec.rb +96 -37
  79. data/spec/models/year_facet_spec.rb +65 -0
  80. data/spec/spec_helper.rb +1 -7
  81. data/spec/support/shared_examples_for_ddr_models.rb +0 -2
  82. data/spec/support/shared_examples_for_has_content.rb +37 -3
  83. metadata +79 -32
  84. data/lib/ddr/datastreams/properties_datastream.rb +0 -25
  85. data/lib/ddr/jobs/migrate_legacy_authorization.rb +0 -23
  86. data/lib/ddr/models/has_properties.rb +0 -15
  87. data/lib/ddr/models/licensable.rb +0 -28
  88. data/spec/auth/legacy_authorization_spec.rb +0 -94
  89. data/spec/auth/legacy_roles_spec.rb +0 -32
  90. data/spec/jobs/migrate_legacy_authorization_spec.rb +0 -43
  91. data/spec/support/shared_examples_for_has_properties.rb +0 -5
  92. data/spec/support/shared_examples_for_licensable.rb +0 -15
@@ -1,25 +0,0 @@
1
- module Ddr
2
- module Datastreams
3
- class PropertiesDatastream < ActiveFedora::OmDatastream
4
-
5
- set_terminology do |t|
6
- t.root(:path => "fields")
7
- t.original_filename
8
- t.permanent_id
9
- end
10
-
11
- def prefix
12
- # Squash AF 8.0 deprecation warning
13
- ""
14
- end
15
-
16
- def self.xml_template
17
- builder = Nokogiri::XML::Builder.new do |xml|
18
- xml.fields
19
- end
20
- builder.doc
21
- end
22
-
23
- end
24
- end
25
- end
@@ -1,23 +0,0 @@
1
- module Ddr::Jobs
2
- class MigrateLegacyAuthorization
3
-
4
- @queue = :migration
5
-
6
- SUMMARY = "Legacy authorization data migrated to roles"
7
-
8
- def self.perform(pid)
9
- obj = ActiveFedora::Base.find(pid)
10
- event_args = { pid: pid, summary: SUMMARY }
11
- begin
12
- event_args[:detail] = obj.legacy_authorization.migrate
13
- obj.save!
14
- rescue Exception => e
15
- event_args[:exception] = e
16
- raise e
17
- ensure
18
- Ddr::Events::UpdateEvent.create(event_args)
19
- end
20
- end
21
-
22
- end
23
- end
@@ -1,15 +0,0 @@
1
- module Ddr
2
- module Models
3
- module HasProperties
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- has_metadata name: Ddr::Datastreams::PROPERTIES,
8
- type: Ddr::Datastreams::PropertiesDatastream,
9
- versionable: true,
10
- label: "Properties for this object",
11
- control_group: 'M'
12
- end
13
- end
14
- end
15
- end
@@ -1,28 +0,0 @@
1
- module Ddr
2
- module Models
3
- module Licensable
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- has_attributes :license_title, datastream: Ddr::Datastreams::RIGHTS_METADATA, at: [:license, :title], multiple: false
8
- has_attributes :license_description, datastream: Ddr::Datastreams::RIGHTS_METADATA, at: [:license, :description], multiple: false
9
- has_attributes :license_url, datastream: Ddr::Datastreams::RIGHTS_METADATA, at: [:license, :url], multiple: false
10
- end
11
-
12
- def license
13
- if license_title.present? or license_description.present? or license_url.present?
14
- {title: license_title, description: license_description, url: license_url}.with_indifferent_access
15
- end
16
- end
17
-
18
- def license=(new_license)
19
- raise ArgumentError unless new_license.is_a?(Hash)
20
- l = new_license.with_indifferent_access
21
- self.license_title = l[:title]
22
- self.license_description = l[:description]
23
- self.license_url = l[:url]
24
- end
25
-
26
- end
27
- end
28
- end
@@ -1,94 +0,0 @@
1
- module Ddr::Auth
2
- RSpec.describe LegacyAuthorization do
3
-
4
- subject { described_class.new(obj) }
5
-
6
- before do
7
- @deprecation_behavior = Deprecation.default_deprecation_behavior
8
- Deprecation.default_deprecation_behavior = :silence
9
- end
10
-
11
- after do
12
- Deprecation.default_deprecation_behavior = @deprecation_behavior
13
- end
14
-
15
-
16
- describe "with a Collection" do
17
- let(:obj) { FactoryGirl.build(:collection) }
18
-
19
- before do
20
- obj.permissions_attributes = [{access: "edit", type: "person", name: "bob@example.com"}]
21
- obj.default_permissions = [{access: "edit", type: "group", name: "Editors"},
22
- {access: "discover", type: "group", name: "public"},
23
- {access: "read", type: "group", name: "registered"}]
24
- end
25
-
26
- it "should convert the legacy authorization data to roles" do
27
- expect(subject.to_roles)
28
- .to eq(Roles::DetachedRoleSet.new(
29
- [ Roles::Role.build(type: "Curator", agent: "Editors", scope: "policy"),
30
- Roles::Role.build(type: "Viewer", agent: "public", scope: "policy"),
31
- Roles::Role.build(type: "Viewer", agent: "registered", scope: "policy"),
32
- Roles::Role.build(type: "Editor", agent: "bob@example.com", scope: "resource") ]
33
- ))
34
- end
35
-
36
- it "should clear the legacy authorization data" do
37
- subject.clear
38
- expect(subject).to be_clear
39
- expect(obj.permissions).to be_empty
40
- expect(obj.default_permissions).to be_empty
41
- expect(obj.adminMetadata.downloader).to be_empty
42
- end
43
-
44
- it "should migrate the legacy authorization data" do
45
- subject.migrate
46
- expect(subject).to be_clear
47
- expect(obj.roles)
48
- .to eq(Roles::DetachedRoleSet.new(
49
- [ Roles::Role.build(type: "Curator", agent: "Editors", scope: "policy"),
50
- Roles::Role.build(type: "Viewer", agent: "public", scope: "policy"),
51
- Roles::Role.build(type: "Viewer", agent: "registered", scope: "policy"),
52
- Roles::Role.build(type: "Editor", agent: "bob@example.com", scope: "resource") ]
53
- ))
54
- end
55
- end
56
-
57
- describe "with a Component" do
58
- let(:obj) { FactoryGirl.build(:component) }
59
-
60
- before do
61
- obj.permissions_attributes = [{access: "edit", type: "person", name: "bob@example.com"}]
62
- obj.adminMetadata.downloader = ["Downloaders", "sally@example.com"]
63
- end
64
-
65
- it "should convert the legacy authorization to roles" do
66
- expect(subject.to_roles)
67
- .to eq(Roles::DetachedRoleSet.new(
68
- [ Roles::Role.build(type: "Downloader", agent: "Downloaders", scope: "resource"),
69
- Roles::Role.build(type: "Downloader", agent: "sally@example.com", scope: "resource"),
70
- Roles::Role.build(type: "Editor", agent: "bob@example.com", scope: "resource") ]
71
- ))
72
- end
73
-
74
- it "should clear the legacy authorization data" do
75
- subject.clear
76
- expect(subject).to be_clear
77
- expect(obj.permissions).to be_empty
78
- expect(obj.adminMetadata.downloader).to be_empty
79
- end
80
-
81
- it "should migrate the legacy authorization data" do
82
- subject.migrate
83
- expect(subject).to be_clear
84
- expect(obj.roles)
85
- .to eq(Roles::DetachedRoleSet.new(
86
- [ Roles::Role.build(type: "Downloader", agent: "Downloaders", scope: "resource"),
87
- Roles::Role.build(type: "Downloader", agent: "sally@example.com", scope: "resource"),
88
- Roles::Role.build(type: "Editor", agent: "bob@example.com", scope: "resource") ]
89
- ))
90
- end
91
-
92
- end
93
- end
94
- end
@@ -1,32 +0,0 @@
1
- module Ddr::Auth
2
- RSpec.describe LegacyRoles do
3
-
4
- subject { described_class.new(obj) }
5
-
6
- let(:obj) { FactoryGirl.build(:component) }
7
-
8
- before do
9
- @deprecation_behavior = Deprecation.default_deprecation_behavior
10
- Deprecation.default_deprecation_behavior = :silence
11
- obj.adminMetadata.downloader = ["bob@example.com", "Downloaders"]
12
- end
13
-
14
- after do
15
- Deprecation.default_deprecation_behavior = @deprecation_behavior
16
- end
17
-
18
- it "should convert the legacy roles to new roles" do
19
- expect(subject.to_roles)
20
- .to eq(Roles::DetachedRoleSet.new(
21
- [ Roles::Role.build(type: "Downloader", agent: "Downloaders", scope: "resource"),
22
- Roles::Role.build(type: "Downloader", agent: "bob@example.com", scope: "resource")
23
- ]
24
- ))
25
- end
26
-
27
- it "should clear the legacy roles" do
28
- expect { subject.clear }.to change(obj.adminMetadata.downloader, :empty?).from(false).to(true)
29
- end
30
-
31
- end
32
- end
@@ -1,43 +0,0 @@
1
- module Ddr::Jobs
2
- RSpec.describe MigrateLegacyAuthorization do
3
-
4
- let(:obj) { FactoryGirl.build(:collection) }
5
-
6
- before do
7
- @deprecation_behavior = Deprecation.default_deprecation_behavior
8
- Deprecation.default_deprecation_behavior = :silence
9
- obj.permissions_attributes = [{access: "edit", type: "person", name: "bob@example.com"}]
10
- obj.adminMetadata.downloader = ["Downloaders", "sally@example.com"]
11
- obj.default_permissions = [{access: "edit", type: "group", name: "Editors"},
12
- {access: "discover", type: "group", name: "public"},
13
- {access: "read", type: "group", name: "registered"}]
14
- obj.save!
15
- end
16
-
17
- after do
18
- Deprecation.default_deprecation_behavior = @deprecation_behavior
19
- end
20
-
21
- it "should migrate the authorization data to roles" do
22
- Resque.enqueue(described_class, obj.pid)
23
- obj.reload
24
- expect(obj.legacy_authorization).to be_clear
25
- expect(obj.roles)
26
- .to eq(Ddr::Auth::Roles::DetachedRoleSet.new(
27
- [ Ddr::Auth::Roles::Role.build(type: "Curator", agent: "Editors", scope: "policy"),
28
- Ddr::Auth::Roles::Role.build(type: "Viewer", agent: "public", scope: "policy"),
29
- Ddr::Auth::Roles::Role.build(type: "Viewer", agent: "registered", scope: "policy"),
30
- Ddr::Auth::Roles::Role.build(type: "Editor", agent: "bob@example.com", scope: "resource"),
31
- Ddr::Auth::Roles::Role.build(type: "Downloader", agent: "Downloaders", scope: "resource"),
32
- Ddr::Auth::Roles::Role.build(type: "Downloader", agent: "sally@example.com", scope: "resource")
33
- ]
34
- ))
35
- event = obj.update_events.last
36
- expect(event).to be_success
37
- expect(event.summary).to eq("Legacy authorization data migrated to roles")
38
- expect(event.detail).to match(/LEGACY AUTHORIZATION DATA/)
39
- expect(event.detail).to match(/ROLES/)
40
- end
41
-
42
- end
43
- end
@@ -1,5 +0,0 @@
1
- RSpec.shared_examples "an object that has properties" do
2
- it "should have a properties datastream" do
3
- expect(subject.datastreams.keys).to include(Ddr::Datastreams::PROPERTIES)
4
- end
5
- end
@@ -1,15 +0,0 @@
1
- RSpec.shared_examples "a licensable object" do
2
- let(:object) { described_class.new }
3
- before do
4
- object.license_title = "License Title"
5
- object.license_description = "License Description"
6
- object.license_url = "http://library.duke.edu"
7
- end
8
- describe "indexing" do
9
- it "should index the license terms" do
10
- expect(object.to_solr[Ddr::IndexFields::LICENSE_TITLE]).to eq("License Title")
11
- expect(object.to_solr[Ddr::IndexFields::LICENSE_DESCRIPTION]).to eq("License Description")
12
- expect(object.to_solr[Ddr::IndexFields::LICENSE_URL]).to eq("http://library.duke.edu")
13
- end
14
- end
15
- end