carrierwave-meta 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|