ddr-models 3.0.0.beta.7 → 3.0.0.beta.8
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/.gitignore +1 -0
- data/README.md +0 -2
- data/config/fedora.yml +15 -0
- data/config/initializers/subscriptions.rb +1 -0
- data/config/solr.yml +6 -0
- data/ddr-models.gemspec +1 -1
- data/lib/ddr/datastreams.rb +27 -20
- data/lib/ddr/datastreams/fits_datastream.rb +1 -5
- data/lib/ddr/events/event.rb +3 -1
- data/lib/ddr/index/query_builder.rb +0 -17
- data/lib/ddr/jobs.rb +1 -0
- data/lib/ddr/jobs/delete_multires_image.rb +21 -0
- data/lib/ddr/models.rb +8 -11
- data/lib/ddr/models/auto_version.rb +13 -0
- data/lib/ddr/models/base.rb +6 -1
- data/lib/ddr/{datastreams/datastream_behavior.rb → models/file.rb} +14 -13
- data/lib/ddr/models/files/fits_xml_file.rb +85 -0
- data/lib/ddr/models/files/structural_metadata_file.rb +9 -0
- data/lib/ddr/models/has_content.rb +3 -3
- data/lib/ddr/models/has_multires_image.rb +9 -7
- data/lib/ddr/models/has_thumbnail.rb +15 -17
- data/lib/ddr/models/solr_document.rb +3 -3
- data/lib/ddr/models/version.rb +1 -1
- data/lib/ddr/models/versionable.rb +12 -0
- data/lib/ddr/models/with_content_file.rb +3 -3
- data/spec/dummy/config/fedora.yml +15 -0
- data/spec/dummy/config/solr.yml +6 -0
- data/spec/models/{active_fedora_datastream_spec.rb → file_spec.rb} +33 -8
- data/spec/models/has_multires_image_spec.rb +23 -0
- data/spec/models/with_content_file_spec.rb +4 -4
- data/spec/support/shared_examples_for_ddr_models.rb +20 -0
- metadata +20 -11
- data/config/initializers/active_fedora_file.rb +0 -5
- data/lib/ddr/datastreams/metadata_datastream.rb +0 -44
- data/lib/ddr/datastreams/plain_text_datastream.rb +0 -9
- data/lib/ddr/datastreams/structural_metadata_datastream.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9040fdb0b6cda2736d299291211c5a4dde620d7
|
4
|
+
data.tar.gz: 42b318beb27882963fc49a4d1278cb94e1116851
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54f897c2bd20fe04d9877aa5e7b761fe3a29896128009d03d2cf2b80ab3cca5761cfac041bf11043e2fff9cf879f0bfdd714eb72a4355a934876f76c00a33515
|
7
|
+
data.tar.gz: 8a7a65a4d731561e19baf8b19439bffd467d0ec02cfcf68951af458c4645e1238b04aee7b8497ce2f16d1d015423cf6dc8e99776b5f431d94fdf44ae3ce71332
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -4,8 +4,6 @@ A Rails engine providing Hydra and ActiveRecord models and common services for t
|
|
4
4
|
|
5
5
|
[](http://badge.fury.io/rb/ddr-models)
|
6
6
|
[](https://travis-ci.org/duke-libraries/ddr-models)
|
7
|
-
[](https://coveralls.io/r/duke-libraries/ddr-models?branch=develop)
|
8
|
-
[](https://codeclimate.com/github/duke-libraries/ddr-models)
|
9
7
|
|
10
8
|
## Installation
|
11
9
|
|
data/config/fedora.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
development:
|
2
|
+
user: fedoraAdmin
|
3
|
+
password: fedoraAdmin
|
4
|
+
url: http://127.0.0.1:8983/fedora/rest
|
5
|
+
base_path: /dev
|
6
|
+
test:
|
7
|
+
user: fedoraAdmin
|
8
|
+
password: fedoraAdmin
|
9
|
+
url: http://127.0.0.1:8983/fedora/rest
|
10
|
+
base_path: /test
|
11
|
+
production:
|
12
|
+
user: fedoraAdmin
|
13
|
+
password: fedoraAdmin
|
14
|
+
url: http://127.0.0.1:8080/fedora/rest
|
15
|
+
base_path: /prod
|
@@ -16,3 +16,4 @@ 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(Ddr::Notifications::DELETION, Ddr::Jobs::DeleteMultiresImage)
|
data/config/solr.yml
ADDED
data/ddr-models.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_dependency "rails", "~> 4.1.13"
|
22
22
|
s.add_dependency "activeresource"
|
23
23
|
s.add_dependency "active-triples", "~> 0.7.2"
|
24
|
-
s.add_dependency "active-fedora", "~> 9.
|
24
|
+
s.add_dependency "active-fedora", "~> 9.8.1"
|
25
25
|
s.add_dependency "hydra-validations", "~> 0.5"
|
26
26
|
s.add_dependency "devise", "~> 3.4"
|
27
27
|
s.add_dependency "omniauth-shibboleth", "~> 1.2.0"
|
data/lib/ddr/datastreams.rb
CHANGED
@@ -1,34 +1,41 @@
|
|
1
|
-
require 'active_fedora'
|
2
|
-
|
3
1
|
module Ddr
|
4
2
|
module Datastreams
|
5
3
|
extend ActiveSupport::Autoload
|
4
|
+
extend Deprecation
|
6
5
|
|
7
|
-
CONTENT
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
RELS_EXT = "RELS-EXT"
|
14
|
-
RIGHTS_METADATA = "rightsMetadata"
|
15
|
-
STRUCT_METADATA = "structMetadata"
|
16
|
-
THUMBNAIL = "thumbnail"
|
6
|
+
CONTENT = "content".freeze
|
7
|
+
DESC_METADATA = "descMetadata".freeze
|
8
|
+
EXTRACTED_TEXT = "extractedText".freeze
|
9
|
+
FITS = "fits".freeze
|
10
|
+
STRUCT_METADATA = "structMetadata".freeze
|
11
|
+
THUMBNAIL = "thumbnail".freeze
|
17
12
|
|
18
|
-
CHECKSUM_TYPE_MD5
|
19
|
-
CHECKSUM_TYPE_SHA1
|
13
|
+
CHECKSUM_TYPE_MD5 = "MD5"
|
14
|
+
CHECKSUM_TYPE_SHA1 = "SHA-1"
|
20
15
|
CHECKSUM_TYPE_SHA256 = "SHA-256"
|
21
16
|
CHECKSUM_TYPE_SHA384 = "SHA-384"
|
22
17
|
CHECKSUM_TYPE_SHA512 = "SHA-512"
|
23
18
|
|
24
19
|
CHECKSUM_TYPES = [ CHECKSUM_TYPE_MD5, CHECKSUM_TYPE_SHA1, CHECKSUM_TYPE_SHA256, CHECKSUM_TYPE_SHA384, CHECKSUM_TYPE_SHA512 ]
|
25
20
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
def self.const_missing(name)
|
22
|
+
case name
|
23
|
+
when :FitsDatastream
|
24
|
+
Deprecation.warn(self, "Ddr::Datastreams::FitsDatastream is deprecated." \
|
25
|
+
" Use Ddr::Models::FitsXmlFile instead.")
|
26
|
+
Ddr::Models::FitsXmlFile
|
27
|
+
when :StructuralMetadataDatastream
|
28
|
+
Deprecation.warn(self, "Ddr::Datastreams::StructuralMetadataDatastream is deprecated." \
|
29
|
+
" Use Ddr::Models::StructuralMetadataFile instead.")
|
30
|
+
Ddr::Models::StructuralMetadataFile
|
31
|
+
when :PlainTextDatastream
|
32
|
+
Deprecation.warn(self, "Ddr::Datastreams::PlainTextDatastream is deprecated." \
|
33
|
+
" Use Ddr::Models::File instead.")
|
34
|
+
Ddr::Models::File
|
35
|
+
else
|
36
|
+
super
|
37
|
+
end
|
38
|
+
end
|
32
39
|
|
33
40
|
end
|
34
41
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module Ddr::Datastreams
|
2
2
|
class FitsDatastream < ActiveFedora::OmDatastream
|
3
|
+
extend AutoVersion
|
3
4
|
|
4
5
|
FITS_XMLNS = "http://hul.harvard.edu/ois/xml/ns/fits/fits_output".freeze
|
5
6
|
FITS_SCHEMA = "http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd".freeze
|
@@ -74,11 +75,6 @@ module Ddr::Datastreams
|
|
74
75
|
builder.doc
|
75
76
|
end
|
76
77
|
|
77
|
-
# TODO fix or remove
|
78
|
-
# def prefix
|
79
|
-
# "fits__"
|
80
|
-
# end
|
81
|
-
|
82
78
|
def modified
|
83
79
|
ng_xml
|
84
80
|
.xpath("//fits:fileinfo/fits:lastmodified[@toolname != '#{EXIFTOOL}']", fits: FITS_XMLNS)
|
data/lib/ddr/events/event.rb
CHANGED
@@ -39,7 +39,9 @@ module Ddr
|
|
39
39
|
# Receive message sent by ActiveSupport::Notifications
|
40
40
|
def self.call(*args)
|
41
41
|
notification = ActiveSupport::Notifications::Event.new(*args)
|
42
|
-
|
42
|
+
evt = new
|
43
|
+
attrs = notification.payload.dup.keep_if { |k, v| evt.has_attribute?(k) }
|
44
|
+
evt.update(attrs)
|
43
45
|
end
|
44
46
|
|
45
47
|
# Scopes
|
@@ -91,18 +91,6 @@ module Ddr::Index
|
|
91
91
|
#
|
92
92
|
class QueryBuilder
|
93
93
|
|
94
|
-
# Builds a Query object
|
95
|
-
# @yield [builder] a new QueryBuilder instance.
|
96
|
-
# @return [Query]
|
97
|
-
def self.build
|
98
|
-
Deprecation.warn(self,
|
99
|
-
"`Ddr::Index::QueryBuilder.build` is deprecated and will be removed in ddr-models 3.0." \
|
100
|
-
" Use `Ddr::Index::QueryBuilder.new` instead.")
|
101
|
-
builder = new
|
102
|
-
yield builder
|
103
|
-
builder.query
|
104
|
-
end
|
105
|
-
|
106
94
|
attr_reader :query
|
107
95
|
|
108
96
|
def initialize(query = nil, &block)
|
@@ -146,11 +134,6 @@ module Ddr::Index
|
|
146
134
|
# @param orderings [Hash<Field, String>]
|
147
135
|
# @return [QueryBuilder] self
|
148
136
|
def order_by(*orderings)
|
149
|
-
unless orderings.first.is_a? Hash
|
150
|
-
Deprecation.warn(QueryBuilder, "`order_by` will require a hash of orderings in ddr-models 3.0.")
|
151
|
-
field, order = orderings
|
152
|
-
return order_by(field => order)
|
153
|
-
end
|
154
137
|
query.sort += orderings.first.map { |field, order| SortOrder.new(field: field, order: order) }
|
155
138
|
self
|
156
139
|
end
|
data/lib/ddr/jobs.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Ddr::Jobs
|
2
|
+
class DeleteMultiresImage
|
3
|
+
extend Job
|
4
|
+
|
5
|
+
@queue = :general
|
6
|
+
|
7
|
+
def self.call(*args)
|
8
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
9
|
+
if event.name == Ddr::Notifications::DELETION &&
|
10
|
+
file_uri = event.payload[:multires_image_file_path]
|
11
|
+
Resque.enqueue(self, file_uri)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.perform(file_uri)
|
16
|
+
path = Ddr::Utils.path_from_uri(file_uri)
|
17
|
+
File.unlink(path)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
data/lib/ddr/models.rb
CHANGED
@@ -7,7 +7,6 @@ require 'hydra/validations'
|
|
7
7
|
|
8
8
|
module Ddr
|
9
9
|
extend ActiveSupport::Autoload
|
10
|
-
extend Deprecation
|
11
10
|
|
12
11
|
autoload :Actions
|
13
12
|
autoload :Auth
|
@@ -22,22 +21,13 @@ module Ddr
|
|
22
21
|
autoload :Utils
|
23
22
|
autoload :Vocab
|
24
23
|
|
25
|
-
def self.const_missing(name)
|
26
|
-
if name == :IndexFields
|
27
|
-
Deprecation.warn(Ddr::Models, "`Ddr::IndexFields` is deprecated and will be removed in ddr-models 3.0." \
|
28
|
-
" Use `Ddr::Index::Fields` instead.")
|
29
|
-
Index::Fields
|
30
|
-
else
|
31
|
-
super
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
24
|
module Models
|
36
25
|
extend ActiveSupport::Autoload
|
37
26
|
|
38
27
|
autoload :AdminSet
|
39
28
|
autoload :AttachedFileProfile
|
40
29
|
autoload :AttachedFilesProfile
|
30
|
+
autoload :AutoVersion
|
41
31
|
autoload :Base
|
42
32
|
autoload :ChecksumInvalid, 'ddr/models/error'
|
43
33
|
autoload :Contact
|
@@ -45,6 +35,7 @@ module Ddr
|
|
45
35
|
autoload :DerivativeGenerationFailure, 'ddr/models/error'
|
46
36
|
autoload :Error
|
47
37
|
autoload :EventLoggable
|
38
|
+
autoload :File
|
48
39
|
autoload :FileCharacterization
|
49
40
|
autoload :FileManagement
|
50
41
|
autoload :FindingAid
|
@@ -66,9 +57,15 @@ module Ddr
|
|
66
57
|
autoload :UrlSafeId
|
67
58
|
autoload :Validatable
|
68
59
|
autoload :Validator
|
60
|
+
autoload :Versionable
|
69
61
|
autoload :WithContentFile
|
70
62
|
autoload :YearFacet
|
71
63
|
|
64
|
+
autoload_under "files" do
|
65
|
+
autoload :FitsXmlFile
|
66
|
+
autoload :StructuralMetadataFile
|
67
|
+
end
|
68
|
+
|
72
69
|
autoload_under "licenses" do
|
73
70
|
autoload :AdminPolicyLicense
|
74
71
|
autoload :EffectiveLicense
|
data/lib/ddr/models/base.rb
CHANGED
@@ -11,9 +11,10 @@ module Ddr::Models
|
|
11
11
|
include Indexing
|
12
12
|
include Hydra::Validations
|
13
13
|
include HasAdminMetadata
|
14
|
+
extend AutoVersion
|
14
15
|
|
15
16
|
after_destroy do
|
16
|
-
notify_event
|
17
|
+
notify_event(:deletion, deletion_event_payload)
|
17
18
|
end
|
18
19
|
|
19
20
|
DescriptiveMetadata.mapping.each do |name, term|
|
@@ -115,5 +116,9 @@ module Ddr::Models
|
|
115
116
|
self
|
116
117
|
end
|
117
118
|
|
119
|
+
def deletion_event_payload
|
120
|
+
{}
|
121
|
+
end
|
122
|
+
|
118
123
|
end
|
119
124
|
end
|
@@ -1,28 +1,29 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
module Ddr::Models
|
4
|
+
class File < ActiveFedora::File
|
5
|
+
extend AutoVersion
|
3
6
|
extend Deprecation
|
4
7
|
|
5
8
|
DEFAULT_FILE_EXTENSION = "bin"
|
6
9
|
STRFTIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%LZ"
|
7
10
|
|
8
11
|
def dsid
|
9
|
-
Deprecation.warn(
|
10
|
-
"`dsid` is no longer a datastream/file method. Use `File.basename(id)`.")
|
12
|
+
Deprecation.warn(File, "`dsid` is no longer a file method. Use `::File.basename(id)`.")
|
11
13
|
if id
|
12
14
|
::File.basename(id)
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
16
18
|
def dsCreateDate
|
17
|
-
Deprecation.warn(
|
18
|
-
"`dsCreateDate` is no longer a datastream/file method. Use `create_date` instead.")
|
19
|
+
Deprecation.warn(File, "`dsCreateDate` is no longer a file method. Use `create_date` instead.")
|
19
20
|
create_date
|
20
21
|
end
|
21
22
|
|
22
23
|
def validate_checksum!(checksum_value, checksum_type=nil)
|
23
|
-
raise
|
24
|
-
raise
|
25
|
-
raise
|
24
|
+
raise Error, "Checksum cannot be validated on new file." if new_record?
|
25
|
+
raise Error, "Checksum cannot be validated on unpersisted content." if content_changed?
|
26
|
+
raise ChecksumInvalid, "The repository internal checksum validation failed." unless check_fixity
|
26
27
|
algorithm = checksum_type || checksum.algorithm
|
27
28
|
calculated_checksum = if algorithm == checksum.algorithm
|
28
29
|
checksum.value
|
@@ -30,9 +31,9 @@ module Ddr::Datastreams
|
|
30
31
|
content_digest(algorithm)
|
31
32
|
end
|
32
33
|
if checksum_value == calculated_checksum
|
33
|
-
"The checksum #{algorithm}:#{checksum_value} is valid for
|
34
|
+
"The checksum #{algorithm}:#{checksum_value} is valid for file #{dsid}."
|
34
35
|
else
|
35
|
-
raise
|
36
|
+
raise ChecksumInvalid, "The checksum #{algorithm}:#{checksum_value} is not valid for file #{dsid}."
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
@@ -44,7 +45,7 @@ module Ddr::Datastreams
|
|
44
45
|
Ddr::Utils.digest(content, algorithm)
|
45
46
|
end
|
46
47
|
|
47
|
-
# Return default file extension for
|
48
|
+
# Return default file extension for file based on MIME type
|
48
49
|
def default_file_extension
|
49
50
|
mimetypes = MIME::Types[mime_type]
|
50
51
|
return mimetypes.first.extensions.first unless mimetypes.empty?
|
@@ -67,7 +68,7 @@ module Ddr::Datastreams
|
|
67
68
|
|
68
69
|
def tempfile(prefix: nil, suffix: nil)
|
69
70
|
if empty?
|
70
|
-
raise
|
71
|
+
raise Error, "Refusing to create tempfile for empty file!"
|
71
72
|
end
|
72
73
|
prefix ||= default_file_prefix + "--"
|
73
74
|
suffix ||= "." + default_file_extension
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Ddr::Models
|
2
|
+
class FitsXmlFile < ActiveFedora::OmDatastream
|
3
|
+
extend AutoVersion
|
4
|
+
|
5
|
+
FITS_XMLNS = "http://hul.harvard.edu/ois/xml/ns/fits/fits_output".freeze
|
6
|
+
FITS_SCHEMA = "http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd".freeze
|
7
|
+
|
8
|
+
EXIFTOOL = "Exiftool"
|
9
|
+
|
10
|
+
set_terminology do |t|
|
11
|
+
t.root(path: "fits",
|
12
|
+
xmlns: FITS_XMLNS,
|
13
|
+
schema: FITS_SCHEMA)
|
14
|
+
t.version(path: {attribute: "version"})
|
15
|
+
t.timestamp(path: {attribute: "timestamp"})
|
16
|
+
t.identification {
|
17
|
+
t.identity {
|
18
|
+
t.mimetype(path: {attribute: "mimetype"})
|
19
|
+
t.format_label(path: {attribute: "format"})
|
20
|
+
t.version
|
21
|
+
t.externalIdentifier
|
22
|
+
t.pronom_identifier(path: "externalIdentifier", attributes: {type: "puid"})
|
23
|
+
}
|
24
|
+
}
|
25
|
+
t.fileinfo {
|
26
|
+
t.size
|
27
|
+
t.creatingApplicationName
|
28
|
+
t.created
|
29
|
+
t.lastmodified
|
30
|
+
}
|
31
|
+
t.filestatus {
|
32
|
+
t.valid
|
33
|
+
t.well_formed(path: "well-formed")
|
34
|
+
}
|
35
|
+
t.metadata {
|
36
|
+
t.image {
|
37
|
+
t.imageWidth
|
38
|
+
t.imageHeight
|
39
|
+
t.colorSpace
|
40
|
+
}
|
41
|
+
t.document {
|
42
|
+
# TODO - configure to get from Tika?
|
43
|
+
# t.encoding
|
44
|
+
}
|
45
|
+
t.text
|
46
|
+
t.audio
|
47
|
+
t.video
|
48
|
+
}
|
49
|
+
|
50
|
+
## proxy terms
|
51
|
+
# identification / identity
|
52
|
+
t.media_type proxy: [:identification, :identity, :mimetype]
|
53
|
+
t.format_label proxy: [:identification, :identity, :format_label]
|
54
|
+
t.format_version proxy: [:identification, :identity, :version]
|
55
|
+
t.pronom_identifier proxy: [:identification, :identity, :pronom_identifier]
|
56
|
+
# filestatus
|
57
|
+
t.valid proxy: [:filestatus, :valid]
|
58
|
+
t.well_formed proxy: [:filestatus, :well_formed]
|
59
|
+
# fileinfo
|
60
|
+
t.created proxy: [:fileinfo, :created]
|
61
|
+
t.creating_application proxy: [:fileinfo, :creatingApplicationName]
|
62
|
+
t.extent proxy: [:fileinfo, :size]
|
63
|
+
# image metadata
|
64
|
+
t.image_width proxy: [:metadata, :image, :imageWidth]
|
65
|
+
t.image_height proxy: [:metadata, :image, :imageHeight]
|
66
|
+
t.color_space proxy: [:metadata, :image, :colorSpace]
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.xml_template
|
70
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
71
|
+
xml.fits("xmlns"=>FITS_XMLNS,
|
72
|
+
"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
|
73
|
+
"xsi:schemaLocation"=>"http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd")
|
74
|
+
end
|
75
|
+
builder.doc
|
76
|
+
end
|
77
|
+
|
78
|
+
def modified
|
79
|
+
ng_xml
|
80
|
+
.xpath("//fits:fileinfo/fits:lastmodified[@toolname != '#{EXIFTOOL}']", fits: FITS_XMLNS)
|
81
|
+
.map(&:text)
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -5,9 +5,9 @@ module Ddr
|
|
5
5
|
extend Deprecation
|
6
6
|
|
7
7
|
included do
|
8
|
-
contains Ddr::Datastreams::CONTENT
|
9
|
-
contains Ddr::Datastreams::EXTRACTED_TEXT, class_name: 'Ddr::
|
10
|
-
contains Ddr::Datastreams::FITS, class_name: 'Ddr::
|
8
|
+
contains Ddr::Datastreams::CONTENT, class_name: 'Ddr::Models::File'
|
9
|
+
contains Ddr::Datastreams::EXTRACTED_TEXT, class_name: 'Ddr::Models::File'
|
10
|
+
contains Ddr::Datastreams::FITS, class_name: 'Ddr::Models::FitsXmlFile'
|
11
11
|
|
12
12
|
property :legacy_original_filename,
|
13
13
|
predicate: RDF::Vocab::PREMIS.hasOriginalName,
|
@@ -1,12 +1,14 @@
|
|
1
|
-
module Ddr
|
2
|
-
module
|
3
|
-
|
4
|
-
extend ActiveSupport::Concern
|
1
|
+
module Ddr::Models
|
2
|
+
module HasMultiresImage
|
3
|
+
extend ActiveSupport::Concern
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
included do
|
6
|
+
property :multires_image_file_path, predicate: Ddr::Vocab::Asset.multiresImageFilePath, multiple: false
|
7
|
+
end
|
9
8
|
|
9
|
+
def deletion_event_payload
|
10
|
+
super.merge(multires_image_file_path: multires_image_file_path)
|
10
11
|
end
|
12
|
+
|
11
13
|
end
|
12
14
|
end
|
@@ -1,24 +1,22 @@
|
|
1
|
-
module Ddr
|
2
|
-
module
|
3
|
-
|
4
|
-
extend ActiveSupport::Concern
|
1
|
+
module Ddr::Models
|
2
|
+
module HasThumbnail
|
3
|
+
extend ActiveSupport::Concern
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
included do
|
6
|
+
contains Ddr::Datastreams::THUMBNAIL, class_name: "Ddr::Models::File"
|
7
|
+
end
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
def thumbnail_changed?
|
10
|
+
thumbnail.content_changed?
|
11
|
+
end
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
thumbnail_changed?
|
13
|
+
def copy_thumbnail_from(other)
|
14
|
+
if other && other.has_thumbnail?
|
15
|
+
self.thumbnail.content = other.thumbnail.content
|
16
|
+
self.thumbnail.mimeType = other.thumbnail.mimeType if thumbnail_changed?
|
20
17
|
end
|
21
|
-
|
18
|
+
thumbnail_changed?
|
22
19
|
end
|
20
|
+
|
23
21
|
end
|
24
22
|
end
|
@@ -9,12 +9,12 @@ module Ddr::Models
|
|
9
9
|
class NotFound < Error; end
|
10
10
|
|
11
11
|
module ClassMethods
|
12
|
-
def find(
|
13
|
-
query = Ddr::Index::
|
12
|
+
def find(doc_id)
|
13
|
+
query = Ddr::Index::Query.new { id doc_id }
|
14
14
|
if doc = query.docs.first
|
15
15
|
return doc
|
16
16
|
end
|
17
|
-
raise NotFound, "SolrDocument not found for \"#{
|
17
|
+
raise NotFound, "SolrDocument not found for \"#{doc_id}\"."
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
data/lib/ddr/models/version.rb
CHANGED
@@ -13,7 +13,7 @@ module Ddr::Models
|
|
13
13
|
# @yield [String] the path to the tempfile containing content
|
14
14
|
def with_temp_file
|
15
15
|
filename = original_filename || content.default_file_name
|
16
|
-
basename = [ File.basename(filename, ".*"), File.extname(filename) ]
|
16
|
+
basename = [ ::File.basename(filename, ".*"), ::File.extname(filename) ]
|
17
17
|
infile = Tempfile.open(basename, Ddr::Models.tempdir, encoding: 'ascii-8bit')
|
18
18
|
begin
|
19
19
|
infile.write(content.content)
|
@@ -22,12 +22,12 @@ module Ddr::Models
|
|
22
22
|
yield infile.path
|
23
23
|
ensure
|
24
24
|
infile.close unless infile.closed?
|
25
|
-
File.unlink(infile)
|
25
|
+
::File.unlink(infile)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
def verify_checksum!(file)
|
30
|
-
digest = Ddr::Utils.digest(File.read(file), content.checksum.algorithm)
|
30
|
+
digest = Ddr::Utils.digest(::File.read(file), content.checksum.algorithm)
|
31
31
|
if digest != content.checksum.value
|
32
32
|
raise ChecksumInvalid, "The checksum of the downloaded file does not match the stored checksum of the content."
|
33
33
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
development:
|
2
|
+
user: fedoraAdmin
|
3
|
+
password: fedoraAdmin
|
4
|
+
url: http://127.0.0.1:8983/fedora/rest
|
5
|
+
base_path: /dev
|
6
|
+
test:
|
7
|
+
user: fedoraAdmin
|
8
|
+
password: fedoraAdmin
|
9
|
+
url: http://127.0.0.1:8983/fedora/rest
|
10
|
+
base_path: /test
|
11
|
+
production:
|
12
|
+
user: fedoraAdmin
|
13
|
+
password: fedoraAdmin
|
14
|
+
url: http://127.0.0.1:8080/fedora/rest
|
15
|
+
base_path: /prod
|
@@ -1,12 +1,34 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
module
|
4
|
-
RSpec.describe
|
3
|
+
module Ddr::Models
|
4
|
+
RSpec.describe File do
|
5
|
+
|
6
|
+
describe "versioning" do
|
7
|
+
let(:obj) { FactoryGirl.build(:component) }
|
8
|
+
describe "on create" do
|
9
|
+
it "creates a version" do
|
10
|
+
expect { obj.save }.to change { obj.content.has_versions? }.from(false).to(true)
|
11
|
+
obj.save
|
12
|
+
expect(obj.content.versions.all.size).to eq 1
|
13
|
+
end
|
14
|
+
end
|
15
|
+
describe "on update" do
|
16
|
+
it "creates a version" do
|
17
|
+
obj.save
|
18
|
+
expect {
|
19
|
+
obj.upload fixture_file_upload("imageB.tif", "image/tiff")
|
20
|
+
obj.save
|
21
|
+
}.to change {
|
22
|
+
obj.content.versions.all.size
|
23
|
+
}.by(1)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
5
27
|
|
6
28
|
describe "#tempfile" do
|
7
29
|
describe "when the datastream has no content" do
|
8
30
|
it "should raise an exception" do
|
9
|
-
expect { subject.tempfile { |f| puts f.path } }.to raise_error(
|
31
|
+
expect { subject.tempfile { |f| puts f.path } }.to raise_error(Error)
|
10
32
|
end
|
11
33
|
end
|
12
34
|
describe "when the datastream has content" do
|
@@ -37,7 +59,8 @@ module ActiveFedora
|
|
37
59
|
it "should start with the id" do
|
38
60
|
allow(subject).to receive(:id) { "4f/78/97/71/4f789771-c663-466a-98a8-fd7c6fa0f452/foo" }
|
39
61
|
subject.tempfile do |f|
|
40
|
-
expect(::File.basename(f.path).start_with?("4f_78_97_71_4f789771-c663-466a-98a8-fd7c6fa0f452_foo--"))
|
62
|
+
expect(::File.basename(f.path).start_with?("4f_78_97_71_4f789771-c663-466a-98a8-fd7c6fa0f452_foo--"))
|
63
|
+
.to be true
|
41
64
|
end
|
42
65
|
end
|
43
66
|
end
|
@@ -66,13 +89,15 @@ module ActiveFedora
|
|
66
89
|
context "the datstream is new" do
|
67
90
|
before { allow(subject).to receive(:new_record?) { true } }
|
68
91
|
it "should raise an exception" do
|
69
|
-
expect { subject.validate_checksum!("bb3200c2ddaee4bd7b9a4dc1ad3e10ed886eaef1") }
|
92
|
+
expect { subject.validate_checksum!("bb3200c2ddaee4bd7b9a4dc1ad3e10ed886eaef1") }
|
93
|
+
.to raise_error(Error)
|
70
94
|
end
|
71
95
|
end
|
72
96
|
context "the datastream content has changed" do
|
73
97
|
before { allow(subject).to receive(:content_changed?) { true } }
|
74
98
|
it "should raise an exception" do
|
75
|
-
expect { subject.validate_checksum!("bb3200c2ddaee4bd7b9a4dc1ad3e10ed886eaef1") }
|
99
|
+
expect { subject.validate_checksum!("bb3200c2ddaee4bd7b9a4dc1ad3e10ed886eaef1") }
|
100
|
+
.to raise_error(Error)
|
76
101
|
end
|
77
102
|
end
|
78
103
|
end
|
@@ -86,7 +111,7 @@ module ActiveFedora
|
|
86
111
|
before { allow(subject).to receive(:check_fixity) { false } }
|
87
112
|
it "should raise an error" do
|
88
113
|
expect { subject.validate_checksum!(checksum.value, checksum.algorithm) }
|
89
|
-
.to raise_error(
|
114
|
+
.to raise_error(ChecksumInvalid)
|
90
115
|
end
|
91
116
|
end
|
92
117
|
context "and the repository internal checksum is valid" do
|
@@ -118,7 +143,7 @@ module ActiveFedora
|
|
118
143
|
context "and the checksum doesn't match" do
|
119
144
|
it "should raise an exception" do
|
120
145
|
expect { subject.validate_checksum!("0123456789abcdef", checksum.algorithm) }
|
121
|
-
.to raise_error(
|
146
|
+
.to raise_error(ChecksumInvalid)
|
122
147
|
end
|
123
148
|
end
|
124
149
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Ddr::Models
|
2
|
+
RSpec.describe HasMultiresImage do
|
3
|
+
|
4
|
+
subject { FactoryGirl.create(:component) }
|
5
|
+
|
6
|
+
describe "cleaning up multires image file after destroy" do
|
7
|
+
before {
|
8
|
+
@file = Tempfile.create('foo')
|
9
|
+
@path = @file.path
|
10
|
+
}
|
11
|
+
after {
|
12
|
+
::File.unlink(@path) if ::File.exist?(@path)
|
13
|
+
}
|
14
|
+
it "deletes the file" do
|
15
|
+
subject.multires_image_file_path = "file:#{@path}"
|
16
|
+
subject.save!
|
17
|
+
subject.destroy
|
18
|
+
expect(::File.exist?(@path)).to be false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -6,20 +6,20 @@ module Ddr::Models
|
|
6
6
|
it "yields a temp file path to the block and deletes the temp file afterwards" do
|
7
7
|
WithContentFile.new(obj) do |path|
|
8
8
|
@path = path
|
9
|
-
expect(File.exist?(path)).to be true
|
9
|
+
expect(::File.exist?(path)).to be true
|
10
10
|
end
|
11
|
-
expect(File.exist?(@path)).to be false
|
11
|
+
expect(::File.exist?(@path)).to be false
|
12
12
|
end
|
13
13
|
|
14
14
|
it "deletes the temp file even when an exception is raised in the block" do
|
15
15
|
begin
|
16
16
|
WithContentFile.new(obj) do |path|
|
17
17
|
@path = path
|
18
|
-
expect(File.exist?(path)).to be true
|
18
|
+
expect(::File.exist?(path)).to be true
|
19
19
|
raise Error, "error"
|
20
20
|
end
|
21
21
|
rescue Error
|
22
|
-
expect(File.exist?(@path)).to be false
|
22
|
+
expect(::File.exist?(@path)).to be false
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -22,4 +22,24 @@ RSpec.shared_examples "a DDR model" do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
describe "versioning" do
|
26
|
+
describe "on create" do
|
27
|
+
it "creates a version" do
|
28
|
+
expect { subject.save(validate: false) }
|
29
|
+
.to change(subject, :has_versions?).from(false).to(true)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
describe "on update" do
|
33
|
+
before { subject.save(validate: false) }
|
34
|
+
it "creates a version" do
|
35
|
+
expect {
|
36
|
+
subject.dc_title = ["Changed Title"]
|
37
|
+
subject.save(validate: false)
|
38
|
+
}.to change {
|
39
|
+
subject.versions.all.size
|
40
|
+
}.by(1)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
25
45
|
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: 3.0.0.beta.
|
4
|
+
version: 3.0.0.beta.8
|
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-02-
|
12
|
+
date: 2016-02-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -59,14 +59,14 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 9.
|
62
|
+
version: 9.8.1
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 9.
|
69
|
+
version: 9.8.1
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: hydra-validations
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -399,12 +399,13 @@ files:
|
|
399
399
|
- app/views/devise/sessions/new.html.erb
|
400
400
|
- app/views/devise/shared/_links.erb
|
401
401
|
- bin/rails
|
402
|
+
- config/fedora.yml
|
402
403
|
- config/initializers/active_fedora_base.rb
|
403
|
-
- config/initializers/active_fedora_file.rb
|
404
404
|
- config/initializers/devise.rb
|
405
405
|
- config/initializers/subscriptions.rb
|
406
406
|
- config/locales/ddr-models.en.yml
|
407
407
|
- config/routes.rb
|
408
|
+
- config/solr.yml
|
408
409
|
- db/migrate/20141021233359_create_events.rb
|
409
410
|
- db/migrate/20141021234156_create_minted_ids.rb
|
410
411
|
- db/migrate/20141103192146_create_workflow_state.rb
|
@@ -468,12 +469,8 @@ files:
|
|
468
469
|
- lib/ddr/auth/user.rb
|
469
470
|
- lib/ddr/auth/web_auth_context.rb
|
470
471
|
- lib/ddr/datastreams.rb
|
471
|
-
- lib/ddr/datastreams/datastream_behavior.rb
|
472
472
|
- lib/ddr/datastreams/descriptive_metadata_datastream.rb
|
473
473
|
- lib/ddr/datastreams/fits_datastream.rb
|
474
|
-
- lib/ddr/datastreams/metadata_datastream.rb
|
475
|
-
- lib/ddr/datastreams/plain_text_datastream.rb
|
476
|
-
- lib/ddr/datastreams/structural_metadata_datastream.rb
|
477
474
|
- lib/ddr/derivatives.rb
|
478
475
|
- lib/ddr/derivatives/derivative.rb
|
479
476
|
- lib/ddr/derivatives/generators/generator.rb
|
@@ -513,6 +510,7 @@ files:
|
|
513
510
|
- lib/ddr/index/sort_order.rb
|
514
511
|
- lib/ddr/index/unique_key_field.rb
|
515
512
|
- lib/ddr/jobs.rb
|
513
|
+
- lib/ddr/jobs/delete_multires_image.rb
|
516
514
|
- lib/ddr/jobs/fits_file_characterization.rb
|
517
515
|
- lib/ddr/jobs/fixity_check.rb
|
518
516
|
- lib/ddr/jobs/job.rb
|
@@ -531,13 +529,17 @@ files:
|
|
531
529
|
- lib/ddr/models/admin_set.rb
|
532
530
|
- lib/ddr/models/attached_file_profile.rb
|
533
531
|
- lib/ddr/models/attached_files_profile.rb
|
532
|
+
- lib/ddr/models/auto_version.rb
|
534
533
|
- lib/ddr/models/base.rb
|
535
534
|
- lib/ddr/models/contact.rb
|
536
535
|
- lib/ddr/models/engine.rb
|
537
536
|
- lib/ddr/models/error.rb
|
538
537
|
- lib/ddr/models/event_loggable.rb
|
538
|
+
- lib/ddr/models/file.rb
|
539
539
|
- lib/ddr/models/file_characterization.rb
|
540
540
|
- lib/ddr/models/file_management.rb
|
541
|
+
- lib/ddr/models/files/fits_xml_file.rb
|
542
|
+
- lib/ddr/models/files/structural_metadata_file.rb
|
541
543
|
- lib/ddr/models/finding_aid.rb
|
542
544
|
- lib/ddr/models/fixity_checkable.rb
|
543
545
|
- lib/ddr/models/governable.rb
|
@@ -570,6 +572,7 @@ files:
|
|
570
572
|
- lib/ddr/models/validatable.rb
|
571
573
|
- lib/ddr/models/validator.rb
|
572
574
|
- lib/ddr/models/version.rb
|
575
|
+
- lib/ddr/models/versionable.rb
|
573
576
|
- lib/ddr/models/with_content_file.rb
|
574
577
|
- lib/ddr/models/year_facet.rb
|
575
578
|
- lib/ddr/notifications.rb
|
@@ -633,6 +636,7 @@ files:
|
|
633
636
|
- spec/dummy/config/environments/development.rb
|
634
637
|
- spec/dummy/config/environments/production.rb
|
635
638
|
- spec/dummy/config/environments/test.rb
|
639
|
+
- spec/dummy/config/fedora.yml
|
636
640
|
- spec/dummy/config/initializers/assets.rb
|
637
641
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
638
642
|
- spec/dummy/config/initializers/cookies_serializer.rb
|
@@ -644,6 +648,7 @@ files:
|
|
644
648
|
- spec/dummy/config/locales/en.yml
|
645
649
|
- spec/dummy/config/routes.rb
|
646
650
|
- spec/dummy/config/secrets.yml
|
651
|
+
- spec/dummy/config/solr.yml
|
647
652
|
- spec/dummy/db/schema.rb
|
648
653
|
- spec/dummy/lib/assets/.keep
|
649
654
|
- spec/dummy/log/.keep
|
@@ -688,7 +693,6 @@ files:
|
|
688
693
|
- spec/managers/derivatives_manager_spec.rb
|
689
694
|
- spec/managers/technical_metadata_manager_spec.rb
|
690
695
|
- spec/models/active_fedora_base_spec.rb
|
691
|
-
- spec/models/active_fedora_datastream_spec.rb
|
692
696
|
- spec/models/admin_set_spec.rb
|
693
697
|
- spec/models/attachment_spec.rb
|
694
698
|
- spec/models/collection_spec.rb
|
@@ -699,9 +703,11 @@ files:
|
|
699
703
|
- spec/models/events_spec.rb
|
700
704
|
- spec/models/file_characterization_spec.rb
|
701
705
|
- spec/models/file_management_spec.rb
|
706
|
+
- spec/models/file_spec.rb
|
702
707
|
- spec/models/finding_aid_spec.rb
|
703
708
|
- spec/models/has_admin_metadata_spec.rb
|
704
709
|
- spec/models/has_children_spec.rb
|
710
|
+
- spec/models/has_multires_image_spec.rb
|
705
711
|
- spec/models/has_struct_metadata_spec.rb
|
706
712
|
- spec/models/indexing_spec.rb
|
707
713
|
- spec/models/item_spec.rb
|
@@ -804,6 +810,7 @@ test_files:
|
|
804
810
|
- spec/dummy/config/environments/development.rb
|
805
811
|
- spec/dummy/config/environments/production.rb
|
806
812
|
- spec/dummy/config/environments/test.rb
|
813
|
+
- spec/dummy/config/fedora.yml
|
807
814
|
- spec/dummy/config/initializers/assets.rb
|
808
815
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
809
816
|
- spec/dummy/config/initializers/cookies_serializer.rb
|
@@ -815,6 +822,7 @@ test_files:
|
|
815
822
|
- spec/dummy/config/locales/en.yml
|
816
823
|
- spec/dummy/config/routes.rb
|
817
824
|
- spec/dummy/config/secrets.yml
|
825
|
+
- spec/dummy/config/solr.yml
|
818
826
|
- spec/dummy/db/schema.rb
|
819
827
|
- spec/dummy/lib/assets/.keep
|
820
828
|
- spec/dummy/log/.keep
|
@@ -859,7 +867,6 @@ test_files:
|
|
859
867
|
- spec/managers/derivatives_manager_spec.rb
|
860
868
|
- spec/managers/technical_metadata_manager_spec.rb
|
861
869
|
- spec/models/active_fedora_base_spec.rb
|
862
|
-
- spec/models/active_fedora_datastream_spec.rb
|
863
870
|
- spec/models/admin_set_spec.rb
|
864
871
|
- spec/models/attachment_spec.rb
|
865
872
|
- spec/models/collection_spec.rb
|
@@ -870,9 +877,11 @@ test_files:
|
|
870
877
|
- spec/models/events_spec.rb
|
871
878
|
- spec/models/file_characterization_spec.rb
|
872
879
|
- spec/models/file_management_spec.rb
|
880
|
+
- spec/models/file_spec.rb
|
873
881
|
- spec/models/finding_aid_spec.rb
|
874
882
|
- spec/models/has_admin_metadata_spec.rb
|
875
883
|
- spec/models/has_children_spec.rb
|
884
|
+
- spec/models/has_multires_image_spec.rb
|
876
885
|
- spec/models/has_struct_metadata_spec.rb
|
877
886
|
- spec/models/indexing_spec.rb
|
878
887
|
- spec/models/item_spec.rb
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module Ddr
|
2
|
-
module Datastreams
|
3
|
-
class MetadataDatastream < ActiveFedora::NtriplesRDFDatastream
|
4
|
-
|
5
|
-
def self.term_names
|
6
|
-
properties.keys.map(&:to_sym).sort
|
7
|
-
end
|
8
|
-
|
9
|
-
# Returns ActiveTriplesTerm now that this is an RDF datastream
|
10
|
-
def values term
|
11
|
-
term == :format ? self.format : self.send(term)
|
12
|
-
end
|
13
|
-
|
14
|
-
# Update term with values
|
15
|
-
# Note that empty values (nil or "") are rejected from values array
|
16
|
-
def set_values term, values
|
17
|
-
if values.respond_to?(:reject!)
|
18
|
-
values.reject! { |v| v.blank? }
|
19
|
-
else
|
20
|
-
values = nil if values.blank?
|
21
|
-
end
|
22
|
-
begin
|
23
|
-
self.send("#{term}=", values)
|
24
|
-
rescue NoMethodError
|
25
|
-
raise ArgumentError, "No such term: #{term}"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# Add value to term
|
30
|
-
# Note that empty value (nil or "") is not added
|
31
|
-
def add_value term, value
|
32
|
-
begin
|
33
|
-
unless value.blank?
|
34
|
-
values = values(term).to_a << value
|
35
|
-
set_values term, values
|
36
|
-
end
|
37
|
-
rescue NoMethodError
|
38
|
-
raise ArgumentError, "No such term: #{term}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
require "rdf/vocab"
|
2
|
-
|
3
|
-
module Ddr
|
4
|
-
module Datastreams
|
5
|
-
class StructuralMetadataDatastream < ActiveFedora::Datastream
|
6
|
-
def self.default_attributes
|
7
|
-
super.merge({ mimeType: 'text/xml', dsLabel: 'Structural metadata for this object' })
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|