fast 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,69 @@
1
+ module Fast
2
+ module FilesystemObject
3
+ # If a string is passed, returns the same string;
4
+ # if a symbol is passed, returns the string representation
5
+ # of the symbol; if an object of the same class as self
6
+ # is passed, return the #path of that object
7
+ def normalize path
8
+ if path.instance_of? String or path.instance_of? Symbol
9
+ "#{path}"
10
+ elsif path.instance_of? self.class
11
+ path.path
12
+ end
13
+ end
14
+
15
+ # Returns the path to the current FilesystemObject
16
+ def path
17
+ @path
18
+ end
19
+
20
+ # Expands the path if it's a relative path
21
+ def expand path = nil
22
+ @path = normalize path if path
23
+ raise Fast::PathNotSettedException, "The path was not setted in this instance" unless @path
24
+ ::File.expand_path @path
25
+ end
26
+
27
+ alias :absolute :expand
28
+
29
+ # Returns true if the item exists, false otherwise:
30
+ # relays on the implementation of a private #do_check?
31
+ # method in the class that includes the module
32
+ def exist? path = nil
33
+ if path
34
+ path = normalize path
35
+ @path = path unless @path
36
+ do_exist? path
37
+ else
38
+ raise ArgumentError, "An argument should be provided if this instance has no path setted" unless @path
39
+ do_exist? @path
40
+ end
41
+ end
42
+
43
+ alias :exists? :exist?
44
+
45
+ def exist_all? *args
46
+ unless args.empty?
47
+ else
48
+ raise ArgumentError, "An argument should be provided if this instance has no path setted" unless @path
49
+ do_exist? @path
50
+ end
51
+ end
52
+
53
+ def exist_any? *args
54
+ unless args.empty?
55
+ else
56
+ raise ArgumentError, "An argument should be provided if this instance has no path setted" unless @path
57
+ do_exist? @path
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ # Abstract implementation to be overriden in the
64
+ # actual classes.
65
+ def do_exist? path
66
+ raise NotImplementedError, "The implementation of #do_exist? in the module FilesystemObject is abstract, please reimplement in any class including it."
67
+ end
68
+ end
69
+ end
@@ -1,3 +1,3 @@
1
1
  module Fast
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -0,0 +1,19 @@
1
+ module Patterns
2
+ module Adapter
3
+ module Fast
4
+ class Dir
5
+ def initialize source
6
+ @source = source
7
+ end
8
+
9
+ def symbols
10
+ return_me = []
11
+ @source.each do |entry|
12
+ return_me.push entry.gsub(/\.(\w+?)$/, "").to_sym
13
+ end
14
+ return return_me
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -15,6 +15,14 @@ module SubSetter
15
15
  return_me
16
16
  end
17
17
 
18
+ def ending the_ending
19
+ return_me = ::Fast::Dir.new
20
+ @set.each do |entry|
21
+ return_me << entry if entry.end_with? the_ending
22
+ end
23
+ return_me
24
+ end
25
+
18
26
  def strip_extension
19
27
  return_me = ::Fast::Dir.new
20
28
  @set.each do |entry|
@@ -2,14 +2,9 @@ require "fast"
2
2
  require "zucker/os"
3
3
 
4
4
  describe Fast::Dir do
5
-
6
- context "a Fast::Dir is passed as argument where a path is accepted" do
7
- it "should be accepted"
8
-
9
- it "should I really think of a common denominator of Fast::Dir and Fast::File?"
10
- end
11
-
12
5
  shared_examples_for "any dir list" do
6
+ it "should return a list of Fast::Dir o Fast::File, not strings"
7
+
13
8
  context "a block is passed as an argument" do
14
9
  it "should pass each entry as argument to the block" do
15
10
  ::File.should_not be_directory "demo"
@@ -269,6 +264,58 @@ describe Fast::Dir do
269
264
  Fast::Dir.new.delete! :alt
270
265
  Fast::Dir.new.delete! :other
271
266
  end
267
+
268
+ context "no path is setted and a Hash is passed" do
269
+ it "build the entire structure in the current dir" do
270
+ Fast::Dir.new.should_not exist :demo
271
+ Fast::Dir.new.should_not exist :demo2
272
+
273
+ Fast::Dir.new.send @method, {
274
+ :demo => {
275
+ :Superfile => "With some content",
276
+ :subdir => {
277
+ "deep.txt" => "In the structure."
278
+ }
279
+ },
280
+ :demo2 => {}
281
+ }
282
+
283
+ Fast::File.new.read("demo/Superfile").should == "With some content"
284
+ Fast::File.new.read("demo/subdir/deep.txt").should == "In the structure."
285
+
286
+ Fast::Dir.new.should exist :demo2
287
+ end
288
+
289
+ after do
290
+ Fast::Dir.new.delete! :demo
291
+ Fast::Dir.new.delete! :demo2
292
+ end
293
+ end
294
+
295
+ context "a path is setted in the Dir and a Hash is passed" do
296
+ it "build the entire structure in the right dir" do
297
+ Fast::Dir.new.should_not exist :demo
298
+
299
+ Fast::Dir.new("demo").send @method, {
300
+ :inner => {
301
+ :Superfile => "With some content",
302
+ :subdir => {
303
+ "deep.txt" => "In the structure."
304
+ }
305
+ },
306
+ :meta => {}
307
+ }
308
+
309
+ Fast::File.new.read("demo/inner/Superfile").should == "With some content"
310
+ Fast::File.new.read("demo/inner/subdir/deep.txt").should == "In the structure."
311
+
312
+ Fast::Dir.new.should exist "demo/meta"
313
+ end
314
+
315
+ after do
316
+ Fast::Dir.new.delete! :demo
317
+ end
318
+ end
272
319
  end
273
320
 
274
321
  describe "#create" do
@@ -283,6 +330,8 @@ describe Fast::Dir do
283
330
  Fast::Dir.new.delete! :demo
284
331
  end
285
332
 
333
+ it "should fail is a Hash is passed an there are conflicts"
334
+
286
335
  after do
287
336
  Fast::Dir.new.delete! :demo
288
337
  end
@@ -299,34 +348,10 @@ describe Fast::Dir do
299
348
  }.to_not raise_error ArgumentError, "Dir 'demo' already exists"
300
349
  Fast::Dir.new.delete! :demo
301
350
  end
351
+
352
+ it "should override if a Hash is passed and there are conflicts"
302
353
  end
303
354
 
304
- shared_examples_for "any dir subsetter" do
305
- it "should forward self to a subsetter object" do
306
- Fast::Dir.new.should_not exist "demo"
307
- Fast::File.new.touch "demo/in/subdir.file"
308
-
309
- the_demo_dir = Fast::Dir.new :demo
310
-
311
- SubSetter::Fast::Dir.should_receive( :new ).with the_demo_dir
312
-
313
- the_demo_dir.by
314
-
315
- the_demo_dir.delete!
316
- end
317
- end
318
-
319
- describe "#by" do
320
- before :each do @method = :by end
321
- it_behaves_like "any dir subsetter"
322
- end
323
-
324
- describe "#filter" do
325
- before :each do @method = :filter end
326
- it_behaves_like "any dir subsetter"
327
- end
328
-
329
-
330
355
  shared_examples_for "any dir deletion" do
331
356
  it "should delete the directory if it exists" do
332
357
  ::File.should_not be_directory "demo"
@@ -475,8 +500,37 @@ describe Fast::Dir do
475
500
  end
476
501
  end
477
502
 
503
+ # Private method
504
+ describe "#do_exist?" do
505
+ context "if the path is a directory" do
506
+ it "should return true if the passed path is a directory" do
507
+ ::File.should_not be_directory "demo"
508
+ dir = Fast::Dir.new "demo"
509
+ dir.create!
510
+ def dir.call_do_exist?
511
+ do_exist? "demo"
512
+ end
513
+ dir.call_do_exist?.should === true
514
+ end
515
+
516
+ after do
517
+ Fast::Dir.new.destroy! "demo"
518
+ end
519
+ end
520
+
521
+ it "should return false if the passed path is not a directory" do
522
+ ::File.should_not be_directory "demo"
523
+ dir = Fast::Dir.new "demo"
524
+ def dir.call_do_exist?
525
+ do_exist? "demo"
526
+ end
527
+ dir.call_do_exist?.should === false
528
+ end
529
+ end
530
+
478
531
  shared_examples_for "any dir existencialism" do
479
532
  it "should return true if the dir exists" do
533
+ pending "move partially to FilesystemObject"
480
534
  ::File.should_not be_directory "demo"
481
535
  Fast::Dir.new.create! "demo"
482
536
  Fast::Dir.new.send( @method, "demo" ).should be_true
@@ -484,21 +538,12 @@ describe Fast::Dir do
484
538
  end
485
539
 
486
540
  it "should return false if the dir does not exist" do
541
+ pending "move partially to FilesystemObject"
487
542
  ::File.should_not be_directory "demo"
488
543
  Fast::Dir.new.send( @method, "demo" ).should be_false
489
544
  end
490
545
  end
491
-
492
- describe "#exist?" do
493
- before :each do @method = :exist? end
494
- it_behaves_like "any dir existencialism"
495
- end
496
-
497
- describe "#exists?" do
498
- before :each do @method = :exists? end
499
- it_behaves_like "any dir existencialism"
500
- end
501
-
546
+
502
547
  describe "#exist_all?" do
503
548
  before :each do @method = :exist_all? end
504
549
  it_behaves_like "any dir existencialism"
@@ -586,50 +631,6 @@ describe Fast::Dir do
586
631
  Fast::Dir.new(:demo).to_s.should include "demo"
587
632
  end
588
633
  end
589
-
590
- shared_examples_for "any dir absolutizer" do
591
- context "dir path is a relative route" do
592
- it "should expand the dir path with the pwd" do
593
- Fast::Dir.new.send( @method, :demo ).should == "#{Dir.pwd}/demo"
594
- end
595
- end
596
-
597
- context "dir path is an absolute route" do
598
- it "should return the same path as given" do
599
- unless OS.windows?
600
- Fast::Dir.new.send( @method, "/dev/null").should == "/dev/null"
601
- else
602
- pending "POSIX only!"
603
- end
604
- end
605
- end
606
- end
607
-
608
- describe "#expand" do
609
- before :each do @method = :expand end
610
- it_behaves_like "any dir absolutizer"
611
- end
612
-
613
- describe "#absolute" do
614
- before :each do @method = :absolute end
615
- it_behaves_like "any dir absolutizer"
616
- end
617
-
618
- describe "#path" do
619
- context "the path is setted" do
620
- it "should return the path" do
621
- the_dir = Fast::Dir.new "demo"
622
- the_dir.path.should == "demo"
623
- end
624
- end
625
-
626
- context "the path is undefined" do
627
- it "should return nil" do
628
- the_dir = Fast::Dir.new
629
- the_dir.path.should be_nil
630
- end
631
- end
632
- end
633
634
 
634
635
  shared_examples_for "any dir renaming" do
635
636
  it "should delete current dir and target dir should exist" do
@@ -857,13 +858,68 @@ describe Fast::Dir do
857
858
  it "should behave like #merge but never fail"
858
859
  end
859
860
 
860
- describe "#conflicts?" do
861
- context "both dirs exist and no file or dir in any has the same name in the other" do
862
- it "should return true"
861
+ describe "#conflicts_with?" do
862
+ context "no directory tree" do
863
+ context "no file in target has the same name as other in source" do
864
+ it "should return false" do
865
+ Fast::Dir.new.should_not exist :target
866
+ Fast::Dir.new.should_not exist :demo
867
+
868
+ Fast::File.new.touch "demo/non_conflict.txt"
869
+ Fast::File.new.touch "target/not_at_all.txt"
870
+
871
+ Fast::Dir.new.conflicts_with?(:demo, :target).should === false
872
+ end
873
+ end
874
+
875
+ context "at least one file in target has the same name as other in source" do
876
+ it "should return true" do
877
+ Fast::Dir.new.should_not exist :target
878
+ Fast::Dir.new.should_not exist :demo
879
+
880
+ Fast::File.new.touch "demo/some_conflict.txt"
881
+ Fast::File.new.touch "target/some_conflict.txt"
882
+ Fast::File.new.touch "target/not_at_all.txt"
883
+
884
+ Fast::Dir.new.conflicts_with?(:demo, :target).should === true
885
+ end
886
+ end
863
887
  end
864
-
865
- context "some files in target dir have the same name as other in source" do
866
- it "should return false"
888
+
889
+ context "recursive" do
890
+ context "no file in any has the same path in the other" do
891
+ it "should return false" do
892
+ Fast::Dir.new.should_not exist :demo
893
+ Fast::Dir.new.should_not exist :target
894
+
895
+ Fast::File.new.touch "demo/some/file.txt"
896
+ Fast::File.new.touch "demo/deep/in/the/tree.file"
897
+
898
+ Fast::File.new.touch "target/no/conflict.what"
899
+ Fast::File.new.touch "target/so/ever.txt"
900
+
901
+ Fast::Dir.new.conflicts_with?(:demo, :target).should === false
902
+ end
903
+ end
904
+
905
+ context "at least one file in target dir have the same path as other in source" do
906
+ it "should return true" do
907
+ Fast::Dir.new.should_not exist :demo
908
+ Fast::Dir.new.should_not exist :target
909
+
910
+ Fast::File.new.touch "demo/some/file.txt"
911
+ Fast::File.new.touch "demo/deep/in/the/tree.file"
912
+
913
+ Fast::File.new.touch "target/some/file.txt"
914
+ Fast::File.new.touch "target/so/ever.txt"
915
+
916
+ Fast::Dir.new.conflicts_with?(:demo, :target).should === true
917
+ end
918
+ end
919
+ end
920
+
921
+ after do
922
+ Fast::Dir.new.remove! :demo, :target
867
923
  end
868
924
  end
869
925
 
@@ -972,6 +1028,8 @@ describe Fast::Dir do
972
1028
  Fast::File.new.read("demo/subdir/subsub/other.txt").should include "More than this"
973
1029
  Fast::File.new.read("demo/subdir/demo.txt").should include "Some file content"
974
1030
  end
1031
+
1032
+ it "should handle conflicts somehow"
975
1033
  end
976
1034
 
977
1035
  after :each do
@@ -5,11 +5,6 @@ require "zucker/os"
5
5
  ::File.unlink "demo.txt" if ::File.exist? "demo.txt"
6
6
 
7
7
  describe Fast::File do
8
-
9
- context "a Fast::File is passed as argument where a path is accepted" do
10
- it "should be accepted"
11
- end
12
-
13
8
  shared_examples_for "any file content appending" do
14
9
  it "should create the file if it does not exist" do
15
10
  ::File.should_not exist "demo.txt"
@@ -384,7 +379,17 @@ describe Fast::File do
384
379
  end
385
380
 
386
381
  context "a block is passed" do
387
- it "should have direct access to file's methods"
382
+ it "should have direct access to file's methods" do
383
+ Fast::File.new.should_not exist :demo_txt
384
+ Fast::File.new.append :demo_txt, "New content!"
385
+ entered_the_block = false
386
+ Fast::File.new.read :demo_txt do |the_file|
387
+ the_file.should be_a ::File
388
+ entered_the_block = true
389
+ end
390
+ entered_the_block.should be_true
391
+ Fast::File.new.destroy! :demo_txt
392
+ end
388
393
  end
389
394
  end
390
395
 
@@ -397,8 +402,39 @@ describe Fast::File do
397
402
  end
398
403
  end
399
404
 
405
+ # Private method
406
+ describe "#do_exist?" do
407
+ context "it the file exist" do
408
+ it "should return true" do
409
+ ::File.should_not exist "demo.txt"
410
+ Fast::File.new.create "demo.txt"
411
+ file = Fast::File.new "demo.txt"
412
+ def file.call_do_exist?
413
+ do_exist? "demo.txt"
414
+ end
415
+ file.call_do_exist?.should === true
416
+ end
417
+
418
+ after do
419
+ Fast::File.new.destroy! "demo.txt"
420
+ end
421
+ end
422
+
423
+ context "if the file does not exist" do
424
+ it "should return false" do
425
+ ::File.should_not exist "demo.txt"
426
+ file = Fast::File.new "demo.txt"
427
+ def file.call_do_exist?
428
+ do_exist? "demo.txt"
429
+ end
430
+ file.call_do_exist?.should === false
431
+ end
432
+ end
433
+ end
434
+
400
435
  shared_examples_for "any file existencialism" do
401
436
  it "should return true if file exists" do
437
+ pending "move partially to FilesystemObject"
402
438
  ::File.should_not exist "demo.file"
403
439
  Fast::File.new.create! "demo.file"
404
440
  Fast::File.new.send( @method, "demo.file" ).should be_true
@@ -406,33 +442,26 @@ describe Fast::File do
406
442
  end
407
443
 
408
444
  it "should return false if file does not exist" do
445
+ pending "move partially to FilesystemObject"
409
446
  ::File.should_not exist "demo.file"
410
447
  Fast::File.new.send( @method, "demo.file" ).should be_false
411
448
  end
412
449
 
413
450
  it "should return false if path represents a directory!" do
451
+ pending "move partially to FilesystemObject"
414
452
  Fast::Dir.new.should_not exist "demo"
415
453
  Fast::Dir.new.create "demo"
416
454
  Fast::File.new.send( @method, "demo" ).should be_false
417
455
  Fast::Dir.new.delete "demo"
418
456
  end
419
- end
420
-
421
- describe "#exist?" do
422
- before :each do @method = :exist? end
423
- it_behaves_like "any file existencialism"
424
- end
425
-
426
- describe "#exists?" do
427
- before :each do @method = :exists? end
428
- it_behaves_like "any file existencialism"
429
- end
457
+ end
430
458
 
431
459
  describe "#exist_all?" do
432
460
  before :each do @method = :exist_all? end
433
461
  it_behaves_like "any file existencialism"
434
462
 
435
463
  it "should return true if all exist" do
464
+ pending "Method being moved to Fast::FilesystemObject"
436
465
  # Create the demo files
437
466
  Fast::File.new.touch "demo1.txt", "demo2.txt", "demo3.txt"
438
467
 
@@ -441,6 +470,7 @@ describe Fast::File do
441
470
  end
442
471
 
443
472
  it "should return false if any does not exist" do
473
+ pending "Method being moved to Fast::FilesystemObject"
444
474
  Fast::File.new.touch "demo1.txt", "demo2.txt", "demo3.txt"
445
475
  Fast::File.new.should_not exist "demo4.txt"
446
476
 
@@ -460,6 +490,7 @@ describe Fast::File do
460
490
  it_behaves_like "any file existencialism"
461
491
 
462
492
  it "should return true if at least one exists" do
493
+ pending "Method being moved to Fast::FilesystemObject"
463
494
  Fast::File.new.touch "demo1.txt"
464
495
  Fast::File.new.should_not exist "demo2.txt"
465
496
 
@@ -467,6 +498,7 @@ describe Fast::File do
467
498
  end
468
499
 
469
500
  it "should return false if none exist" do
501
+ pending "Method being moved to Fast::FilesystemObject"
470
502
  Fast::File.new.should_not exist "demo2.txt"
471
503
  Fast::File.new.should_not exist "demo3.txt"
472
504
 
@@ -480,6 +512,7 @@ describe Fast::File do
480
512
 
481
513
  describe "#exist_which" do
482
514
  it "should return a list with the files that exist" do
515
+ pending "Method being moved to Fast::FilesystemObject"
483
516
  Fast::File.new.should_not exist "demo1.txt"
484
517
  Fast::File.new.should_not exist "demo2.txt"
485
518
  Fast::File.new.should_not exist "demo3.txt"
@@ -522,25 +555,6 @@ describe Fast::File do
522
555
  Fast::File.new.delete! "demo.txt"
523
556
  end
524
557
  end
525
-
526
- shared_examples_for "any file subsetter" do
527
- # SubSetter as described in http://xaviervia.com.ar/patterns/sub-setter
528
- it "should forward self to a filtering object" do
529
- the_demo_file = Fast::File.new :demo
530
- SubSetter::Fast::File.should_receive( :new ).with the_demo_file
531
- the_demo_file.by
532
- end
533
- end
534
-
535
- describe "#by" do
536
- before :each do @method = :by end
537
- it_behaves_like "any file subsetter"
538
- end
539
-
540
- describe "#filter" do
541
- before :each do @method = :filter end
542
- it_behaves_like "any file subsetter"
543
- end
544
558
 
545
559
  describe ".new" do
546
560
  it "should accept a string path as argument" do
@@ -552,50 +566,6 @@ describe Fast::File do
552
566
  end
553
567
  end
554
568
 
555
- shared_examples_for "any file absolutizer" do
556
- context "file path is a relative route" do
557
- it "should expand the file path with pwd" do
558
- Fast::File.new.send( @method, "demo.file" ).should == "#{Dir.pwd}/demo.file"
559
- end
560
- end
561
-
562
- context "file path is an absolute route" do
563
- it "should return the same as given path" do
564
- unless OS.windows?
565
- Fast::File.new.send( @method, "/dev/null" ).should == "/dev/null"
566
- else
567
- pending "POSIX only!"
568
- end
569
- end
570
- end
571
- end
572
-
573
- describe "#expand" do
574
- before :each do @method = :expand end
575
- it_behaves_like "any file absolutizer"
576
- end
577
-
578
- describe "#absolute" do
579
- before :each do @method = :absolute end
580
- it_behaves_like "any file absolutizer"
581
- end
582
-
583
- describe "#path" do
584
- context "the path is setted" do
585
- it "returns the path" do
586
- the_file = Fast::File.new "demo.file"
587
- the_file.path.should == "demo.file"
588
- end
589
- end
590
-
591
- context "the path is undefined" do
592
- it "returns nil" do
593
- the_file = Fast::File.new
594
- the_file.path.should be_nil
595
- end
596
- end
597
- end
598
-
599
569
  shared_examples_for "any file renaming" do
600
570
  it "should change the file's name" do
601
571
  Fast::File.new.should_not exist "demo.file"
@@ -798,4 +768,26 @@ describe Fast::File do
798
768
  end
799
769
  end
800
770
  end
771
+
772
+ describe "#extension" do
773
+ context "a path is setted and it has extension" do
774
+ it "should return the extension"
775
+ end
776
+
777
+ context "a path is setted but has no extension" do
778
+ it "should return nil"
779
+ end
780
+
781
+ context "a path is sent in the call and has extension" do
782
+ it "should return the extension"
783
+ end
784
+
785
+ context "a path is sent in the call but has no extension" do
786
+ it "should return nil"
787
+ end
788
+
789
+ context "no path setted" do
790
+ it "should raise exception"
791
+ end
792
+ end
801
793
  end