From d5ddc762b730aa8b2034043200de2925752ec3d5 Mon Sep 17 00:00:00 2001 From: Daniela Soares Feitosa Date: Thu, 2 Sep 2010 15:44:51 -0300 Subject: [PATCH] Added libs to create thumbnails in background --- config/initializers/delayed_attachment_fu.rb | 1 + lib/create_thumbnails_job.rb | 6 ++++++ lib/delayed_attachment_fu.rb | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ test/unit/create_thumbnails_job_test.rb | 27 +++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 0 deletions(-) create mode 100644 config/initializers/delayed_attachment_fu.rb create mode 100644 lib/create_thumbnails_job.rb create mode 100644 lib/delayed_attachment_fu.rb create mode 100644 test/unit/create_thumbnails_job_test.rb diff --git a/config/initializers/delayed_attachment_fu.rb b/config/initializers/delayed_attachment_fu.rb new file mode 100644 index 0000000..650338a --- /dev/null +++ b/config/initializers/delayed_attachment_fu.rb @@ -0,0 +1 @@ +require 'delayed_attachment_fu' diff --git a/lib/create_thumbnails_job.rb b/lib/create_thumbnails_job.rb new file mode 100644 index 0000000..bbe99db --- /dev/null +++ b/lib/create_thumbnails_job.rb @@ -0,0 +1,6 @@ +class CreateThumbnailsJob < Struct.new(:class_name, :file_id) + def perform + file = class_name.constantize.find(file_id) + file.create_thumbnails + end +end diff --git a/lib/delayed_attachment_fu.rb b/lib/delayed_attachment_fu.rb new file mode 100644 index 0000000..5193245 --- /dev/null +++ b/lib/delayed_attachment_fu.rb @@ -0,0 +1,53 @@ +module DelayedAttachmentFu + + module ClassMethods + def delay_attachment_fu_thumbnails + include DelayedAttachmentFu::InstanceMethods + after_create do |file| + if file.image? + Delayed::Job.enqueue CreateThumbnailsJob.new(file.class.name, file.id) + end + end + end + end + + module InstanceMethods + # skip processing with RMagick + def process_attachment + end + + def after_process_attachment + save_to_storage + @temp_paths.clear + @saved_attachment = nil + callback :after_attachment_saved + end + + def create_thumbnails + if thumbnailable? + self.class.with_image(full_filename) do |img| + self.width = img.columns + self.height = img.rows + self.save! + end + self.class.attachment_options[:thumbnails].each do |suffix, size| + self.create_or_update_thumbnail(self.full_filename, suffix, size) + end + self.update_attributes!(:thumbnails_processed => true) + end + end + + def public_filename(size=nil) + if self.thumbnails_processed + super(size) + else + size ||= 'thumb' + '/images/icons-app/image-loading-%s.png' % size + end + end + + + end +end + +ActiveRecord::Base.send(:extend, DelayedAttachmentFu::ClassMethods) diff --git a/test/unit/create_thumbnails_job_test.rb b/test/unit/create_thumbnails_job_test.rb new file mode 100644 index 0000000..8842222 --- /dev/null +++ b/test/unit/create_thumbnails_job_test.rb @@ -0,0 +1,27 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class CreateThumbnailsJobTest < ActiveSupport::TestCase + + should 'create thumbnails to uploaded files' do + person = create_user('test_user').person + file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => person) + + assert_equal [], file.thumbnails + job = CreateThumbnailsJob.new(file.class.name, file.id) + job.perform + file.reload + assert_not_equal [], file.thumbnails + end + + should 'set thumbnails_processed to true after finished' do + person = create_user('test_user').person + file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => person) + + job = CreateThumbnailsJob.new(file.class.name, file.id) + job.perform + + file.reload + assert file.thumbnails_processed + end + +end -- libgit2 0.21.2