hydra-derivatives 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e418eb7b224258c51b95ad6746452c9ffbf31676
4
- data.tar.gz: ebef5a24146e2eff209b238dadb307a0b7e98c8d
3
+ metadata.gz: 9c023bf84dd9a0305bbecdeda90d7d8986153adc
4
+ data.tar.gz: 24543bbc4676d4a992249de13bae1750b188622c
5
5
  SHA512:
6
- metadata.gz: a7e457990c5b95c834944b319f9355c6abc12870e733b652d4b05f898be684071f4e5595a56feaaf6c7348b90a6810e780f00096b206c30a02e7202d1133d1d3
7
- data.tar.gz: 4c5a120d2287b7f315bf78a01c644a08efc70ba0733fa295c62cce4d15ba64ef4aa15f3991afd3ce7a0c9fbd312e952b11bd4b7feaa7f9ae7792bd45a7e078a3
6
+ metadata.gz: 7634f4729547506988e49107de96224037b3b036e9d8f7feada641e4f338bcf7e9c3f03eaa77ea5c2ea6301d3bd0a83ac6090f1b464fadc3f651c9e25d12c8c1
7
+ data.tar.gz: f0e16f0e1652fe06eb9728f76e51aef55b1ac23b7023b99de0587456ae4186ea68df7163bac7b75c2900023beef7dd0d311d24763504a31d8da3feec575e7e46
data/.travis.yml CHANGED
@@ -1,7 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1
4
- - 2.0
3
+ - 2.
5
4
  env:
6
5
  global:
7
6
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
data/README.md CHANGED
@@ -14,15 +14,15 @@ If you have an ActiveFedora class like this:
14
14
  makes_derivatives do |obj|
15
15
  case obj.mime_type
16
16
  when 'application/pdf'
17
- obj.transform_file :content, { :thumb => "100x100>" }
17
+ obj.transform_file :original_file, { :thumb => "100x100>" }
18
18
  when 'audio/wav'
19
- obj.transform_file :content, { :mp3 => {format: 'mp3'}, :ogg => {format: 'ogg'} }, processor: :audio
19
+ obj.transform_file :original_file, { :mp3 => {format: 'mp3'}, :ogg => {format: 'ogg'} }, processor: :audio
20
20
  when 'video/avi'
21
- obj.transform_file :content, { :mp4 => {format: 'mp4'}, :webm => {format: 'webm'} }, processor: :video
21
+ obj.transform_file :original_file, { :mp4 => {format: 'mp4'}, :webm => {format: 'webm'} }, processor: :video
22
22
  when 'image/png', 'image/jpg'
23
- obj.transform_file :content, { :medium => "300x300>", :thumb => "100x100>" }
23
+ obj.transform_file :original_file, { :medium => "300x300>", :thumb => "100x100>" }
24
24
  when 'image/tiff'
25
- obj.transform_file :content, { :service => { resize: "3600x3600>" } }, processor: 'jpeg2k_image'
25
+ obj.transform_file :original_file, { :service => { resize: "3600x3600>" } }, processor: 'jpeg2k_image'
26
26
  end
27
27
  end
28
28
  end
@@ -34,7 +34,7 @@ Or a class like this:
34
34
  class GenericFile < ActiveFedora::Base
35
35
  include Hydra::Derivatives
36
36
 
37
- contains 'content'
37
+ contains 'original_file'
38
38
  attr_accessor :mime_type
39
39
 
40
40
  # Use a callback method to declare which derivatives you want
@@ -43,15 +43,15 @@ Or a class like this:
43
43
  def generate_derivatives
44
44
  case mime_type
45
45
  when 'application/pdf'
46
- transform_file :content, { :thumb => "100x100>" }
46
+ transform_file :original_file, { :thumb => "100x100>" }
47
47
  when 'audio/wav'
48
- transform_file :content, { :mp3 => {format: 'mp3'}, :ogg => {format: 'ogg'} }, processor: :audio
48
+ transform_file :original_file, { :mp3 => {format: 'mp3'}, :ogg => {format: 'ogg'} }, processor: :audio
49
49
  when 'video/avi'
50
- transform_file :content, { :mp4 => {format: 'mp4'}, :webm => {format: 'webm'} }, processor: :video
50
+ transform_file :original_file, { :mp4 => {format: 'mp4'}, :webm => {format: 'webm'} }, processor: :video
51
51
  when 'image/png', 'image/jpg'
52
- transform_file :content, { :medium => "300x300>", :thumb => {size: "100x100>", datastream: 'thumbnail'} }
52
+ transform_file :original_file, { :medium => "300x300>", :thumb => {size: "100x100>", datastream: 'thumbnail'} }
53
53
  when 'image/tiff'
54
- transform_file :content, { :service => { recipe: :default } }, processor: 'jpeg2k_image'
54
+ transform_file :original_file, { :service => { recipe: :default } }, processor: 'jpeg2k_image'
55
55
  end
56
56
  end
57
57
  end
@@ -61,7 +61,7 @@ And you add some content to it:
61
61
 
62
62
  ```ruby
63
63
  obj = GenericFile.new
64
- obj.content.content = File.open(...)
64
+ obj.original_file.content = File.open(...)
65
65
  obj.mime_type = 'image/jpg'
66
66
  obj.save
67
67
  ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.1
1
+ 2.0.0
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.add_dependency 'hydra-file_characterization', '~> 0.3'
27
27
  spec.add_dependency 'mini_magick', '>= 3.2', '< 5'
28
28
  spec.add_dependency 'activesupport', '~> 4.0'
29
- spec.add_dependency 'mime-types', '>= 1'
30
- spec.add_dependency 'deprecation', '~> 0.1'
29
+ spec.add_dependency 'mime-types', '< 3'
30
+ spec.add_dependency 'deprecation'
31
31
  end
32
32
 
@@ -1,6 +1,7 @@
1
1
  require 'active_fedora'
2
2
  require 'hydra/derivatives/railtie' if defined?(Rails)
3
3
  require 'deprecation'
4
+
4
5
  module Hydra
5
6
  module Derivatives
6
7
  extend ActiveSupport::Concern
@@ -18,8 +19,16 @@ module Hydra
18
19
  autoload :ExtractMetadata
19
20
  autoload :ShellBasedProcessor
20
21
  autoload :Jpeg2kImage
22
+ autoload :RawImage
21
23
  autoload :Logger
22
24
  autoload :TempfileService
25
+ autoload :IoDecorator
26
+
27
+ # services
28
+ autoload :RetrieveSourceFileService, 'hydra/derivatives/services/retrieve_source_file_service'
29
+ autoload :PersistOutputFileService, 'hydra/derivatives/services/persist_output_file_service'
30
+ autoload :PersistBasicContainedOutputFileService, 'hydra/derivatives/services/persist_basic_contained_output_file_service'
31
+ autoload :TempfileService, 'hydra/derivatives/services/tempfile_service'
23
32
 
24
33
  # Raised if the timout elapses
25
34
  class TimeoutError < ::Timeout::Error; end
@@ -33,7 +42,7 @@ module Hydra
33
42
  end
34
43
 
35
44
  [:ffmpeg_path, :libreoffice_path, :temp_file_base, :fits_path, :kdu_compress_path,
36
- :kdu_compress_recipes, :enable_ffmpeg].each do |method|
45
+ :kdu_compress_recipes, :enable_ffmpeg, :source_file_service, :output_file_service].each do |method|
37
46
  module_eval <<-RUBY
38
47
  def self.#{method.to_s}
39
48
  config.#{method.to_s}
@@ -68,6 +77,9 @@ module Hydra
68
77
  # @param file_name
69
78
  # @param [Hash] transform_directives - each key corresponds to a desired derivative. Associated values vary according to processor being used.
70
79
  # @param [Hash] opts for specifying things like choice of :processor (processor defaults to :image)
80
+ # @option opts [Symbol] :processor (:image) Processor to use
81
+ # @option opts [Class] :source_file_service (Hydra::Derivatives::RetrieveSourceFileService) service to use when persisting generated derivatives. The default for this can be set in your config file.
82
+ # @option opts [Class] :output_file_service (Hydra::Derivatives::PersistIndirectlyContainedOutputFile) service to use when retrieving the source. The default for this can be set in your config file.
71
83
  #
72
84
  # @example This will create content_thumb
73
85
  # transform_file :content, { :thumb => "100x100>" }
@@ -82,9 +94,14 @@ module Hydra
82
94
  # transform_file :content, { :mp3 => {format: 'mp3'}, :ogg => {format: 'ogg'} }, processor: :audio
83
95
  # transform_file :content, { :mp4 => {format: 'mp4'}, :webm => {format: 'webm'} }, processor: :video
84
96
  #
97
+ # @example Specify an output file service to use when persisting generated derivatives
98
+ # obj.transform_file :content, { mp4: { format: 'mp4' } }, processor: :video, output_file_service: My::System::PersistOutputFileToTapeStorage
99
+ #
100
+ # @example Specify a source file service to use when retrieving the source
101
+ # obj.transform_file :content, { mp4: { format: 'mp4' } }, processor: :video, source_file_service: My::System::PersistOutputFileToTapeStorage
102
+
85
103
  def transform_file(file_name, transform_directives, opts={})
86
- processor = processor_class(opts[:processor] || :image)
87
- processor.new(self, file_name, transform_directives).process
104
+ initialize_processor(file_name, transform_directives, opts).process
88
105
  end
89
106
 
90
107
  def processor_class(processor)
@@ -139,5 +156,11 @@ module Hydra
139
156
  end
140
157
  end
141
158
  end
159
+
160
+ private
161
+ def initialize_processor(file_name, transform_directives, opts={})
162
+ processor_class(opts[:processor] || :image).new(self, file_name, transform_directives, opts)
163
+ end
164
+
142
165
  end
143
166
  end
@@ -1,8 +1,10 @@
1
1
  module Hydra
2
2
  module Derivatives
3
3
  class Config
4
- attr_writer :ffmpeg_path, :libreoffice_path, :temp_file_base, :fits_path,
4
+ attr_writer :ffmpeg_path, :libreoffice_path, :temp_file_base,
5
+ :source_file_service, :output_file_service, :fits_path,
5
6
  :enable_ffmpeg, :kdu_compress_path, :kdu_compress_recipes
7
+
6
8
  def ffmpeg_path
7
9
  @ffmpeg_path ||= 'ffmpeg'
8
10
  end
@@ -15,6 +17,14 @@ module Hydra
15
17
  @temp_file_base ||= '/tmp'
16
18
  end
17
19
 
20
+ def source_file_service
21
+ @source_file_service ||= Hydra::Derivatives::RetrieveSourceFileService
22
+ end
23
+
24
+ def output_file_service
25
+ @output_file_service ||= Hydra::Derivatives::PersistBasicContainedOutputFileService
26
+ end
27
+
18
28
  def fits_path
19
29
  @fits_path ||= 'fits.sh'
20
30
  end
@@ -9,7 +9,7 @@ module Hydra
9
9
  execute "#{Hydra::Derivatives.libreoffice_path} --invisible --headless --convert-to #{format} --outdir #{outdir} #{path}"
10
10
  end
11
11
 
12
- def encode_file(dest_path, file_suffix, mime_type, options = { })
12
+ def encode_file(destination_name, file_suffix, mime_type, options = { })
13
13
  new_output = ''
14
14
  Hydra::Derivatives::TempfileService.create(source_file) do |f|
15
15
  if mime_type == 'image/jpeg'
@@ -23,8 +23,9 @@ module Hydra
23
23
  new_output = File.join(Hydra::Derivatives.temp_file_base, [File.basename(f.path).sub(File.extname(f.path), ''), file_suffix].join('.'))
24
24
  end
25
25
  end
26
- out_file = File.open(new_output, "rb")
27
- object.add_file(out_file.read, path: dest_path, mime_type: mime_type)
26
+ out_file = Hydra::Derivatives::IoDecorator.new(File.open(new_output, "rb"))
27
+ out_file.mime_type = mime_type
28
+ output_file_service.call(object, out_file, destination_name)
28
29
  File.unlink(out_file)
29
30
  end
30
31
 
@@ -22,7 +22,6 @@ module Hydra
22
22
  m = /\/([^\/]*)$/.match(uri)
23
23
  ["#{m[1]}-#{version_id}", "#{extension}"]
24
24
  end
25
-
26
25
  end
27
26
  end
28
27
  end
@@ -1,4 +1,5 @@
1
1
  require 'mini_magick'
2
+
2
3
  module Hydra
3
4
  module Derivatives
4
5
  class Image < Processor
@@ -20,9 +21,16 @@ module Hydra
20
21
  directives.each do |name, args|
21
22
  opts = args.kind_of?(Hash) ? args : {size: args}
22
23
  format = opts.fetch(:format, 'png')
23
- output_file_name = opts.fetch(:datastream, output_file_id(name))
24
- create_resized_image(output_file(output_file_name), opts[:size], format)
24
+ destination_name = output_filename_for(name, opts)
25
+ create_resized_image(destination_name, opts[:size], format)
26
+ end
27
+ end
28
+
29
+ def output_filename_for(name, opts = {})
30
+ if opts.has_key? :datastream
31
+ Deprecation.warn Hydra::Derivatives::Image, 'The :datastream option is deprecated and will be removed in a future release.'
25
32
  end
33
+ opts.fetch(:datastream, output_file_id(name))
26
34
  end
27
35
 
28
36
  protected
@@ -31,26 +39,28 @@ module Hydra
31
39
  MIME::Types.type_for(format).first.to_s
32
40
  end
33
41
 
34
- def create_resized_image(output_file, size, format, quality=nil)
35
- create_image(output_file, format, quality) do |xfrm|
42
+ def create_resized_image(destination_name, size, format, quality=nil)
43
+ create_image(destination_name, format, quality) do |xfrm|
36
44
  xfrm.resize(size) if size.present?
37
45
  end
38
- output_file.mime_type = new_mime_type(format)
39
46
  end
40
47
 
41
- def create_image(output_file, format, quality=nil)
48
+ def create_image(destination_name, format, quality=nil)
42
49
  xfrm = load_image_transformer
43
50
  yield(xfrm) if block_given?
44
51
  xfrm.format(format)
45
52
  xfrm.quality(quality.to_s) if quality
46
- write_image(output_file, xfrm)
53
+ write_image(destination_name, format, xfrm)
47
54
  end
48
55
 
49
- def write_image(output_file, xfrm)
50
- stream = StringIO.new
51
- xfrm.write(stream)
52
- stream.rewind
53
- output_file.content = stream
56
+ def write_image(destination_name, format, xfrm)
57
+ output_io = Hydra::Derivatives::IoDecorator.new(StringIO.new)
58
+ output_io.mime_type = new_mime_type(format)
59
+
60
+ xfrm.write(output_io)
61
+ output_io.rewind
62
+
63
+ output_file_service.call(object, output_io, destination_name)
54
64
  end
55
65
 
56
66
  # Override this method if you want a different transformer, or need to load the
@@ -0,0 +1,15 @@
1
+ # Nieve implementation of IO wrapper class that adds mime_type and original_name attributes.
2
+ # This is done so the attributes do not have to be passed as additional arguments,
3
+ # and are attached properly to the object they describe.
4
+ #
5
+ #
6
+ # Use SimpleDelegator to wrap the given class or instance
7
+ require 'delegate'
8
+
9
+ module Hydra
10
+ module Derivatives
11
+ class IoDecorator < SimpleDelegator
12
+ attr_accessor :mime_type, :original_name
13
+ end
14
+ end
15
+ end
@@ -25,7 +25,7 @@ module Hydra
25
25
  end
26
26
  end
27
27
 
28
- def encode_file(dest_path, recipe, opts={})
28
+ def encode_file(destination_name, recipe, opts={})
29
29
  output_file = self.class.tmp_file('.jp2')
30
30
  if opts[:file_path]
31
31
  self.class.encode(opts[:file_path], recipe, output_file)
@@ -34,8 +34,10 @@ module Hydra
34
34
  self.class.encode(f.path, recipe, output_file)
35
35
  end
36
36
  end
37
- out_file = File.open(output_file, "rb")
38
- object.add_file(out_file.read, path: dest_path, mime_type: 'image/jp2')
37
+ out_file = Hydra::Derivatives::IoDecorator.new(File.open(output_file, "rb"))
38
+ out_file.mime_type = "image/jp2"
39
+ output_file_service.call(object, out_file, destination_name)
40
+
39
41
  File.unlink(output_file)
40
42
  end
41
43
 
@@ -1,12 +1,14 @@
1
1
  module Hydra
2
2
  module Derivatives
3
3
  class Processor
4
- attr_accessor :object, :source_name, :directives
4
+ attr_accessor :object, :source_name, :directives, :source_file_service, :output_file_service
5
5
 
6
- def initialize(obj, source_name, directives)
6
+ def initialize(obj, source_name, directives, opts={})
7
7
  self.object = obj
8
8
  self.source_name = source_name
9
9
  self.directives = directives
10
+ self.source_file_service = opts.fetch(:source_file_service, Hydra::Derivatives.source_file_service)
11
+ self.output_file_service = opts.fetch(:output_file_service, Hydra::Derivatives.output_file_service)
10
12
  end
11
13
 
12
14
  def process
@@ -17,19 +19,13 @@ module Hydra
17
19
  [source_name, name].join('_')
18
20
  end
19
21
 
20
- def output_file(path)
21
- # first, check for a defined file
22
- output_file = if object.attached_files[path]
23
- object.attached_files[path]
24
- else
25
- ActiveFedora::File.new("#{object.uri}/#{path}").tap do |file|
26
- object.attach_file(file, path)
27
- end
28
- end
22
+ # @deprecated Please use a PersistOutputFileService class to save an object
23
+ def output_file
24
+ raise NotImplementedError, "Processor is an abstract class. Utilize an implementation of a PersistOutputFileService class in #{self.class.name}"
29
25
  end
30
-
26
+
31
27
  def source_file
32
- object.attached_files[source_name.to_s]
28
+ @source_file ||= source_file_service.call(object, source_name)
33
29
  end
34
30
 
35
31
  end
@@ -0,0 +1,45 @@
1
+ require 'mini_magick'
2
+
3
+ module Hydra
4
+ module Derivatives
5
+ class RawImage < Image
6
+ class_attribute :timeout
7
+
8
+ protected
9
+
10
+ def create_image(destination_name, format, quality=nil)
11
+ xfrm = load_image_transformer
12
+ # Transpose format and scaling due to the fact that ImageMagick can
13
+ # read but not write RAW files and this will otherwise cause many
14
+ # cryptic segmentation faults
15
+ xfrm.format(format)
16
+ yield(xfrm) if block_given?
17
+ xfrm.quality(quality.to_s) if quality
18
+ write_image(destination_name, format, xfrm)
19
+ remove_temp_files(xfrm)
20
+ end
21
+
22
+ # Delete any temp files that might clutter up the disk if
23
+ # you are doing a batch or don't touch your temporary storage
24
+ # for a long time
25
+ def remove_temp_files(xfrm)
26
+ xfrm.destroy!
27
+ end
28
+
29
+ # Override this method if you want a different transformer, or # need to load the raw image from a different source (e.g.
30
+ # external file).
31
+ #
32
+ # In this case always add an extension to help out MiniMagick
33
+ # with RAW files
34
+ def load_image_transformer
35
+ extension = MIME::Types[source_file.mime_type].first.extensions.first
36
+
37
+ if extension.present?
38
+ MiniMagick::Image.read(source_file.content, ".#{extension}")
39
+ else
40
+ MiniMagick::Image.read(source_file.content)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,25 @@
1
+ module Hydra::Derivatives
2
+ # This Service is an implementation of the Hydra::Derivatives::PeristOutputFileService
3
+ # It supports basic contained files, which is the behavior associated with Fedora 3 file datastreams that were migrated to Fedora 4
4
+ # and, at the time that this class was authored, corresponds to the behavior of ActiveFedora::Base.attach_file and ActiveFedora::Base.attached_files
5
+ ### Rename this
6
+ class PersistBasicContainedOutputFileService < PersistOutputFileService
7
+
8
+ # This method conforms to the signature of the .call method on Hydra::Derivatives::PeristOutputFileService
9
+ # * Persists the file within the object at destination_name
10
+ #
11
+ # NOTE: Uses basic containment. If you want to use direct containment (ie. with PCDM) you must use a different service (ie. Hydra::Works::AddFileToGenericFile Service)
12
+ #
13
+ # @param [ActiveFedora::Base] object file is be persisted to
14
+ # @param [File] filestream to be added, should respond to :mime_type and :original_name
15
+ # original_name will get used as the path for a chile resource in fedora, it is not a path to a file on disk.
16
+
17
+ def self.call(object, file, destination_path)
18
+ o_name = determine_original_name(file)
19
+ m_type = determine_mime_type(file)
20
+ object.add_file(file, path: destination_path, mime_type: m_type, original_name: o_name)
21
+ object.save
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ module Hydra::Derivatives
2
+ class PersistOutputFileService
3
+
4
+ # Persists the file within the object at destination_name. Uses basic containment.
5
+ # If you want to use direct containment (ie. with PCDM) you must use a different service (ie. Hydra::Works::AddFileToGenericFile Service)
6
+ # @param [Object] object the source file is attached to
7
+ # @param [File] filestream to be added, should respond to :mime_type, :original_name
8
+ # @param [String] destination_name is the fedora path at which the child resource will be found or created beneath the object.
9
+
10
+ def self.call(object, file, destination_path)
11
+ raise NotImplementedError, "PersistOutputFileService is an abstract class. Implement `call' on #{self.class.name}"
12
+ end
13
+
14
+ def self.determine_original_name( file )
15
+ if file.respond_to? :original_name
16
+ file.original_name
17
+ else
18
+ "derivative"
19
+ end
20
+ end
21
+
22
+ def self.determine_mime_type( file )
23
+ if file.respond_to? :mime_type
24
+ file.mime_type
25
+ else
26
+ "appliction/octet-stream"
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,12 @@
1
+ module Hydra::Derivatives
2
+ class RetrieveSourceFileService
3
+
4
+ # Retrieves the source
5
+ # @param [Object] object the source file is attached to
6
+ # @param [String] method name that can be called on object to retrieve the source file
7
+
8
+ def self.call(object, source_name)
9
+ object.send(source_name)
10
+ end
11
+ end
12
+ end
@@ -29,14 +29,15 @@ module Hydra
29
29
  {}
30
30
  end
31
31
 
32
- def encode_file(dest_path, file_suffix, mime_type, options)
32
+ def encode_file(destination_name, file_suffix, mime_type, options)
33
33
  out_file = nil
34
34
  output_file = Dir::Tmpname.create(['sufia', ".#{file_suffix}"], Hydra::Derivatives.temp_file_base){}
35
35
  Hydra::Derivatives::TempfileService.create(source_file) do |f|
36
36
  self.class.encode(f.path, options, output_file)
37
37
  end
38
- out_file = File.open(output_file, "rb")
39
- object.add_file(out_file.read, path: dest_path, mime_type: mime_type)
38
+ out_file = Hydra::Derivatives::IoDecorator.new(File.open(output_file, "rb"))
39
+ out_file.mime_type = mime_type
40
+ output_file_service.call(object, out_file, destination_name)
40
41
  File.unlink(output_file)
41
42
  end
42
43
 
Binary file
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::Derivatives::PersistBasicContainedOutputFileService do
4
+
5
+ before(:all) do
6
+ class BasicContainerObject < ActiveFedora::Base
7
+ contains "the_derivative_name"
8
+ end
9
+ end
10
+
11
+ let(:object) { BasicContainerObject.new }
12
+ let(:file_path) { File.join(fixture_path, 'test.tif') }
13
+ let(:file) { File.new(file_path)}
14
+ let(:destination_name) { 'the_derivative_name' }
15
+
16
+ # alas, we have to support this as the default because all legacy code (and fedora 3 systems) created basic contained files
17
+ # The new signature does not have a destination_name option. There is a default string that will get applied, but his might
18
+ # not be sufficient.
19
+ context "when file is basic contained (default assumption)" do
20
+ let(:object) { BasicContainerObject.new }
21
+ it "persists the file to the specified destination on the given object" do
22
+ described_class.call(object, "fake file content", destination_name)
23
+ expect(object.send(destination_name.to_sym).content).to eq("fake file content")
24
+ expect(object.send(destination_name.to_sym).content_changed?).to eq false
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::Derivatives::RetrieveSourceFileService do
4
+
5
+ before(:all) do
6
+
7
+ # Need a class that:
8
+ # 1) Allows you to set .uri= (to work with directly_contains)
9
+ # 2) has a metadata_node (to work with directly_contains_one)
10
+ class FileWithMetadata < ActiveFedora::File
11
+ include ActiveFedora::WithMetadata
12
+ end
13
+
14
+ class ObjectWithBasicContainer < ActiveFedora::Base
15
+ contains "contained_file"
16
+ end
17
+
18
+ class DirectContainerObject < ActiveFedora::Base
19
+ directly_contains :files, has_member_relation: ::RDF::URI("http://pcdm.org/use#hasFile"),
20
+ class_name: "FileWithMetadata"
21
+ directly_contains_one :directly_contained_file, through: :files, type: ::RDF::URI("http://pcdm.org/use#OriginalFile")
22
+ end
23
+ end
24
+
25
+ subject { described_class.call(object, source_name) }
26
+
27
+ context "when file is in basic container (default assumption)" do # alas, we have to support this as the default because all legacy code (and fedora 3 systems) created indirectly contained files
28
+ let(:object) { ObjectWithBasicContainer.new }
29
+ let(:content) { "fake file content (basic container)" }
30
+ let(:source_name) { 'contained_file' }
31
+
32
+ before do
33
+ # attaches the file as an indirectly contained object
34
+ object.contained_file.content = content
35
+ end
36
+ it "persists the file to the specified destination on the given object" do
37
+ expect(subject).to eq(object.contained_file)
38
+ end
39
+ end
40
+
41
+ context "when file is directly contained" do # direct containers are more efficient, but most legacy code will have indirect containers
42
+ let(:object) { DirectContainerObject.new }
43
+ let(:content) { "fake file content (direct container)" }
44
+ let(:source_name) { 'directly_contained_file' }
45
+
46
+ before do
47
+ object.save # can't build directly contained objects without saving the parent first
48
+ object.build_directly_contained_file
49
+ object.directly_contained_file.content = content
50
+ end
51
+ it "retrieves the file from the specified location on the given object" do
52
+ expect(subject).to eq(object.directly_contained_file)
53
+ end
54
+ end
55
+
56
+ end
data/spec/spec_helper.rb CHANGED
@@ -12,4 +12,15 @@ RSpec.configure do |config|
12
12
  end
13
13
  end
14
14
 
15
+ # Workaround for RAW image support until these are pushed upstream to
16
+ # the MIME Types gem
17
+ require 'mime-types'
18
+ dng_format = MIME::Type.new('image/x-adobe-dng')
19
+ dng_format.extensions = 'dng'
20
+ MIME::Types.add(dng_format)
21
+
15
22
  $in_travis = !ENV['TRAVIS'].nil? && ENV['TRAVIS'] == 'true'
23
+
24
+ def fixture_path
25
+ File.expand_path("../fixtures", __FILE__)
26
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "the configuration" do
4
- subject {Hydra::Derivatives }
4
+ subject { Hydra::Derivatives }
5
5
 
6
6
  it "should have some configuration defaults" do
7
7
  expect(subject.ffmpeg_path).to eq('ffmpeg')
@@ -10,6 +10,8 @@ describe "the configuration" do
10
10
  expect(subject.temp_file_base).to eq('/tmp')
11
11
  expect(subject.fits_path).to eq('fits.sh')
12
12
  expect(subject.kdu_compress_path).to eq('kdu_compress')
13
+ expect(subject.output_file_service).to eq(Hydra::Derivatives::PersistBasicContainedOutputFileService)
14
+ expect(subject.source_file_service).to eq(Hydra::Derivatives::RetrieveSourceFileService)
13
15
  end
14
16
 
15
17
  it "should let you change the configuration" do
@@ -21,6 +23,18 @@ describe "the configuration" do
21
23
 
22
24
  end
23
25
 
26
+ it "should let you set a custom output file service" do
27
+ output_file_service = double("MyOutputFileService")
28
+ subject.output_file_service = output_file_service
29
+ expect(subject.output_file_service).to eq(output_file_service)
30
+ end
31
+
32
+ it "should let you set a custom source file service" do
33
+ source_file_service = double("MyRetriveSourceFileService")
34
+ subject.source_file_service = source_file_service
35
+ expect(subject.source_file_service).to eq(source_file_service)
36
+ end
37
+
24
38
  it "should let you reset the configuration" do
25
39
  subject.ffmpeg_path = '/usr/local/ffmpeg-1.0/bin/ffmpeg'
26
40
  subject.reset_config!
@@ -8,11 +8,26 @@ describe Hydra::Derivatives do
8
8
  end
9
9
  class CustomProcessor < Hydra::Derivatives::Processor
10
10
  end
11
+ class CustomSourceFileService
12
+ end
13
+ class CustomOutputFileService
14
+ end
11
15
  end
12
16
 
13
17
  after(:all) do
14
18
  Object.send(:remove_const, :CustomFile)
15
19
  Object.send(:remove_const, :CustomProcessor)
20
+ Object.send(:remove_const, :CustomSourceFileService)
21
+ Object.send(:remove_const, :CustomOutputFileService)
22
+ end
23
+
24
+ describe "initialize_processor" do
25
+ subject{ CustomFile.new.send(:initialize_processor, :content, { thumb: '100x100>' }, processor: Hydra::Derivatives::Video::Processor, source_file_service: CustomSourceFileService, output_file_service: CustomOutputFileService) }
26
+ it "passes source_file_service and output_file_service options to the processor" do
27
+ expect(subject.class).to eq(Hydra::Derivatives::Video::Processor)
28
+ expect(subject.source_file_service).to eq(CustomSourceFileService)
29
+ expect(subject.output_file_service).to eq(CustomOutputFileService)
30
+ end
16
31
  end
17
32
 
18
33
  context "when using an included processor" do
@@ -13,7 +13,7 @@ describe Hydra::Derivatives::Image do
13
13
  let(:file_name) { 'content_thumb' }
14
14
 
15
15
  it "should use the string as the size and the name is autogenerated" do
16
- expect(subject).to receive(:create_resized_image).with(output_file, "100x100>", 'png')
16
+ expect(subject).to receive(:create_resized_image).with(file_name, "100x100>", 'png')
17
17
  subject.process
18
18
  end
19
19
  end
@@ -23,7 +23,7 @@ describe Hydra::Derivatives::Image do
23
23
  let(:file_name) { 'thumbnail' }
24
24
 
25
25
  it "should use the specified size and name" do
26
- expect(subject).to receive(:create_resized_image).with(output_file, "200x300>", 'png')
26
+ expect(subject).to receive(:create_resized_image).with(file_name, "200x300>", 'png')
27
27
  subject.process
28
28
  end
29
29
  end
@@ -33,7 +33,7 @@ describe Hydra::Derivatives::Image do
33
33
  let(:file_name) { 'content_thumb' }
34
34
 
35
35
  before do
36
- allow(subject).to receive(:create_resized_image).with(output_file, "100x100>", 'png')
36
+ allow(subject).to receive(:create_resized_image).with("100x100>", 'png')
37
37
  end
38
38
 
39
39
  context 'when set' do
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::Derivatives::Processor do
4
+
5
+ let(:object) { "Fake Object" }
6
+ let(:source_name) { 'content' }
7
+ let(:directives) { { thumb: "100x100>" } }
8
+
9
+ subject { Hydra::Derivatives::Processor.new(object, source_name, directives)}
10
+
11
+ describe "source_file" do
12
+ it "relies on the source_file_service" do
13
+ expect(subject.source_file_service).to receive(:call).with(object, source_name)
14
+ subject.source_file
15
+ end
16
+ end
17
+
18
+ describe "output_file_service" do
19
+ let(:custom_output_file_service) { "fake service" }
20
+ let(:another_custom_output_file_service) { "another fake service" }
21
+
22
+ context "as a global configuration setting" do
23
+ before do
24
+ allow(Hydra::Derivatives).to receive(:output_file_service).and_return(custom_output_file_service)
25
+ end
26
+ it "utilizes the default output file service" do
27
+ expect(subject.output_file_service).to eq(custom_output_file_service)
28
+ end
29
+ end
30
+
31
+ context "as an instance level configuration setting" do
32
+ subject { Hydra::Derivatives::Processor.new(object, source_name, directives, output_file_service: another_custom_output_file_service)}
33
+ it "accepts a custom output file service as an option" do
34
+ expect(subject.output_file_service).to eq(another_custom_output_file_service)
35
+ end
36
+ end
37
+ end
38
+
39
+ describe "source_file_service" do
40
+
41
+ let(:custom_source_file_service) { "fake service" }
42
+ let(:another_custom_source_file_service) { "another fake service" }
43
+
44
+ context "as a global configuration setting" do
45
+ before do
46
+ allow(Hydra::Derivatives).to receive(:source_file_service).and_return(custom_source_file_service)
47
+ end
48
+ it "utilizes the default source file service" do
49
+ expect(subject.source_file_service).to eq(custom_source_file_service)
50
+ end
51
+ end
52
+
53
+ context "as an instance level configuration setting" do
54
+ subject { Hydra::Derivatives::Processor.new(object, source_name, directives, source_file_service: another_custom_source_file_service)}
55
+ it "accepts a custom source file service as an option" do
56
+ expect(subject.source_file_service).to eq(another_custom_source_file_service)
57
+ end
58
+ end
59
+ end
60
+
61
+ end
@@ -14,42 +14,47 @@ describe "Transcoder" do
14
14
  end
15
15
 
16
16
  has_attributes :mime_type_from_fits, :flag_as, datastream: :characterization, multiple: false
17
- contains 'content', class_name: 'ContentDatastream'
17
+ contains 'original_file', class_name: 'ContentDatastream'
18
18
 
19
19
  makes_derivatives do |obj|
20
20
  case obj.mime_type_from_fits
21
21
  when 'application/pdf'
22
- obj.transform_file :content, { thumb: '100x100>' }
22
+ obj.transform_file :original_file, { thumb: '100x100>' }
23
23
  when 'audio/wav'
24
- obj.transform_file :content, { mp3: { format: 'mp3' }, ogg: { format: 'ogg'} }, processor: :audio
24
+ obj.transform_file :original_file, { mp3: { format: 'mp3' }, ogg: { format: 'ogg'} }, processor: :audio
25
25
  when 'video/avi'
26
- obj.transform_file :content, { mp4: { format: 'mp4' }, webm: { format: 'webm'}, thumbnail: { format: 'jpg', datastream: 'thumbnail' } }, processor: :video
26
+ obj.transform_file :original_file, { mp4: { format: 'mp4' }, webm: { format: 'webm'}, thumbnail: { format: 'jpg', datastream: 'thumbnail' } }, processor: :video
27
27
  when 'image/png', 'image/jpg'
28
- obj.transform_file :content, { medium: "300x300>", thumb: "100x100>", access: { format: 'jpg', datastream: 'access'} }
28
+ obj.transform_file :original_file, { medium: "300x300>", thumb: "100x100>", access: { format: 'jpg', datastream: 'access'} }
29
29
  when 'application/vnd.ms-powerpoint'
30
- obj.transform_file :content, { preservation: { format: 'pptx'}, access: { format: 'pdf' }, thumbnail: { format: 'jpg' } }, processor: 'document'
30
+ obj.transform_file :original_file, { preservation: { format: 'pptx'}, access: { format: 'pdf' }, thumbnail: { format: 'jpg' } }, processor: 'document'
31
31
  when 'text/rtf'
32
- obj.transform_file :content, { preservation: { format: 'odf' }, access: { format: 'pdf' }, thumbnail: { format: 'jpg' } }, processor: 'document'
32
+ obj.transform_file :original_file, { preservation: { format: 'odf' }, access: { format: 'pdf' }, thumbnail: { format: 'jpg' } }, processor: 'document'
33
33
  when 'application/msword'
34
- obj.transform_file :content, { access: { format: 'pdf' }, preservation: { format: 'docx' }, thumbnail: { format: 'jpg' } }, processor: 'document'
34
+ obj.transform_file :original_file, { access: { format: 'pdf' }, preservation: { format: 'docx' }, thumbnail: { format: 'jpg' } }, processor: 'document'
35
35
  when 'application/vnd.ms-excel'
36
- obj.transform_file :content, { access: { format: 'pdf' }, preservation: { format: 'xslx' }, thumbnail: { format: 'jpg' } }, processor: 'document'
36
+ obj.transform_file :original_file, { access: { format: 'pdf' }, preservation: { format: 'xslx' }, thumbnail: { format: 'jpg' } }, processor: 'document'
37
37
  when 'image/tiff'
38
- obj.transform_file :content, {
38
+ obj.transform_file :original_file, {
39
39
  resized: { recipe: :default, resize: "600x600>", datastream: 'resized' },
40
40
  config_lookup: { recipe: :default, datastream: 'config_lookup' },
41
41
  string_recipe: { recipe: '-quiet', datastream: 'string_recipe' },
42
42
  diy: { }
43
43
  }, processor: 'jpeg2k_image'
44
- end
45
-
44
+ when 'image/x-adobe-dng'
45
+ obj.transform_file :original_file,
46
+ {
47
+ access: { size: "300x300>", format: "jpg", datastream: "access" },
48
+ thumb: { size: "100x100>", format: "jpg", datastream: "thumb" }
49
+ }, processor: :raw_image
50
+ end
46
51
  end
47
52
 
48
53
  makes_derivatives :generate_special_derivatives
49
54
 
50
55
  def generate_special_derivatives
51
56
  if flag_as == "special" && mime_type_from_fits == 'image/png'
52
- transform_file :content, { medium: { size: "200x300>", datastream: 'special_ds' } }
57
+ transform_file :original_file, { medium: { size: "200x300>", datastream: 'special_ds' } }
53
58
  end
54
59
  end
55
60
  end
@@ -64,46 +69,68 @@ describe "Transcoder" do
64
69
  let(:attachment) { File.open(File.expand_path('../../fixtures/world.png', __FILE__))}
65
70
  let(:file) do
66
71
  GenericFile.new(mime_type_from_fits: 'image/png').tap do |f|
67
- f.content.content = attachment
72
+ f.original_file.content = attachment
68
73
  f.save!
69
74
  end
70
75
  end
71
76
 
72
77
  it "should transcode" do
73
- expect(file.attached_files.key?('content_medium')).to be_falsey
78
+ expect(file.attached_files.key?('original_file_medium')).to be_falsey
79
+ file.create_derivatives
80
+ expect(file.attached_files['original_file_medium']).to have_content
81
+ expect(file.attached_files['original_file_medium'].mime_type).to eq('image/png')
82
+ expect(file.attached_files['original_file_thumb']).to have_content
83
+ expect(file.attached_files['original_file_thumb'].mime_type).to eq('image/png')
84
+ expect(file.attached_files['access']).to have_content
85
+ expect(file.attached_files['access'].mime_type).to eq('image/jpeg')
86
+ expect(file.attached_files.key?('original_file_text')).to be_falsey
87
+ end
88
+ end
89
+
90
+ describe "with an attached RAW image", unless: $in_travis do
91
+ let(:attachment) { File.open(File.expand_path('../../fixtures/test.dng', __FILE__))}
92
+ let(:file) do
93
+ GenericFile.new(mime_type_from_fits: 'image/x-adobe-dng') do |f|
94
+ f.original_file.content = attachment
95
+ f.original_file.mime_type = 'image/x-adobe-dng'
96
+ f.save!
97
+ end
98
+ end
99
+
100
+ it "should transcode" do
101
+ expect(file.attached_files.key?('access')).to be_falsey
102
+ expect(file.attached_files.key?('thumb')).to be_falsey
103
+
74
104
  file.create_derivatives
75
- expect(file.attached_files['content_medium']).to have_content
76
- expect(file.attached_files['content_medium'].mime_type).to eq('image/png')
77
- expect(file.attached_files['content_thumb']).to have_content
78
- expect(file.attached_files['content_thumb'].mime_type).to eq('image/png')
79
105
  expect(file.attached_files['access']).to have_content
80
106
  expect(file.attached_files['access'].mime_type).to eq('image/jpeg')
81
- expect(file.attached_files.key?('content_text')).to be_falsey
107
+ expect(file.attached_files['thumb']).to have_content
108
+ expect(file.attached_files['thumb'].mime_type).to eq('image/jpeg')
82
109
  end
83
110
  end
84
111
 
85
112
  describe "with an attached pdf" do
86
113
  let(:attachment) { File.open(File.expand_path('../../fixtures/test.pdf', __FILE__))}
87
- let(:file) { GenericFile.new(mime_type_from_fits: 'application/pdf').tap { |t| t.content.content = attachment; t.save } }
114
+ let(:file) { GenericFile.new(mime_type_from_fits: 'application/pdf').tap { |t| t.original_file.content = attachment; t.save } }
88
115
 
89
116
  it "should transcode" do
90
- expect(file.attached_files.key?('content_thumb')).to be_falsey
117
+ expect(file.attached_files.key?('original_file_thumb')).to be_falsey
91
118
  file.create_derivatives
92
- expect(file.attached_files['content_thumb']).to have_content
93
- expect(file.attached_files['content_thumb'].mime_type).to eq('image/png')
119
+ expect(file.attached_files['original_file_thumb']).to have_content
120
+ expect(file.attached_files['original_file_thumb'].mime_type).to eq('image/png')
94
121
  end
95
122
  end
96
123
 
97
124
  describe "with an attached audio", unless: ENV['TRAVIS'] == 'true' do
98
125
  let(:attachment) { File.open(File.expand_path('../../fixtures/piano_note.wav', __FILE__))}
99
- let(:file) { GenericFile.new(mime_type_from_fits: 'audio/wav').tap { |t| t.content.content = attachment; t.save } }
126
+ let(:file) { GenericFile.new(mime_type_from_fits: 'audio/wav').tap { |t| t.original_file.content = attachment; t.save } }
100
127
 
101
128
  it "should transcode" do
102
129
  file.create_derivatives
103
- expect(file.attached_files['content_mp3']).to have_content
104
- expect(file.attached_files['content_mp3'].mime_type).to eq('audio/mpeg')
105
- expect(file.attached_files['content_ogg']).to have_content
106
- expect(file.attached_files['content_ogg'].mime_type).to eq('audio/ogg')
130
+ expect(file.attached_files['original_file_mp3']).to have_content
131
+ expect(file.attached_files['original_file_mp3'].mime_type).to eq('audio/mpeg')
132
+ expect(file.attached_files['original_file_ogg']).to have_content
133
+ expect(file.attached_files['original_file_ogg'].mime_type).to eq('audio/ogg')
107
134
  end
108
135
  end
109
136
 
@@ -111,8 +138,8 @@ describe "Transcoder" do
111
138
  let(:attachment) { File.open(File.expand_path('../../fixtures/piano_note.wav', __FILE__))}
112
139
  let(:file) do
113
140
  GenericFile.new(mime_type_from_fits: 'audio/wav').tap do |t|
114
- t.content.content = attachment;
115
- t.content.mime_type = 'audio/vnd.wav';
141
+ t.original_file.content = attachment;
142
+ t.original_file.mime_type = 'audio/vnd.wav';
116
143
  t.save
117
144
  end
118
145
  end
@@ -120,21 +147,21 @@ describe "Transcoder" do
120
147
  it "should transcode" do
121
148
  allow_any_instance_of(::Logger).to receive(:warn)
122
149
  file.create_derivatives
123
- expect(file.attached_files['content_mp3']).to have_content
124
- expect(file.attached_files['content_mp3'].mime_type).to eq('audio/mpeg')
150
+ expect(file.attached_files['original_file_mp3']).to have_content
151
+ expect(file.attached_files['original_file_mp3'].mime_type).to eq('audio/mpeg')
125
152
  end
126
153
  end
127
154
 
128
155
  describe "with an attached video", unless: ENV['TRAVIS'] == 'true' do
129
156
  let(:attachment) { File.open(File.expand_path('../../fixtures/countdown.avi', __FILE__))}
130
- let(:file) { GenericFile.new(mime_type_from_fits: 'video/avi').tap { |t| t.content.content = attachment; t.save } }
157
+ let(:file) { GenericFile.new(mime_type_from_fits: 'video/avi').tap { |t| t.original_file.content = attachment; t.save } }
131
158
 
132
159
  it "should transcode" do
133
160
  file.create_derivatives
134
- expect(file.attached_files['content_mp4']).to have_content
135
- expect(file.attached_files['content_mp4'].mime_type).to eq('video/mp4')
136
- expect(file.attached_files['content_webm']).to have_content
137
- expect(file.attached_files['content_webm'].mime_type).to eq('video/webm')
161
+ expect(file.attached_files['original_file_mp4']).to have_content
162
+ expect(file.attached_files['original_file_mp4'].mime_type).to eq('video/mp4')
163
+ expect(file.attached_files['original_file_webm']).to have_content
164
+ expect(file.attached_files['original_file_webm'].mime_type).to eq('video/webm')
138
165
  expect(file.attached_files['thumbnail']).to have_content
139
166
  expect(file.attached_files['thumbnail'].mime_type).to eq('image/jpeg')
140
167
  end
@@ -155,7 +182,7 @@ describe "Transcoder" do
155
182
 
156
183
  describe "using callback methods" do
157
184
  let(:attachment) { File.open(File.expand_path('../../fixtures/world.png', __FILE__))}
158
- let(:file) { GenericFile.new(mime_type_from_fits: 'image/png', flag_as: "special").tap { |t| t.content.content = attachment; t.save } }
185
+ let(:file) { GenericFile.new(mime_type_from_fits: 'image/png', flag_as: "special").tap { |t| t.original_file.content = attachment; t.save } }
159
186
 
160
187
  it "should transcode" do
161
188
  expect(file.attached_files.key?('special_ds')).to be_falsey
@@ -168,71 +195,71 @@ describe "Transcoder" do
168
195
 
169
196
  describe "with an attached Powerpoint", unless: ENV['TRAVIS'] == 'true' do
170
197
  let(:attachment) { File.open(File.expand_path('../../fixtures/FlashPix.ppt', __FILE__))}
171
- let(:file) { GenericFile.new(mime_type_from_fits: 'application/vnd.ms-powerpoint').tap { |t| t.content.content = attachment; t.save } }
198
+ let(:file) { GenericFile.new(mime_type_from_fits: 'application/vnd.ms-powerpoint').tap { |t| t.original_file.content = attachment; t.save } }
172
199
 
173
200
  it "should transcode" do
174
201
  file.create_derivatives
175
- expect(file.attached_files['content_thumbnail']).to have_content
176
- expect(file.attached_files['content_thumbnail'].mime_type).to eq('image/jpeg')
177
- expect(file.attached_files['content_access']).to have_content
178
- expect(file.attached_files['content_access'].mime_type).to eq('application/pdf')
179
- expect(file.attached_files['content_preservation']).to have_content
180
- expect(file.attached_files['content_preservation'].mime_type).to eq('application/vnd.openxmlformats-officedocument.presentationml.presentation')
202
+ expect(file.attached_files['original_file_thumbnail']).to have_content
203
+ expect(file.attached_files['original_file_thumbnail'].mime_type).to eq('image/jpeg')
204
+ expect(file.attached_files['original_file_access']).to have_content
205
+ expect(file.attached_files['original_file_access'].mime_type).to eq('application/pdf')
206
+ expect(file.attached_files['original_file_preservation']).to have_content
207
+ expect(file.attached_files['original_file_preservation'].mime_type).to eq('application/vnd.openxmlformats-officedocument.presentationml.presentation')
181
208
  end
182
209
  end
183
210
 
184
211
  describe "with an attached rich text format", unless: ENV['TRAVIS'] == 'true' do
185
212
  let(:attachment) { File.open(File.expand_path('../../fixtures/sample.rtf', __FILE__))}
186
- let(:file) { GenericFile.new(mime_type_from_fits: 'text/rtf').tap { |t| t.content.content = attachment; t.save } }
213
+ let(:file) { GenericFile.new(mime_type_from_fits: 'text/rtf').tap { |t| t.original_file.content = attachment; t.save } }
187
214
 
188
215
  it "should transcode" do
189
216
  file.create_derivatives
190
- expect(file.attached_files['content_thumbnail']).to have_content
191
- expect(file.attached_files['content_thumbnail'].mime_type).to eq('image/jpeg')
192
- expect(file.attached_files['content_access']).to have_content
193
- expect(file.attached_files['content_access'].mime_type).to eq('application/pdf')
194
- expect(file.attached_files['content_preservation']).to have_content
195
- expect(file.attached_files['content_preservation'].mime_type).to eq('application/vnd.oasis.opendocument.text')
217
+ expect(file.attached_files['original_file_thumbnail']).to have_content
218
+ expect(file.attached_files['original_file_thumbnail'].mime_type).to eq('image/jpeg')
219
+ expect(file.attached_files['original_file_access']).to have_content
220
+ expect(file.attached_files['original_file_access'].mime_type).to eq('application/pdf')
221
+ expect(file.attached_files['original_file_preservation']).to have_content
222
+ expect(file.attached_files['original_file_preservation'].mime_type).to eq('application/vnd.oasis.opendocument.text')
196
223
  end
197
224
  end
198
225
 
199
226
  describe "with an attached word doc format", unless: ENV['TRAVIS'] == 'true' do
200
227
  let(:attachment) { File.open(File.expand_path('../../fixtures/test.doc', __FILE__))}
201
- let(:file) { GenericFile.new(mime_type_from_fits: 'application/msword').tap { |t| t.content.content = attachment; t.save } }
228
+ let(:file) { GenericFile.new(mime_type_from_fits: 'application/msword').tap { |t| t.original_file.content = attachment; t.save } }
202
229
 
203
230
  it "should transcode" do
204
231
  file.create_derivatives
205
- expect(file.attached_files['content_thumbnail']).to have_content
206
- expect(file.attached_files['content_thumbnail'].mime_type).to eq('image/jpeg')
207
- expect(file.attached_files['content_access']).to have_content
208
- expect(file.attached_files['content_access'].mime_type).to eq('application/pdf')
209
- expect(file.attached_files['content_preservation']).to have_content
210
- expect(file.attached_files['content_preservation'].mime_type).to eq('application/vnd.openxmlformats-officedocument.wordprocessingml.document')
232
+ expect(file.attached_files['original_file_thumbnail']).to have_content
233
+ expect(file.attached_files['original_file_thumbnail'].mime_type).to eq('image/jpeg')
234
+ expect(file.attached_files['original_file_access']).to have_content
235
+ expect(file.attached_files['original_file_access'].mime_type).to eq('application/pdf')
236
+ expect(file.attached_files['original_file_preservation']).to have_content
237
+ expect(file.attached_files['original_file_preservation'].mime_type).to eq('application/vnd.openxmlformats-officedocument.wordprocessingml.document')
211
238
  end
212
239
  end
213
240
 
214
241
  describe "with an attached excel format", unless: ENV['TRAVIS'] == 'true' do
215
242
  let(:attachment) { File.open(File.expand_path('../../fixtures/test.xls', __FILE__))}
216
- let(:file) { GenericFile.new(mime_type_from_fits: 'application/vnd.ms-excel').tap { |t| t.content.content = attachment; t.save } }
243
+ let(:file) { GenericFile.new(mime_type_from_fits: 'application/vnd.ms-excel').tap { |t| t.original_file.content = attachment; t.save } }
217
244
 
218
245
  it "should transcode" do
219
246
  file.create_derivatives
220
- expect(file.attached_files['content_thumbnail']).to have_content
221
- expect(file.attached_files['content_thumbnail'].mime_type).to eq('image/jpeg')
222
- expect(file.attached_files['content_access']).to have_content
223
- expect(file.attached_files['content_access'].mime_type).to eq('application/pdf')
224
- expect(file.attached_files['content_preservation']).to have_content
225
- expect(file.attached_files['content_preservation'].mime_type).to eq('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
247
+ expect(file.attached_files['original_file_thumbnail']).to have_content
248
+ expect(file.attached_files['original_file_thumbnail'].mime_type).to eq('image/jpeg')
249
+ expect(file.attached_files['original_file_access']).to have_content
250
+ expect(file.attached_files['original_file_access'].mime_type).to eq('application/pdf')
251
+ expect(file.attached_files['original_file_preservation']).to have_content
252
+ expect(file.attached_files['original_file_preservation'].mime_type).to eq('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
226
253
  end
227
254
  end
228
255
 
229
256
  describe "with an attached tiff", unless: ENV['TRAVIS'] == 'true' do
230
257
  let(:attachment) { File.open(File.expand_path('../../fixtures/test.tif', __FILE__))}
231
- let(:file) { GenericFile.new(mime_type_from_fits: 'image/tiff').tap { |t| t.content.content = attachment; t.save } }
258
+ let(:file) { GenericFile.new(mime_type_from_fits: 'image/tiff').tap { |t| t.original_file.content = attachment; t.save } }
232
259
  it "should transcode" do
233
260
  file.create_derivatives
234
- expect(file.attached_files['content_diy']).to have_content
235
- expect(file.attached_files['content_diy'].mime_type).to eq('image/jp2')
261
+ expect(file.attached_files['original_file_diy']).to have_content
262
+ expect(file.attached_files['original_file_diy'].mime_type).to eq('image/jp2')
236
263
  expect(file.attached_files['config_lookup']).to have_content
237
264
  expect(file.attached_files['config_lookup'].mime_type).to eq('image/jp2')
238
265
  expect(file.attached_files['resized']).to have_content
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hydra-derivatives
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-18 00:00:00.000000000 Z
11
+ date: 2015-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -132,30 +132,30 @@ dependencies:
132
132
  name: mime-types
133
133
  requirement: !ruby/object:Gem::Requirement
134
134
  requirements:
135
- - - ">="
135
+ - - "<"
136
136
  - !ruby/object:Gem::Version
137
- version: '1'
137
+ version: '3'
138
138
  type: :runtime
139
139
  prerelease: false
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
- - - ">="
142
+ - - "<"
143
143
  - !ruby/object:Gem::Version
144
- version: '1'
144
+ version: '3'
145
145
  - !ruby/object:Gem::Dependency
146
146
  name: deprecation
147
147
  requirement: !ruby/object:Gem::Requirement
148
148
  requirements:
149
- - - "~>"
149
+ - - ">="
150
150
  - !ruby/object:Gem::Version
151
- version: '0.1'
151
+ version: '0'
152
152
  type: :runtime
153
153
  prerelease: false
154
154
  version_requirements: !ruby/object:Gem::Requirement
155
155
  requirements:
156
- - - "~>"
156
+ - - ">="
157
157
  - !ruby/object:Gem::Version
158
- version: '0.1'
158
+ version: '0'
159
159
  description: Derivative generation plugin for hydra
160
160
  email:
161
161
  - justin@curationexperts.com
@@ -185,12 +185,17 @@ files:
185
185
  - lib/hydra/derivatives/extract_metadata.rb
186
186
  - lib/hydra/derivatives/ffmpeg.rb
187
187
  - lib/hydra/derivatives/image.rb
188
+ - lib/hydra/derivatives/io_decorator.rb
188
189
  - lib/hydra/derivatives/jpeg2k_image.rb
189
190
  - lib/hydra/derivatives/logger.rb
190
191
  - lib/hydra/derivatives/processor.rb
191
192
  - lib/hydra/derivatives/railtie.rb
193
+ - lib/hydra/derivatives/raw_image.rb
194
+ - lib/hydra/derivatives/services/persist_basic_contained_output_file_service.rb
195
+ - lib/hydra/derivatives/services/persist_output_file_service.rb
196
+ - lib/hydra/derivatives/services/retrieve_source_file_service.rb
197
+ - lib/hydra/derivatives/services/tempfile_service.rb
192
198
  - lib/hydra/derivatives/shell_based_processor.rb
193
- - lib/hydra/derivatives/tempfile_service.rb
194
199
  - lib/hydra/derivatives/video.rb
195
200
  - lib/hydra/derivatives/video/config.rb
196
201
  - lib/hydra/derivatives/video/processor.rb
@@ -200,6 +205,7 @@ files:
200
205
  - spec/fixtures/jpeg2k_config.yml
201
206
  - spec/fixtures/piano_note.wav
202
207
  - spec/fixtures/sample.rtf
208
+ - spec/fixtures/test.dng
203
209
  - spec/fixtures/test.doc
204
210
  - spec/fixtures/test.docx
205
211
  - spec/fixtures/test.pdf
@@ -209,6 +215,8 @@ files:
209
215
  - spec/fixtures/test.xlsx
210
216
  - spec/fixtures/world.png
211
217
  - spec/lib/hydra/derivatives/extract_metadata_spec.rb
218
+ - spec/services/persist_basic_contained_output_file_service_spec.rb
219
+ - spec/services/retrieve_source_file_service_spec.rb
212
220
  - spec/services/tempfile_service_spec.rb
213
221
  - spec/spec_helper.rb
214
222
  - spec/units/config_spec.rb
@@ -217,6 +225,7 @@ files:
217
225
  - spec/units/image_spec.rb
218
226
  - spec/units/jpeg2k_spec.rb
219
227
  - spec/units/logger_spec.rb
228
+ - spec/units/processor_spec.rb
220
229
  - spec/units/shell_based_processor_spec.rb
221
230
  - spec/units/transcoding_spec.rb
222
231
  - spec/units/video_spec.rb
@@ -240,7 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
240
249
  version: '0'
241
250
  requirements: []
242
251
  rubyforge_project:
243
- rubygems_version: 2.5.1
252
+ rubygems_version: 2.4.5
244
253
  signing_key:
245
254
  specification_version: 4
246
255
  summary: Derivative generation plugin for hydra
@@ -251,6 +260,7 @@ test_files:
251
260
  - spec/fixtures/jpeg2k_config.yml
252
261
  - spec/fixtures/piano_note.wav
253
262
  - spec/fixtures/sample.rtf
263
+ - spec/fixtures/test.dng
254
264
  - spec/fixtures/test.doc
255
265
  - spec/fixtures/test.docx
256
266
  - spec/fixtures/test.pdf
@@ -260,6 +270,8 @@ test_files:
260
270
  - spec/fixtures/test.xlsx
261
271
  - spec/fixtures/world.png
262
272
  - spec/lib/hydra/derivatives/extract_metadata_spec.rb
273
+ - spec/services/persist_basic_contained_output_file_service_spec.rb
274
+ - spec/services/retrieve_source_file_service_spec.rb
263
275
  - spec/services/tempfile_service_spec.rb
264
276
  - spec/spec_helper.rb
265
277
  - spec/units/config_spec.rb
@@ -268,7 +280,7 @@ test_files:
268
280
  - spec/units/image_spec.rb
269
281
  - spec/units/jpeg2k_spec.rb
270
282
  - spec/units/logger_spec.rb
283
+ - spec/units/processor_spec.rb
271
284
  - spec/units/shell_based_processor_spec.rb
272
285
  - spec/units/transcoding_spec.rb
273
286
  - spec/units/video_spec.rb
274
- has_rdoc: