carrierwave-meta 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -1
- data/.travis.yml +7 -0
- data/README.rdoc +113 -45
- data/carrierwave-meta.gemspec +5 -0
- data/lib/carrierwave-meta.rb +3 -1
- data/lib/carrierwave-meta/active_record.rb +22 -0
- data/lib/carrierwave-meta/meta.rb +55 -21
- data/lib/carrierwave-meta/model_delegate_attribute.rb +16 -6
- data/lib/carrierwave-meta/version.rb +1 -1
- data/spec/fixtures/corrupted.eps +0 -0
- data/spec/fixtures/corrupted.pdf +0 -0
- data/spec/fixtures/flash.swf +0 -0
- data/spec/fixtures/sample.eps +0 -0
- data/spec/fixtures/sample.pdf +0 -0
- data/spec/modules/active_record_spec.rb +31 -0
- data/spec/modules/meta_spec.rb +131 -99
- data/spec/modules/model_delegate_attribute_spec.rb +13 -13
- data/spec/spec_helper.rb +22 -11
- data/spec/support/current_processor.rb +18 -0
- data/spec/support/remote.rb +27 -0
- data/spec/support/schema.rb +7 -12
- data/spec/support/test_blank_uploader.rb +1 -6
- data/spec/support/test_composed_model.rb +7 -0
- data/spec/support/test_delegate_uploader.rb +7 -9
- data/spec/support/test_model.rb +6 -5
- data/spec/support/test_uploader.rb +3 -9
- metadata +126 -48
@@ -1,7 +1,7 @@
|
|
1
1
|
module CarrierWave
|
2
2
|
module ModelDelegateAttribute
|
3
3
|
extend ::ActiveSupport::Concern
|
4
|
-
|
4
|
+
|
5
5
|
module ClassMethods
|
6
6
|
def model_delegate_attribute(attribute, default = nil)
|
7
7
|
attr_accessor attribute
|
@@ -10,29 +10,39 @@ module CarrierWave
|
|
10
10
|
|
11
11
|
var_name = :"@#{attribute}"
|
12
12
|
|
13
|
+
define_getter(attribute, var_name, default)
|
14
|
+
define_setter(attribute, var_name, default)
|
15
|
+
define_reset(attribute, default)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def define_getter(attribute, var_name, default)
|
13
20
|
define_method :"#{attribute}" do
|
14
21
|
model_accessor = model_getter_name(attribute)
|
15
22
|
value = instance_variable_get(var_name)
|
16
|
-
value ||=
|
23
|
+
value ||= model.send(model_accessor) if model.present? && model.respond_to?(model_accessor)
|
17
24
|
value ||= default
|
18
25
|
instance_variable_set(var_name, value)
|
19
26
|
end
|
27
|
+
end
|
20
28
|
|
29
|
+
def define_setter(attribute, var_name, default)
|
21
30
|
define_method :"#{attribute}=" do |value|
|
22
31
|
model_accessor = model_getter_name(attribute)
|
23
32
|
instance_variable_set(var_name, value)
|
24
|
-
if
|
25
|
-
|
33
|
+
if model.present? && model.respond_to?(:"#{model_accessor}=") && !model.destroyed?
|
34
|
+
model.send(:"#{model_accessor}=", value)
|
26
35
|
end
|
27
36
|
end
|
37
|
+
end
|
28
38
|
|
39
|
+
def define_reset(attribute, default)
|
29
40
|
define_method :"reset_#{attribute}" do
|
30
|
-
self.send(:"#{attribute}=", default)
|
31
41
|
send(:"#{attribute}=", default)
|
32
42
|
end
|
33
43
|
end
|
34
44
|
end
|
35
|
-
|
45
|
+
|
36
46
|
private
|
37
47
|
def model_getter_name(attribute)
|
38
48
|
name = []
|
File without changes
|
File without changes
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CarrierWave::Meta::ActiveRecord do
|
4
|
+
let(:model) { TestComposedModel.new }
|
5
|
+
let(:model_with_image) do
|
6
|
+
model.tap do |m|
|
7
|
+
m.image = File.open('spec/fixtures/big.jpg')
|
8
|
+
m.save!
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
it "model's virtual meta attributes must exists" do
|
13
|
+
subject::ALLOWED.each do |name|
|
14
|
+
model.should respond_to(:"image_#{name}")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "must assign model's virtual attributes and save meta column" do
|
19
|
+
subject::ALLOWED.each do |name|
|
20
|
+
model_with_image.send(:"image_#{name}").should_not be_blank
|
21
|
+
end
|
22
|
+
|
23
|
+
model_with_image.image_version_width.should_not be_blank
|
24
|
+
model_with_image.image_version_height.should_not be_blank
|
25
|
+
|
26
|
+
model_with_image.reload
|
27
|
+
|
28
|
+
model_with_image.image_version_width.should_not be_blank
|
29
|
+
model_with_image.image_version_height.should_not be_blank
|
30
|
+
end
|
31
|
+
end
|
data/spec/modules/meta_spec.rb
CHANGED
@@ -2,118 +2,150 @@ require 'spec_helper'
|
|
2
2
|
require 'mime/types'
|
3
3
|
|
4
4
|
describe TestUploader do
|
5
|
-
ORIGINAL_SIZE = [600, 277]
|
6
|
-
VERSION_SIZE = [200, 200]
|
7
|
-
|
8
|
-
let(:file) { File.open("spec/fixtures/big.jpg") }
|
9
|
-
let(:corrupted_file) { File.open("spec/fixtures/corrupted.bmp") }
|
10
|
-
let(:file_name) { File.basename(file.path) }
|
11
5
|
let(:obj) { TestModel.new }
|
12
6
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
7
|
+
IMAGE_FILE_NAME = "spec/fixtures/big.jpg"
|
8
|
+
EPS_FILE_NAME = "spec/fixtures/sample.eps"
|
9
|
+
PDF_FILE_NAME = "spec/fixtures/sample.pdf"
|
10
|
+
|
11
|
+
FORMATS = {
|
12
|
+
image: {
|
13
|
+
original_size: [600, 277],
|
14
|
+
version_size: [200, 200],
|
15
|
+
file: File.open(IMAGE_FILE_NAME),
|
16
|
+
file_name: File.basename(IMAGE_FILE_NAME),
|
17
|
+
corrupted_file: File.open("spec/fixtures/corrupted.bmp"),
|
18
|
+
mime_type: MIME::Types.type_for(IMAGE_FILE_NAME).first.to_s
|
19
|
+
},
|
20
|
+
eps: {
|
21
|
+
original_size: [464, 205],
|
22
|
+
version_size: [200, 200],
|
23
|
+
file: File.open(EPS_FILE_NAME),
|
24
|
+
corrupted_file: File.open("spec/fixtures/corrupted.eps"),
|
25
|
+
file_name: File.basename(EPS_FILE_NAME),
|
26
|
+
mime_type: MIME::Types.type_for(EPS_FILE_NAME).first.to_s
|
27
|
+
},
|
28
|
+
pdf: {
|
29
|
+
original_size: [360, 360],
|
30
|
+
version_size: [200, 200],
|
31
|
+
file: File.open(PDF_FILE_NAME),
|
32
|
+
corrupted_file: File.open("spec/fixtures/corrupted.pdf"),
|
33
|
+
file_name: File.basename(PDF_FILE_NAME),
|
34
|
+
mime_type: MIME::Types.type_for(PDF_FILE_NAME).first.to_s
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
def obj_values_eq(obj, size_arg, args, prefix = nil)
|
39
|
+
size = args[size_arg]
|
40
|
+
|
41
|
+
obj.send(obj_value_name(:width, prefix)).should eq(size.first)
|
42
|
+
obj.send(obj_value_name(:height, prefix)).should eq(size.last)
|
43
|
+
obj.send(obj_value_name(:image_size, prefix)).should eq(size)
|
44
|
+
obj.send(obj_value_name(:content_type, prefix)).should eq(args[:mime_type])
|
45
|
+
obj.send(obj_value_name(:file_size, prefix)).should_not be_blank
|
46
|
+
|
47
|
+
if obj.is_a?(CarrierWave::Uploader::Base)
|
48
|
+
obj.send(obj_value_name(:image_size_s, prefix)).should eq(size.join('x'))
|
49
|
+
end
|
27
50
|
end
|
28
51
|
|
29
|
-
def
|
30
|
-
|
31
|
-
obj.image_height.should eq(ORIGINAL_SIZE[1])
|
32
|
-
obj.image_image_size.should eq(ORIGINAL_SIZE)
|
33
|
-
obj.image_content_type.should eq(MIME::Types.type_for(file_name).first.to_s)
|
34
|
-
obj.image_file_size.should_not be_blank
|
35
|
-
|
36
|
-
obj.image_version_width.should eq(VERSION_SIZE[0])
|
37
|
-
obj.image_version_height.should eq(VERSION_SIZE[1])
|
38
|
-
obj.image_version_image_size.should eq(VERSION_SIZE)
|
39
|
-
obj.image_version_content_type.should eq(MIME::Types.type_for(file_name).first.to_s)
|
40
|
-
obj.image_version_file_size.should_not be_blank
|
52
|
+
def obj_value_name(name, prefix)
|
53
|
+
[prefix, name].compact.join('_')
|
41
54
|
end
|
42
55
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
it "stores metadata after store!" do
|
51
|
-
uploader = TestUploader.new
|
52
|
-
uploader.store!(file)
|
53
|
-
uploader_values_are_correct(uploader)
|
54
|
-
end
|
55
|
-
|
56
|
-
it "has metadata after cache!/retrieve_from_cache!" do
|
57
|
-
uploader = TestUploader.new
|
58
|
-
uploader.cache!(file)
|
59
|
-
cache_name = uploader.cache_name
|
60
|
-
|
61
|
-
uploader = TestUploader.new
|
62
|
-
uploader.retrieve_from_cache!(cache_name)
|
63
|
-
uploader_values_are_correct(uploader)
|
64
|
-
end
|
65
|
-
|
66
|
-
it "has metadata after store!/retrieve_from_store!" do
|
67
|
-
uploader = TestUploader.new
|
68
|
-
uploader.store!(file)
|
69
|
-
uploader_values_are_correct(uploader)
|
70
|
-
|
71
|
-
uploader = TestUploader.new
|
72
|
-
uploader.retrieve_from_store!(File.basename(file.path))
|
73
|
-
uploader_values_are_correct(uploader)
|
74
|
-
end
|
56
|
+
def uploader_values_eq(uploader, args)
|
57
|
+
obj_values_eq(uploader, :original_size, args)
|
58
|
+
obj_values_eq(uploader.version, :version_size, args)
|
59
|
+
uploader.md5sum.should_not be_blank
|
60
|
+
uploader.version.md5sum.should be_blank
|
75
61
|
end
|
76
62
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
obj_values_are_correct(obj)
|
83
|
-
end
|
84
|
-
|
85
|
-
it "stores metadata after store!" do
|
86
|
-
uploader = TestUploader.new(obj, :image)
|
87
|
-
uploader.store!(file)
|
88
|
-
uploader_values_are_correct(uploader)
|
89
|
-
obj_values_are_correct(obj)
|
90
|
-
end
|
91
|
-
|
92
|
-
it "has metadata after cache!/retrieve_from_cache!" do
|
93
|
-
uploader = TestUploader.new(obj, :image)
|
94
|
-
uploader.cache!(file)
|
95
|
-
cache_name = uploader.cache_name
|
63
|
+
def model_values_eq(model, args)
|
64
|
+
obj_values_eq(model, :original_size, args, 'image')
|
65
|
+
obj_values_eq(model, :version_size, args, 'image_version')
|
66
|
+
model.image_md5sum.should_not be_blank
|
67
|
+
end
|
96
68
|
|
97
|
-
|
98
|
-
|
99
|
-
|
69
|
+
FORMATS.each do |format, args|
|
70
|
+
next if not(CarrierWave::Meta.ghostscript_enabled) and [:pdf, :eps].include?(format)
|
71
|
+
context "detached uploader for #{format}" do
|
72
|
+
it "stores metadata after cache!" do
|
73
|
+
uploader = TestUploader.new
|
74
|
+
uploader.cache!(args[:file])
|
75
|
+
uploader_values_eq(uploader, args)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "stores metadata after store!" do
|
79
|
+
uploader = TestUploader.new
|
80
|
+
uploader.store!(args[:file])
|
81
|
+
uploader_values_eq(uploader, args)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "has metadata after cache!/retrieve_from_cache!" do
|
85
|
+
uploader = TestUploader.new
|
86
|
+
uploader.cache!(args[:file])
|
87
|
+
cache_name = uploader.cache_name
|
88
|
+
uploader = TestUploader.new
|
89
|
+
uploader.retrieve_from_cache!(cache_name)
|
90
|
+
|
91
|
+
uploader_values_eq(uploader, args)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "has metadata after store!/retrieve_from_store!" do
|
95
|
+
uploader = TestUploader.new
|
96
|
+
uploader.store!(args[:file])
|
97
|
+
uploader_values_eq(uploader, args)
|
98
|
+
|
99
|
+
uploader = TestUploader.new
|
100
|
+
uploader.retrieve_from_store!(args[:file_name])
|
101
|
+
uploader_values_eq(uploader, args)
|
102
|
+
end
|
100
103
|
end
|
101
104
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
105
|
+
context "attached uploader for #{format}" do
|
106
|
+
it "stores metadata after cache!" do
|
107
|
+
uploader = TestUploader.new(obj, :image)
|
108
|
+
uploader.cache!(args[:file])
|
109
|
+
uploader_values_eq(uploader, args)
|
110
|
+
model_values_eq(obj, args)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "stores metadata after store!" do
|
114
|
+
uploader = TestUploader.new(obj, :image)
|
115
|
+
uploader.store!(args[:file])
|
116
|
+
uploader_values_eq(uploader, args)
|
117
|
+
model_values_eq(obj, args)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "has metadata after cache!/retrieve_from_cache!" do
|
121
|
+
uploader = TestUploader.new(obj, :image)
|
122
|
+
uploader.cache!(args[:file])
|
123
|
+
cache_name = uploader.cache_name
|
124
|
+
|
125
|
+
uploader = TestUploader.new(obj, :image)
|
126
|
+
uploader.retrieve_from_cache!(cache_name)
|
127
|
+
uploader_values_eq(uploader, args)
|
128
|
+
model_values_eq(obj, args)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "has metadata after store!/retrieve_from_store!" do
|
132
|
+
uploader = TestUploader.new(obj, :image)
|
133
|
+
uploader.store!(args[:file])
|
134
|
+
uploader_values_eq(uploader, args)
|
135
|
+
model_values_eq(obj, args)
|
136
|
+
|
137
|
+
uploader = TestUploader.new(obj, :image)
|
138
|
+
uploader.retrieve_from_store!(args[:file_name])
|
139
|
+
uploader_values_eq(uploader, args)
|
140
|
+
model_values_eq(obj, args)
|
141
|
+
end
|
110
142
|
end
|
111
|
-
end
|
112
143
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
144
|
+
context "when file is corrupted/can not be processed" do
|
145
|
+
it "passes without exceptions" do
|
146
|
+
uploader = TestBlankUploader.new(obj, :image)
|
147
|
+
proc { uploader.store!(args[:corrupted_file]) }.should_not raise_error
|
148
|
+
end
|
117
149
|
end
|
118
150
|
end
|
119
151
|
end
|
@@ -2,35 +2,35 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe TestDelegateUploader do
|
4
4
|
let(:values) { subject.class::VALUES }
|
5
|
-
let(:default_values) { subject.class::DEFAULT_VALUES }
|
5
|
+
let(:default_values) { subject.class::DEFAULT_VALUES }
|
6
6
|
let(:file) { File.open("spec/fixtures/big.jpg") }
|
7
7
|
let(:obj) { TestModel.new }
|
8
|
-
|
8
|
+
|
9
9
|
before do
|
10
10
|
obj.destroyed = false
|
11
11
|
end
|
12
12
|
|
13
13
|
def uploader_values_are_correct(uploader)
|
14
14
|
uploader.x.should eq(values[:x])
|
15
|
-
uploader.dimensions.should eq(values[:dimensions])
|
15
|
+
uploader.dimensions.should eq(values[:dimensions])
|
16
16
|
uploader.version.x.should eq(values[:version_x])
|
17
|
-
uploader.version.dimensions.should eq(values[:version_dimensions])
|
17
|
+
uploader.version.dimensions.should eq(values[:version_dimensions])
|
18
18
|
end
|
19
19
|
|
20
20
|
def obj_values_are_correct(obj)
|
21
21
|
obj.image_x.should eq(values[:x])
|
22
|
-
obj.image_dimensions.should eq(values[:dimensions])
|
22
|
+
obj.image_dimensions.should eq(values[:dimensions])
|
23
23
|
obj.image_version_x.should eq(values[:version_x])
|
24
|
-
obj.image_version_dimensions.should eq(values[:version_dimensions])
|
24
|
+
obj.image_version_dimensions.should eq(values[:version_dimensions])
|
25
25
|
end
|
26
26
|
|
27
27
|
def uploader_values_are_default(obj)
|
28
28
|
obj.x.should eq(default_values[:x])
|
29
|
-
obj.dimensions.should eq(default_values[:dimensions])
|
29
|
+
obj.dimensions.should eq(default_values[:dimensions])
|
30
30
|
obj.version.x.should eq(default_values[:x])
|
31
|
-
obj.version.dimensions.should eq(default_values[:dimensions])
|
31
|
+
obj.version.dimensions.should eq(default_values[:dimensions])
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
it "model receives values after process done" do
|
35
35
|
uploader = TestDelegateUploader.new(obj, :image)
|
36
36
|
uploader.cache!(file)
|
@@ -38,15 +38,15 @@ describe TestDelegateUploader do
|
|
38
38
|
uploader_values_are_correct(uploader)
|
39
39
|
obj_values_are_correct(obj)
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
it "resets values to default after file is removed" do
|
43
43
|
uploader = TestDelegateUploader.new(obj, :image)
|
44
44
|
uploader.store!(file)
|
45
45
|
|
46
46
|
uploader_values_are_correct(uploader)
|
47
47
|
|
48
|
-
# CarrierWave's file is removed in after_destroy callback.
|
49
|
-
# Let mock this case.
|
48
|
+
# CarrierWave's file is removed in after_destroy callback.
|
49
|
+
# Model attributes are freezed after destroy. Let mock this case.
|
50
50
|
obj.image_x.freeze
|
51
51
|
obj.destroyed = true
|
52
52
|
uploader.remove!
|
@@ -54,7 +54,7 @@ describe TestDelegateUploader do
|
|
54
54
|
uploader_values_are_default(uploader)
|
55
55
|
obj_values_are_correct(obj)
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
it "tries to receive value from a model when file was not processed at this time" do
|
59
59
|
uploader = TestDelegateUploader.new(obj, :image)
|
60
60
|
uploader.store!(file)
|
data/spec/spec_helper.rb
CHANGED
@@ -1,23 +1,34 @@
|
|
1
1
|
$LOAD_PATH << "." unless $LOAD_PATH.include?(".")
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
Bundler.require
|
7
|
-
rescue Bundler::GemNotFound
|
8
|
-
raise RuntimeError, "Bundler couldn't find some gems." +
|
9
|
-
"Did you run `bundle install`?"
|
10
|
-
end
|
11
|
-
|
12
|
-
PROCESSOR = (ENV["PROCESSOR"] || :rmagick).to_sym
|
13
|
-
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'simplecov'
|
14
6
|
require 'mime/types'
|
15
7
|
require 'carrierwave'
|
8
|
+
require 'carrierwave/orm/activerecord'
|
9
|
+
require 'support/remote'
|
10
|
+
require 'support/current_processor'
|
11
|
+
require 'active_record'
|
12
|
+
require 'support/schema'
|
13
|
+
|
14
|
+
SimpleCov.start
|
15
|
+
|
16
16
|
require 'carrierwave-meta'
|
17
|
+
|
18
|
+
PROCESSOR = (ENV["PROCESSOR"] || :rmagick).to_sym
|
19
|
+
puts "Using #{PROCESSOR} processor"
|
20
|
+
|
21
|
+
PDF_EPS = ENV['PDF_EPS']
|
22
|
+
unless PDF_EPS == 'false' or [:vips, :image_sorcery].include?(PROCESSOR)
|
23
|
+
CarrierWave::Meta.ghostscript_enabled = true
|
24
|
+
end
|
25
|
+
|
17
26
|
require 'support/test_delegate_uploader'
|
18
27
|
require 'support/test_blank_uploader'
|
19
28
|
require 'support/test_uploader'
|
20
29
|
require 'support/test_model'
|
30
|
+
require 'support/test_composed_model'
|
31
|
+
require 'fog'
|
21
32
|
|
22
33
|
RSpec.configure do |config|
|
23
34
|
config.before do
|