citrusbyte-milton 0.1.2 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -35,6 +35,7 @@ module Citrusbyte
35
35
  end
36
36
  end
37
37
 
38
+ # These get mixed in to your model when you use Milton
38
39
  module InstanceMethods
39
40
  # Sets the filename to the given filename (sanitizes the given filename
40
41
  # as well)
@@ -108,6 +109,9 @@ module Citrusbyte
108
109
  end
109
110
  end
110
111
 
112
+ attr_accessor :filename
113
+ attr_accessor :attachment
114
+
111
115
  # TODO: can probably fanagle a way to only pass a reference to the model
112
116
  # and not need the filename (or better yet just the filename and
113
117
  # decouple)
@@ -120,7 +124,7 @@ module Citrusbyte
120
124
  # If no options are given then returns the path and filename to the
121
125
  # original file.
122
126
  def path(options={})
123
- options.empty? ? File.join(dirname, @filename) : Derivative.new(@filename, options).path
127
+ options.empty? ? File.join(dirname, filename) : Derivative.new(filename, options).path
124
128
  end
125
129
 
126
130
  # Returns the full directory path up to the file, w/o the filename.
@@ -136,7 +140,6 @@ module Citrusbyte
136
140
  # Removes the file from the underlying file system and any derivatives of
137
141
  # the file.
138
142
  def destroy
139
- destroy_derivatives
140
143
  destroy_file
141
144
  end
142
145
 
@@ -149,7 +152,7 @@ module Citrusbyte
149
152
  # Returns the partitioned path segment based on the id of the model
150
153
  # this file is attached to.
151
154
  def partitioned_path
152
- self.class.partition(@attachment.id)
155
+ self.class.partition(self.attachment.id)
153
156
  end
154
157
 
155
158
  # The full path to the root of where files will be stored on disk.
@@ -162,30 +165,18 @@ module Citrusbyte
162
165
  self.class.recreate_directory(dirname) unless File.exists?(dirname)
163
166
  end
164
167
 
165
- # Removes the file from the filesystem.
168
+ # Removes the containing directory from the filesystem (and hence the
169
+ # file and any derivatives)
166
170
  def destroy_file
167
- FileUtils.rm path if File.exists?(path)
171
+ FileUtils.rm_rf dirname if File.exists?(dirname)
168
172
  end
169
-
170
- # Derivatives of this Attachment ====================================
171
173
 
172
- # Returns an array of derivatives of this attachment
174
+ # Returns an array of Derivatives of this AttachableFile.
173
175
  def derivatives
174
- Dir.glob(Derivative.dirname_for(path)).collect do |filename|
176
+ Dir.glob(dirname + '/*').reject{ |filename| filename == self.filename }.collect do |filename|
175
177
  Derivative.from_filename(filename)
176
178
  end
177
179
  end
178
-
179
- # Recreates the directory derivatives of this file will be stored in.
180
- def recreate_derivative_directory
181
- dirname = Derivative.dirname_for(path)
182
- self.class.recreate_directory(dirname) unless File.exists?(dirname)
183
- end
184
-
185
- # Removes the derivatives folder for this file and all files within.
186
- def destroy_derivatives
187
- FileUtils.rm_rf dirname if File.exists?(dirname)
188
- end
189
180
  end
190
181
 
191
182
  # Represents a file created on the file system that is a derivative of the
@@ -198,7 +189,7 @@ module Citrusbyte
198
189
  # Files created as derivatives have their creation options appended into
199
190
  # their filenames so it can be checked later if a file w/ the given
200
191
  # options already exists (so as not to create it again).
201
- #
192
+ #
202
193
  class Derivative
203
194
  attr_reader :options
204
195
 
@@ -231,29 +222,24 @@ module Citrusbyte
231
222
  def from_filename(filename)
232
223
  Derivative.new(filename, options_from(extract_options_from(filename)))
233
224
  end
234
-
235
- # Gives the path to where derivatives of this file are stored.
236
- # Derivatives are any files which are based off of this file but are
237
- # not Attachments themselves (i.e. thumbnails, transcoded copies,
238
- # etc...)
239
- def dirname_for(path)
240
- File.join(File.dirname(path), File.basename(path, File.extname(path)))
241
- end
242
225
  end
243
226
 
227
+ # Instantiate a new Derivative, takes a reference to the AttachableFile
228
+ # (or specialization class) that this will be a derivative of, and a hash
229
+ # of the options defining the derivative.
244
230
  def initialize(file, options)
245
231
  @file = file
246
232
  @options = options
247
233
  end
248
234
 
249
- # The filename of this Derivative with embedded options.
235
+ # The resulting filename of this Derivative with embedded options.
250
236
  def filename
251
237
  self.class.filename_for(@file.path, options)
252
238
  end
253
239
 
254
240
  # The full path and filename to this Derivative.
255
241
  def path
256
- File.join(Derivative.dirname_for(@file.path), filename)
242
+ File.join(@file.dirname, filename)
257
243
  end
258
244
 
259
245
  # Returns true if the file resulting from this Derivative exists.
@@ -112,7 +112,6 @@ module Citrusbyte
112
112
  def save
113
113
  return true if self.saved?
114
114
  recreate_directory
115
- recreate_derivative_directory
116
115
  File.cp(temp_path, path)
117
116
  File.chmod(self.class.options[:chmod], path)
118
117
  @has_been_saved = true
@@ -4,7 +4,6 @@ describe Attachment do
4
4
  describe "being destroyed" do
5
5
  before :each do
6
6
  @attachment = Attachment.create :file => upload('milton.jpg')
7
- @derivative_path = File.dirname(@attachment.path) + '/milton'
8
7
  end
9
8
 
10
9
  it "should delete the underlying file from the filesystem" do
@@ -12,13 +11,12 @@ describe Attachment do
12
11
  File.exists?(@attachment.path).should be_false
13
12
  end
14
13
 
15
- it "should have a derivative path before being destroyed" do
16
- File.exists?(@derivative_path).should be_true
17
- end
18
-
19
- it "should delete the derivative folder from the filesystem" do
14
+ # the partitioning algorithm ensures that each attachment model has its own
15
+ # folder, so we can safely delete the folder, if you write a new
16
+ # partitioner this might change!
17
+ it "should delete the directory containing the file and all derivatives from the filesystem" do
20
18
  @attachment.destroy
21
- File.exists?(@derivative_path).should be_false
19
+ File.exists?(File.dirname(@attachment.path)).should be_false
22
20
  end
23
21
  end
24
22
 
@@ -117,15 +117,11 @@ describe Citrusbyte::Milton::IsResizeable do
117
117
  end
118
118
 
119
119
  it "should use the partitioned path when grabbing the original file" do
120
- @image.path.should =~ /\/\d+\/\d+\/milton.jpg$/
120
+ @image.path.should =~ /\/#{Citrusbyte::Milton::AttachableFile.partition(@image.id)}\/milton.jpg$/
121
121
  end
122
122
 
123
- it "should use the partitioned path and derivative path when grabbing a thubmnail" do
124
- @image.path(:size => '10x10', :crop => true).should =~ /\/milton\/milton.crop=true_size=10x10.jpg$/
125
- end
126
-
127
- it "should append source filename to thumbnail path" do
128
- @image.path(:size => '10x10').should =~ /\/milton\/milton.size=10x10.jpg$/
123
+ it "should use the partitioned path when grabbing a thubmnail" do
124
+ @image.path(:size => '10x10', :crop => true).should =~ /\/#{Citrusbyte::Milton::AttachableFile.partition(@image.id)}\/milton.crop=true_size=10x10.jpg$/
129
125
  end
130
126
  end
131
127
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: citrusbyte-milton
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Alavi