Module: Nozzle::Adapter

Included in:
DataMapper
Defined in:
lib/nozzle/adapter.rb,
lib/nozzle/adapter/base.rb,
lib/nozzle/adapter/image.rb,
lib/nozzle/adapter/outlet.rb

Defined Under Namespace

Modules: Outlet Classes: Base, Image

Instance Method Summary collapse

Instance Method Details

#adapter_classesObject

:nodoc:



67
68
69
# File 'lib/nozzle/adapter.rb', line 67

def adapter_classes # :nodoc:
  @adapter_classes ||= {}
end

#adapter_optionsObject

:nodoc:



71
72
73
# File 'lib/nozzle/adapter.rb', line 71

def adapter_options # :nodoc:
  @adapter_options ||= {}
end

#install_adapter(column, adapter = nil, options = {}) ⇒ Object

Installs default or custom adapter to a class.

class Example
  attr_accessor :file, :avatar, :thumb
  include Nozzle::Adapter
  install_adapter( :file )
  install_adapter( :avatar, CustomAdapter )
  install_adapter( :thumb, Nozzle::Adapter::Image, :thumb_size => '90x60' )
  def save
    file_after_save; avatar_after_save; thumb_after_save
  end
  def destroy
    file_after_destroy; avatar_after_destroy; thumb_after_destroy
  end
enc

The class MUST have readers and writers to install corresponding adapters. install_adapter overrides these methods and saves the originals in original_avatar and original_avatar= aliases. The originals are called to save and load the filename of stored asset.

The class MUST call avatar_after_save and avatar_after_destroy after the corresponding events. avatar_after_save does some IO to move or copy temporary file. avatar_after_destroy deletes the stored file.

Note: options are only supported when adapter is specified.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/nozzle/adapter.rb', line 31

def install_adapter( column, adapter = nil, options = {} )
  attr_accessor :"#{column}_adapter"
  adapter_classes[column] = adapter || Base
  adapter_options[column] = options

  class_eval "    unless instance_methods.map(&:to_s).include?('original_\#{column}')\n      alias_method :original_\#{column}, :\#{column}\n      alias_method :original_\#{column}=, :\#{column}=\n    end\n\n    def \#{column}_adapter\n      @\#{column}_adapter ||= self.class.adapter_classes[:\#{column}].new(  \n        self, :\#{column}, nil, self.class.adapter_options[:\#{column}] )   \n    end\n\n    def \#{column}\n      \#{column}_adapter.load send( :original_\#{column} )\n    end\n\n    def \#{column}=(value)\n      send( :original_\#{column}=, \#{column}_adapter.dump(value) )\n    end\n\n    def \#{column}_after_save\n      \#{column}_adapter.store!\n    end\n\n    def \#{column}_after_destroy\n      \#{column}\n      \#{column}_adapter.cleanup!\n      \#{column}_adapter.unlink!\n    end\n  RUBY\nend\n", __FILE__, __LINE__+1