has_image 0.1.6 → 0.1.7
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.
- data/CHANGELOG +4 -1
- data/lib/has_image/storage.rb +16 -11
- data/test/storage_test.rb +5 -0
- metadata +1 -1
data/CHANGELOG
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
2008-08-1 Adrian Mugnolo <adrian@randomba.org>
|
2
|
+
* Improved partitioned path handling to avoid collisions when the id is
|
3
|
+
very high, which can happen if you use db:fixtures:load.
|
4
|
+
|
1
5
|
2008-08-1 Norman Clarke <norman@randomba.org>
|
2
|
-
|
3
6
|
* Fixed a bug where overwriting a previous image triggered callbacks more
|
4
7
|
than once, causing errors.
|
5
8
|
|
data/lib/has_image/storage.rb
CHANGED
@@ -6,26 +6,31 @@ require 'zlib'
|
|
6
6
|
module HasImage
|
7
7
|
|
8
8
|
# Filesystem storage for the HasImage gem. The methods that HasImage inserts
|
9
|
-
# into ActiveRecord models only depend on the public methods in this class,
|
10
|
-
# it should be reasonably straightforward to implement a different
|
11
|
-
# mechanism for Amazon AWS, Photobucket, DBFile, SFTP, or whatever
|
9
|
+
# into ActiveRecord models only depend on the public methods in this class,
|
10
|
+
# so it should be reasonably straightforward to implement a different
|
11
|
+
# storage mechanism for Amazon AWS, Photobucket, DBFile, SFTP, or whatever
|
12
|
+
# you want.
|
12
13
|
class Storage
|
13
14
|
|
14
15
|
attr_accessor :image_data, :options, :temp_file
|
15
16
|
|
16
17
|
class << self
|
17
18
|
|
18
|
-
#
|
19
|
+
# {Jamis Buck's well known
|
20
|
+
# solution}[http://www.37signals.com/svn/archives2/id_partitioning.php]
|
21
|
+
# to this problem fails with high ids, such as those created by
|
22
|
+
# db:fixture:load. This version scales to large ids more gracefully.
|
23
|
+
# Thanks to Adrian Mugnolo for the fix.
|
19
24
|
def partitioned_path(id, *args)
|
20
|
-
("%
|
25
|
+
["%04d" % ((id.to_i / 1e4) % 1e4), "%04d" % (id.to_i % 1e4)].concat(args)
|
21
26
|
end
|
22
27
|
|
23
|
-
# Generates a 4-6 character random file name to use for the image and
|
24
|
-
# thumbnails. This is done to avoid having files with unfortunate
|
25
|
-
# On one of my sites users frequently upload images with Arabic
|
26
|
-
# they end up being hard to manipulate on the command line.
|
27
|
-
# helps prevent a possibly undesirable sitation where the
|
28
|
-
# have offensive names.
|
28
|
+
# Generates a 4-6 character random file name to use for the image and
|
29
|
+
# its thumbnails. This is done to avoid having files with unfortunate
|
30
|
+
# names. On one of my sites users frequently upload images with Arabic
|
31
|
+
# names, and they end up being hard to manipulate on the command line.
|
32
|
+
# This also helps prevent a possibly undesirable sitation where the
|
33
|
+
# uploaded images have offensive names.
|
29
34
|
def random_file_name
|
30
35
|
Zlib.crc32(Time.now.to_s + rand(10e10).to_s).to_s(36).downcase
|
31
36
|
end
|
data/test/storage_test.rb
CHANGED
@@ -20,6 +20,11 @@ class StorageTest < Test::Unit::TestCase
|
|
20
20
|
assert_equal(["0001", "2345"], HasImage::Storage.partitioned_path("12345"))
|
21
21
|
end
|
22
22
|
|
23
|
+
def test_partitioned_path_doesnt_collide_with_high_ids
|
24
|
+
assert_not_equal HasImage::Storage.partitioned_path(867792732),
|
25
|
+
HasImage::Storage.partitioned_path(867792731)
|
26
|
+
end
|
27
|
+
|
23
28
|
def test_random_file_name
|
24
29
|
assert_match(/[a-z0-9]{4,6}/i, HasImage::Storage.random_file_name)
|
25
30
|
end
|