ddr-models 2.9.2 → 2.10.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e3024e1a5c4b9c8b8ff641f6005db555818f10f7
4
- data.tar.gz: 5b1e4a3a72f8af8d2e4a99fd9194953d46e3153a
3
+ metadata.gz: cb52395b49775aa484605d3eccc046d52a97226a
4
+ data.tar.gz: a3d47a19af939cb42b2b20c1341fb3be1b9f04d8
5
5
  SHA512:
6
- metadata.gz: 9d8cfee5e32a4617204cb5dd7bcfa062b6cb51b5c7fd761768efb32a45f917af66736cdb9cc4cac7d4028e11c16578ad7a729cffad76ab3c4e71b3dd95f52486
7
- data.tar.gz: 99bd90c593985fa393a8f0b165b28132b4fca0de2c19109cf14dd42573422992374c2d066c5bbc937f154afa30ea8fea4b862e13a3cef3d78c0980ae1acd5e76
6
+ metadata.gz: 9335f431776f65227f2ab87585e89c401a9b8a62cad9885900d59ce909ce6be00b942a509465bf14138d9283db2cd57a2e229caa0ff34d8c92bf8f6fcc8921bc
7
+ data.tar.gz: 6dc0228d4831aaa17604a9eb4b71197acee77c3738798688edfb59804f58d4f887bbcdce5e359f53e07ba8f5c2e318f912918d39c9a7a570c6706a4fa72a6451
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ spec/dummy/db/*.sqlite3
6
6
  spec/dummy/db/*.sqlite3-journal
7
7
  spec/dummy/log/*
8
8
  tmp
9
+ .byebug_history
@@ -11,8 +11,6 @@ class Item < Ddr::Models::Base
11
11
  has_many :children, property: :is_part_of, class_name: 'Component'
12
12
  belongs_to :parent, property: :is_member_of_collection, class_name: 'Collection'
13
13
 
14
- has_attributes :nested_path, datastream: Ddr::Datastreams::ADMIN_METADATA, multiple: false
15
-
16
14
  alias_method :components, :children
17
15
  alias_method :component_ids, :child_ids
18
16
 
@@ -57,12 +55,31 @@ class Item < Ddr::Models::Base
57
55
  end
58
56
 
59
57
  def add_components_to_structure(structure, structmap)
60
- count = 0
58
+ component_structure_types(sorted_children).each do |type_term, children|
59
+ div = structure.add_div(parent: structmap, type: type_term)
60
+ children.each_with_index do |child, index|
61
+ sub_div = structure.add_div(parent: div, order: index + 1)
62
+ structure.add_mptr(parent: sub_div, href: child[Ddr::Index::Fields::PERMANENT_ID])
63
+ end
64
+ end
65
+ end
66
+
67
+ def component_structure_types(sorted_children)
68
+ type_divs = {}
61
69
  sorted_children.each do |child|
62
- count += 1
63
- div = structure.add_div(parent: structmap, order: count)
64
- structure.add_mptr(parent: div, href: child[Ddr::Index::Fields::PERMANENT_ID])
70
+ term = type_term(child) || "Other"
71
+ if type_divs.has_key?(term)
72
+ type_divs[term] << child
73
+ else
74
+ type_divs[term] = [ child ]
75
+ end
65
76
  end
77
+ type_divs
78
+ end
79
+
80
+ def type_term(component_doc)
81
+ media_type = component_doc[Ddr::Index::Fields::MEDIA_TYPE].first
82
+ Ddr::Models::Structures::ComponentTypeTerm.term(media_type)
66
83
  end
67
84
 
68
85
  end
@@ -45,4 +45,5 @@ Gem::Specification.new do |s|
45
45
  s.add_development_dependency "factory_girl_rails", "~> 4.4"
46
46
  s.add_development_dependency "jettywrapper", "~> 1.8"
47
47
  s.add_development_dependency "database_cleaner"
48
+ s.add_development_dependency "byebug"
48
49
  end
@@ -12,7 +12,7 @@ module Ddr
12
12
  # Return result of fixity check
13
13
  def self._execute(object)
14
14
  Result.new(pid: object.pid).tap do |r|
15
- object.datastreams_to_validate.each do |dsid, ds|
15
+ object.datastreams_having_content.each do |dsid, ds|
16
16
  r.success &&= ds.dsChecksumValid
17
17
  r.results[dsid] = ds.profile
18
18
  end
@@ -1,5 +1,17 @@
1
1
  module Ddr::Datastreams
2
2
  class ContentDatastream < ExternalFileDatastream
3
3
 
4
+ CONTENT_CHANGED = "content_changed.content.repo_file"
5
+
6
+ around_save :notify_content_changed, if: [:external?, :dsLocation_changed?]
7
+
8
+ private
9
+
10
+ def notify_content_changed
11
+ ActiveSupport::Notifications.instrument(CONTENT_CHANGED, pid: pid) do |payload|
12
+ yield
13
+ end
14
+ end
15
+
4
16
  end
5
17
  end
@@ -15,8 +15,8 @@ module Ddr
15
15
  # Note that empty values (nil or "") are rejected from values array
16
16
  def set_values(term, values)
17
17
  vals = Array(values)
18
- .map { |v| v.to_s.strip }
19
- .reject { |v| v.blank? }
18
+ .map { |v| sanitize_value(v) }
19
+ .reject { |v| reject_value?(v) }
20
20
  begin
21
21
  self.send("#{term}=", vals)
22
22
  rescue NoMethodError
@@ -37,6 +37,19 @@ module Ddr
37
37
  super && !empty?
38
38
  end
39
39
 
40
+ private
41
+
42
+ def sanitize_value(value)
43
+ value
44
+ .to_s
45
+ .strip
46
+ .gsub(/[[:cntrl:]]/, "")
47
+ end
48
+
49
+ def reject_value?(value)
50
+ value.blank?
51
+ end
52
+
40
53
  end
41
54
  end
42
55
  end
@@ -1,16 +1,22 @@
1
1
  module Ddr::Events
2
2
  class UpdateEvent < Event
3
+
3
4
  self.description = "Object updated"
4
5
 
5
6
  def self.call(*args)
6
7
  super do |event, notification|
7
8
  attrs_changed = notification.payload[:attributes_changed]
8
9
  ds_changed = notification.payload[:datastreams_changed]
9
- event.detail = ["Attributes changed: #{attrs_changed}",
10
- "Datastreams changed: #{ds_changed.join(', ')}",
11
- event.detail,
12
- ].compact.join("\n\n")
10
+ detail = [
11
+ "Datastreams changed: #{ds_changed.join(', ')}",
12
+ event.detail,
13
+ ]
14
+ if attrs_changed.present?
15
+ detail << "Attributes changed: #{attrs_changed}"
16
+ end
17
+ event.detail = detail.compact.join("\n\n")
13
18
  end
14
19
  end
20
+
15
21
  end
16
22
  end
@@ -10,14 +10,14 @@ module Ddr::Index
10
10
  module Methods
11
11
  extend Forwardable
12
12
 
13
- delegate [:get, :paginate] => :solr
13
+ delegate [:get, :post, :paginate] => :solr
14
14
 
15
15
  def solr
16
16
  RSolr.connect(ActiveFedora.solr_config)
17
17
  end
18
18
 
19
19
  def select(params, extra={})
20
- Response.new get("select", params: params.merge(extra))
20
+ Response.new post("select", params: params.merge(extra))
21
21
  end
22
22
 
23
23
  def page(*args)
@@ -80,6 +80,7 @@ module Ddr::Index
80
80
  OBJECT_STATE = Field.new :object_state, :stored_sortable
81
81
  OBJECT_CREATE_DATE = Field.new :system_create, :stored_sortable, type: :date
82
82
  OBJECT_MODIFIED_DATE = Field.new :system_modified, :stored_sortable, type: :date
83
+ ORIGINAL_FILENAME = Field.new :original_filename, solr_name: "admin_metadata__original_filename_ssi"
83
84
  PERFORMER_FACET = Field.new :performer_facet, :facetable
84
85
  PERMANENT_ID = Field.new :permanent_id, :stored_sortable, type: :string
85
86
  PERMANENT_URL = Field.new :permanent_url, :stored_sortable, type: :string
@@ -141,6 +142,16 @@ module Ddr::Index
141
142
  end.freeze
142
143
  end
143
144
 
145
+ def self.adminmd
146
+ @adminmd ||= Ddr::Datastreams::AdministrativeMetadataDatastream.properties.map do |base, config|
147
+ begin
148
+ get(base)
149
+ rescue NameError
150
+ Field.new base, *(config.behaviors)
151
+ end
152
+ end.freeze
153
+ end
154
+
144
155
  def self.const_missing(name)
145
156
  if name == :PID
146
157
  Deprecation.warn(Ddr::Index::Fields,
@@ -82,6 +82,7 @@ module Ddr
82
82
  autoload :MetsHdr
83
83
  autoload :Mptr
84
84
  autoload :StructMap
85
+ autoload :ComponentTypeTerm
85
86
  end
86
87
 
87
88
  # Image server URL
@@ -31,10 +31,10 @@ module Ddr
31
31
  before_create :set_ingested_by, if: :performed_by, unless: :ingested_by
32
32
  before_create :grant_default_roles
33
33
 
34
- after_create :assign_permanent_id!, if: :assign_permanent_id?
35
- after_create :notify_ingest
36
-
37
34
  around_save :notify_update, unless: :new_record?
35
+ around_save :assign_permanent_id!, if: :assign_permanent_id?, on: :create
36
+
37
+ after_create :notify_ingest
38
38
 
39
39
  around_deaccession :notify_deaccession
40
40
  around_destroy :notify_delete
@@ -202,6 +202,7 @@ module Ddr
202
202
  end
203
203
 
204
204
  def assign_permanent_id!
205
+ yield
205
206
  PermanentId.assign!(self)
206
207
  end
207
208
 
@@ -16,6 +16,7 @@ module Ddr::Models
16
16
  :display_format,
17
17
  :license,
18
18
  :local_id,
19
+ :nested_path,
19
20
  :permanent_id,
20
21
  :permanent_url,
21
22
  :research_help_contact,
@@ -9,12 +9,9 @@ module Ddr
9
9
  end
10
10
 
11
11
  def structure
12
- unless @structure
13
- if datastreams[Ddr::Datastreams::STRUCT_METADATA].content
14
- @structure = Ddr::Models::Structure.new(Nokogiri::XML(datastreams[Ddr::Datastreams::STRUCT_METADATA].content))
15
- end
12
+ if datastreams[Ddr::Datastreams::STRUCT_METADATA].has_content?
13
+ Ddr::Models::Structure.new(Nokogiri::XML(datastreams[Ddr::Datastreams::STRUCT_METADATA].content))
16
14
  end
17
- @structure
18
15
  end
19
16
 
20
17
  def multires_image_file_paths
@@ -0,0 +1,29 @@
1
+ module Ddr::Models::Structures
2
+ class ComponentTypeTerm
3
+
4
+ CONFIG_FILE = ::File.join(Rails.root, 'config', 'structure_component_type.yml')
5
+
6
+ @@lookup = {}
7
+
8
+ def self.term(media_type)
9
+ hit = lookup_table.detect { |k,v| media_type =~ k }
10
+ hit.last if hit
11
+ end
12
+
13
+ def self.lookup_table
14
+ load_lookup if @@lookup.empty?
15
+ @@lookup
16
+ end
17
+
18
+ def self.load_lookup
19
+ config = YAML::load(::File.read(CONFIG_FILE))
20
+ config.each do |type_term, media_types|
21
+ media_types.each do |media_type|
22
+ lookup_key = Regexp.new("\\A#{media_type.gsub('*', '.*')}\\Z")
23
+ @@lookup[lookup_key] = type_term
24
+ end
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -1,5 +1,5 @@
1
1
  module Ddr
2
2
  module Models
3
- VERSION = "2.9.2"
3
+ VERSION = "2.10.0.rc1"
4
4
  end
5
5
  end
@@ -0,0 +1,18 @@
1
+ # NOTE: This configuration and the associated application functionality does not
2
+ # account for precedence among the media types and associated type designations.
3
+ # In practical terms, this means that the media type for any given Component is
4
+ # to match no more than one of the indicated media type values. If the media type
5
+ # for a Component matches more than one media type value, the type designation
6
+ # that is used is arbitrary.
7
+ Documents:
8
+ - application/pdf
9
+ - application/msword
10
+ - application/vnd.openxmlformats-officedocument.wordprocessingml*
11
+ - application/vnd.ms-word*
12
+ - application/rtf
13
+ - text/*
14
+ Images:
15
+ - image/*
16
+ Media:
17
+ - audio/*
18
+ - video/*
@@ -1,65 +1,63 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <fits xmlns="http://hul.harvard.edu/ois/xml/ns/fits/fits_output" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd" version="0.8.5" timestamp="7/3/15 8:29 PM">
2
+ <fits xmlns="http://hul.harvard.edu/ois/xml/ns/fits/fits_output" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd" version="1.2.0" timestamp="10/17/17 5:48 PM">
3
3
  <identification>
4
- <identity format="Portable Document Format" mimetype="application/pdf" toolname="FITS" toolversion="0.8.5">
5
- <tool toolname="Jhove" toolversion="1.5" />
6
- <tool toolname="file utility" toolversion="5.04" />
7
- <tool toolname="Exiftool" toolversion="9.13" />
8
- <tool toolname="Droid" toolversion="6.1.3" />
9
- <tool toolname="NLNZ Metadata Extractor" toolversion="3.4GA" />
4
+ <identity format="Portable Document Format" mimetype="application/pdf" toolname="FITS" toolversion="1.2.0">
5
+ <tool toolname="Droid" toolversion="6.3" />
6
+ <tool toolname="Jhove" toolversion="1.16" />
7
+ <tool toolname="file utility" toolversion="5.25" />
8
+ <tool toolname="Exiftool" toolversion="10.00" />
9
+ <tool toolname="NLNZ Metadata Extractor" toolversion="3.6GA" />
10
10
  <tool toolname="ffident" toolversion="0.2" />
11
- <tool toolname="Tika" toolversion="1.3" />
12
- <version toolname="Jhove" toolversion="1.5">1.6</version>
13
- <externalIdentifier toolname="Droid" toolversion="6.1.3" type="puid">fmt/20</externalIdentifier>
11
+ <tool toolname="Tika" toolversion="1.10" />
12
+ <version toolname="Droid" toolversion="6.3">1.6</version>
13
+ <externalIdentifier toolname="Droid" toolversion="6.3" type="puid">fmt/20</externalIdentifier>
14
14
  </identity>
15
15
  </identification>
16
16
  <fileinfo>
17
- <size toolname="Jhove" toolversion="1.5">3786205</size>
18
- <creatingApplicationName toolname="Exiftool" toolversion="9.13" status="CONFLICT">Adobe Acrobat Pro 11.0.3 Paper Capture Plug-in/PREMIS Editorial Committee</creatingApplicationName>
19
- <creatingApplicationName toolname="NLNZ Metadata Extractor" toolversion="3.4GA" status="CONFLICT">Adobe Acrobat Pro 11.0.3 Paper Capture Plug-in/Acrobat PDFMaker 11 for Word</creatingApplicationName>
20
- <lastmodified toolname="Exiftool" toolversion="9.13" status="CONFLICT">2015:06:25 21:45:24-04:00</lastmodified>
21
- <lastmodified toolname="Tika" toolversion="1.3" status="CONFLICT">2015-06-08T21:22:35Z</lastmodified>
22
- <created toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">2015:06:05 15:16:23-04:00</created>
17
+ <size toolname="Jhove" toolversion="1.16">2176353</size>
18
+ <creatingApplicationName toolname="Exiftool" toolversion="10.00">Adobe PDF Library 11.0/Acrobat PDFMaker 11 for Word</creatingApplicationName>
19
+ <lastmodified toolname="Exiftool" toolversion="10.00" status="CONFLICT">2016:01:07 09:49:50-05:00</lastmodified>
20
+ <lastmodified toolname="Tika" toolversion="1.10" status="CONFLICT">2016-01-07T14:49:50Z</lastmodified>
21
+ <created toolname="Exiftool" toolversion="10.00" status="SINGLE_RESULT">2015:12:09 13:23:09-05:00</created>
23
22
  <filepath toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">/Users/dc/Downloads/premis-3-0-final.pdf</filepath>
24
23
  <filename toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">premis-3-0-final.pdf</filename>
25
- <md5checksum toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">432ab76d650bfdc8f8d4a98cea9634bb</md5checksum>
26
- <fslastmodified toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">1435283124000</fslastmodified>
24
+ <md5checksum toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">58fee04df34490ee7ecf3cdd5ddafc72</md5checksum>
25
+ <fslastmodified toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">1508276630000</fslastmodified>
27
26
  </fileinfo>
28
27
  <filestatus>
29
- <well-formed toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">true</well-formed>
30
- <valid toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">false</valid>
31
- <message toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">Invalid page tree node offset=390028</message>
32
- <message toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">Outlines contain recursive references.</message>
28
+ <well-formed toolname="Jhove" toolversion="1.16" status="SINGLE_RESULT">true</well-formed>
29
+ <valid toolname="Jhove" toolversion="1.16" status="SINGLE_RESULT">true</valid>
33
30
  </filestatus>
34
31
  <metadata>
35
32
  <document>
36
- <title toolname="Jhove" toolversion="1.5" status="CONFLICT">CONTENTS</title>
37
- <title toolname="Exiftool" toolversion="9.13" status="CONFLICT">PREMIS Data Dictionary for Preservation Metadata, Version 3.0</title>
38
- <author toolname="Exiftool" toolversion="9.13">PREMIS Editorial Committee</author>
39
- <language toolname="Jhove" toolversion="1.5">en</language>
40
- <pageCount toolname="Exiftool" toolversion="9.13">282</pageCount>
41
- <isTagged toolname="Jhove" toolversion="1.5" status="CONFLICT">no</isTagged>
42
- <isTagged toolname="NLNZ Metadata Extractor" toolversion="3.4GA" status="CONFLICT">yes</isTagged>
43
- <hasOutline toolname="Jhove" toolversion="1.5">yes</hasOutline>
44
- <hasAnnotations toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">no</hasAnnotations>
45
- <isRightsManaged toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">no</isRightsManaged>
46
- <isProtected toolname="Exiftool" toolversion="9.13">no</isProtected>
47
- <hasForms toolname="NLNZ Metadata Extractor" toolversion="3.4GA" status="SINGLE_RESULT">yes</hasForms>
48
- <subject toolname="Tika" toolversion="1.3" status="SINGLE_RESULT">PREMIS</subject>
33
+ <title toolname="Exiftool" toolversion="10.00">PREMIS Data Dictionary for Preservation Metadata, Version 3.0</title>
34
+ <author toolname="Exiftool" toolversion="10.00">PREMIS Editorial Committee</author>
35
+ <language toolname="Exiftool" toolversion="10.00" status="SINGLE_RESULT">en</language>
36
+ <pageCount toolname="Exiftool" toolversion="10.00">283</pageCount>
37
+ <isTagged toolname="Exiftool" toolversion="10.00" status="CONFLICT">yes</isTagged>
38
+ <isTagged toolname="NLNZ Metadata Extractor" toolversion="3.6GA" status="CONFLICT">no</isTagged>
39
+ <hasOutline toolname="Jhove" toolversion="1.16">no</hasOutline>
40
+ <hasAnnotations toolname="Jhove" toolversion="1.16" status="SINGLE_RESULT">no</hasAnnotations>
41
+ <subject toolname="Exiftool" toolversion="10.00" status="CONFLICT">PREMIS, Data Dictionary, Version 3.0, preservation metadata, library of congress</subject>
42
+ <subject toolname="Tika" toolversion="1.10" status="CONFLICT">PREMIS Data Dictionary, Version 3.0</subject>
43
+ <description toolname="Exiftool" toolversion="10.00">PREMIS Data Dictionary, Version 3.0</description>
44
+ <hasForms toolname="NLNZ Metadata Extractor" toolversion="3.6GA" status="SINGLE_RESULT">no</hasForms>
49
45
  </document>
50
46
  </metadata>
51
- <statistics fitsExecutionTime="2977">
47
+ <statistics fitsExecutionTime="1373">
48
+ <tool toolname="MediaInfo" toolversion="0.7.75" status="did not run" />
52
49
  <tool toolname="OIS Audio Information" toolversion="0.1" status="did not run" />
53
50
  <tool toolname="ADL Tool" toolversion="0.1" status="did not run" />
54
- <tool toolname="Jhove" toolversion="1.5" executionTime="1034" />
55
- <tool toolname="file utility" toolversion="5.04" executionTime="912" />
56
- <tool toolname="Exiftool" toolversion="9.13" executionTime="842" />
57
- <tool toolname="Droid" toolversion="6.1.3" executionTime="336" />
58
- <tool toolname="NLNZ Metadata Extractor" toolversion="3.4GA" executionTime="2192" />
59
- <tool toolname="OIS File Information" toolversion="0.2" executionTime="351" />
51
+ <tool toolname="VTT Tool" toolversion="0.1" status="did not run" />
52
+ <tool toolname="Droid" toolversion="6.3" executionTime="144" />
53
+ <tool toolname="Jhove" toolversion="1.16" executionTime="488" />
54
+ <tool toolname="file utility" toolversion="5.25" executionTime="471" />
55
+ <tool toolname="Exiftool" toolversion="10.00" executionTime="479" />
56
+ <tool toolname="NLNZ Metadata Extractor" toolversion="3.6GA" executionTime="454" />
57
+ <tool toolname="OIS File Information" toolversion="0.2" executionTime="141" />
60
58
  <tool toolname="OIS XML Metadata" toolversion="0.2" status="did not run" />
61
- <tool toolname="ffident" toolversion="0.2" executionTime="410" />
62
- <tool toolname="Tika" toolversion="1.3" executionTime="2911" />
59
+ <tool toolname="ffident" toolversion="0.2" executionTime="449" />
60
+ <tool toolname="Tika" toolversion="1.10" executionTime="1337" />
63
61
  </statistics>
64
62
  </fits>
65
63
 
@@ -1,59 +1,60 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <fits xmlns="http://hul.harvard.edu/ois/xml/ns/fits/fits_output" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd" version="0.8.5" timestamp="7/28/15 4:34 PM">
2
+ <fits xmlns="http://hul.harvard.edu/ois/xml/ns/fits/fits_output" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd" version="1.2.0" timestamp="10/17/17 5:47 PM">
3
3
  <identification>
4
- <identity format="JPEG File Interchange Format" mimetype="image/jpeg" toolname="FITS" toolversion="0.8.5">
5
- <tool toolname="Jhove" toolversion="1.5" />
6
- <tool toolname="file utility" toolversion="5.04" />
7
- <tool toolname="Exiftool" toolversion="9.13" />
8
- <tool toolname="Droid" toolversion="6.1.3" />
9
- <tool toolname="NLNZ Metadata Extractor" toolversion="3.4GA" />
10
- <version toolname="Jhove" toolversion="1.5">1.01</version>
11
- <externalIdentifier toolname="Droid" toolversion="6.1.3" type="puid">fmt/43</externalIdentifier>
4
+ <identity format="JPEG File Interchange Format" mimetype="image/jpeg" toolname="FITS" toolversion="1.2.0">
5
+ <tool toolname="Droid" toolversion="6.3" />
6
+ <tool toolname="Jhove" toolversion="1.16" />
7
+ <tool toolname="file utility" toolversion="5.25" />
8
+ <tool toolname="Exiftool" toolversion="10.00" />
9
+ <tool toolname="NLNZ Metadata Extractor" toolversion="3.6GA" />
10
+ <version toolname="Droid" toolversion="6.3">1.01</version>
11
+ <externalIdentifier toolname="Droid" toolversion="6.3" type="puid">fmt/43</externalIdentifier>
12
12
  </identity>
13
13
  </identification>
14
14
  <fileinfo>
15
- <size toolname="Jhove" toolversion="1.5">94497</size>
16
- <creatingApplicationName toolname="Jhove" toolversion="1.5">File source: https://commons.wikimedia.org/wiki/File:Dante_Gabriel_Rossetti_-_Joan_of_Arc_(1882).jpg</creatingApplicationName>
17
- <lastmodified toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">2015:07:28 10:19:55-04:00</lastmodified>
18
- <filepath toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">/Users/dc/Downloads/Joan_of_Arc.jpg</filepath>
19
- <filename toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">Joan_of_Arc.jpg</filename>
20
- <md5checksum toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">bc575fbcbffff0248f5da3dddf8afd69</md5checksum>
21
- <fslastmodified toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">1438093195000</fslastmodified>
15
+ <size toolname="Jhove" toolversion="1.16">97220</size>
16
+ <creatingApplicationName toolname="Jhove" toolversion="1.16">File source: https://commons.wikimedia.org/wiki/File:Dante_Gabriel_Rossetti_-_Joan_of_Arc_(1882).jpg</creatingApplicationName>
17
+ <filepath toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">/Users/dc/Downloads/Dante_Gabriel_Rossetti_-_Joan_of_Arc_(1882).jpg</filepath>
18
+ <filename toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">Dante_Gabriel_Rossetti_-_Joan_of_Arc_(1882).jpg</filename>
19
+ <md5checksum toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">c21d5fecf9d0310858d2bfe44e5436ce</md5checksum>
20
+ <fslastmodified toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">1508276690000</fslastmodified>
22
21
  </fileinfo>
23
22
  <filestatus>
24
- <well-formed toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">true</well-formed>
25
- <valid toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">true</valid>
23
+ <well-formed toolname="Jhove" toolversion="1.16" status="SINGLE_RESULT">true</well-formed>
24
+ <valid toolname="Jhove" toolversion="1.16" status="SINGLE_RESULT">true</valid>
26
25
  </filestatus>
27
26
  <metadata>
28
27
  <image>
29
- <byteOrder toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">big endian</byteOrder>
30
- <compressionScheme toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">JPEG (old-style)</compressionScheme>
31
- <imageWidth toolname="Jhove" toolversion="1.5">500</imageWidth>
32
- <imageHeight toolname="Jhove" toolversion="1.5">569</imageHeight>
33
- <colorSpace toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">YCbCr</colorSpace>
34
- <iccProfileName toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">c2</iccProfileName>
35
- <YCbCrSubSampling toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">1 1</YCbCrSubSampling>
36
- <samplingFrequencyUnit toolname="Jhove" toolversion="1.5">in.</samplingFrequencyUnit>
37
- <xSamplingFrequency toolname="Jhove" toolversion="1.5">128</xSamplingFrequency>
38
- <ySamplingFrequency toolname="Jhove" toolversion="1.5">128</ySamplingFrequency>
39
- <bitsPerSample toolname="Jhove" toolversion="1.5">8 8 8</bitsPerSample>
40
- <samplesPerPixel toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">3</samplesPerPixel>
41
- <lightSource toolname="NLNZ Metadata Extractor" toolversion="3.4GA" status="SINGLE_RESULT">unknown</lightSource>
42
- <iccProfileVersion toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">2.1.0</iccProfileVersion>
28
+ <byteOrder toolname="Jhove" toolversion="1.16" status="SINGLE_RESULT">big endian</byteOrder>
29
+ <compressionScheme toolname="Jhove" toolversion="1.16" status="SINGLE_RESULT">JPEG</compressionScheme>
30
+ <imageWidth toolname="Jhove" toolversion="1.16">512</imageWidth>
31
+ <imageHeight toolname="Exiftool" toolversion="10.00">583</imageHeight>
32
+ <colorSpace toolname="Jhove" toolversion="1.16" status="SINGLE_RESULT">YCbCr</colorSpace>
33
+ <iccProfileName toolname="Exiftool" toolversion="10.00" status="SINGLE_RESULT">c2</iccProfileName>
34
+ <YCbCrSubSampling toolname="Exiftool" toolversion="10.00" status="SINGLE_RESULT">1 1</YCbCrSubSampling>
35
+ <samplingFrequencyUnit toolname="Jhove" toolversion="1.16">in.</samplingFrequencyUnit>
36
+ <xSamplingFrequency toolname="Exiftool" toolversion="10.00">128</xSamplingFrequency>
37
+ <ySamplingFrequency toolname="Exiftool" toolversion="10.00">128</ySamplingFrequency>
38
+ <bitsPerSample toolname="Jhove" toolversion="1.16">8 8 8</bitsPerSample>
39
+ <samplesPerPixel toolname="Jhove" toolversion="1.16" status="SINGLE_RESULT">3</samplesPerPixel>
40
+ <lightSource toolname="NLNZ Metadata Extractor" toolversion="3.6GA" status="SINGLE_RESULT">unknown</lightSource>
41
+ <iccProfileVersion toolname="Exiftool" toolversion="10.00" status="SINGLE_RESULT">2.1.0</iccProfileVersion>
43
42
  </image>
44
43
  </metadata>
45
- <statistics fitsExecutionTime="897">
44
+ <statistics fitsExecutionTime="722">
45
+ <tool toolname="MediaInfo" toolversion="0.7.75" status="did not run" />
46
46
  <tool toolname="OIS Audio Information" toolversion="0.1" status="did not run" />
47
47
  <tool toolname="ADL Tool" toolversion="0.1" status="did not run" />
48
- <tool toolname="Jhove" toolversion="1.5" executionTime="728" />
49
- <tool toolname="file utility" toolversion="5.04" executionTime="662" />
50
- <tool toolname="Exiftool" toolversion="9.13" executionTime="718" />
51
- <tool toolname="Droid" toolversion="6.1.3" executionTime="85" />
52
- <tool toolname="NLNZ Metadata Extractor" toolversion="3.4GA" executionTime="664" />
53
- <tool toolname="OIS File Information" toolversion="0.2" executionTime="82" />
48
+ <tool toolname="VTT Tool" toolversion="0.1" status="did not run" />
49
+ <tool toolname="Droid" toolversion="6.3" executionTime="151" />
50
+ <tool toolname="Jhove" toolversion="1.16" executionTime="644" />
51
+ <tool toolname="file utility" toolversion="5.25" executionTime="545" />
52
+ <tool toolname="Exiftool" toolversion="10.00" executionTime="629" />
53
+ <tool toolname="NLNZ Metadata Extractor" toolversion="3.6GA" executionTime="592" />
54
+ <tool toolname="OIS File Information" toolversion="0.2" executionTime="148" />
54
55
  <tool toolname="OIS XML Metadata" toolversion="0.2" status="did not run" />
55
- <tool toolname="ffident" toolversion="0.2" executionTime="315" />
56
- <tool toolname="Tika" toolversion="1.3" executionTime="240" />
56
+ <tool toolname="ffident" toolversion="0.2" executionTime="537" />
57
+ <tool toolname="Tika" toolversion="1.10" executionTime="635" />
57
58
  </statistics>
58
59
  </fits>
59
60
 
@@ -39,23 +39,23 @@ module Ddr::Managers
39
39
 
40
40
  its(:fits?) { is_expected.to be true }
41
41
 
42
- its(:created) { is_expected.to eq(["2015:06:05 15:16:23-04:00"]) }
43
- its(:creating_application) { is_expected.to contain_exactly("Adobe Acrobat Pro 11.0.3 Paper Capture Plug-in/PREMIS Editorial Committee", "Adobe Acrobat Pro 11.0.3 Paper Capture Plug-in/Acrobat PDFMaker 11 for Word") }
44
- its(:extent) { is_expected.to eq(["3786205"]) }
45
- its(:file_size) { is_expected.to eq([3786205]) }
46
- its(:fits_version) { is_expected.to eq("0.8.5") }
42
+ its(:created) { is_expected.to eq(["2015:12:09 13:23:09-05:00"]) }
43
+ its(:creating_application) { is_expected.to contain_exactly("Adobe PDF Library 11.0/Acrobat PDFMaker 11 for Word") }
44
+ its(:extent) { is_expected.to eq(["2176353"]) }
45
+ its(:file_size) { is_expected.to eq([2176353]) }
46
+ its(:fits_version) { is_expected.to eq("1.2.0") }
47
47
  its(:format_label) { is_expected.to eq(["Portable Document Format"]) }
48
48
  its(:format_version) { is_expected.to eq(["1.6"]) }
49
- its(:last_modified) { is_expected.to eq(["2015-06-08T21:22:35Z"]) }
50
- its(:md5) { is_expected.to eq("432ab76d650bfdc8f8d4a98cea9634bb") }
49
+ its(:last_modified) { is_expected.to eq(["2016-01-07T14:49:50Z"]) }
50
+ its(:md5) { is_expected.to eq("58fee04df34490ee7ecf3cdd5ddafc72") }
51
51
  its(:media_type) { is_expected.to eq(["application/pdf"]) }
52
52
  its(:pronom_identifier) { is_expected.to eq(["fmt/20"]) }
53
- its(:valid) { is_expected.to eq(["false"]) }
53
+ its(:valid) { is_expected.to eq(["true"]) }
54
54
  its(:well_formed) { is_expected.to eq(["true"]) }
55
55
 
56
56
  describe "datetime fields" do
57
- its(:creation_time) { is_expected.to contain_exactly(DateTime.parse("2015-06-05 15:16:23-04:00").to_time.utc) }
58
- its(:modification_time) { is_expected.to contain_exactly(DateTime.parse("2015-06-08T21:22:35Z").to_time.utc) }
57
+ its(:creation_time) { is_expected.to contain_exactly(DateTime.parse("2015-12-09 13:23:09-05:00").to_time.utc) }
58
+ its(:modification_time) { is_expected.to contain_exactly(DateTime.parse("2016-01-07T14:49:50Z").to_time.utc) }
59
59
  end
60
60
  end
61
61
 
@@ -73,8 +73,8 @@ module Ddr::Managers
73
73
  before do
74
74
  obj.fits.content = fixture_file_upload(File.join("fits", "image.xml"))
75
75
  end
76
- its(:image_width) { is_expected.to eq(["500"]) }
77
- its(:image_height) { is_expected.to eq(["569"]) }
76
+ its(:image_width) { is_expected.to eq(["512"]) }
77
+ its(:image_height) { is_expected.to eq(["583"]) }
78
78
  its(:color_space) { is_expected.to eq(["YCbCr"]) }
79
79
  its(:icc_profile_name) { is_expected.to eq(["c2"]) }
80
80
  its(:icc_profile_version) { is_expected.to eq(["2.1.0"]) }
@@ -91,6 +91,10 @@ module Ddr::Datastreams
91
91
  subject.set_values :type, [ "Image", "Still Image " ]
92
92
  expect(subject.type).to eq([ "Image", "Still Image" ])
93
93
  end
94
+ it "strips controls characters from values" do
95
+ subject.set_values :type, [ "Image", "Still\f Image" ]
96
+ expect(subject.type).to eq([ "Image", "Still Image" ])
97
+ end
94
98
  end
95
99
  describe "#add_value" do
96
100
  it "should add the supplied value to those of the term" do
@@ -66,8 +66,10 @@ RSpec.describe Item, type: :model do
66
66
  end
67
67
  end
68
68
  describe "when the item has components" do
69
- let(:comp1) { FactoryGirl.create(:component) }
70
- let(:comp2) { FactoryGirl.create(:component) }
69
+ let(:comp1) { Component.new }
70
+ let(:comp2) { Component.new }
71
+ let(:comp3) { Component.new }
72
+ let(:comp4) { Component.new }
71
73
  let(:expected) do
72
74
  xml = <<-EOS
73
75
  <mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -77,11 +79,23 @@ RSpec.describe Item, type: :model do
77
79
  </agent>
78
80
  </metsHdr>
79
81
  <structMap TYPE="#{Ddr::Models::Structure::TYPE_DEFAULT}">
80
- <div ORDER="1">
81
- <mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4bbb" />
82
+ <div TYPE="Documents">
83
+ <div ORDER="1">
84
+ <mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4ccc" />
85
+ </div>
82
86
  </div>
83
- <div ORDER="2">
84
- <mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4aaa" />
87
+ <div TYPE="Images">
88
+ <div ORDER="1">
89
+ <mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4bbb" />
90
+ </div>
91
+ <div ORDER="2">
92
+ <mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4aaa" />
93
+ </div>
94
+ </div>
95
+ <div TYPE="Other">
96
+ <div ORDER="1">
97
+ <mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4ddd" />
98
+ </div>
85
99
  </div>
86
100
  </structMap>
87
101
  </mets>
@@ -89,20 +103,32 @@ RSpec.describe Item, type: :model do
89
103
  xml
90
104
  end
91
105
  before do
92
- comp1.local_id = "test002"
106
+ comp1.local_id = "test001002"
93
107
  comp1.permanent_id = "ark:/99999/fk4aaa"
108
+ comp1.upload fixture_file_upload("imageB.tif", "image/tiff")
94
109
  comp1.save!
95
- comp2.local_id = "test001"
110
+ comp2.local_id = "test001001"
96
111
  comp2.permanent_id = "ark:/99999/fk4bbb"
112
+ comp2.upload fixture_file_upload("imageA.tif", "image/tiff")
97
113
  comp2.save!
114
+ comp3.local_id = "test001"
115
+ comp3.permanent_id = "ark:/99999/fk4ccc"
116
+ comp3.upload fixture_file_upload("sample.pdf", "application/pdf")
117
+ comp3.save!
118
+ comp4.local_id = "test123"
119
+ comp4.permanent_id = "ark:/99999/fk4ddd"
120
+ comp4.upload fixture_file_upload("abcd1234.vtt", "application/octet-stream")
121
+ comp4.save!
98
122
  subject.children << comp1
99
123
  subject.children << comp2
124
+ subject.children << comp3
125
+ subject.children << comp4
100
126
  subject.save!
101
- allow(SecureRandom).to receive(:uuid).and_return("abc-def", "ghi-jkl")
102
127
  end
103
128
  after do
104
129
  comp1.destroy
105
130
  comp2.destroy
131
+ comp3.destroy
106
132
  end
107
133
  it "should be the appropriate structure" do
108
134
  expect(subject.default_structure.to_xml).to be_equivalent_to(expected)
@@ -11,10 +11,6 @@ module Ddr::Models
11
11
  allow(described_class.identifier_class).to receive(:find).with("foo") { id }
12
12
  allow(Ddr::Models).to receive(:auto_assign_permanent_id) { true }
13
13
  end
14
- after do
15
- obj.permanent_id = nil
16
- obj.save!
17
- end
18
14
  it "assigns a permanent id to the object" do
19
15
  obj.reload
20
16
  expect(obj.permanent_id).to eq("foo")
@@ -0,0 +1,14 @@
1
+ module Ddr::Models::Structures
2
+ RSpec.describe ComponentTypeTerm do
3
+
4
+ it "should return the correct term" do
5
+ expect(described_class.term('image/tiff')).to eq("Images")
6
+ expect(described_class.term('audio/x-wav')).to eq("Media")
7
+ expect(described_class.term('video/quicktime')).to eq("Media")
8
+ expect(described_class.term('text/plain')).to eq("Documents")
9
+ expect(described_class.term('application/pdf')).to eq("Documents")
10
+ expect(described_class.term('application/vnd.openxmlformats-officedocument.wordprocessingml.document')).to eq("Documents")
11
+ expect(described_class.term('application/vnd.ms-access')).to be nil
12
+ end
13
+ end
14
+ end
@@ -69,6 +69,13 @@ RSpec.shared_examples "an object that can have content" do
69
69
  expect_any_instance_of(Ddr::Managers::DerivativesManager).to receive(:update_derivatives)
70
70
  subject.save
71
71
  end
72
+ it "should notify that content has changed" do
73
+ callback = lambda { |*args| args }
74
+ ActiveSupport::Notifications.subscribed(callback, "content_changed.content.repo_file") do
75
+ expect(callback).to receive(:call) { nil }
76
+ subject.save
77
+ end
78
+ end
72
79
  end
73
80
 
74
81
  context "and it's an existing object with content" do
@@ -78,6 +85,13 @@ RSpec.shared_examples "an object that can have content" do
78
85
  expect_any_instance_of(Ddr::Managers::DerivativesManager).to receive(:update_derivatives)
79
86
  subject.upload! file
80
87
  end
88
+ it "should notify that content has changed" do
89
+ callback = lambda { |*args| args }
90
+ ActiveSupport::Notifications.subscribed(callback, "content_changed.content.repo_file") do
91
+ expect(callback).to receive(:call) { nil }
92
+ subject.upload! file
93
+ end
94
+ end
81
95
  context "and it is saved with :skip_update_derivatives=>true" do
82
96
  it "does not generate derivatives" do
83
97
  expect_any_instance_of(Ddr::Managers::DerivativesManager).not_to receive(:update_derivatives)
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.9.2
4
+ version: 2.10.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: 2017-10-31 00:00:00.000000000 Z
12
+ date: 2017-11-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -393,6 +393,20 @@ dependencies:
393
393
  - - ">="
394
394
  - !ruby/object:Gem::Version
395
395
  version: '0'
396
+ - !ruby/object:Gem::Dependency
397
+ name: byebug
398
+ requirement: !ruby/object:Gem::Requirement
399
+ requirements:
400
+ - - ">="
401
+ - !ruby/object:Gem::Version
402
+ version: '0'
403
+ type: :development
404
+ prerelease: false
405
+ version_requirements: !ruby/object:Gem::Requirement
406
+ requirements:
407
+ - - ">="
408
+ - !ruby/object:Gem::Version
409
+ version: '0'
396
410
  description: Models used in the Duke Digital Repository
397
411
  email:
398
412
  - lib-drs@duke.edu
@@ -580,6 +594,7 @@ files:
580
594
  - lib/ddr/models/streamable.rb
581
595
  - lib/ddr/models/structure.rb
582
596
  - lib/ddr/models/structures/agent.rb
597
+ - lib/ddr/models/structures/component_type_term.rb
583
598
  - lib/ddr/models/structures/div.rb
584
599
  - lib/ddr/models/structures/f_locat.rb
585
600
  - lib/ddr/models/structures/file.rb
@@ -664,6 +679,7 @@ files:
664
679
  - spec/dummy/config/locales/en.yml
665
680
  - spec/dummy/config/routes.rb
666
681
  - spec/dummy/config/secrets.yml
682
+ - spec/dummy/config/structure_component_type.yml
667
683
  - spec/dummy/db/schema.rb
668
684
  - spec/dummy/lib/assets/.keep
669
685
  - spec/dummy/log/.keep
@@ -734,6 +750,7 @@ files:
734
750
  - spec/models/solr_document_spec.rb
735
751
  - spec/models/structure_spec.rb
736
752
  - spec/models/structures/agent_spec.rb
753
+ - spec/models/structures/component_type_term_spec.rb
737
754
  - spec/models/structures/div_spec.rb
738
755
  - spec/models/structures/f_locat_spec.rb
739
756
  - spec/models/structures/file_grp_spec.rb
@@ -757,7 +774,7 @@ files:
757
774
  - spec/support/shared_examples_for_events.rb
758
775
  - spec/support/shared_examples_for_governables.rb
759
776
  - spec/support/shared_examples_for_has_content.rb
760
- - spec/support/shared_examples_for_has_intermediate_spec.rb
777
+ - spec/support/shared_examples_for_has_intermediate_file.rb
761
778
  - spec/support/shared_examples_for_indexing.rb
762
779
  - spec/support/shared_examples_for_non_collection_models.rb
763
780
  - spec/support/shared_examples_for_publication.rb
@@ -781,9 +798,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
781
798
  version: '0'
782
799
  required_rubygems_version: !ruby/object:Gem::Requirement
783
800
  requirements:
784
- - - ">="
801
+ - - ">"
785
802
  - !ruby/object:Gem::Version
786
- version: '0'
803
+ version: 1.3.1
787
804
  requirements: []
788
805
  rubyforge_project:
789
806
  rubygems_version: 2.6.11
@@ -852,6 +869,7 @@ test_files:
852
869
  - spec/dummy/config/locales/en.yml
853
870
  - spec/dummy/config/routes.rb
854
871
  - spec/dummy/config/secrets.yml
872
+ - spec/dummy/config/structure_component_type.yml
855
873
  - spec/dummy/db/schema.rb
856
874
  - spec/dummy/lib/assets/.keep
857
875
  - spec/dummy/log/.keep
@@ -922,6 +940,7 @@ test_files:
922
940
  - spec/models/solr_document_spec.rb
923
941
  - spec/models/structure_spec.rb
924
942
  - spec/models/structures/agent_spec.rb
943
+ - spec/models/structures/component_type_term_spec.rb
925
944
  - spec/models/structures/div_spec.rb
926
945
  - spec/models/structures/f_locat_spec.rb
927
946
  - spec/models/structures/file_grp_spec.rb
@@ -945,7 +964,7 @@ test_files:
945
964
  - spec/support/shared_examples_for_events.rb
946
965
  - spec/support/shared_examples_for_governables.rb
947
966
  - spec/support/shared_examples_for_has_content.rb
948
- - spec/support/shared_examples_for_has_intermediate_spec.rb
967
+ - spec/support/shared_examples_for_has_intermediate_file.rb
949
968
  - spec/support/shared_examples_for_indexing.rb
950
969
  - spec/support/shared_examples_for_non_collection_models.rb
951
970
  - spec/support/shared_examples_for_publication.rb