sequel_paperclip 0.2.0 → 0.3.0

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -2,14 +2,15 @@ module Sequel
2
2
  module Plugins
3
3
  module Paperclip
4
4
  class Attachment
5
+ attr_reader :model
5
6
  attr_reader :name
6
7
  attr_reader :options
7
- attr_accessor :processors
8
+ attr_reader :queued_file
8
9
 
9
10
  STORAGE_UPDATE_SAVE = 1
10
11
  STORAGE_UPDATE_DELETE = 2
11
-
12
- def initialize(name, options = {})
12
+
13
+ def self.preprocess_options(options = {})
13
14
  unless options[:styles]
14
15
  options[:styles] = {
15
16
  :original => {}
@@ -24,58 +25,74 @@ module Sequel
24
25
  ]
25
26
  end
26
27
 
27
- @name = name
28
- @options = options
29
- self.processors = []
30
- options[:processors].each do |processor|
31
- klass = "Sequel::Plugins::Paperclip::Processors::#{processor[:type].to_s.capitalize}"
32
- self.processors << klass.constantize.new(self, processor)
28
+ options[:processors].each_with_index do |processor, i|
29
+ if processor.is_a?(Hash)
30
+ klass = "Sequel::Plugins::Paperclip::Processors::#{processor[:type].to_s.capitalize}"
31
+ options[:processors][i] = klass.constantize.new(self, processor)
32
+ end
33
33
  end
34
+ end
35
+
36
+ def initialize(model, name, preprocessed_options)
37
+ @model = model
38
+ @name = name
39
+ @options = preprocessed_options
34
40
  @storage_updates = []
35
41
  end
36
42
 
37
- def process(model, src_path)
38
- processors.each do |processor|
39
- processor.pre_runs(model, src_path)
43
+ def set(file)
44
+ unless file.is_a?(File) || file.is_a?(Tempfile)
45
+ raise ArgumentError, "#{name}: #{file} is not a File"
46
+ end
47
+
48
+ @queued_file = file
49
+ end
50
+
51
+ def destroy
52
+ if exists?
40
53
  options[:styles].each_pair do |style, style_options|
41
- tmp_file = Tempfile.new("paperclip")
42
- puts "processing #{name} for style #{style} with processor #{processor.name}"
43
- processor.run(style, style_options, tmp_file)
44
54
  @storage_updates << {
45
- :type => STORAGE_UPDATE_SAVE,
46
- :src_file => tmp_file,
47
- :dst_path => path(model, style),
55
+ :type => STORAGE_UPDATE_DELETE,
56
+ :path => path(style),
48
57
  }
49
58
  end
50
- processor.post_runs
51
59
  end
52
- end
53
60
 
54
- def destroy(model)
55
- return unless exists?(model)
56
-
57
- options[:styles].each_pair do |style, style_options|
58
- @storage_updates << {
59
- :type => STORAGE_UPDATE_DELETE,
60
- :path => path(model, style),
61
- }
62
- end
63
- model.send("#{name}_basename=", nil)
61
+ @queued_file = nil
64
62
  end
65
63
 
66
- def exists?(model)
64
+ def exists?
67
65
  !!model.send("#{name}_basename")
68
66
  end
69
67
 
70
- def path(model, style)
68
+ def path(style)
71
69
  Interpolations.interpolate(options[:path], self, model, style)
72
70
  end
73
71
 
74
- def url(model, style)
72
+ def url(style)
75
73
  Interpolations.interpolate(options[:url], self, model, style)
76
74
  end
77
75
 
78
- def update_storage(model)
76
+ def process
77
+ return unless @queued_file
78
+ src_path = @queued_file.path
79
+ options[:processors].each do |processor|
80
+ processor.pre_runs(model, src_path)
81
+ options[:styles].each_pair do |style, style_options|
82
+ tmp_file = Tempfile.new("paperclip")
83
+ puts "processing #{name} for style #{style} with processor #{processor.name}"
84
+ processor.run(style, style_options, tmp_file)
85
+ @storage_updates << {
86
+ :type => STORAGE_UPDATE_SAVE,
87
+ :src_file => tmp_file,
88
+ :dst_path => path(style),
89
+ }
90
+ end
91
+ processor.post_runs
92
+ end
93
+ end
94
+
95
+ def update_storage
79
96
  @storage_updates.each do |update|
80
97
  case update[:type]
81
98
  when STORAGE_UPDATE_SAVE
@@ -13,14 +13,16 @@ module Sequel
13
13
  def self.configure(model, opts={}, &block)
14
14
  model.class_inheritable_hash :attachments
15
15
  model.attachments = {}
16
+
17
+ model.send(:attr_accessor, :attachment_instances)
16
18
  end
17
19
 
18
20
  module ClassMethods
19
21
  def attachment(name, options)
20
22
  attr_accessor name
21
23
 
22
- attachment = Attachment.new(name, options)
23
- attachments[name] = attachment
24
+ Attachment.preprocess_options(options)
25
+ self.attachments[name] = options
24
26
 
25
27
  columns = db_schema.keys
26
28
  unless columns.include?(:"#{name}_filename") || columns.include?(:"#{name}_basename")
@@ -63,77 +65,87 @@ module Sequel
63
65
  end
64
66
  end
65
67
 
68
+ define_method("#{name}_attachment_instance") do
69
+ self.attachment_instances ||= {}
70
+ self.attachment_instances[name] ||= Attachment.new(self, name, options)
71
+ end
72
+
73
+ define_method("#{name}") do
74
+ attachment = send("#{name}_attachment_instance")
75
+ attachment.exists? ? attachment : nil
76
+ end
77
+
66
78
  define_method("#{name}=") do |value|
67
- if !value && attachment.exists?(self)
68
- attachment.destroy(self)
79
+ attachment = send("#{name}_attachment_instance")
80
+
81
+ if value
82
+ basename = send("#{name}_basename")
83
+ if basename.blank?
84
+ basename = ActiveSupport::SecureRandom.hex(4).to_s
85
+ send("#{name}_basename=", basename)
86
+ end
87
+
88
+ if respond_to?("#{name}_filename")
89
+ send("#{name}_filename=", basename+File.extname(file.original_filename).downcase)
90
+ end
91
+
92
+ if respond_to?("#{name}_filesize")
93
+ send("#{name}_filesize=", file.size)
94
+ end
95
+
96
+ if respond_to?("#{name}_originalname")
97
+ send("#{name}_originalname=", file.original_filename)
98
+ end
99
+
100
+ attachment.set(value)
101
+ else
102
+ attachment.destroy
103
+
104
+ send("#{name}_basename=", nil)
69
105
  end
70
- instance_variable_set("@#{name}", value);
71
106
 
72
107
  # force sequel to call the hooks
73
108
  modified!
74
109
  end
75
110
 
76
111
  define_method("#{name}?") do
77
- attachment.exists?(self)
112
+ attachment = send("#{name}_attachment_instance")
113
+ attachment.exists?
78
114
  end
79
115
 
80
116
  define_method("#{name}_url") do |style|
81
- attachment.url(self, style)
117
+ attachment = send("#{name}_attachment_instance")
118
+ attachment.url(style)
82
119
  end
83
120
 
84
121
  define_method("#{name}_path") do |style|
85
- attachment.path(self, style)
122
+ attachment = send("#{name}_attachment_instance")
123
+ attachment.path(style)
86
124
  end
87
125
  end
88
126
  end
89
127
 
90
- module InstanceMethods
91
- def before_save
92
- self.class.attachments.each_value do |attachment|
93
- file = send(attachment.name)
94
- if file
95
- unless file.is_a?(File) || file.is_a?(Tempfile)
96
- raise ArgumentError, "#{attachment.name} is not a File"
97
- end
98
-
99
- basename = send("#{attachment.name}_basename")
100
- if basename.blank?
101
- basename = ActiveSupport::SecureRandom.hex(4).to_s
102
- send("#{attachment.name}_basename=", basename)
103
- end
104
-
105
- if respond_to?("#{attachment.name}_filename")
106
- send("#{attachment.name}_filename=", basename+File.extname(file.original_filename).downcase)
107
- end
108
-
109
- if respond_to?("#{attachment.name}_filesize")
110
- send("#{attachment.name}_filesize=", file.size)
111
- end
112
-
113
- if respond_to?("#{attachment.name}_originalname")
114
- send("#{attachment.name}_originalname=", file.original_filename)
115
- end
116
- end
117
- end
118
- super
119
- end
120
-
128
+ module InstanceMethods
121
129
  def after_save
122
- self.class.attachments.each_value do |attachment|
123
- file = send(attachment.name)
124
- if file
125
- attachment.process(self, file.path)
130
+ if attachment_instances
131
+ attachment_instances.each_value do |attachment|
132
+ attachment.process
133
+ attachment.update_storage
126
134
  end
127
-
128
- attachment.update_storage(self)
129
135
  end
130
136
  super
131
137
  end
132
138
 
133
139
  def after_destroy
134
- self.class.attachments.each_value do |attachment|
135
- send("#{attachment.name}=", nil)
136
- attachment.update_storage(self)
140
+ self.class.attachments.each_key do |name|
141
+ attachment = send("#{name}_attachment_instance")
142
+ attachment.destroy
143
+ end
144
+
145
+ if attachment_instances
146
+ attachment_instances.each_value do |attachment|
147
+ attachment.update_storage
148
+ end
137
149
  end
138
150
  super
139
151
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sequel_paperclip}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Corin Langosch"]
12
- s.date = %q{2010-09-14}
12
+ s.date = %q{2010-09-21}
13
13
  s.description = %q{Sequel plugin which provides Paperclip (attachments, thumbnail resizing, etc.) functionality for model.}
14
14
  s.email = %q{info@netskin.com}
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
7
+ - 3
8
8
  - 0
9
- version: 0.2.0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Corin Langosch
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-14 00:00:00 +01:00
17
+ date: 2010-09-21 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency