locomotive_carrierwave 0.5.0.1.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/README.rdoc +532 -0
  2. data/lib/carrierwave/compatibility/paperclip.rb +95 -0
  3. data/lib/carrierwave/locale/en.yml +5 -0
  4. data/lib/carrierwave/mount.rb +376 -0
  5. data/lib/carrierwave/orm/activerecord.rb +36 -0
  6. data/lib/carrierwave/orm/datamapper.rb +37 -0
  7. data/lib/carrierwave/orm/mongoid.rb +36 -0
  8. data/lib/carrierwave/orm/sequel.rb +45 -0
  9. data/lib/carrierwave/processing/image_science.rb +116 -0
  10. data/lib/carrierwave/processing/mini_magick.rb +261 -0
  11. data/lib/carrierwave/processing/rmagick.rb +278 -0
  12. data/lib/carrierwave/sanitized_file.rb +306 -0
  13. data/lib/carrierwave/storage/abstract.rb +33 -0
  14. data/lib/carrierwave/storage/cloud_files.rb +168 -0
  15. data/lib/carrierwave/storage/file.rb +54 -0
  16. data/lib/carrierwave/storage/grid_fs.rb +136 -0
  17. data/lib/carrierwave/storage/right_s3.rb +1 -0
  18. data/lib/carrierwave/storage/s3.rb +249 -0
  19. data/lib/carrierwave/test/matchers.rb +164 -0
  20. data/lib/carrierwave/uploader/cache.rb +148 -0
  21. data/lib/carrierwave/uploader/callbacks.rb +41 -0
  22. data/lib/carrierwave/uploader/configuration.rb +134 -0
  23. data/lib/carrierwave/uploader/default_url.rb +19 -0
  24. data/lib/carrierwave/uploader/download.rb +64 -0
  25. data/lib/carrierwave/uploader/extension_whitelist.rb +38 -0
  26. data/lib/carrierwave/uploader/mountable.rb +39 -0
  27. data/lib/carrierwave/uploader/processing.rb +85 -0
  28. data/lib/carrierwave/uploader/proxy.rb +62 -0
  29. data/lib/carrierwave/uploader/remove.rb +23 -0
  30. data/lib/carrierwave/uploader/rename.rb +62 -0
  31. data/lib/carrierwave/uploader/store.rb +98 -0
  32. data/lib/carrierwave/uploader/url.rb +33 -0
  33. data/lib/carrierwave/uploader/versions.rb +157 -0
  34. data/lib/carrierwave/uploader.rb +45 -0
  35. data/lib/carrierwave/validations/active_model.rb +79 -0
  36. data/lib/carrierwave/version.rb +3 -0
  37. data/lib/carrierwave.rb +101 -0
  38. data/lib/generators/templates/uploader.rb +47 -0
  39. data/lib/generators/uploader_generator.rb +7 -0
  40. 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
+
@@ -0,0 +1,3 @@
1
+ module CarrierWave
2
+ VERSION = "0.5.0.1.beta1"
3
+ end
@@ -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
@@ -0,0 +1,7 @@
1
+ class UploaderGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path("../templates", __FILE__)
3
+
4
+ def create_uploader_file
5
+ template "uploader.rb", "app/uploaders/#{file_name}_uploader.rb"
6
+ end
7
+ end