assembly-objectfile 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/.gitignore +13 -0
  2. data/.rspec +1 -0
  3. data/.rvmrc.example +1 -0
  4. data/Gemfile +5 -0
  5. data/README.rdoc +94 -0
  6. data/Rakefile +4 -0
  7. data/assembly-objectfile.gemspec +29 -0
  8. data/bin/console +8 -0
  9. data/bin/run_all_tests +3 -0
  10. data/config/boot.rb +9 -0
  11. data/lib/assembly-objectfile.rb +35 -0
  12. data/lib/assembly-objectfile/content_metadata.rb +229 -0
  13. data/lib/assembly-objectfile/object_file.rb +30 -0
  14. data/lib/assembly-objectfile/object_fileable.rb +263 -0
  15. data/lib/assembly-objectfile/version.rb +9 -0
  16. data/profiles/AdobeRGB1998.icc +0 -0
  17. data/profiles/DotGain20.icc +0 -0
  18. data/profiles/sRGBIEC6196621.icc +0 -0
  19. data/spec/content_metadata_spec.rb +563 -0
  20. data/spec/object_file_spec.rb +115 -0
  21. data/spec/spec_helper.rb +46 -0
  22. data/spec/test_data/input/.empty +0 -0
  23. data/spec/test_data/input/file_with_no_exif.xml +83 -0
  24. data/spec/test_data/input/oo000oo0001/00/oo000oo0001_00_001.tif +0 -0
  25. data/spec/test_data/input/oo000oo0001/00/oo000oo0001_00_002.tif +0 -0
  26. data/spec/test_data/input/oo000oo0001/05/oo000oo0001_05_001.jp2 +0 -0
  27. data/spec/test_data/input/oo000oo0001/05/oo000oo0001_05_002.jp2 +0 -0
  28. data/spec/test_data/input/oo000oo0001/15/oo000oo0001_15_001.pdf +1 -0
  29. data/spec/test_data/input/oo000oo0001/15/oo000oo0001_15_002.pdf +1 -0
  30. data/spec/test_data/input/oo000oo0001/31/oo000oo0001_31_001.pdf +1 -0
  31. data/spec/test_data/input/oo000oo0001/50/oo000oo0001_50_001.tif +0 -0
  32. data/spec/test_data/input/oo000oo0001/oo000oo0001_book.pdf +1 -0
  33. data/spec/test_data/input/res1_image1.jp2 +0 -0
  34. data/spec/test_data/input/res1_image1.tif +0 -0
  35. data/spec/test_data/input/res1_image2.jp2 +0 -0
  36. data/spec/test_data/input/res1_image2.tif +0 -0
  37. data/spec/test_data/input/res1_teifile.txt +1 -0
  38. data/spec/test_data/input/res1_textfile.txt +1 -0
  39. data/spec/test_data/input/res1_transcript.pdf +1 -0
  40. data/spec/test_data/input/res2_image1.jp2 +0 -0
  41. data/spec/test_data/input/res2_image1.tif +0 -0
  42. data/spec/test_data/input/res2_image2.jp2 +0 -0
  43. data/spec/test_data/input/res2_image2.tif +0 -0
  44. data/spec/test_data/input/res2_teifile.txt +1 -0
  45. data/spec/test_data/input/res2_textfile.txt +1 -0
  46. data/spec/test_data/input/res3_image1.jp2 +0 -0
  47. data/spec/test_data/input/res3_image1.tif +0 -0
  48. data/spec/test_data/input/res3_teifile.txt +1 -0
  49. data/spec/test_data/input/test.jp2 +0 -0
  50. data/spec/test_data/input/test.pdf +1 -0
  51. data/spec/test_data/input/test.tif +0 -0
  52. data/spec/test_data/input/test2.jp2 +0 -0
  53. data/spec/test_data/input/test2.tif +0 -0
  54. metadata +260 -0
@@ -0,0 +1,30 @@
1
+ module Assembly
2
+
3
+ # This class contains generic methods to operate on any file.
4
+ class ObjectFile
5
+
6
+ include Assembly::ObjectFileable
7
+
8
+ # Class level method that given an array of strings, return the longest common initial path. Useful for removing a common path from a set of filenames when producing content metadata
9
+ #
10
+ # @param [Array] strings Array of filenames with paths to operate on
11
+ # @return [String] Common part of path of filenames passed in
12
+ #
13
+ # Example:
14
+ # puts Assembly::ObjectFile.common_prefix(['/Users/peter/00/test.tif','/Users/peter/05/test.jp2']) # '/Users/peter/0'
15
+ def self.common_path(strings)
16
+ return nil if strings.size == 0
17
+ n = 0
18
+ x = strings.last
19
+ n += 1 while strings.all? { |s| s[n] and s[n] == x[n] }
20
+ common_prefix=x[0...n]
21
+ if common_prefix[-1,1] != '/' # check if last element of the common string is the end of a directory
22
+ return common_prefix.split('/')[0..-2].join('/') + "/" # if not, split string along directories, and reject last one
23
+ else
24
+ return common_prefix # if it was, then return the common prefix directly
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,263 @@
1
+ require 'mini_exiftool'
2
+ require 'mime/types'
3
+ #require 'checksum-tools'
4
+
5
+ module Assembly
6
+
7
+ # Namespace to include common behaviors we need for other classes in the gem
8
+ module ObjectFileable
9
+
10
+ # path is the full path to the user provided image
11
+ attr_accessor :path
12
+
13
+ # an optional label that can be set for each file -- if provided, this will be used as a resource label when generating content metadata (files bundlded together will just get the first's files label attribute if set)
14
+ attr_accessor :label
15
+
16
+ # an optional hash that is used to set the file attributes (publish,preserve,shelve) for the given file when generating content metadata (if not supplied, mimetype defaults are used)
17
+ # e.g. {:preserve=>'yes',:shelve=>'no',:publish=>'no'}
18
+ attr_accessor :file_attributes
19
+
20
+ # relative path is useful when generating content metadata, if you want the file ids in the content metadata to be something other than the full path, it can be set
21
+ # if not, content metadata will get the full path
22
+ attr_accessor :relative_path
23
+
24
+ # provider checksums are optional checksums given by the provider used in content metadata generation
25
+ attr_accessor :provider_md5, :provider_sha1
26
+
27
+ # Initialize file from given path.
28
+ #
29
+ # @param [String] path full path to the file to be worked with
30
+ #
31
+ # Example:
32
+ # Assembly::ObjectFile.new('/input/path_to_file.tif')
33
+ def initialize(path,params={})
34
+ @path = path
35
+ @label = params[:label]
36
+ end
37
+
38
+ # Returns base DPG name for the current file.
39
+ #
40
+ # @return [String] DPG base filename, removing the extension and the '00','05', etc. placeholders
41
+ #
42
+ # Example:
43
+ # source_file=Assembly::ObjectFile.new('/input/cy565rm7188_00_001.tif')
44
+ # puts source_file.dpg_basename # "cy565rm7188_001"
45
+ def dpg_basename
46
+ file_parts=File.basename(path,ext).split('_')
47
+ file_parts.size == 3 ? "#{file_parts[0]}_#{file_parts[2]}" : filename_without_ext
48
+ end
49
+
50
+ # Returns DPG subfolder for the current file.
51
+ #
52
+ # @return [String] DPG subfolder for the given filename, i.e. '00','05', etc.
53
+ #
54
+ # Example:
55
+ # source_file=Assembly::ObjectFile.new('/input/cy565rm7188_00_001.tif')
56
+ # puts source_file.dpg_folder # "00"
57
+ def dpg_folder
58
+ file_parts=File.basename(path,ext).split('_')
59
+ file_parts.size == 3 ? file_parts[1] : ''
60
+ end
61
+
62
+ # Returns base filename for the current file.
63
+ #
64
+ # @return [String] base filename
65
+ #
66
+ # Example:
67
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
68
+ # puts source_file.filename # "path_to_file.tif"
69
+ def filename
70
+ File.basename(path)
71
+ end
72
+
73
+ # Returns base directory path for the current file.
74
+ #
75
+ # @return [String] base directory
76
+ #
77
+ # Example:
78
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
79
+ # puts source_file.dirname # "/input"
80
+ def dirname
81
+ File.dirname(path)
82
+ end
83
+
84
+ # Returns filename extension
85
+ #
86
+ # @return [String] filename extension
87
+ #
88
+ # Example:
89
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
90
+ # puts source_file.ext # ".tif"
91
+ def ext
92
+ File.extname(path)
93
+ end
94
+
95
+ # Returns base filename without extension for the current file.
96
+ #
97
+ # @return [String] base filename without extension
98
+ #
99
+ # Example:
100
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
101
+ # puts source_file.filename # "path_to_file"
102
+ def filename_without_ext
103
+ File.basename(path,ext)
104
+ end
105
+
106
+ # Returns exif information for the current file.
107
+ #
108
+ # @return [MiniExiftool] exif information stored as a hash and an object
109
+ #
110
+ # Example:
111
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
112
+ # puts source_file.exif # gives hash with exif information
113
+ def exif
114
+ check_for_file unless @exif
115
+ begin
116
+ @exif ||= MiniExiftool.new @path
117
+ rescue
118
+ @exif = nil
119
+ end
120
+ end
121
+
122
+ # Compute md5 checksum or return value if already computed
123
+ #
124
+ # @return [string] md5 checksum for given file
125
+ #
126
+ # Example:
127
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
128
+ # puts source_file.md5 # gives XXX123XXX1243XX1243
129
+ def md5
130
+ check_for_file unless @md5
131
+ @md5 ||= Digest::MD5.file(path).hexdigest
132
+ end
133
+
134
+ # Compute sha1 checksum or return value if already computed
135
+ #
136
+ # @return [string] sha1 checksum for given file
137
+ #
138
+ # Example:
139
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
140
+ # puts source_file.sha1 # gives XXX123XXX1243XX1243
141
+ def sha1
142
+ check_for_file unless @sha1
143
+ @sha1 ||= Digest::SHA1.file(path).hexdigest
144
+ end
145
+
146
+ # Returns mimetype information for the current file (only on unix based systems).
147
+ #
148
+ # @return [string] mime type for supplied file
149
+ #
150
+ # Example:
151
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.txt')
152
+ # puts source_file.mimetype # gives 'text/plain'
153
+ def mimetype
154
+ check_for_file unless @mimetype
155
+ if @mimetype.nil? # if we haven't computed it yet once for this object, try and get the mimetype
156
+ @mimetype = `file --mime-type "#{@path}"`.gsub(/\n/,"").split(':')[1].strip # first try and get the mimetype from the unix file command
157
+ @mimetype = exif.mimetype if (!Assembly::TRUSTED_MIMETYPES.include?(@mimetype) && !exif.nil? && !exif.mimetype.nil?) # if it's not a "trusted" mimetype and there is exif data; get the mimetype from the exif
158
+ end
159
+ return @mimetype
160
+ end
161
+
162
+ # Returns encoding information for the current file (only on unix based systems).
163
+ #
164
+ # @return [string] encoding for supplied file
165
+ #
166
+ # Example:
167
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.txt')
168
+ # puts source_file.encoding # gives 'us-ascii'
169
+ def encoding
170
+ check_for_file unless @encoding
171
+ @encoding ||= `file --mime-encoding "#{@path}"`.gsub(/\n/,"").split(':')[1].strip
172
+ end
173
+
174
+ # Returns a symbol with the objects type
175
+ #
176
+ # @return [symbol] the type of object, could be :application (for PDF or Word, etc), :audio, :image, :message, :model, :multipart, :text or :video
177
+ #
178
+ # Example:
179
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
180
+ # puts source_file.object_type # gives :image
181
+ def object_type
182
+ lookup=MIME::Types[mimetype][0]
183
+ return (lookup.nil? ? "other".to_sym : lookup.media_type.to_sym)
184
+ end
185
+
186
+ # Returns if the object file is an image.
187
+ #
188
+ # @return [boolean] if object is an image
189
+ #
190
+ # Example:
191
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
192
+ # puts source_file.image? # gives TRUE
193
+ def image?
194
+ object_type == :image
195
+ end
196
+
197
+ # Examines the input image for validity. Used to determine if image is a valid and useful image. If image is not a jp2, also checks for a valid profile.
198
+ #
199
+ # @return [boolean] true if image is valid, false if not.
200
+ #
201
+ # Example:
202
+ # source_img=Assembly::ObjectFile.new('/input/path_to_file.tif')
203
+ # puts source_img.valid_image? # gives true
204
+ def valid_image?
205
+
206
+ result= image? ? true : false
207
+ result= jp2able? unless mimetype == 'image/jp2' # further checks if we are not already a jp2
208
+
209
+ return result
210
+
211
+ end
212
+
213
+ # Examines the input image for validity to create a jp2. Same as valid_image? but also confirms the existence of a profile description and further restricts mimetypes.
214
+ # It is used by the assembly robots to decide if a jp2 will be created and is also called before you create a jp2 using assembly-image.
215
+ # @return [boolean] true if image should have a jp2 created, false if not.
216
+ #
217
+ # Example:
218
+ # source_img=Assembly::ObjectFile.new('/input/path_to_file.tif')
219
+ # puts source_img.jp2able? # gives true
220
+ def jp2able?
221
+
222
+ result=false
223
+ unless exif.nil?
224
+ result=(Assembly::VALID_IMAGE_MIMETYPES.include?(mimetype)) # check for allowed image mimetypes that can be converted to jp2
225
+ result=(exif['profiledescription'] != nil) # check for existence of profile description
226
+ end
227
+ return result
228
+
229
+ end
230
+
231
+ # Returns file size information for the current file in bytes.
232
+ #
233
+ # @return [integer] file size in bytes
234
+ #
235
+ # Example:
236
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
237
+ # puts source_file.filesize # gives 1345
238
+ def filesize
239
+ check_for_file
240
+ @filesize ||= File.size @path
241
+ end
242
+
243
+
244
+ # Determines if the file exists (and is not a directory)
245
+ #
246
+ # @return [boolean] file exists
247
+ #
248
+ # Example:
249
+ # source_file=Assembly::ObjectFile.new('/input/path_to_file.tif')
250
+ # puts source_file.file_exists? # gives true
251
+ def file_exists?
252
+ File.exists?(@path) && !File.directory?(@path)
253
+ end
254
+
255
+ private
256
+ # private method to check for file existence before operating on it
257
+ def check_for_file
258
+ raise "input file #{path} does not exist" unless file_exists?
259
+ end
260
+
261
+ end
262
+
263
+ end
@@ -0,0 +1,9 @@
1
+ # Main Assembly namespace
2
+ module Assembly
3
+
4
+ class ObjectFile
5
+ # Project version number
6
+ VERSION = "1.5.0"
7
+ end
8
+
9
+ end
Binary file
Binary file
Binary file
@@ -0,0 +1,563 @@
1
+ describe Assembly::ContentMetadata do
2
+
3
+ it "should generate valid content metadata with exif for a single tif and jp2 of style=simple_image, adding file attributes" do
4
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE)]
5
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:add_exif=>true,:add_file_attributes=>true,:objects=>objects)
6
+ result.class.should be String
7
+ xml = Nokogiri::XML(result)
8
+ xml.errors.size.should be 0
9
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
10
+ xml.xpath("//resource").length.should be 2
11
+ xml.xpath("//resource/file").length.should be 2
12
+ xml.xpath("//resource/file/checksum").length.should be 4
13
+ xml.xpath("//resource/file/checksum")[0].text.should == "8d11fab63089a24c8b17063d29a4b0eac359fb41"
14
+ xml.xpath("//resource/file/checksum")[1].text.should == "a2400500acf21e43f5440d93be894101"
15
+ xml.xpath("//resource/file/checksum")[2].text.should == "b965b5787e0100ec2d43733144120feab327e88c"
16
+ xml.xpath("//resource/file/checksum")[3].text.should == "4eb54050d374291ece622d45e84f014d"
17
+ xml.xpath("//label").length.should be 2
18
+ xml.xpath("//label")[0].text.should =~ /Image 1/
19
+ xml.xpath("//label")[1].text.should =~ /Image 2/
20
+ xml.xpath("//resource")[0].attributes['type'].value.should == "image"
21
+ xml.xpath("//resource")[1].attributes['type'].value.should == "image"
22
+ xml.xpath("//resource/file")[0].attributes['size'].value.should == "63542"
23
+ xml.xpath("//resource/file")[0].attributes['mimetype'].value.should == "image/tiff"
24
+ xml.xpath("//resource/file")[0].attributes['publish'].value.should == "no"
25
+ xml.xpath("//resource/file")[0].attributes['preserve'].value.should == "yes"
26
+ xml.xpath("//resource/file")[0].attributes['shelve'].value.should == "no"
27
+ xml.xpath("//resource/file/imageData")[0].attributes['width'].value.should == "100"
28
+ xml.xpath("//resource/file/imageData")[0].attributes['height'].value.should == "100"
29
+ xml.xpath("//resource/file")[1].attributes['size'].value.should == "306"
30
+ xml.xpath("//resource/file")[1].attributes['mimetype'].value.should == "image/jp2"
31
+ xml.xpath("//resource/file")[1].attributes['publish'].value.should == "yes"
32
+ xml.xpath("//resource/file")[1].attributes['preserve'].value.should == "no"
33
+ xml.xpath("//resource/file")[1].attributes['shelve'].value.should == "yes"
34
+ xml.xpath("//resource/file/imageData")[1].attributes['width'].value.should == "100"
35
+ xml.xpath("//resource/file/imageData")[1].attributes['height'].value.should == "100"
36
+ end
37
+
38
+ it "should generate valid content metadata with no exif for a single tif and jp2 of style=simple_image, adding specific file attributes for 2 objects, and defaults for 1 object" do
39
+ obj1=Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE)
40
+ obj2=Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE)
41
+ obj3=Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE2)
42
+ obj1.file_attributes={:publish=>'no',:preserve=>'no',:shelve=>'no'}
43
+ obj2.file_attributes={:publish=>'yes',:preserve=>'yes',:shelve=>'yes'}
44
+ objects=[obj1,obj2,obj3]
45
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:add_exif=>false,:add_file_attributes=>true,:objects=>objects)
46
+ result.class.should be String
47
+ xml = Nokogiri::XML(result)
48
+ xml.errors.size.should be 0
49
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
50
+ xml.xpath("//resource").length.should be 3
51
+ xml.xpath("//resource/file").length.should be 3
52
+ xml.xpath("//resource/file/checksum").length.should be 0
53
+ xml.xpath("//resource/file/imageData").length.should be 0
54
+ xml.xpath("//label").length.should be 3
55
+ xml.xpath("//label")[0].text.should =~ /Image 1/
56
+ xml.xpath("//label")[1].text.should =~ /Image 2/
57
+ xml.xpath("//label")[2].text.should =~ /Image 3/
58
+ xml.xpath("//resource")[0].attributes['type'].value.should == "image"
59
+ xml.xpath("//resource")[1].attributes['type'].value.should == "image"
60
+ xml.xpath("//resource")[2].attributes['type'].value.should == "image"
61
+ xml.xpath("//resource/file")[0].attributes['publish'].value.should == "no" # specificially set in object
62
+ xml.xpath("//resource/file")[0].attributes['preserve'].value.should == "no" # specificially set in object
63
+ xml.xpath("//resource/file")[0].attributes['shelve'].value.should == "no" # specificially set in object
64
+ xml.xpath("//resource/file")[1].attributes['publish'].value.should == "yes" # specificially set in object
65
+ xml.xpath("//resource/file")[1].attributes['preserve'].value.should == "yes" # specificially set in object
66
+ xml.xpath("//resource/file")[1].attributes['shelve'].value.should == "yes" # specificially set in object
67
+ xml.xpath("//resource/file")[2].attributes['publish'].value.should == "yes" # defaults by mimetype
68
+ xml.xpath("//resource/file")[2].attributes['preserve'].value.should == "no" # defaults by mimetype
69
+ xml.xpath("//resource/file")[2].attributes['shelve'].value.should == "yes" # defaults by mimetype
70
+ end
71
+
72
+
73
+ it "should generate valid content metadata with exif for a single tif and jp2 of style=simple_image overriding file labels" do
74
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE,:label=>'Sample tif label!'),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE,:label=>'Sample jp2 label!')]
75
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:add_exif=>true,:add_file_attributes=>true,:objects=>objects)
76
+ result.class.should be String
77
+ xml = Nokogiri::XML(result)
78
+ xml.errors.size.should be 0
79
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
80
+ xml.xpath("//resource").length.should be 2
81
+ xml.xpath("//resource/file").length.should be 2
82
+ xml.xpath("//resource/file/checksum").length.should be 4
83
+ xml.xpath("//resource/file/checksum")[0].text.should == "8d11fab63089a24c8b17063d29a4b0eac359fb41"
84
+ xml.xpath("//resource/file/checksum")[1].text.should == "a2400500acf21e43f5440d93be894101"
85
+ xml.xpath("//resource/file/checksum")[2].text.should == "b965b5787e0100ec2d43733144120feab327e88c"
86
+ xml.xpath("//resource/file/checksum")[3].text.should == "4eb54050d374291ece622d45e84f014d"
87
+ xml.xpath("//label").length.should be 2
88
+ xml.xpath("//label")[0].text.should =~ /Sample tif label!/
89
+ xml.xpath("//label")[1].text.should =~ /Sample jp2 label!/
90
+ xml.xpath("//resource")[0].attributes['type'].value.should == "image"
91
+ xml.xpath("//resource")[1].attributes['type'].value.should == "image"
92
+ xml.xpath("//resource/file")[0].attributes['size'].value.should == "63542"
93
+ xml.xpath("//resource/file")[0].attributes['mimetype'].value.should == "image/tiff"
94
+ xml.xpath("//resource/file")[0].attributes['publish'].value.should == "no"
95
+ xml.xpath("//resource/file")[0].attributes['preserve'].value.should == "yes"
96
+ xml.xpath("//resource/file")[0].attributes['shelve'].value.should == "no"
97
+ xml.xpath("//resource/file/imageData")[0].attributes['width'].value.should == "100"
98
+ xml.xpath("//resource/file/imageData")[0].attributes['height'].value.should == "100"
99
+ xml.xpath("//resource/file")[1].attributes['size'].value.should == "306"
100
+ xml.xpath("//resource/file")[1].attributes['mimetype'].value.should == "image/jp2"
101
+ xml.xpath("//resource/file")[1].attributes['publish'].value.should == "yes"
102
+ xml.xpath("//resource/file")[1].attributes['preserve'].value.should == "no"
103
+ xml.xpath("//resource/file")[1].attributes['shelve'].value.should == "yes"
104
+ xml.xpath("//resource/file/imageData")[1].attributes['width'].value.should == "100"
105
+ xml.xpath("//resource/file/imageData")[1].attributes['height'].value.should == "100"
106
+ end
107
+
108
+ it "should generate valid content metadata with exif for a single tif and jp2 of style=simple_image overriding file labels for one, and skipping auto labels for the others or for where the label is set but is blank" do
109
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE,:label=>'Sample tif label!'),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE,:label=>'')]
110
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:auto_labels=>false,:add_file_attributes=>true,:objects=>objects)
111
+ result.class.should be String
112
+ xml = Nokogiri::XML(result)
113
+ xml.errors.size.should be 0
114
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
115
+ xml.xpath("//resource").length.should be 3
116
+ xml.xpath("//resource/file").length.should be 3
117
+ xml.xpath("//label").length.should be 1
118
+ xml.xpath("//label")[0].text.should =~ /Sample tif label!/
119
+ end
120
+
121
+ it "should generate valid content metadata for a single tif and jp2 of style=simple_image with overriding file attributes and no exif data" do
122
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE)]
123
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:add_file_attributes=>true,:file_attributes=>{'image/tiff'=>{:publish=>'no',:preserve=>'no',:shelve=>'no'},'image/jp2'=>{:publish=>'yes',:preserve=>'yes',:shelve=>'yes'}},:objects=>objects)
124
+ result.class.should be String
125
+ xml = Nokogiri::XML(result)
126
+ xml.errors.size.should be 0
127
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
128
+ xml.xpath("//resource").length.should be 2
129
+ xml.xpath("//resource/file").length.should be 2
130
+ xml.xpath("//label").length.should be 2
131
+ xml.xpath("//resource/file/imageData").length.should be 0
132
+ xml.xpath("//label")[0].text.should =~ /Image 1/
133
+ xml.xpath("//label")[1].text.should =~ /Image 2/
134
+ xml.xpath("//resource")[0].attributes['type'].value.should == "image"
135
+ xml.xpath("//resource")[1].attributes['type'].value.should == "image"
136
+ xml.xpath("//resource/file")[0].attributes['size'].should be nil
137
+ xml.xpath("//resource/file")[0].attributes['mimetype'].should be nil
138
+ xml.xpath("//resource/file")[0].attributes['publish'].value.should == "no"
139
+ xml.xpath("//resource/file")[0].attributes['preserve'].value.should == "no"
140
+ xml.xpath("//resource/file")[0].attributes['shelve'].value.should == "no"
141
+ xml.xpath("//resource/file")[1].attributes['size'].should be nil
142
+ xml.xpath("//resource/file")[1].attributes['mimetype'].should be nil
143
+ xml.xpath("//resource/file")[1].attributes['publish'].value.should == "yes"
144
+ xml.xpath("//resource/file")[1].attributes['preserve'].value.should == "yes"
145
+ xml.xpath("//resource/file")[1].attributes['shelve'].value.should == "yes"
146
+ end
147
+
148
+ it "should generate valid content metadata for a single tif and jp2 of style=simple_image with overriding file attributes, including a default value, and no exif data" do
149
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE)]
150
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:add_file_attributes=>true,:file_attributes=>{'default'=>{:publish=>'yes',:preserve=>'no',:shelve=>'no'},'image/jp2'=>{:publish=>'yes',:preserve=>'yes',:shelve=>'yes'}},:objects=>objects)
151
+ result.class.should be String
152
+ xml = Nokogiri::XML(result)
153
+ xml.errors.size.should be 0
154
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
155
+ xml.xpath("//resource/file").length.should be 2
156
+ xml.xpath("//resource/file")[0].attributes['mimetype'].should be nil
157
+ xml.xpath("//resource/file")[0].attributes['publish'].value.should == "yes"
158
+ xml.xpath("//resource/file")[0].attributes['preserve'].value.should == "no"
159
+ xml.xpath("//resource/file")[0].attributes['shelve'].value.should == "no"
160
+ xml.xpath("//resource/file")[1].attributes['mimetype'].should be nil
161
+ xml.xpath("//resource/file")[1].attributes['publish'].value.should == "yes"
162
+ xml.xpath("//resource/file")[1].attributes['preserve'].value.should == "yes"
163
+ xml.xpath("//resource/file")[1].attributes['shelve'].value.should == "yes"
164
+ for i in 0..1 do
165
+ xml.xpath("//resource[@sequence='#{i+1}']/file").length.should be 1
166
+ xml.xpath("//label")[i].text.should == "Image #{i+1}"
167
+ xml.xpath("//resource")[i].attributes['type'].value.should == "image"
168
+ end
169
+ end
170
+
171
+ it "should generate valid content metadata for a single tif and jp2 of style=map with overriding file attributes, including a default value, and no exif data" do
172
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE)]
173
+ result = Assembly::ContentMetadata.create_content_metadata(:style=>:map,:druid=>TEST_DRUID,:add_file_attributes=>true,:file_attributes=>{'default'=>{:publish=>'yes',:preserve=>'no',:shelve=>'no'},'image/jp2'=>{:publish=>'yes',:preserve=>'yes',:shelve=>'yes'}},:objects=>objects)
174
+ result.class.should be String
175
+ xml = Nokogiri::XML(result)
176
+ xml.errors.size.should be 0
177
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "map"
178
+ xml.xpath("//resource/file").length.should be 2
179
+ xml.xpath("//resource/file")[0].attributes['mimetype'].should be nil
180
+ xml.xpath("//resource/file")[0].attributes['publish'].value.should == "yes"
181
+ xml.xpath("//resource/file")[0].attributes['preserve'].value.should == "no"
182
+ xml.xpath("//resource/file")[0].attributes['shelve'].value.should == "no"
183
+ xml.xpath("//resource/file")[1].attributes['mimetype'].should be nil
184
+ xml.xpath("//resource/file")[1].attributes['publish'].value.should == "yes"
185
+ xml.xpath("//resource/file")[1].attributes['preserve'].value.should == "yes"
186
+ xml.xpath("//resource/file")[1].attributes['shelve'].value.should == "yes"
187
+ for i in 0..1 do
188
+ xml.xpath("//resource[@sequence='#{i+1}']/file").length.should be 1
189
+ xml.xpath("//label")[i].text.should == "Image #{i+1}"
190
+ xml.xpath("//resource")[i].attributes['type'].value.should == "image"
191
+ end
192
+ end
193
+
194
+ it "should generate valid content metadata for two tifs two associated jp2s of style=simple_image using bundle=filename and no exif data" do
195
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE),Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE2),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE2)]
196
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:bundle=>:filename,:objects=>objects)
197
+ result.class.should be String
198
+ xml = Nokogiri::XML(result)
199
+ xml.errors.size.should be 0
200
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
201
+ xml.xpath("//resource").length.should be 2
202
+ xml.xpath("//resource/file").length.should be 4
203
+ xml.xpath("//resource[@sequence='1']/file")[0].attributes['id'].value.should == 'test.tif'
204
+ xml.xpath("//resource[@sequence='1']/file")[1].attributes['id'].value.should == 'test.jp2'
205
+ xml.xpath("//resource[@sequence='2']/file")[0].attributes['id'].value.should == 'test2.tif'
206
+ xml.xpath("//resource[@sequence='2']/file")[1].attributes['id'].value.should == 'test2.jp2'
207
+ xml.xpath("//label").length.should be 2
208
+ xml.xpath("//resource/file/imageData").length.should be 0
209
+ for i in 0..1 do
210
+ xml.xpath("//resource[@sequence='#{i+1}']/file").length.should be 2
211
+ xml.xpath("//label")[i].text.should == "Image #{i+1}"
212
+ xml.xpath("//resource")[i].attributes['type'].value.should == "image"
213
+ end
214
+ end
215
+
216
+ it "should generate valid content metadata for two tifs two associated jp2s of style=simple_image using bundle=dpg and no exif data and no root xml node" do
217
+ objects=[Assembly::ObjectFile.new(TEST_DPG_TIF),Assembly::ObjectFile.new(TEST_DPG_JP),Assembly::ObjectFile.new(TEST_DPG_TIF2),Assembly::ObjectFile.new(TEST_DPG_JP2)]
218
+ test_druid="#{TEST_DRUID}"
219
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>test_druid,:bundle=>:dpg,:objects=>objects,:include_root_xml=>false)
220
+ result.class.should be String
221
+ result.include?('<?xml').should be false
222
+ xml = Nokogiri::XML(result)
223
+ xml.errors.size.should be 0
224
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
225
+ test_druid.should == TEST_DRUID
226
+ xml.xpath("//contentMetadata")[0].attributes['objectId'].value.should == "#{TEST_DRUID}"
227
+ xml.xpath("//resource").length.should be 2
228
+ xml.xpath("//resource/file").length.should be 4
229
+ xml.xpath("//resource[@sequence='1']/file")[0].attributes['id'].value.should == "00/oo000oo0001_00_001.tif"
230
+ xml.xpath("//resource[@sequence='1']/file")[1].attributes['id'].value.should == "05/oo000oo0001_05_001.jp2"
231
+ xml.xpath("//resource[@sequence='2']/file")[0].attributes['id'].value.should == "00/oo000oo0001_00_002.tif"
232
+ xml.xpath("//resource[@sequence='2']/file")[1].attributes['id'].value.should == "05/oo000oo0001_05_002.jp2"
233
+ xml.xpath("//label").length.should be 2
234
+ xml.xpath("//resource/file/imageData").length.should be 0
235
+ for i in 0..1 do
236
+ xml.xpath("//resource[@sequence='#{i+1}']/file").length.should be 2
237
+ xml.xpath("//label")[i].text.should == "Image #{i+1}"
238
+ xml.xpath("//resource")[i].attributes['type'].value.should == "image"
239
+ end
240
+ end
241
+
242
+ it "should generate valid content metadata for two tifs, two associated jp2s, one combined pdf and one special tif of style=simple_book using bundle=dpg and no exif data and no root xml node, flattening folder structure" do
243
+ objects=[Assembly::ObjectFile.new(TEST_DPG_SPECIAL_PDF2),Assembly::ObjectFile.new(TEST_DPG_SPECIAL_TIF),Assembly::ObjectFile.new(TEST_DPG_TIF),Assembly::ObjectFile.new(TEST_DPG_JP),Assembly::ObjectFile.new(TEST_DPG_TIF2),Assembly::ObjectFile.new(TEST_DPG_JP2)]
244
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:style=>:simple_book,:bundle=>:dpg,:objects=>objects,:include_root_xml=>false,:flatten_folder_structure=>true)
245
+ result.class.should be String
246
+ result.include?('<?xml').should be false
247
+ xml = Nokogiri::XML(result)
248
+ xml.errors.size.should be 0
249
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "book"
250
+ xml.xpath("//contentMetadata")[0].attributes['objectId'].value.should == "#{TEST_DRUID}"
251
+ xml.xpath("//resource").length.should be 4
252
+ xml.xpath("//resource/file").length.should be 6
253
+ xml.xpath("//resource[@sequence='1']/file")[0].attributes['id'].value.should == "oo000oo0001_00_001.tif"
254
+ xml.xpath("//resource[@sequence='1']/file")[1].attributes['id'].value.should == "oo000oo0001_05_001.jp2"
255
+ xml.xpath("//resource[@sequence='2']/file")[0].attributes['id'].value.should == "oo000oo0001_00_002.tif"
256
+ xml.xpath("//resource[@sequence='2']/file")[1].attributes['id'].value.should == "oo000oo0001_05_002.jp2"
257
+ xml.xpath("//resource[@sequence='3']/file")[0].attributes['id'].value.should == "oo000oo0001_31_001.pdf"
258
+ xml.xpath("//resource[@sequence='4']/file")[0].attributes['id'].value.should == "oo000oo0001_50_001.tif"
259
+ xml.xpath("//label").length.should be 4
260
+ xml.xpath("//resource/file/imageData").length.should be 0
261
+ for i in 0..1 do
262
+ xml.xpath("//resource[@sequence='#{i+1}']/file").length.should be 2
263
+ xml.xpath("//label")[i].text.should == "Page #{i+1}"
264
+ xml.xpath("//resource")[i].attributes['type'].value.should == "page"
265
+ end
266
+ xml.xpath("//resource[@sequence='3']/file").length.should be 1
267
+ xml.xpath("//label")[2].text.should == "Object 1"
268
+ xml.xpath("//resource")[2].attributes['type'].value.should == "object"
269
+ xml.xpath("//resource[@sequence='4']/file").length.should be 1
270
+ xml.xpath("//label")[3].text.should == "Object 2"
271
+ xml.xpath("//resource")[3].attributes['type'].value.should == "object"
272
+ end
273
+
274
+ it "should generate valid content metadata with item having a 'druid:' prefix for two tifs,two associated jp2s,two associated pdfs, and one lingering PDF of style=simple_book using bundle=dpg, flattening folder structure" do
275
+ objects=[Assembly::ObjectFile.new(TEST_DPG_TIF),Assembly::ObjectFile.new(TEST_DPG_JP),Assembly::ObjectFile.new(TEST_DPG_PDF),Assembly::ObjectFile.new(TEST_DPG_TIF2),Assembly::ObjectFile.new(TEST_DPG_JP2),Assembly::ObjectFile.new(TEST_DPG_PDF2),Assembly::ObjectFile.new(TEST_DPG_SPECIAL_PDF1)]
276
+ test_druid="druid:#{TEST_DRUID}"
277
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>test_druid,:bundle=>:dpg,:objects=>objects,:style=>:simple_book,:flatten_folder_structure=>true)
278
+ result.class.should be String
279
+ result.include?('<?xml').should be true
280
+ xml = Nokogiri::XML(result)
281
+ xml.errors.size.should be 0
282
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "book"
283
+ xml.xpath("//contentMetadata")[0].attributes['objectId'].value.should == "#{TEST_DRUID}"
284
+ test_druid.should == "druid:#{TEST_DRUID}"
285
+ xml.xpath("//resource").length.should be 3
286
+ xml.xpath("//resource/file").length.should be 7
287
+
288
+ xml.xpath("//resource[@sequence='1']/file")[0].attributes['id'].value.should == "oo000oo0001_00_001.tif"
289
+ xml.xpath("//resource[@sequence='1']/file")[1].attributes['id'].value.should == "oo000oo0001_05_001.jp2"
290
+ xml.xpath("//resource[@sequence='1']/file")[2].attributes['id'].value.should == "oo000oo0001_15_001.pdf"
291
+ xml.xpath("//resource[@sequence='2']/file")[0].attributes['id'].value.should == "oo000oo0001_00_002.tif"
292
+ xml.xpath("//resource[@sequence='2']/file")[1].attributes['id'].value.should == "oo000oo0001_05_002.jp2"
293
+ xml.xpath("//resource[@sequence='2']/file")[2].attributes['id'].value.should == "oo000oo0001_15_002.pdf"
294
+ xml.xpath("//resource[@sequence='3']/file")[0].attributes['id'].value.should == "oo000oo0001_book.pdf"
295
+ xml.xpath("//label").length.should be 3
296
+ xml.xpath("//resource/file/imageData").length.should be 0
297
+ for i in 0..1 do
298
+ xml.xpath("//resource[@sequence='#{i+1}']/file").length.should be 3
299
+ xml.xpath("//label")[i].text.should == "Page #{i+1}"
300
+ xml.xpath("//resource")[i].attributes['type'].value.should == "page"
301
+ end
302
+ xml.xpath("//resource[@sequence='3']/file").length.should be 1
303
+ xml.xpath("//label")[2].text.should == "Object 1"
304
+ xml.xpath("//resource")[2].attributes['type'].value.should == "object"
305
+ end
306
+
307
+ it "should generate valid content metadata for two tifs,two associated jp2s,two associated pdfs, and one lingering PDF of style=book_with_pdf using bundle=dpg" do
308
+ objects=[Assembly::ObjectFile.new(TEST_DPG_TIF),Assembly::ObjectFile.new(TEST_DPG_JP),Assembly::ObjectFile.new(TEST_DPG_PDF),Assembly::ObjectFile.new(TEST_DPG_TIF2),Assembly::ObjectFile.new(TEST_DPG_JP2),Assembly::ObjectFile.new(TEST_DPG_SPECIAL_PDF1)]
309
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:bundle=>:dpg,:objects=>objects,:style=>:book_with_pdf)
310
+ result.class.should be String
311
+ xml = Nokogiri::XML(result)
312
+ xml.errors.size.should be 0
313
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "book"
314
+ xml.xpath("//resource").length.should be 3
315
+ xml.xpath("//resource/file").length.should be 6
316
+ xml.xpath("//resource[@sequence='1']/file")[0].attributes['id'].value.should == "00/oo000oo0001_00_001.tif"
317
+ xml.xpath("//resource[@sequence='1']/file")[1].attributes['id'].value.should == "05/oo000oo0001_05_001.jp2"
318
+ xml.xpath("//resource[@sequence='1']/file")[2].attributes['id'].value.should == "15/oo000oo0001_15_001.pdf"
319
+ xml.xpath("//resource[@sequence='2']/file")[0].attributes['id'].value.should == "00/oo000oo0001_00_002.tif"
320
+ xml.xpath("//resource[@sequence='2']/file")[1].attributes['id'].value.should == "05/oo000oo0001_05_002.jp2"
321
+ xml.xpath("//resource[@sequence='3']/file")[0].attributes['id'].value.should == "oo000oo0001_book.pdf"
322
+ xml.xpath("//label").length.should be 3
323
+ xml.xpath("//resource/file/imageData").length.should be 0
324
+ xml.xpath("//resource[@sequence='1']/file").length.should be 3
325
+ xml.xpath("//label")[0].text.should == "Object 1"
326
+ xml.xpath("//resource")[0].attributes['type'].value.should == "object"
327
+ xml.xpath("//resource[@sequence='2']/file").length.should be 2
328
+ xml.xpath("//label")[1].text.should == "Page 1"
329
+ xml.xpath("//resource")[1].attributes['type'].value.should == "page"
330
+ xml.xpath("//resource[@sequence='3']/file").length.should be 1
331
+ xml.xpath("//label")[2].text.should == "Object 2"
332
+ xml.xpath("//resource")[2].attributes['type'].value.should == "object"
333
+ end
334
+
335
+ it "should generate valid content metadata for two tifs two associated jp2s of style=simple_image using bundle=default and no exif data" do
336
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE),Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE2),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE2)]
337
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:bundle=>:default,:objects=>objects)
338
+ result.class.should be String
339
+ xml = Nokogiri::XML(result)
340
+ xml.errors.size.should be 0
341
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
342
+ xml.xpath("//resource").length.should be 4
343
+ xml.xpath("//resource/file").length.should be 4
344
+ xml.xpath("//resource/file")[0].attributes['id'].value.should == 'test.tif'
345
+ xml.xpath("//resource/file")[1].attributes['id'].value.should == 'test.jp2'
346
+ xml.xpath("//resource/file")[2].attributes['id'].value.should == 'test2.tif'
347
+ xml.xpath("//resource/file")[3].attributes['id'].value.should == 'test2.jp2'
348
+ xml.xpath("//label").length.should be 4
349
+ xml.xpath("//resource/file/imageData").length.should be 0
350
+ for i in 0..3 do
351
+ xml.xpath("//resource[@sequence='#{i+1}']/file").length.should be 1
352
+ xml.xpath("//label")[i].text.should == "Image #{i+1}"
353
+ xml.xpath("//resource")[i].attributes['type'].value.should == "image"
354
+ end
355
+ end
356
+
357
+ it "should generate valid content metadata for two tifs two associated jp2s of style=simple_image using bundle=default and no exif data, preserving full paths" do
358
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE),Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE2),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE2)]
359
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:bundle=>:default,:objects=>objects,:preserve_common_paths=>true)
360
+ result.class.should be String
361
+ xml = Nokogiri::XML(result)
362
+ xml.errors.size.should be 0
363
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
364
+ xml.xpath("//resource").length.should be 4
365
+ xml.xpath("//resource/file").length.should be 4
366
+ xml.xpath("//resource[@sequence='1']/file")[0].attributes['id'].value.should == TEST_TIF_INPUT_FILE
367
+ xml.xpath("//resource[@sequence='2']/file")[0].attributes['id'].value.should == TEST_JP2_INPUT_FILE
368
+ xml.xpath("//resource[@sequence='3']/file")[0].attributes['id'].value.should == TEST_TIF_INPUT_FILE2
369
+ xml.xpath("//resource[@sequence='4']/file")[0].attributes['id'].value.should == TEST_JP2_INPUT_FILE2
370
+ xml.xpath("//label").length.should be 4
371
+ xml.xpath("//resource/file/imageData").length.should be 0
372
+ for i in 0..3 do
373
+ xml.xpath("//resource[@sequence='#{i+1}']/file").length.should be 1
374
+ xml.xpath("//label")[i].text.should == "Image #{i+1}"
375
+ xml.xpath("//resource")[i].attributes['type'].value.should == "image"
376
+ end
377
+ end
378
+
379
+ it "should generate valid content metadata for two tifs two associated jp2s of style=file using specific content metadata paths" do
380
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE),Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE2),Assembly::ObjectFile.new(TEST_JP2_INPUT_FILE2)]
381
+ objects[0].relative_path='input/test.tif'
382
+ objects[1].relative_path='input/test.jp2'
383
+ objects[2].relative_path='input/test2.tif'
384
+ objects[3].relative_path='input/test2.jp2'
385
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:style=>:file,:objects=>objects)
386
+ result.class.should be String
387
+ xml = Nokogiri::XML(result)
388
+ xml.errors.size.should be 0
389
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "file"
390
+ xml.xpath("//resource").length.should be 4
391
+ xml.xpath("//resource/file").length.should be 4
392
+ xml.xpath("//label").length.should be 4
393
+ xml.xpath("//resource/file")[0].attributes['id'].value.should == 'input/test.tif'
394
+ xml.xpath("//resource/file")[1].attributes['id'].value.should == 'input/test.jp2'
395
+ xml.xpath("//resource/file")[2].attributes['id'].value.should == 'input/test2.tif'
396
+ xml.xpath("//resource/file")[3].attributes['id'].value.should == 'input/test2.jp2'
397
+ for i in 0..3 do
398
+ xml.xpath("//resource[@sequence='#{i+1}']/file").length.should be 1
399
+ xml.xpath("//label")[i].text.should == "File #{i+1}"
400
+ xml.xpath("//resource")[i].attributes['type'].value.should == "file"
401
+ end
402
+ end
403
+
404
+ it "should generate valid content metadata for two tifs of style=simple_book" do
405
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE2)]
406
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:style=>:simple_book,:objects=>objects)
407
+ result.class.should be String
408
+ xml = Nokogiri::XML(result)
409
+ xml.errors.size.should be 0
410
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "book"
411
+ xml.xpath("//resource").length.should be 2
412
+ xml.xpath("//resource/file").length.should be 2
413
+ xml.xpath("//label").length.should be 2
414
+ xml.xpath("//label")[0].text.should =~ /Page 1/
415
+ xml.xpath("//label")[1].text.should =~ /Page 2/
416
+ xml.xpath("//resource/file/imageData").length.should be 0
417
+ for i in 0..1 do
418
+ xml.xpath("//resource/file")[i].attributes['size'].should be nil
419
+ xml.xpath("//resource/file")[i].attributes['mimetype'].should be nil
420
+ xml.xpath("//resource/file")[i].attributes['publish'].should be nil
421
+ xml.xpath("//resource/file")[i].attributes['preserve'].should be nil
422
+ xml.xpath("//resource/file")[i].attributes['shelve'].should be nil
423
+ end
424
+ xml.xpath("//resource")[0].attributes['type'].value.should == "page"
425
+ xml.xpath("//resource")[1].attributes['type'].value.should == "page"
426
+ end
427
+
428
+ it "should generate valid content metadata for two tifs and one pdf of style=book_with_pdf" do
429
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE2),Assembly::ObjectFile.new(TEST_PDF_FILE)]
430
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:style=>:book_with_pdf,:objects=>objects)
431
+ result.class.should be String
432
+ xml = Nokogiri::XML(result)
433
+ xml.errors.size.should be 0
434
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "book"
435
+ xml.xpath("//resource").length.should be 3
436
+ xml.xpath("//resource/file").length.should be 3
437
+ xml.xpath("//label").length.should be 3
438
+ xml.xpath("//label")[0].text.should =~ /Page 1/
439
+ xml.xpath("//label")[1].text.should =~ /Page 2/
440
+ xml.xpath("//label")[2].text.should =~ /Object 1/
441
+ xml.xpath("//resource/file/imageData").length.should be 0
442
+ xml.xpath("//resource")[0].attributes['type'].value.should == "page"
443
+ xml.xpath("//resource")[1].attributes['type'].value.should == "page"
444
+ xml.xpath("//resource")[2].attributes['type'].value.should == "object"
445
+ end
446
+
447
+ it "should generate valid content metadata for two tifs of style=book_as_image" do
448
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE2)]
449
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:style=>:book_as_image,:objects=>objects)
450
+ result.class.should be String
451
+ xml = Nokogiri::XML(result)
452
+ xml.errors.size.should be 0
453
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "book"
454
+ xml.xpath("//resource").length.should be 2
455
+ xml.xpath("//resource/file").length.should be 2
456
+ xml.xpath("//label").length.should be 2
457
+ xml.xpath("//label")[0].text.should =~ /Image 1/
458
+ xml.xpath("//label")[1].text.should =~ /Image 2/
459
+ xml.xpath("//resource/file/imageData").length.should be 0
460
+ for i in 0..1 do
461
+ xml.xpath("//resource/file")[i].attributes['size'].should be nil
462
+ xml.xpath("//resource/file")[i].attributes['mimetype'].should be nil
463
+ xml.xpath("//resource/file")[i].attributes['publish'].should be nil
464
+ xml.xpath("//resource/file")[i].attributes['preserve'].should be nil
465
+ xml.xpath("//resource/file")[i].attributes['shelve'].should be nil
466
+ end
467
+ xml.xpath("//resource")[0].attributes['type'].value.should == "image"
468
+ xml.xpath("//resource")[1].attributes['type'].value.should == "image"
469
+ end
470
+
471
+ it "should generate valid content metadata with no exif but with user supplied checksums for two tifs of style=simple_book" do
472
+ obj1=Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE)
473
+ obj1.provider_md5='123456789'
474
+ obj1.provider_sha1='abcdefgh'
475
+ obj2=Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE2)
476
+ obj2.provider_md5='qwerty'
477
+ objects=[obj1,obj2]
478
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:style=>:simple_book,:objects=>objects)
479
+ result.class.should be String
480
+ xml = Nokogiri::XML(result)
481
+ xml.errors.size.should be 0
482
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "book"
483
+ xml.xpath("//resource").length.should be 2
484
+ xml.xpath("//resource/file").length.should be 2
485
+ xml.xpath("//resource/file/checksum").length.should be 3
486
+ xml.xpath("//label").length.should be 2
487
+ xml.xpath("//label")[0].text.should =~ /Page 1/
488
+ xml.xpath("//label")[1].text.should =~ /Page 2/
489
+ xml.xpath("//resource/file/imageData").length.should be 0
490
+ xml.xpath("//resource/file/checksum")[0].text.should == "abcdefgh"
491
+ xml.xpath("//resource/file/checksum")[1].text.should == "123456789"
492
+ xml.xpath("//resource/file/checksum")[2].text.should == "qwerty"
493
+ for i in 0..1 do
494
+ xml.xpath("//resource/file")[i].attributes['size'].should be nil
495
+ xml.xpath("//resource/file")[i].attributes['mimetype'].should be nil
496
+ xml.xpath("//resource/file")[i].attributes['publish'].should be nil
497
+ xml.xpath("//resource/file")[i].attributes['preserve'].should be nil
498
+ xml.xpath("//resource/file")[i].attributes['shelve'].should be nil
499
+ end
500
+ xml.xpath("//resource")[0].attributes['type'].value.should == "page"
501
+ xml.xpath("//resource")[1].attributes['type'].value.should == "page"
502
+ end
503
+
504
+ it "should not generate valid content metadata if not all input files exist" do
505
+ File.exists?(TEST_TIF_INPUT_FILE).should be true
506
+ junk_file='/tmp/flim_flam_floom.jp2'
507
+ File.exists?(junk_file).should be false
508
+ objects=[Assembly::ObjectFile.new(TEST_TIF_INPUT_FILE),Assembly::ObjectFile.new(junk_file)]
509
+ lambda {Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:objects=>objects)}.should raise_error
510
+ end
511
+
512
+ it "should generate valid content metadata for images and associated text files, of style=simple_image using bundle=prebundled, and no exif data" do
513
+ files=[[TEST_RES1_TIF1,TEST_RES1_JP1,TEST_RES1_TIF2,TEST_RES1_JP2,TEST_RES1_TEI,TEST_RES1_TEXT,TEST_RES1_PDF],[TEST_RES2_TIF1,TEST_RES2_JP1,TEST_RES2_TIF2,TEST_RES2_JP2,TEST_RES2_TEI,TEST_RES2_TEXT],[TEST_RES3_TIF1,TEST_RES3_JP1,TEST_RES3_TEI]]
514
+ objects=files.collect {|resource| resource.collect {|file| Assembly::ObjectFile.new(file)} }
515
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:bundle=>:prebundled,:style=>:simple_image,:objects=>objects)
516
+ result.class.should be String
517
+ xml = Nokogiri::XML(result)
518
+ xml.errors.size.should be 0
519
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "image"
520
+ xml.xpath("//resource").length.should be 3
521
+ xml.xpath("//resource/file").length.should be 16
522
+ xml.xpath("//resource[@sequence='1']/file")[0].attributes['id'].value.should == 'res1_image1.tif'
523
+ xml.xpath("//resource[@sequence='1']/file")[1].attributes['id'].value.should == 'res1_image1.jp2'
524
+ xml.xpath("//resource[@sequence='1']/file")[2].attributes['id'].value.should == 'res1_image2.tif'
525
+ xml.xpath("//resource[@sequence='1']/file")[3].attributes['id'].value.should == 'res1_image2.jp2'
526
+ xml.xpath("//resource[@sequence='1']/file")[4].attributes['id'].value.should == 'res1_teifile.txt'
527
+ xml.xpath("//resource[@sequence='1']/file")[5].attributes['id'].value.should == 'res1_textfile.txt'
528
+ xml.xpath("//resource[@sequence='1']/file")[6].attributes['id'].value.should == 'res1_transcript.pdf'
529
+ xml.xpath("//resource[@sequence='1']/file").length.should be 7
530
+
531
+ xml.xpath("//resource[@sequence='2']/file")[0].attributes['id'].value.should == 'res2_image1.tif'
532
+ xml.xpath("//resource[@sequence='2']/file")[1].attributes['id'].value.should == 'res2_image1.jp2'
533
+ xml.xpath("//resource[@sequence='2']/file")[2].attributes['id'].value.should == 'res2_image2.tif'
534
+ xml.xpath("//resource[@sequence='2']/file")[3].attributes['id'].value.should == 'res2_image2.jp2'
535
+ xml.xpath("//resource[@sequence='2']/file")[4].attributes['id'].value.should == 'res2_teifile.txt'
536
+ xml.xpath("//resource[@sequence='2']/file")[5].attributes['id'].value.should == 'res2_textfile.txt'
537
+ xml.xpath("//resource[@sequence='2']/file").length.should be 6
538
+
539
+ xml.xpath("//resource[@sequence='3']/file")[0].attributes['id'].value.should == 'res3_image1.tif'
540
+ xml.xpath("//resource[@sequence='3']/file")[1].attributes['id'].value.should == 'res3_image1.jp2'
541
+ xml.xpath("//resource[@sequence='3']/file")[2].attributes['id'].value.should == 'res3_teifile.txt'
542
+ xml.xpath("//resource[@sequence='3']/file").length.should be 3
543
+
544
+ xml.xpath("//label").length.should be 3
545
+ xml.xpath("//resource/file/imageData").length.should be 0
546
+ for i in 0..2 do
547
+ xml.xpath("//label")[i].text.should == "Image #{i+1}"
548
+ xml.xpath("//resource")[i].attributes['type'].value.should == "image"
549
+ end
550
+ end
551
+
552
+ it "should generate content metadata even when no objects are passed in" do
553
+ objects=[]
554
+ result = Assembly::ContentMetadata.create_content_metadata(:druid=>TEST_DRUID,:bundle=>:prebundled,:style=>:file,:objects=>objects)
555
+ result.class.should be String
556
+ xml = Nokogiri::XML(result)
557
+ xml.errors.size.should be 0
558
+ xml.xpath("//contentMetadata")[0].attributes['type'].value.should == "file"
559
+ xml.xpath("//resource").length.should be 0
560
+ xml.xpath("//resource/file").length.should be 0
561
+ end
562
+
563
+ end