uploadcare-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ require File.join(File.dirname(__FILE__), "lib", "uploadcare-rails")
2
+ require 'uploadcare-rails/inject'
3
+
4
+ Uploadcare::Rails::Inject.try_inject
@@ -0,0 +1,138 @@
1
+ require "uploadcare-rails/engine"
2
+ require "uploadcare-rails/version"
3
+ require "uploadcare-rails/exception"
4
+ require "uploadcare-rails/install"
5
+ require "uploadcare-rails/inject"
6
+ require "uploadcare-rails/upload"
7
+
8
+ module Uploadcare
9
+ module Rails
10
+ def self.installed?
11
+ Install.installed?
12
+ end
13
+
14
+ def self.install
15
+ Install.install
16
+ end
17
+
18
+ def self.config_location
19
+ Install.config_location
20
+ end
21
+
22
+ def self.config
23
+ config = if installed?
24
+ YAML.load_file(config_location)
25
+ else
26
+ Install.default_config
27
+ end
28
+ end
29
+ end
30
+
31
+ module Rails
32
+ module ClassMethods
33
+ def has_uploadcare_file(name, options = {})
34
+ include InstanceMethods
35
+
36
+ options[:file_column] ||= name.to_s
37
+ options[:auto_keep] = true if options[:auto_keep].nil?
38
+
39
+ unless self.column_names.include?(options[:file_column])
40
+ raise DatabaseError, "File column not found in columns list, please generate a migration to create a file column and 'rake db:migrate' to apply changes to database.", caller
41
+ end
42
+
43
+ define_method name do
44
+ upload_for name, options
45
+ end
46
+
47
+ define_method "#{name.to_s}_before_type_cast" do
48
+ read_attribute(name.to_sym)
49
+ end
50
+
51
+ define_method "#{name.to_s}=" do |uuid|
52
+ self.instance_variable_set("@_#{options[:file_column]}", read_attribute(options[:file_column]))
53
+ self.instance_variable_set("@_#{name.to_s}", uuid)
54
+ write_attribute(name.to_sym, uuid)
55
+ upload_for(name, options).assign_uuid(uuid)
56
+ end
57
+ end
58
+
59
+ # TODO: Think about validation
60
+ #
61
+ # def validates_upload_type(name, options = {})
62
+ # end
63
+
64
+ # def validates_upload_size(name, options = {})
65
+ # min = options[:min] || options[:in] && options[:in].first || 0
66
+ # max = options[:max] || options[:in] && options[:in].last || 0
67
+ # message = options[:message] || "file size must be between :min and :max bytes"
68
+ # message = message.gsub(/:min/, min.to_s).gsub(/:max/, max.to_s)
69
+
70
+ # validates_each :"#{name}" do |record, attr, value|
71
+ # if_clause_passed = options[:if].nil? || (options[:if].respond_to?(:call) ? options[:if].call(record) != false : record.send(options[:if]))
72
+ # unless_clause_passed = options[:unless].nil? || (options[:unless].respond_to?(:call) ? !!options[:unless].call(record) == false : !record.send(options[:unless]))
73
+ # upload = record.send("#{name}")
74
+ # if upload.info_loaded?
75
+ # if if_clause_passed && unless_clause_passed && (upload.size < min || (upload.size > max && !max.zero?))
76
+ # record.errors.add("#{name}", message)
77
+ # end
78
+ # else
79
+ # record.errors.add("#{name}", message)
80
+ # end
81
+ # end
82
+ # end
83
+
84
+ def validates_upload_presence name, options = {}
85
+ message = options[:message] || "must be present"
86
+ validates_each :"#{name}" do |record, attr, value|
87
+ upload = record.send :"#{name}"
88
+ unless upload.uuid_value =~ /[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}/
89
+ record.errors.add "#{name}", message
90
+ end
91
+ end
92
+ end
93
+
94
+
95
+ end
96
+
97
+ module InstanceMethods
98
+ def upload_for(name, options)
99
+ Upload.new(name, options, self)
100
+ end
101
+ end
102
+
103
+ module ActiveRecord
104
+ def self.included(base)
105
+ base.extend ClassMethods
106
+ end
107
+ end
108
+
109
+ module FormBuilder
110
+ module InstanceMethods
111
+ def uploadcare_field(method, options = {})
112
+ config = ::Uploadcare::Rails.config
113
+ options[:role] ||= case config["widget_type"]
114
+ when "plain"
115
+ "uploadcare-plain-uploader"
116
+ when "line"
117
+ "uploadcare-line-uploader"
118
+ else
119
+ "uploadcare-plain-uploader"
120
+ end
121
+ options["data-public-key"] ||= config["public_key"]
122
+
123
+ self.hidden_field method, options
124
+ end
125
+ end
126
+
127
+ def self.included(base)
128
+ base.send(:include, InstanceMethods)
129
+ end
130
+ end
131
+ end
132
+
133
+ class File
134
+ def remove
135
+ @ucare.make_request('DELETE', api_uri).parsed_response
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,6 @@
1
+ module Uploadcare
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ class Uploadcare::Rails::Error < RuntimeError
2
+ end
3
+
4
+ class Uploadcare::Rails::InstallationError < Uploadcare::Rails::Error
5
+ end
6
+
7
+ class Uploadcare::Rails::CommunicationError < Uploadcare::Rails::Error
8
+ end
9
+
10
+ class Uploadcare::Rails::DatabaseError < Uploadcare::Rails::Error
11
+ end
@@ -0,0 +1,21 @@
1
+ require 'uploadcare-rails'
2
+
3
+ module Uploadcare::Rails::Inject
4
+ if defined? Rails::Railtie
5
+ require 'rails'
6
+
7
+ class Railtie < Rails::Railtie
8
+ initializer 'uploadcare.insert_into_active_record' do
9
+ ActiveSupport.on_load :active_record do
10
+ Uploadcare::Rails.install unless Uploadcare::Rails.installed?
11
+ Uploadcare::Rails::Inject.try_inject
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ def self.try_inject
18
+ ActiveRecord::Base.send(:include, Uploadcare::Rails::ActiveRecord) if defined? ActiveRecord
19
+ ActionView::Helpers::FormBuilder.send(:include, Uploadcare::Rails::FormBuilder) if defined? ActionView
20
+ end
21
+ end
@@ -0,0 +1,59 @@
1
+ module Uploadcare::Rails::Install
2
+ def self.installed?
3
+ File.exist?(self.config_location)
4
+ end
5
+
6
+ def self.install
7
+ loc = self.config_location
8
+ config = self.default_config
9
+
10
+ f = File.open(loc, "w")
11
+ begin
12
+ f.puts config.to_yaml
13
+ rescue
14
+ raise Uploadcare::Rails::InstallationError, "Failed to write configuration file in '#{loc}'", caller
15
+ ensure
16
+ f.close unless f.nil?
17
+ end
18
+ end
19
+
20
+ def self.backup_config(filename = "")
21
+ if filename.empty?
22
+ filename = self.get_location "uploadcare.yml.old"
23
+ filename += ".old" if File.exist?(filename)
24
+ end
25
+ begin
26
+ FileUtils.copy_file self.config_location, filename
27
+ rescue
28
+ raise Uploadcare::Rails::InstallationError, "Failed to backup configuration file to '#{filename}'", caller
29
+ end
30
+ end
31
+
32
+ def self.rewrite_config(backup = true)
33
+ if self.installed? && backup
34
+ self.backup_config
35
+ end
36
+ self.install
37
+ end
38
+
39
+ def self.default_config
40
+ Hash[
41
+ "public_key" => "",
42
+ "private_key" => "",
43
+ "widget_type" => "plain"
44
+ ]
45
+ end
46
+
47
+ def self.config_location
48
+ self.get_location "uploadcare.yml"
49
+ end
50
+
51
+ def self.get_location(filename)
52
+ if defined? Rails && !Rails.root.blank?
53
+ Rails.root.join("config", filename)
54
+ else
55
+ # Try relative path
56
+ "config/#{filename}"
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,106 @@
1
+ require 'uploadcare'
2
+
3
+ class Uploadcare::Rails::Upload
4
+ SERVICES_URL = 'http://services.uploadcare.com'
5
+ IMAGE_MIMES = ['jpeg', 'jpg', 'png', 'gif', 'tiff'].map!{|x| "image/#{x}"}
6
+ attr_reader :uuid
7
+
8
+ def initialize(field_method, options, instance)
9
+ @_field_method = field_method
10
+ @_options = options
11
+ @_instance = instance
12
+ @uuid = self.uuid_value
13
+ end
14
+
15
+ def removed?
16
+ inf = self.file_info
17
+ !inf["removed"].blank? && inf["removed"]
18
+ end
19
+
20
+ def image?
21
+ IMAGE_MIMES.include?(@_file_info["mime_type"])
22
+ end
23
+
24
+ def url
25
+ self.file_info["url"]
26
+ end
27
+
28
+ def resized_url(to = '640x480')
29
+ url = [SERVICES_URL].push('resizer').push(@uuid).push(to).join('/')
30
+ url + "/"
31
+ end
32
+
33
+ def crop_url(to = '640x480')
34
+ url = [self.resized_url(to)].push('crop').join('/')
35
+ url + "/"
36
+ end
37
+
38
+ def original_url
39
+ self.file_info["original_file_url"]
40
+ end
41
+
42
+ def size
43
+ self.file_info["size"].blank? ? 0 : self.file_info["size"]
44
+ end
45
+
46
+ def kept?
47
+ !self.file_info["last_keep_claim"].blank?
48
+ end
49
+
50
+ def file_info
51
+ get_file_info
52
+ end
53
+
54
+ def assign_uuid(new_uuid)
55
+ if @_options[:auto_keep]
56
+ self.keep
57
+ else
58
+ self.reload unless new_uuid.blank?
59
+ end
60
+ end
61
+
62
+ def uuid_value
63
+ @_instance.send("#{@_field_method.to_s}_before_type_cast")
64
+ end
65
+
66
+ def keep
67
+ f = self.get_file_instance
68
+ f.keep
69
+ self.reload
70
+ end
71
+
72
+ def reload
73
+ save_instance
74
+ end
75
+
76
+ def remove
77
+ self.get_file_instance.remove
78
+ save_instance
79
+ end
80
+
81
+ protected
82
+ def get_file_info
83
+ f = self.get_file_instance
84
+ f.info
85
+ end
86
+
87
+ def get_file_instance
88
+ self.load_config
89
+ self.load_api_client
90
+
91
+ @_api_client.file(@uuid)
92
+ end
93
+
94
+ def load_config
95
+ @_config = ::Uploadcare::Rails.config if @_config.nil?
96
+ end
97
+
98
+ def load_api_client
99
+ self.load_config if @_config.nil?
100
+ @_api_client = ::Uploadcare.new(@_config["public_key"], @_config["private_key"])
101
+ end
102
+
103
+ def save_instance
104
+ @_instance.save unless self.uuid_value.blank?
105
+ end
106
+ end
@@ -0,0 +1,5 @@
1
+ module Uploadcare
2
+ module Rails
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: uploadcare-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alexander Zinchenko
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: uploadcare
16
+ requirement: &70124451385440 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70124451385440
25
+ description: Rubygem to use UploadCare.com service and serve file uploads in your
26
+ Rails projects.
27
+ email: az@uploadcare.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - lib/uploadcare-rails/engine.rb
33
+ - lib/uploadcare-rails/exception.rb
34
+ - lib/uploadcare-rails/inject.rb
35
+ - lib/uploadcare-rails/install.rb
36
+ - lib/uploadcare-rails/upload.rb
37
+ - lib/uploadcare-rails/version.rb
38
+ - lib/uploadcare-rails.rb
39
+ - init.rb
40
+ homepage: http://github.com/uploadcare/uploadcare-rails
41
+ licenses: []
42
+ post_install_message: ! " ==================================================\n Thank
43
+ you for installing Uploadcare.com Rails gem.\n Make sure you completed steps described
44
+ in the\n gem README.\n ==================================================\n"
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 1.8.10
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: Rubygem to use UploadCare.com service with ease.
66
+ test_files: []