fast 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -20,8 +20,16 @@ Don't install right now, as 13-09-2011 this is pre-alpha, but in intensive devel
20
20
  <tt>Fast::Dir</tt> is a subclass of <tt>Array</tt>, usable as a hash, and <tt>Fast::File</tt> if a subclass of String.
21
21
 
22
22
  == Quick notes
23
+ * Move all Fast code to fast/main.rb. Update Metafun/Delegator so it will inject the #delegate method into every Object instance. Reduce the "fast.rb" to a call to external libraries, fast/main and DSLization via #delegate.
24
+ * Describe the SubSetter pattern for filtering.
23
25
  * File lists as returned by Fast::Dir#list and Fast::Dir#dirs will be filtered after the list is retrieved by a set of filtering methods of the returned list, which should be an instance of Fast::Dir.
24
26
  * An instance of Fast::Dir should be possible to be created from a Array.
27
+ * The path can be setted indirectly by any method of Fast::File instances, and the same works for Dir. This is fine because allows for very quick calls, but once an instance gets a path setted it should be fixed and raise an exception in case some other method call is trying to change it.
28
+
29
+ == Remote future
30
+ * Make Fast a REST client (well, use <tt>rest-client</tt>) in order to transparently use files and directories from a compliant REST server.
31
+ * Include REST methods: Dir#post, File#get, File#head, etc
32
+ * Allow Files to behave as Dirs with the right method calls
25
33
 
26
34
  == License
27
35
 
data/lib/fast/dir.rb CHANGED
@@ -46,41 +46,60 @@ module Fast
46
46
  end
47
47
 
48
48
  # Creates the dir, if it doesn't exist. Otherwise remains silent
49
- def create path = nil
50
- @path = normalize path if path
51
- route = []
52
- @path.split("/").each do |part|
53
- unless part.empty?
54
- route << part
55
- unless ::File.directory? route.join "/"
56
- ::Dir.mkdir route.join "/"
57
- end
49
+ # Returns the last dir path passed as argument
50
+ def create *args
51
+ if args.length > 0
52
+ return_me = nil
53
+ args.each do |path|
54
+ return_me = do_create path
58
55
  end
59
- end unless ::File.directory? @path
60
- self
56
+ return return_me
57
+ else
58
+ do_create
59
+ end
61
60
  end
62
61
 
63
62
  alias :create! :create
64
63
 
65
64
  # Deletes the directory along with all its content. Powerful, simple, risky!
66
- def delete path = nil
67
- @path = normalize path if path
68
- Dir.new.list @path do |entry|
69
- if ::File.directory? "#{@path}/#{entry}"
70
- Dir.new.delete "#{@path}/#{entry}"
71
- else
72
- ::File.unlink "#{@path}/#{entry}"
65
+ # Many arguments can be passed
66
+ def delete *args
67
+ if args.length > 0
68
+ return_me = nil
69
+ args.each do |path|
70
+ return_me = do_delete path
73
71
  end
72
+ return return_me
73
+ else
74
+ do_delete
74
75
  end
75
- ::Dir.unlink @path
76
- @path
77
76
  end
78
77
 
79
- alias :delete! :delete
80
78
  alias :destroy :delete
81
79
  alias :del :delete
82
80
  alias :unlink :delete
83
81
 
82
+ # Like #delete, but raises no error if some directory is missing
83
+ def delete! *args
84
+ if args.length > 0
85
+ return_me = nil
86
+ args.each do |path|
87
+ begin
88
+ return_me = do_delete path
89
+ rescue
90
+ return_me = nil
91
+ end
92
+ end
93
+ return return_me
94
+ else
95
+ begin
96
+ do_delete
97
+ rescue
98
+ nil
99
+ end
100
+ end
101
+ end
102
+
84
103
  # Checks for existence. True if the directory exists, false otherwise
85
104
  def exist? path = nil
86
105
  @path = normalize path if path
@@ -109,9 +128,111 @@ module Fast
109
128
 
110
129
  alias :absolute :expand
111
130
 
131
+ # Returns the path to the dir, if defined
132
+ def path
133
+ @path if @path
134
+ end
135
+
136
+ # Renames this dir into the target path, unless the target path
137
+ # points to an existing dir.
138
+ def rename *args
139
+ if args.length > 1
140
+ current, target = *args
141
+ @path = normalize current
142
+ target = normalize target
143
+ else
144
+ target = normalize args.first
145
+ end
146
+
147
+ raise ArgumentError, "The target directory '#{target}' already exists" if Dir.new.exist? target
148
+ do_rename_to target
149
+ end
150
+
151
+ # Renames this dir into the target path: overwrites the target dir
152
+ # if it exists
153
+ def rename! *args
154
+ if args.length > 1
155
+ current, target = *args
156
+ @path = normalize current
157
+ target = normalize target
158
+ else
159
+ target = normalize args.first
160
+ end
161
+ Dir.new.delete! target if Dir.new.exist? target
162
+ do_rename_to target
163
+ end
164
+
165
+ # Merges the target dir into this
166
+ def merge *args
167
+ if args.length > 1
168
+ current, target = *args
169
+ @path = normalize current
170
+ target = normalize target
171
+ else
172
+ target = normalize args.first
173
+ end
174
+
175
+ Dir.new.list target do |entry|
176
+ unless Dir.new.exist? "#{target}/#{entry}"
177
+ File.new.rename "#{target}/#{entry}", "#{@path}/#{entry}"
178
+ else
179
+ Dir.new.rename "#{target}/#{entry}", "#{@path}/#{entry}"
180
+ end
181
+ end
182
+
183
+ Dir.new.delete target
184
+ end
185
+
112
186
  private
187
+ def do_delete path = nil
188
+ @path = normalize path if path
189
+ Dir.new.list @path do |entry|
190
+ if ::File.directory? "#{@path}/#{entry}"
191
+ Dir.new.delete "#{@path}/#{entry}"
192
+ else
193
+ ::File.unlink "#{@path}/#{entry}"
194
+ end
195
+ end
196
+ ::Dir.unlink @path
197
+ @path
198
+ end
199
+
200
+ def do_create path = nil
201
+ @path = normalize path if path
202
+ route = []
203
+ @path.split("/").each do |part|
204
+ unless part.empty?
205
+ route << part
206
+ unless ::File.directory? route.join "/"
207
+ ::Dir.mkdir route.join "/"
208
+ end
209
+ end
210
+ end unless ::File.directory? @path
211
+ self
212
+ end
213
+
214
+ def do_rename_to target
215
+ # 1. Create the target dir
216
+ target_dir = Dir.new.create! target
217
+
218
+ # 2. Move all files
219
+ files do |file|
220
+ File.new.rename "#{@path}/#{file}", "#{target_dir}/#{file}"
221
+ end
222
+
223
+ # 3. Rename recursively all dirs
224
+ dirs do |dir|
225
+ Dir.new.rename "#{@path}/#{dir}", "#{target_dir}/#{dir}"
226
+ end
227
+
228
+ # 4. Delete current dir
229
+ self.delete!
230
+
231
+ target_dir
232
+ end
233
+
113
234
  def normalize path
114
- @path = "#{path}"
235
+ "#{path}"
115
236
  end
116
237
  end
117
238
  end
data/lib/fast/file.rb CHANGED
@@ -5,7 +5,8 @@ module Fast
5
5
  # Initializes the file
6
6
  def initialize source = nil
7
7
  unless source.nil?
8
- super( "#{source}" )
8
+ super( "#{source}" )
9
+ @path = normalize source
9
10
  else
10
11
  super()
11
12
  end
@@ -25,7 +26,23 @@ module Fast
25
26
  ::File.open @path, "a" do |handler|
26
27
  handler.write content
27
28
  end
28
- @path
29
+ self
30
+ end
31
+
32
+ # Writes data into the file. If is does not exist, creates it
33
+ # if it already exists, overwrites it!
34
+ def write *args
35
+ if args.length > 1
36
+ path, content = *args
37
+ @path = normalize path
38
+ else
39
+ content = args.first
40
+ end
41
+ Fast.dir! ::File.dirname @path if ::File.dirname(@path) != "."
42
+ ::File.open @path, "w" do |handler|
43
+ handler.write content
44
+ end
45
+ self
29
46
  end
30
47
 
31
48
  # Deletes the file (wrapper for `File.unlink <path>`)
@@ -55,7 +72,7 @@ module Fast
55
72
  alias :create! :touch
56
73
 
57
74
  # Returns the contents of the file, all at once
58
- def read path
75
+ def read path = nil
59
76
  @path = normalize path if path
60
77
  ::File.read @path
61
78
  end
@@ -67,6 +84,8 @@ module Fast
67
84
  end
68
85
 
69
86
  alias :exists? :exist?
87
+ alias :exist_all? :exist?
88
+ alias :exist_any? :exist?
70
89
 
71
90
  # Sends self to a FileFilter filter
72
91
  def filter
@@ -83,6 +102,41 @@ module Fast
83
102
 
84
103
  alias :absolute :expand
85
104
 
105
+ # Renames the file (by Fast::File own means, it does not call
106
+ # the underlying OS). Fails if the new path is an existent file
107
+ def rename *args
108
+ if args.length > 1
109
+ path, new_path = *args
110
+ @path = normalize path
111
+ new_path = normalize new_path
112
+ else
113
+ new_path = normalize args.first
114
+ end
115
+ raise ArgumentError, "The file '#{new_path}' already exists" if File.new.exists? new_path
116
+ renamed = File.new.write new_path, self.read
117
+ self.delete!
118
+ return renamed
119
+ end
120
+
121
+ # Like #rename, but overwrites the new file if is exist
122
+ def rename! *args
123
+ if args.length > 1
124
+ path, new_path = *args
125
+ @path = normalize path
126
+ new_path = normalize new_path
127
+ else
128
+ new_path = normalize args.first
129
+ end
130
+ renamed = File.new.write new_path, self.read
131
+ self.delete!
132
+ return renamed
133
+ end
134
+
135
+ # Returns the path to the current file
136
+ def path
137
+ @path if @path
138
+ end
139
+
86
140
  private
87
141
  def normalize path
88
142
  "#{path}"
data/lib/fast/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fast
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/fast.rb CHANGED
@@ -50,6 +50,10 @@ module Fast
50
50
  File.new.exist? path
51
51
  end
52
52
 
53
+ def self.file! path
54
+ File.new.touch path
55
+ end
56
+
53
57
  # Returns an instance of Fast::File and passed all methods
54
58
  # and arguments to it
55
59
  def self.file *args
@@ -59,4 +63,4 @@ end
59
63
 
60
64
  include Metafun::Delegator
61
65
 
62
- delegate Fast, :dir, :dir?, :dir!, :file, :file?
66
+ delegate Fast, :dir, :dir?, :dir!, :file, :file?, :file!
@@ -0,0 +1,22 @@
1
+ require "fast"
2
+ require "zucker/os"
3
+
4
+ describe Fast::DirFilter do
5
+ describe "#extension" do
6
+ context "when given a list of file names and a extension" do
7
+ it "should return a list of the files with the given extension"
8
+ end
9
+ end
10
+
11
+ # VERY IMPORTANT: DirFilter should extend a class ListFilter
12
+ # #match implementation (along with a short list of other things) should
13
+ # be done in ListFilter, not in DirFilter
14
+ #
15
+ # The SubSetter pattern is still not defined nor implemented: I'll start by
16
+ # finishing Fast and after that I'll dig deeper into SubSetting
17
+ describe "#match" do
18
+ context "when given a list of strings and a regexp" do
19
+ it "should return a list containing the strings that match the expression"
20
+ end
21
+ end
22
+ end
@@ -149,6 +149,22 @@ describe Fast::Dir do
149
149
  ::Dir.unlink "demo"
150
150
  end
151
151
  end
152
+
153
+ it "should work with several arguments" do
154
+ Fast::Dir.new.should_not exist :demo
155
+ Fast::Dir.new.should_not exist :alt
156
+ Fast::Dir.new.should_not exist :other
157
+
158
+ Fast::Dir.new.send @method, :demo, :alt, :other
159
+
160
+ Fast::Dir.new.should exist :demo
161
+ Fast::Dir.new.should exist :alt
162
+ Fast::Dir.new.should exist :other
163
+
164
+ Fast::Dir.new.delete! :demo
165
+ Fast::Dir.new.delete! :alt
166
+ Fast::Dir.new.delete! :other
167
+ end
152
168
  end
153
169
 
154
170
  describe "#create" do
@@ -191,13 +207,7 @@ describe Fast::Dir do
191
207
  end
192
208
 
193
209
 
194
- shared_examples_for "any dir deletion" do
195
- it "should fail if the directory does not exist" do
196
- ::File.should_not be_directory "demo"
197
- expect { Fast::Dir.new.send @method, "demo"
198
- }.to raise_error
199
- end
200
-
210
+ shared_examples_for "any dir deletion" do
201
211
  it "should delete the directory if it exists" do
202
212
  ::File.should_not be_directory "demo"
203
213
  Fast::Dir.new.create "demo"
@@ -227,31 +237,71 @@ describe Fast::Dir do
227
237
  Fast::Dir.new.create "demo"
228
238
  Fast::Dir.new.send( @method, "demo" ).should == "demo"
229
239
  end
240
+
241
+ it "should work with several arguments" do
242
+ Fast::Dir.new.should_not exist :demo
243
+ Fast::Dir.new.should_not exist :alt
244
+ Fast::Dir.new.should_not exist :other
245
+
246
+ Fast::Dir.new.create! :demo, :alt, :other
247
+ Fast::Dir.new.send @method, :demo, :alt, :other
248
+
249
+ Fast::Dir.new.should_not exist :demo
250
+ Fast::Dir.new.should_not exist :alt
251
+ Fast::Dir.new.should_not exist :other
252
+ end
230
253
  end
231
254
 
232
255
  describe "#delete" do
233
256
  before :each do @method = :delete end
234
257
  it_behaves_like "any dir deletion"
258
+
259
+ it "should fail if the directory does not exist" do
260
+ ::File.should_not be_directory "demo"
261
+ expect { Fast::Dir.new.send @method, "demo"
262
+ }.to raise_error
263
+ end
235
264
  end
236
265
 
237
266
  describe "#delete!" do
238
267
  before :each do @method = :delete! end
239
268
  it_behaves_like "any dir deletion"
269
+
270
+ it "should not fail even if the directory does not exist" do
271
+ Fast::Dir.new.should_not exist :demo
272
+ Fast::Dir.new.delete! :demo
273
+ end
240
274
  end
241
275
 
242
276
  describe "#del" do
243
277
  before :each do @method = :del end
244
278
  it_behaves_like "any dir deletion"
279
+ it "should fail if the directory does not exist" do
280
+ ::File.should_not be_directory "demo"
281
+ expect { Fast::Dir.new.send @method, "demo"
282
+ }.to raise_error
283
+ end
245
284
  end
246
285
 
247
286
  describe "#destroy" do
248
287
  before :each do @method = :destroy end
249
288
  it_behaves_like "any dir deletion"
289
+ it "should fail if the directory does not exist" do
290
+ ::File.should_not be_directory "demo"
291
+ expect { Fast::Dir.new.send @method, "demo"
292
+ }.to raise_error
293
+ end
250
294
  end
251
295
 
252
296
  describe "#unlink" do
253
297
  before :each do @method = :unlink end
254
298
  it_behaves_like "any dir deletion"
299
+
300
+ it "should fail if the directory does not exist" do
301
+ ::File.should_not be_directory "demo"
302
+ expect { Fast::Dir.new.send @method, "demo"
303
+ }.to raise_error
304
+ end
255
305
  end
256
306
 
257
307
  shared_examples_for "any dir existencialism" do
@@ -323,10 +373,180 @@ describe Fast::Dir do
323
373
  it_behaves_like "any dir absolutizer"
324
374
  end
325
375
 
376
+ describe "#path" do
377
+ context "the path is setted" do
378
+ it "should return the path" do
379
+ the_dir = Fast::Dir.new "demo"
380
+ the_dir.path.should == "demo"
381
+ end
382
+ end
383
+
384
+ context "the path is undefined" do
385
+ it "should return nil" do
386
+ the_dir = Fast::Dir.new
387
+ the_dir.path.should be_nil
388
+ end
389
+ end
390
+ end
391
+
392
+ shared_examples_for "any dir renaming" do
393
+ it "should delete current dir and target dir should exist" do
394
+ Fast::Dir.new.should_not exist "demo"
395
+ Fast::Dir.new.should_not exist "renamed"
396
+ Fast::Dir.new.create! "demo"
397
+ Fast::Dir.new.send @method, "demo", "renamed"
398
+ Fast::Dir.new.should_not exist "demo"
399
+ Fast::Dir.new.should exist "renamed"
400
+ Fast::Dir.new.delete! "renamed"
401
+ end
402
+
403
+ it "should return a dir with the new dirs name" do
404
+ Fast::Dir.new.should_not exist "demo"
405
+ Fast::Dir.new.should_not exist "renamed"
406
+ Fast::Dir.new.create! "demo"
407
+ Fast::Dir.new.send( @method, "demo", "renamed" ).path.should == "renamed"
408
+ Fast::Dir.new.delete! "renamed"
409
+ end
410
+
411
+ it "should contain the same data the target as the source" do
412
+ Fast::Dir.new.should_not exist "demo"
413
+ Fast::Dir.new.should_not exist "renamed"
414
+ Fast::File.new.touch "demo/content.file"
415
+ Fast::File.new.touch "demo/in/subdir/more.content"
416
+ Fast::File.new.touch "demo/hope.txt"
417
+
418
+ Fast::Dir.new.send @method, "demo", :renamed # Yeah, symbols work too
419
+ Fast::Dir.new.should_not exist :demo
420
+ Fast::File.new.should exist "renamed/content.file"
421
+ Fast::File.new.should exist "renamed/hope.txt"
422
+ Fast::File.new.should exist "renamed/in/subdir/more.content"
423
+
424
+ Fast::Dir.new.delete! :renamed
425
+ end
426
+ end
427
+
326
428
  describe "#rename" do
327
- it "should change the dir's name"
429
+ before :all do @method = :rename end
430
+ it_behaves_like "any dir renaming"
431
+
432
+ it "should fail if the new path represents an existing dir" do
433
+ Fast::Dir.new.should_not exist :demo
434
+ Fast::Dir.new.should_not exist :renamed
435
+ Fast::Dir.new.create! :demo
436
+ Fast::Dir.new.create! :renamed
437
+ expect { Fast::Dir.new.rename :demo, :renamed
438
+ }.to raise_error ArgumentError, "The target directory 'renamed' already exists"
439
+ Fast::Dir.new.delete! :demo
440
+ Fast::Dir.new.delete! :renamed
441
+ end
442
+ end
443
+
444
+ describe "#rename!" do
445
+ before :all do @method = :rename! end
446
+ it_behaves_like "any dir renaming"
447
+
448
+ it "should overwrite the dir at the new path if it exists" do
449
+ Fast::Dir.new.should_not exist :demo
450
+ Fast::Dir.new.should_not exist :renamed
451
+ Fast::File.new.touch "demo/content.file"
452
+ Fast::File.new.touch "renamed/erase.me"
453
+
454
+ Fast::Dir.new.rename! :demo, :renamed
455
+ Fast::File.new.should_not exist "renamed/erase.me"
456
+ Fast::File.new.should exist "renamed/content.file"
457
+ Fast::Dir.new.delete! :renamed
458
+ end
459
+ end
460
+
461
+ shared_examples_for "any dir copy" do
462
+ context "target dir do not exist" do
463
+ it "should create the target dir"
464
+
465
+ it "should not erase current dir"
466
+ end
467
+
468
+ it "should be present all of source data in the target"
469
+
470
+ it "should return current dir"
471
+ end
472
+
473
+ describe "#copy" do
474
+ it_behaves_like "any dir copy"
475
+
476
+ it "should fail if any conflict appears"
477
+ end
478
+
479
+ describe "#copy!" do
480
+ it_behaves_like "any dir copy"
481
+
482
+ it "should overwrite in every conflict"
483
+ end
484
+
485
+ describe "#merge" do
486
+ before :each do
487
+ Fast::Dir.new.should_not exist :demo
488
+ Fast::Dir.new.should_not exist :mergeme
489
+ end
490
+
491
+ it "should delete target dir" do
492
+ Fast::File.new.touch "demo/content.file"
493
+ Fast::File.new.touch "mergeme/mergeable.file"
494
+
495
+ Fast::Dir.new.merge :demo, :mergeme
496
+ Fast::Dir.new.should_not exist :mergeme
497
+ end
498
+
499
+ it "should fail if target dir does not exist" do
500
+ Fast::Dir.new.create! :demo
501
+ expect { Fast::Dir.new.merge :demo, :mergeme
502
+ }.to raise_error Errno::ENOENT
503
+ end
504
+
505
+ it "should put contents of target dir into current dir, recursively" do
506
+ Fast::File.new.touch "demo/content.file"
507
+ Fast::File.new.touch "demo/more.file"
508
+ Fast::File.new.touch "mergeme/data/info.file"
509
+ Fast::File.new.touch "mergeme/info.rb"
510
+ Fast::File.new.touch "mergeme/data/nested/is.informative.file"
511
+
512
+ Fast::Dir.new.merge :demo, :mergeme
513
+ Fast::Dir.new.should_not exist :mergeme
514
+
515
+ Fast::File.new.should exist "demo/content.file"
516
+ Fast::File.new.should exist "demo/more.file"
517
+ Fast::File.new.should exist "demo/data/info.file"
518
+ Fast::File.new.should exist "demo/info.rb"
519
+ Fast::File.new.should exist "demo/data/nested/is.informative.file"
520
+ end
521
+
522
+ context "two fails in the source and target have the same name" do
523
+ it "should fail"
524
+
525
+ it "should not do any changes in any dir"
526
+ end
527
+
528
+ after :each do
529
+ Fast::Dir.new.delete! :demo if Fast::Dir.new.exist? :demo
530
+ Fast::Dir.new.delete! :mergeme if Fast::Dir.new.exist? :mergeme
531
+ end
532
+ end
533
+
534
+ describe "#merge!" do
535
+ it "should behave like #merge but never fail"
328
536
  end
329
537
 
538
+ describe "#mergeable?" do
539
+ context "both dirs exist and no file or dir in any has the same name in the other" do
540
+ it "should return true"
541
+ end
542
+
543
+ context "some files in target dir have the same name as other in source" do
544
+ it "should return false"
545
+ end
546
+
547
+ it "should fail it the target dir does not exist"
548
+ end
549
+
330
550
  describe "#[]" do
331
551
  context "a file named like the argument exists" do
332
552
  it "should return it"
@@ -47,7 +47,11 @@ describe Fast::File do
47
47
  ::File.unlink "demo.txt"
48
48
  end
49
49
 
50
- it "should return the file"
50
+ it "should return the file" do
51
+ the_file = ::Fast::File.new.append "demo.file", "Some content."
52
+ the_file.should be_a Fast::File
53
+ the_file.delete!
54
+ end
51
55
 
52
56
  it "should work even when a symbol is passed as argument" do
53
57
  Fast::File.new.append :demo_txt, "Hola."
@@ -66,14 +70,42 @@ describe Fast::File do
66
70
  end
67
71
  end
68
72
 
73
+ describe "#<<" do
74
+ it "should behave almost like #append"
75
+ end
76
+
69
77
  describe "#write" do
70
- it "should create the file if it does not exist"
78
+ it "should create the file if it does not exist" do
79
+ Fast::File.new.should_not exist "demo.file"
80
+ Fast::File.new.write "demo.file", "This is all."
81
+ Fast::File.new.should exist "demo.file"
82
+ Fast::File.new.destroy "demo.file"
83
+ end
71
84
 
72
- it "should write the given content into the file"
85
+ it "should write the given content into the file" do
86
+ Fast::File.new.should_not exist "demo.file"
87
+ the_file = Fast::File.new "demo.file"
88
+ the_file.write "This is content!"
89
+ the_file.read.should == "This is content!"
90
+ the_file.destroy
91
+ end
73
92
 
74
- it "should overwrite the file if it exists"
93
+ it "should overwrite the file if it exists" do
94
+ Fast::File.new.should_not exist "demo.file"
95
+ ::File.open "demo.file", "w" do |file|
96
+ file.write "Something..."
97
+ end
98
+
99
+ Fast::File.new.write "demo.file", "Another something"
100
+ Fast::File.new.read( "demo.file" ).should == "Another something"
101
+ Fast::File.new.delete! "demo.file"
102
+ end
75
103
 
76
- it "should return the file"
104
+ it "should return the file" do
105
+ the_file = Fast::File.new.write "demo.file", "More content this time."
106
+ the_file.should be_a Fast::File
107
+ the_file.delete!
108
+ end
77
109
  end
78
110
 
79
111
  shared_examples_for "any file deletion" do
@@ -196,6 +228,8 @@ describe Fast::File do
196
228
  Fast::File.new.send @method, :demo_txt
197
229
  ::File.unlink "demo_txt"
198
230
  end
231
+
232
+ it "should work with multiple arguments"
199
233
  end
200
234
 
201
235
  describe "#create" do
@@ -255,7 +289,7 @@ describe Fast::File do
255
289
  end
256
290
 
257
291
  context "a block is passed" do
258
- it "should be passed a read-only file as an argument, as in File.open"
292
+ it "should have direct access to file's methods"
259
293
  end
260
294
  end
261
295
 
@@ -280,6 +314,8 @@ describe Fast::File do
280
314
  ::File.should_not exist "demo.file"
281
315
  Fast::File.new.send( @method, "demo.file" ).should be_false
282
316
  end
317
+
318
+ it "should return false if path represents a directory!"
283
319
  end
284
320
 
285
321
  describe "#exist?" do
@@ -292,6 +328,24 @@ describe Fast::File do
292
328
  it_behaves_like "any file existencialism"
293
329
  end
294
330
 
331
+ describe "#exist_all?" do
332
+ before :each do @method = :exist_all? end
333
+ it_behaves_like "any file existencialism"
334
+
335
+ it "should return true if all exist"
336
+
337
+ it "should return false if any does not exist"
338
+ end
339
+
340
+ describe "#exist_any?" do
341
+ before :each do @method = :exist_any? end
342
+ it_behaves_like "any file existencialism"
343
+
344
+ it "should return true if at least one exists"
345
+
346
+ it "should return false if none exist"
347
+ end
348
+
295
349
  shared_examples_for "any file subsetter" do
296
350
  # This is a reminder: along with Serializer, the Subsetter pattern
297
351
  # (and later, the Sorting one) should be implemented Fast
@@ -351,8 +405,77 @@ describe Fast::File do
351
405
  before :each do @method = :absolute end
352
406
  it_behaves_like "any file absolutizer"
353
407
  end
354
-
408
+
409
+ describe "#path" do
410
+ context "the path is setted" do
411
+ it "returns the path" do
412
+ the_file = Fast::File.new "demo.file"
413
+ the_file.path.should == "demo.file"
414
+ end
415
+ end
416
+
417
+ context "the path is undefined" do
418
+ it "returns nil" do
419
+ the_file = Fast::File.new
420
+ the_file.path.should be_nil
421
+ end
422
+ end
423
+ end
424
+
425
+ shared_examples_for "any file renaming" do
426
+ it "should change the file's name" do
427
+ Fast::File.new.should_not exist "demo.file"
428
+ Fast::File.new.should_not exist "renamed.file"
429
+ Fast::File.new.write "demo.file", "This content is the proof."
430
+ Fast::File.new.send @method, "demo.file", "renamed.file"
431
+
432
+ Fast::File.new.should_not exist "demo.file"
433
+ Fast::File.new.should exist "renamed.file"
434
+ Fast::File.new.read( "renamed.file" ).should == "This content is the proof."
435
+ Fast::File.new.delete! "renamed.file"
436
+ end
437
+ end
438
+
355
439
  describe "#rename" do
356
- it "should change the file's name"
440
+ before :all do @method = :rename end
441
+ it_behaves_like "any file renaming"
442
+
443
+ it "should fail if a file named as the new name exists" do
444
+ Fast::File.new.should_not exist "demo.file"
445
+ Fast::File.new.should_not exist "renamed.file"
446
+ Fast::File.new.touch "renamed.file"
447
+ Fast::File.new.write "demo.file", "Demo content bores me"
448
+
449
+ expect { Fast::File.new.rename "demo.file", "renamed.file"
450
+ }.to raise_error ArgumentError, "The file 'renamed.file' already exists"
451
+
452
+ Fast::File.new.delete! "demo.file"
453
+ Fast::File.new.delete! "renamed.file"
454
+ end
455
+ end
456
+
457
+ describe "#rename!" do
458
+ before :all do @method = :rename! end
459
+ it_behaves_like "any file renaming"
460
+
461
+ it "should overwrite the new file if it exists" do
462
+ Fast::File.new.should_not exist "demo.file"
463
+ Fast::File.new.should_not exist "renamed.file"
464
+ Fast::File.new.touch "renamed.file"
465
+ Fast::File.new.write "demo.file", "Demo content bores me"
466
+
467
+ Fast::File.new.rename! "demo.file", "renamed.file"
468
+
469
+ Fast::File.new.should_not exist "demo.file"
470
+ Fast::File.new.read( "renamed.file" ).should == "Demo content bores me"
471
+
472
+ Fast::File.new.delete! "renamed.file"
473
+ end
474
+ end
475
+
476
+ describe "#merge" do
477
+ it "should delete the target file"
478
+
479
+ it "should append the contents of the target into this"
357
480
  end
358
481
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 23
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 3
9
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
10
11
  platform: ruby
11
12
  authors:
12
13
  - Xavier Via
@@ -14,16 +15,17 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2011-11-13 00:00:00 +01:00
18
- default_executable:
18
+ date: 2011-11-14 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: metafun
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
24
25
  requirements:
25
26
  - - ">="
26
27
  - !ruby/object:Gem::Version
28
+ hash: 3
27
29
  segments:
28
30
  - 0
29
31
  version: "0"
@@ -33,9 +35,11 @@ dependencies:
33
35
  name: rspec
34
36
  prerelease: false
35
37
  requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
36
39
  requirements:
37
40
  - - ">="
38
41
  - !ruby/object:Gem::Version
42
+ hash: 3
39
43
  segments:
40
44
  - 0
41
45
  version: "0"
@@ -45,9 +49,11 @@ dependencies:
45
49
  name: zucker
46
50
  prerelease: false
47
51
  requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
48
53
  requirements:
49
54
  - - ">="
50
55
  - !ruby/object:Gem::Version
56
+ hash: 3
51
57
  segments:
52
58
  - 0
53
59
  version: "0"
@@ -74,9 +80,9 @@ files:
74
80
  - lib/fast/file-filter.rb
75
81
  - lib/fast/file.rb
76
82
  - lib/fast/version.rb
83
+ - spec/fast/dir-filter_spec.rb
77
84
  - spec/fast/dir_spec.rb
78
85
  - spec/fast/file_spec.rb
79
- has_rdoc: true
80
86
  homepage: ""
81
87
  licenses: []
82
88
 
@@ -86,23 +92,27 @@ rdoc_options: []
86
92
  require_paths:
87
93
  - lib
88
94
  required_ruby_version: !ruby/object:Gem::Requirement
95
+ none: false
89
96
  requirements:
90
97
  - - ">="
91
98
  - !ruby/object:Gem::Version
99
+ hash: 3
92
100
  segments:
93
101
  - 0
94
102
  version: "0"
95
103
  required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
96
105
  requirements:
97
106
  - - ">="
98
107
  - !ruby/object:Gem::Version
108
+ hash: 3
99
109
  segments:
100
110
  - 0
101
111
  version: "0"
102
112
  requirements: []
103
113
 
104
114
  rubyforge_project: fast
105
- rubygems_version: 1.3.6
115
+ rubygems_version: 1.8.11
106
116
  signing_key:
107
117
  specification_version: 3
108
118
  summary: DSL for file system interaction