ddr-models 2.4.16 → 2.5.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.
- checksums.yaml +4 -4
- data/config/initializers/subscriptions.rb +6 -0
- data/db/migrate/20161021201011_add_permanent_id_to_events.rb +8 -0
- data/lib/ddr/datastreams/fits_datastream.rb +4 -0
- data/lib/ddr/events.rb +1 -0
- data/lib/ddr/events/deaccession_event.rb +8 -0
- data/lib/ddr/index/fields.rb +16 -2
- data/lib/ddr/jobs/permanent_id.rb +12 -0
- data/lib/ddr/managers/technical_metadata_manager.rb +3 -0
- data/lib/ddr/managers/workflow_manager.rb +23 -10
- data/lib/ddr/models/admin_set.rb +6 -3
- data/lib/ddr/models/base.rb +40 -2
- data/lib/ddr/models/has_admin_metadata.rb +0 -1
- data/lib/ddr/models/indexing.rb +66 -34
- data/lib/ddr/models/version.rb +1 -1
- data/spec/dummy/db/schema.rb +3 -1
- data/spec/index/fields_spec.rb +56 -0
- data/spec/managers/technical_metadata_manager_spec.rb +2 -0
- data/spec/models/admin_set_spec.rb +6 -5
- data/spec/models/collection_spec.rb +25 -5
- data/spec/models/events_spec.rb +13 -0
- data/spec/models/has_admin_metadata_spec.rb +41 -12
- data/spec/models/indexing_spec.rb +29 -11
- data/spec/support/shared_examples_for_ddr_models.rb +43 -10
- data/spec/support/shared_examples_for_non_collection_models.rb +27 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d6faf41cfbc69e87be3083dede83f8d226253ae
|
4
|
+
data.tar.gz: 98a2c8e8eda939beae492194807dbd0dcc824f0c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9785835818f8ab3080c894fcd96a24d6ae812072ca595f09f75e521a257a6f350c6d65d6fc9bc6c0d84a7e1fc4a4dddaf66307e6ef983f51fe1013b4f759fff8
|
7
|
+
data.tar.gz: 00aeccc3b05dbce09364f94310e82adf1a0de9a63ea0b708bc0b3e0e591d7e3849febac22b7142cf064d650a33c9d646310852f79a87b6b221761f22a9d4563b
|
@@ -16,3 +16,9 @@ ActiveSupport::Notifications.subscribe(Ddr::Notifications::UPDATE, Ddr::Events::
|
|
16
16
|
|
17
17
|
# Deletion
|
18
18
|
ActiveSupport::Notifications.subscribe(Ddr::Notifications::DELETION, Ddr::Events::DeletionEvent)
|
19
|
+
ActiveSupport::Notifications.subscribe(/destroy\.\w+/, Ddr::Events::DeletionEvent)
|
20
|
+
ActiveSupport::Notifications.subscribe(/destroy\.\w+/, Ddr::Jobs::PermanentId::MakeUnavailable)
|
21
|
+
|
22
|
+
# Deaccession
|
23
|
+
ActiveSupport::Notifications.subscribe(/deaccession\.\w+/, Ddr::Events::DeaccessionEvent)
|
24
|
+
ActiveSupport::Notifications.subscribe(/deaccession\.\w+/, Ddr::Jobs::PermanentId::MakeUnavailable)
|
@@ -36,6 +36,8 @@ module Ddr::Datastreams
|
|
36
36
|
t.imageWidth
|
37
37
|
t.imageHeight
|
38
38
|
t.colorSpace
|
39
|
+
t.iccProfileName
|
40
|
+
t.iccProfileVersion
|
39
41
|
}
|
40
42
|
t.document {
|
41
43
|
# TODO - configure to get from Tika?
|
@@ -63,6 +65,8 @@ module Ddr::Datastreams
|
|
63
65
|
t.image_width proxy: [:metadata, :image, :imageWidth]
|
64
66
|
t.image_height proxy: [:metadata, :image, :imageHeight]
|
65
67
|
t.color_space proxy: [:metadata, :image, :colorSpace]
|
68
|
+
t.icc_profile_name proxy: [:metadata, :image, :iccProfileName]
|
69
|
+
t.icc_profile_version proxy: [:metadata, :image, :iccProfileVersion]
|
66
70
|
end
|
67
71
|
|
68
72
|
def self.xml_template
|
data/lib/ddr/events.rb
CHANGED
data/lib/ddr/index/fields.rb
CHANGED
@@ -8,13 +8,17 @@ module Ddr::Index
|
|
8
8
|
ACTIVE_FEDORA_MODEL = Field.new :active_fedora_model, :stored_sortable
|
9
9
|
ADMIN_SET = Field.new :admin_set, :stored_sortable
|
10
10
|
ADMIN_SET_FACET = Field.new :admin_set_facet, :facetable
|
11
|
+
ADMIN_SET_TITLE = Field.new :admin_set_title, :stored_sortable
|
11
12
|
ALL_TEXT = Field.new :all_text, solr_name: "all_text_timv"
|
12
13
|
ASPACE_ID = Field.new :aspace_id, :stored_sortable
|
13
14
|
ATTACHED_FILES_HAVING_CONTENT =
|
14
15
|
Field.new :attached_files_having_content, :symbol
|
15
16
|
BOX_NUMBER_FACET = Field.new :box_number_facet, :facetable
|
17
|
+
CATEGORY_FACET = Field.new :category_facet, :facetable
|
16
18
|
COLLECTION_FACET = Field.new :collection_facet, :facetable
|
19
|
+
COLLECTION_TITLE = Field.new :collection_title, :stored_sortable
|
17
20
|
COLLECTION_URI = Field.new :collection_uri, :symbol
|
21
|
+
COMPANY_FACET = Field.new :company_facet, :facetable
|
18
22
|
CONTENT_CONTROL_GROUP = Field.new :content_control_group, :searchable, type: :string
|
19
23
|
CONTENT_CREATE_DATE = Field.new :content_create_date, :stored_sortable, type: :date
|
20
24
|
CONTENT_SIZE = Field.new :content_size, solr_name: "content_size_lsi"
|
@@ -28,6 +32,7 @@ module Ddr::Index
|
|
28
32
|
DOI = Field.new :doi, :symbol
|
29
33
|
EAD_ID = Field.new :ead_id, :stored_sortable
|
30
34
|
EXTRACTED_TEXT = Field.new :extracted_text, solr_name: "extracted_text_tsm"
|
35
|
+
FOLDER_FACET = Field.new :folder_facet, :facetable
|
31
36
|
FORMAT_FACET = Field.new :format_facet, :facetable
|
32
37
|
HAS_MODEL = Field.new :has_model, :symbol
|
33
38
|
IDENTIFIER_ALL = Field.new :identifier_all, :symbol
|
@@ -48,6 +53,7 @@ module Ddr::Index
|
|
48
53
|
MEDIA_SUB_TYPE = Field.new :content_media_sub_type, :facetable
|
49
54
|
MEDIA_MAJOR_TYPE = Field.new :content_media_major_type, :facetable
|
50
55
|
MEDIA_TYPE = Field.new :content_media_type, :symbol
|
56
|
+
MEDIUM_FACET = Field.new :medium_facet, :facetable
|
51
57
|
MULTIRES_IMAGE_FILE_PATH = Field.new :multires_image_file_path, :stored_sortable
|
52
58
|
OBJECT_PROFILE = Field.new :object_profile, :displayable
|
53
59
|
OBJECT_STATE = Field.new :object_state, :stored_sortable
|
@@ -55,11 +61,15 @@ module Ddr::Index
|
|
55
61
|
OBJECT_MODIFIED_DATE = Field.new :system_modified, :stored_sortable, type: :date
|
56
62
|
PERMANENT_ID = Field.new :permanent_id, :stored_sortable, type: :string
|
57
63
|
PERMANENT_URL = Field.new :permanent_url, :stored_sortable, type: :string
|
64
|
+
PLACEMENT_COMPANY_FACET = Field.new :placement_company_facet, :facetable
|
58
65
|
POLICY_ROLE = Field.new :policy_role, :symbol
|
66
|
+
PRODUCT_FACET = Field.new :product_facet, :facetable
|
67
|
+
PUBLICATION_FACET = Field.new :publication_facet, :facetable
|
59
68
|
PUBLISHER_FACET = Field.new :publisher_facet, :facetable
|
60
69
|
RESEARCH_HELP_CONTACT = Field.new :research_help_contact, :stored_sortable
|
61
70
|
RESOURCE_ROLE = Field.new :resource_role, :symbol
|
62
71
|
SERIES_FACET = Field.new :series_facet, :facetable
|
72
|
+
SETTING_FACET = Field.new :setting_facet, :facetable
|
63
73
|
SPATIAL_FACET = Field.new :spatial_facet, :facetable
|
64
74
|
STRUCT_MAPS = Field.new :struct_maps, :stored_sortable
|
65
75
|
SUBJECT_FACET = Field.new :subject_facet, :facetable
|
@@ -71,6 +81,8 @@ module Ddr::Index
|
|
71
81
|
TECHMD_FITS_DATETIME = Field.new :techmd_fits_datetime, :stored_sortable, type: :date
|
72
82
|
TECHMD_FORMAT_LABEL = Field.new :techmd_format_label, :symbol
|
73
83
|
TECHMD_FORMAT_VERSION = Field.new :techmd_format_version, :symbol
|
84
|
+
TECHMD_ICC_PROFILE_NAME = Field.new :techmd_icc_profile_name, :symbol
|
85
|
+
TECHMD_ICC_PROFILE_VERSION = Field.new :techmd_icc_profile_version, :symbol
|
74
86
|
TECHMD_IMAGE_HEIGHT = Field.new :techmd_image_height, :stored_searchable, type: :integer
|
75
87
|
TECHMD_IMAGE_WIDTH = Field.new :techmd_image_width, :stored_searchable, type: :integer
|
76
88
|
TECHMD_MEDIA_TYPE = Field.new :techmd_media_type, :symbol
|
@@ -79,6 +91,7 @@ module Ddr::Index
|
|
79
91
|
TECHMD_VALID = Field.new :techmd_valid, :symbol
|
80
92
|
TECHMD_WELL_FORMED = Field.new :techmd_well_formed, :symbol
|
81
93
|
TITLE = Field.new :title, :stored_sortable
|
94
|
+
TONE_FACET = Field.new :tone_facet, :facetable
|
82
95
|
TYPE_FACET = Field.new :type_facet, :facetable
|
83
96
|
WORKFLOW_STATE = Field.new :workflow_state, :stored_sortable
|
84
97
|
YEAR_FACET = Field.new :year_facet, solr_name: "year_facet_iim"
|
@@ -105,8 +118,9 @@ module Ddr::Index
|
|
105
118
|
return ID
|
106
119
|
end
|
107
120
|
if const = LegacyLicenseFields.const_get(name)
|
108
|
-
|
109
|
-
|
121
|
+
# XXX Commented out b/c annoying, but maybe we want later ...
|
122
|
+
# Deprecation.warn(Ddr::Index::Fields,
|
123
|
+
# "`Ddr::Index::Fields::#{name}` is deprecated and will be removed in ddr-models 3.0.")
|
110
124
|
return const
|
111
125
|
end
|
112
126
|
super
|
@@ -11,6 +11,18 @@ module Ddr
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class MakeUnavailable < Job
|
14
|
+
def self.call(*args)
|
15
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
16
|
+
id = event.payload[:permanent_id]
|
17
|
+
reason = case event.name.split(".").first
|
18
|
+
when "destroy"
|
19
|
+
"deleted"
|
20
|
+
when "deaccession"
|
21
|
+
"deaccessioned"
|
22
|
+
end
|
23
|
+
Resque.enqueue(self, id, reason) if id.present?
|
24
|
+
end
|
25
|
+
|
14
26
|
def self.perform(id, reason = nil)
|
15
27
|
identifier = Ezid::Identifier.find(id)
|
16
28
|
identifier.unavailable!(reason)
|
@@ -9,6 +9,7 @@ module Ddr::Managers
|
|
9
9
|
:media_type, :format_label, :format_version, :pronom_identifier,
|
10
10
|
:created, :modified, :creating_application, :extent,
|
11
11
|
:image_width, :image_height, :color_space,
|
12
|
+
:icc_profile_name, :icc_profile_version,
|
12
13
|
to: :fits
|
13
14
|
|
14
15
|
alias_method :last_modified, :modified
|
@@ -81,6 +82,8 @@ module Ddr::Managers
|
|
81
82
|
Ddr::Index::Fields::TECHMD_FILE_SIZE => file_size,
|
82
83
|
Ddr::Index::Fields::TECHMD_FORMAT_LABEL => format_label,
|
83
84
|
Ddr::Index::Fields::TECHMD_FORMAT_VERSION => format_version,
|
85
|
+
Ddr::Index::Fields::TECHMD_ICC_PROFILE_NAME => icc_profile_name,
|
86
|
+
Ddr::Index::Fields::TECHMD_ICC_PROFILE_VERSION => icc_profile_version,
|
84
87
|
Ddr::Index::Fields::TECHMD_IMAGE_HEIGHT => image_height,
|
85
88
|
Ddr::Index::Fields::TECHMD_IMAGE_WIDTH => image_width,
|
86
89
|
Ddr::Index::Fields::TECHMD_MEDIA_TYPE => media_type,
|
@@ -9,22 +9,35 @@ module Ddr
|
|
9
9
|
object.workflow_state == PUBLISHED
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
def publish!(include_descendants: true)
|
14
|
+
unless published?
|
15
|
+
publish
|
16
|
+
object.save!
|
17
|
+
end
|
18
|
+
if include_descendants && object.respond_to?(:children)
|
19
|
+
object.children.each { |child| child.publish!(include_descendants: include_descendants) }
|
20
|
+
end
|
14
21
|
end
|
15
22
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
23
|
+
def unpublish!
|
24
|
+
if published?
|
25
|
+
unpublish
|
26
|
+
object.save!
|
27
|
+
end
|
28
|
+
if object.respond_to?(:children)
|
29
|
+
object.children.each { |child| child.unpublish! }
|
30
|
+
end
|
19
31
|
end
|
20
32
|
|
21
|
-
|
22
|
-
|
33
|
+
private
|
34
|
+
|
35
|
+
def publish
|
36
|
+
object.workflow_state = PUBLISHED
|
23
37
|
end
|
24
38
|
|
25
|
-
def unpublish
|
26
|
-
|
27
|
-
object.save
|
39
|
+
def unpublish
|
40
|
+
object.workflow_state = UNPUBLISHED
|
28
41
|
end
|
29
42
|
|
30
43
|
end
|
data/lib/ddr/models/admin_set.rb
CHANGED
@@ -6,13 +6,16 @@ module Ddr::Models
|
|
6
6
|
self.site = ENV["DDR_AUX_API_URL"]
|
7
7
|
|
8
8
|
def self.call(obj)
|
9
|
-
|
10
|
-
new get(:find, code: obj.admin_set)
|
11
|
-
end
|
9
|
+
find_by_code(obj.admin_set)
|
12
10
|
rescue ActiveResource::ResourceNotFound => e
|
13
11
|
raise Ddr::Models::NotFoundError, e
|
14
12
|
end
|
15
13
|
|
14
|
+
def self.find_by_code(code)
|
15
|
+
return unless code
|
16
|
+
new get(:find, code: code)
|
17
|
+
end
|
18
|
+
|
16
19
|
def self.keys
|
17
20
|
all.map(&:code)
|
18
21
|
end
|
data/lib/ddr/models/base.rb
CHANGED
@@ -13,12 +13,23 @@ module Ddr
|
|
13
13
|
include Hydra::Validations
|
14
14
|
include HasAdminMetadata
|
15
15
|
|
16
|
+
# Prevent accidental use of #delete which lacks callbacks
|
17
|
+
private :delete
|
18
|
+
|
19
|
+
define_model_callbacks :deaccession, only: :around
|
20
|
+
|
16
21
|
extend Deprecation
|
17
22
|
# Deprecate Hydra permissions-related methods
|
18
23
|
deprecation_deprecate *(Hydra::AccessControls::Permissions.public_instance_methods)
|
19
24
|
|
20
|
-
|
21
|
-
|
25
|
+
around_save :notify_save
|
26
|
+
around_deaccession :notify_deaccession
|
27
|
+
around_destroy :notify_destroy
|
28
|
+
|
29
|
+
def deaccession
|
30
|
+
run_callbacks :deaccession do
|
31
|
+
delete
|
32
|
+
end
|
22
33
|
end
|
23
34
|
|
24
35
|
def copy_admin_policy_or_permissions_from(other)
|
@@ -106,6 +117,33 @@ module Ddr
|
|
106
117
|
raise NotImplementedError, "Must be implemented by subclasses"
|
107
118
|
end
|
108
119
|
|
120
|
+
private
|
121
|
+
|
122
|
+
def notify_save
|
123
|
+
ActiveSupport::Notifications.instrument("save.#{self.class.to_s.underscore}",
|
124
|
+
pid: pid,
|
125
|
+
changes: changes,
|
126
|
+
created: new_record?) do |payload|
|
127
|
+
yield
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def notify_deaccession
|
132
|
+
ActiveSupport::Notifications.instrument("deaccession.#{self.class.to_s.underscore}",
|
133
|
+
pid: pid,
|
134
|
+
permanent_id: permanent_id) do |payload|
|
135
|
+
yield
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def notify_destroy
|
140
|
+
ActiveSupport::Notifications.instrument("destroy.#{self.class.to_s.underscore}",
|
141
|
+
pid: pid,
|
142
|
+
permanent_id: permanent_id) do |payload|
|
143
|
+
yield
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
109
147
|
end
|
110
148
|
end
|
111
149
|
end
|
@@ -28,7 +28,6 @@ module Ddr::Models
|
|
28
28
|
delegate :publish!, :unpublish!, :published?, to: :workflow
|
29
29
|
|
30
30
|
after_create :assign_permanent_id!, if: "Ddr::Models.auto_assign_permanent_ids"
|
31
|
-
around_destroy :update_permanent_id_on_destroy, if: "permanent_id.present?"
|
32
31
|
end
|
33
32
|
|
34
33
|
def permanent_id_manager
|
data/lib/ddr/models/indexing.rb
CHANGED
@@ -17,41 +17,52 @@ module Ddr
|
|
17
17
|
|
18
18
|
def index_fields
|
19
19
|
fields = {
|
20
|
-
ACCESS_ROLE
|
21
|
-
ADMIN_SET
|
22
|
-
|
20
|
+
ACCESS_ROLE => roles.to_json,
|
21
|
+
ADMIN_SET => admin_set,
|
22
|
+
ADMIN_SET_TITLE => admin_set_title,
|
23
|
+
ASPACE_ID => aspace_id,
|
23
24
|
ATTACHED_FILES_HAVING_CONTENT => attached_files_having_content.keys,
|
24
|
-
BOX_NUMBER_FACET
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
25
|
+
BOX_NUMBER_FACET => desc_metadata_values('box_number'),
|
26
|
+
CATEGORY_FACET => desc_metadata_values('category'),
|
27
|
+
COLLECTION_TITLE => collection_title,
|
28
|
+
COMPANY_FACET => desc_metadata_values('company'),
|
29
|
+
CONTRIBUTOR_FACET => contributor,
|
30
|
+
CREATOR_FACET => creator,
|
31
|
+
DATE_FACET => date,
|
32
|
+
DATE_SORT => date_sort,
|
33
|
+
DEPOSITOR => depositor,
|
34
|
+
DISPLAY_FORMAT => display_format,
|
35
|
+
DOI => adminMetadata.doi,
|
36
|
+
EAD_ID => ead_id,
|
37
|
+
FOLDER_FACET => desc_metadata_values('folder'),
|
38
|
+
FORMAT_FACET => format,
|
39
|
+
IDENTIFIER_ALL => all_identifiers,
|
40
|
+
INTERNAL_URI => internal_uri,
|
41
|
+
IS_LOCKED => is_locked,
|
42
|
+
LICENSE => license,
|
43
|
+
LICENSE_DESCRIPTION => rightsMetadata.license.description.first,
|
44
|
+
LICENSE_TITLE => rightsMetadata.license.title.first,
|
45
|
+
LICENSE_URL => rightsMetadata.license.url.first,
|
46
|
+
LOCAL_ID => local_id,
|
47
|
+
MEDIUM_FACET => desc_metadata_values('medium'),
|
48
|
+
PERMANENT_ID => permanent_id,
|
49
|
+
PERMANENT_URL => permanent_url,
|
50
|
+
PLACEMENT_COMPANY_FACET => desc_metadata_values('placement_company'),
|
51
|
+
POLICY_ROLE => roles.in_policy_scope.agents,
|
52
|
+
PRODUCT_FACET => desc_metadata_values('product'),
|
53
|
+
PUBLICATION_FACET => desc_metadata_values('publication'),
|
54
|
+
PUBLISHER_FACET => publisher,
|
55
|
+
RESEARCH_HELP_CONTACT => research_help_contact,
|
56
|
+
RESOURCE_ROLE => roles.in_resource_scope.agents,
|
57
|
+
SERIES_FACET => desc_metadata_values('series'),
|
58
|
+
SETTING_FACET => desc_metadata_values('setting'),
|
59
|
+
SPATIAL_FACET => desc_metadata_values('spatial'),
|
60
|
+
SUBJECT_FACET => subject,
|
61
|
+
TITLE => title_display,
|
62
|
+
TONE_FACET => desc_metadata_values('tone'),
|
63
|
+
TYPE_FACET => type,
|
64
|
+
WORKFLOW_STATE => workflow_state,
|
65
|
+
YEAR_FACET => year_facet,
|
55
66
|
}
|
56
67
|
if respond_to? :fixity_checks
|
57
68
|
last_fixity_check = fixity_checks.last
|
@@ -110,6 +121,8 @@ module Ddr
|
|
110
121
|
end
|
111
122
|
|
112
123
|
def associated_collection
|
124
|
+
# XXX Can/should we use SolrDocument here?
|
125
|
+
# I.e., ::SolrDocument.find(admin_policy_id)
|
113
126
|
admin_policy
|
114
127
|
end
|
115
128
|
|
@@ -121,10 +134,29 @@ module Ddr
|
|
121
134
|
end
|
122
135
|
end
|
123
136
|
|
137
|
+
def admin_set_title
|
138
|
+
code = if admin_set.present?
|
139
|
+
admin_set
|
140
|
+
elsif associated_collection.present?
|
141
|
+
associated_collection.admin_set
|
142
|
+
end
|
143
|
+
if as = AdminSet.find_by_code(code)
|
144
|
+
as.title
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
124
148
|
def collection_facet
|
125
149
|
associated_collection.internal_uri if associated_collection.present?
|
126
150
|
end
|
127
151
|
|
152
|
+
def collection_title
|
153
|
+
if instance_of?(Collection)
|
154
|
+
title_display
|
155
|
+
elsif associated_collection.present?
|
156
|
+
associated_collection.title_display
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
128
160
|
def date_sort
|
129
161
|
date.first
|
130
162
|
end
|
data/lib/ddr/models/version.rb
CHANGED
data/spec/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20161021201011) do
|
15
15
|
|
16
16
|
create_table "events", force: true do |t|
|
17
17
|
t.datetime "event_date_time"
|
@@ -27,10 +27,12 @@ ActiveRecord::Schema.define(version: 20150713171838) do
|
|
27
27
|
t.text "detail"
|
28
28
|
t.text "exception", limit: 65535
|
29
29
|
t.string "user_key"
|
30
|
+
t.string "permanent_id"
|
30
31
|
end
|
31
32
|
|
32
33
|
add_index "events", ["event_date_time"], name: "index_events_on_event_date_time"
|
33
34
|
add_index "events", ["outcome"], name: "index_events_on_outcome"
|
35
|
+
add_index "events", ["permanent_id"], name: "index_events_on_permanent_id"
|
34
36
|
add_index "events", ["pid"], name: "index_events_on_pid"
|
35
37
|
add_index "events", ["type"], name: "index_events_on_type"
|
36
38
|
|
data/spec/index/fields_spec.rb
CHANGED
@@ -12,6 +12,8 @@ module Ddr::Index
|
|
12
12
|
Fields::TECHMD_FITS_DATETIME,
|
13
13
|
Fields::TECHMD_FORMAT_LABEL,
|
14
14
|
Fields::TECHMD_FORMAT_VERSION,
|
15
|
+
Fields::TECHMD_ICC_PROFILE_NAME,
|
16
|
+
Fields::TECHMD_ICC_PROFILE_VERSION,
|
15
17
|
Fields::TECHMD_IMAGE_HEIGHT,
|
16
18
|
Fields::TECHMD_IMAGE_WIDTH,
|
17
19
|
Fields::TECHMD_MEDIA_TYPE,
|
@@ -60,6 +62,18 @@ module Ddr::Index
|
|
60
62
|
its(:heading) { is_expected.to eq "aspace_id" }
|
61
63
|
end
|
62
64
|
|
65
|
+
describe "CATEGORY_FACET" do
|
66
|
+
subject { Fields::CATEGORY_FACET }
|
67
|
+
its(:label) { is_expected.to eq "Category Facet" }
|
68
|
+
its(:heading) { is_expected.to eq "category_facet" }
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "COMPANY_FACET" do
|
72
|
+
subject { Fields::COMPANY_FACET }
|
73
|
+
its(:label) { is_expected.to eq "Company Facet" }
|
74
|
+
its(:heading) { is_expected.to eq "company_facet" }
|
75
|
+
end
|
76
|
+
|
63
77
|
describe "DOI" do
|
64
78
|
subject { Fields::DOI }
|
65
79
|
its(:label) { is_expected.to eq "DOI" }
|
@@ -72,12 +86,24 @@ module Ddr::Index
|
|
72
86
|
its(:heading) { is_expected.to eq "ead_id" }
|
73
87
|
end
|
74
88
|
|
89
|
+
describe "FOLDER_FACET" do
|
90
|
+
subject { Fields::FOLDER_FACET }
|
91
|
+
its(:label) { is_expected.to eq "Folder Facet" }
|
92
|
+
its(:heading) { is_expected.to eq "folder_facet" }
|
93
|
+
end
|
94
|
+
|
75
95
|
describe "LOCAL_ID" do
|
76
96
|
subject { Fields::LOCAL_ID }
|
77
97
|
its(:label) { is_expected.to eq "Local ID" }
|
78
98
|
its(:heading) { is_expected.to eq "local_id" }
|
79
99
|
end
|
80
100
|
|
101
|
+
describe "MEDIUM_FACET" do
|
102
|
+
subject { Fields::MEDIUM_FACET }
|
103
|
+
its(:label) { is_expected.to eq "Medium Facet" }
|
104
|
+
its(:heading) { is_expected.to eq "medium_facet" }
|
105
|
+
end
|
106
|
+
|
81
107
|
describe "OBJECT_CREATE_DATE" do
|
82
108
|
subject { Fields::OBJECT_CREATE_DATE }
|
83
109
|
its(:label) { is_expected.to eq "Creation Date" }
|
@@ -102,6 +128,30 @@ module Ddr::Index
|
|
102
128
|
its(:heading) { is_expected.to eq "permanent_url" }
|
103
129
|
end
|
104
130
|
|
131
|
+
describe "PLACEMENT_COMPANY_FACET" do
|
132
|
+
subject { Fields::PLACEMENT_COMPANY_FACET }
|
133
|
+
its(:label) { is_expected.to eq "Placement Company Facet" }
|
134
|
+
its(:heading) { is_expected.to eq "placement_company_facet" }
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "PRODUCT_FACET" do
|
138
|
+
subject { Fields::PRODUCT_FACET }
|
139
|
+
its(:label) { is_expected.to eq "Product Facet" }
|
140
|
+
its(:heading) { is_expected.to eq "product_facet" }
|
141
|
+
end
|
142
|
+
|
143
|
+
describe "PUBLICATION_FACET" do
|
144
|
+
subject { Fields::PUBLICATION_FACET }
|
145
|
+
its(:label) { is_expected.to eq "Publication Facet" }
|
146
|
+
its(:heading) { is_expected.to eq "publication_facet" }
|
147
|
+
end
|
148
|
+
|
149
|
+
describe "SETTING_FACET" do
|
150
|
+
subject { Fields::SETTING_FACET }
|
151
|
+
its(:label) { is_expected.to eq "Setting Facet" }
|
152
|
+
its(:heading) { is_expected.to eq "setting_facet" }
|
153
|
+
end
|
154
|
+
|
105
155
|
describe "TECHMD_COLOR_SPACE" do
|
106
156
|
subject { Fields::TECHMD_COLOR_SPACE }
|
107
157
|
its(:label) { is_expected.to eq "Color Space" }
|
@@ -191,6 +241,12 @@ module Ddr::Index
|
|
191
241
|
its(:label) { is_expected.to eq "Well-formed" }
|
192
242
|
its(:heading) { is_expected.to eq "well_formed" }
|
193
243
|
end
|
244
|
+
|
245
|
+
describe "TONE_FACET" do
|
246
|
+
subject { Fields::TONE_FACET }
|
247
|
+
its(:label) { is_expected.to eq "Tone Facet" }
|
248
|
+
its(:heading) { is_expected.to eq "tone_facet" }
|
249
|
+
end
|
194
250
|
end
|
195
251
|
|
196
252
|
end
|
@@ -72,6 +72,8 @@ module Ddr::Managers
|
|
72
72
|
its(:image_width) { is_expected.to eq(["500"]) }
|
73
73
|
its(:image_height) { is_expected.to eq(["569"]) }
|
74
74
|
its(:color_space) { is_expected.to eq(["YCbCr"]) }
|
75
|
+
its(:icc_profile_name) { is_expected.to eq(["c2"]) }
|
76
|
+
its(:icc_profile_version) { is_expected.to eq(["2.1.0"]) }
|
75
77
|
end
|
76
78
|
|
77
79
|
describe "valid? / invalid?" do
|
@@ -6,19 +6,20 @@ module Ddr::Models
|
|
6
6
|
|
7
7
|
describe "when the object has an admin set" do
|
8
8
|
before { obj.admin_set = "dvs" }
|
9
|
+
let(:admin_set) {
|
10
|
+
described_class.new("id"=>1, "code"=>"dvs", "title"=>"Data and Visualization Services", "created_at"=>"2015-09-15T16:15:58.514Z", "updated_at"=>"2015-09-15T16:15:58.514Z")
|
11
|
+
}
|
9
12
|
describe "and the admin set code is found" do
|
10
13
|
before {
|
11
|
-
allow(described_class).to receive(:
|
12
|
-
{"id"=>1, "code"=>"dvs", "title"=>"Data and Visualization Services", "created_at"=>"2015-09-15T16:15:58.514Z", "updated_at"=>"2015-09-15T16:15:58.514Z"}
|
13
|
-
}
|
14
|
+
allow(described_class).to receive(:find_by_code).with("dvs") { admin_set }
|
14
15
|
}
|
15
16
|
it "returns an AdminSet instance" do
|
16
|
-
expect(described_class.call(obj)).to
|
17
|
+
expect(described_class.call(obj)).to eq(admin_set)
|
17
18
|
end
|
18
19
|
end
|
19
20
|
describe "and the admin set is not found" do
|
20
21
|
before {
|
21
|
-
allow(described_class).to receive(:
|
22
|
+
allow(described_class).to receive(:find_by_code).with("dvs")
|
22
23
|
.and_raise(ActiveResource::ResourceNotFound, "404")
|
23
24
|
}
|
24
25
|
it "raises an exception" do
|
@@ -7,13 +7,33 @@ RSpec.describe Collection, type: :model do
|
|
7
7
|
it_behaves_like "it has an association", :has_many, :targets, :is_external_target_for, "Target"
|
8
8
|
it_behaves_like "a publishable object"
|
9
9
|
|
10
|
+
describe "admin set" do
|
11
|
+
let(:admin_set) { Ddr::Models::AdminSet.new(code: "foobar", title: "FooBar") }
|
12
|
+
before do
|
13
|
+
allow(Ddr::Models::AdminSet).to receive(:find_by_code).with("foobar") { admin_set }
|
14
|
+
subject.admin_set = "foobar"
|
15
|
+
end
|
16
|
+
it "indexes the admin set title" do
|
17
|
+
expect(subject.to_solr[Ddr::Index::Fields::ADMIN_SET_TITLE]).to eq("FooBar")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "title" do
|
22
|
+
before do
|
23
|
+
subject.title = [ "Test Collection" ]
|
24
|
+
end
|
25
|
+
it "indexes the collection title" do
|
26
|
+
expect(subject.to_solr[Ddr::Index::Fields::COLLECTION_TITLE]).to eq("Test Collection")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
10
30
|
describe "legacy license information" do
|
11
31
|
before do
|
12
32
|
subject.defaultRights.license.title = ["License Title"]
|
13
33
|
subject.defaultRights.license.description = ["License Description"]
|
14
34
|
subject.defaultRights.license.url = ["http://library.duke.edu"]
|
15
35
|
end
|
16
|
-
it "
|
36
|
+
it "indexes the terms" do
|
17
37
|
expect(subject.to_solr[Ddr::Index::Fields::DEFAULT_LICENSE_TITLE]).to eq("License Title")
|
18
38
|
expect(subject.to_solr[Ddr::Index::Fields::DEFAULT_LICENSE_DESCRIPTION]).to eq("License Description")
|
19
39
|
expect(subject.to_solr[Ddr::Index::Fields::DEFAULT_LICENSE_URL]).to eq("http://library.duke.edu")
|
@@ -25,7 +45,7 @@ RSpec.describe Collection, type: :model do
|
|
25
45
|
before do
|
26
46
|
allow_any_instance_of(Component).to receive(:collection_uri).and_return(subject.internal_uri)
|
27
47
|
end
|
28
|
-
it "
|
48
|
+
it "returns the correct component(s)" do
|
29
49
|
component = Component.create
|
30
50
|
docs = subject.components_from_solr
|
31
51
|
expect(docs.size).to eq(1)
|
@@ -34,7 +54,7 @@ RSpec.describe Collection, type: :model do
|
|
34
54
|
end
|
35
55
|
|
36
56
|
describe "validation" do
|
37
|
-
it "
|
57
|
+
it "requires a title" do
|
38
58
|
expect(subject).to_not be_valid
|
39
59
|
expect(subject.errors.messages).to have_key(:title)
|
40
60
|
end
|
@@ -42,7 +62,7 @@ RSpec.describe Collection, type: :model do
|
|
42
62
|
|
43
63
|
describe "creation" do
|
44
64
|
subject { Collection.create(title: [ "Test Collection" ]) }
|
45
|
-
it "
|
65
|
+
it "is governed by itself" do
|
46
66
|
expect(subject.admin_policy).to eq(subject)
|
47
67
|
end
|
48
68
|
end
|
@@ -50,7 +70,7 @@ RSpec.describe Collection, type: :model do
|
|
50
70
|
describe "roles granted to creator" do
|
51
71
|
let(:user) { FactoryGirl.build(:user) }
|
52
72
|
before { subject.grant_roles_to_creator(user) }
|
53
|
-
it "
|
73
|
+
it "includes Curator roles in both resource and policy scopes" do
|
54
74
|
expect(subject.roles.to_a).to eq([Ddr::Auth::Roles::Role.build(type: "Curator", agent: user.agent, scope: "resource"), Ddr::Auth::Roles::Role.build(type: "Curator", agent: user.agent, scope: "policy")])
|
55
75
|
end
|
56
76
|
end
|
data/spec/models/events_spec.rb
CHANGED
@@ -68,5 +68,18 @@ module Ddr
|
|
68
68
|
expect(subject.display_type).to eq "Deletion"
|
69
69
|
end
|
70
70
|
end
|
71
|
+
|
72
|
+
RSpec.describe DeaccessionEvent, type: :model, events: true do
|
73
|
+
it_behaves_like "an event"
|
74
|
+
it_behaves_like "a preservation-related event"
|
75
|
+
it "should have a display type" do
|
76
|
+
expect(subject.display_type).to eq "Deaccession"
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "permanent id" do
|
80
|
+
subject { described_class.new(pid: "test:1", permanent_id: "ark:/99999/fk4zzz") }
|
81
|
+
its(:permanent_id) { is_expected.to eq("ark:/99999/fk4zzz") }
|
82
|
+
end
|
83
|
+
end
|
71
84
|
end
|
72
85
|
end
|
@@ -73,6 +73,13 @@ module Ddr::Models
|
|
73
73
|
.to("unavailable | deleted")
|
74
74
|
end
|
75
75
|
end
|
76
|
+
describe "object deaccession" do
|
77
|
+
it "marks the identifier as unavailable" do
|
78
|
+
expect { subject.deaccession }
|
79
|
+
.to change(identifier, :status)
|
80
|
+
.to("unavailable | deaccessioned")
|
81
|
+
end
|
82
|
+
end
|
76
83
|
end
|
77
84
|
|
78
85
|
describe "events" do
|
@@ -104,35 +111,57 @@ module Ddr::Models
|
|
104
111
|
|
105
112
|
describe "workflow" do
|
106
113
|
|
107
|
-
|
114
|
+
let(:collection) { FactoryGirl.create(:collection) }
|
115
|
+
let(:item) { FactoryGirl.create(:item) }
|
116
|
+
let(:component) { FactoryGirl.create(:component) }
|
117
|
+
before do
|
118
|
+
item.parent = collection
|
119
|
+
item.save!
|
120
|
+
component.parent = item
|
121
|
+
component.save!
|
122
|
+
end
|
108
123
|
|
109
124
|
describe "#published?" do
|
110
125
|
context "object is published" do
|
111
|
-
before { allow(
|
126
|
+
before { allow(collection).to receive(:workflow_state) { Ddr::Managers::WorkflowManager::PUBLISHED } }
|
112
127
|
it "should return true" do
|
113
|
-
expect(
|
128
|
+
expect(collection).to be_published
|
114
129
|
end
|
115
130
|
end
|
116
131
|
context "object is not published" do
|
117
|
-
before { allow(
|
132
|
+
before { allow(collection).to receive(:workflow_state) { nil } }
|
118
133
|
it "should return false" do
|
119
|
-
expect(
|
134
|
+
expect(collection).not_to be_published
|
120
135
|
end
|
121
136
|
end
|
122
137
|
end
|
123
138
|
|
124
139
|
describe "#publish!" do
|
125
|
-
|
126
|
-
|
127
|
-
|
140
|
+
context "do not include descendants" do
|
141
|
+
it "should publish and persist the object" do
|
142
|
+
collection.publish!(include_descendants: false)
|
143
|
+
expect(collection.reload).to be_published
|
144
|
+
expect(item.reload).not_to be_published
|
145
|
+
expect(component.reload).not_to be_published
|
146
|
+
end
|
147
|
+
end
|
148
|
+
context "do include descendants" do
|
149
|
+
it "should publish and persist the object and descendants" do
|
150
|
+
collection.publish!
|
151
|
+
expect(collection.reload).to be_published
|
152
|
+
expect(item.reload).to be_published
|
153
|
+
expect(component.reload).to be_published
|
154
|
+
end
|
128
155
|
end
|
129
156
|
end
|
130
157
|
|
131
158
|
describe "#unpublish!" do
|
132
|
-
before {
|
133
|
-
it "should unpublish and persist the object" do
|
134
|
-
|
135
|
-
expect(
|
159
|
+
before { collection.publish! }
|
160
|
+
it "should unpublish and persist the object and descendants" do
|
161
|
+
collection.unpublish!
|
162
|
+
expect(collection.reload).not_to be_published
|
163
|
+
expect(item.reload).not_to be_published
|
164
|
+
expect(component.reload).not_to be_published
|
136
165
|
end
|
137
166
|
end
|
138
167
|
end
|
@@ -12,32 +12,50 @@ module Ddr::Models
|
|
12
12
|
let(:role4) { FactoryGirl.build(:role, :editor, :person, :policy) }
|
13
13
|
|
14
14
|
before do
|
15
|
+
obj.adminMetadata.doi << "http://doi.org/10.1000/182"
|
16
|
+
obj.aspace_id = "aspace_dccea43034e1b8261e14cf999e86449d"
|
17
|
+
obj.display_format = "Image"
|
15
18
|
obj.license = "cc-by-nc-nd-40"
|
16
|
-
obj.rightsMetadata.license.title = ["License Title"]
|
17
|
-
obj.rightsMetadata.license.description = ["License Description"]
|
18
|
-
obj.rightsMetadata.license.url = ["http://library.duke.edu"]
|
19
19
|
obj.local_id = "foo"
|
20
|
-
obj.adminMetadata.doi << "http://doi.org/10.1000/182"
|
21
20
|
obj.permanent_id = "ark:/99999/fk4zzz"
|
22
21
|
obj.permanent_url = "http://id.library.duke.edu/ark:/99999/fk4zzz"
|
23
|
-
obj.
|
22
|
+
obj.rightsMetadata.license.description = ["License Description"]
|
23
|
+
obj.rightsMetadata.license.title = ["License Title"]
|
24
|
+
obj.rightsMetadata.license.url = ["http://library.duke.edu"]
|
24
25
|
obj.roles.grant role1, role2, role3, role4
|
25
|
-
obj.
|
26
|
+
obj.set_desc_metadata_values(:category, "Category Facet")
|
27
|
+
obj.set_desc_metadata_values(:company, "Company Facet")
|
28
|
+
obj.set_desc_metadata_values(:folder, "Folder Facet")
|
29
|
+
obj.set_desc_metadata_values(:medium, "Medium Facet")
|
30
|
+
obj.set_desc_metadata_values(:placement_company, "Placement Company Facet")
|
31
|
+
obj.set_desc_metadata_values(:product, "Product Facet")
|
32
|
+
obj.set_desc_metadata_values(:publication, "Publication Facet")
|
33
|
+
obj.set_desc_metadata_values(:setting, "Setting Facet")
|
34
|
+
obj.set_desc_metadata_values(:tone, "Tone Facet")
|
26
35
|
end
|
27
36
|
|
37
|
+
its([Indexing::ACCESS_ROLE]) { is_expected.to eq(obj.roles.to_json) }
|
38
|
+
its([Indexing::ASPACE_ID]) { is_expected.to eq("aspace_dccea43034e1b8261e14cf999e86449d") }
|
39
|
+
its([Indexing::CATEGORY_FACET]) { is_expected.to eq(["Category Facet"]) }
|
40
|
+
its([Indexing::COMPANY_FACET]) { is_expected.to eq(["Company Facet"]) }
|
41
|
+
its([Indexing::DISPLAY_FORMAT]) { is_expected.to eq("Image") }
|
42
|
+
its([Indexing::DOI]) { is_expected.to eq(["http://doi.org/10.1000/182"]) }
|
43
|
+
its([Indexing::FOLDER_FACET]) { is_expected.to eq(["Folder Facet"]) }
|
28
44
|
its([Indexing::LICENSE]) { is_expected.to eq("cc-by-nc-nd-40") }
|
29
|
-
its([Indexing::LICENSE_TITLE]) { is_expected.to eq("License Title") }
|
30
45
|
its([Indexing::LICENSE_DESCRIPTION]) { is_expected.to eq("License Description") }
|
46
|
+
its([Indexing::LICENSE_TITLE]) { is_expected.to eq("License Title") }
|
31
47
|
its([Indexing::LICENSE_URL]) { is_expected.to eq("http://library.duke.edu") }
|
32
48
|
its([Indexing::LOCAL_ID]) { is_expected.to eq("foo") }
|
33
|
-
its([Indexing::
|
49
|
+
its([Indexing::MEDIUM_FACET]) { is_expected.to eq(["Medium Facet"]) }
|
34
50
|
its([Indexing::PERMANENT_ID]) { is_expected.to eq("ark:/99999/fk4zzz") }
|
35
51
|
its([Indexing::PERMANENT_URL]) { is_expected.to eq("http://id.library.duke.edu/ark:/99999/fk4zzz") }
|
36
|
-
its([Indexing::
|
37
|
-
its([Indexing::ACCESS_ROLE]) { is_expected.to eq(obj.roles.to_json) }
|
52
|
+
its([Indexing::PLACEMENT_COMPANY_FACET]) { is_expected.to eq(["Placement Company Facet"]) }
|
38
53
|
its([Indexing::POLICY_ROLE]) { is_expected.to contain_exactly(role2.agent.first, role3.agent.first, role4.agent.first) }
|
54
|
+
its([Indexing::PRODUCT_FACET]) { is_expected.to eq(["Product Facet"]) }
|
55
|
+
its([Indexing::PUBLICATION_FACET]) { is_expected.to eq(["Publication Facet"]) }
|
39
56
|
its([Indexing::RESOURCE_ROLE]) { is_expected.to contain_exactly(role1.agent.first) }
|
40
|
-
its([Indexing::
|
57
|
+
its([Indexing::SETTING_FACET]) { is_expected.to eq(["Setting Facet"]) }
|
58
|
+
its([Indexing::TONE_FACET]) { is_expected.to eq(["Tone Facet"]) }
|
41
59
|
end
|
42
60
|
|
43
61
|
describe "content-bearing object indexing" do
|
@@ -6,10 +6,43 @@ RSpec.shared_examples "a DDR model" do
|
|
6
6
|
it_behaves_like "an object that has a display title"
|
7
7
|
it_behaves_like "an object that has identifiers"
|
8
8
|
|
9
|
+
describe "notification on save" do
|
10
|
+
let(:events) { [] }
|
11
|
+
before {
|
12
|
+
@subscriber = ActiveSupport::Notifications.subscribe("save.#{described_class.to_s.underscore}") do |name, start, finish, id, payload|
|
13
|
+
events << payload
|
14
|
+
end
|
15
|
+
}
|
16
|
+
after {
|
17
|
+
ActiveSupport::Notifications.unsubscribe(@subscriber)
|
18
|
+
}
|
19
|
+
it "happens when save succeeds" do
|
20
|
+
subject.title = [ "My Title Changed" ]
|
21
|
+
subject.save
|
22
|
+
subject.title = [ "My Title Changed Again" ]
|
23
|
+
subject.save
|
24
|
+
expect(events.first[:changes]).to eq({"title"=>[[], ["My Title Changed"]]})
|
25
|
+
expect(events.first[:created]).to be true
|
26
|
+
expect(events.first[:pid]).to eq(subject.pid)
|
27
|
+
expect(events.last[:changes]).to eq({"title"=>[["My Title Changed"], ["My Title Changed Again"]]})
|
28
|
+
expect(events.last[:created]).to be false
|
29
|
+
expect(events.last[:pid]).to eq(subject.pid)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
9
33
|
describe "events" do
|
34
|
+
before {
|
35
|
+
subject.permanent_id = "ark:/99999/fk4zzz"
|
36
|
+
subject.save(validate: false)
|
37
|
+
allow(Ddr::Jobs::PermanentId::MakeUnavailable).to receive(:perform) { nil }
|
38
|
+
}
|
39
|
+
describe "deaccession" do
|
40
|
+
it "creates a deaccession event" do
|
41
|
+
expect { subject.deaccession }.to change { Ddr::Events::DeaccessionEvent.for_object(subject).count }.by(1)
|
42
|
+
end
|
43
|
+
end
|
10
44
|
describe "on deletion with #destroy" do
|
11
|
-
|
12
|
-
it "should create a deletion event" do
|
45
|
+
it "creates a deletion event" do
|
13
46
|
expect { subject.destroy }.to change { Ddr::Events::DeletionEvent.for_object(subject).count }.from(0).to(1)
|
14
47
|
end
|
15
48
|
end
|
@@ -38,7 +71,7 @@ RSpec.shared_examples "a DDR model" do
|
|
38
71
|
context "one desc metadata identifier" do
|
39
72
|
before { subject.identifier = Array(identifiers.first) }
|
40
73
|
context "local id not present" do
|
41
|
-
it "
|
74
|
+
it "sets the local id and removes the identifier" do
|
42
75
|
result = subject.move_first_identifier_to_local_id
|
43
76
|
expect(result).to be true
|
44
77
|
expect(subject.local_id).to eq(identifiers.first)
|
@@ -48,7 +81,7 @@ RSpec.shared_examples "a DDR model" do
|
|
48
81
|
context "local id present" do
|
49
82
|
before { subject.local_id = local_id }
|
50
83
|
context "replace option is true" do
|
51
|
-
it "
|
84
|
+
it "sets the local id and removes the identifier" do
|
52
85
|
result = subject.move_first_identifier_to_local_id
|
53
86
|
expect(result).to be true
|
54
87
|
expect(subject.local_id).to eq(identifiers.first)
|
@@ -58,7 +91,7 @@ RSpec.shared_examples "a DDR model" do
|
|
58
91
|
context "replace option is false" do
|
59
92
|
context "local id matches first identifier" do
|
60
93
|
before { subject.identifier = Array(local_id) }
|
61
|
-
it "
|
94
|
+
it "removes the identifier" do
|
62
95
|
result = subject.move_first_identifier_to_local_id(replace: false)
|
63
96
|
expect(result).to be true
|
64
97
|
expect(subject.local_id).to eq(local_id)
|
@@ -66,7 +99,7 @@ RSpec.shared_examples "a DDR model" do
|
|
66
99
|
end
|
67
100
|
end
|
68
101
|
context "local id does not match first identifier" do
|
69
|
-
it "
|
102
|
+
it "does not change the local id and does not remove the identifier" do
|
70
103
|
result = subject.move_first_identifier_to_local_id(replace: false)
|
71
104
|
expect(result).to be false
|
72
105
|
expect(subject.local_id).to eq(local_id)
|
@@ -79,7 +112,7 @@ RSpec.shared_examples "a DDR model" do
|
|
79
112
|
context "more than one desc metadata identifer" do
|
80
113
|
before { subject.identifier = identifiers }
|
81
114
|
context "local id not present" do
|
82
|
-
it "
|
115
|
+
it "sets the local id and removes the identifier" do
|
83
116
|
result = subject.move_first_identifier_to_local_id
|
84
117
|
expect(result).to be true
|
85
118
|
expect(subject.local_id).to eq(identifiers.first)
|
@@ -89,7 +122,7 @@ RSpec.shared_examples "a DDR model" do
|
|
89
122
|
context "local id present" do
|
90
123
|
before { subject.local_id = local_id }
|
91
124
|
context "replace option is true" do
|
92
|
-
it "
|
125
|
+
it "sets the local id and removes the identifier" do
|
93
126
|
result = subject.move_first_identifier_to_local_id
|
94
127
|
expect(result).to be true
|
95
128
|
expect(subject.local_id).to eq(identifiers.first)
|
@@ -99,7 +132,7 @@ RSpec.shared_examples "a DDR model" do
|
|
99
132
|
context "replace option is false" do
|
100
133
|
context "local id matches first identifier" do
|
101
134
|
before { subject.identifier = [ local_id, identifiers.last ] }
|
102
|
-
it "
|
135
|
+
it "removes the identifier" do
|
103
136
|
result = subject.move_first_identifier_to_local_id(replace: false)
|
104
137
|
expect(result).to be true
|
105
138
|
expect(subject.local_id).to eq(local_id)
|
@@ -107,7 +140,7 @@ RSpec.shared_examples "a DDR model" do
|
|
107
140
|
end
|
108
141
|
end
|
109
142
|
context "local id does not match first identifier" do
|
110
|
-
it "
|
143
|
+
it "does not change the local id and does not remove the identifier" do
|
111
144
|
result = subject.move_first_identifier_to_local_id(replace: false)
|
112
145
|
expect(result).to be false
|
113
146
|
expect(subject.local_id).to eq(local_id)
|
@@ -3,8 +3,34 @@ RSpec.shared_examples "a non-collection model" do
|
|
3
3
|
subject { described_class.new }
|
4
4
|
let(:user) { FactoryGirl.build(:user) }
|
5
5
|
before { subject.grant_roles_to_creator(user) }
|
6
|
-
it "
|
6
|
+
it "includes the Editor role in resource scope" do
|
7
7
|
expect(subject.roles.to_a).to eq([Ddr::Auth::Roles::Role.build(type: "Editor", agent: user.agent, scope: "resource")])
|
8
8
|
end
|
9
9
|
end
|
10
|
+
|
11
|
+
describe "admin set" do
|
12
|
+
subject { described_class.new }
|
13
|
+
let(:collection) { FactoryGirl.build(:collection) }
|
14
|
+
let(:admin_set) { Ddr::Models::AdminSet.new(code: "foobar", title: "FooBar") }
|
15
|
+
before {
|
16
|
+
allow(Ddr::Models::AdminSet).to receive(:find_by_code).with("foobar") { admin_set }
|
17
|
+
collection.admin_set = "foobar"
|
18
|
+
collection.save!
|
19
|
+
subject.admin_policy = collection
|
20
|
+
}
|
21
|
+
it "indexes the admin set title" do
|
22
|
+
expect(subject.to_solr[Ddr::Index::Fields::ADMIN_SET_TITLE]).to eq("FooBar")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "collection title" do
|
27
|
+
subject { described_class.new }
|
28
|
+
let(:collection) { FactoryGirl.create(:collection) }
|
29
|
+
before {
|
30
|
+
subject.admin_policy = collection
|
31
|
+
}
|
32
|
+
it "indexes the collection title" do
|
33
|
+
expect(subject.to_solr[Ddr::Index::Fields::COLLECTION_TITLE]).to eq("Test Collection")
|
34
|
+
end
|
35
|
+
end
|
10
36
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddr-models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Coble
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-10-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -396,6 +396,7 @@ files:
|
|
396
396
|
- db/migrate/20150130134416_add_user_key_to_events.rb
|
397
397
|
- db/migrate/20150710211530_change_events_exception_to_text.rb
|
398
398
|
- db/migrate/20150713171838_add_limit_to_events_exception.rb
|
399
|
+
- db/migrate/20161021201011_add_permanent_id_to_events.rb
|
399
400
|
- ddr-models.gemspec
|
400
401
|
- lib/ddr-models.rb
|
401
402
|
- lib/ddr/actions.rb
|
@@ -468,6 +469,7 @@ files:
|
|
468
469
|
- lib/ddr/derivatives/ptif_generator.rb
|
469
470
|
- lib/ddr/events.rb
|
470
471
|
- lib/ddr/events/creation_event.rb
|
472
|
+
- lib/ddr/events/deaccession_event.rb
|
471
473
|
- lib/ddr/events/deletion_event.rb
|
472
474
|
- lib/ddr/events/event.rb
|
473
475
|
- lib/ddr/events/fixity_check_event.rb
|
@@ -721,9 +723,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
721
723
|
version: '0'
|
722
724
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
723
725
|
requirements:
|
724
|
-
- - "
|
726
|
+
- - ">"
|
725
727
|
- !ruby/object:Gem::Version
|
726
|
-
version:
|
728
|
+
version: 1.3.1
|
727
729
|
requirements: []
|
728
730
|
rubyforge_project:
|
729
731
|
rubygems_version: 2.4.3
|