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 65 66 67 68 69 70 71 72 73 |
# File 'lib/image_processing/processor.rb', line 55 def apply_operation(name, *args, &block) # Chainable performs the same check when operations are built, but that # guard only sees the outer builder method name, so it can be routed # around via the #operation meta-builder, #method_missing, or a nested # #send. This is the single point every operation is finally dispatched # through, so enforcing the guard here closes all of those paths. if ImageProcessing.unsafe_method?(self, name) fail Error, "#{name.inspect} is not a valid operation" end 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.
77 78 79 |
# File 'lib/image_processing/processor.rb', line 77 def custom(&block) (block && block.call(@accumulator)) || @accumulator end |