rails_imager 0.0.19 → 0.0.20
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/app/controllers/rails_imager/images_controller.rb +45 -36
- data/app/helpers/rails_imager/images_helper.rb +17 -17
- data/lib/rails_imager/config.rb +8 -0
- data/lib/rails_imager/version.rb +1 -1
- data/lib/rails_imager.rb +11 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8756a05e1d9e4fded390426bb42a4ff85573e86
|
4
|
+
data.tar.gz: 3f9c1935bed9712e465dd604d3f954023ba23150
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80ee5c64d96a0572b3345504d2510fcdd8ac68a90e16de50338a69aca91c6589cb1a5d3dea3e872331d91d7bcbe77c32c966e3e336f7173a8dd1661129bc7ad7
|
7
|
+
data.tar.gz: c4f8bb46f8141d0f14b78908a02b47c2bc61f2d1b450b77701352e5b8755ab0537f2a881d8b1db719818539645d9f8414158629e0da4ba8c6c28c5baa03773d1
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class RailsImager::ImagesController < ApplicationController
|
2
2
|
PARAMS_ARGS = [:width, :height, :smartsize, :maxwidth, :maxheight, :rounded_corners, :border, :border_color, :force]
|
3
|
-
|
3
|
+
|
4
4
|
def show
|
5
5
|
set_and_validate_parameters
|
6
6
|
set_path
|
@@ -8,29 +8,29 @@ class RailsImager::ImagesController < ApplicationController
|
|
8
8
|
generate_cache_name
|
9
9
|
generate_cache if should_generate_cache?
|
10
10
|
set_headers
|
11
|
-
|
11
|
+
|
12
12
|
if not_modified? && !force?
|
13
13
|
render :nothing => true, :status => "304 Not Modified"
|
14
14
|
else
|
15
15
|
send_file @cache_path, :type => "image/png", :disposition => "inline", :filename => "picture.png"
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
private
|
20
|
-
|
20
|
+
|
21
21
|
def set_path
|
22
22
|
@path = "#{Rails.public_path}/#{params[:id]}"
|
23
23
|
@full_path = File.realpath(@path)
|
24
24
|
validate_path
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def set_and_validate_parameters
|
28
28
|
@image_params = params[:image] || {}
|
29
29
|
@image_params.each do |key, val|
|
30
30
|
raise ArgumentError, "Invalid parameter: '#{key}'." unless PARAMS_ARGS.map{ |param| param.to_s }.include?(key)
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def force?
|
35
35
|
if @image_params[:force] && @image_params[:force].to_s == "true"
|
36
36
|
return true
|
@@ -38,58 +38,67 @@ private
|
|
38
38
|
return false
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def not_modified?
|
43
43
|
if request.headers["HTTP_IF_MODIFIED_SINCE"]
|
44
44
|
if_mod_since_time = Datet.in(request.headers["HTTP_IF_MODIFIED_SINCE"]).time
|
45
45
|
else
|
46
46
|
if_mod_since_time = request.if_modified_since
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
if if_mod_since_time && if_mod_since_time.utc.to_s == @mod_time.utc.to_s
|
50
50
|
return true
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
return false
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
def set_headers
|
57
57
|
response.last_modified = @mod_time
|
58
|
-
|
58
|
+
|
59
59
|
if force?
|
60
60
|
response.headers["Expires"] = Time.now.httpdate
|
61
61
|
else
|
62
62
|
response.headers["Expires"] = 2.hours.from_now.httpdate
|
63
63
|
end
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
def validate_path
|
67
|
-
|
68
|
-
|
67
|
+
allowed_paths = RailsImager.config.allowed_paths
|
68
|
+
|
69
|
+
allowed = false
|
70
|
+
allowed_paths.each do |allowed_path|
|
71
|
+
if @full_path.start_with?(allowed_path)
|
72
|
+
allowed = true
|
73
|
+
break
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
raise ArgumentError, "Image wasn't in an allowed path: '#{@full_path}'." unless allowed
|
69
78
|
end
|
70
|
-
|
79
|
+
|
71
80
|
def generate_cache_name
|
72
81
|
@cache_name = ::Knj::Strings.sanitize_filename(@path)
|
73
82
|
@cache_name << "__ARGS_"
|
74
|
-
|
83
|
+
|
75
84
|
PARAMS_ARGS.each do |val|
|
76
85
|
next if val.to_s == "force"
|
77
86
|
@cache_name << "_#{val}-#{@image_params[val]}"
|
78
87
|
end
|
79
|
-
|
88
|
+
|
80
89
|
@cache_path = "#{cache_directory}/#{@cache_name}"
|
81
90
|
end
|
82
|
-
|
91
|
+
|
83
92
|
def cache_directory
|
84
93
|
require "tmpdir"
|
85
94
|
cache_path = "#{Dir.tmpdir}/rails-imager-cache"
|
86
95
|
Dir.mkdir(cache_path) unless Dir.exists?(cache_path)
|
87
96
|
return cache_path
|
88
97
|
end
|
89
|
-
|
98
|
+
|
90
99
|
def should_generate_cache?
|
91
100
|
return true if force?
|
92
|
-
|
101
|
+
|
93
102
|
if File.exists?(@cache_path)
|
94
103
|
if File.mtime(@cache_path) < File.mtime(@full_path)
|
95
104
|
return true
|
@@ -100,36 +109,36 @@ private
|
|
100
109
|
return true
|
101
110
|
end
|
102
111
|
end
|
103
|
-
|
112
|
+
|
104
113
|
def generate_cache
|
105
114
|
@image = ::Magick::Image.read(@full_path).first
|
106
115
|
@image.format = "png"
|
107
116
|
apply_image_changes
|
108
117
|
@image.write(@cache_path)
|
109
118
|
end
|
110
|
-
|
119
|
+
|
111
120
|
#Create a new image-object based on the given image-object and the parameters.
|
112
121
|
def apply_image_changes
|
113
122
|
@image_width = @image.columns
|
114
123
|
@image_height = @image.rows
|
115
|
-
|
124
|
+
|
116
125
|
if @image_params[:width].to_i > 0
|
117
126
|
@width = @image_params[:width].to_i
|
118
127
|
else
|
119
128
|
@width = @image_width
|
120
129
|
end
|
121
|
-
|
130
|
+
|
122
131
|
if @image_params[:height].to_i > 0
|
123
132
|
@height = @image_params[:height].to_i
|
124
133
|
else
|
125
134
|
@height = @image_height
|
126
135
|
end
|
127
|
-
|
136
|
+
|
128
137
|
calcuate_sizes
|
129
138
|
@image = @image.resize(@width, @height) if @width != @image_width || @height != @image_height
|
130
139
|
apply_rounded_corners if @image_params[:rounded_corners]
|
131
140
|
end
|
132
|
-
|
141
|
+
|
133
142
|
def calcuate_sizes
|
134
143
|
validate_and_set_smartsize if @image_params[:smartsize]
|
135
144
|
validate_and_set_max_width
|
@@ -137,15 +146,15 @@ private
|
|
137
146
|
calculate_missing_width if @image_params[:height] && !@image_params[:width]
|
138
147
|
calculate_missing_height if @image_params[:width] && !@image_params[:height]
|
139
148
|
end
|
140
|
-
|
149
|
+
|
141
150
|
def calculate_missing_height
|
142
151
|
@height = (@image_height.to_f / (@image_width.to_f / @width.to_f)).to_i
|
143
152
|
end
|
144
|
-
|
153
|
+
|
145
154
|
def calculate_missing_width
|
146
155
|
@width = (@image_width.to_f / (@image_height.to_f / @height.to_f)).to_i
|
147
156
|
end
|
148
|
-
|
157
|
+
|
149
158
|
def validate_and_set_smartsize
|
150
159
|
if @image_width > @image_height
|
151
160
|
@width = @image_params[:smartsize].to_i
|
@@ -155,39 +164,39 @@ private
|
|
155
164
|
calculate_missing_width
|
156
165
|
end
|
157
166
|
end
|
158
|
-
|
167
|
+
|
159
168
|
def validate_and_set_max_width
|
160
169
|
if @image_params[:maxwidth]
|
161
170
|
maxwidth = @image_params[:maxwidth].to_i
|
162
|
-
|
171
|
+
|
163
172
|
if @width > maxwidth
|
164
173
|
@width = maxwidth
|
165
174
|
calculate_missing_height
|
166
175
|
end
|
167
176
|
end
|
168
177
|
end
|
169
|
-
|
178
|
+
|
170
179
|
def validate_and_set_max_height
|
171
180
|
if @image_params[:maxheight]
|
172
181
|
maxheight = @image_params[:maxheight].to_i
|
173
|
-
|
182
|
+
|
174
183
|
if @height > maxheight
|
175
184
|
@height = maxheight
|
176
185
|
calculate_missing_width
|
177
186
|
end
|
178
187
|
end
|
179
188
|
end
|
180
|
-
|
189
|
+
|
181
190
|
def apply_rounded_corners
|
182
191
|
@image = @image.clone
|
183
192
|
@image.format = "png" # Needs PNG format for transparency.
|
184
193
|
args = {:img => @image, :radius => @image_params[:rounded_corners].to_i}
|
185
|
-
|
194
|
+
|
186
195
|
if @image_params[:border] && @image_params[:border_color]
|
187
196
|
args[:border] = @image_params[:border].to_i
|
188
197
|
args[:border_color] = @image_params[:border_color]
|
189
198
|
end
|
190
|
-
|
199
|
+
|
191
200
|
::Knj::Image.rounded_corners(args)
|
192
201
|
end
|
193
202
|
end
|
@@ -3,7 +3,7 @@ require "uri"
|
|
3
3
|
module RailsImager::ImagesHelper
|
4
4
|
def rails_imager_p(path, args = {})
|
5
5
|
path = path_from_arg(path)
|
6
|
-
|
6
|
+
|
7
7
|
if args.delete(:url)
|
8
8
|
newpath = "#{request.protocol}#{request.host_with_port}"
|
9
9
|
elsif args.delete(:mailer)
|
@@ -11,41 +11,41 @@ module RailsImager::ImagesHelper
|
|
11
11
|
else
|
12
12
|
newpath = ""
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
check_arguments(args)
|
16
|
-
|
16
|
+
|
17
17
|
newpath << "/rails_imager/images/"
|
18
18
|
newpath << path
|
19
|
-
|
19
|
+
|
20
20
|
if args && args.any?
|
21
21
|
newpath << "?"
|
22
22
|
newpath << url_encoded_arguments(args)
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
return newpath
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
private
|
29
|
-
|
29
|
+
|
30
30
|
def mailer_pre_path
|
31
31
|
if ActionMailer::Base.default_url_options[:protocol]
|
32
32
|
pre_path = ActionMailer::Base.default_url_options[:protocol]
|
33
33
|
else
|
34
34
|
pre_path = "http://"
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
pre_path << ActionMailer::Base.default_url_options[:host]
|
38
|
-
|
38
|
+
|
39
39
|
if ActionMailer::Base.default_url_options[:port]
|
40
40
|
pre_path << ":#{ActionMailer::Base.default_url_options[:port]}"
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
return pre_path
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
def url_encoded_arguments(args)
|
47
47
|
path = ""
|
48
|
-
|
48
|
+
|
49
49
|
first = true
|
50
50
|
args.each do |key, val|
|
51
51
|
if first
|
@@ -53,24 +53,24 @@ private
|
|
53
53
|
else
|
54
54
|
path << "&"
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
realkey = "image[#{key}]"
|
58
|
-
|
58
|
+
|
59
59
|
path << URI.encode(realkey)
|
60
60
|
path << "="
|
61
61
|
path << URI.encode(val.to_s)
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
return path
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def check_arguments(args)
|
68
68
|
# Check for invalid parameters.
|
69
69
|
args.each do |key, val|
|
70
70
|
raise ArgumentError, "Invalid parameter: '#{key}'." unless RailsImager::ImagesController::PARAMS_ARGS.include?(key)
|
71
71
|
end
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
def path_from_arg(path)
|
75
75
|
if path.class.name == "Paperclip::Attachment"
|
76
76
|
raise "Paperclip path does not start with public path: #{path.path}" unless path.path.to_s.start_with?(Rails.public_path.to_s)
|
data/lib/rails_imager/version.rb
CHANGED
data/lib/rails_imager.rb
CHANGED
@@ -14,12 +14,21 @@ module RailsImager
|
|
14
14
|
else
|
15
15
|
path = "#{File.dirname(__FILE__)}/rails_imager/#{::StringCases.camel_to_snake(name)}.rb"
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
if File.exists?(path)
|
19
19
|
require path
|
20
20
|
return const_get(name) if const_defined?(name)
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
super
|
24
24
|
end
|
25
|
+
|
26
|
+
@config = RailsImager::Config.new
|
27
|
+
def self.config
|
28
|
+
if block_given?
|
29
|
+
yield @config
|
30
|
+
else
|
31
|
+
return @config
|
32
|
+
end
|
33
|
+
end
|
25
34
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_imager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kaspernj
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- lib/rails_imager.rb
|
155
155
|
- lib/tasks/rails_imager_tasks.rake
|
156
156
|
- lib/rails_imager/engine.rb
|
157
|
+
- lib/rails_imager/config.rb
|
157
158
|
- lib/rails_imager/version.rb
|
158
159
|
- MIT-LICENSE
|
159
160
|
- Rakefile
|