fun_with_files 0.0.14 → 0.0.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.markdown +15 -3
- data/Gemfile +17 -7
- data/{README.rdoc → README.markdown} +12 -11
- data/Rakefile +3 -3
- data/VERSION +1 -1
- data/lib/fun_with/files/bootstrapper.rb +87 -0
- data/lib/fun_with/files/core_extensions/file.rb +15 -3
- data/lib/fun_with/files/core_extensions/set.rb +12 -0
- data/lib/fun_with/files/core_extensions/true_class.rb +11 -0
- data/lib/fun_with/files/digest_methods.rb +50 -17
- data/lib/fun_with/files/directory_builder.rb +9 -4
- data/lib/fun_with/files/downloader.rb +29 -16
- data/lib/fun_with/files/errors.rb +9 -1
- data/lib/fun_with/files/file_manipulation_methods.rb +25 -15
- data/lib/fun_with/files/file_orderer.rb +2 -0
- data/lib/fun_with/files/file_path.rb +242 -156
- data/lib/fun_with/files/file_path_class_methods.rb +23 -2
- data/lib/fun_with/files/file_permission_methods.rb +18 -7
- data/lib/fun_with/files/file_requirements.rb +63 -7
- data/lib/fun_with/files/requirements/manager.rb +104 -0
- data/lib/fun_with/files/root_path.rb +3 -3
- data/lib/fun_with/files/stat_methods.rb +33 -0
- data/lib/fun_with/files/string_behavior.rb +6 -2
- data/lib/fun_with/files/utils/byte_size.rb +143 -0
- data/lib/fun_with/files/utils/opts.rb +26 -0
- data/lib/fun_with/files/utils/succession.rb +47 -0
- data/lib/fun_with/files/utils/timestamp.rb +47 -0
- data/lib/fun_with/files/utils/timestamp_format.rb +31 -0
- data/lib/fun_with/files/watcher.rb +157 -0
- data/lib/fun_with/files/watchers/directory_watcher.rb +67 -0
- data/lib/fun_with/files/watchers/file_watcher.rb +45 -0
- data/lib/fun_with/files/watchers/missing_watcher.rb +23 -0
- data/lib/fun_with/files/watchers/node_watcher.rb +44 -0
- data/lib/fun_with/testing/assertions/fun_with_files.rb +91 -0
- data/lib/fun_with/testing/test_case_extensions.rb +12 -0
- data/lib/fun_with_files.rb +5 -31
- data/test/helper.rb +13 -5
- data/test/test_core_extensions.rb +6 -0
- data/test/test_descent.rb +2 -2
- data/test/test_directory_builder.rb +29 -10
- data/test/test_extension_methods.rb +62 -0
- data/test/test_file_manipulation.rb +4 -4
- data/test/test_file_path.rb +83 -56
- data/test/test_file_requirements.rb +36 -0
- data/test/test_fun_with_files.rb +1 -1
- data/test/test_fwf_assertions.rb +62 -0
- data/test/test_moving_files.rb +111 -0
- data/test/test_permission_methods.rb +22 -0
- data/test/test_root_path.rb +9 -0
- data/test/test_stat_methods.rb +17 -0
- data/test/test_timestamping.rb +74 -0
- data/test/test_utils_bytesize.rb +71 -0
- data/test/test_utils_succession.rb +30 -0
- data/test/test_watchers.rb +196 -0
- metadata +59 -13
- /data/lib/fun_with/files/core_extensions/{false.rb → false_class.rb} +0 -0
- /data/lib/fun_with/files/core_extensions/{nil.rb → nil_class.rb} +0 -0
@@ -13,7 +13,7 @@ class TestFileManipulation < FunWith::Files::TestCase
|
|
13
13
|
|
14
14
|
should "copy LICENSE.txt" do
|
15
15
|
copied = @license.cp( "test", "tmp" )
|
16
|
-
assert_match /LICENSE\.txt/, copied.to_s
|
16
|
+
assert_match( /LICENSE\.txt/, copied.to_s )
|
17
17
|
assert_file copied
|
18
18
|
assert_file_has_content copied
|
19
19
|
end
|
@@ -21,9 +21,9 @@ class TestFileManipulation < FunWith::Files::TestCase
|
|
21
21
|
should "gsub copy of license.txt" do
|
22
22
|
copied = @license.cp( "test", "tmp" )
|
23
23
|
copied.file_gsub!( /Bryce Anderson/, "Wilford Brimley" )
|
24
|
-
assert copied.size > 1000
|
24
|
+
assert copied.size > 1000, "File is too small"
|
25
25
|
|
26
|
-
assert_file_contents copied, /Wilford Brimley
|
26
|
+
assert_file_contents copied, /Wilford Brimley/, "Error 441: Wilford Brimley not found"
|
27
27
|
end
|
28
28
|
|
29
29
|
should "empty files and directories" do
|
@@ -120,7 +120,7 @@ class TestFileManipulation < FunWith::Files::TestCase
|
|
120
120
|
|
121
121
|
file_def = file_abc.cp( dir_def )
|
122
122
|
|
123
|
-
assert_match /abc\.txt/, file_def.path
|
123
|
+
assert_match( /abc\.txt/, file_def.path )
|
124
124
|
assert_file_contents file_def, /rent/
|
125
125
|
|
126
126
|
|
data/test/test_file_path.rb
CHANGED
@@ -10,17 +10,17 @@ class TestFilePath < FunWith::Files::TestCase
|
|
10
10
|
end
|
11
11
|
|
12
12
|
should "have location class methods available" do
|
13
|
-
assert_respond_to
|
14
|
-
assert_respond_to
|
15
|
-
assert_respond_to
|
16
|
-
assert_respond_to
|
13
|
+
assert_respond_to FunWith::Files::FilePath, :home
|
14
|
+
assert_respond_to FunWith::Files::FilePath, :config_dir
|
15
|
+
assert_respond_to FunWith::Files::FilePath, :root
|
16
|
+
assert_respond_to FunWith::Files::FilePath, :data_dir
|
17
17
|
end
|
18
18
|
|
19
19
|
|
20
20
|
should "join smoothly" do
|
21
21
|
bin_dir = "/bin".fwf_filepath
|
22
|
-
assert_equal
|
23
|
-
assert_equal
|
22
|
+
assert_equal "/bin/bash", bin_dir.join("bash").to_s
|
23
|
+
assert_equal "/bin/bash", bin_dir.join("bash".fwf_filepath).to_s
|
24
24
|
end
|
25
25
|
|
26
26
|
should "go up/down when asked" do
|
@@ -32,7 +32,7 @@ class TestFilePath < FunWith::Files::TestCase
|
|
32
32
|
assert_equal root, f1.up.up.up.up.up.up.up
|
33
33
|
|
34
34
|
#invoking up didn't change original
|
35
|
-
assert_match /ask_for_floyd/, f1.to_s
|
35
|
+
assert_match( /ask_for_floyd/, f1.to_s )
|
36
36
|
|
37
37
|
assert_equal f1, f2.down( "monkeylips" ).down( "ask_for_floyd" )
|
38
38
|
assert_equal f1, f2.down( "monkeylips", "ask_for_floyd" )
|
@@ -99,17 +99,20 @@ class TestFilePath < FunWith::Files::TestCase
|
|
99
99
|
should "sequence files nicely" do
|
100
100
|
seqfile = @tmp_dir.join("sequence.txt")
|
101
101
|
|
102
|
+
files = [seqfile]
|
103
|
+
|
102
104
|
10.times do |i|
|
103
105
|
seqfile.write( i.to_s )
|
104
106
|
seqfile = seqfile.succ
|
107
|
+
files << seqfile
|
105
108
|
end
|
106
109
|
|
107
|
-
assert_file
|
108
|
-
assert_file
|
109
|
-
assert_file
|
110
|
+
assert_file files[0]
|
111
|
+
assert_file files[1]
|
112
|
+
assert_file files[9]
|
110
113
|
|
111
|
-
assert_file_contents
|
112
|
-
assert_file_contents
|
114
|
+
assert_file_contents files[0], "0"
|
115
|
+
assert_file_contents files[9], "9"
|
113
116
|
end
|
114
117
|
|
115
118
|
should "sequence files with custom stamp length" do
|
@@ -128,35 +131,7 @@ class TestFilePath < FunWith::Files::TestCase
|
|
128
131
|
assert_file_contents @tmp_dir.join("sequence.0008.txt"), "9"
|
129
132
|
end
|
130
133
|
|
131
|
-
should "sequence files with datestamps" do
|
132
|
-
seqfile = @tmp_dir.join("sequence.txt")
|
133
|
-
|
134
|
-
10.times do |i|
|
135
|
-
seqfile.write( i.to_s )
|
136
|
-
seqfile = seqfile.succ( timestamp: true )
|
137
|
-
sleep(0.002)
|
138
|
-
end
|
139
|
-
|
140
|
-
files = seqfile.succession( timestamp: true )
|
141
|
-
assert files.length == 10
|
142
|
-
|
143
|
-
files.each_with_index do |file, i|
|
144
|
-
assert_file file
|
145
|
-
assert_file_contents file, i.to_s
|
146
|
-
end
|
147
|
-
|
148
|
-
file_name_strings = files.map(&:to_s)
|
149
|
-
assert_equal file_name_strings[1..-1], file_name_strings[1..-1].sort
|
150
|
-
end
|
151
134
|
|
152
|
-
should "timestamp files using the timestamp() method" do
|
153
|
-
timestampable_file = @tmp_dir.join( "timestamped.dat" )
|
154
|
-
timestamped_file1 = timestampable_file.timestamp
|
155
|
-
timestamped_file2 = timestampable_file.timestamp("%Y")
|
156
|
-
|
157
|
-
assert timestamped_file1 =~ /timestamped.\d{17}.dat$/
|
158
|
-
assert timestamped_file2 =~ /timestamped.\d{4}.dat$/
|
159
|
-
end
|
160
135
|
end
|
161
136
|
|
162
137
|
|
@@ -216,34 +191,86 @@ class TestFilePath < FunWith::Files::TestCase
|
|
216
191
|
end
|
217
192
|
end
|
218
193
|
|
219
|
-
context "
|
194
|
+
context "testing extension methods" do
|
220
195
|
setup do
|
221
|
-
@
|
196
|
+
@hello_path = "hello.txt".fwf_filepath
|
197
|
+
@dot_path0 = ".config".fwf_filepath
|
198
|
+
@dot_path1 = "~/.ssh".fwf_filepath
|
222
199
|
end
|
223
200
|
|
224
|
-
|
225
|
-
assert_equal @path.path, @path.ext( nil ).path
|
226
|
-
end
|
201
|
+
context "test ext()" do
|
227
202
|
|
228
|
-
|
229
|
-
|
230
|
-
|
203
|
+
should "not change path when sent nil as an argument" do
|
204
|
+
assert_equal @hello_path.path, @hello_path.ext( nil ).path
|
205
|
+
end
|
206
|
+
|
207
|
+
should "append when given symbol" do
|
208
|
+
assert_equal @hello_path.path + ".tgz", @hello_path.ext( :tgz ).path
|
209
|
+
end
|
231
210
|
|
232
|
-
|
233
|
-
|
211
|
+
should "append when given string" do
|
212
|
+
assert_equal @hello_path.path + ".tgz", @hello_path.ext( 'tgz' ).path
|
213
|
+
end
|
214
|
+
|
215
|
+
should "append correctly when given leading ." do
|
216
|
+
assert_equal @hello_path.path + ".tgz", @hello_path.ext( '.tgz' ).path
|
217
|
+
end
|
218
|
+
|
219
|
+
should "append multiple extensions as separate args" do
|
220
|
+
assert_equal @hello_path.path + ".backup.tar.gz", @hello_path.ext( :backup, "tar", nil, ".gz" ).path
|
221
|
+
end
|
222
|
+
|
223
|
+
should "append multiple extensions as a single string" do
|
224
|
+
assert_equal @hello_path.path + ".backup.tar.gz", @hello_path.ext( ".backup.tar.gz" ).path
|
225
|
+
end
|
234
226
|
end
|
235
227
|
|
236
|
-
|
237
|
-
|
228
|
+
context "test without_ext()" do
|
229
|
+
setup do
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
should "pop the extension (normal)" do
|
234
|
+
#debugger
|
235
|
+
assert_equal "hello", @hello_path.without_ext.to_s
|
236
|
+
assert_equal "hello", @hello_path.without_ext("txt").path
|
237
|
+
assert_equal "hello", @hello_path.without_ext(".txt").path
|
238
|
+
assert_equal "hello.txt", @hello_path.without_ext(".html").path
|
239
|
+
assert_equal "hello.txt", @hello_path.without_ext("html").path
|
240
|
+
|
241
|
+
assert_equal "hello", @hello_path.without_ext(:txt).path
|
242
|
+
end
|
243
|
+
|
244
|
+
should "not affect dot files" do
|
245
|
+
assert_equal ".config", @dot_path0.without_ext.path
|
246
|
+
assert_equal ".config", @dot_path0.without_ext("config").path
|
247
|
+
assert_equal ".config", @dot_path0.without_ext(".config").path
|
248
|
+
assert_equal ".config", @dot_path0.without_ext(:config).path
|
249
|
+
end
|
238
250
|
end
|
239
251
|
|
240
|
-
|
241
|
-
|
252
|
+
# Why does it return a filepath for the dirname piece, strings for the other two pieces?
|
253
|
+
context "test dirname_and_basename_and_ext" do
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
context "test join()" do
|
258
|
+
setup do
|
259
|
+
@path = "/".fwf_filepath
|
242
260
|
end
|
243
261
|
|
244
|
-
should "
|
245
|
-
|
262
|
+
should "accept all manner of arguments" do
|
263
|
+
expected = "/bin/0/file.rb".fwf_filepath
|
264
|
+
result = @path.join( :bin, 0, "file.rb" )
|
265
|
+
|
266
|
+
assert_equal expected, result
|
267
|
+
|
268
|
+
result = @path / :bin / 0 / "file.rb"
|
269
|
+
assert_equal expected, result
|
246
270
|
end
|
271
|
+
end
|
272
|
+
|
273
|
+
context "testing block form" do
|
247
274
|
|
248
275
|
end
|
249
276
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestFileRequirements < FunWith::Files::TestCase
|
4
|
+
context "testing FileRequirements methods" do
|
5
|
+
setup do
|
6
|
+
@tmp_dir = FunWith::Files.root("test", "tmp")
|
7
|
+
@file = @tmp_dir.join("file.txt").touch
|
8
|
+
@dir = @tmp_dir.join("dir").touch_dir
|
9
|
+
end
|
10
|
+
|
11
|
+
teardown do
|
12
|
+
empty_temp_directory
|
13
|
+
end
|
14
|
+
|
15
|
+
context "needs_to_exist()" do
|
16
|
+
should "raise an error when a file doesn't exist" do
|
17
|
+
assert_raises Errno::ENOENT do
|
18
|
+
@tmp_dir.join("missing_file.txt").needs_to_exist
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
should "raise an error when a file isn't empty" do
|
23
|
+
assert_raises Errors::FileNotEmpty do
|
24
|
+
@file.append("Zorpy was here")
|
25
|
+
@file.needs_to_be_empty
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
should "raise an error when a file oughta be a directory" do
|
30
|
+
assert_raises Errors::NotADirectory do
|
31
|
+
@file.must_be_directory
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/test/test_fun_with_files.rb
CHANGED
@@ -26,7 +26,7 @@ class TestFunWithFiles < FunWith::Files::TestCase
|
|
26
26
|
assert_respond_to( FunWith::Files, :root )
|
27
27
|
assert_respond_to( FunWith::Files, :version )
|
28
28
|
|
29
|
-
assert_equal "0.0.
|
29
|
+
assert_equal "0.0.17", FunWith::Files.version # Gotta change with every point release. Ick.
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module FunWith
|
2
|
+
module Testing
|
3
|
+
class TestFwfAssertions < FunWith::Testing::AssertionsTestCase
|
4
|
+
context "testing assertions" do
|
5
|
+
setup do
|
6
|
+
extended_test_case # sets @case, which is used to access to assertions
|
7
|
+
@case_class.install_fun_with_files_assertions
|
8
|
+
end
|
9
|
+
|
10
|
+
context "testing :assert_fwf_filepath()" do
|
11
|
+
should "pass all tests" do
|
12
|
+
testing_method :assert_fwf_filepath do
|
13
|
+
nope __FILE__
|
14
|
+
yep __FILE__.fwf_filepath
|
15
|
+
|
16
|
+
nope nil
|
17
|
+
nope :five
|
18
|
+
nope 5
|
19
|
+
nope [5]
|
20
|
+
nope "five"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "testing :assert_file()" do
|
26
|
+
should "pass all tests" do
|
27
|
+
testing_method :assert_file do
|
28
|
+
yep __FILE__.fwf_filepath
|
29
|
+
|
30
|
+
nope __FILE__
|
31
|
+
nope nil
|
32
|
+
nope :five
|
33
|
+
nope 5
|
34
|
+
nope [5]
|
35
|
+
nope "five"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "testing :assert_directory()" do
|
41
|
+
should "pass all tests" do
|
42
|
+
testing_method :assert_directory do
|
43
|
+
nope __FILE__
|
44
|
+
nope __FILE__.fwf_filepath
|
45
|
+
|
46
|
+
yep __FILE__.fwf_filepath.dirname
|
47
|
+
yep __FILE__.fwf_filepath.up
|
48
|
+
yep FunWith::Files.root
|
49
|
+
|
50
|
+
nope nil
|
51
|
+
nope :five
|
52
|
+
nope 5
|
53
|
+
nope [5]
|
54
|
+
nope "five"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestMovingFiles < FunWith::Files::TestCase
|
4
|
+
context "inside a tmpdir" do
|
5
|
+
setup do
|
6
|
+
@src_dir = FilePath.tmpdir
|
7
|
+
@dst_dir = FilePath.tmpdir
|
8
|
+
|
9
|
+
assert_directory @src_dir
|
10
|
+
assert_directory @dst_dir
|
11
|
+
|
12
|
+
assert_empty_directory @src_dir
|
13
|
+
assert_empty_directory @dst_dir
|
14
|
+
end
|
15
|
+
|
16
|
+
teardown do
|
17
|
+
@src_dir.rm
|
18
|
+
@dst_dir.rm
|
19
|
+
assert_not_directory @src_dir
|
20
|
+
assert_not_directory @dst_dir
|
21
|
+
end
|
22
|
+
|
23
|
+
context "with a source file" do
|
24
|
+
setup do
|
25
|
+
@src_file = @src_dir / "file.txt"
|
26
|
+
@src_file.write( "Hello world" )
|
27
|
+
|
28
|
+
assert_file_not_empty( @src_file )
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
should "successfully move a file into a directory" do
|
33
|
+
dest = @dst_dir / "file.txt"
|
34
|
+
|
35
|
+
assert_no_file dest
|
36
|
+
|
37
|
+
@src_file.move @dst_dir
|
38
|
+
|
39
|
+
assert_file dest
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
# Seems dangerous to not have a concrete idea of what should happen when a move
|
45
|
+
# remove / create request takes place. Ideas:
|
46
|
+
# be able to mark a destination as a directory, so that it knows the file move
|
47
|
+
# is saying to
|
48
|
+
#
|
49
|
+
# a directory should be created
|
50
|
+
# a directory must exist for the move to occur
|
51
|
+
# nothing exists at the destination, so the file is given the name of <thing_what_didnt_exist>
|
52
|
+
#
|
53
|
+
should "fail to move a file to a non-existent directory" do
|
54
|
+
flunk "this actually moves the file (the file getting the name of the 'missing' directory, and I'm not sure that's wrong)"
|
55
|
+
not_a_dir = @dst_dir / "humblebrag"
|
56
|
+
|
57
|
+
assert_raises( Errno::ENOENT ) do
|
58
|
+
@src_file.move( not_a_dir )
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
should "fail to move a file owing to lack of privileges" do
|
63
|
+
write_protected_dir = @dst_dir / "write_protected_dir"
|
64
|
+
write_protected_dir.touch_dir
|
65
|
+
|
66
|
+
temporarily_write_protect( write_protected_dir ) do
|
67
|
+
assert_raises( Errno::EACCES ) do
|
68
|
+
@src_file.move( write_protected_dir )
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
should "fail to move a non-existent file" do
|
77
|
+
f = @src_dir.join( "file.txt" )
|
78
|
+
|
79
|
+
assert_no_file( f )
|
80
|
+
|
81
|
+
assert_raises( Errno::ENOENT ) do
|
82
|
+
f.move( @dst_dir )
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# should "successfully move a directory" do
|
89
|
+
# flunk "write test"
|
90
|
+
# end
|
91
|
+
#
|
92
|
+
# should "fail to move a non-existent directory" do
|
93
|
+
# flunk "write test"
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
# should "fail to move a directory to a non-existent directory" do
|
97
|
+
# flunk "write test"
|
98
|
+
# end
|
99
|
+
#
|
100
|
+
# should "fail to move a directory owing to lack of privileges" do
|
101
|
+
#
|
102
|
+
# flunk "write test"
|
103
|
+
# end
|
104
|
+
# end
|
105
|
+
|
106
|
+
def temporarily_write_protect( f, &block )
|
107
|
+
f.chmod( "a-w" )
|
108
|
+
yield
|
109
|
+
f.chmod( "a+w" )
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestPermissionMethods < FunWith::Files::TestCase
|
4
|
+
context "checking for availability of permission methods" do
|
5
|
+
setup do
|
6
|
+
@filepath = FunWith::Files::FilePath.new("/")
|
7
|
+
end
|
8
|
+
|
9
|
+
should "have permission methods" do
|
10
|
+
assert_respond_to @filepath, :readable?
|
11
|
+
assert_respond_to @filepath, :writable?
|
12
|
+
assert_respond_to @filepath, :executable?
|
13
|
+
assert_respond_to @filepath, :chown
|
14
|
+
assert_respond_to @filepath, :chmod
|
15
|
+
assert_respond_to @filepath, :owner
|
16
|
+
end
|
17
|
+
|
18
|
+
should "have a root owner" do
|
19
|
+
assert_equal "root", @filepath.owner
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/test/test_root_path.rb
CHANGED
@@ -13,6 +13,15 @@ class TestRootPath < FunWith::Files::TestCase
|
|
13
13
|
rootify_and_test( obj, path )
|
14
14
|
end
|
15
15
|
|
16
|
+
context "FunWith::Files.root" do
|
17
|
+
should "be a directory" do
|
18
|
+
assert_directory( FunWith::Files.root )
|
19
|
+
assert_empty_directory( FunWith::Files.root( :test, :tmp ) )
|
20
|
+
assert_empty_directory( FunWith::Files.root / :test / :tmp )
|
21
|
+
assert_empty_directory( FunWith::Files.root / "test" / "tmp" )
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
16
25
|
def rootify_and_test( obj, path )
|
17
26
|
RootPath.rootify( obj, path )
|
18
27
|
assert obj.respond_to?(:root)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestStatMethods < FunWith::Files::TestCase
|
4
|
+
|
5
|
+
context "checking for availability of stat-enabling methods" do
|
6
|
+
setup do
|
7
|
+
@filepath = FunWith::Files::FilePath.new("/")
|
8
|
+
end
|
9
|
+
|
10
|
+
should "have stat methods" do
|
11
|
+
assert_respond_to @filepath, :stat
|
12
|
+
assert_respond_to @filepath, :inode
|
13
|
+
assert_respond_to @filepath, :birthtime # this (and many others) come from Pathname
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestTimestamping < FunWith::Files::TestCase
|
4
|
+
context "testing timestamping" do
|
5
|
+
setup do
|
6
|
+
@tmp_dir = FunWith::Files.root( 'test', 'tmp' )
|
7
|
+
@logfile = @tmp_dir / "apache.log"
|
8
|
+
@stamp_time = Time.new( 2000, 10, 13, 23, 59, 59 )
|
9
|
+
end
|
10
|
+
|
11
|
+
teardown do
|
12
|
+
`rm -rf #{@tmp_dir.join('*')}`
|
13
|
+
end
|
14
|
+
|
15
|
+
should "sequence files with datestamps" do
|
16
|
+
dates = %w(2012-11-30 1900-12-01 2727-06-14)
|
17
|
+
|
18
|
+
for date in dates
|
19
|
+
d = Date.new( * date.split("-").map(&:to_i) )
|
20
|
+
|
21
|
+
f = @logfile.timestamp( format: :ymd, time: d )
|
22
|
+
f.write( date )
|
23
|
+
|
24
|
+
fy = @logfile.timestamp( format: :y, time: d )
|
25
|
+
fy.write date[0..3]
|
26
|
+
end
|
27
|
+
|
28
|
+
for str in dates + %w(2012 1900 2727)
|
29
|
+
file = @tmp_dir / "apache.#{str}.log"
|
30
|
+
assert_file file
|
31
|
+
assert_file_contents file, str
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
should "timestamp files using the timestamp() method" do
|
36
|
+
timestampable_file = @tmp_dir / "timestamped.dat"
|
37
|
+
|
38
|
+
timestamped_file1 = timestampable_file.timestamp
|
39
|
+
timestamped_file2 = timestampable_file.timestamp( format: :y )
|
40
|
+
|
41
|
+
assert timestamped_file1 =~ /timestamped.\d{17}.dat$/
|
42
|
+
assert timestamped_file2 =~ /timestamped.\d{4}.dat$/
|
43
|
+
end
|
44
|
+
|
45
|
+
should "raise an error when invalid format requested" do
|
46
|
+
f = @tmp_dir / "apache.log"
|
47
|
+
|
48
|
+
stamped = f.timestamp
|
49
|
+
|
50
|
+
assert_raises Errors::TimestampFormatUnrecognized do
|
51
|
+
f.timestamp( format: :zztop )
|
52
|
+
end
|
53
|
+
|
54
|
+
# Symbols only!
|
55
|
+
assert_raises Errors::TimestampFormatUnrecognized do
|
56
|
+
f.timestamp( format: "ymd" )
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
should "update the timestamp of a file that already has one" do
|
61
|
+
f = "apache.19931020235959000.tgz".fwf_filepath
|
62
|
+
timestamped_file = f.timestamp( time: @stamp_time )
|
63
|
+
|
64
|
+
assert_equal "apache.20001013235959000.tgz", timestamped_file.path
|
65
|
+
end
|
66
|
+
|
67
|
+
should "be able to give the timestamp method a custom format" do
|
68
|
+
fmt = Utils::TimestampFormat.new.recognizer( /^\d{2}_\d{2}_\d{2}$/ ).strftime( "%m_%d_%y" )
|
69
|
+
|
70
|
+
timestamped_file = @logfile.timestamp( format: fmt, time: @stamp_time )
|
71
|
+
assert_equal "apache.10_13_00.log", timestamped_file.basename.path
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestUtilsByteSize < FunWith::Files::TestCase
|
4
|
+
context "testing the thing" do
|
5
|
+
setup do
|
6
|
+
@bytie = Object.new
|
7
|
+
@bytie.extend FunWith::Files::Utils::ByteSize
|
8
|
+
end
|
9
|
+
|
10
|
+
should "respond to :to_bytes" do
|
11
|
+
assert_respond_to @bytie, :to_bytes
|
12
|
+
end
|
13
|
+
|
14
|
+
should "accurately convert strings to bytes" do
|
15
|
+
assert_bytes 1_000, "1000b"
|
16
|
+
assert_bytes 1_000, "1 kb"
|
17
|
+
assert_bytes 1_000, "0.001 MB"
|
18
|
+
assert_bytes 1_000, "0.000001 GB"
|
19
|
+
|
20
|
+
assert_bytes 1_234, "1234"
|
21
|
+
assert_bytes 1_234, " 1.234 kb "
|
22
|
+
assert_bytes 9_001, "9.001k" # it's over 9000!
|
23
|
+
end
|
24
|
+
|
25
|
+
context "converting expressions between units" do
|
26
|
+
should "handle simple cases" do
|
27
|
+
assert_converts "1KB", "B", "1000B"
|
28
|
+
assert_converts "2MB", "KB", "2000KB"
|
29
|
+
assert_converts "3GB", "MB", "3000MB"
|
30
|
+
assert_converts "4TB", "GB", "4000GB"
|
31
|
+
assert_converts "5PB", "TB", "5000TB"
|
32
|
+
end
|
33
|
+
|
34
|
+
should "be case insensitive" do
|
35
|
+
assert_converts "1kb", "B", "1000B"
|
36
|
+
assert_converts "1000k", "mb", "1mb"
|
37
|
+
assert_converts "1000m", "GB", "1GB"
|
38
|
+
assert_converts "2000 PB", " EB", "2 EB"
|
39
|
+
end
|
40
|
+
|
41
|
+
should "sometimes put space between number and unit" do
|
42
|
+
assert_converts "2000 PB", " EB", "2 EB"
|
43
|
+
end
|
44
|
+
|
45
|
+
should "reflect the unit styling that the caller sends" do
|
46
|
+
assert_converts "1kb", "b", "1000b" # uses the unit capitalization that the caller sends
|
47
|
+
end
|
48
|
+
|
49
|
+
should "sometimes use decimal points" do
|
50
|
+
assert_converts "900kb", "MB", "0.9MB"
|
51
|
+
assert_converts "930kb", "mb", "0.9mb"
|
52
|
+
|
53
|
+
assert_converts "99500b", "kb", "99.5kb"
|
54
|
+
assert_converts "1200MB", "gb", "1.2gb"
|
55
|
+
end
|
56
|
+
|
57
|
+
should "sometimes not use decimal points" do
|
58
|
+
assert_converts "100372b", "k", "100k"
|
59
|
+
assert_converts "1b", "GB", "0GB"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def assert_bytes( n, expr )
|
65
|
+
assert_equal n, @bytie.to_bytes( expr ), "to_bytes( #{expr} ) should resolve to #{n}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def assert_converts( old_expr, new_units, new_expr )
|
69
|
+
assert_equal new_expr, @bytie.convert( old_expr, new_units )
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestUtilsSuccession < FunWith::Files::TestCase
|
4
|
+
USucc = FunWith::Files::Utils::Succession
|
5
|
+
|
6
|
+
context "testing Succession.get_successor_name()" do
|
7
|
+
should "succeed" do
|
8
|
+
with_digit_count( 4 ) do
|
9
|
+
assert_succession "file.0001.txt", "file.0002.txt"
|
10
|
+
assert_succession "file.txt", "file.0000.txt"
|
11
|
+
assert_succession "", "0000"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def with_digit_count( i, &block )
|
17
|
+
@digit_count = i
|
18
|
+
yield
|
19
|
+
end
|
20
|
+
|
21
|
+
def assert_succession( input, expected )
|
22
|
+
if defined?( @digit_count )
|
23
|
+
actual = USucc.get_successor_name( input, @digit_count )
|
24
|
+
else
|
25
|
+
actual = USucc.get_successor_name( input )
|
26
|
+
end
|
27
|
+
|
28
|
+
assert_equal( expected, actual, "Utils::Succession.get_successor_name() failed:\n\tinput: #{input}(#{input.class})\n\texpected: #{expected}(#{expected.class})\n\tactual: #{actual}(#{actual.class})")
|
29
|
+
end
|
30
|
+
end
|