/
analyzer.rb
50 lines (41 loc) · 1.36 KB
/
analyzer.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# frozen_string_literal: true
module ActiveStorage
# = Active Storage \Analyzer
#
# This is an abstract base class for analyzers, which extract metadata from blobs. See
# ActiveStorage::Analyzer::VideoAnalyzer for an example of a concrete subclass.
class Analyzer
attr_reader :blob
# Implement this method in a concrete subclass. Have it return true when given a blob from which
# the analyzer can extract metadata.
def self.accept?(blob)
false
end
# Implement this method in concrete subclasses. It will determine if blob analysis
# should be done in a job or performed inline. By default, analysis is enqueued in a job.
def self.analyze_later?
true
end
def initialize(blob)
@blob = blob
end
# Override this method in a concrete subclass. Have it return a Hash of metadata.
def metadata
raise NotImplementedError
end
private
# Downloads the blob to a tempfile on disk. Yields the tempfile.
def download_blob_to_tempfile(&block) # :doc:
blob.open tmpdir: tmpdir, &block
end
def logger # :doc:
ActiveStorage.logger
end
def tmpdir # :doc:
Dir.tmpdir
end
def instrument(analyzer, &block) # :doc:
ActiveSupport::Notifications.instrument("analyze.active_storage", analyzer: analyzer, &block)
end
end
end