watarase 0.0.3 → 0.0.4
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 +4 -4
- data/README.rdoc +13 -15
- data/lib/watarase.rb +4 -4
- data/lib/watarase/controller.rb +43 -40
- data/lib/watarase/extension_whitelist.rb +21 -0
- data/lib/watarase/generators/uploader/uploader_generator.rb +2 -18
- data/lib/watarase/image_handler.rb +37 -0
- data/lib/watarase/image_holder.rb +47 -0
- data/lib/watarase/version.rb +1 -1
- data/test/dummy/app/controllers/users_controller.rb +4 -4
- data/test/dummy/app/models/user.rb +1 -0
- data/test/dummy/app/models/user_image_holder.rb +3 -14
- data/test/dummy/db/migrate/{20130318134905_create_user_image_holders.rb → 20130412174428_create_user_image_holders.rb} +0 -0
- data/test/dummy/test/fixtures/user_image_holders.yml +8 -15
- data/test/dummy/test/models/user_image_holder_test.rb +0 -7
- metadata +7 -5
- data/lib/watarase/model.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb3e733879e4f9adcb7a2b98f5d1107bbcff7ab0
|
4
|
+
data.tar.gz: 72549fe8bd2bcd9c2330a2cde3e0d154132885b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ce6cb1186198b64b23ff4fb8c43e89a0115e372f9570fce72887d8bbbe6e4f949140a80defa43542bfacc91a4d6f1e8e2712fccdb34962b4f2f74a5be654b30
|
7
|
+
data.tar.gz: ee19faa4daa8f5a294fe89c98ddc5a59b099ba31c99af6d5ba265ef01139fb0bd60a36820e013bacda125763ae8b2dd9047a5d9b4b50a9c48bb36e58c69759d4
|
data/README.rdoc
CHANGED
@@ -76,27 +76,25 @@ Add 'load_image' action in 'config/routes.rb'
|
|
76
76
|
|
77
77
|
Define 'image_loadable <image_handler>' definition in controllers.
|
78
78
|
|
79
|
-
|
80
|
-
image_loadable :user
|
81
|
-
:
|
79
|
+
If you need image caching then, use options caches: and expire_actions:.
|
82
80
|
|
83
|
-
|
81
|
+
class UsersController < ApplicationController
|
82
|
+
image_loadable :user, caches: true, expire_actions: [:update], save_actions: [:create, :update]
|
84
83
|
|
85
|
-
|
86
|
-
|
87
|
-
set_image_holder @user
|
88
|
-
:
|
84
|
+
In this case, action caching enabled, and clearing the cache in update action.
|
85
|
+
The option save_actions is associate image_handler(ex. user) with image_holder(ex. user_image_holder).
|
89
86
|
|
90
|
-
|
91
|
-
set_image_holder @user
|
92
|
-
:
|
87
|
+
=== Tips
|
93
88
|
|
94
|
-
|
95
|
-
|
96
|
-
|
89
|
+
def index
|
90
|
+
@users = User.all
|
91
|
+
end
|
97
92
|
|
98
|
-
|
93
|
+
It is a good idea to make the following changes:
|
99
94
|
|
95
|
+
def index
|
96
|
+
@users = User.all.merge(includes: [:user_image_holder])
|
97
|
+
end
|
100
98
|
|
101
99
|
== View
|
102
100
|
|
data/lib/watarase.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
#require 'RMagick'
|
3
|
-
#require 'rmagick'
|
4
2
|
require 'rails/generators'
|
5
3
|
|
6
4
|
module Watarase
|
@@ -23,6 +21,8 @@ module Watarase
|
|
23
21
|
end
|
24
22
|
end
|
25
23
|
end
|
26
|
-
require 'watarase/
|
24
|
+
require 'watarase/image_handler'
|
27
25
|
require 'watarase/controller'
|
28
|
-
require 'watarase/generators/uploader/uploader_generator'
|
26
|
+
require 'watarase/generators/uploader/uploader_generator'
|
27
|
+
require 'watarase/extension_whitelist'
|
28
|
+
require 'watarase/image_holder'
|
data/lib/watarase/controller.rb
CHANGED
@@ -3,57 +3,60 @@ require 'action_controller/action_caching'
|
|
3
3
|
module Watarase
|
4
4
|
module Controller
|
5
5
|
def self.included(controller)
|
6
|
-
controller.extend Watarase::ImageLoader
|
6
|
+
controller.extend Watarase::Controller::ImageLoader
|
7
7
|
end
|
8
|
-
end
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
9
|
+
module ImageLoader
|
10
|
+
def image_loadable(_image_handler, options = {})
|
11
|
+
ih = _image_handler.to_s.camelize.constantize
|
12
|
+
self.class_variable_set(:@@image_handler, ih)
|
13
|
+
self.send(:include, Watarase::Controller::InstanceMethods)
|
14
|
+
self.send(:caches_action, :load_image) if options[:caches]
|
15
|
+
self.send(:before_action, :expire_caches, only: options[:expire_actions]) if options[:expire_actions]
|
16
|
+
self.send(:before_action, :image_params, only: options[:save_actions]) if options[:save_actions]
|
17
|
+
self.send(:helper_method, :image_thumb_path)
|
18
|
+
self.send(:helper_method, :image_data_path)
|
19
|
+
end
|
19
20
|
end
|
20
|
-
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
module InstanceMethods
|
23
|
+
def load_image
|
24
|
+
image = image_holder.find(params[:id])
|
25
|
+
column_name = :"#{(params[:image_column] || 'image_data')}"
|
26
|
+
send_data image.send(column_name), type: image.content_type, disposition: 'inline'
|
27
|
+
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
def expire_caches
|
30
|
+
expire_action action: :load_image
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
def image_params
|
34
|
+
ip = params.require(image_handler.name.underscore.to_sym).permit(:image_file, :remove_image)
|
35
|
+
puts "**** image_params **** #{ip} ****"
|
36
|
+
Thread.current[:image_params] = ip
|
37
|
+
end
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
39
|
+
def image_handler
|
40
|
+
self.class.class_variable_get(:@@image_handler)
|
41
|
+
end
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
43
|
+
def image_holder
|
44
|
+
"#{image_handler.name.underscore}_#{Watarase.suffix}".camelize.constantize
|
45
|
+
end
|
44
46
|
|
45
|
-
|
46
|
-
|
47
|
-
|
47
|
+
def image_thumb_path(model)
|
48
|
+
url_for(controller: image_handler.name.downcase!.pluralize, action: 'load_image', id: model.send(:"#{image_holder.name.underscore}").id, image_column: :image_thumb)
|
49
|
+
end
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
def image_data_path(model)
|
52
|
+
url_for(controller: image_handler.name.downcase!.pluralize, action: 'load_image', id: model.send(:"#{image_holder.name.underscore}").id, image_column: :image_data)
|
53
|
+
end
|
52
54
|
|
53
|
-
|
54
|
-
|
55
|
-
_image_handler.send(:"#{image_holder.name.underscore}=", image_holder.new) unless _image_handler.send(:"#{image_holder.name.underscore}")
|
56
|
-
_image_handler.send(:"#{image_holder.name.underscore}").uploaded_image = image_params
|
55
|
+
# Call before create, update
|
56
|
+
#def set_image_holder(_image_handler)
|
57
|
+
# _image_handler.send(:"#{image_holder.name.underscore}=", image_holder.new) unless _image_handler.send(:"#{image_holder.name.underscore}")
|
58
|
+
# _image_handler.send(:"#{image_holder.name.underscore}").uploaded_image = image_params
|
59
|
+
#end
|
57
60
|
end
|
58
61
|
end
|
59
62
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Watarase
|
2
|
+
module ImageHolder
|
3
|
+
module ExtensionWhitelist
|
4
|
+
|
5
|
+
def self.included(model)
|
6
|
+
model.send(:before_save, :check_extension)
|
7
|
+
end
|
8
|
+
|
9
|
+
def check_extension
|
10
|
+
puts "**** check_extension ****"
|
11
|
+
if filename && extension_white_list && !extension_white_list.include?(File.extname(filename).sub(/\./, ''))
|
12
|
+
raise StandardError, "Unsupported file " + filename
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def extension_white_list
|
17
|
+
%w(jpg jpeg gif png)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -9,26 +9,10 @@ module Watarase
|
|
9
9
|
|
10
10
|
str_code = <<-"CODE"
|
11
11
|
|
12
|
-
|
13
|
-
belongs_to :#{file_name}, primary_key: :#{fk}, foreign_key: :#{file_name}_#{fk}
|
12
|
+
acts_as_image_holder
|
14
13
|
|
15
|
-
|
16
|
-
if image_params[:remove_image] && image_params[:remove_image] == "1"
|
17
|
-
self.destroy
|
18
|
-
elsif image_params[:image_file] && !image_params[:image_file].blank?
|
19
|
-
self.filename = image_params[:image_file].original_filename
|
20
|
-
self.content_type = image_params[:image_file].content_type
|
21
|
-
data = image_params[:image_file].tempfile.read
|
22
|
-
self.image_data = Image.from_blob(data).first.resize_to_fit(100, 100).to_blob
|
23
|
-
self.image_thumb = Image.from_blob(data).first.thumbnail(35, 35).to_blob
|
24
|
-
elsif self.new_record?
|
25
|
-
self.destroy
|
26
|
-
end
|
27
|
-
end
|
14
|
+
belongs_to :#{file_name}, primary_key: :#{fk}, foreign_key: :#{file_name}_#{fk}
|
28
15
|
|
29
|
-
def extension_white_list
|
30
|
-
%w(jpg jpeg gif png)
|
31
|
-
end
|
32
16
|
CODE
|
33
17
|
|
34
18
|
generate "model", "#{model_name} #{file_name}_#{fk}:#{fk_type} filename:string content_type:string image_data:binary image_thumb:binary"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'active_record/base'
|
2
|
+
|
3
|
+
module Watarase
|
4
|
+
module ImageHandler
|
5
|
+
def self.included(model)
|
6
|
+
model.extend Watarase::ImageHandler::Macro
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Watarase
|
12
|
+
module ImageHandler
|
13
|
+
module Macro
|
14
|
+
def acts_as_image_handler
|
15
|
+
image_holder = (self.name.underscore << '_' << Watarase.suffix).to_sym
|
16
|
+
self.send(:include, Watarase::ImageHandler::Associate)
|
17
|
+
self.send(:has_one, image_holder, primary_key: self.primary_key, foreign_key: "#{self.name.underscore}_#{self.primary_key}", autosave: true, dependent: :destroy)
|
18
|
+
self.send(:attr_accessor, :remove_image)
|
19
|
+
self.send(:before_save, :update_image_holder)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Associate
|
24
|
+
def update_image_holder
|
25
|
+
puts "**** update image holder **** #{Thread.current[:image_params]} ****"
|
26
|
+
image_holder = (self.class.name.underscore << '_' << Watarase.suffix)
|
27
|
+
return if (!self.send(image_holder.to_sym) and (!Thread.current[:image_params] or !Thread.current[:image_params][:image_file]))
|
28
|
+
|
29
|
+
self.send((image_holder + '=').to_sym, image_holder.camelcase.constantize.new) unless self.send(image_holder.to_sym)
|
30
|
+
self.send(image_holder.to_sym).send(:uploaded_image=, (Thread.current[:image_params] || {}))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
ActiveRecord::Base.send :include, Watarase::ImageHandler unless ActiveRecord::Base.include? Watarase::ImageHandler
|
37
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#require 'RMagick'
|
2
|
+
require 'rmagick'
|
3
|
+
|
4
|
+
module Watarase
|
5
|
+
module ImageHolder
|
6
|
+
def self.included(model)
|
7
|
+
model.extend Watarase::ImageHolder::Macro
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Watarase
|
13
|
+
module ImageHolder
|
14
|
+
module Macro
|
15
|
+
def acts_as_image_holder
|
16
|
+
self.send(:include, Watarase::ImageHolder::ExtensionWhitelist)
|
17
|
+
self.send(:include, Watarase::ImageHolder::Store)
|
18
|
+
self.send(:before_save, :prepare_image)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module Store
|
23
|
+
def uploaded_image= (image_params)
|
24
|
+
puts "**** uploaded_image ****"
|
25
|
+
if image_params[:remove_image] && image_params[:remove_image] == "1"
|
26
|
+
self.destroy
|
27
|
+
elsif image_params[:image_file] && !image_params[:image_file].blank?
|
28
|
+
self.filename = image_params[:image_file].original_filename
|
29
|
+
@image_filename = self.filename
|
30
|
+
self.content_type = image_params[:image_file].content_type
|
31
|
+
@data = image_params[:image_file].tempfile.read
|
32
|
+
elsif self.new_record?
|
33
|
+
self.destroy
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def prepare_image
|
38
|
+
puts "**** prepare_image ****"
|
39
|
+
return unless @data
|
40
|
+
self.image_data = Magick::Image.from_blob(@data).first.resize_to_fit(100, 100).to_blob
|
41
|
+
self.image_thumb = Magick::Image.from_blob(@data).first.thumbnail(35, 35).to_blob
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
ActiveRecord::Base.send :include, Watarase::ImageHolder unless ActiveRecord::Base.include? Watarase::ImageHolder
|
data/lib/watarase/version.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
class UsersController < ApplicationController
|
2
|
-
image_loadable :user, caches: true, expire_actions: [:update]
|
2
|
+
image_loadable :user, caches: true, expire_actions: [:update], save_actions: [:create, :update]
|
3
3
|
|
4
4
|
before_action :set_user, only: [:show, :edit, :update, :destroy]
|
5
5
|
|
6
6
|
# GET /users
|
7
7
|
# GET /users.json
|
8
8
|
def index
|
9
|
-
@users = User.all
|
9
|
+
@users = User.all.merge(includes: [:user_image_holder])
|
10
10
|
end
|
11
11
|
|
12
12
|
# GET /users/1
|
@@ -27,7 +27,7 @@ class UsersController < ApplicationController
|
|
27
27
|
# POST /users.json
|
28
28
|
def create
|
29
29
|
@user = User.new(user_params)
|
30
|
-
set_image_holder @user
|
30
|
+
#set_image_holder @user
|
31
31
|
|
32
32
|
respond_to do |format|
|
33
33
|
if @user.save
|
@@ -44,7 +44,7 @@ class UsersController < ApplicationController
|
|
44
44
|
# PATCH/PUT /users/1.json
|
45
45
|
def update
|
46
46
|
|
47
|
-
set_image_holder @user
|
47
|
+
#set_image_holder @user
|
48
48
|
|
49
49
|
respond_to do |format|
|
50
50
|
if @user.update(user_params)
|
@@ -1,18 +1,7 @@
|
|
1
1
|
class UserImageHolder < ActiveRecord::Base
|
2
|
-
|
2
|
+
|
3
|
+
image_holdable
|
4
|
+
|
3
5
|
belongs_to :user, primary_key: :username, foreign_key: :user_username
|
4
6
|
|
5
|
-
def uploaded_image= (image_params)
|
6
|
-
if image_params[:remove_image] && image_params[:remove_image] == "1"
|
7
|
-
self.destroy
|
8
|
-
elsif image_params[:image_file] && !image_params[:image_file].blank?
|
9
|
-
self.filename = image_params[:image_file].original_filename
|
10
|
-
self.content_type = image_params[:image_file].content_type
|
11
|
-
data = image_params[:image_file].tempfile.read
|
12
|
-
self.image_data = Image.from_blob(data).first.resize_to_fit(100, 100).to_blob
|
13
|
-
self.image_thumb = Image.from_blob(data).first.thumbnail(35, 35).to_blob
|
14
|
-
elsif self.new_record?
|
15
|
-
self.destroy
|
16
|
-
end
|
17
|
-
end
|
18
7
|
end
|
File without changes
|
@@ -1,22 +1,15 @@
|
|
1
1
|
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
|
2
|
-
<%
|
3
|
-
def image_data
|
4
|
-
File.open(Rails.root.join('test/fixtures/images', 'default.png'), 'rb') do |f|
|
5
|
-
"!!binary \"#{Base64.strict_encode64(f.read)}\""
|
6
|
-
end
|
7
|
-
end
|
8
|
-
%>
|
9
2
|
|
10
3
|
one:
|
11
4
|
user_username: MyString1
|
12
|
-
filename:
|
13
|
-
content_type:
|
14
|
-
image_data:
|
15
|
-
image_thumb:
|
5
|
+
filename: MyString.png
|
6
|
+
content_type: MyString
|
7
|
+
image_data:
|
8
|
+
image_thumb:
|
16
9
|
|
17
10
|
two:
|
18
11
|
user_username: MyString2
|
19
|
-
filename:
|
20
|
-
content_type:
|
21
|
-
image_data:
|
22
|
-
image_thumb:
|
12
|
+
filename: MyString.jpg
|
13
|
+
content_type: MyString
|
14
|
+
image_data:
|
15
|
+
image_thumb:
|
@@ -4,11 +4,4 @@ class UserImageHolderTest < ActiveSupport::TestCase
|
|
4
4
|
# test "the truth" do
|
5
5
|
# assert true
|
6
6
|
# end
|
7
|
-
def setup
|
8
|
-
@user_image_holder = UserImageHolder.first
|
9
|
-
end
|
10
|
-
|
11
|
-
test "image holder has image handler" do
|
12
|
-
assert_respond_to(@user_image_holder, :user)
|
13
|
-
end
|
14
7
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watarase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kobayashi-tbn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -75,8 +75,10 @@ extra_rdoc_files: []
|
|
75
75
|
files:
|
76
76
|
- lib/tasks/watarase_tasks.rake
|
77
77
|
- lib/watarase/controller.rb
|
78
|
+
- lib/watarase/extension_whitelist.rb
|
78
79
|
- lib/watarase/generators/uploader/uploader_generator.rb
|
79
|
-
- lib/watarase/
|
80
|
+
- lib/watarase/image_handler.rb
|
81
|
+
- lib/watarase/image_holder.rb
|
80
82
|
- lib/watarase/version.rb
|
81
83
|
- lib/watarase.rb
|
82
84
|
- MIT-LICENSE
|
@@ -124,8 +126,8 @@ files:
|
|
124
126
|
- test/dummy/config/routes.rb
|
125
127
|
- test/dummy/config.ru
|
126
128
|
- test/dummy/db/migrate/20130316163018_create_users.rb
|
127
|
-
- test/dummy/db/migrate/20130318134905_create_user_image_holders.rb
|
128
129
|
- test/dummy/db/migrate/20130324161507_create_posts.rb
|
130
|
+
- test/dummy/db/migrate/20130412174428_create_user_image_holders.rb
|
129
131
|
- test/dummy/db/schema.rb
|
130
132
|
- test/dummy/db/seeds.rb
|
131
133
|
- test/dummy/Gemfile
|
@@ -219,8 +221,8 @@ test_files:
|
|
219
221
|
- test/dummy/config/routes.rb
|
220
222
|
- test/dummy/config.ru
|
221
223
|
- test/dummy/db/migrate/20130316163018_create_users.rb
|
222
|
-
- test/dummy/db/migrate/20130318134905_create_user_image_holders.rb
|
223
224
|
- test/dummy/db/migrate/20130324161507_create_posts.rb
|
225
|
+
- test/dummy/db/migrate/20130412174428_create_user_image_holders.rb
|
224
226
|
- test/dummy/db/schema.rb
|
225
227
|
- test/dummy/db/seeds.rb
|
226
228
|
- test/dummy/Gemfile
|
data/lib/watarase/model.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'active_record/base'
|
2
|
-
|
3
|
-
module Watarase
|
4
|
-
module Model
|
5
|
-
def self.included(model)
|
6
|
-
model.extend Watarase::ActsAsImageHandler
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
module ActsAsImageHandler
|
11
|
-
def acts_as_image_handler
|
12
|
-
image_holder = (self.name.underscore << '_' << Watarase.suffix).to_sym
|
13
|
-
self.send(:has_one, image_holder, primary_key: self.primary_key, foreign_key: "#{self.name.underscore}_#{self.primary_key}", autosave: true)
|
14
|
-
self.send(:attr_accessor, :remove_image)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
ActiveRecord::Base.send :include, Watarase::Model unless ActiveRecord::Base.include? Watarase::Model
|
20
|
-
|