fast 0.1.1 → 0.1.2
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/.rvmrc +1 -0
- data/Gemfile.lock +28 -0
- data/README.rdoc +47 -6
- data/Rakefile +9 -0
- data/fast.gemspec +1 -1
- data/lib/fast.rb +0 -4
- data/lib/fast/dir.rb +25 -8
- data/lib/fast/fast.rb +3 -0
- data/lib/fast/file.rb +17 -5
- data/lib/fast/version.rb +1 -1
- data/lib/sub-setter/fast/dir.rb +35 -0
- data/lib/sub-setter/fast/file.rb +11 -0
- data/spec/fast/dir_spec.rb +116 -10
- data/spec/fast/file_spec.rb +93 -9
- data/spec/{fast/dir-filter_spec.rb → sub-setter/fast/dir_spec.rb} +5 -11
- metadata +15 -13
- data/lib/fast/dir-filter.rb +0 -33
- data/lib/fast/file-filter.rb +0 -9
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.3
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
fast (0.1.2)
|
5
|
+
metafun (>= 0.2.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
diff-lcs (1.1.3)
|
11
|
+
metafun (0.2.0)
|
12
|
+
rspec (2.8.0)
|
13
|
+
rspec-core (~> 2.8.0)
|
14
|
+
rspec-expectations (~> 2.8.0)
|
15
|
+
rspec-mocks (~> 2.8.0)
|
16
|
+
rspec-core (2.8.0)
|
17
|
+
rspec-expectations (2.8.0)
|
18
|
+
diff-lcs (~> 1.1.2)
|
19
|
+
rspec-mocks (2.8.0)
|
20
|
+
zucker (12.1)
|
21
|
+
|
22
|
+
PLATFORMS
|
23
|
+
ruby
|
24
|
+
|
25
|
+
DEPENDENCIES
|
26
|
+
fast!
|
27
|
+
rspec
|
28
|
+
zucker
|
data/README.rdoc
CHANGED
@@ -1,18 +1,58 @@
|
|
1
1
|
= Fast
|
2
2
|
|
3
|
-
|
3
|
+
Tired of having a hard time working with files? Take a look at Fast...
|
4
4
|
|
5
|
-
|
5
|
+
require "fast"
|
6
|
+
|
7
|
+
lib_dir = dir! :lib
|
8
|
+
|
9
|
+
lib_dir["demo.txt"] = "I love creating files from a Hash-like API"
|
10
|
+
|
11
|
+
lib_dir.list # => ['demo.txt']
|
12
|
+
|
13
|
+
file! "lib/empty.txt"
|
14
|
+
|
15
|
+
lib_dir.files.each do |path|
|
16
|
+
puts path
|
17
|
+
end # => demo.txt
|
18
|
+
# empty.txt
|
19
|
+
|
20
|
+
lib_dir.destroy
|
21
|
+
|
22
|
+
dir? :lib # => false
|
23
|
+
|
24
|
+
...and wait a few weeks because this is not stable yet ;)
|
25
|
+
|
26
|
+
Fast is a DSL for file and dir handling focused in intuitivity and semantics. Is pure Ruby (1.8.7+) with no dependencies, except for Metafun for the DSL.
|
6
27
|
|
7
28
|
== Installation
|
8
29
|
|
9
30
|
gem install fast
|
10
31
|
|
11
|
-
|
32
|
+
== Usage
|
33
|
+
|
34
|
+
Fast declares two sets of methods in its DSL:
|
35
|
+
|
36
|
+
=== Dir methods
|
37
|
+
|
38
|
+
dir :lib # The same as => Fast::Dir.new "lib"
|
39
|
+
dir.delete! "demo" # The same as => Fast::Dir.new.delete! "demo"
|
40
|
+
|
41
|
+
dir! :new_dir # The same as => Fast::Dir.new.create! :new_dir
|
42
|
+
dir? :new_dir # The same as => Fast::Dir.new.exist? :new_dir
|
43
|
+
|
44
|
+
=== File methods
|
45
|
+
|
46
|
+
file "demo.txt" # The same as => Fast::File.new "demo.txt"
|
47
|
+
file.copy "demo.txt", "new.txt" # The same as =>
|
48
|
+
# Fast::File.new.copy "demo.txt", "new.txt"
|
49
|
+
|
50
|
+
file! "demo.txt" # The same as => Fast::File.new.create! "demo.txt"
|
51
|
+
file? "demo.txt" # The same as => Fast::File.new.exist? "demo.txt"
|
12
52
|
|
13
53
|
== Philosophy
|
14
54
|
|
15
|
-
|
55
|
+
*Fast* embraces a more straightforward view of files as strings of data and directories as arrays of files/directories. Why?
|
16
56
|
|
17
57
|
* It is more realistic in everyday usage
|
18
58
|
* It makes them more object-like (and thus, more friendly to OOP)
|
@@ -22,8 +62,9 @@ Cucumber features still to do, but specs are stable (2011-12-11)
|
|
22
62
|
<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.
|
23
63
|
|
24
64
|
== Quick notes
|
65
|
+
* URGENT: Make fast depend of the last version of <tt>metafun</tt>
|
66
|
+
* Deliberate whether is a good idea to make Fast::Dir and Fast::File Multitons.
|
25
67
|
* Read bytes as binary ASCII-8BIT always and then try to perform an heuristic conversion, if there is any reasonable way to do it. Otherwise, leave it to the user. Google: "ruby string encode utf-8 ascii" for some good readings.
|
26
|
-
* Apply the SubSetter pattern for filtering instead of FileFilter and DirFilter ad described in http://xaviervia.com.ar/patterns/sub-setter
|
27
68
|
* 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.
|
28
69
|
* An instance of Fast::Dir should be possible to be created from a Array.
|
29
70
|
* 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.
|
@@ -35,6 +76,6 @@ Cucumber features still to do, but specs are stable (2011-12-11)
|
|
35
76
|
|
36
77
|
== License
|
37
78
|
|
38
|
-
GPL License. Why
|
79
|
+
GPL License. Why other?
|
39
80
|
|
40
81
|
@ Xavier Via
|
data/Rakefile
CHANGED
data/fast.gemspec
CHANGED
data/lib/fast.rb
CHANGED
data/lib/fast/dir.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "sub-setter/fast/dir" # This call should be automated in the sub-setter API somehow
|
2
|
+
|
1
3
|
module Fast
|
2
4
|
# Directory handling class
|
3
5
|
class Dir < Array
|
@@ -90,10 +92,10 @@ module Fast
|
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
93
|
-
alias :
|
94
|
-
alias :
|
95
|
-
alias :
|
96
|
-
alias :
|
95
|
+
alias :remove :delete
|
96
|
+
alias :destroy :delete
|
97
|
+
alias :del :delete
|
98
|
+
alias :unlink :delete
|
97
99
|
|
98
100
|
# Like #delete, but raises no error if some directory is missing
|
99
101
|
def delete! *args
|
@@ -116,7 +118,10 @@ module Fast
|
|
116
118
|
end
|
117
119
|
end
|
118
120
|
|
119
|
-
alias :remove!
|
121
|
+
alias :remove! :delete!
|
122
|
+
alias :destroy! :delete!
|
123
|
+
alias :del! :delete!
|
124
|
+
alias :unlink! :delete!
|
120
125
|
|
121
126
|
# Checks for existence. True if the directory exists, false otherwise
|
122
127
|
def exist? path = nil
|
@@ -170,9 +175,9 @@ module Fast
|
|
170
175
|
return "#{@path}"
|
171
176
|
end
|
172
177
|
|
173
|
-
# Sends self to a
|
178
|
+
# Sends self to a SubSetter for Fast::Dir
|
174
179
|
def filter
|
175
|
-
|
180
|
+
SubSetter::Fast::Dir.new self
|
176
181
|
end
|
177
182
|
|
178
183
|
alias :by :filter
|
@@ -205,6 +210,8 @@ module Fast
|
|
205
210
|
do_rename_to target
|
206
211
|
end
|
207
212
|
|
213
|
+
alias :move :rename
|
214
|
+
|
208
215
|
# Renames this dir into the target path: overwrites the target dir
|
209
216
|
# if it exists
|
210
217
|
def rename! *args
|
@@ -219,6 +226,8 @@ module Fast
|
|
219
226
|
do_rename_to target
|
220
227
|
end
|
221
228
|
|
229
|
+
alias :move! :rename!
|
230
|
+
|
222
231
|
# Merges the target dir into this
|
223
232
|
def merge *args
|
224
233
|
if args.length > 1
|
@@ -274,7 +283,15 @@ module Fast
|
|
274
283
|
if name.is_a? Integer # I do not wish to disable Array behaviour
|
275
284
|
super
|
276
285
|
else
|
277
|
-
|
286
|
+
if content.is_a? Hash
|
287
|
+
subdir = Dir.new.create! "#{@path}/#{name}"
|
288
|
+
content.each do |item_name, item_content|
|
289
|
+
subdir[item_name] = item_content
|
290
|
+
end
|
291
|
+
return subdir
|
292
|
+
else
|
293
|
+
return File.new.write "#{@path}/#{name}", content
|
294
|
+
end
|
278
295
|
end
|
279
296
|
end
|
280
297
|
|
data/lib/fast/fast.rb
CHANGED
data/lib/fast/file.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "sub-setter/fast/file" # This call should be automated in the sub-setter API somehow
|
2
|
+
|
1
3
|
module Fast
|
2
4
|
# File handling class.
|
3
5
|
class File < String
|
@@ -67,9 +69,10 @@ module Fast
|
|
67
69
|
end
|
68
70
|
end
|
69
71
|
|
70
|
-
alias :
|
71
|
-
alias :
|
72
|
-
alias :del
|
72
|
+
alias :remove :delete
|
73
|
+
alias :destroy :delete
|
74
|
+
alias :del :delete
|
75
|
+
alias :unlink :delete
|
73
76
|
|
74
77
|
# Deletes the file(s) if it exists, does nothing otherwise
|
75
78
|
def delete! *args
|
@@ -86,6 +89,11 @@ module Fast
|
|
86
89
|
end
|
87
90
|
end
|
88
91
|
|
92
|
+
alias :remove! :delete!
|
93
|
+
alias :destroy! :delete!
|
94
|
+
alias :del! :delete!
|
95
|
+
alias :unlink! :delete!
|
96
|
+
|
89
97
|
# Touches the file passed. Like bash `touch`, but creates
|
90
98
|
# all required directories if they don't exist
|
91
99
|
def touch *args
|
@@ -150,9 +158,9 @@ module Fast
|
|
150
158
|
return_list
|
151
159
|
end
|
152
160
|
|
153
|
-
# Sends self to a
|
161
|
+
# Sends self to a SubSetter for Fast::File
|
154
162
|
def filter
|
155
|
-
|
163
|
+
SubSetter::Fast::File.new self
|
156
164
|
end
|
157
165
|
|
158
166
|
alias :by :filter
|
@@ -180,6 +188,8 @@ module Fast
|
|
180
188
|
self.delete!
|
181
189
|
return renamed
|
182
190
|
end
|
191
|
+
|
192
|
+
alias :move :rename
|
183
193
|
|
184
194
|
# Like #rename, but overwrites the new file if is exist
|
185
195
|
def rename! *args
|
@@ -195,6 +205,8 @@ module Fast
|
|
195
205
|
return renamed
|
196
206
|
end
|
197
207
|
|
208
|
+
alias :move! :rename!
|
209
|
+
|
198
210
|
# Returns the path to the current file
|
199
211
|
def path
|
200
212
|
@path if @path
|
data/lib/fast/version.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
module SubSetter
|
2
|
+
module Fast
|
3
|
+
# Specific subsetter for Dir entries. Should inherit or invoke the SubSetter::Array
|
4
|
+
# Just a stub for the moment
|
5
|
+
class Dir
|
6
|
+
def initialize set
|
7
|
+
@set = set
|
8
|
+
end
|
9
|
+
|
10
|
+
def extension the_extension
|
11
|
+
return_me = ::Fast::Dir.new
|
12
|
+
@set.each do |entry|
|
13
|
+
return_me << entry if entry.end_with? the_extension
|
14
|
+
end
|
15
|
+
return_me
|
16
|
+
end
|
17
|
+
|
18
|
+
def strip_extension
|
19
|
+
return_me = ::Fast::Dir.new
|
20
|
+
@set.each do |entry|
|
21
|
+
return_me.push entry.gsub /\.(\w+?)$/, ""
|
22
|
+
end
|
23
|
+
return_me
|
24
|
+
end
|
25
|
+
|
26
|
+
def match regexp
|
27
|
+
return_me = ::Fast::Dir.new
|
28
|
+
@set.each do |entry|
|
29
|
+
return_me << entry if entry.match regexp
|
30
|
+
end
|
31
|
+
return_me
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/spec/fast/dir_spec.rb
CHANGED
@@ -2,6 +2,13 @@ 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
|
+
|
5
12
|
shared_examples_for "any dir list" do
|
6
13
|
context "a block is passed as an argument" do
|
7
14
|
it "should pass each entry as argument to the block" do
|
@@ -213,17 +220,13 @@ describe Fast::Dir do
|
|
213
220
|
end
|
214
221
|
|
215
222
|
shared_examples_for "any dir subsetter" do
|
216
|
-
|
217
|
-
# (and later, the Sorting one) should be implemented Fast
|
218
|
-
|
219
|
-
# I guess filtering in Fast will be done in Fast::DirFilter
|
220
|
-
it "should forward self to a filtering object" do
|
223
|
+
it "should forward self to a subsetter object" do
|
221
224
|
Fast::Dir.new.should_not exist "demo"
|
222
225
|
Fast::File.new.touch "demo/in/subdir.file"
|
223
226
|
|
224
227
|
the_demo_dir = Fast::Dir.new :demo
|
225
228
|
|
226
|
-
Fast::
|
229
|
+
SubSetter::Fast::Dir.should_receive( :new ).with the_demo_dir
|
227
230
|
|
228
231
|
the_demo_dir.by
|
229
232
|
|
@@ -317,6 +320,16 @@ describe Fast::Dir do
|
|
317
320
|
}.to raise_error
|
318
321
|
end
|
319
322
|
end
|
323
|
+
|
324
|
+
describe "#del!" do
|
325
|
+
before :each do @method = :del! end
|
326
|
+
it_behaves_like "any dir deletion"
|
327
|
+
|
328
|
+
it "should not fail even if the directory does not exist" do
|
329
|
+
Fast::Dir.new.should_not exist :demo
|
330
|
+
Fast::Dir.new.del! :demo
|
331
|
+
end
|
332
|
+
end
|
320
333
|
|
321
334
|
describe "#destroy" do
|
322
335
|
before :each do @method = :destroy end
|
@@ -327,6 +340,16 @@ describe Fast::Dir do
|
|
327
340
|
}.to raise_error
|
328
341
|
end
|
329
342
|
end
|
343
|
+
|
344
|
+
describe "#destroy!" do
|
345
|
+
before :each do @method = :destroy! end
|
346
|
+
it_behaves_like "any dir deletion"
|
347
|
+
|
348
|
+
it "should not fail even if the directory does not exist" do
|
349
|
+
Fast::Dir.new.should_not exist :demo
|
350
|
+
Fast::Dir.new.destroy! :demo
|
351
|
+
end
|
352
|
+
end
|
330
353
|
|
331
354
|
describe "#unlink" do
|
332
355
|
before :each do @method = :unlink end
|
@@ -339,6 +362,16 @@ describe Fast::Dir do
|
|
339
362
|
end
|
340
363
|
end
|
341
364
|
|
365
|
+
describe "#unlink!" do
|
366
|
+
before :each do @method = :delete! end
|
367
|
+
it_behaves_like "any dir deletion"
|
368
|
+
|
369
|
+
it "should not fail even if the directory does not exist" do
|
370
|
+
Fast::Dir.new.should_not exist :demo
|
371
|
+
Fast::Dir.new.unlink! :demo
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
342
375
|
describe "#remove" do
|
343
376
|
before :each do @method = :remove end
|
344
377
|
it_behaves_like "any dir deletion"
|
@@ -585,6 +618,40 @@ describe Fast::Dir do
|
|
585
618
|
end
|
586
619
|
end
|
587
620
|
|
621
|
+
|
622
|
+
describe "#move" do
|
623
|
+
before :all do @method = :move end
|
624
|
+
it_behaves_like "any dir renaming"
|
625
|
+
|
626
|
+
it "should fail if the new path represents an existing dir" do
|
627
|
+
Fast::Dir.new.should_not exist :demo
|
628
|
+
Fast::Dir.new.should_not exist :renamed
|
629
|
+
Fast::Dir.new.create! :demo
|
630
|
+
Fast::Dir.new.create! :renamed
|
631
|
+
expect { Fast::Dir.new.move :demo, :renamed
|
632
|
+
}.to raise_error ArgumentError, "The target directory 'renamed' already exists"
|
633
|
+
Fast::Dir.new.delete! :demo
|
634
|
+
Fast::Dir.new.delete! :renamed
|
635
|
+
end
|
636
|
+
end
|
637
|
+
|
638
|
+
describe "#move!" do
|
639
|
+
before :all do @method = :move! end
|
640
|
+
it_behaves_like "any dir renaming"
|
641
|
+
|
642
|
+
it "should overwrite the dir at the new path if it exists" do
|
643
|
+
Fast::Dir.new.should_not exist :demo
|
644
|
+
Fast::Dir.new.should_not exist :renamed
|
645
|
+
Fast::File.new.touch "demo/content.file"
|
646
|
+
Fast::File.new.touch "renamed/erase.me"
|
647
|
+
|
648
|
+
Fast::Dir.new.move! :demo, :renamed
|
649
|
+
Fast::File.new.should_not exist "renamed/erase.me"
|
650
|
+
Fast::File.new.should exist "renamed/content.file"
|
651
|
+
Fast::Dir.new.delete! :renamed
|
652
|
+
end
|
653
|
+
end
|
654
|
+
|
588
655
|
shared_examples_for "any dir copy" do
|
589
656
|
before :each do
|
590
657
|
Fast::Dir.new.should_not exist :demo
|
@@ -728,6 +795,7 @@ describe Fast::Dir do
|
|
728
795
|
Fast::File.new.touch "demo/file.txt"
|
729
796
|
|
730
797
|
the_file = Fast::Dir.new(:demo)["file.txt"]
|
798
|
+
the_file.should be_a Fast::File
|
731
799
|
the_file.path.should == "demo/file.txt"
|
732
800
|
end
|
733
801
|
end
|
@@ -740,7 +808,7 @@ describe Fast::Dir do
|
|
740
808
|
end
|
741
809
|
end
|
742
810
|
|
743
|
-
context "an
|
811
|
+
context "an integer is sent" do
|
744
812
|
it "should behave like an array" do
|
745
813
|
Fast::File.new.touch "demo/file.txt"
|
746
814
|
|
@@ -780,14 +848,52 @@ describe Fast::Dir do
|
|
780
848
|
end
|
781
849
|
|
782
850
|
context "the content is a hash" do
|
783
|
-
it "should create the subdir"
|
851
|
+
it "should create the subdir" do
|
852
|
+
the_dir = Fast::Dir.new :demo
|
853
|
+
the_dir[:subdir] = {}
|
854
|
+
Fast::Dir.new.should exist "demo/subdir"
|
855
|
+
end
|
856
|
+
|
857
|
+
it "should create files for each key pointing to a String" do
|
858
|
+
the_dir = Fast::Dir.new :demo
|
859
|
+
the_dir[:subdir] = {
|
860
|
+
"file.txt" => "The demo contents are awesome",
|
861
|
+
"other.data" => "10101010001100011" }
|
862
|
+
Fast::File.new.read( "demo/subdir/file.txt" ).should include "The demo contents are awesome"
|
863
|
+
Fast::File.new.read( "demo/subdir/other.data" ).should include "10101010001100011"
|
864
|
+
end
|
865
|
+
|
866
|
+
it "should created directories for each key pointing to a Hash" do
|
867
|
+
the_dir = Fast::Dir.new :demo
|
868
|
+
the_dir[:subdir] = {
|
869
|
+
:subsub => {},
|
870
|
+
:data => {}
|
871
|
+
}
|
872
|
+
Fast::Dir.new.should exist "demo/subdir/subsub"
|
873
|
+
Fast::Dir.new.should exist "demo/subdir/data"
|
874
|
+
end
|
784
875
|
|
785
|
-
it "should create recursively the tree"
|
876
|
+
it "should create recursively the tree" do
|
877
|
+
the_dir = Fast::Dir.new :demo
|
878
|
+
|
879
|
+
the_dir[:subdir] = {
|
880
|
+
|
881
|
+
:subsub => {
|
882
|
+
:data => {},
|
883
|
+
"other.txt" => "More than this"
|
884
|
+
},
|
885
|
+
|
886
|
+
"demo.txt" => "Some file content"
|
887
|
+
}
|
888
|
+
|
889
|
+
Fast::Dir.new.should exist "demo/subdir/subsub/data"
|
890
|
+
Fast::File.new.read("demo/subdir/subsub/other.txt").should include "More than this"
|
891
|
+
Fast::File.new.read("demo/subdir/demo.txt").should include "Some file content"
|
892
|
+
end
|
786
893
|
end
|
787
894
|
|
788
895
|
after :each do
|
789
896
|
Fast::Dir.new.delete! :demo
|
790
897
|
end
|
791
898
|
end
|
792
|
-
|
793
899
|
end
|
data/spec/fast/file_spec.rb
CHANGED
@@ -6,6 +6,10 @@ require "zucker/os"
|
|
6
6
|
|
7
7
|
describe Fast::File do
|
8
8
|
|
9
|
+
context "a Fast::File is passed as argument where a path is accepted" do
|
10
|
+
it "should be accepted"
|
11
|
+
end
|
12
|
+
|
9
13
|
shared_examples_for "any file content appending" do
|
10
14
|
it "should create the file if it does not exist" do
|
11
15
|
::File.should_not exist "demo.txt"
|
@@ -178,17 +182,66 @@ describe Fast::File do
|
|
178
182
|
before :each do @method = :unlink end
|
179
183
|
it_behaves_like "any file deletion"
|
180
184
|
end
|
185
|
+
|
186
|
+
describe "#unlink!" do
|
187
|
+
before :each do @method = :unlink! end
|
188
|
+
it_behaves_like "any file deletion"
|
189
|
+
|
190
|
+
it "should not fail if the file does not exist" do
|
191
|
+
Fast::File.new.should_not exist "the_file.txt"
|
192
|
+
expect { Fast::File.new.unlink! "the_file.txt"
|
193
|
+
}.to_not raise_error
|
194
|
+
end
|
195
|
+
end
|
181
196
|
|
182
197
|
describe "#del" do
|
183
198
|
before :each do @method = :del end
|
184
199
|
it_behaves_like "any file deletion"
|
185
200
|
end
|
186
201
|
|
202
|
+
describe "#del!" do
|
203
|
+
before :each do @method = :del! end
|
204
|
+
it_behaves_like "any file deletion"
|
205
|
+
|
206
|
+
it "should not fail if the file does not exist" do
|
207
|
+
Fast::File.new.should_not exist "the_file.txt"
|
208
|
+
expect { Fast::File.new.del! "the_file.txt"
|
209
|
+
}.to_not raise_error
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
187
213
|
describe "#destroy" do
|
188
214
|
before :each do @method = :destroy end
|
189
215
|
it_behaves_like "any file deletion"
|
190
216
|
end
|
191
|
-
|
217
|
+
|
218
|
+
describe "#destroy!" do
|
219
|
+
before :each do @method = :destroy! end
|
220
|
+
it_behaves_like "any file deletion"
|
221
|
+
|
222
|
+
it "should not fail if the file does not exist" do
|
223
|
+
Fast::File.new.should_not exist "the_file.txt"
|
224
|
+
expect { Fast::File.new.destroy! "the_file.txt"
|
225
|
+
}.to_not raise_error
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
describe "#remove" do
|
230
|
+
before :each do @method = :remove end
|
231
|
+
it_behaves_like "any file deletion"
|
232
|
+
end
|
233
|
+
|
234
|
+
describe "#remove!" do
|
235
|
+
before :each do @method = :remove! end
|
236
|
+
it_behaves_like "any file deletion"
|
237
|
+
|
238
|
+
it "should not fail if the file does not exist" do
|
239
|
+
Fast::File.new.should_not exist "the_file.txt"
|
240
|
+
expect { Fast::File.new.remove! "the_file.txt"
|
241
|
+
}.to_not raise_error
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
192
245
|
shared_examples_for "any file creation" do
|
193
246
|
context "in current folder" do
|
194
247
|
it "should create the file if it does not exist" do
|
@@ -471,16 +524,10 @@ describe Fast::File do
|
|
471
524
|
end
|
472
525
|
|
473
526
|
shared_examples_for "any file subsetter" do
|
474
|
-
#
|
475
|
-
# on http://xaviervia.com.ar/patterns/sub-setter
|
476
|
-
#
|
477
|
-
# This is a reminder: along with Serializer, the Subsetter pattern
|
478
|
-
# (and later, the Sorting one) should be implemented Fast
|
479
|
-
#
|
480
|
-
# Fast::FileFilter will be deprecated soon
|
527
|
+
# SubSetter as described in http://xaviervia.com.ar/patterns/sub-setter
|
481
528
|
it "should forward self to a filtering object" do
|
482
529
|
the_demo_file = Fast::File.new :demo
|
483
|
-
Fast::
|
530
|
+
SubSetter::Fast::File.should_receive( :new ).with the_demo_file
|
484
531
|
the_demo_file.by
|
485
532
|
end
|
486
533
|
end
|
@@ -600,6 +647,43 @@ describe Fast::File do
|
|
600
647
|
end
|
601
648
|
end
|
602
649
|
|
650
|
+
describe "#move" do
|
651
|
+
before :all do @method = :move end
|
652
|
+
it_behaves_like "any file renaming"
|
653
|
+
|
654
|
+
it "should fail if a file named as the new name exists" do
|
655
|
+
Fast::File.new.should_not exist "demo.file"
|
656
|
+
Fast::File.new.should_not exist "renamed.file"
|
657
|
+
Fast::File.new.touch "renamed.file"
|
658
|
+
Fast::File.new.write "demo.file", "Demo content bores me"
|
659
|
+
|
660
|
+
expect { Fast::File.new.move "demo.file", "renamed.file"
|
661
|
+
}.to raise_error ArgumentError, "The file 'renamed.file' already exists"
|
662
|
+
|
663
|
+
Fast::File.new.delete! "demo.file"
|
664
|
+
Fast::File.new.delete! "renamed.file"
|
665
|
+
end
|
666
|
+
end
|
667
|
+
|
668
|
+
describe "#move!" do
|
669
|
+
before :all do @method = :move! end
|
670
|
+
it_behaves_like "any file renaming"
|
671
|
+
|
672
|
+
it "should overwrite the new file if it exists" do
|
673
|
+
Fast::File.new.should_not exist "demo.file"
|
674
|
+
Fast::File.new.should_not exist "renamed.file"
|
675
|
+
Fast::File.new.touch "renamed.file"
|
676
|
+
Fast::File.new.write "demo.file", "Demo content bores me"
|
677
|
+
|
678
|
+
Fast::File.new.move! "demo.file", "renamed.file"
|
679
|
+
|
680
|
+
Fast::File.new.should_not exist "demo.file"
|
681
|
+
Fast::File.new.read( "renamed.file" ).should == "Demo content bores me"
|
682
|
+
|
683
|
+
Fast::File.new.delete! "renamed.file"
|
684
|
+
end
|
685
|
+
end
|
686
|
+
|
603
687
|
describe "#merge" do
|
604
688
|
before :each do
|
605
689
|
Fast::File.new.should_not exist "demo.txt"
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require "fast"
|
2
2
|
require "zucker/os"
|
3
3
|
|
4
|
-
describe Fast::
|
4
|
+
describe SubSetter::Fast::Dir do
|
5
5
|
describe "#extension" do
|
6
6
|
context "when given a list of file names and a extension" do
|
7
7
|
it "should return a Dir of the files with the given extension" do
|
8
8
|
list = ["file.txt", "data.txt", "thumbs.db", "data.txt.jpg"]
|
9
|
-
final_list = Fast::
|
9
|
+
final_list = SubSetter::Fast::Dir.new( list ).extension "txt"
|
10
10
|
final_list.should be_a Fast::Dir
|
11
11
|
final_list.should include "file.txt"
|
12
12
|
final_list.should include "data.txt"
|
@@ -19,7 +19,7 @@ describe Fast::DirFilter do
|
|
19
19
|
describe "#strip_extension" do
|
20
20
|
it "should return a Dir with the files names without extension" do
|
21
21
|
list = ["file.txt", "data.txt", "thumbs.db", "data.txt.jpg", "noext"]
|
22
|
-
final_list = Fast::
|
22
|
+
final_list = SubSetter::Fast::Dir.new( list ).strip_extension
|
23
23
|
final_list.should be_a Fast::Dir
|
24
24
|
final_list.should include "file"
|
25
25
|
final_list.should include "data"
|
@@ -28,18 +28,12 @@ describe Fast::DirFilter do
|
|
28
28
|
final_list.should include "noext"
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
32
|
-
# VERY IMPORTANT: DirFilter should extend a class ListFilter
|
33
|
-
# #match implementation (along with a short list of other things) should
|
34
|
-
# be done in ListFilter, not in DirFilter
|
35
|
-
#
|
36
|
-
# The SubSetter pattern is still not defined nor implemented: I'll start by
|
37
|
-
# finishing Fast and after that I'll dig deeper into SubSetting
|
31
|
+
|
38
32
|
describe "#match" do
|
39
33
|
context "when given a list of strings and a regexp" do
|
40
34
|
it "should return a Dir containing the strings that match the expression" do
|
41
35
|
list = %w{is_a_file think_of_me not_my_file filesystem see_file_you}
|
42
|
-
final_list = Fast::
|
36
|
+
final_list = SubSetter::Fast::Dir.new( list ).match /file/
|
43
37
|
final_list.should be_a Fast::Dir
|
44
38
|
final_list.should include "is_a_file"
|
45
39
|
final_list.should include "not_my_file"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-02-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: metafun
|
16
|
-
requirement: &
|
16
|
+
requirement: &76004770 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 0.2.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *76004770
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &76004410 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *76004410
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: zucker
|
38
|
-
requirement: &
|
38
|
+
requirement: &76004040 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *76004040
|
47
47
|
description: DSL for file system interaction
|
48
48
|
email:
|
49
49
|
- xavierviacanel@gmail.com
|
@@ -52,21 +52,23 @@ extensions: []
|
|
52
52
|
extra_rdoc_files: []
|
53
53
|
files:
|
54
54
|
- .gitignore
|
55
|
+
- .rvmrc
|
55
56
|
- Gemfile
|
57
|
+
- Gemfile.lock
|
56
58
|
- README.rdoc
|
57
59
|
- Rakefile
|
58
60
|
- fast.gemspec
|
59
61
|
- lib/fast.rb
|
60
|
-
- lib/fast/dir-filter.rb
|
61
62
|
- lib/fast/dir.rb
|
62
63
|
- lib/fast/fast.rb
|
63
|
-
- lib/fast/file-filter.rb
|
64
64
|
- lib/fast/file.rb
|
65
65
|
- lib/fast/version.rb
|
66
|
-
-
|
66
|
+
- lib/sub-setter/fast/dir.rb
|
67
|
+
- lib/sub-setter/fast/file.rb
|
67
68
|
- spec/fast/dir_spec.rb
|
68
69
|
- spec/fast/fast_spec.rb
|
69
70
|
- spec/fast/file_spec.rb
|
71
|
+
- spec/sub-setter/fast/dir_spec.rb
|
70
72
|
homepage: ''
|
71
73
|
licenses: []
|
72
74
|
post_install_message:
|
@@ -87,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
89
|
version: '0'
|
88
90
|
requirements: []
|
89
91
|
rubyforge_project: fast
|
90
|
-
rubygems_version: 1.8.
|
92
|
+
rubygems_version: 1.8.15
|
91
93
|
signing_key:
|
92
94
|
specification_version: 3
|
93
95
|
summary: DSL for file system interaction
|
data/lib/fast/dir-filter.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
module Fast
|
2
|
-
# Specific filter for Dir entries. Should inherit or invoke a Generic Filter
|
3
|
-
# Just a stub for the moment
|
4
|
-
class DirFilter
|
5
|
-
def initialize set
|
6
|
-
@set = set
|
7
|
-
end
|
8
|
-
|
9
|
-
def extension the_extension
|
10
|
-
return_me = Dir.new
|
11
|
-
@set.each do |entry|
|
12
|
-
return_me << entry if entry.end_with? the_extension
|
13
|
-
end
|
14
|
-
return_me
|
15
|
-
end
|
16
|
-
|
17
|
-
def strip_extension
|
18
|
-
return_me = Dir.new
|
19
|
-
@set.each do |entry|
|
20
|
-
return_me.push entry.gsub /\.(\w+?)$/, ""
|
21
|
-
end
|
22
|
-
return_me
|
23
|
-
end
|
24
|
-
|
25
|
-
def match regexp
|
26
|
-
return_me = Dir.new
|
27
|
-
@set.each do |entry|
|
28
|
-
return_me << entry if entry.match regexp
|
29
|
-
end
|
30
|
-
return_me
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|