123456789_123456789_123456789_123456789_123456789_

Class: ActiveStorage::Previewer

Relationships & Source Files
Namespace Children
Classes:
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, Downloading
Inherits: Object
Defined in: activestorage/lib/active_storage/previewer.rb

Overview

This is an abstract base class for previewers, which generate images from blobs. See MuPDFPreviewer and VideoPreviewer for examples of concrete subclasses.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

  • #preview

    Override this method in a concrete subclass.

  • #draw(*argv) private

    Executes a system command, capturing its binary output in a tempfile.

  • #logger private

Downloading - Included

#download_blob_to

Efficiently downloads blob data into the given file.

#download_blob_to_tempfile

Opens a new tempfile in #tempdir and copies blob data into it.

#tempdir

Returns the directory in which tempfiles should be opened.

Constructor Details

.new(blob) ⇒ Previewer

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 20

def initialize(blob)
  @blob = blob
end

Class Method Details

.accept?(blob) ⇒ Boolean

Implement this method in a concrete subclass. Have it return true when given a blob from which the previewer can generate an image.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 16

def self.accept?(blob)
  false
end

Instance Attribute Details

#blob (readonly)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 12

attr_reader :blob

Instance Method Details

#draw(*argv) (private)

Executes a system command, capturing its binary output in a tempfile. Yields the tempfile.

Use this method to shell out to a system library (e.g. mupdf or ffmpeg) for preview image generation. The resulting tempfile can be used as the :io value in an attachable ::Hash:

def preview
  download_blob_to_tempfile do |input|
    draw "my-drawing-command", input.path, "--format", "png", "-" do |output|
      yield io: output, filename: "#{blob.filename.base}.png", content_type: "image/png"
    end
  end
end

The output tempfile is opened in the directory returned by Downloading#tempdir.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 45

def draw(*argv) #:doc:
  ActiveSupport::Notifications.instrument("preview.active_storage") do
    open_tempfile_for_drawing do |file|
      capture(*argv, to: file)
      yield file
    end
  end
end

#logger (private)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 70

def logger #:doc:
  ActiveStorage.logger
end

#preview

Override this method in a concrete subclass. Have it yield an attachable preview image (i.e. anything accepted by Attached::One#attach).

Raises:

  • (NotImplementedError)
[ GitHub ]

  
# File 'activestorage/lib/active_storage/previewer.rb', line 26

def preview
  raise NotImplementedError
end