locomotive_carrierwave 0.5.0.1.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +532 -0
- data/lib/carrierwave/compatibility/paperclip.rb +95 -0
- data/lib/carrierwave/locale/en.yml +5 -0
- data/lib/carrierwave/mount.rb +376 -0
- data/lib/carrierwave/orm/activerecord.rb +36 -0
- data/lib/carrierwave/orm/datamapper.rb +37 -0
- data/lib/carrierwave/orm/mongoid.rb +36 -0
- data/lib/carrierwave/orm/sequel.rb +45 -0
- data/lib/carrierwave/processing/image_science.rb +116 -0
- data/lib/carrierwave/processing/mini_magick.rb +261 -0
- data/lib/carrierwave/processing/rmagick.rb +278 -0
- data/lib/carrierwave/sanitized_file.rb +306 -0
- data/lib/carrierwave/storage/abstract.rb +33 -0
- data/lib/carrierwave/storage/cloud_files.rb +168 -0
- data/lib/carrierwave/storage/file.rb +54 -0
- data/lib/carrierwave/storage/grid_fs.rb +136 -0
- data/lib/carrierwave/storage/right_s3.rb +1 -0
- data/lib/carrierwave/storage/s3.rb +249 -0
- data/lib/carrierwave/test/matchers.rb +164 -0
- data/lib/carrierwave/uploader/cache.rb +148 -0
- data/lib/carrierwave/uploader/callbacks.rb +41 -0
- data/lib/carrierwave/uploader/configuration.rb +134 -0
- data/lib/carrierwave/uploader/default_url.rb +19 -0
- data/lib/carrierwave/uploader/download.rb +64 -0
- data/lib/carrierwave/uploader/extension_whitelist.rb +38 -0
- data/lib/carrierwave/uploader/mountable.rb +39 -0
- data/lib/carrierwave/uploader/processing.rb +85 -0
- data/lib/carrierwave/uploader/proxy.rb +62 -0
- data/lib/carrierwave/uploader/remove.rb +23 -0
- data/lib/carrierwave/uploader/rename.rb +62 -0
- data/lib/carrierwave/uploader/store.rb +98 -0
- data/lib/carrierwave/uploader/url.rb +33 -0
- data/lib/carrierwave/uploader/versions.rb +157 -0
- data/lib/carrierwave/uploader.rb +45 -0
- data/lib/carrierwave/validations/active_model.rb +79 -0
- data/lib/carrierwave/version.rb +3 -0
- data/lib/carrierwave.rb +101 -0
- data/lib/generators/templates/uploader.rb +47 -0
- data/lib/generators/uploader_generator.rb +7 -0
- metadata +390 -0
@@ -0,0 +1,157 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module CarrierWave
|
4
|
+
module Uploader
|
5
|
+
module Versions
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
include CarrierWave::Uploader::Callbacks
|
9
|
+
|
10
|
+
included do
|
11
|
+
after :cache, :cache_versions!
|
12
|
+
after :store, :store_versions!
|
13
|
+
after :remove, :remove_versions!
|
14
|
+
after :retrieve_from_cache, :retrieve_versions_from_cache!
|
15
|
+
after :retrieve_from_store, :retrieve_versions_from_store!
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
|
20
|
+
def version_names
|
21
|
+
@version_names ||= []
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Adds a new version to this uploader
|
26
|
+
#
|
27
|
+
# === Parameters
|
28
|
+
#
|
29
|
+
# [name (#to_sym)] name of the version
|
30
|
+
# [&block (Proc)] a block to eval on this version of the uploader
|
31
|
+
#
|
32
|
+
def version(name, &block)
|
33
|
+
name = name.to_sym
|
34
|
+
unless versions[name]
|
35
|
+
versions[name] = Class.new(self)
|
36
|
+
versions[name].version_names.push(*version_names)
|
37
|
+
versions[name].version_names.push(name)
|
38
|
+
class_eval <<-RUBY
|
39
|
+
def #{name}
|
40
|
+
versions[:#{name}]
|
41
|
+
end
|
42
|
+
RUBY
|
43
|
+
end
|
44
|
+
versions[name].class_eval(&block) if block
|
45
|
+
versions[name]
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# === Returns
|
50
|
+
#
|
51
|
+
# [Hash{Symbol => Class}] a list of versions available for this uploader
|
52
|
+
#
|
53
|
+
def versions
|
54
|
+
@versions ||= {}
|
55
|
+
end
|
56
|
+
|
57
|
+
end # ClassMethods
|
58
|
+
|
59
|
+
##
|
60
|
+
# Returns a hash mapping the name of each version of the uploader to an instance of it
|
61
|
+
#
|
62
|
+
# === Returns
|
63
|
+
#
|
64
|
+
# [Hash{Symbol => CarrierWave::Uploader}] a list of uploader instances
|
65
|
+
#
|
66
|
+
def versions
|
67
|
+
return @versions if @versions
|
68
|
+
@versions = {}
|
69
|
+
self.class.versions.each do |name, klass|
|
70
|
+
@versions[name] = klass.new(model, mounted_as)
|
71
|
+
end
|
72
|
+
@versions
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# === Returns
|
77
|
+
#
|
78
|
+
# [String] the name of this version of the uploader
|
79
|
+
#
|
80
|
+
def version_name
|
81
|
+
self.class.version_names.join('_').to_sym unless self.class.version_names.blank?
|
82
|
+
end
|
83
|
+
|
84
|
+
##
|
85
|
+
# When given a version name as a parameter, will return the url for that version
|
86
|
+
# This also works with nested versions.
|
87
|
+
#
|
88
|
+
# === Example
|
89
|
+
#
|
90
|
+
# my_uploader.url # => /path/to/my/uploader.gif
|
91
|
+
# my_uploader.url(:thumb) # => /path/to/my/thumb_uploader.gif
|
92
|
+
# my_uploader.url(:thumb, :small) # => /path/to/my/thumb_small_uploader.gif
|
93
|
+
#
|
94
|
+
# === Parameters
|
95
|
+
#
|
96
|
+
# [*args (Symbol)] any number of versions
|
97
|
+
#
|
98
|
+
# === Returns
|
99
|
+
#
|
100
|
+
# [String] the location where this file is accessible via a url
|
101
|
+
#
|
102
|
+
def url(*args)
|
103
|
+
if(args.first)
|
104
|
+
raise ArgumentError, "Version #{args.first} doesn't exist!" if versions[args.first.to_sym].nil?
|
105
|
+
# recursively proxy to version
|
106
|
+
versions[args.first.to_sym].url(*args[1..-1])
|
107
|
+
else
|
108
|
+
super()
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
##
|
113
|
+
# Recreate versions and reprocess them. This can be used to recreate
|
114
|
+
# versions if their parameters somehow have changed.
|
115
|
+
#
|
116
|
+
def recreate_versions!
|
117
|
+
with_callbacks(:recreate_versions, file) do
|
118
|
+
versions.each { |name, v| v.store!(file) }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
private
|
123
|
+
|
124
|
+
def full_filename(for_file)
|
125
|
+
[version_name, super(for_file)].compact.join('_')
|
126
|
+
end
|
127
|
+
|
128
|
+
def full_original_filename
|
129
|
+
[version_name, super].compact.join('_')
|
130
|
+
end
|
131
|
+
|
132
|
+
def cache_versions!(new_file)
|
133
|
+
versions.each do |name, v|
|
134
|
+
v.send(:cache_id=, cache_id)
|
135
|
+
v.cache!(new_file)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def store_versions!(new_file)
|
140
|
+
versions.each { |name, v| v.store!(new_file) }
|
141
|
+
end
|
142
|
+
|
143
|
+
def remove_versions!
|
144
|
+
versions.each { |name, v| v.remove! }
|
145
|
+
end
|
146
|
+
|
147
|
+
def retrieve_versions_from_cache!(cache_name)
|
148
|
+
versions.each { |name, v| v.retrieve_from_cache!(cache_name) }
|
149
|
+
end
|
150
|
+
|
151
|
+
def retrieve_versions_from_store!(identifier)
|
152
|
+
versions.each { |name, v| v.retrieve_from_store!(identifier) }
|
153
|
+
end
|
154
|
+
|
155
|
+
end # Versions
|
156
|
+
end # Uploader
|
157
|
+
end # CarrierWave
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module CarrierWave
|
4
|
+
|
5
|
+
##
|
6
|
+
# See CarrierWave::Uploader::Base
|
7
|
+
#
|
8
|
+
module Uploader
|
9
|
+
|
10
|
+
##
|
11
|
+
# An uploader is a class that allows you to easily handle the caching and storage of
|
12
|
+
# uploaded files. Please refer to the README for configuration options.
|
13
|
+
#
|
14
|
+
# Once you have an uploader you can use it in isolation:
|
15
|
+
#
|
16
|
+
# my_uploader = MyUploader.new
|
17
|
+
# my_uploader.cache!(File.open(path_to_file))
|
18
|
+
# my_uploader.retrieve_from_store!('monkey.png')
|
19
|
+
#
|
20
|
+
# Alternatively, you can mount it on an ORM or other persistence layer, with
|
21
|
+
# +CarrierWave::Mount#mount_uploader+. There are extensions for activerecord and datamapper
|
22
|
+
# these are *very* simple (they are only a dozen lines of code), so adding your own should
|
23
|
+
# be trivial.
|
24
|
+
#
|
25
|
+
class Base
|
26
|
+
attr_reader :file
|
27
|
+
|
28
|
+
include CarrierWave::Uploader::Callbacks
|
29
|
+
include CarrierWave::Uploader::Proxy
|
30
|
+
include CarrierWave::Uploader::Url
|
31
|
+
include CarrierWave::Uploader::Mountable
|
32
|
+
include CarrierWave::Uploader::Cache
|
33
|
+
include CarrierWave::Uploader::Store
|
34
|
+
include CarrierWave::Uploader::Download
|
35
|
+
include CarrierWave::Uploader::Remove
|
36
|
+
include CarrierWave::Uploader::ExtensionWhitelist
|
37
|
+
include CarrierWave::Uploader::Processing
|
38
|
+
include CarrierWave::Uploader::Versions
|
39
|
+
include CarrierWave::Uploader::DefaultUrl
|
40
|
+
include CarrierWave::Uploader::Configuration
|
41
|
+
include CarrierWave::Uploader::Rename
|
42
|
+
end # Base
|
43
|
+
|
44
|
+
end # Uploader
|
45
|
+
end # CarrierWave
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'active_model/validator'
|
4
|
+
require 'active_support/concern'
|
5
|
+
|
6
|
+
|
7
|
+
module CarrierWave
|
8
|
+
|
9
|
+
# == Active Model Presence Validator
|
10
|
+
module Validations
|
11
|
+
module ActiveModel
|
12
|
+
extend ActiveSupport::Concern
|
13
|
+
|
14
|
+
class ProcessingValidator < ::ActiveModel::EachValidator
|
15
|
+
|
16
|
+
def validate_each(record, attribute, value)
|
17
|
+
if record.send("#{attribute}_processing_error")
|
18
|
+
record.errors.add(attribute, :carrierwave_processing_error)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class IntegrityValidator < ::ActiveModel::EachValidator
|
24
|
+
|
25
|
+
def validate_each(record, attribute, value)
|
26
|
+
if record.send("#{attribute}_integrity_error")
|
27
|
+
record.errors.add(attribute, :carrierwave_integrity_error)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module HelperMethods
|
33
|
+
|
34
|
+
##
|
35
|
+
# Makes the record invalid if the file couldn't be uploaded due to an integrity error
|
36
|
+
#
|
37
|
+
# Accepts the usual parameters for validations in Rails (:if, :unless, etc...)
|
38
|
+
#
|
39
|
+
# === Note
|
40
|
+
#
|
41
|
+
# Set this key in your translations file for I18n:
|
42
|
+
#
|
43
|
+
# carrierwave:
|
44
|
+
# errors:
|
45
|
+
# integrity: 'Here be an error message'
|
46
|
+
#
|
47
|
+
def validates_integrity_of(*attr_names)
|
48
|
+
validates_with IntegrityValidator, _merge_attributes(attr_names)
|
49
|
+
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# Makes the record invalid if the file couldn't be processed (assuming the process failed
|
53
|
+
# with a CarrierWave::ProcessingError)
|
54
|
+
#
|
55
|
+
# Accepts the usual parameters for validations in Rails (:if, :unless, etc...)
|
56
|
+
#
|
57
|
+
# === Note
|
58
|
+
#
|
59
|
+
# Set this key in your translations file for I18n:
|
60
|
+
#
|
61
|
+
# carrierwave:
|
62
|
+
# errors:
|
63
|
+
# processing: 'Here be an error message'
|
64
|
+
#
|
65
|
+
def validates_processing_of(*attr_names)
|
66
|
+
validates_with ProcessingValidator, _merge_attributes(attr_names)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
included do
|
71
|
+
extend HelperMethods
|
72
|
+
include HelperMethods
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
I18n.load_path << File.join(File.dirname(__FILE__), "..", "locale", 'en.yml')
|
79
|
+
|
data/lib/carrierwave.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'active_support/core_ext/object/blank'
|
5
|
+
require 'active_support/core_ext/class/inheritable_attributes'
|
6
|
+
require 'active_support/concern'
|
7
|
+
|
8
|
+
module CarrierWave
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_accessor :root
|
12
|
+
|
13
|
+
def configure(&block)
|
14
|
+
CarrierWave::Uploader::Base.configure(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def clean_cached_files!
|
18
|
+
CarrierWave::Uploader::Base.clean_cached_files!
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class UploadError < StandardError; end
|
23
|
+
class IntegrityError < UploadError; end
|
24
|
+
class InvalidParameter < UploadError; end
|
25
|
+
class ProcessingError < UploadError; end
|
26
|
+
class DownloadError < UploadError; end
|
27
|
+
|
28
|
+
autoload :SanitizedFile, 'carrierwave/sanitized_file'
|
29
|
+
autoload :Mount, 'carrierwave/mount'
|
30
|
+
autoload :RMagick, 'carrierwave/processing/rmagick'
|
31
|
+
autoload :ImageScience, 'carrierwave/processing/image_science'
|
32
|
+
autoload :MiniMagick, 'carrierwave/processing/mini_magick'
|
33
|
+
autoload :VERSION, 'carrierwave/version'
|
34
|
+
|
35
|
+
module Storage
|
36
|
+
autoload :Abstract, 'carrierwave/storage/abstract'
|
37
|
+
autoload :File, 'carrierwave/storage/file'
|
38
|
+
autoload :S3, 'carrierwave/storage/s3'
|
39
|
+
autoload :GridFS, 'carrierwave/storage/grid_fs'
|
40
|
+
autoload :RightS3, 'carrierwave/storage/right_s3'
|
41
|
+
autoload :CloudFiles, 'carrierwave/storage/cloud_files'
|
42
|
+
end
|
43
|
+
|
44
|
+
module Uploader
|
45
|
+
autoload :Base, 'carrierwave/uploader'
|
46
|
+
autoload :Cache, 'carrierwave/uploader/cache'
|
47
|
+
autoload :Store, 'carrierwave/uploader/store'
|
48
|
+
autoload :Download, 'carrierwave/uploader/download'
|
49
|
+
autoload :Callbacks, 'carrierwave/uploader/callbacks'
|
50
|
+
autoload :Processing, 'carrierwave/uploader/processing'
|
51
|
+
autoload :Versions, 'carrierwave/uploader/versions'
|
52
|
+
autoload :Remove, 'carrierwave/uploader/remove'
|
53
|
+
autoload :ExtensionWhitelist, 'carrierwave/uploader/extension_whitelist'
|
54
|
+
autoload :DefaultUrl, 'carrierwave/uploader/default_url'
|
55
|
+
autoload :Proxy, 'carrierwave/uploader/proxy'
|
56
|
+
autoload :Url, 'carrierwave/uploader/url'
|
57
|
+
autoload :Mountable, 'carrierwave/uploader/mountable'
|
58
|
+
autoload :Configuration, 'carrierwave/uploader/configuration'
|
59
|
+
autoload :Rename, 'carrierwave/uploader/rename'
|
60
|
+
end
|
61
|
+
|
62
|
+
module Compatibility
|
63
|
+
autoload :Paperclip, 'carrierwave/compatibility/paperclip'
|
64
|
+
end
|
65
|
+
|
66
|
+
module Test
|
67
|
+
autoload :Matchers, 'carrierwave/test/matchers'
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
if defined?(Merb)
|
73
|
+
|
74
|
+
CarrierWave.root = Merb.dir_for(:public)
|
75
|
+
Merb::BootLoader.before_app_loads do
|
76
|
+
# Setup path for uploaders and load all of them before classes are loaded
|
77
|
+
Merb.push_path(:uploaders, Merb.root / 'app' / 'uploaders', '*.rb')
|
78
|
+
Dir.glob(File.join(Merb.load_paths[:uploaders])).each {|f| require f }
|
79
|
+
end
|
80
|
+
|
81
|
+
elsif defined?(Rails)
|
82
|
+
|
83
|
+
module CarrierWave
|
84
|
+
class Railtie < Rails::Railtie
|
85
|
+
initializer "carrierwave.setup_paths" do
|
86
|
+
CarrierWave.root = Rails.root.join(Rails.public_path).to_s
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
elsif defined?(Sinatra)
|
92
|
+
|
93
|
+
CarrierWave.root = Sinatra::Application.public
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
require 'carrierwave/orm/activerecord' if defined?(ActiveRecord)
|
99
|
+
require 'carrierwave/orm/datamapper' if defined?(DataMapper)
|
100
|
+
require 'carrierwave/orm/sequel' if defined?(Sequel)
|
101
|
+
require 'carrierwave/orm/mongoid' if defined?(Mongoid)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class <%= class_name %>Uploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
# Include RMagick or ImageScience support:
|
6
|
+
# include CarrierWave::RMagick
|
7
|
+
# include CarrierWave::ImageScience
|
8
|
+
|
9
|
+
# Choose what kind of storage to use for this uploader:
|
10
|
+
storage :file
|
11
|
+
# storage :s3
|
12
|
+
|
13
|
+
# Override the directory where uploaded files will be stored.
|
14
|
+
# This is a sensible default for uploaders that are meant to be mounted:
|
15
|
+
def store_dir
|
16
|
+
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
17
|
+
end
|
18
|
+
|
19
|
+
# Provide a default URL as a default if there hasn't been a file uploaded:
|
20
|
+
# def default_url
|
21
|
+
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
|
22
|
+
# end
|
23
|
+
|
24
|
+
# Process files as they are uploaded:
|
25
|
+
# process :scale => [200, 300]
|
26
|
+
#
|
27
|
+
# def scale(width, height)
|
28
|
+
# # do something
|
29
|
+
# end
|
30
|
+
|
31
|
+
# Create different versions of your uploaded files:
|
32
|
+
# version :thumb do
|
33
|
+
# process :scale => [50, 50]
|
34
|
+
# end
|
35
|
+
|
36
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
37
|
+
# For images you might use something like this:
|
38
|
+
# def extension_white_list
|
39
|
+
# %w(jpg jpeg gif png)
|
40
|
+
# end
|
41
|
+
|
42
|
+
# Override the filename of the uploaded files:
|
43
|
+
# def filename
|
44
|
+
# "something.jpg" if original_filename
|
45
|
+
# end
|
46
|
+
|
47
|
+
end
|