paperclip_database 2.2.2 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -2
- data/.rspec +1 -1
- data/.travis.yml +4 -3
- data/Appraisals +14 -10
- data/README.md +7 -5
- data/Rakefile +6 -10
- data/features/basic_integration.feature +2 -2
- data/features/step_definitions/html_steps.rb +2 -2
- data/features/step_definitions/rails_steps.rb +2 -2
- data/features/step_definitions/web_steps.rb +4 -98
- data/gemfiles/rails30_paperclip23.gemfile +2 -2
- data/gemfiles/rails30_paperclip2x.gemfile +2 -2
- data/gemfiles/rails30_paperclip30.gemfile +2 -2
- data/gemfiles/rails30_paperclip3x.gemfile +2 -2
- data/gemfiles/rails31_paperclip23.gemfile +2 -2
- data/gemfiles/rails31_paperclip2x.gemfile +2 -2
- data/gemfiles/rails31_paperclip30.gemfile +2 -2
- data/gemfiles/rails31_paperclip3x.gemfile +2 -2
- data/gemfiles/rails32_paperclip23.gemfile +2 -2
- data/gemfiles/rails32_paperclip2x.gemfile +2 -2
- data/gemfiles/rails32_paperclip30.gemfile +2 -2
- data/gemfiles/rails32_paperclip3x.gemfile +2 -2
- data/gemfiles/rails32_paperclip40.gemfile +2 -2
- data/gemfiles/rails32_paperclip4x.gemfile +2 -2
- data/gemfiles/rails40_paperclip42.gemfile +10 -0
- data/gemfiles/rails40_paperclip4x.gemfile +4 -3
- data/gemfiles/rails41_paperclip42.gemfile +9 -0
- data/gemfiles/rails41_paperclip4x.gemfile +9 -0
- data/lib/generators/paperclip_database/migration/migration_generator.rb +0 -2
- data/lib/paperclip/storage/database.rb +47 -32
- data/lib/paperclip_database/version.rb +1 -1
- data/lib/paperclip_database.rb +0 -1
- data/paperclip_database.gemspec +4 -3
- data/{test → spec}/database.yml +0 -0
- data/spec/default_options_spec.rb +74 -0
- data/{test → spec}/fixtures/5k.png +0 -0
- data/spec/major_version_API_spec.rb +85 -0
- data/spec/namespaced_models_spec.rb +39 -0
- data/spec/single_table_inheritance_spec.rb +39 -0
- data/spec/spec_helper.rb +81 -1
- metadata +22 -22
- data/gemfiles/rails40_paperclip34.gemfile +0 -9
- data/gemfiles/rails40_paperclip3x.gemfile +0 -9
- data/gemfiles/rails40_paperclip40.gemfile +0 -9
- data/lib/paperclip_database/deconstantize.rb +0 -11
- data/spec/paperclip_database_spec.rb +0 -7
- data/test/namespaced_models_test.rb +0 -54
- data/test/test_helper.rb +0 -101
@@ -58,7 +58,9 @@ module Paperclip
|
|
58
58
|
|
59
59
|
def self.extended(base)
|
60
60
|
base.instance_eval do
|
61
|
-
|
61
|
+
setup_attachment_class
|
62
|
+
setup_paperclip_file_model
|
63
|
+
setup_paperclip_files_association
|
62
64
|
override_default_options base
|
63
65
|
end
|
64
66
|
Paperclip.interpolates(:database_path) do |attachment, style|
|
@@ -79,30 +81,42 @@ module Paperclip
|
|
79
81
|
ActiveRecord::Base.logger.info("[paperclip] Database Storage Initalized.")
|
80
82
|
end
|
81
83
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
84
|
+
def setup_paperclip_files_association
|
85
|
+
@paperclip_files_association_name = 'paperclip_files'
|
86
|
+
@database_table = @paperclip_file_model.table_name
|
87
|
+
#FIXME: This fails when using set_table_name "<myname>" in your model
|
88
|
+
#FIXME: This should be fixed in ActiveRecord...
|
89
|
+
instance.class.has_many(@paperclip_files_association_name.to_sym,
|
90
|
+
:class_name => @paperclip_file_model.name,
|
91
|
+
:foreign_key => instance.class.table_name.classify.underscore + '_id'
|
92
|
+
)
|
93
|
+
end
|
94
|
+
private :setup_paperclip_files_association
|
90
95
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
@
|
95
|
-
@paperclip_file.validates_uniqueness_of :style, :scope => instance.class.table_name.classify.underscore + '_id'
|
96
|
-
@paperclip_file.scope :file_for, lambda {|style| @paperclip_file.where('style = ?', style) }
|
96
|
+
def setup_paperclip_file_model
|
97
|
+
class_name = "#{instance.class.table_name.singularize}_#{name.to_s}_paperclip_file".classify
|
98
|
+
if @attachment_class.const_defined?(class_name, false)
|
99
|
+
@paperclip_file_model = @attachment_class.const_get(class_name, false)
|
97
100
|
else
|
98
|
-
@
|
101
|
+
@paperclip_file_model = @attachment_class.const_set(class_name, Class.new(::ActiveRecord::Base))
|
102
|
+
@paperclip_file_model.table_name = @options[:database_table] || name.to_s.pluralize
|
103
|
+
@paperclip_file_model.validates_uniqueness_of :style, :scope => instance.class.table_name.classify.underscore + '_id'
|
104
|
+
@paperclip_file_model.scope :file_for, lambda {|style| @paperclip_file_model.where('style = ?', style) }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
private :setup_paperclip_file_model
|
108
|
+
|
109
|
+
def setup_attachment_class
|
110
|
+
instance.class.ancestors.each do |ancestor|
|
111
|
+
# Pick the top-most definition like
|
112
|
+
# Paperclip::AttachmentRegistry#definitions_for
|
113
|
+
names_for_ancestor = ancestor.attachment_definitions.keys rescue []
|
114
|
+
if names_for_ancestor.member?(name)
|
115
|
+
@attachment_class = ancestor
|
116
|
+
end
|
99
117
|
end
|
100
|
-
@database_table = @paperclip_file.table_name
|
101
|
-
#FIXME: This fails when using set_table_name "<myname>" in your model
|
102
|
-
#FIXME: This should be fixed in ActiveRecord...
|
103
|
-
instance.class.has_many @paperclip_files.to_sym, :class_name => @paperclip_file.name, :foreign_key => instance.class.table_name.classify.underscore + '_id'
|
104
118
|
end
|
105
|
-
private :
|
119
|
+
private :setup_attachment_class
|
106
120
|
|
107
121
|
def copy_to_local_file(style, dest_path)
|
108
122
|
File.open(dest_path, 'wb+'){|df| to_file(style).tap{|sf| File.copy_stream(sf, df); sf.close;sf.unlink} }
|
@@ -131,7 +145,7 @@ module Paperclip
|
|
131
145
|
|
132
146
|
def exists?(style = default_style)
|
133
147
|
if original_filename
|
134
|
-
instance.send("#{@
|
148
|
+
instance.send("#{@paperclip_files_association_name}").where(:style => style).exists?
|
135
149
|
else
|
136
150
|
false
|
137
151
|
end
|
@@ -157,7 +171,7 @@ module Paperclip
|
|
157
171
|
alias_method :to_io, :to_file
|
158
172
|
|
159
173
|
def file_for(style)
|
160
|
-
db_result = instance.send("#{@
|
174
|
+
db_result = instance.send("#{@paperclip_files_association_name}").send(:file_for, style.to_s)
|
161
175
|
raise RuntimeError, "More than one result for #{style}" if db_result.size > 1
|
162
176
|
db_result.first
|
163
177
|
end
|
@@ -169,13 +183,13 @@ module Paperclip
|
|
169
183
|
def flush_writes
|
170
184
|
ActiveRecord::Base.logger.info("[paperclip] Writing files for #{name}")
|
171
185
|
@queued_for_write.each do |style, file|
|
172
|
-
case
|
173
|
-
when
|
174
|
-
paperclip_file = instance.send(@
|
175
|
-
when
|
176
|
-
paperclip_file = instance.send(@
|
186
|
+
case ActiveModel::VERSION::MAJOR
|
187
|
+
when 3
|
188
|
+
paperclip_file = instance.send(@paperclip_files_association_name).send(:find_or_create_by_style, style.to_s)
|
189
|
+
when 4
|
190
|
+
paperclip_file = instance.send(@paperclip_files_association_name).send(:find_or_create_by, style: style.to_s)
|
177
191
|
else
|
178
|
-
raise "
|
192
|
+
raise "ActiveModel version #{ActiveModel::VERSION::STRING} is not supported (yet)"
|
179
193
|
end
|
180
194
|
paperclip_file.file_contents = file.read
|
181
195
|
paperclip_file.save!
|
@@ -190,9 +204,9 @@ module Paperclip
|
|
190
204
|
@queued_for_delete.each do |path|
|
191
205
|
/id=([0-9]+)/.match(path)
|
192
206
|
if @options[:cascade_deletion] && !instance.class.exists?(instance.id)
|
193
|
-
raise RuntimeError, "Deletion has not been done by through cascading." if @
|
207
|
+
raise RuntimeError, "Deletion has not been done by through cascading." if @paperclip_file_model.exists?($1)
|
194
208
|
else
|
195
|
-
@
|
209
|
+
@paperclip_file_model.destroy $1
|
196
210
|
end
|
197
211
|
end
|
198
212
|
@queued_for_delete = []
|
@@ -204,7 +218,8 @@ module Paperclip
|
|
204
218
|
end
|
205
219
|
def downloads_files_for(model, attachment, options = {})
|
206
220
|
define_method("#{attachment.to_s.pluralize}") do
|
207
|
-
|
221
|
+
#FIXME: Handling Namespaces
|
222
|
+
model_record = Object.const_get(model.to_s.camelize.to_sym, false).find(params[:id])
|
208
223
|
style = params[:style] ? params[:style] : 'original'
|
209
224
|
send_data model_record.send(attachment).file_contents(style),
|
210
225
|
:filename => model_record.send("#{attachment}_file_name".to_sym),
|
data/lib/paperclip_database.rb
CHANGED
data/paperclip_database.gemspec
CHANGED
@@ -15,16 +15,17 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.license = 'MIT'
|
16
16
|
|
17
17
|
s.files = `git ls-files`.split("\n")
|
18
|
-
s.test_files = `git ls-files -- {
|
18
|
+
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
22
|
s.requirements << "ImageMagick"
|
23
23
|
|
24
|
-
s.add_dependency('rails', '>= 3.0.0')
|
25
24
|
s.add_dependency('paperclip', '>= 2.3.0')
|
26
25
|
|
27
|
-
s.add_development_dependency('
|
26
|
+
s.add_development_dependency('rspec', '~> 3.1')
|
27
|
+
s.add_development_dependency('appraisal', '~> 1.0')
|
28
|
+
# s.add_development_dependency('rails', '>= 3.0.0') # Appraisal
|
28
29
|
s.add_development_dependency('mocha')
|
29
30
|
s.add_development_dependency('sqlite3', '~> 1.3')
|
30
31
|
s.add_development_dependency('cucumber', '~> 1.1')
|
data/{test → spec}/database.yml
RENAMED
File without changes
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "PaperclipDatabase" do
|
4
|
+
describe "default options" do
|
5
|
+
before(:context) do
|
6
|
+
create_model_tables :users, :avatars
|
7
|
+
build_model 'User', nil, :avatar, {}
|
8
|
+
|
9
|
+
@model = User.new
|
10
|
+
file = File.open(fixture_file('5k.png'))
|
11
|
+
|
12
|
+
@model.avatar = file
|
13
|
+
@model.save
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
after(:context) do
|
18
|
+
reset_activerecord
|
19
|
+
reset_database :users, :avatars
|
20
|
+
end
|
21
|
+
|
22
|
+
it "has backward compatible table name" do
|
23
|
+
expect(@model.avatar.instance_variable_get(:@database_table)).to eq 'avatars'
|
24
|
+
end
|
25
|
+
|
26
|
+
it "has association name" do
|
27
|
+
expect(@model.avatar.instance_variable_get(:@paperclip_files_association_name)).to eq 'paperclip_files'
|
28
|
+
end
|
29
|
+
|
30
|
+
it "has model constant" do
|
31
|
+
expect(@model.avatar.instance_variable_get(:@paperclip_file_model).to_s).to eq 'User::UserAvatarPaperclipFile'
|
32
|
+
end
|
33
|
+
|
34
|
+
it "has association" do
|
35
|
+
expect(@model.methods.include?(:paperclip_files)).to be_truthy
|
36
|
+
end
|
37
|
+
end
|
38
|
+
describe "Namespaced model" do
|
39
|
+
describe "default options" do
|
40
|
+
before(:context) do
|
41
|
+
Object.const_set('Namespace', Module.new())
|
42
|
+
create_model_tables :users, :avatars
|
43
|
+
build_model 'Namespace::User', nil, :avatar, {}
|
44
|
+
|
45
|
+
@model = Namespace::User.new
|
46
|
+
file = File.open(fixture_file('5k.png'))
|
47
|
+
|
48
|
+
@model.avatar = file
|
49
|
+
@model.save
|
50
|
+
end
|
51
|
+
after(:context) do
|
52
|
+
reset_activerecord
|
53
|
+
reset_database :users, :avatars
|
54
|
+
Object.send(:remove_const, 'Namespace')
|
55
|
+
end
|
56
|
+
|
57
|
+
it "has backward compatible table name" do
|
58
|
+
expect(@model.avatar.instance_variable_get(:@database_table)).to eq 'avatars'
|
59
|
+
end
|
60
|
+
|
61
|
+
it "has association name" do
|
62
|
+
expect(@model.avatar.instance_variable_get(:@paperclip_files_association_name)).to eq 'paperclip_files'
|
63
|
+
end
|
64
|
+
|
65
|
+
it "has model constant" do
|
66
|
+
expect(@model.avatar.instance_variable_get(:@paperclip_file_model).to_s).to eq 'Namespace::User::UserAvatarPaperclipFile'
|
67
|
+
end
|
68
|
+
|
69
|
+
it "has association" do
|
70
|
+
expect(@model.methods.include?(:paperclip_files)).to be_truthy
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
File without changes
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
##
|
4
|
+
## named subject 'association' is the SUT
|
5
|
+
# args can be
|
6
|
+
# [:table_name] The table name
|
7
|
+
#
|
8
|
+
shared_examples_for "major version API compatible" do |args|
|
9
|
+
table_name = args[:table_name]
|
10
|
+
describe "Major version compatible with table name '#{table_name}'" do
|
11
|
+
it "has table name '#{table_name}'" do
|
12
|
+
expect(association.instance_variable_get(:@database_table)).to eq table_name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
## named subject 'namespace' is the SUT
|
18
|
+
shared_examples_for "model in namespace" do |args|
|
19
|
+
describe "with default options" do
|
20
|
+
let!(:model_name){"#{namespace}User"}
|
21
|
+
let!(:attachment_name){'avatar'}
|
22
|
+
it_behaves_like "major version API compatible", :table_name => 'avatars'
|
23
|
+
end
|
24
|
+
describe "with custom model table_name" do
|
25
|
+
let(:model_name){"#{namespace}CUser"}
|
26
|
+
let(:model_table_name){'custom_users'}
|
27
|
+
let(:attachment_name){'avatar'}
|
28
|
+
it_behaves_like "major version API compatible", :table_name => 'avatars'
|
29
|
+
end
|
30
|
+
describe "with custom attachment table_name" do
|
31
|
+
let(:model_name){"#{namespace}AUser"}
|
32
|
+
let(:attachment_name){'avatar'}
|
33
|
+
let(:attachment_table_name){'custom_avatars'}
|
34
|
+
it_behaves_like "major version API compatible", :table_name => 'custom_avatars'
|
35
|
+
end
|
36
|
+
describe "with custom model table_name and custom attachment table_name" do
|
37
|
+
let(:model_name){"#{namespace}SUser"}
|
38
|
+
let(:model_table_name){'special_users'}
|
39
|
+
let(:attachment_name){'avatar'}
|
40
|
+
let(:attachment_table_name){'custom_avatars'}
|
41
|
+
it_behaves_like "major version API compatible", :table_name => 'custom_avatars'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "PaperclipDatabase" do
|
46
|
+
describe "backward compatibility" do
|
47
|
+
before(:example) do
|
48
|
+
@attachment_table_name = defined?(attachment_table_name) ? attachment_table_name : attachment_name.tableize
|
49
|
+
extra_paperclip_options = defined?(attachment_table_name)? {:database_table => attachment_table_name.to_sym} : {}
|
50
|
+
|
51
|
+
build_model model_name, (defined?(model_table_name)? model_table_name: nil), attachment_name.to_sym, extra_paperclip_options
|
52
|
+
@model_table_name = model_name.constantize.table_name
|
53
|
+
create_model_tables @model_table_name, @attachment_table_name, attachment_name
|
54
|
+
@model = model_name.constantize.new
|
55
|
+
file = File.open(fixture_file('5k.png'))
|
56
|
+
|
57
|
+
@model.send(:"#{attachment_name}=",file)
|
58
|
+
@model.save
|
59
|
+
end
|
60
|
+
subject(:association){@model.avatar}
|
61
|
+
after(:example) do
|
62
|
+
reset_activerecord
|
63
|
+
reset_database @model_table_name, @attachment_table_name
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "no namespace" do
|
67
|
+
subject(:namespace){''}
|
68
|
+
it_behaves_like "model in namespace"
|
69
|
+
end
|
70
|
+
describe "namespace '::'" do
|
71
|
+
subject(:namespace){'::'}
|
72
|
+
it_behaves_like "model in namespace"
|
73
|
+
end
|
74
|
+
describe "namespace 'Object::'" do
|
75
|
+
subject(:namespace){'Object::'}
|
76
|
+
it_behaves_like "model in namespace"
|
77
|
+
end
|
78
|
+
describe "namespace 'Namespace::'" do
|
79
|
+
before(:context) { Object.const_set('Namespace', Module.new()) }
|
80
|
+
after(:context) { Object.send(:remove_const, 'Namespace') }
|
81
|
+
subject(:namespace){'Namespace::'}
|
82
|
+
it_behaves_like "model in namespace"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "PaperclipDatabase" do
|
4
|
+
describe "Namespaced model" do
|
5
|
+
before(:context) do
|
6
|
+
Object.const_set('Namespace', Module.new())
|
7
|
+
create_model_tables :namespace_models, :namespace_model_avatars, 'avatar'
|
8
|
+
build_model 'Namespace::Model', 'namespace_models', :avatar, {:database_table => :namespace_model_avatars}
|
9
|
+
|
10
|
+
@model = Namespace::Model.new
|
11
|
+
file = File.open(fixture_file('5k.png'))
|
12
|
+
|
13
|
+
@model.avatar = file
|
14
|
+
@model.save
|
15
|
+
|
16
|
+
end
|
17
|
+
after(:context) do
|
18
|
+
reset_activerecord
|
19
|
+
reset_database :namespace_models, :namespace_model_avatars
|
20
|
+
Object.send(:remove_const, 'Namespace')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "has correct association name" do
|
24
|
+
expect(@model.avatar.instance_variable_get(:@paperclip_files_association_name)).to eq 'paperclip_files'
|
25
|
+
end
|
26
|
+
|
27
|
+
it "has correct model constant" do
|
28
|
+
expect(@model.avatar.instance_variable_get(:@paperclip_file_model).to_s).to eq 'Namespace::Model::NamespaceModelAvatarPaperclipFile'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "has correct table name" do
|
32
|
+
expect(@model.avatar.instance_variable_get(:@database_table)).to eq 'namespace_model_avatars'
|
33
|
+
end
|
34
|
+
|
35
|
+
it "has association" do
|
36
|
+
expect(@model.methods.include?(:paperclip_files)).to be_truthy
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "PaperclipDatabase" do
|
4
|
+
describe "Single table inheritance" do
|
5
|
+
before(:example) do
|
6
|
+
create_model_tables :users, :avatars
|
7
|
+
build_model 'User', nil, :avatar, {}
|
8
|
+
|
9
|
+
Object.const_set('SuperUser', Class.new(User))
|
10
|
+
|
11
|
+
@model = SuperUser.new
|
12
|
+
file = File.open(fixture_file('5k.png'))
|
13
|
+
|
14
|
+
@model.avatar = file
|
15
|
+
@model.save
|
16
|
+
end
|
17
|
+
after(:example) do
|
18
|
+
reset_activerecord
|
19
|
+
reset_database :users, :avatars
|
20
|
+
Object.send(:remove_const, 'SuperUser')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "has correct association name" do
|
24
|
+
expect(@model.avatar.instance_variable_get(:@paperclip_files_association_name)).to eq 'paperclip_files'
|
25
|
+
end
|
26
|
+
|
27
|
+
it "has correct model constant" do
|
28
|
+
expect(@model.avatar.instance_variable_get(:@paperclip_file_model).to_s).to eq 'User::UserAvatarPaperclipFile'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "has correct table name" do
|
32
|
+
expect(@model.avatar.instance_variable_get(:@database_table)).to eq 'avatars'
|
33
|
+
end
|
34
|
+
|
35
|
+
it "has association" do
|
36
|
+
expect(@model.methods.include?(:paperclip_files)).to be_truthy
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,11 +2,91 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
3
|
require 'rspec'
|
4
4
|
require 'paperclip_database'
|
5
|
+
require 'active_record'
|
6
|
+
require 'active_support'
|
7
|
+
require 'active_support/core_ext'
|
8
|
+
require 'yaml'
|
9
|
+
|
10
|
+
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
11
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
12
|
+
ActiveRecord::Base.establish_connection(config['test'])
|
13
|
+
Paperclip.options[:logger] = ActiveRecord::Base.logger
|
14
|
+
|
5
15
|
|
6
16
|
# Requires supporting files with custom matchers and macros, etc,
|
7
17
|
# in ./support/ and its subdirectories.
|
8
18
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
19
|
|
10
20
|
RSpec.configure do |config|
|
11
|
-
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def reset_activerecord
|
25
|
+
if Gem::Version.new(::ActiveModel::VERSION::STRING) < Gem::Version.new('3.1.0')
|
26
|
+
ActiveRecord::Base.descendants.each do |model|
|
27
|
+
model.reset_column_information
|
28
|
+
end
|
29
|
+
else
|
30
|
+
ActiveRecord::Base.clear_cache!
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def reset_database(*tables)
|
35
|
+
tables.each do |table|
|
36
|
+
ActiveRecord::Base.connection.drop_table table
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_model_tables(model_table_name, attachment_table_name, association_name = nil)
|
41
|
+
association_name ||= attachment_table_name.to_s.singularize
|
42
|
+
ActiveRecord::Base.connection.create_table model_table_name, :force => true do |table|
|
43
|
+
table.column :"#{association_name}_file_name", :string
|
44
|
+
table.column :"#{association_name}_content_type", :string
|
45
|
+
table.column :"#{association_name}_file_size", :integer
|
46
|
+
table.column :"#{association_name}_updated_at", :datetime
|
47
|
+
table.column :"#{association_name}_fingerprint", :string
|
48
|
+
end
|
49
|
+
single_model = model_table_name.to_s.singularize
|
50
|
+
ActiveRecord::Base.connection.create_table attachment_table_name, :force => true do |table|
|
51
|
+
table.column :"#{single_model}_id", :integer
|
52
|
+
table.column :style, :string
|
53
|
+
table.column :file_contents, :binary
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def build_model(name, table_name, attachment_name, paperclip_options)
|
58
|
+
reset_class(name, attachment_name).tap do |klass|
|
59
|
+
klass.table_name = table_name if table_name
|
60
|
+
klass.has_attached_file attachment_name, {:storage => :database}.merge(paperclip_options)
|
61
|
+
klass.validates_attachment_content_type attachment_name, :content_type => /\Aimage\/.*\Z/
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def reset_class class_name, attachment_name
|
66
|
+
if class_name.include? '::'
|
67
|
+
module_name = class_name[0...(class_name.rindex('::') || 0)]
|
68
|
+
class_module = module_name.constantize rescue Object
|
69
|
+
else
|
70
|
+
class_module = Object
|
71
|
+
end
|
72
|
+
class_name = class_name.demodulize
|
73
|
+
|
74
|
+
ActiveRecord::Base.send(:include, Paperclip::Glue)
|
75
|
+
if class_module.const_defined?(class_name)
|
76
|
+
old_klass = class_module.const_get(class_name)
|
77
|
+
paperclip_class_name = "#{old_klass.table_name.singularize}_#{attachment_name.to_s}_paperclip_file".classify
|
78
|
+
class_module.send(:remove_const, paperclip_class_name) rescue nil
|
79
|
+
class_module.send(:remove_const, class_name) rescue nil
|
80
|
+
end
|
81
|
+
klass = class_module.const_set(class_name, Class.new(ActiveRecord::Base))
|
82
|
+
|
83
|
+
klass.class_eval do
|
84
|
+
include Paperclip::Glue
|
85
|
+
end
|
86
|
+
|
87
|
+
klass
|
88
|
+
end
|
89
|
+
|
90
|
+
def fixture_file(filename)
|
91
|
+
File.join(File.dirname(__FILE__), 'fixtures', filename)
|
12
92
|
end
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paperclip_database
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jarl Friis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: paperclip
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.0
|
19
|
+
version: 2.3.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.0
|
26
|
+
version: 2.3.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
type: :
|
33
|
+
version: '3.1'
|
34
|
+
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '3.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: appraisal
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0
|
47
|
+
version: '1.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0
|
54
|
+
version: '1.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: mocha
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -225,25 +225,25 @@ files:
|
|
225
225
|
- gemfiles/rails32_paperclip3x.gemfile
|
226
226
|
- gemfiles/rails32_paperclip40.gemfile
|
227
227
|
- gemfiles/rails32_paperclip4x.gemfile
|
228
|
-
- gemfiles/
|
229
|
-
- gemfiles/rails40_paperclip3x.gemfile
|
230
|
-
- gemfiles/rails40_paperclip40.gemfile
|
228
|
+
- gemfiles/rails40_paperclip42.gemfile
|
231
229
|
- gemfiles/rails40_paperclip4x.gemfile
|
230
|
+
- gemfiles/rails41_paperclip42.gemfile
|
231
|
+
- gemfiles/rails41_paperclip4x.gemfile
|
232
232
|
- lib/generators/paperclip_database/migration/USAGE
|
233
233
|
- lib/generators/paperclip_database/migration/migration_generator.rb
|
234
234
|
- lib/generators/paperclip_database/migration/templates/migration.rb.erb
|
235
235
|
- lib/paperclip/storage/database.rb
|
236
236
|
- lib/paperclip_database.rb
|
237
|
-
- lib/paperclip_database/deconstantize.rb
|
238
237
|
- lib/paperclip_database/version.rb
|
239
238
|
- paperclip_database.gemspec
|
240
239
|
- rails/init.rb
|
241
|
-
- spec/
|
240
|
+
- spec/database.yml
|
241
|
+
- spec/default_options_spec.rb
|
242
|
+
- spec/fixtures/5k.png
|
243
|
+
- spec/major_version_API_spec.rb
|
244
|
+
- spec/namespaced_models_spec.rb
|
245
|
+
- spec/single_table_inheritance_spec.rb
|
242
246
|
- spec/spec_helper.rb
|
243
|
-
- test/database.yml
|
244
|
-
- test/fixtures/5k.png
|
245
|
-
- test/namespaced_models_test.rb
|
246
|
-
- test/test_helper.rb
|
247
247
|
homepage: https://github.com/softace/paperclip_database
|
248
248
|
licenses:
|
249
249
|
- MIT
|
@@ -1,11 +0,0 @@
|
|
1
|
-
|
2
|
-
module PaperclipDatabase
|
3
|
-
# This function only appears in Rails >= 3.2.1, so define our own copy here
|
4
|
-
def self.deconstantize(path)
|
5
|
-
if Gem::Version.new(::Rails::VERSION::STRING) >= Gem::Version.new('3.2.1')
|
6
|
-
path.deconstantize
|
7
|
-
else
|
8
|
-
path.to_s[0...(path.rindex('::') || 0)]
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|