negonicrac (owner)

Fork Of

Revisions

gist: 30348 Download_button fork
public
Public Clone URL: git://gist.github.com/30348.git
Embed All Files: show embed
my_uploader.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# An uploader for merb, stored in app/uploaders/my_uploader.rb
#
# Usage:
#
# identifier = "some_string_probably_filename.png"
# uploader = MyUploader.new(identifier)
#
# Storing files to the filesystem
# uploader.storage = :file
#
# Filename defaults to the same as identifier, but can be overridden
# uploader.filename # => uploader.identifier
#
# Path for storage defaults to store_dir plus filename, but can be overridden
# uploader.path # => uploader.store_dir / uploader.filename
#
# Read contents
# uploader.read # => nil (file is empty)
#
# Upload a file.
# uploader.upload!(file)
#
# Identical to:
# uploader.storage.upload!(file)
#
# Read contents
# uploader.read # => "..." (contents of file)
#
# Processing the files when they are uploaded:
# class MyUploader
# process :shrink!
# process :inflate!
# process :grow!
# end
# this will call uploader.shrink!, uploader.inflate!, uploader.grow! after calling
# uploader.upload!
#
# class MyUploader
# process :shrink!
# process :inflate! => "original size"
# process :grow! => [200, 400]
# end
# this will call uploader.shrink!, uploader.inflate!("original size"), uploader.grow!(200, 400)
#
# those methods can then be done whatever we want. Plugins can use this, for example RMagick:
#
# class MyUploader
# include Merb::Uploader::RMagick
# process :crop_resized => [300, 300]
# process :desaturate
# process :awesomerize
#
# def awesomerize
# manipulate do |img|
# # do something
# end
# end
# end
class MyUploader
  
  # Provided by merb-uploader
  include Merb::Uploader
  
  # Provided by merb_rmagick, merb_image_science, etc...
  include Merb::Uploader::RMagick
 
  # This is done for all versions
  process :resize => '800x600'
 
  # It's possible to create versions of uploaded files (maybe?)
  version :thumb do
    # Multiple instructions for a single process, maybe the plugins can take advantage of this
    # somehow in order to perform all this simultaneously and save memory?
    process :crop_resized => '100x60', :convert => 'png'
  end
  
  version :backup do
    # We can redefine most stuff for versions
    include Merb::Uploader::ImageScience
    storage :s3
    process :resize => '400x300'
  end
  
  # Most things should be overridable
  def filename
    "#{basename}.#{extension}"
  end
  
  # Like so.
  def extension
    options[:extension] || "png"
  end
  
  # This thing is a DataMapper type, so we can use it as such, to get DataMapper backed uploads
  # for free ;)
  def self.load(string)
    self.retrieve(string)
  end
  
  def self.dump(file)
    self.upload!(file.original_filename, file)
  end
 
end