avatar 0.0.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/{README.txt → README.rdoc} +12 -4
- data/init.rb +5 -0
- data/lib/avatar.rb +3 -2
- data/lib/avatar/source/pavatar_source.rb +109 -0
- data/lib/avatar/source/wrapper/rails_asset_source_wrapper.rb +3 -1
- data/lib/avatar/version.rb +2 -2
- data/rails/init.rb +1 -0
- metadata +28 -125
- data/.gitignore +0 -8
- data/Manifest.txt +0 -104
- data/Rakefile +0 -10
- data/config/hoe.rb +0 -70
- data/config/requirements.rb +0 -17
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/script/txt2html +0 -74
- data/setup.rb +0 -1585
- data/tasks/deployment.rake +0 -34
- data/tasks/environment.rake +0 -7
- data/tasks/testing.rake +0 -37
- data/tasks/website.rake +0 -17
- data/test/.gitignore +0 -3
- data/test/lib/database.rb +0 -2
- data/test/lib/database.yml +0 -10
- data/test/lib/file_column/CHANGELOG +0 -69
- data/test/lib/file_column/README +0 -54
- data/test/lib/file_column/Rakefile +0 -36
- data/test/lib/file_column/TODO +0 -6
- data/test/lib/file_column/init.rb +0 -13
- data/test/lib/file_column/lib/file_column.rb +0 -720
- data/test/lib/file_column/lib/file_column_helper.rb +0 -150
- data/test/lib/file_column/lib/file_compat.rb +0 -28
- data/test/lib/file_column/lib/magick_file_column.rb +0 -260
- data/test/lib/file_column/lib/rails_file_column.rb +0 -19
- data/test/lib/file_column/lib/test_case.rb +0 -124
- data/test/lib/file_column/lib/validations.rb +0 -112
- data/test/lib/file_column/test/abstract_unit.rb +0 -63
- data/test/lib/file_column/test/connection.rb +0 -17
- data/test/lib/file_column/test/file_column_helper_test.rb +0 -97
- data/test/lib/file_column/test/file_column_test.rb +0 -650
- data/test/lib/file_column/test/fixtures/entry.rb +0 -32
- data/test/lib/file_column/test/fixtures/invalid-image.jpg +0 -1
- data/test/lib/file_column/test/fixtures/kerb.jpg +0 -0
- data/test/lib/file_column/test/fixtures/mysql.sql +0 -25
- data/test/lib/file_column/test/fixtures/schema.rb +0 -10
- data/test/lib/file_column/test/fixtures/skanthak.png +0 -0
- data/test/lib/file_column/test/magick_test.rb +0 -380
- data/test/lib/file_column/test/magick_view_only_test.rb +0 -21
- data/test/lib/paperclip/README +0 -32
- data/test/lib/paperclip/Rakefile +0 -41
- data/test/lib/paperclip/generators/paperclip/USAGE +0 -5
- data/test/lib/paperclip/generators/paperclip/paperclip_generator.rb +0 -27
- data/test/lib/paperclip/generators/paperclip/templates/paperclip_migration.rb +0 -17
- data/test/lib/paperclip/init.rb +0 -3
- data/test/lib/paperclip/lib/paperclip.rb +0 -197
- data/test/lib/paperclip/lib/paperclip/attachment.rb +0 -230
- data/test/lib/paperclip/lib/paperclip/geometry.rb +0 -109
- data/test/lib/paperclip/lib/paperclip/iostream.rb +0 -43
- data/test/lib/paperclip/lib/paperclip/thumbnail.rb +0 -80
- data/test/lib/paperclip/lib/paperclip/upfile.rb +0 -32
- data/test/lib/paperclip/tasks/paperclip_tasks.rake +0 -38
- data/test/lib/paperclip/test/database.yml +0 -5
- data/test/lib/paperclip/test/fixtures/12k.png +0 -0
- data/test/lib/paperclip/test/fixtures/5k.png +0 -0
- data/test/lib/paperclip/test/fixtures/bad.png +0 -1
- data/test/lib/paperclip/test/helper.rb +0 -38
- data/test/lib/paperclip/test/test_attachment.rb +0 -99
- data/test/lib/paperclip/test/test_geometry.rb +0 -142
- data/test/lib/paperclip/test/test_integration.rb +0 -76
- data/test/lib/paperclip/test/test_iostream.rb +0 -60
- data/test/lib/paperclip/test/test_paperclip.rb +0 -83
- data/test/lib/paperclip/test/test_thumbnail.rb +0 -76
- data/test/lib/schema.rb +0 -20
- data/test/lib/user_suit.png +0 -0
- data/test/test_abstract_view_support.rb +0 -22
- data/test/test_action_view_support.rb +0 -30
- data/test/test_avatar.rb +0 -12
- data/test/test_file_column_source.rb +0 -38
- data/test/test_gravatar_source.rb +0 -79
- data/test/test_helper.rb +0 -27
- data/test/test_nil_source.rb +0 -18
- data/test/test_paperclip_source.rb +0 -52
- data/test/test_rails_asset_source_wrapper.rb +0 -37
- data/test/test_source_chain.rb +0 -44
- data/test/test_static_url_source.rb +0 -18
- data/test/test_string_substitution_source_wrapper.rb +0 -25
- data/website/index.html +0 -105
- data/website/index.txt +0 -48
- data/website/javascripts/rounded_corners_lite.inc.js +0 -285
- data/website/stylesheets/screen.css +0 -138
- data/website/template.rhtml +0 -48
@@ -1,109 +0,0 @@
|
|
1
|
-
module Paperclip
|
2
|
-
|
3
|
-
# Defines the geometry of an image.
|
4
|
-
class Geometry
|
5
|
-
attr_accessor :height, :width, :modifier
|
6
|
-
|
7
|
-
# Gives a Geometry representing the given height and width
|
8
|
-
def initialize width = nil, height = nil, modifier = nil
|
9
|
-
height = nil if height == ""
|
10
|
-
width = nil if width == ""
|
11
|
-
@height = (height || width).to_f
|
12
|
-
@width = (width || height).to_f
|
13
|
-
@modifier = modifier
|
14
|
-
end
|
15
|
-
|
16
|
-
# Uses ImageMagick to determing the dimensions of a file, passed in as either a
|
17
|
-
# File or path.
|
18
|
-
def self.from_file file
|
19
|
-
file = file.path if file.respond_to? "path"
|
20
|
-
parse(`#{Paperclip.path_for_command('identify')} "#{file}"`) ||
|
21
|
-
raise(Errno::ENOENT, file)
|
22
|
-
end
|
23
|
-
|
24
|
-
# Parses a "WxH" formatted string, where W is the width and H is the height.
|
25
|
-
def self.parse string
|
26
|
-
if match = (string && string.match(/\b(\d*)x(\d*)\b([\>\<\#\@\%^!])?/))
|
27
|
-
Geometry.new(*match[1,3])
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# True if the dimensions represent a square
|
32
|
-
def square?
|
33
|
-
height == width
|
34
|
-
end
|
35
|
-
|
36
|
-
# True if the dimensions represent a horizontal rectangle
|
37
|
-
def horizontal?
|
38
|
-
height < width
|
39
|
-
end
|
40
|
-
|
41
|
-
# True if the dimensions represent a vertical rectangle
|
42
|
-
def vertical?
|
43
|
-
height > width
|
44
|
-
end
|
45
|
-
|
46
|
-
# The aspect ratio of the dimensions.
|
47
|
-
def aspect
|
48
|
-
width / height
|
49
|
-
end
|
50
|
-
|
51
|
-
# Returns the larger of the two dimensions
|
52
|
-
def larger
|
53
|
-
[height, width].max
|
54
|
-
end
|
55
|
-
|
56
|
-
# Returns the smaller of the two dimensions
|
57
|
-
def smaller
|
58
|
-
[height, width].min
|
59
|
-
end
|
60
|
-
|
61
|
-
# Returns the width and height in a format suitable to be passed to Geometry.parse
|
62
|
-
def to_s
|
63
|
-
"%dx%d%s" % [width, height, modifier]
|
64
|
-
end
|
65
|
-
|
66
|
-
# Same as to_s
|
67
|
-
def inspect
|
68
|
-
to_s
|
69
|
-
end
|
70
|
-
|
71
|
-
# Returns the scaling and cropping geometries (in string-based ImageMagick format)
|
72
|
-
# neccessary to transform this Geometry into the Geometry given. If crop is true,
|
73
|
-
# then it is assumed the destination Geometry will be the exact final resolution.
|
74
|
-
# In this case, the source Geometry is scaled so that an image containing the
|
75
|
-
# destination Geometry would be completely filled by the source image, and any
|
76
|
-
# overhanging image would be cropped. Useful for square thumbnail images. The cropping
|
77
|
-
# is weighted at the center of the Geometry.
|
78
|
-
def transformation_to dst, crop = false
|
79
|
-
ratio = Geometry.new( dst.width / self.width, dst.height / self.height )
|
80
|
-
|
81
|
-
if crop
|
82
|
-
scale_geometry, scale = scaling(dst, ratio)
|
83
|
-
crop_geometry = cropping(dst, ratio, scale)
|
84
|
-
else
|
85
|
-
scale_geometry = dst.to_s
|
86
|
-
end
|
87
|
-
|
88
|
-
[ scale_geometry, crop_geometry ]
|
89
|
-
end
|
90
|
-
|
91
|
-
private
|
92
|
-
|
93
|
-
def scaling dst, ratio
|
94
|
-
if ratio.horizontal? || ratio.square?
|
95
|
-
[ "%dx" % dst.width, ratio.width ]
|
96
|
-
else
|
97
|
-
[ "x%d" % dst.height, ratio.height ]
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def cropping dst, ratio, scale
|
102
|
-
if ratio.horizontal? || ratio.square?
|
103
|
-
"%dx%d+%d+%d" % [ dst.width, dst.height, 0, (self.height * scale - dst.height) / 2 ]
|
104
|
-
else
|
105
|
-
"%dx%d+%d+%d" % [ dst.width, dst.height, (self.width * scale - dst.width) / 2, 0 ]
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# Provides method that can be included on File-type objects (IO, StringIO, Tempfile, etc) to allow stream copying
|
2
|
-
# and Tempfile conversion.
|
3
|
-
module IOStream
|
4
|
-
|
5
|
-
# Returns a Tempfile containing the contents of the readable object.
|
6
|
-
def to_tempfile
|
7
|
-
tempfile = Tempfile.new("stream")
|
8
|
-
tempfile.binmode
|
9
|
-
self.stream_to(tempfile)
|
10
|
-
end
|
11
|
-
|
12
|
-
# Copies one read-able object from one place to another in blocks, obviating the need to load
|
13
|
-
# the whole thing into memory. Defaults to 8k blocks. If this module is included in both
|
14
|
-
# both StringIO and Tempfile, then either can have its data copied anywhere else without typing
|
15
|
-
# worries or memory overhead worries. Returns a File if a String is passed in as the destination
|
16
|
-
# and returns the IO or Tempfile as passed in if one is sent as the destination.
|
17
|
-
def stream_to path_or_file, in_blocks_of = 8192
|
18
|
-
dstio = case path_or_file
|
19
|
-
when String then File.new(path_or_file, "wb+")
|
20
|
-
when IO then path_or_file
|
21
|
-
when Tempfile then path_or_file
|
22
|
-
end
|
23
|
-
buffer = ""
|
24
|
-
self.rewind
|
25
|
-
while self.read(in_blocks_of, buffer) do
|
26
|
-
dstio.write(buffer)
|
27
|
-
end
|
28
|
-
dstio.rewind
|
29
|
-
dstio
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class IO
|
34
|
-
include IOStream
|
35
|
-
end
|
36
|
-
|
37
|
-
%w( Tempfile StringIO ).each do |klass|
|
38
|
-
if Object.const_defined? klass
|
39
|
-
Object.const_get(klass).class_eval do
|
40
|
-
include IOStream
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
module Paperclip
|
2
|
-
# Handles thumbnailing images that are uploaded.
|
3
|
-
class Thumbnail
|
4
|
-
|
5
|
-
attr_accessor :file, :current_geometry, :target_geometry, :format, :whiny_thumbnails
|
6
|
-
|
7
|
-
# Creates a Thumbnail object set to work on the +file+ given. It
|
8
|
-
# will attempt to transform the image into one defined by +target_geometry+
|
9
|
-
# which is a "WxH"-style string. +format+ will be inferred from the +file+
|
10
|
-
# unless specified. Thumbnail creation will raise no errors unless
|
11
|
-
# +whiny_thumbnails+ is true (which it is, by default.
|
12
|
-
def initialize file, target_geometry, format = nil, whiny_thumbnails = true
|
13
|
-
@file = file
|
14
|
-
@crop = target_geometry[-1,1] == '#'
|
15
|
-
@target_geometry = Geometry.parse target_geometry
|
16
|
-
@current_geometry = Geometry.from_file file
|
17
|
-
@whiny_thumbnails = whiny_thumbnails
|
18
|
-
|
19
|
-
@current_format = File.extname(@file.path)
|
20
|
-
@basename = File.basename(@file.path, @current_format)
|
21
|
-
|
22
|
-
@format = format
|
23
|
-
end
|
24
|
-
|
25
|
-
# Creates a thumbnail, as specified in +initialize+, +make+s it, and returns the
|
26
|
-
# resulting Tempfile.
|
27
|
-
def self.make file, dimensions, format = nil, whiny_thumbnails = true
|
28
|
-
new(file, dimensions, format, whiny_thumbnails).make
|
29
|
-
end
|
30
|
-
|
31
|
-
# Returns true if the +target_geometry+ is meant to crop.
|
32
|
-
def crop?
|
33
|
-
@crop
|
34
|
-
end
|
35
|
-
|
36
|
-
# Performs the conversion of the +file+ into a thumbnail. Returns the Tempfile
|
37
|
-
# that contains the new image.
|
38
|
-
def make
|
39
|
-
src = @file
|
40
|
-
dst = Tempfile.new([@basename, @format].compact.join("."))
|
41
|
-
dst.binmode
|
42
|
-
|
43
|
-
command = <<-end_command
|
44
|
-
#{ Paperclip.path_for_command('convert') }
|
45
|
-
"#{ File.expand_path(src.path) }"
|
46
|
-
#{ transformation_command }
|
47
|
-
"#{ File.expand_path(dst.path) }"
|
48
|
-
end_command
|
49
|
-
success = system(command.gsub(/\s+/, " "))
|
50
|
-
|
51
|
-
if success && $?.exitstatus != 0 && @whiny_thumbnails
|
52
|
-
raise PaperclipError, "There was an error processing this thumbnail"
|
53
|
-
end
|
54
|
-
|
55
|
-
dst
|
56
|
-
end
|
57
|
-
|
58
|
-
# Returns the command ImageMagick's +convert+ needs to transform the image
|
59
|
-
# into the thumbnail.
|
60
|
-
def transformation_command
|
61
|
-
scale, crop = @current_geometry.transformation_to(@target_geometry, crop?)
|
62
|
-
trans = "-scale \"#{scale}\""
|
63
|
-
trans << " -crop \"#{crop}\" +repage" if crop
|
64
|
-
trans
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Due to how ImageMagick handles its image format conversion and how Tempfile
|
69
|
-
# handles its naming scheme, it is necessary to override how Tempfile makes
|
70
|
-
# its names so as to allow for file extensions. Idea taken from the comments
|
71
|
-
# on this blog post:
|
72
|
-
# http://marsorange.com/archives/of-mogrify-ruby-tempfile-dynamic-class-definitions
|
73
|
-
class Tempfile < ::Tempfile
|
74
|
-
# Replaces Tempfile's +make_tmpname+ with one that honors file extensions.
|
75
|
-
def make_tmpname(basename, n)
|
76
|
-
extension = File.extname(basename)
|
77
|
-
sprintf("%s,%d,%d%s", File.basename(basename, extension), $$, n, extension)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Paperclip
|
2
|
-
# The Upfile module is a convenience module for adding uploaded-file-type methods
|
3
|
-
# to the +File+ class. Useful for testing.
|
4
|
-
# user.avatar = File.new("test/test_avatar.jpg")
|
5
|
-
module Upfile
|
6
|
-
|
7
|
-
# Infer the MIME-type of the file from the extension.
|
8
|
-
def content_type
|
9
|
-
type = self.path.match(/\.(\w+)$/)[1] rescue "octet-stream"
|
10
|
-
case type
|
11
|
-
when "jpg", "png", "gif" then "image/#{type}"
|
12
|
-
when "txt", "csv", "xml", "html", "htm", "css", "js" then "text/#{type}"
|
13
|
-
else "x-application/#{type}"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# Returns the file's normal name.
|
18
|
-
def original_filename
|
19
|
-
File.basename(self.path)
|
20
|
-
end
|
21
|
-
|
22
|
-
# Returns the size of the file.
|
23
|
-
def size
|
24
|
-
File.size(self)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
class File #:nodoc:
|
31
|
-
include Paperclip::Upfile
|
32
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'environment'
|
2
|
-
|
3
|
-
def obtain_class
|
4
|
-
class_name = ENV['CLASS'] || ENV['class']
|
5
|
-
@klass = Object.const_get(class_name)
|
6
|
-
end
|
7
|
-
|
8
|
-
def obtain_attachments
|
9
|
-
name = ENV['ATTACHMENT'] || ENV['attachment']
|
10
|
-
if !name.blank? && @klass.attachment_names.include?(name)
|
11
|
-
[ name ]
|
12
|
-
else
|
13
|
-
@klass.attachment_definitions.keys
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
namespace :paperclip do
|
18
|
-
desc "Regenerates thumbnails for a given CLASS (and optional ATTACHMENT)"
|
19
|
-
task :refresh do
|
20
|
-
klass = obtain_class
|
21
|
-
instances = klass.find(:all)
|
22
|
-
names = obtain_attachments
|
23
|
-
|
24
|
-
puts "Regenerating thumbnails for #{instances.length} instances of #{klass.name}:"
|
25
|
-
instances.each do |instance|
|
26
|
-
names.each do |name|
|
27
|
-
result = if instance.send("#{ name }?")
|
28
|
-
instance.send(name).send("post_process")
|
29
|
-
instance.send(name).save
|
30
|
-
else
|
31
|
-
true
|
32
|
-
end
|
33
|
-
print result ? "." : "x"; $stdout.flush
|
34
|
-
end
|
35
|
-
end
|
36
|
-
puts " Done."
|
37
|
-
end
|
38
|
-
end
|
Binary file
|
Binary file
|
@@ -1 +0,0 @@
|
|
1
|
-
This is not an image.
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'test/unit'
|
3
|
-
require 'shoulda'
|
4
|
-
require 'mocha'
|
5
|
-
require 'tempfile'
|
6
|
-
|
7
|
-
require 'active_record'
|
8
|
-
require 'ruby-debug'
|
9
|
-
|
10
|
-
ROOT = File.join(File.dirname(__FILE__), '..')
|
11
|
-
RAILS_ROOT = ROOT
|
12
|
-
|
13
|
-
$LOAD_PATH << File.join(ROOT, 'lib')
|
14
|
-
$LOAD_PATH << File.join(ROOT, 'lib', 'paperclip')
|
15
|
-
|
16
|
-
require File.join(ROOT, 'lib', 'paperclip.rb')
|
17
|
-
|
18
|
-
FIXTURES_DIR = File.join(File.dirname(__FILE__), "fixtures")
|
19
|
-
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
20
|
-
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
21
|
-
ActiveRecord::Base.establish_connection(config[ENV['RAILS_ENV'] || 'test'])
|
22
|
-
|
23
|
-
def rebuild_model options = {}
|
24
|
-
ActiveRecord::Base.connection.create_table :dummies, :force => true do |table|
|
25
|
-
table.column :other, :string
|
26
|
-
table.column :avatar_file_name, :string
|
27
|
-
table.column :avatar_content_type, :string
|
28
|
-
table.column :avatar_file_size, :integer
|
29
|
-
end
|
30
|
-
|
31
|
-
ActiveRecord::Base.send(:include, Paperclip)
|
32
|
-
Object.send(:remove_const, "Dummy") rescue nil
|
33
|
-
Object.const_set("Dummy", Class.new(ActiveRecord::Base))
|
34
|
-
Dummy.class_eval do
|
35
|
-
include Paperclip
|
36
|
-
has_attached_file :avatar, options
|
37
|
-
end
|
38
|
-
end
|
@@ -1,99 +0,0 @@
|
|
1
|
-
require 'test/helper'
|
2
|
-
|
3
|
-
class Dummy
|
4
|
-
# This is a dummy class
|
5
|
-
end
|
6
|
-
|
7
|
-
class AttachmentTest < Test::Unit::TestCase
|
8
|
-
context "An attachment" do
|
9
|
-
setup do
|
10
|
-
@default_options = {
|
11
|
-
:path => ":rails_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
|
12
|
-
}
|
13
|
-
@instance = stub
|
14
|
-
@instance.stubs(:id).returns(41)
|
15
|
-
@instance.stubs(:class).returns(Dummy)
|
16
|
-
@instance.stubs(:[]).with(:test_file_name).returns("5k.png")
|
17
|
-
@instance.stubs(:[]).with(:test_content_type).returns("image/png")
|
18
|
-
@instance.stubs(:[]).with(:test_file_size).returns(12345)
|
19
|
-
@attachment = Paperclip::Attachment.new(:test, @instance, @default_options)
|
20
|
-
@file = File.new(File.join(File.dirname(__FILE__), "fixtures", "5k.png"))
|
21
|
-
end
|
22
|
-
|
23
|
-
should "return its default_url when no file assigned" do
|
24
|
-
assert @attachment.file.nil?
|
25
|
-
assert_equal "/tests/original/missing.png", @attachment.url
|
26
|
-
assert_equal "/tests/blah/missing.png", @attachment.url(:blah)
|
27
|
-
end
|
28
|
-
|
29
|
-
context "when expecting three styles" do
|
30
|
-
setup do
|
31
|
-
@attachment = Paperclip::Attachment.new(:test, @instance, @default_options.merge({
|
32
|
-
:styles => { :large => ["400x400", :png],
|
33
|
-
:medium => ["100x100", :gif],
|
34
|
-
:small => ["32x32#", :jpg]}
|
35
|
-
}))
|
36
|
-
end
|
37
|
-
|
38
|
-
context "and assigned a file" do
|
39
|
-
setup do
|
40
|
-
@instance.expects(:[]=).with(:test_file_name, File.basename(@file.path))
|
41
|
-
@instance.expects(:[]=).with(:test_content_type, "image/png")
|
42
|
-
@instance.expects(:[]=).with(:test_file_size, @file.size)
|
43
|
-
@instance.expects(:[]=).with(:test_file_name, nil)
|
44
|
-
@instance.expects(:[]=).with(:test_content_type, nil)
|
45
|
-
@instance.expects(:[]=).with(:test_file_size, nil)
|
46
|
-
@attachment.assign(@file)
|
47
|
-
end
|
48
|
-
|
49
|
-
should "return the real url" do
|
50
|
-
assert @attachment.file
|
51
|
-
assert_equal "/tests/41/original/5k.png", @attachment.url
|
52
|
-
assert_equal "/tests/41/blah/5k.png", @attachment.url(:blah)
|
53
|
-
end
|
54
|
-
|
55
|
-
should "be dirty" do
|
56
|
-
assert @attachment.dirty?
|
57
|
-
end
|
58
|
-
|
59
|
-
should "have its image and attachments as tempfiles" do
|
60
|
-
[nil, :large, :medium, :small].each do |style|
|
61
|
-
assert File.exists?(@attachment.to_io(style))
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context "and saved" do
|
66
|
-
setup do
|
67
|
-
@attachment.save
|
68
|
-
end
|
69
|
-
|
70
|
-
should "commit the files to disk" do
|
71
|
-
[nil, :large, :medium, :small].each do |style|
|
72
|
-
io = @attachment.to_io(style)
|
73
|
-
assert File.exists?(io)
|
74
|
-
assert ! io.is_a?(::Tempfile)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
should "save the files as the right formats and sizes" do
|
79
|
-
[[:large, 400, 61, "PNG"], [:medium, 100, 15, "GIF"], [:small, 32, 32, "JPEG"]].each do |style|
|
80
|
-
out = `identify -format "%w %h %b %m" #{@attachment.to_io(style.first).path}`
|
81
|
-
width, height, size, format = out.split(" ")
|
82
|
-
assert_equal style[1].to_s, width.to_s
|
83
|
-
assert_equal style[2].to_s, height.to_s
|
84
|
-
assert_equal style[3].to_s, format.to_s
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
should "have #file be equal #to_io(:original)" do
|
89
|
-
assert @attachment.file == @attachment.to_io(:original)
|
90
|
-
end
|
91
|
-
|
92
|
-
should "still have its #file attribute not be nil" do
|
93
|
-
assert ! @attachment.file.nil?
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|