From c6eff5a5b03b49466d0d820c17df3697ad410f44 Mon Sep 17 00:00:00 2001 From: Igor Galeta Date: Tue, 23 Aug 2011 12:57:25 +0300 Subject: [PATCH] Mongoid and carrierwave support --- .gitignore | 1 + README.rdoc | 1 + Rakefile | 7 ++ lib/ckeditor.rb | 5 ++ lib/ckeditor/backend/carrierwave.rb | 64 +++++++++++++++++++ lib/ckeditor/backend/paperclip.rb | 53 +++++++++++++++ lib/ckeditor/orm/base.rb | 30 +-------- lib/ckeditor/orm/mongoid.rb | 5 ++ .../carrierwave/ckeditor/attachment_file.rb | 2 +- .../carrierwave/ckeditor/picture.rb | 2 +- .../active_record/carrierwave/migration.rb | 8 ++- .../active_record/paperclip/ckeditor/asset.rb | 8 +-- .../ckeditor_attachment_file_uploader.rb | 2 + .../uploaders/ckeditor_picture_uploader.rb | 4 ++ .../carrierwave/ckeditor/attachment_file.rb | 2 +- .../mongoid/carrierwave/ckeditor/picture.rb | 2 +- .../mongoid/paperclip/ckeditor/asset.rb | 8 +-- .../20110705195648_create_ckeditor_assets.rb | 5 +- test/models/attachment_file_test.rb | 16 +++++ test/models/picture_test.rb | 16 +++++ test/support/helpers.rb | 30 +++++++++ 21 files changed, 219 insertions(+), 52 deletions(-) create mode 100644 lib/ckeditor/backend/carrierwave.rb create mode 100644 lib/ckeditor/backend/paperclip.rb create mode 100644 test/models/attachment_file_test.rb create mode 100644 test/models/picture_test.rb create mode 100644 test/support/helpers.rb diff --git a/.gitignore b/.gitignore index e06e15dfa..f07245d02 100644 --- a/.gitignore +++ b/.gitignore @@ -7,5 +7,6 @@ test/dummy/log/*.log test/dummy/public/ckeditor_assets/ test/dummy/tmp/ test/tmp +test/dummy/public/uploads/* *.swp diff --git a/README.rdoc b/README.rdoc index 938136614..cd027f8bd 100644 --- a/README.rdoc +++ b/README.rdoc @@ -194,5 +194,6 @@ By default, both these methods call "ckeditor_filebrowser_scope" method: rake test rake test CKEDITOR_ORM=mongoid + rake test CKEDITOR_BACKEND=carrierwave This project rocks and uses MIT-LICENSE. diff --git a/Rakefile b/Rakefile index a38746fb5..28f9a9adc 100644 --- a/Rakefile +++ b/Rakefile @@ -39,6 +39,13 @@ Rake::TestTask.new("test:integration") do |t| t.verbose = false end +Rake::TestTask.new("test:models") do |t| + t.libs << 'lib' + t.libs << 'test' + t.pattern = 'test/models/*_test.rb' + t.verbose = false +end + task :default => :test RDoc::Task.new do |rdoc| diff --git a/lib/ckeditor.rb b/lib/ckeditor.rb index e8d1e0eb8..1cccc3d7d 100644 --- a/lib/ckeditor.rb +++ b/lib/ckeditor.rb @@ -18,6 +18,11 @@ module Hooks autoload :SimpleFormBuilder, 'ckeditor/hooks/simple_form' end + module Backend + autoload :Paperclip, 'ckeditor/backend/paperclip' + autoload :CarrierWave, 'ckeditor/backend/carrierwave' + end + # Allowed image file types for upload. # Set to nil or [] (empty array) for all file types mattr_accessor :image_file_types diff --git a/lib/ckeditor/backend/carrierwave.rb b/lib/ckeditor/backend/carrierwave.rb new file mode 100644 index 000000000..960d67c36 --- /dev/null +++ b/lib/ckeditor/backend/carrierwave.rb @@ -0,0 +1,64 @@ +require 'mime/types' +require 'mini_magick' + +module Ckeditor + module Backend + module CarrierWave + def self.included(base) + base.send(:include, InstanceMethods) + base.send(:extend, ClassMethods) + end + + module ClassMethods + def self.extended(base) + base.class_eval do + process :extract_content_type + process :set_size + end + end + end + + module InstanceMethods + # process :strip + def strip + manipulate! do |img| + img.strip + img = yield(img) if block_given? + img + end + end + + # process :quality => 85 + def quality(percentage) + manipulate! do |img| + img.quality(percentage) + img = yield(img) if block_given? + img + end + end + + def extract_content_type + if file.content_type == 'application/octet-stream' || file.content_type.blank? + content_type = MIME::Types.type_for(original_filename).first + else + content_type = file.content_type + end + + model.data_content_type = content_type.to_s + end + + def set_size + model.data_file_size = file.size + end + + def read_dimensions + if model.image? && model.has_dimensions? + magick = ::MiniMagick::Image.new(current_path) + model.width, model.height = magick[:width], magick[:height] + end + end + + end + end + end +end diff --git a/lib/ckeditor/backend/paperclip.rb b/lib/ckeditor/backend/paperclip.rb new file mode 100644 index 000000000..e56927dea --- /dev/null +++ b/lib/ckeditor/backend/paperclip.rb @@ -0,0 +1,53 @@ +require 'mime/types' + +module Ckeditor + module Backend + module Paperclip + def self.included(base) + base.send(:include, InstanceMethods) + base.send(:extend, ClassMethods) + end + + module ClassMethods + def self.extended(base) + base.class_eval do + before_validation :extract_content_type + before_create :read_dimensions, :parameterize_filename + + delegate :url, :path, :styles, :size, :content_type, :to => :data + end + end + end + + module InstanceMethods + def geometry + @geometry ||= ::Paperclip::Geometry.from_file(data.to_file) + end + + protected + + def parameterize_filename + unless data_file_name.blank? + filename = Ckeditor::Utils.parameterize_filename(data_file_name) + self.data.instance_write(:file_name, filename) + end + end + + def read_dimensions + if image? && has_dimensions? + self.width = geometry.width + self.height = geometry.height + end + end + + # Extract content_type from filename using mime/types gem + def extract_content_type + if data_content_type == "application/octet-stream" && !data_file_name.blank? + content_types = MIME::Types.type_for(data_file_name) + self.data_content_type = content_types.first.to_s unless content_types.empty? + end + end + end + end + end +end diff --git a/lib/ckeditor/orm/base.rb b/lib/ckeditor/orm/base.rb index 872f0857f..075e7671c 100644 --- a/lib/ckeditor/orm/base.rb +++ b/lib/ckeditor/orm/base.rb @@ -14,13 +14,9 @@ def has_dimensions? def image? Ckeditor::IMAGE_TYPES.include?(data_content_type) end - - def geometry - @geometry ||= Paperclip::Geometry.from_file(data.to_file) - end def format_created_at - I18n.l(created_at, :format => "%d.%m.%Y") + self.created_at.strftime("%d.%m.%Y") end def url_content @@ -43,30 +39,6 @@ def as_json(options = nil) super options end - - protected - - def parameterize_filename - unless data_file_name.blank? - filename = Ckeditor::Utils.parameterize_filename(data_file_name) - self.data.instance_write(:file_name, filename) - end - end - - def read_dimensions - if image? && has_dimensions? - self.width = geometry.width - self.height = geometry.height - end - end - - # Extract content_type from filename using mime/types gem - def extract_content_type - if data_content_type == "application/octet-stream" && !data_file_name.blank? - content_types = MIME::Types.type_for(data_file_name) - self.data_content_type = content_types.first.to_s unless content_types.empty? - end - end end end end diff --git a/lib/ckeditor/orm/mongoid.rb b/lib/ckeditor/orm/mongoid.rb index e4ad77f84..2bbcf3103 100644 --- a/lib/ckeditor/orm/mongoid.rb +++ b/lib/ckeditor/orm/mongoid.rb @@ -26,6 +26,11 @@ def as_json_methods module ClassMethods def self.extended(base) base.class_eval do + field :data_content_type, :type => String + field :data_file_size, :type => Integer + field :width, :type => Integer + field :height, :type => Integer + belongs_to :assetable, :polymorphic => true attr_accessible :data, :assetable_type, :assetable_id, :assetable diff --git a/lib/generators/ckeditor/templates/models/active_record/carrierwave/ckeditor/attachment_file.rb b/lib/generators/ckeditor/templates/models/active_record/carrierwave/ckeditor/attachment_file.rb index d3e87e046..04801d954 100644 --- a/lib/generators/ckeditor/templates/models/active_record/carrierwave/ckeditor/attachment_file.rb +++ b/lib/generators/ckeditor/templates/models/active_record/carrierwave/ckeditor/attachment_file.rb @@ -1,5 +1,5 @@ class Ckeditor::AttachmentFile < Ckeditor::Asset - mount_uploader :data, CkeditorAttachmentFileUploader + mount_uploader :data, CkeditorAttachmentFileUploader, :mount_on => :data_file_name def url_thumb @url_thumb ||= begin diff --git a/lib/generators/ckeditor/templates/models/active_record/carrierwave/ckeditor/picture.rb b/lib/generators/ckeditor/templates/models/active_record/carrierwave/ckeditor/picture.rb index d23c1f900..cf9c52522 100644 --- a/lib/generators/ckeditor/templates/models/active_record/carrierwave/ckeditor/picture.rb +++ b/lib/generators/ckeditor/templates/models/active_record/carrierwave/ckeditor/picture.rb @@ -1,5 +1,5 @@ class Ckeditor::Picture < Ckeditor::Asset - mount_uploader :data, CkeditorPictureUploader + mount_uploader :data, CkeditorPictureUploader, :mount_on => :data_file_name def url_content url(:content) diff --git a/lib/generators/ckeditor/templates/models/active_record/carrierwave/migration.rb b/lib/generators/ckeditor/templates/models/active_record/carrierwave/migration.rb index c52e938f7..9ad4c15a2 100644 --- a/lib/generators/ckeditor/templates/models/active_record/carrierwave/migration.rb +++ b/lib/generators/ckeditor/templates/models/active_record/carrierwave/migration.rb @@ -1,12 +1,18 @@ class CreateCkeditorAssets < ActiveRecord::Migration def self.up create_table :ckeditor_assets do |t| - t.string :data, :null => false + t.string :data_file_name, :null => false + t.string :data_content_type + t.integer :data_file_size t.integer :assetable_id t.string :assetable_type, :limit => 30 t.string :type, :limit => 30 + # Uncomment it to save images dimensions, if your need it +# t.integer :width +# t.integer :height + t.timestamps end diff --git a/lib/generators/ckeditor/templates/models/active_record/paperclip/ckeditor/asset.rb b/lib/generators/ckeditor/templates/models/active_record/paperclip/ckeditor/asset.rb index be16f9436..cf636ed19 100644 --- a/lib/generators/ckeditor/templates/models/active_record/paperclip/ckeditor/asset.rb +++ b/lib/generators/ckeditor/templates/models/active_record/paperclip/ckeditor/asset.rb @@ -1,10 +1,4 @@ -require 'mime/types' - class Ckeditor::Asset < ActiveRecord::Base include Ckeditor::Orm::ActiveRecord::AssetBase - - before_validation :extract_content_type - before_create :read_dimensions, :parameterize_filename - - delegate :url, :path, :styles, :size, :content_type, :to => :data + include Ckeditor::Backend::Paperclip end diff --git a/lib/generators/ckeditor/templates/models/base/carrierwave/uploaders/ckeditor_attachment_file_uploader.rb b/lib/generators/ckeditor/templates/models/base/carrierwave/uploaders/ckeditor_attachment_file_uploader.rb index 7f1ff6774..d8eda3ab3 100644 --- a/lib/generators/ckeditor/templates/models/base/carrierwave/uploaders/ckeditor_attachment_file_uploader.rb +++ b/lib/generators/ckeditor/templates/models/base/carrierwave/uploaders/ckeditor_attachment_file_uploader.rb @@ -1,5 +1,7 @@ # encoding: utf-8 class CkeditorAttachmentFileUploader < CarrierWave::Uploader::Base + include Ckeditor::Backend::CarrierWave + # Include RMagick or ImageScience support: # include CarrierWave::RMagick # include CarrierWave::MiniMagick diff --git a/lib/generators/ckeditor/templates/models/base/carrierwave/uploaders/ckeditor_picture_uploader.rb b/lib/generators/ckeditor/templates/models/base/carrierwave/uploaders/ckeditor_picture_uploader.rb index b2a745f82..2d2ea5677 100644 --- a/lib/generators/ckeditor/templates/models/base/carrierwave/uploaders/ckeditor_picture_uploader.rb +++ b/lib/generators/ckeditor/templates/models/base/carrierwave/uploaders/ckeditor_picture_uploader.rb @@ -1,5 +1,7 @@ # encoding: utf-8 class CkeditorPictureUploader < CarrierWave::Uploader::Base + include Ckeditor::Backend::CarrierWave + # Include RMagick or ImageScience support: # include CarrierWave::RMagick include CarrierWave::MiniMagick @@ -25,6 +27,8 @@ def store_dir # def scale(width, height) # # do something # end + + process :read_dimensions # Create different versions of your uploaded files: version :thumb do diff --git a/lib/generators/ckeditor/templates/models/mongoid/carrierwave/ckeditor/attachment_file.rb b/lib/generators/ckeditor/templates/models/mongoid/carrierwave/ckeditor/attachment_file.rb index d3e87e046..04801d954 100644 --- a/lib/generators/ckeditor/templates/models/mongoid/carrierwave/ckeditor/attachment_file.rb +++ b/lib/generators/ckeditor/templates/models/mongoid/carrierwave/ckeditor/attachment_file.rb @@ -1,5 +1,5 @@ class Ckeditor::AttachmentFile < Ckeditor::Asset - mount_uploader :data, CkeditorAttachmentFileUploader + mount_uploader :data, CkeditorAttachmentFileUploader, :mount_on => :data_file_name def url_thumb @url_thumb ||= begin diff --git a/lib/generators/ckeditor/templates/models/mongoid/carrierwave/ckeditor/picture.rb b/lib/generators/ckeditor/templates/models/mongoid/carrierwave/ckeditor/picture.rb index d23c1f900..cf9c52522 100644 --- a/lib/generators/ckeditor/templates/models/mongoid/carrierwave/ckeditor/picture.rb +++ b/lib/generators/ckeditor/templates/models/mongoid/carrierwave/ckeditor/picture.rb @@ -1,5 +1,5 @@ class Ckeditor::Picture < Ckeditor::Asset - mount_uploader :data, CkeditorPictureUploader + mount_uploader :data, CkeditorPictureUploader, :mount_on => :data_file_name def url_content url(:content) diff --git a/lib/generators/ckeditor/templates/models/mongoid/paperclip/ckeditor/asset.rb b/lib/generators/ckeditor/templates/models/mongoid/paperclip/ckeditor/asset.rb index 52333c2df..27965c878 100644 --- a/lib/generators/ckeditor/templates/models/mongoid/paperclip/ckeditor/asset.rb +++ b/lib/generators/ckeditor/templates/models/mongoid/paperclip/ckeditor/asset.rb @@ -1,11 +1,5 @@ -require 'mime/types' - class Ckeditor::Asset include Ckeditor::Orm::Mongoid::AssetBase include Mongoid::Paperclip - - before_validation :extract_content_type - before_create :read_dimensions, :parameterize_filename - - delegate :url, :path, :styles, :size, :content_type, :to => :data + include Ckeditor::Backend::Paperclip end diff --git a/test/dummy/db/migrate/20110705195648_create_ckeditor_assets.rb b/test/dummy/db/migrate/20110705195648_create_ckeditor_assets.rb index fb7cc91e3..8158506fd 100644 --- a/test/dummy/db/migrate/20110705195648_create_ckeditor_assets.rb +++ b/test/dummy/db/migrate/20110705195648_create_ckeditor_assets.rb @@ -1,13 +1,10 @@ class CreateCkeditorAssets < ActiveRecord::Migration def self.up create_table :ckeditor_assets do |t| - t.string :data_file_name + t.string :data_file_name, :null => false t.string :data_content_type t.integer :data_file_size - # it's for carrierwave upload support - t.string :data - t.integer :assetable_id t.string :assetable_type, :limit => 30 t.string :type, :limit => 30 diff --git a/test/models/attachment_file_test.rb b/test/models/attachment_file_test.rb new file mode 100644 index 000000000..1950a112e --- /dev/null +++ b/test/models/attachment_file_test.rb @@ -0,0 +1,16 @@ +require 'test_helper' + +class AttachmentFileTest < ActiveSupport::TestCase + test "Set file content_type and size" do + @attachemnt = create_attachemnt + + assert_equal @attachemnt.data_content_type, "application/x-gzip" + # TODO: fix filename parameterization + if CKEDITOR_BACKEND == :paperclip + assert_equal @attachemnt.data_file_name, "rails_tar.gz" + else + assert_equal @attachemnt.data_file_name, "rails.tar.gz" + end + assert_equal @attachemnt.data_file_size, 6823 + end +end diff --git a/test/models/picture_test.rb b/test/models/picture_test.rb new file mode 100644 index 000000000..e93f8522e --- /dev/null +++ b/test/models/picture_test.rb @@ -0,0 +1,16 @@ +require 'test_helper' + +class PictureTest < ActiveSupport::TestCase + test "Set file content_type and size" do + @picture = create_picture + + assert_equal @picture.data_content_type, "image/png" + assert_equal @picture.data_file_name, "rails.png" + assert_equal @picture.data_file_size, 6646 + + if @picture.has_dimensions? + assert_equal @picture.width, 50 + assert_equal @picture.height, 64 + end + end +end diff --git a/test/support/helpers.rb b/test/support/helpers.rb new file mode 100644 index 000000000..eed3a0951 --- /dev/null +++ b/test/support/helpers.rb @@ -0,0 +1,30 @@ +require 'active_support/test_case' +require 'action_dispatch/testing/test_process' + +class ActiveSupport::TestCase + include ActionDispatch::TestProcess + + def new_attachemnt(data = nil) + data ||= fixture_file_upload('files/rails.tar.gz', 'application/x-gzip') + + Ckeditor::AttachmentFile.new(:data => data) + end + + def create_attachemnt(data = nil) + attachemnt = new_attachemnt(data) + attachemnt.save! + attachemnt + end + + def new_picture(data = nil) + data ||= fixture_file_upload('files/rails.png', 'image/png') + + Ckeditor::Picture.new(:data => data) + end + + def create_picture(data = nil) + picture = new_picture(data) + picture.save! + picture + end +end