Class: ImageProcessing::Processor
- Inherits:
-
Object
- Object
- ImageProcessing::Processor
- Defined in:
- lib/image_processing/processor.rb
Overview
Abstract class inherited by individual processors.
Direct Known Subclasses
Class Method Summary collapse
-
.accumulator(name, klass) ⇒ Object
Use for processor subclasses to specify the name and the class of their accumulator object (e.g. MiniMagick::Tool or Vips::Image).
-
.apply_operation(accumulator, name, args, block) ⇒ Object
Delegates to #apply_operation.
- .call(source:, loader:, operations:, saver:, destination: nil) ⇒ Object
-
.supports_resize_on_load? ⇒ Boolean
Whether the processor supports resizing the image upon loading.
Instance Method Summary collapse
-
#apply_operation(name, *args, &block) ⇒ Object
Calls the operation to perform the processing.
-
#custom(&block) ⇒ Object
Calls the given block with the accumulator object.
-
#initialize(accumulator = nil) ⇒ Processor
constructor
A new instance of Processor.
Constructor Details
#initialize(accumulator = nil) ⇒ Processor
Returns a new instance of Processor.
47 48 49 |
# File 'lib/image_processing/processor.rb', line 47 def initialize(accumulator = nil) @accumulator = accumulator end |
Class Method Details
.accumulator(name, klass) ⇒ Object
Use for processor subclasses to specify the name and the class of their accumulator object (e.g. MiniMagick::Tool or Vips::Image).
31 32 33 34 35 |
# File 'lib/image_processing/processor.rb', line 31 def self.accumulator(name, klass) define_method(name) { @accumulator } protected(name) const_set(:ACCUMULATOR_CLASS, klass) end |
.apply_operation(accumulator, name, args, block) ⇒ Object
Delegates to #apply_operation.
38 39 40 |
# File 'lib/image_processing/processor.rb', line 38 def self.apply_operation(accumulator, (name, args, block)) new(accumulator).apply_operation(name, *args, &block) end |
.call(source:, loader:, operations:, saver:, destination: nil) ⇒ Object
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/image_processing/processor.rb', line 4 def self.call(source:, loader:, operations:, saver:, destination: nil) unless source.is_a?(String) || source.is_a?(self::ACCUMULATOR_CLASS) fail Error, "invalid source: #{source.inspect}" end if operations.dig(0, 0).to_s.start_with?("resize_") && loader.empty? && supports_resize_on_load? accumulator = source else accumulator = load_image(source, **loader) end operations.each do |operation| accumulator = apply_operation(accumulator, operation) end if destination save_image(accumulator, destination, **saver) else accumulator end end |
.supports_resize_on_load? ⇒ Boolean
Whether the processor supports resizing the image upon loading.
43 44 45 |
# File 'lib/image_processing/processor.rb', line 43 def self.supports_resize_on_load? false end |
Instance Method Details
#apply_operation(name, *args, &block) ⇒ Object
Calls the operation to perform the processing. If the operation is defined on the processor (macro), calls the method. Otherwise calls the operation directly on the accumulator object. This provides a common umbrella above defined macros and direct operations.
55 56 57 58 59 60 61 62 63 64 |
# File 'lib/image_processing/processor.rb', line 55 def apply_operation(name, *args, &block) receiver = respond_to?(name) ? self : @accumulator if args.last.is_a?(Hash) kwargs = args.pop receiver.public_send(name, *args, **kwargs, &block) else receiver.public_send(name, *args, &block) end end |
#custom(&block) ⇒ Object
Calls the given block with the accumulator object. Useful for when you want to access the accumulator object directly.
68 69 70 |
# File 'lib/image_processing/processor.rb', line 68 def custom(&block) (block && block.call(@accumulator)) || @accumulator end |