rails-uploader 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +3 -1
- data/Rakefile +7 -14
- data/app/assets/javascripts/uploader/jquery.uploader.js.coffee +1 -0
- data/app/controllers/uploader/attachments_controller.rb +5 -3
- data/config/locales/ru.yml +1 -1
- data/config/locales/uk.yml +1 -1
- data/config/routes.rb +2 -0
- data/lib/generators/uploader/install/install_generator.rb +28 -0
- data/lib/generators/uploader/install/templates/20130905144515_create_assets.rb +34 -0
- data/lib/rails-uploader.rb +2 -1
- data/lib/uploader.rb +3 -1
- data/lib/uploader/asset.rb +19 -2
- data/lib/uploader/authorization.rb +4 -0
- data/lib/uploader/authorization_adapter.rb +2 -0
- data/lib/uploader/chunked_uploads.rb +3 -1
- data/lib/uploader/engine.rb +2 -0
- data/lib/uploader/file_part.rb +2 -0
- data/lib/uploader/fileupload_glue.rb +10 -3
- data/lib/uploader/fileuploads.rb +3 -1
- data/lib/uploader/helpers/field_tag.rb +5 -3
- data/lib/uploader/helpers/form_builder.rb +2 -0
- data/lib/uploader/helpers/form_tag_helper.rb +2 -0
- data/lib/uploader/hooks/active_record.rb +2 -0
- data/lib/uploader/hooks/formtastic.rb +2 -0
- data/lib/uploader/hooks/simple_form.rb +2 -0
- data/lib/uploader/upload_request.rb +5 -2
- data/lib/uploader/version.rb +3 -1
- data/spec/dummy/app/assets/config/manifest.js +3 -0
- data/spec/dummy/config/environments/production.rb +1 -1
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/requests/attachments_controller_spec.rb +39 -3
- data/spec/spec_helper.rb +2 -0
- data/vendor/assets/javascripts/uploader/jquery.fileupload-ui.js +2 -0
- data/vendor/assets/stylesheets/uploader/default.scss +5 -6
- metadata +35 -95
- data/spec/dummy/db/migrate/20120508093416_create_assets.rb +0 -21
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +0 -4325
- data/spec/dummy/public/uploads/picture/data/1/rails.png +0 -0
- data/spec/dummy/public/uploads/picture/data/1/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/picture/data/3/rails.png +0 -0
- data/spec/dummy/public/uploads/picture/data/3/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/1455878520-6456-6895/rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/1455878520-6456-6895/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1539-33540-9729/rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1539-33540-9729/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1542-33540-2188/rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1542-33540-2188/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1542-33540-8490/rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1542-33540-8490/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1722-34183-6034/rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1722-34183-6034/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1723-34214-7553/rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1723-34214-7553/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1726-34214-2817/rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1726-34214-2817/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1726-34214-5471/rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1726-34214-5471/thumb_rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1726-34214-9281/rails.png +0 -0
- data/spec/dummy/public/uploads/tmp/20130905-1726-34214-9281/thumb_rails.png +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: b602b1677568ea5d878174c76224c6a61d431efdb93046f8bd3b897dbed63f55
|
|
4
|
+
data.tar.gz: e2464535aa4a6f329bee939b98a32fba4193f472111bda3c669c5f8465d1ac62
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 194158c8d9f7540ed210e11b3cb1b98ff346c35562b960365dba01113caea71b808363832b613a804bcd45b2df2f815506d8c74c25532011384dd027f38f9660
|
|
7
|
+
data.tar.gz: d66527e6277747de70d148af352391998c83a75e08418e0a665c31130c1ea5117e06c2c039ce4b8fad73930e75fe5cfe45c77da72e509ee4da6fdb34ed72c5ee
|
data/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
[](https://travis-ci.org/superp/rails-uploader)
|
|
2
|
+
|
|
1
3
|
# HTML5 File uploader for rails
|
|
2
4
|
|
|
3
5
|
This gem use https://github.com/blueimp/jQuery-File-Upload for upload files.
|
|
@@ -19,7 +21,7 @@ mount Uploader::Engine => '/uploader'
|
|
|
19
21
|
Migration for ActiveRecord:
|
|
20
22
|
|
|
21
23
|
```bash
|
|
22
|
-
|
|
24
|
+
$ bundle exec rails g uploader:install
|
|
23
25
|
```
|
|
24
26
|
|
|
25
27
|
## Usage
|
data/Rakefile
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require '
|
|
3
|
-
require '
|
|
4
|
-
require '
|
|
5
|
-
|
|
6
|
-
desc 'Default: run unit tests.'
|
|
7
|
-
task :default => :test
|
|
8
|
-
|
|
9
|
-
desc 'Test the rails-uploader plugin.'
|
|
10
|
-
Rake::TestTask.new(:test) do |t|
|
|
11
|
-
t.libs << 'lib'
|
|
12
|
-
t.libs << 'test'
|
|
13
|
-
t.pattern = 'test/**/*_test.rb'
|
|
14
|
-
t.verbose = true
|
|
15
|
-
end
|
|
2
|
+
require 'rdoc/task'
|
|
3
|
+
require 'bundler/gem_tasks'
|
|
4
|
+
require 'rspec/core/rake_task'
|
|
16
5
|
|
|
17
6
|
desc 'Generate documentation for the rails-uploader plugin.'
|
|
18
7
|
Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
@@ -22,3 +11,7 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
|
22
11
|
rdoc.rdoc_files.include('README.rdoc')
|
|
23
12
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
24
13
|
end
|
|
14
|
+
|
|
15
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
16
|
+
|
|
17
|
+
task default: :spec
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Uploader
|
|
2
4
|
class AttachmentsController < ActionController::Metal
|
|
3
5
|
include AbstractController::Callbacks
|
|
@@ -5,8 +7,8 @@ module Uploader
|
|
|
5
7
|
include Uploader::ChunkedUploads
|
|
6
8
|
|
|
7
9
|
before_action :find_klass
|
|
8
|
-
before_action :build_asset, only:
|
|
9
|
-
before_action :find_asset, only:
|
|
10
|
+
before_action :build_asset, only: :create
|
|
11
|
+
before_action :find_asset, only: :destroy
|
|
10
12
|
|
|
11
13
|
def index
|
|
12
14
|
authorize!(:index, @klass)
|
|
@@ -46,7 +48,7 @@ module Uploader
|
|
|
46
48
|
|
|
47
49
|
def find_klass
|
|
48
50
|
@klass = Uploader.constantize(params[:klass])
|
|
49
|
-
raise ActionController::
|
|
51
|
+
raise ActionController::ParameterMissing.new("klass parameter isn't set but #{params[:klass].inspect}") if @klass.nil?
|
|
50
52
|
end
|
|
51
53
|
|
|
52
54
|
def build_asset
|
data/config/locales/ru.yml
CHANGED
data/config/locales/uk.yml
CHANGED
data/config/routes.rb
CHANGED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rails/generators/migration'
|
|
4
|
+
|
|
5
|
+
module Uploader
|
|
6
|
+
module Generators
|
|
7
|
+
class InstallGenerator < ::Rails::Generators::Base
|
|
8
|
+
include Rails::Generators::Migration
|
|
9
|
+
|
|
10
|
+
source_root File.expand_path('templates', __dir__)
|
|
11
|
+
|
|
12
|
+
desc 'add the migrations'
|
|
13
|
+
def self.next_migration_number(_path)
|
|
14
|
+
if @prev_migration_nr
|
|
15
|
+
@prev_migration_nr += 1
|
|
16
|
+
else
|
|
17
|
+
@prev_migration_nr = Time.now.utc.strftime('%Y%m%d%H%M%S').to_i
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
@prev_migration_nr.to_s
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def copy_migrations
|
|
24
|
+
migration_template '20130905144515_create_assets.rb', 'db/migrate/create_assets.rb'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class CreateAssets < ActiveRecord::Migration
|
|
4
|
+
def self.up
|
|
5
|
+
create_table :assets do |t|
|
|
6
|
+
t.string :data_file_name, null: false
|
|
7
|
+
t.string :data_content_type
|
|
8
|
+
t.integer :data_file_size
|
|
9
|
+
|
|
10
|
+
t.integer :assetable_id, null: false
|
|
11
|
+
t.string :assetable_type, limit: 30, null: false
|
|
12
|
+
t.string :type, limit: 30
|
|
13
|
+
|
|
14
|
+
t.string :guid, limit: 30
|
|
15
|
+
t.string :public_token, limit: 30
|
|
16
|
+
|
|
17
|
+
t.integer :user_id
|
|
18
|
+
t.integer :sort_order, default: 0
|
|
19
|
+
t.integer :width
|
|
20
|
+
t.integer :height
|
|
21
|
+
|
|
22
|
+
t.timestamps
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
add_index :assets, [:assetable_type, :type, :assetable_id]
|
|
26
|
+
add_index :assets, :user_id
|
|
27
|
+
add_index :assets, :guid
|
|
28
|
+
add_index :assets, :public_token
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.down
|
|
32
|
+
drop_table :assets
|
|
33
|
+
end
|
|
34
|
+
end
|
data/lib/rails-uploader.rb
CHANGED
data/lib/uploader.rb
CHANGED
data/lib/uploader/asset.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'active_support/concern'
|
|
2
4
|
|
|
3
5
|
module Uploader
|
|
@@ -49,7 +51,22 @@ module Uploader
|
|
|
49
51
|
#
|
|
50
52
|
def fileupload_create(params, _request = nil)
|
|
51
53
|
self[Uploader.guid_column] = params[:guid]
|
|
52
|
-
update_attributes(self.class.fileupload_assetable_options(params))
|
|
54
|
+
return false unless update_attributes(self.class.fileupload_assetable_options(params))
|
|
55
|
+
|
|
56
|
+
if fileupload_destroy_other_on_singular?(params)
|
|
57
|
+
self.class.fileupload_find_assets(params).where.not(id: id).destroy_all
|
|
58
|
+
end
|
|
59
|
+
true
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def fileupload_destroy_other_on_singular?(params)
|
|
63
|
+
return unless params[:singular].to_s.downcase == 'true'
|
|
64
|
+
return true if params[:guid].present?
|
|
65
|
+
|
|
66
|
+
[
|
|
67
|
+
params["#{Uploader.assetable_column}_id"],
|
|
68
|
+
params["#{Uploader.assetable_column}_type"]
|
|
69
|
+
].all?(&:present?)
|
|
53
70
|
end
|
|
54
71
|
|
|
55
72
|
# Destroy asset
|
|
@@ -80,7 +97,7 @@ module Uploader
|
|
|
80
97
|
name: filename,
|
|
81
98
|
content_type: content_type,
|
|
82
99
|
size: size,
|
|
83
|
-
url:
|
|
100
|
+
url: url,
|
|
84
101
|
thumb_url: thumb_url
|
|
85
102
|
}
|
|
86
103
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'active_support/concern'
|
|
2
4
|
|
|
3
5
|
module Uploader
|
|
@@ -21,6 +23,7 @@ module Uploader
|
|
|
21
23
|
# If the action is not allowd, it raises an Uploader::AccessDenied exception.
|
|
22
24
|
def authorize!(action, subject = nil)
|
|
23
25
|
return if authorized?(action, subject)
|
|
26
|
+
|
|
24
27
|
raise Uploader::AccessDenied.new(current_uploader_user, action, subject)
|
|
25
28
|
end
|
|
26
29
|
|
|
@@ -46,6 +49,7 @@ module Uploader
|
|
|
46
49
|
|
|
47
50
|
def current_uploader_user
|
|
48
51
|
return if Uploader.current_user_proc.nil?
|
|
52
|
+
|
|
49
53
|
@current_uploader_user ||= Uploader.current_user_proc.call(request)
|
|
50
54
|
end
|
|
51
55
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Uploader
|
|
2
4
|
module ChunkedUploads
|
|
3
5
|
extend ActiveSupport::Concern
|
|
@@ -5,7 +7,7 @@ module Uploader
|
|
|
5
7
|
protected
|
|
6
8
|
|
|
7
9
|
def with_chunked_upload(file_or_part)
|
|
8
|
-
uploader = UploadRequest.new(env, file_or_part)
|
|
10
|
+
uploader = UploadRequest.new(request.env, file_or_part)
|
|
9
11
|
return unless uploader.completed?
|
|
10
12
|
|
|
11
13
|
yield uploader.file
|
data/lib/uploader/engine.rb
CHANGED
data/lib/uploader/file_part.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Uploader
|
|
2
4
|
class FileuploadGlue
|
|
3
5
|
attr_reader :record, :record_klass
|
|
@@ -5,8 +7,8 @@ module Uploader
|
|
|
5
7
|
delegate :reflect_on_association, to: :record_klass
|
|
6
8
|
delegate :fileupload_guid, :new_record?, to: :record
|
|
7
9
|
|
|
8
|
-
TARGET_TYPE = '_type'
|
|
9
|
-
TARGET_ID = '_id'
|
|
10
|
+
TARGET_TYPE = '_type'
|
|
11
|
+
TARGET_ID = '_id'
|
|
10
12
|
|
|
11
13
|
def initialize(record)
|
|
12
14
|
@record = record
|
|
@@ -36,6 +38,7 @@ module Uploader
|
|
|
36
38
|
|
|
37
39
|
def asset(method_name)
|
|
38
40
|
return unless available_fileuploads.include?(method_name.to_sym)
|
|
41
|
+
|
|
39
42
|
find_asset_by_fileupload_guid(method_name, fileupload_guid) || build_asset(method_name)
|
|
40
43
|
end
|
|
41
44
|
|
|
@@ -47,6 +50,7 @@ module Uploader
|
|
|
47
50
|
# Find class by reflection
|
|
48
51
|
def klass(method_name)
|
|
49
52
|
return if association(method_name).nil?
|
|
53
|
+
|
|
50
54
|
association(method_name).klass
|
|
51
55
|
end
|
|
52
56
|
|
|
@@ -62,6 +66,7 @@ module Uploader
|
|
|
62
66
|
|
|
63
67
|
def available_fileuploads
|
|
64
68
|
return [] if @record_klass.fileupload_options.nil?
|
|
69
|
+
|
|
65
70
|
@available_fileuploads ||= @record_klass.fileupload_options.keys
|
|
66
71
|
end
|
|
67
72
|
|
|
@@ -97,7 +102,9 @@ module Uploader
|
|
|
97
102
|
end
|
|
98
103
|
|
|
99
104
|
def record_klass_type
|
|
100
|
-
if @record_klass.respond_to?(:
|
|
105
|
+
if @record_klass.respond_to?(:polymorphic_name)
|
|
106
|
+
@record_klass.polymorphic_name
|
|
107
|
+
elsif @record_klass.respond_to?(:base_class)
|
|
101
108
|
@record_klass.base_class.name
|
|
102
109
|
else
|
|
103
110
|
@record_klass.name
|
data/lib/uploader/fileuploads.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'active_support/concern'
|
|
2
4
|
|
|
3
5
|
module Uploader
|
|
@@ -40,7 +42,7 @@ module Uploader
|
|
|
40
42
|
end
|
|
41
43
|
|
|
42
44
|
def fileupload_guid=(value)
|
|
43
|
-
@fileupload_changed = (@fileupload_guid != value)
|
|
45
|
+
@fileupload_changed = (@fileupload_guid != value) if @fileupload_changed.nil?
|
|
44
46
|
@fileupload_guid = value.blank? ? nil : value
|
|
45
47
|
end
|
|
46
48
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Uploader
|
|
2
4
|
module Helpers
|
|
3
5
|
class FieldTag
|
|
4
|
-
RESERVED_OPTIONS_KEYS = %
|
|
6
|
+
RESERVED_OPTIONS_KEYS = %w[method_name object_name theme value object sortable].freeze
|
|
5
7
|
|
|
6
8
|
attr_reader :template, :object, :theme
|
|
7
9
|
|
|
@@ -73,12 +75,12 @@ module Uploader
|
|
|
73
75
|
def input_html
|
|
74
76
|
@input_html ||= { multiple: multiple?, class: 'uploader' }.merge(input_html_options)
|
|
75
77
|
@input_html[:data] ||= {}
|
|
76
|
-
@input_html[:data][:url] ||= attachments_path
|
|
78
|
+
@input_html[:data][:url] ||= attachments_path(singular: !multiple?)
|
|
77
79
|
@input_html
|
|
78
80
|
end
|
|
79
81
|
|
|
80
82
|
def input_html_options
|
|
81
|
-
@options.
|
|
83
|
+
@options.reject { |key, _value| RESERVED_OPTIONS_KEYS.include?(key.to_s) }
|
|
82
84
|
end
|
|
83
85
|
end
|
|
84
86
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rack/request'
|
|
2
4
|
require 'fileutils'
|
|
3
5
|
require 'digest/sha1'
|
|
@@ -5,7 +7,7 @@ require 'uri'
|
|
|
5
7
|
|
|
6
8
|
module Uploader
|
|
7
9
|
class UploadRequest < Rack::Request
|
|
8
|
-
SPLITTER = '/'
|
|
10
|
+
SPLITTER = '/'
|
|
9
11
|
|
|
10
12
|
attr_reader :file
|
|
11
13
|
|
|
@@ -30,6 +32,7 @@ module Uploader
|
|
|
30
32
|
|
|
31
33
|
def total_file_length
|
|
32
34
|
return content_length.to_i unless chunked?
|
|
35
|
+
|
|
33
36
|
@env['HTTP_CONTENT_RANGE'].split(SPLITTER).last.to_i
|
|
34
37
|
end
|
|
35
38
|
|
|
@@ -73,7 +76,7 @@ module Uploader
|
|
|
73
76
|
|
|
74
77
|
def extract_filename(value)
|
|
75
78
|
value = value.match(/filename\s?=\s?\"?([^;"]+)\"?/i)[1]
|
|
76
|
-
URI.
|
|
79
|
+
URI.decode_www_form(value.force_encoding('binary'))
|
|
77
80
|
end
|
|
78
81
|
end
|
|
79
82
|
end
|