Skip to content

Commit

Permalink
Initial commit, draft
Browse files Browse the repository at this point in the history
  • Loading branch information
Victor Sokolov committed Aug 15, 2011
0 parents commit b837d4c
Show file tree
Hide file tree
Showing 18 changed files with 399 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*.gem
.bundle
Gemfile.lock
pkg/*
tmp/*
4 changes: 4 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
source "http://rubygems.org"

# Specify your gem's dependencies in carrierwave-meta.gemspec
gemspec
5 changes: 5 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
require 'bundler/gem_tasks'
require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new(:spec)
task :default => :spec
27 changes: 27 additions & 0 deletions carrierwave-meta.gemspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "carrierwave-meta/version"

Gem::Specification.new do |s|
s.name = "carrierwave-meta"
s.version = Carrierwave::Meta::VERSION
s.authors = ["Victor Sokolov"]
s.email = ["gzigzigzi@gmail.com"]
s.homepage = "http://github.com/gzigzigzeo/carrierwave-meta"
s.summary = %q{}
s.description = %q{}

s.rubyforge_project = "carrierwave-meta"

s.files = `git ls-files`.split("\n")
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
s.require_paths = ["lib"]

s.add_dependency(%q<carrierwave>, [">= 0.5.7"])
s.add_dependency(%q<activesupport>, [">= 3.0"])
s.add_development_dependency(%q<rspec-rails>, ">= 2.6")
s.add_development_dependency(%q<sqlite3-ruby>)
s.add_development_dependency(%q<rmagick>)
s.add_development_dependency(%q<mime-types>)
end
4 changes: 4 additions & 0 deletions lib/carrierwave-meta.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
require 'active_support/concern'
require "carrierwave-meta/version"
require 'carrierwave-meta/model_delegate_attribute'
require 'carrierwave-meta/store_meta'
43 changes: 43 additions & 0 deletions lib/carrierwave-meta/model_delegate_attribute.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
module CarrierWave
module ModelDelegateAttribute
extend ::ActiveSupport::Concern

module ClassMethods
def model_delegate_attribute(attribute, default = nil)
attr_accessor attribute

before :remove, :"reset_#{attribute}"

var_name = :"@#{attribute}"

define_method :"#{attribute}" do
model_accessor = model_getter_name(attribute)
value = instance_variable_get(var_name)
value ||= self.model.send(model_accessor) if self.model.present? && self.model.respond_to?(model_accessor)
value ||= default
instance_variable_set(var_name, value)
end

define_method :"#{attribute}=" do |value|
model_accessor = model_getter_name(attribute)
instance_variable_set(var_name, value)
if self.model.present? && self.model.respond_to?(:"#{model_accessor}=") && !self.model.destroyed?
self.model.send(:"#{model_accessor}=", value)
end
end

define_method :"reset_#{attribute}" do
self.send(:"#{attribute}=", default)
send(:"#{attribute}=", default)
end
end
end

module InstanceMethods
private
def model_getter_name(attribute)
version_name.present? ? "#{version_name}_#{attribute}" : attribute
end
end
end
end
53 changes: 53 additions & 0 deletions lib/carrierwave-meta/store_meta.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
module CarrierWave
module Meta
extend ActiveSupport::Concern

included do
include CarrierWave::ModelDelegateAttribute

after :retrieve_from_cache, :store_meta

model_delegate_attribute :content_type, ''
model_delegate_attribute :file_size, 0
model_delegate_attribute :image_size, []
model_delegate_attribute :width, 0
model_delegate_attribute :height, 0
end

module InstanceMethods
def store_meta(file = nil)
puts 'before'
if self.file.present?
puts 'in'
dimensions = get_dimensions
width, height = dimensions
puts dimensions.inspect
puts self.file.inspect
self.content_type = self.file.content_type
self.file_size = self.file.size
self.image_size = dimensions
self.width = width
self.height = height
end
end

private
def get_dimensions
[].tap do |size|
puts 'started'
if self.file.content_type =~ /image/
manipulate! do |img|
if img.is_a?(::Magick::Image)
size << img.columns
size << img.rows
else
raise "Only RMagick is supported yet. Fork and update it."
end
img
end
end
end
end
end
end
end
5 changes: 5 additions & 0 deletions lib/carrierwave-meta/version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module Carrierwave
module Meta
VERSION = "0.0.1"
end
end
Binary file added spec/fixtures/big.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added spec/fixtures/big.zip
Binary file not shown.
Binary file added spec/fixtures/small.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
69 changes: 69 additions & 0 deletions spec/modules/model_delegate_attribute_pec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
require 'spec_helper'

describe TestDelegateUploader do
let(:values) { subject.class::VALUES }
let(:default_values) { subject.class::DEFAULT_VALUES }
let(:file) { File.open("spec/fixtures/big.jpg") }
let(:obj) { TestModel.new }

before do
obj.destroyed = false
end

def uploader_values_are_correct(uploader)
uploader.x.should eq(values[:x])
uploader.dimensions.should eq(values[:dimensions])
uploader.version.x.should eq(values[:version_x])
uploader.version.dimensions.should eq(values[:version_dimensions])
end

def obj_values_are_correct(obj)
obj.x.should eq(values[:x])
obj.dimensions.should eq(values[:dimensions])
obj.version_x.should eq(values[:version_x])
obj.version_dimensions.should eq(values[:version_dimensions])
end

def uploader_values_are_default(obj)
obj.x.should eq(default_values[:x])
obj.dimensions.should eq(default_values[:dimensions])
obj.version.x.should eq(default_values[:x])
obj.version.dimensions.should eq(default_values[:dimensions])
end

it "model receives values after process done" do
uploader = TestDelegateUploader.new(obj, :image)
uploader.cache!(file)

uploader_values_are_correct(uploader)
obj_values_are_correct(obj)
end

it "resets values to default after file is removed" do
uploader = TestDelegateUploader.new(obj, :image)
uploader.store!(file)

uploader_values_are_correct(uploader)

# CarrierWave's file is removed in after_destroy callback. Model attributes are freezed after destroy.
# Let mock this case.
obj.x.freeze
obj.destroyed = true
uploader.remove!

uploader_values_are_default(uploader)
obj_values_are_correct(obj)
end

it "tries to receive value from a model when file was not processed at this time" do
uploader = TestDelegateUploader.new(obj, :image)
uploader.store!(file)

uploader_values_are_correct(uploader)

uploader = TestDelegateUploader.new(obj, :image)
uploader.retrieve_from_store!(File.basename(file.path))

obj_values_are_correct(obj)
end
end
60 changes: 60 additions & 0 deletions spec/modules/store_meta_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
require 'spec_helper'

describe TestUploader do
ORIGINAL_SIZE = [600, 277]
VERSION_SIZE = [200, 200]

let(:file) { File.open("spec/fixtures/big.jpg") }
let(:obj) { TestModel.new }

def uploader_values_are_correct(uploader)
uploader.width.should eq(ORIGINAL_SIZE[0])
uploader.height.should eq(ORIGINAL_SIZE[1])
uploader.dimensions.should eq(ORIGINAL_SIZE)
uploader.content_type.should eq(Mime::Type.for(file))
uploader.file_size.should eq(file.size)

uploader.version.width.should eq(VERSION_SIZE[0])
uploader.version.height.should eq(VERSION_SIZE[1])

end

def uploader_values_are_correct(obj)
obj.width.should eq(ORIGINAL_SIZE[0])
obj.height.should eq(ORIGINAL_SIZE[1])
end

context "detached uploader" do
it "stores metadata after cache!" do
uploader = TestUploader.new
# uploader.cache!(file)
# uploader_values_are_correct(uploader)
end

it "stores metadata after store!" do
uploader = TestUploader.new
# uploader.store!(file)
# uploader_values_are_correct(uploader)
end

it "has metadata after cache!/retrieve_from_cache!" do
uploader = TestUploader.new
uploader.cache!(file)
cache_name = uploader.cache_name
puts uploader.image_size.inspect
puts uploader.width
puts '---'
uploader = TestUploader.new
uploader.retrieve_from_cache!(cache_name)
puts '---'
uploader_values_are_correct(uploader)
end

it "has metadata after store!/retrieve_from_store!" do
uploader = TestUploader.new
# uploader.store!(file)
# uploader_values_are_correct(uploader)
# uploader.retrieve_from_store!(File.basename(file.path))
end
end
end
32 changes: 32 additions & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
$LOAD_PATH << "." unless $LOAD_PATH.include?(".")

begin
require "bundler"
Bundler.setup
Bundler.require
rescue Bundler::GemNotFound
raise RuntimeError, "Bundler couldn't find some gems." +
"Did you run `bundle install`?"
end

#require 'logger'

#ActiveRecord::Base.establish_connection(
# "adapter" => "sqlite3",
# "database" => ":memory:"
#)

#require 'support/schema'
require 'carrierwave'
require 'carrierwave-meta'
require 'support/test_delegate_uploader'
require 'support/test_uploader'
require 'support/test_model'

RSpec.configure do |config|
config.before do
FileUtils.rm_rf('tmp')
end
end

$: << File.join(File.dirname(__FILE__), '..', 'lib')
15 changes: 15 additions & 0 deletions spec/support/schema.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
ActiveRecord::Schema.define :version => 0 do
create_table "test_models", :force => true do |t|
t.string :image

t.integer :image_width
t.integer :image_height
t.string :image_content_type
t.integer :image_file_size

t.integer :image_version_width
t.integer :image_version_height
t.integer :image_version_file_size
t.string :image_version_content_type
end
end
43 changes: 43 additions & 0 deletions spec/support/test_delegate_uploader.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
class TestDelegateUploader < CarrierWave::Uploader::Base
VALUES = {
:x => 5,
:version_x => 10,
:dimensions => [1, 1],
:version_dimensions => [2, 2]
}

DEFAULT_VALUES = {
:x => 0,
:dimensions => []
}

storage :file

def store_dir
"tmp/store"
end

def cache_dir
"tmp/cache"
end

include CarrierWave::ModelDelegateAttribute

model_delegate_attribute :x, DEFAULT_VALUES[:x]
model_delegate_attribute :dimensions, DEFAULT_VALUES[:dimensions]

process :set_values
version :version do
process :set_values_for_version
end

def set_values
self.x = VALUES[:x]
self.dimensions = VALUES[:dimensions]
end

def set_values_for_version
self.x = VALUES[:version_x]
self.dimensions = VALUES[:version_dimensions]
end
end
11 changes: 11 additions & 0 deletions spec/support/test_model.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class TestModel
attr_accessor :x
attr_accessor :dimensions
attr_accessor :version_x
attr_accessor :version_dimensions
attr_accessor :destroyed

def destroyed?
destroyed
end
end
Loading

0 comments on commit b837d4c

Please sign in to comment.