fast 0.0.2 → 0.0.3
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/README.rdoc +30 -0
- data/lib/fast/dir-filter.rb +9 -0
- data/lib/fast/dir.rb +108 -7
- data/lib/fast/file-filter.rb +9 -0
- data/lib/fast/file.rb +61 -12
- data/lib/fast/version.rb +1 -1
- data/lib/fast.rb +13 -14
- data/spec/fast/dir_spec.rb +326 -13
- data/spec/fast/file_spec.rb +212 -32
- metadata +6 -3
data/README.rdoc
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
= Fast
|
2
|
+
|
3
|
+
DSL for file handling focused in intuitivity and semantics.
|
4
|
+
|
5
|
+
Library is pure Ruby 1.8.7, no FileUtils nor other dependencies (except Metafun for DSL delegation)
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
|
9
|
+
Don't install right now, as 13-09-2011 this is pre-alpha, but in intensive development.
|
10
|
+
|
11
|
+
== Philosophy
|
12
|
+
|
13
|
+
<tt>Fast</tt> embraces the more straightforward view of files as strings of data and directories as arrays of files/directories. Some arguments:
|
14
|
+
|
15
|
+
* It is more realistic in everyday usage
|
16
|
+
* It makes them more object-like (and thus, more friendly to OOP)
|
17
|
+
* Is more semantic
|
18
|
+
* Files as IOs are still accessible through the harder-to-use native Ruby API
|
19
|
+
|
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
|
+
|
22
|
+
== Quick notes
|
23
|
+
* 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
|
+
* An instance of Fast::Dir should be possible to be created from a Array.
|
25
|
+
|
26
|
+
== License
|
27
|
+
|
28
|
+
GPL License. Why else?
|
29
|
+
|
30
|
+
@ Xavier Via
|
data/lib/fast/dir.rb
CHANGED
@@ -1,16 +1,117 @@
|
|
1
1
|
module Fast
|
2
2
|
# Directory handling class
|
3
|
-
class Dir
|
4
|
-
# .call -> like Fast::File.call
|
3
|
+
class Dir < Array
|
4
|
+
# .call -> like Fast::File.call -> NOUP: make delegator pattern Singleton-like
|
5
|
+
def initialize path = nil
|
6
|
+
super()
|
7
|
+
@path = normalize path if path
|
8
|
+
end
|
5
9
|
|
6
|
-
#
|
10
|
+
# Returns a Fast::Dir list with all items in the directory, except ".." and "."
|
11
|
+
def list path = nil, &block
|
12
|
+
@path = normalize path if path
|
13
|
+
::Dir.foreach @path do |entry|
|
14
|
+
unless entry == "." or entry == ".."
|
15
|
+
self << entry
|
16
|
+
block.call entry if block
|
17
|
+
end
|
18
|
+
end
|
19
|
+
self
|
20
|
+
end
|
7
21
|
|
8
|
-
#
|
22
|
+
# Returns a Fast::Dir list of all files in the directory. Non recursive
|
23
|
+
# (at least yet)
|
24
|
+
def files path = nil, &block
|
25
|
+
@path = normalize path if path
|
26
|
+
::Dir.foreach @path do |entry|
|
27
|
+
unless ::File.directory? "#{@path}/#{entry}"
|
28
|
+
self << entry
|
29
|
+
block.call entry if block
|
30
|
+
end
|
31
|
+
end
|
32
|
+
self
|
33
|
+
end
|
9
34
|
|
10
|
-
#
|
35
|
+
# Returns a Fast::Dir list of all directories in the directory, non-recursive
|
36
|
+
# and excluding points
|
37
|
+
def dirs path = nil, &block
|
38
|
+
@path = normalize path if path
|
39
|
+
::Dir.foreach @path do |entry|
|
40
|
+
if ::File.directory? "#{@path}/#{entry}" and entry != "." and entry != ".."
|
41
|
+
self << entry
|
42
|
+
block.call entry if block
|
43
|
+
end
|
44
|
+
end
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
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
|
58
|
+
end
|
59
|
+
end unless ::File.directory? @path
|
60
|
+
self
|
61
|
+
end
|
11
62
|
|
12
|
-
|
63
|
+
alias :create! :create
|
13
64
|
|
14
|
-
#
|
65
|
+
# 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}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
::Dir.unlink @path
|
76
|
+
@path
|
77
|
+
end
|
78
|
+
|
79
|
+
alias :delete! :delete
|
80
|
+
alias :destroy :delete
|
81
|
+
alias :del :delete
|
82
|
+
alias :unlink :delete
|
83
|
+
|
84
|
+
# Checks for existence. True if the directory exists, false otherwise
|
85
|
+
def exist? path = nil
|
86
|
+
@path = normalize path if path
|
87
|
+
::File.directory? @path
|
88
|
+
end
|
89
|
+
|
90
|
+
alias :exists? :exist?
|
91
|
+
|
92
|
+
# Returns a String brief of the dir
|
93
|
+
def to_s
|
94
|
+
return "#{@path}"
|
95
|
+
end
|
96
|
+
|
97
|
+
# Sends self to a DirFilter filter
|
98
|
+
def filter
|
99
|
+
DirFilter.new self
|
100
|
+
end
|
101
|
+
|
102
|
+
alias :by :filter
|
103
|
+
|
104
|
+
# Expands the path to absolute is it is relative
|
105
|
+
def expand path = nil
|
106
|
+
@path = normalize path if path
|
107
|
+
::File.expand_path @path
|
108
|
+
end
|
109
|
+
|
110
|
+
alias :absolute :expand
|
111
|
+
|
112
|
+
private
|
113
|
+
def normalize path
|
114
|
+
@path = "#{path}"
|
115
|
+
end
|
15
116
|
end
|
16
117
|
end
|
data/lib/fast/file.rb
CHANGED
@@ -1,11 +1,26 @@
|
|
1
1
|
module Fast
|
2
2
|
# File handling class.
|
3
|
-
class File
|
3
|
+
class File < String
|
4
|
+
|
5
|
+
# Initializes the file
|
6
|
+
def initialize source = nil
|
7
|
+
unless source.nil?
|
8
|
+
super( "#{source}" )
|
9
|
+
else
|
10
|
+
super()
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
4
14
|
# Appends the passed content to the file `path`
|
5
15
|
# Creates the file if it doesn't exist.
|
6
16
|
# Creates all the necesary folders if they don't exist
|
7
|
-
def append
|
8
|
-
|
17
|
+
def append *args
|
18
|
+
if args.length > 1
|
19
|
+
path, content = *args
|
20
|
+
@path = normalize path
|
21
|
+
else
|
22
|
+
content = args.first
|
23
|
+
end
|
9
24
|
Fast.dir! ::File.dirname @path if ::File.dirname(@path) != "."
|
10
25
|
::File.open @path, "a" do |handler|
|
11
26
|
handler.write content
|
@@ -14,8 +29,8 @@ module Fast
|
|
14
29
|
end
|
15
30
|
|
16
31
|
# Deletes the file (wrapper for `File.unlink <path>`)
|
17
|
-
def delete path
|
18
|
-
@path = normalize path
|
32
|
+
def delete path = nil
|
33
|
+
@path = normalize path if path
|
19
34
|
::File.unlink @path
|
20
35
|
@path
|
21
36
|
end
|
@@ -23,18 +38,57 @@ module Fast
|
|
23
38
|
alias :destroy :delete
|
24
39
|
alias :unlink :delete
|
25
40
|
alias :del :delete
|
41
|
+
alias :delete! :delete
|
26
42
|
|
27
43
|
# Touches the file passed. Like bash `touch`, but creates
|
28
44
|
# all required directories if they don't exist
|
29
45
|
def touch path
|
30
|
-
@path = normalize path
|
31
|
-
Fast.
|
46
|
+
@path = normalize path if path
|
47
|
+
Fast::Dir.new.create ::File.dirname @path if ::File.dirname(@path) != "."
|
32
48
|
::File.open @path, "a+" do |file|
|
33
49
|
file.gets; file.write ""
|
34
50
|
end
|
35
51
|
@path
|
36
52
|
end
|
37
53
|
|
54
|
+
alias :create :touch
|
55
|
+
alias :create! :touch
|
56
|
+
|
57
|
+
# Returns the contents of the file, all at once
|
58
|
+
def read path
|
59
|
+
@path = normalize path if path
|
60
|
+
::File.read @path
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns true if file exists, false otherwise
|
64
|
+
def exist? path
|
65
|
+
@path = normalize path if path
|
66
|
+
::File.exist? @path
|
67
|
+
end
|
68
|
+
|
69
|
+
alias :exists? :exist?
|
70
|
+
|
71
|
+
# Sends self to a FileFilter filter
|
72
|
+
def filter
|
73
|
+
FileFilter.new self
|
74
|
+
end
|
75
|
+
|
76
|
+
alias :by :filter
|
77
|
+
|
78
|
+
# Expands the path if it's a relative path
|
79
|
+
def expand path = nil
|
80
|
+
@path = normalize path if path
|
81
|
+
::File.expand_path @path
|
82
|
+
end
|
83
|
+
|
84
|
+
alias :absolute :expand
|
85
|
+
|
86
|
+
private
|
87
|
+
def normalize path
|
88
|
+
"#{path}"
|
89
|
+
end
|
90
|
+
|
91
|
+
# Deprecated!
|
38
92
|
def self.call *args
|
39
93
|
if args.empty?
|
40
94
|
File.new
|
@@ -42,10 +96,5 @@ module Fast
|
|
42
96
|
::File.read args.shift
|
43
97
|
end
|
44
98
|
end
|
45
|
-
|
46
|
-
private
|
47
|
-
def normalize path
|
48
|
-
"#{path}"
|
49
|
-
end
|
50
99
|
end
|
51
100
|
end
|
data/lib/fast/version.rb
CHANGED
data/lib/fast.rb
CHANGED
@@ -2,6 +2,8 @@ require "metafun/delegator"
|
|
2
2
|
|
3
3
|
require "fast/file"
|
4
4
|
require "fast/dir"
|
5
|
+
require "fast/dir-filter"
|
6
|
+
require "fast/file-filter"
|
5
7
|
|
6
8
|
module Fast
|
7
9
|
# Returns the list of entries in the directory
|
@@ -11,10 +13,11 @@ module Fast
|
|
11
13
|
# `:strip_extension => true` # If an `:extension` is given, returns the
|
12
14
|
# # entries without it
|
13
15
|
def self.dir path, options = nil
|
16
|
+
current = Dir.new path
|
14
17
|
if options
|
15
18
|
if options[:extension]
|
16
19
|
filtered = []
|
17
|
-
|
20
|
+
current.list path do |entry|
|
18
21
|
if entry.end_with? ".#{options[:extension]}"
|
19
22
|
if options[:strip_extension]
|
20
23
|
filtered << entry[0..-("#{options[:extension]}".length)-2]
|
@@ -26,20 +29,25 @@ module Fast
|
|
26
29
|
return filtered
|
27
30
|
end
|
28
31
|
else
|
29
|
-
|
32
|
+
current.list path
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
33
36
|
# Like `dir`, but creates the directory if it does not exist
|
34
37
|
def self.dir! path, options = nil
|
35
|
-
|
38
|
+
Dir.new.create! path unless dir? path
|
36
39
|
dir path, options
|
37
40
|
end
|
38
41
|
|
39
42
|
# Returns true if a directory named `path` exists, false otherwise.
|
40
43
|
# (wrapper for `File.directory? <path>`)
|
41
44
|
def self.dir? path
|
42
|
-
|
45
|
+
Dir.new.exist? path
|
46
|
+
end
|
47
|
+
|
48
|
+
# Example. This all will be deprecated when features are done
|
49
|
+
def self.file? path
|
50
|
+
File.new.exist? path
|
43
51
|
end
|
44
52
|
|
45
53
|
# Returns an instance of Fast::File and passed all methods
|
@@ -47,17 +55,8 @@ module Fast
|
|
47
55
|
def self.file *args
|
48
56
|
Fast::File.call *args
|
49
57
|
end
|
50
|
-
|
51
|
-
private
|
52
|
-
def self.mkdir path
|
53
|
-
path.split("/").each do |part|
|
54
|
-
route ||= part
|
55
|
-
::Dir.mkdir route unless route == "" || ::File.directory?( route )
|
56
|
-
route += "/#{path}"
|
57
|
-
end
|
58
|
-
end
|
59
58
|
end
|
60
59
|
|
61
60
|
include Metafun::Delegator
|
62
61
|
|
63
|
-
delegate Fast, :dir, :dir?, :dir!, :file, :
|
62
|
+
delegate Fast, :dir, :dir?, :dir!, :file, :file?
|
data/spec/fast/dir_spec.rb
CHANGED
@@ -1,35 +1,348 @@
|
|
1
1
|
require "fast"
|
2
|
+
require "zucker/os"
|
2
3
|
|
3
4
|
describe Fast::Dir do
|
5
|
+
shared_examples_for "any dir list" do
|
6
|
+
context "a block is passed as an argument" do
|
7
|
+
it "should pass each entry as argument to the block" do
|
8
|
+
::File.should_not be_directory "demo"
|
9
|
+
Fast::File.new.touch "demo/myfile.txt"
|
10
|
+
Fast::File.new.touch "demo/otherfile.txt"
|
11
|
+
Fast::Dir.new.create "demo/subdir"
|
12
|
+
|
13
|
+
iteration = []
|
14
|
+
list = Fast::Dir.new.send @method, "demo" do |entry|
|
15
|
+
iteration << entry
|
16
|
+
end
|
17
|
+
|
18
|
+
iteration.should == list
|
19
|
+
|
20
|
+
Fast::Dir.new.delete! "demo"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
4
25
|
describe "#list" do
|
5
|
-
|
26
|
+
before :each do @method = :list end
|
27
|
+
it_behaves_like "any dir list"
|
28
|
+
|
29
|
+
it "should return a list of all items in the directory, excluding '.' & '..'" do
|
30
|
+
::File.should_not be_directory "demo"
|
31
|
+
::Dir.mkdir "demo"
|
32
|
+
Fast::File.new.touch "demo/alice.txt"
|
33
|
+
Fast::File.new.touch "demo/betty.txt"
|
34
|
+
Fast::File.new.touch "demo/chris.txt"
|
35
|
+
::Dir.mkdir "demo/subdir"
|
36
|
+
|
37
|
+
Fast::Dir.new.list( "demo" ).should include "alice.txt"
|
38
|
+
Fast::Dir.new.list( "demo" ).should include "betty.txt"
|
39
|
+
Fast::Dir.new.list( "demo" ).should include "chris.txt"
|
40
|
+
Fast::Dir.new.list( "demo" ).should include "subdir"
|
41
|
+
Fast::Dir.new.list( "demo" ).should_not include ".."
|
42
|
+
Fast::Dir.new.list( "demo" ).should_not include "."
|
43
|
+
|
44
|
+
::Dir.unlink "demo/subdir"
|
45
|
+
::File.unlink "demo/chris.txt"
|
46
|
+
::File.unlink "demo/betty.txt"
|
47
|
+
::File.unlink "demo/alice.txt"
|
48
|
+
::Dir.unlink "demo"
|
49
|
+
end
|
6
50
|
end
|
7
51
|
|
8
52
|
describe "#files" do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
53
|
+
before :each do @method = :files end
|
54
|
+
it_behaves_like "any dir list"
|
55
|
+
|
56
|
+
it "should return a list of all files in the directory" do
|
57
|
+
::File.should_not be_directory "demo"
|
58
|
+
::Dir.mkdir "demo"
|
59
|
+
Fast::File.new.touch "demo/alice.txt"
|
60
|
+
Fast::File.new.touch "demo/betty.txt"
|
61
|
+
Fast::File.new.touch "demo/chris.txt"
|
62
|
+
::Dir.mkdir "demo/subdir"
|
63
|
+
|
64
|
+
Fast::Dir.new.files( "demo" ).should include "alice.txt"
|
65
|
+
Fast::Dir.new.files( "demo" ).should include "betty.txt"
|
66
|
+
Fast::Dir.new.files( "demo" ).should include "chris.txt"
|
67
|
+
Fast::Dir.new.files( "demo" ).should_not include "subdir"
|
68
|
+
Fast::Dir.new.files( "demo" ).should_not include ".."
|
69
|
+
Fast::Dir.new.files( "demo" ).should_not include "."
|
70
|
+
|
71
|
+
::Dir.unlink "demo/subdir"
|
72
|
+
::File.unlink "demo/chris.txt"
|
73
|
+
::File.unlink "demo/betty.txt"
|
74
|
+
::File.unlink "demo/alice.txt"
|
75
|
+
::Dir.unlink "demo"
|
13
76
|
end
|
14
77
|
end
|
15
78
|
|
16
79
|
describe "#dirs" do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
80
|
+
before :each do @method = :dirs end
|
81
|
+
it_behaves_like "any dir list"
|
82
|
+
|
83
|
+
it "should return a list containing all dirs in the directory, excludind dots" do
|
84
|
+
::File.should_not be_directory "demo"
|
85
|
+
::Dir.mkdir "demo"
|
86
|
+
Fast::File.new.touch "demo/alice.txt"
|
87
|
+
Fast::File.new.touch "demo/betty.txt"
|
88
|
+
Fast::File.new.touch "demo/chris.txt"
|
89
|
+
::Dir.mkdir "demo/subdir"
|
90
|
+
::Dir.mkdir "demo/endodir"
|
91
|
+
|
92
|
+
Fast::Dir.new.dirs( "demo" ).should_not include "alice.txt"
|
93
|
+
Fast::Dir.new.dirs( "demo" ).should_not include "betty.txt"
|
94
|
+
Fast::Dir.new.dirs( "demo" ).should_not include "chris.txt"
|
95
|
+
Fast::Dir.new.dirs( "demo" ).should include "subdir"
|
96
|
+
Fast::Dir.new.dirs( "demo" ).should include "endodir"
|
97
|
+
Fast::Dir.new.dirs( "demo" ).should_not include ".."
|
98
|
+
Fast::Dir.new.dirs( "demo" ).should_not include "."
|
99
|
+
|
100
|
+
::Dir.unlink "demo/subdir"
|
101
|
+
::Dir.unlink "demo/endodir"
|
102
|
+
::File.unlink "demo/chris.txt"
|
103
|
+
::File.unlink "demo/betty.txt"
|
104
|
+
::File.unlink "demo/alice.txt"
|
105
|
+
::Dir.unlink "demo"
|
21
106
|
end
|
22
107
|
end
|
23
108
|
|
24
|
-
|
109
|
+
shared_examples_for "any dir creation" do
|
25
110
|
context "is a simple path" do
|
26
|
-
it "should create the dir"
|
111
|
+
it "should create the dir" do
|
112
|
+
::File.should_not be_directory "demo"
|
113
|
+
|
114
|
+
Fast::Dir.new.send @method, "demo"
|
115
|
+
::File.should be_directory "demo"
|
116
|
+
::Dir.unlink "demo"
|
117
|
+
end
|
27
118
|
|
28
|
-
it "should return the directory path"
|
119
|
+
it "should return the directory path" do
|
120
|
+
::File.should_not be_directory "demo"
|
121
|
+
"#{Fast::Dir.new.create('demo')}".should include "demo"
|
122
|
+
::Dir.unlink "demo"
|
123
|
+
end
|
29
124
|
end
|
30
125
|
|
31
126
|
context "it is nested within dirs" do
|
32
|
-
it "should create the directory tree"
|
127
|
+
it "should create the directory tree" do
|
128
|
+
::File.should_not be_directory "demo"
|
129
|
+
|
130
|
+
Fast::Dir.new.send @method, "demo/subdir"
|
131
|
+
::File.should be_directory "demo"
|
132
|
+
::File.should be_directory "demo/subdir"
|
133
|
+
|
134
|
+
::Dir.unlink "demo/subdir"
|
135
|
+
::Dir.unlink "demo"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "it is nested within several dirs" do
|
140
|
+
it "should create the directory tree" do
|
141
|
+
::File.should_not be_directory "demo"
|
142
|
+
|
143
|
+
Fast::Dir.new.send @method, "demo/in/several/subdirs"
|
144
|
+
::File.should be_directory "demo/in/several/subdirs"
|
145
|
+
|
146
|
+
::Dir.unlink "demo/in/several/subdirs"
|
147
|
+
::Dir.unlink "demo/in/several"
|
148
|
+
::Dir.unlink "demo/in"
|
149
|
+
::Dir.unlink "demo"
|
150
|
+
end
|
33
151
|
end
|
34
152
|
end
|
153
|
+
|
154
|
+
describe "#create" do
|
155
|
+
before :each do @method = :create end
|
156
|
+
it_behaves_like "any dir creation"
|
157
|
+
end
|
158
|
+
|
159
|
+
describe "#create!" do
|
160
|
+
before :each do @method = :create! end
|
161
|
+
it_behaves_like "any dir creation"
|
162
|
+
end
|
163
|
+
|
164
|
+
shared_examples_for "any dir subsetter" do
|
165
|
+
# This is a reminder: along with Serializer, the Subsette pattern
|
166
|
+
# (and later, the Sorting one) should be implemented Fast
|
167
|
+
|
168
|
+
# I guess filtering in Fast will be done in Fast::DirFilter
|
169
|
+
it "should forward self to a filtering object" do
|
170
|
+
Fast::Dir.new.should_not exist "demo"
|
171
|
+
Fast::File.new.touch "demo/in/subdir.file"
|
172
|
+
|
173
|
+
the_demo_dir = Fast::Dir.new :demo
|
174
|
+
|
175
|
+
Fast::DirFilter.should_receive( :new ).with the_demo_dir
|
176
|
+
|
177
|
+
the_demo_dir.by
|
178
|
+
|
179
|
+
the_demo_dir.delete!
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
describe "#by" do
|
184
|
+
before :each do @method = :by end
|
185
|
+
it_behaves_like "any dir subsetter"
|
186
|
+
end
|
187
|
+
|
188
|
+
describe "#filter" do
|
189
|
+
before :each do @method = :filter end
|
190
|
+
it_behaves_like "any dir subsetter"
|
191
|
+
end
|
192
|
+
|
193
|
+
|
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
|
+
|
201
|
+
it "should delete the directory if it exists" do
|
202
|
+
::File.should_not be_directory "demo"
|
203
|
+
Fast::Dir.new.create "demo"
|
204
|
+
Fast::Dir.new.send @method, "demo"
|
205
|
+
::File.should_not be_directory "demo"
|
206
|
+
end
|
207
|
+
|
208
|
+
context "the dir has content" do
|
209
|
+
it "should delete the content and the dir" do
|
210
|
+
::File.should_not be_directory "demo"
|
211
|
+
|
212
|
+
Fast::Dir.new.create "demo"
|
213
|
+
Fast::Dir.new.create "demo/subdir"
|
214
|
+
Fast::File.new.touch "demo/in/subdir.txt"
|
215
|
+
|
216
|
+
Fast::Dir.new.send @method, "demo"
|
217
|
+
|
218
|
+
::File.should_not exist "demo/in/subdir.txt"
|
219
|
+
::File.should_not be_directory "demo/in"
|
220
|
+
::File.should_not be_directory "demo/subdir"
|
221
|
+
::File.should_not be_directory "demo"
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
it "should return the deleted dir path" do
|
226
|
+
::File.should_not be_directory "demo"
|
227
|
+
Fast::Dir.new.create "demo"
|
228
|
+
Fast::Dir.new.send( @method, "demo" ).should == "demo"
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
describe "#delete" do
|
233
|
+
before :each do @method = :delete end
|
234
|
+
it_behaves_like "any dir deletion"
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "#delete!" do
|
238
|
+
before :each do @method = :delete! end
|
239
|
+
it_behaves_like "any dir deletion"
|
240
|
+
end
|
241
|
+
|
242
|
+
describe "#del" do
|
243
|
+
before :each do @method = :del end
|
244
|
+
it_behaves_like "any dir deletion"
|
245
|
+
end
|
246
|
+
|
247
|
+
describe "#destroy" do
|
248
|
+
before :each do @method = :destroy end
|
249
|
+
it_behaves_like "any dir deletion"
|
250
|
+
end
|
251
|
+
|
252
|
+
describe "#unlink" do
|
253
|
+
before :each do @method = :unlink end
|
254
|
+
it_behaves_like "any dir deletion"
|
255
|
+
end
|
256
|
+
|
257
|
+
shared_examples_for "any dir existencialism" do
|
258
|
+
it "should return true if the dir exists" do
|
259
|
+
::File.should_not be_directory "demo"
|
260
|
+
Fast::Dir.new.create! "demo"
|
261
|
+
Fast::Dir.new.send( @method, "demo" ).should be_true
|
262
|
+
Fast::Dir.new.delete! "demo"
|
263
|
+
end
|
264
|
+
|
265
|
+
it "should return false if the dir does not exist" do
|
266
|
+
::File.should_not be_directory "demo"
|
267
|
+
Fast::Dir.new.send( @method, "demo" ).should be_false
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
describe "#exist?" do
|
272
|
+
before :each do @method = :exist? end
|
273
|
+
it_behaves_like "any dir existencialism"
|
274
|
+
end
|
275
|
+
|
276
|
+
describe "#exists?" do
|
277
|
+
before :each do @method = :exists? end
|
278
|
+
it_behaves_like "any dir existencialism"
|
279
|
+
end
|
280
|
+
|
281
|
+
describe ".new" do
|
282
|
+
it "should accept a string path as argument" do
|
283
|
+
Fast::Dir.new "demo"
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should accept a symbol path as argument" do
|
287
|
+
Fast::Dir.new :demo
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
describe "#to_s" do
|
292
|
+
it "should include the path to the dir" do
|
293
|
+
Fast::Dir.new.should_not exist "demo"
|
294
|
+
Fast::Dir.new(:demo).to_s.should include "demo"
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
shared_examples_for "any dir absolutizer" do
|
299
|
+
context "dir path is a relative route" do
|
300
|
+
it "should expand the dir path with the pwd" do
|
301
|
+
Fast::Dir.new.send( @method, :demo ).should == "#{Dir.pwd}/demo"
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
context "dir path is an absolute route" do
|
306
|
+
it "should return the same path as given" do
|
307
|
+
unless OS.windows?
|
308
|
+
Fast::Dir.new.send( @method, "/dev/null").should == "/dev/null"
|
309
|
+
else
|
310
|
+
pending "POSIX only!"
|
311
|
+
end
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
describe "#expand" do
|
317
|
+
before :each do @method = :expand end
|
318
|
+
it_behaves_like "any dir absolutizer"
|
319
|
+
end
|
320
|
+
|
321
|
+
describe "#absolute" do
|
322
|
+
before :each do @method = :absolute end
|
323
|
+
it_behaves_like "any dir absolutizer"
|
324
|
+
end
|
325
|
+
|
326
|
+
describe "#rename" do
|
327
|
+
it "should change the dir's name"
|
328
|
+
end
|
329
|
+
|
330
|
+
describe "#[]" do
|
331
|
+
context "a file named like the argument exists" do
|
332
|
+
it "should return it"
|
333
|
+
end
|
334
|
+
|
335
|
+
context "a dir named like the argument exists" do
|
336
|
+
it "should return it"
|
337
|
+
end
|
338
|
+
|
339
|
+
context "there's nothing there" do
|
340
|
+
it "should return nil"
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
describe "#[]=" do # This is an absolute WIN
|
345
|
+
it "should create the file with the given content"
|
346
|
+
end
|
347
|
+
|
35
348
|
end
|
data/spec/fast/file_spec.rb
CHANGED
@@ -47,10 +47,7 @@ describe Fast::File do
|
|
47
47
|
::File.unlink "demo.txt"
|
48
48
|
end
|
49
49
|
|
50
|
-
it "should return the
|
51
|
-
Fast::File.new.append( "demo.txt", "Hola." ).should == "demo.txt"
|
52
|
-
::File.unlink "demo.txt"
|
53
|
-
end
|
50
|
+
it "should return the file"
|
54
51
|
|
55
52
|
it "should work even when a symbol is passed as argument" do
|
56
53
|
Fast::File.new.append :demo_txt, "Hola."
|
@@ -69,14 +66,23 @@ describe Fast::File do
|
|
69
66
|
end
|
70
67
|
end
|
71
68
|
|
69
|
+
describe "#write" do
|
70
|
+
it "should create the file if it does not exist"
|
71
|
+
|
72
|
+
it "should write the given content into the file"
|
73
|
+
|
74
|
+
it "should overwrite the file if it exists"
|
75
|
+
|
76
|
+
it "should return the file"
|
77
|
+
end
|
72
78
|
|
73
|
-
shared_examples_for "any deletion" do
|
79
|
+
shared_examples_for "any file deletion" do
|
74
80
|
it "should delete the file" do
|
75
81
|
::File.open "demo.txt", "w" do |file|
|
76
82
|
file.write "Hola."
|
77
83
|
end
|
78
84
|
|
79
|
-
Fast::File.new.
|
85
|
+
Fast::File.new.send @method, "demo.txt"
|
80
86
|
::File.should_not exist "demo.txt"
|
81
87
|
end
|
82
88
|
|
@@ -85,7 +91,7 @@ describe Fast::File do
|
|
85
91
|
file.write "Hola."
|
86
92
|
end
|
87
93
|
|
88
|
-
Fast::File.new.
|
94
|
+
Fast::File.new.send( @method, "demo.txt" ).should == "demo.txt"
|
89
95
|
end
|
90
96
|
|
91
97
|
it "should be possible to use a symbol" do
|
@@ -93,42 +99,73 @@ describe Fast::File do
|
|
93
99
|
file.write "Hola."
|
94
100
|
end
|
95
101
|
|
96
|
-
Fast::File.new.
|
102
|
+
Fast::File.new.send @method, :demo_txt
|
97
103
|
::File.should_not exist "demo.txt"
|
98
104
|
end
|
99
105
|
end
|
100
106
|
|
101
|
-
describe "#delete" do
|
102
|
-
|
103
|
-
|
104
|
-
|
107
|
+
describe "#delete" do
|
108
|
+
before :each do @method = :delete end
|
109
|
+
it_behaves_like "any file deletion"
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#delete!" do
|
113
|
+
before :each do @method = :delete! end
|
114
|
+
it_behaves_like "any file deletion"
|
115
|
+
end
|
105
116
|
|
106
|
-
describe "#
|
117
|
+
describe "#unlink" do
|
118
|
+
before :each do @method = :unlink end
|
119
|
+
it_behaves_like "any file deletion"
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "#del" do
|
123
|
+
before :each do @method = :del end
|
124
|
+
it_behaves_like "any file deletion"
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "#destroy" do
|
128
|
+
before :each do @method = :destroy end
|
129
|
+
it_behaves_like "any file deletion"
|
130
|
+
end
|
131
|
+
|
132
|
+
shared_examples_for "any file creation" do
|
107
133
|
context "in current folder" do
|
108
134
|
it "should create the file if it does not exist" do
|
109
135
|
::File.should_not exist "demo.txt"
|
110
|
-
Fast::File.new.
|
136
|
+
Fast::File.new.send @method, "demo.txt"
|
111
137
|
::File.should exist "demo.txt"
|
112
138
|
::File.unlink "demo.txt"
|
113
|
-
end
|
114
|
-
|
139
|
+
end
|
115
140
|
end
|
116
|
-
|
117
141
|
context "the file is inside a directory" do
|
118
142
|
it "should create the file if it does not exist" do
|
119
143
|
::Dir.mkdir "demo" unless ::File.directory? "demo"
|
120
144
|
::File.should_not exist "demo/demo.txt"
|
121
|
-
Fast::File.new.
|
145
|
+
Fast::File.new.send @method, "demo/demo.txt"
|
122
146
|
::File.should exist "demo/demo.txt"
|
123
147
|
::File.unlink "demo/demo.txt"
|
124
148
|
::Dir.unlink "demo"
|
125
149
|
end
|
126
150
|
end
|
127
151
|
|
152
|
+
context "the file is inside several non existing directories" do
|
153
|
+
it "should create all the required directory tree" do
|
154
|
+
::File.should_not be_directory "demo"
|
155
|
+
Fast::File.new.send @method, "demo/in/several/subdirs/file.txt"
|
156
|
+
::File.should exist "demo/in/several/subdirs/file.txt"
|
157
|
+
::File.unlink "demo/in/several/subdirs/file.txt"
|
158
|
+
::Dir.unlink "demo/in/several/subdirs"
|
159
|
+
::Dir.unlink "demo/in/several"
|
160
|
+
::Dir.unlink "demo/in"
|
161
|
+
::Dir.unlink "demo"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
128
165
|
context "the file is inside a non existing directory" do
|
129
166
|
it "should create the directory aswell as the file" do
|
130
167
|
::File.should_not be_directory "demo"
|
131
|
-
Fast::File.new.
|
168
|
+
Fast::File.new.send @method, "demo/demo.txt"
|
132
169
|
::File.should exist "demo/demo.txt"
|
133
170
|
::File.unlink "demo/demo.txt"
|
134
171
|
::Dir.unlink "demo"
|
@@ -139,10 +176,42 @@ describe Fast::File do
|
|
139
176
|
::File.open "demo.txt", "w" do |file|
|
140
177
|
file.write "something"
|
141
178
|
end
|
142
|
-
Fast::File.new.
|
179
|
+
Fast::File.new.send @method, "demo.txt"
|
180
|
+
::File.unlink "demo.txt"
|
181
|
+
end
|
182
|
+
|
183
|
+
it "should be empty if it did not exist" do
|
184
|
+
::File.should_not exist "demo.txt"
|
185
|
+
Fast::File.new.send @method, "demo.txt"
|
186
|
+
::File.read( "demo.txt" ).should == ""
|
143
187
|
::File.unlink "demo.txt"
|
144
188
|
end
|
145
189
|
|
190
|
+
it "should return the path to the file" do
|
191
|
+
Fast::File.new.send( @method, "demo.txt" ).should == "demo.txt"
|
192
|
+
::File.unlink "demo.txt"
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should accept a symbol as an argument" do
|
196
|
+
Fast::File.new.send @method, :demo_txt
|
197
|
+
::File.unlink "demo_txt"
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe "#create" do
|
202
|
+
before :each do @method = :create end
|
203
|
+
it_behaves_like "any file creation"
|
204
|
+
end
|
205
|
+
|
206
|
+
describe "#create!" do
|
207
|
+
before :each do @method = :create! end
|
208
|
+
it_behaves_like "any file creation"
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "#touch" do
|
212
|
+
before :each do @method = :touch end
|
213
|
+
it_behaves_like "any file creation"
|
214
|
+
|
146
215
|
it "should change its atime if already exists" do
|
147
216
|
unless OS.windows?
|
148
217
|
::File.open "demo.txt", "w" do |file|
|
@@ -157,22 +226,133 @@ describe Fast::File do
|
|
157
226
|
pending "This is for POSIX only."
|
158
227
|
end
|
159
228
|
end
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
229
|
+
end
|
230
|
+
|
231
|
+
describe "#read" do
|
232
|
+
context "the file exists" do
|
233
|
+
it "should return all the contents of the file" do
|
234
|
+
::File.should_not exist "demo.txt"
|
235
|
+
Fast::File.new.append "demo.txt", "New content!"
|
236
|
+
Fast::File.new.read( "demo.txt" ).should == "New content!"
|
237
|
+
::File.unlink "demo.txt"
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should change the atime of the file" do
|
241
|
+
::File.should_not exist "demo.txt"
|
242
|
+
Fast::File.new.append "demo.txt", "New content!"
|
243
|
+
atime = ::File.atime "demo.txt"
|
244
|
+
sleep 1
|
245
|
+
Fast::File.new.read "demo.txt"
|
246
|
+
::File.atime("demo.txt").should > atime
|
247
|
+
::File.unlink "demo.txt"
|
248
|
+
end
|
249
|
+
|
250
|
+
it "should accept a symbol as an argument" do
|
251
|
+
::File.should_not exist "demo_txt"
|
252
|
+
Fast::File.new.append "demo_txt", "New content!"
|
253
|
+
Fast::File.new.read :demo_txt
|
254
|
+
::File.unlink "demo_txt"
|
255
|
+
end
|
256
|
+
|
257
|
+
context "a block is passed" do
|
258
|
+
it "should be passed a read-only file as an argument, as in File.open"
|
259
|
+
end
|
166
260
|
end
|
167
261
|
|
168
|
-
|
169
|
-
|
170
|
-
|
262
|
+
context "the file doesn't exist" do
|
263
|
+
it "should rise an exception" do
|
264
|
+
::File.should_not exist "demo.txt"
|
265
|
+
expect { Fast::File.new.read "demo.txt"
|
266
|
+
}.to raise_error
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
shared_examples_for "any file existencialism" do
|
272
|
+
it "should return true if file exists" do
|
273
|
+
::File.should_not exist "demo.file"
|
274
|
+
Fast::File.new.create! "demo.file"
|
275
|
+
Fast::File.new.send( @method, "demo.file" ).should be_true
|
276
|
+
Fast::File.new.delete "demo.file"
|
171
277
|
end
|
172
278
|
|
173
|
-
it "should
|
174
|
-
|
175
|
-
::File.
|
279
|
+
it "should return false if file does not exist" do
|
280
|
+
::File.should_not exist "demo.file"
|
281
|
+
Fast::File.new.send( @method, "demo.file" ).should be_false
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
describe "#exist?" do
|
286
|
+
before :each do @method = :exist? end
|
287
|
+
it_behaves_like "any file existencialism"
|
288
|
+
end
|
289
|
+
|
290
|
+
describe "#exists?" do
|
291
|
+
before :each do @method = :exists? end
|
292
|
+
it_behaves_like "any file existencialism"
|
293
|
+
end
|
294
|
+
|
295
|
+
shared_examples_for "any file subsetter" do
|
296
|
+
# This is a reminder: along with Serializer, the Subsetter pattern
|
297
|
+
# (and later, the Sorting one) should be implemented Fast
|
298
|
+
|
299
|
+
# I guess filtering in Fast will be done in Fast::FileFilter
|
300
|
+
it "should forward self to a filtering object" do
|
301
|
+
the_demo_file = Fast::File.new :demo
|
302
|
+
Fast::FileFilter.should_receive( :new ).with the_demo_file
|
303
|
+
the_demo_file.by
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
describe "#by" do
|
308
|
+
before :each do @method = :by end
|
309
|
+
it_behaves_like "any file subsetter"
|
310
|
+
end
|
311
|
+
|
312
|
+
describe "#filter" do
|
313
|
+
before :each do @method = :filter end
|
314
|
+
it_behaves_like "any file subsetter"
|
315
|
+
end
|
316
|
+
|
317
|
+
describe ".new" do
|
318
|
+
it "should accept a string path as argument" do
|
319
|
+
Fast::File.new "demo"
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should accept a symbol path as argument" do
|
323
|
+
Fast::File.new :demo
|
176
324
|
end
|
177
325
|
end
|
326
|
+
|
327
|
+
shared_examples_for "any file absolutizer" do
|
328
|
+
context "file path is a relative route" do
|
329
|
+
it "should expand the file path with pwd" do
|
330
|
+
Fast::File.new.send( @method, "demo.file" ).should == "#{Dir.pwd}/demo.file"
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
context "file path is an absolute route" do
|
335
|
+
it "should return the same as given path" do
|
336
|
+
unless OS.windows?
|
337
|
+
Fast::File.new.send( @method, "/dev/null" ).should == "/dev/null"
|
338
|
+
else
|
339
|
+
pending "POSIX only!"
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
describe "#expand" do
|
346
|
+
before :each do @method = :expand end
|
347
|
+
it_behaves_like "any file absolutizer"
|
348
|
+
end
|
349
|
+
|
350
|
+
describe "#absolute" do
|
351
|
+
before :each do @method = :absolute end
|
352
|
+
it_behaves_like "any file absolutizer"
|
353
|
+
end
|
354
|
+
|
355
|
+
describe "#rename" do
|
356
|
+
it "should change the file's name"
|
357
|
+
end
|
178
358
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Xavier Via
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-11-
|
17
|
+
date: 2011-11-13 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -65,10 +65,13 @@ extra_rdoc_files: []
|
|
65
65
|
files:
|
66
66
|
- .gitignore
|
67
67
|
- Gemfile
|
68
|
+
- README.rdoc
|
68
69
|
- Rakefile
|
69
70
|
- fast.gemspec
|
70
71
|
- lib/fast.rb
|
72
|
+
- lib/fast/dir-filter.rb
|
71
73
|
- lib/fast/dir.rb
|
74
|
+
- lib/fast/file-filter.rb
|
72
75
|
- lib/fast/file.rb
|
73
76
|
- lib/fast/version.rb
|
74
77
|
- spec/fast/dir_spec.rb
|