mini_paperclip 0.1.2 → 0.2.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 +4 -4
- data/lib/mini_paperclip/attachment.rb +92 -62
- data/lib/mini_paperclip/shoulda/matchers/validate_attachment_geometry_matcher.rb +1 -0
- data/lib/mini_paperclip/storage/filesystem.rb +6 -10
- data/lib/mini_paperclip/storage/s3.rb +12 -13
- data/lib/mini_paperclip/validators/geometry_validator.rb +5 -1
- data/lib/mini_paperclip/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cda880f15d0e468fe2e0468658dbd11bf52a933e79f936fdc1a16ade88536e79
|
4
|
+
data.tar.gz: 9bf633f6dd48be4fc3f41b4539568039ab710a0a61e43e47ea297221599588af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0fd8c9651b0bfbb7e9c79faf6476644983a56256ebe856fdb0e379e97b6f35e5b30ec64ab2d8dc474f3f5617965b0bf598d48d712bf211d9d8c30d3162d4697
|
7
|
+
data.tar.gz: 35aeb9655dc45afd56b72ad0e98659218035a26494a345af6352a505d123945c113f1947946341c526e8a2314b6ea2974dd6c2678142105dd4f6e6a459d31d3e
|
@@ -62,63 +62,24 @@ module MiniPaperclip
|
|
62
62
|
@meta_content_type = nil
|
63
63
|
|
64
64
|
if file.nil?
|
65
|
-
|
66
|
-
@record.write_attribute("#{@attachment_name}_file_name", nil)
|
67
|
-
@record.write_attribute("#{@attachment_name}_content_type", nil)
|
68
|
-
@record.write_attribute("#{@attachment_name}_file_size", nil)
|
69
|
-
@record.write_attribute("#{@attachment_name}_updated_at", nil)
|
65
|
+
assign_nil
|
70
66
|
elsif file.instance_of?(Attachment)
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
@waiting_copy_attachment = file
|
67
|
+
if file.present?
|
68
|
+
assign_attachment(file)
|
69
|
+
else
|
70
|
+
assign_nil
|
71
|
+
end
|
77
72
|
elsif file.respond_to?(:original_filename)
|
78
|
-
|
79
|
-
@record.write_attribute("#{@attachment_name}_file_name", file.original_filename)
|
80
|
-
@record.write_attribute("#{@attachment_name}_content_type", strict_content_type(file.to_io))
|
81
|
-
@record.write_attribute("#{@attachment_name}_file_size", file.size)
|
82
|
-
@record.write_attribute("#{@attachment_name}_updated_at", Time.current)
|
83
|
-
@waiting_write_file = build_tempfile(file.tap(&:rewind))
|
84
|
-
@meta_content_type = file.content_type
|
73
|
+
assign_uploaded_file(file)
|
85
74
|
elsif file.respond_to?(:path)
|
86
|
-
|
87
|
-
@record.write_attribute("#{@attachment_name}_file_name", File.basename(file.path))
|
88
|
-
@record.write_attribute("#{@attachment_name}_content_type", strict_content_type(file))
|
89
|
-
@record.write_attribute("#{@attachment_name}_file_size", file.size)
|
90
|
-
@record.write_attribute("#{@attachment_name}_updated_at", Time.current)
|
91
|
-
@waiting_write_file = build_tempfile(file.tap(&:rewind))
|
75
|
+
assign_file(file)
|
92
76
|
elsif file.instance_of?(String)
|
93
77
|
if file.empty?
|
94
78
|
# do nothing
|
95
79
|
elsif file.start_with?('http')
|
96
|
-
|
97
|
-
open_uri_option = {
|
98
|
-
read_timeout: MiniPaperclip.config.read_timeout || 60
|
99
|
-
}
|
100
|
-
uri = URI.parse(file)
|
101
|
-
uri.open(open_uri_option) do |io|
|
102
|
-
@record.write_attribute("#{@attachment_name}_file_name", File.basename(uri.path))
|
103
|
-
@record.write_attribute("#{@attachment_name}_content_type", strict_content_type(io))
|
104
|
-
@record.write_attribute("#{@attachment_name}_file_size", io.size)
|
105
|
-
@record.write_attribute("#{@attachment_name}_updated_at", Time.current)
|
106
|
-
@waiting_write_file = build_tempfile(io.tap(&:rewind))
|
107
|
-
@meta_content_type = io.meta["content-type"]
|
108
|
-
end
|
80
|
+
assign_http(file)
|
109
81
|
elsif file.start_with?('data:')
|
110
|
-
|
111
|
-
match_data = file.match(/\Adata:([-\w]+\/[-\w\+\.]+)?;base64,(.*)/m)
|
112
|
-
if match_data.nil?
|
113
|
-
raise UnsupportedError, "attachment for \"#{file[0..100]}\" is not supported"
|
114
|
-
end
|
115
|
-
raw = Base64.decode64(match_data[2])
|
116
|
-
@record.write_attribute("#{@attachment_name}_file_name", nil)
|
117
|
-
@record.write_attribute("#{@attachment_name}_content_type", strict_content_type(StringIO.new(raw)))
|
118
|
-
@record.write_attribute("#{@attachment_name}_file_size", raw.bytesize)
|
119
|
-
@record.write_attribute("#{@attachment_name}_updated_at", Time.current)
|
120
|
-
@waiting_write_file = build_tempfile(StringIO.new(raw))
|
121
|
-
@meta_content_type = match_data[1]
|
82
|
+
assign_data_uri(file)
|
122
83
|
else
|
123
84
|
raise UnsupportedError, "attachment for \"#{file[0..100]}\" is not supported"
|
124
85
|
end
|
@@ -129,26 +90,18 @@ module MiniPaperclip
|
|
129
90
|
|
130
91
|
def process_and_store
|
131
92
|
return unless file?
|
132
|
-
|
133
|
-
if @waiting_copy_attachment
|
134
|
-
debug("start attachment copy")
|
135
|
-
@storage.copy(:original, @waiting_copy_attachment)
|
136
|
-
@config.styles&.each do |style, size_arg|
|
137
|
-
@storage.copy(style, @waiting_copy_attachment)
|
138
|
-
end
|
139
|
-
@waiting_copy_attachment = nil
|
140
|
-
return
|
141
|
-
end
|
142
|
-
|
143
|
-
return if @waiting_write_file.nil?
|
93
|
+
return unless @waiting_write_file
|
144
94
|
|
145
95
|
begin
|
146
96
|
debug("start attachment styles process")
|
147
97
|
@storage.write(:original, @waiting_write_file)
|
148
98
|
@config.styles&.each do |style, size_arg|
|
149
99
|
Tempfile.create([style.to_s, File.extname(@waiting_write_file.path)]) do |temp|
|
100
|
+
temp.binmode
|
150
101
|
MiniMagick::Tool::Convert.new do |convert|
|
151
102
|
convert << @waiting_write_file.path
|
103
|
+
convert.coalesce if animated?
|
104
|
+
convert.auto_orient
|
152
105
|
if size_arg.end_with?('#')
|
153
106
|
# crop option
|
154
107
|
convert.resize("#{size_arg[0..-2]}^")
|
@@ -157,13 +110,18 @@ module MiniPaperclip
|
|
157
110
|
else
|
158
111
|
convert.resize(size_arg)
|
159
112
|
end
|
113
|
+
convert.layers("optimize") if animated?
|
160
114
|
convert << temp.path
|
161
115
|
end
|
162
116
|
@storage.write(style, temp)
|
163
117
|
end
|
164
118
|
end
|
165
119
|
ensure
|
166
|
-
@waiting_write_file.close!
|
120
|
+
if @waiting_write_file.respond_to?(:close!)
|
121
|
+
@waiting_write_file.close!
|
122
|
+
elsif @waiting_write_file.respond_to?(:close)
|
123
|
+
@waiting_write_file.close
|
124
|
+
end
|
167
125
|
end
|
168
126
|
@waiting_write_file = nil
|
169
127
|
end
|
@@ -179,9 +137,81 @@ module MiniPaperclip
|
|
179
137
|
@storage.do_delete_files
|
180
138
|
end
|
181
139
|
|
140
|
+
def animated?
|
141
|
+
content_type == 'image/gif'
|
142
|
+
end
|
143
|
+
|
182
144
|
private
|
183
145
|
|
146
|
+
def assign_nil
|
147
|
+
# clear
|
148
|
+
@record.write_attribute("#{@attachment_name}_file_name", nil)
|
149
|
+
@record.write_attribute("#{@attachment_name}_content_type", nil)
|
150
|
+
@record.write_attribute("#{@attachment_name}_file_size", nil)
|
151
|
+
@record.write_attribute("#{@attachment_name}_updated_at", nil)
|
152
|
+
end
|
153
|
+
|
154
|
+
def assign_attachment(attachment)
|
155
|
+
# copy
|
156
|
+
@waiting_write_file = attachment.storage.open(:original)
|
157
|
+
@record.write_attribute("#{@attachment_name}_file_name", attachment.original_filename)
|
158
|
+
@record.write_attribute("#{@attachment_name}_content_type", attachment.content_type)
|
159
|
+
@record.write_attribute("#{@attachment_name}_file_size", attachment.size)
|
160
|
+
@record.write_attribute("#{@attachment_name}_updated_at", Time.current)
|
161
|
+
end
|
162
|
+
|
163
|
+
def assign_uploaded_file(file)
|
164
|
+
# e.g. ActionDispatch::Http::UploadedFile
|
165
|
+
@record.write_attribute("#{@attachment_name}_file_name", file.original_filename)
|
166
|
+
@record.write_attribute("#{@attachment_name}_content_type", strict_content_type(file.to_io))
|
167
|
+
@record.write_attribute("#{@attachment_name}_file_size", file.size)
|
168
|
+
@record.write_attribute("#{@attachment_name}_updated_at", Time.current)
|
169
|
+
@waiting_write_file = build_tempfile(file.tap(&:rewind))
|
170
|
+
@meta_content_type = file.content_type
|
171
|
+
end
|
172
|
+
|
173
|
+
def assign_file(file)
|
174
|
+
# e.g. File
|
175
|
+
@record.write_attribute("#{@attachment_name}_file_name", File.basename(file.path))
|
176
|
+
@record.write_attribute("#{@attachment_name}_content_type", strict_content_type(file))
|
177
|
+
@record.write_attribute("#{@attachment_name}_file_size", file.size)
|
178
|
+
@record.write_attribute("#{@attachment_name}_updated_at", Time.current)
|
179
|
+
@waiting_write_file = build_tempfile(file.tap(&:rewind))
|
180
|
+
end
|
181
|
+
|
182
|
+
def assign_http(url)
|
183
|
+
# download from url
|
184
|
+
open_uri_option = {
|
185
|
+
read_timeout: MiniPaperclip.config.read_timeout || 60
|
186
|
+
}
|
187
|
+
uri = URI.parse(url)
|
188
|
+
uri.open(open_uri_option) do |io|
|
189
|
+
@record.write_attribute("#{@attachment_name}_file_name", File.basename(uri.path))
|
190
|
+
@record.write_attribute("#{@attachment_name}_content_type", strict_content_type(io))
|
191
|
+
@record.write_attribute("#{@attachment_name}_file_size", io.size)
|
192
|
+
@record.write_attribute("#{@attachment_name}_updated_at", Time.current)
|
193
|
+
@waiting_write_file = build_tempfile(io.tap(&:rewind))
|
194
|
+
@meta_content_type = io.meta["content-type"]
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def assign_data_uri(data_uri)
|
199
|
+
# data-uri
|
200
|
+
match_data = data_uri.match(/\Adata:([-\w]+\/[-\w\+\.]+)?;base64,(.*)/m)
|
201
|
+
if match_data.nil?
|
202
|
+
raise UnsupportedError, "attachment for \"#{data_uri[0..100]}\" is not supported"
|
203
|
+
end
|
204
|
+
raw = Base64.decode64(match_data[2])
|
205
|
+
@record.write_attribute("#{@attachment_name}_file_name", nil)
|
206
|
+
@record.write_attribute("#{@attachment_name}_content_type", strict_content_type(StringIO.new(raw)))
|
207
|
+
@record.write_attribute("#{@attachment_name}_file_size", raw.bytesize)
|
208
|
+
@record.write_attribute("#{@attachment_name}_updated_at", Time.current)
|
209
|
+
@waiting_write_file = build_tempfile(StringIO.new(raw))
|
210
|
+
@meta_content_type = match_data[1]
|
211
|
+
end
|
212
|
+
|
184
213
|
def strict_content_type(io)
|
214
|
+
io.rewind
|
185
215
|
MimeMagic.by_magic(io)&.type
|
186
216
|
end
|
187
217
|
|
@@ -96,6 +96,7 @@ module MiniPaperclip
|
|
96
96
|
|
97
97
|
def create_dummy_image(width:, height:)
|
98
98
|
Tempfile.create(['MiniPaperclip::Shoulda::Matchers::ValidateAttachmentGeometryMatcher', ".#{@format}"]) do |f|
|
99
|
+
f.binmode
|
99
100
|
MiniMagick::Tool::Convert.new do |convert|
|
100
101
|
convert.size("#{width}x#{height}")
|
101
102
|
convert.xc("none")
|
@@ -5,17 +5,9 @@ module MiniPaperclip
|
|
5
5
|
class Filesystem < Base
|
6
6
|
def write(style, file)
|
7
7
|
path = file_path(style)
|
8
|
-
debug("writing by filesystem to
|
8
|
+
debug("writing by filesystem from:#{file.path} to:#{path}")
|
9
9
|
FileUtils.mkdir_p(File.dirname(path))
|
10
|
-
FileUtils.cp(file.path, path)
|
11
|
-
end
|
12
|
-
|
13
|
-
def copy(style, from_attachment)
|
14
|
-
raise "not supported" unless from_attachment.storage.instance_of?(Filesystem)
|
15
|
-
to_path = file_path(style)
|
16
|
-
from_path = from_attachment.storage.file_path(style)
|
17
|
-
debug("copying by filesystem from:#{from_path} to:#{to_path}")
|
18
|
-
FileUtils.cp(from_path, to_path)
|
10
|
+
FileUtils.cp(file.path, path) if file.path != path
|
19
11
|
end
|
20
12
|
|
21
13
|
def file_path(style)
|
@@ -38,6 +30,10 @@ module MiniPaperclip
|
|
38
30
|
debug("deleting by filesystem #{@deletes}")
|
39
31
|
FileUtils.rm_f(@deletes)
|
40
32
|
end
|
33
|
+
|
34
|
+
def open(style, &block)
|
35
|
+
File.open(file_path(style), 'r', &block)
|
36
|
+
end
|
41
37
|
end
|
42
38
|
end
|
43
39
|
end
|
@@ -15,19 +15,6 @@ module MiniPaperclip
|
|
15
15
|
)
|
16
16
|
end
|
17
17
|
|
18
|
-
def copy(style, from_attachment)
|
19
|
-
raise "not supported yet" unless from_attachment.storage.instance_of?(S3)
|
20
|
-
debug("copying by S3 to bucket:#{@config.s3_bucket_name},key:#{s3_object_key(style)}")
|
21
|
-
Aws::S3::Client.new.copy_object(
|
22
|
-
acl: @config.s3_acl,
|
23
|
-
cache_control: @config.s3_cache_control,
|
24
|
-
content_type: @attachment.content_type,
|
25
|
-
copy_source: from_attachment.storage.object_key(style),
|
26
|
-
bucket: @config.s3_bucket_name,
|
27
|
-
key: s3_object_key(style),
|
28
|
-
)
|
29
|
-
end
|
30
|
-
|
31
18
|
def s3_object_key(style)
|
32
19
|
interpolate(@config.url_path, style)
|
33
20
|
end
|
@@ -61,6 +48,18 @@ module MiniPaperclip
|
|
61
48
|
}
|
62
49
|
)
|
63
50
|
end
|
51
|
+
|
52
|
+
def open(style)
|
53
|
+
Tempfile.new(['MiniPaperclip::Storage::S3']).tap do |response_target|
|
54
|
+
response_target.binmode
|
55
|
+
Aws::S3::Client.new.get_object(
|
56
|
+
bucket: @config.s3_bucket_name,
|
57
|
+
key: s3_object_key(style),
|
58
|
+
response_target: response_target,
|
59
|
+
)
|
60
|
+
yield response_target if block_given?
|
61
|
+
end
|
62
|
+
end
|
64
63
|
end
|
65
64
|
end
|
66
65
|
end
|
@@ -23,9 +23,13 @@ module MiniPaperclip
|
|
23
23
|
# height: { less_than_or_equal_to: 3000 } }
|
24
24
|
def validate_each(record, attribute, value)
|
25
25
|
return unless value.waiting_write_file
|
26
|
+
value.waiting_write_file.rewind
|
26
27
|
image_size = ImageSize.new(value.waiting_write_file)
|
27
28
|
# invalid format should not relate geometry
|
28
|
-
|
29
|
+
unless image_size.format
|
30
|
+
MiniPaperclip.config.logger.info("[mini_paperclip] cannot get image_size from #{value.waiting_write_file.inspect}")
|
31
|
+
return
|
32
|
+
end
|
29
33
|
|
30
34
|
expected_width_less_than_or_equal_to = options.dig(:width, :less_than_or_equal_to)
|
31
35
|
expected_height_less_than_or_equal_to = options.dig(:height, :less_than_or_equal_to)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_paperclip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ksss
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-12-
|
11
|
+
date: 2020-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mini_magick
|
@@ -159,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
159
|
- !ruby/object:Gem::Version
|
160
160
|
version: '0'
|
161
161
|
requirements: []
|
162
|
-
rubygems_version: 3.
|
162
|
+
rubygems_version: 3.0.3
|
163
163
|
signing_key:
|
164
164
|
specification_version: 4
|
165
165
|
summary: MiniPaperclip is a mini paperclip
|