ddr-models 2.4.16 → 2.5.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|