ptools 1.1.7 → 1.1.9
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +20 -0
- data/MANIFEST +0 -2
- data/README +35 -47
- data/Rakefile +110 -0
- data/lib/ptools.rb +301 -231
- data/ptools.gemspec +31 -0
- data/test/test_binary.rb +7 -2
- data/test/test_constants.rb +1 -1
- data/test/test_head.rb +7 -2
- data/test/test_image.rb +6 -1
- data/test/test_middle.rb +2 -1
- data/test/test_nlconvert.rb +13 -9
- data/test/test_null.rb +5 -0
- data/test/test_tail.rb +6 -1
- data/test/test_touch.rb +6 -1
- data/test/test_wc.rb +5 -0
- data/test/test_whereis.rb +83 -37
- data/test/test_which.rb +90 -32
- metadata +27 -18
- data/test/test_file1.txt +0 -25
- data/test/test_file2.txt +0 -25
data/ptools.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rbconfig'
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = 'ptools'
|
6
|
+
gem.version = '1.1.9'
|
7
|
+
gem.license = 'Artistic 2.0'
|
8
|
+
gem.author = 'Daniel J. Berger'
|
9
|
+
gem.email = 'djberg96@gmail.com'
|
10
|
+
gem.homepage = 'http://www.rubyforge.org/projects/shards'
|
11
|
+
gem.summary = 'Extra methods for the File class'
|
12
|
+
gem.test_files = Dir['test/test*']
|
13
|
+
gem.has_rdoc = true
|
14
|
+
gem.files = Dir['**/*'].reject{ |f| f.include?('CVS') || f.include?('git') }
|
15
|
+
|
16
|
+
gem.rubyforge_project = 'shards'
|
17
|
+
gem.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
|
18
|
+
|
19
|
+
gem.description = <<-EOF
|
20
|
+
The ptools (power tools) library provides several handy methods to
|
21
|
+
Ruby's core File class, such as File.which for finding executables,
|
22
|
+
File.null to return the null device on your platform, and so on.
|
23
|
+
EOF
|
24
|
+
|
25
|
+
gem.add_development_dependency('test-unit', '>= 2.0.7')
|
26
|
+
|
27
|
+
if Config::CONFIG['host_os'] =~ /mswin|win32|msdos|cygwin|mingw/i
|
28
|
+
gem.platform = Gem::Platform::CURRENT
|
29
|
+
gem.add_dependency('win32-file', '>= 0.5.4')
|
30
|
+
end
|
31
|
+
end
|
data/test/test_binary.rb
CHANGED
@@ -12,7 +12,8 @@ require 'ptools'
|
|
12
12
|
|
13
13
|
class TC_Binary < Test::Unit::TestCase
|
14
14
|
def self.startup
|
15
|
-
Dir.chdir('test')
|
15
|
+
Dir.chdir('test') if File.exists?('test')
|
16
|
+
File.open('test_file1.txt', 'w'){ |fh| 10.times{ |n| fh.puts "line #{n}" } }
|
16
17
|
end
|
17
18
|
|
18
19
|
def setup
|
@@ -29,10 +30,14 @@ class TC_Binary < Test::Unit::TestCase
|
|
29
30
|
end
|
30
31
|
|
31
32
|
def test_binary_expected_errors
|
32
|
-
|
33
|
+
assert_raise_kind_of(SystemCallError){ File.binary?('bogus') }
|
33
34
|
end
|
34
35
|
|
35
36
|
def teardown
|
36
37
|
@text_file = nil
|
37
38
|
end
|
39
|
+
|
40
|
+
def self.shutdown
|
41
|
+
File.delete('test_file1.txt') if File.exists?('test_file1.txt')
|
42
|
+
end
|
38
43
|
end
|
data/test/test_constants.rb
CHANGED
data/test/test_head.rb
CHANGED
@@ -12,10 +12,11 @@ require 'ptools'
|
|
12
12
|
|
13
13
|
class TC_FileHead < Test::Unit::TestCase
|
14
14
|
def self.startup
|
15
|
-
Dir.chdir('test')
|
15
|
+
Dir.chdir('test') if File.exists?('test')
|
16
|
+
File.open('test_file1.txt', 'w'){ |fh| 25.times{ |n| fh.puts "line#{n+1}" } }
|
16
17
|
end
|
17
18
|
|
18
|
-
def setup
|
19
|
+
def setup
|
19
20
|
@test_file = 'test_file1.txt'
|
20
21
|
@expected_head1 = ["line1\n","line2\n","line3\n","line4\n","line5\n"]
|
21
22
|
@expected_head1.push("line6\n","line7\n","line8\n","line9\n","line10\n")
|
@@ -43,4 +44,8 @@ class TC_FileHead < Test::Unit::TestCase
|
|
43
44
|
def teardown
|
44
45
|
@test_file = nil
|
45
46
|
end
|
47
|
+
|
48
|
+
def self.shutdown
|
49
|
+
File.delete('test_file1.txt') if File.exists?('test_file1.txt')
|
50
|
+
end
|
46
51
|
end
|
data/test/test_image.rb
CHANGED
@@ -12,7 +12,8 @@ require 'ptools'
|
|
12
12
|
|
13
13
|
class TC_Ptools_Image < Test::Unit::TestCase
|
14
14
|
def self.startup
|
15
|
-
Dir.chdir('test')
|
15
|
+
Dir.chdir('test') if File.exists?('test')
|
16
|
+
File.open('test_file1.txt', 'w'){ |fh| 25.times{ |n| fh.puts "line#{n+1}" } }
|
16
17
|
end
|
17
18
|
|
18
19
|
def setup
|
@@ -35,4 +36,8 @@ class TC_Ptools_Image < Test::Unit::TestCase
|
|
35
36
|
def teardown
|
36
37
|
@text_file = nil
|
37
38
|
end
|
39
|
+
|
40
|
+
def self.shutdown
|
41
|
+
File.delete('test_file1.txt') if File.exists?('test_file1.txt')
|
42
|
+
end
|
38
43
|
end
|
data/test/test_middle.rb
CHANGED
@@ -12,7 +12,8 @@ require 'ptools'
|
|
12
12
|
|
13
13
|
class TC_FileMiddle < Test::Unit::TestCase
|
14
14
|
def self.startup
|
15
|
-
Dir.chdir('test')
|
15
|
+
Dir.chdir('test') if File.exists?('test')
|
16
|
+
File.open('test_file1.txt', 'w'){ |fh| 25.times{ |n| fh.puts "line#{n+1}" } }
|
16
17
|
end
|
17
18
|
|
18
19
|
def setup
|
data/test/test_nlconvert.rb
CHANGED
@@ -12,7 +12,9 @@ require 'ptools'
|
|
12
12
|
|
13
13
|
class TC_FileNLConvert < Test::Unit::TestCase
|
14
14
|
def self.startup
|
15
|
-
Dir.chdir('test')
|
15
|
+
Dir.chdir('test') if File.exists?('test')
|
16
|
+
File.open('test_file1.txt', 'w'){ |fh| 10.times{ |n| fh.puts "line #{n}" } }
|
17
|
+
File.open('test_file2.txt', 'w'){ |fh| 10.times{ |n| fh.puts "line #{n}" } }
|
16
18
|
end
|
17
19
|
|
18
20
|
def setup
|
@@ -41,15 +43,12 @@ class TC_FileNLConvert < Test::Unit::TestCase
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def test_nl_convert_to_mac
|
44
|
-
|
45
|
-
msg = "** test may fail on MS Windows **"
|
46
|
-
else
|
47
|
-
msg = "** mac file should be the same size (or larger), but isn't **"
|
48
|
-
end
|
49
|
-
|
50
|
-
assert_nothing_raised{ File.nl_convert(@test_file1, @mac_file, "mac") }
|
51
|
-
assert_equal(true, File.size(@mac_file) == File.size(@test_file1), msg)
|
46
|
+
assert_nothing_raised{ File.nl_convert(@test_file1, @mac_file, 'mac') }
|
52
47
|
assert_equal("\cM", IO.readlines(@mac_file).first.split("").last)
|
48
|
+
|
49
|
+
omit_if(Config::CONFIG['host_os'] =~ /win32|mswin|dos|cygwin|mingw/i)
|
50
|
+
msg = "=> Mac file should be the same size (or larger), but isn't"
|
51
|
+
assert_true(File.size(@mac_file) == File.size(@test_file1), msg)
|
53
52
|
end
|
54
53
|
|
55
54
|
def test_nl_convert_to_unix
|
@@ -82,4 +81,9 @@ class TC_FileNLConvert < Test::Unit::TestCase
|
|
82
81
|
@test_file1 = nil
|
83
82
|
@test_file2 = nil
|
84
83
|
end
|
84
|
+
|
85
|
+
def self.shutdown
|
86
|
+
File.delete('test_file1.txt') if File.exists?('test_file1.txt')
|
87
|
+
File.delete('test_file2.txt') if File.exists?('test_file2.txt')
|
88
|
+
end
|
85
89
|
end
|
data/test/test_null.rb
CHANGED
@@ -26,6 +26,11 @@ class TC_Null < Test::Unit::TestCase
|
|
26
26
|
assert_raises(ArgumentError){ File.null(1) }
|
27
27
|
end
|
28
28
|
|
29
|
+
def test_null_device_alias
|
30
|
+
assert_respond_to(File, :null_device)
|
31
|
+
assert_equal(true, File.method(:null) == File.method(:null_device))
|
32
|
+
end
|
33
|
+
|
29
34
|
def teardown
|
30
35
|
@nulls = nil
|
31
36
|
end
|
data/test/test_tail.rb
CHANGED
@@ -12,7 +12,8 @@ require 'ptools'
|
|
12
12
|
|
13
13
|
class TC_FileTail < Test::Unit::TestCase
|
14
14
|
def self.startup
|
15
|
-
Dir.chdir('test')
|
15
|
+
Dir.chdir('test') if File.exists?('test')
|
16
|
+
File.open('test_file1.txt', 'w'){ |fh| 25.times{ |n| fh.puts "line#{n+1}" } }
|
16
17
|
end
|
17
18
|
|
18
19
|
def setup
|
@@ -48,4 +49,8 @@ class TC_FileTail < Test::Unit::TestCase
|
|
48
49
|
@expected_tail1 = nil
|
49
50
|
@expected_tail2 = nil
|
50
51
|
end
|
52
|
+
|
53
|
+
def self.shutdown
|
54
|
+
File.delete('test_file1.txt') if File.exists?('test_file1.txt')
|
55
|
+
end
|
51
56
|
end
|
data/test/test_touch.rb
CHANGED
@@ -12,7 +12,8 @@ require 'ptools'
|
|
12
12
|
|
13
13
|
class TC_FileTouch < Test::Unit::TestCase
|
14
14
|
def self.startup
|
15
|
-
Dir.chdir('test')
|
15
|
+
Dir.chdir('test') if File.exists?('test')
|
16
|
+
File.open('test_file1.txt', 'w'){ |fh| 10.times{ |n| fh.puts "line #{n}" } }
|
16
17
|
end
|
17
18
|
|
18
19
|
def setup
|
@@ -47,4 +48,8 @@ class TC_FileTouch < Test::Unit::TestCase
|
|
47
48
|
File.delete(@test_file) if File.exists?(@test_file)
|
48
49
|
@test_file = nil
|
49
50
|
end
|
51
|
+
|
52
|
+
def self.shutdown
|
53
|
+
File.delete('test_file1.txt') if File.exists?('test_file1.txt')
|
54
|
+
end
|
50
55
|
end
|
data/test/test_wc.rb
CHANGED
@@ -10,6 +10,7 @@ require 'ptools'
|
|
10
10
|
class TC_FileWC < Test::Unit::TestCase
|
11
11
|
def self.startup
|
12
12
|
Dir.chdir('test') if File.exists?('test')
|
13
|
+
File.open('test_file1.txt', 'w'){ |fh| 25.times{ |n| fh.puts "line#{n+1}" } }
|
13
14
|
end
|
14
15
|
|
15
16
|
def setup
|
@@ -42,4 +43,8 @@ class TC_FileWC < Test::Unit::TestCase
|
|
42
43
|
def teardown
|
43
44
|
@test_file = nil
|
44
45
|
end
|
46
|
+
|
47
|
+
def self.shutdown
|
48
|
+
File.delete('test_file1.txt') if File.exists?('test_file1.txt')
|
49
|
+
end
|
45
50
|
end
|
data/test/test_whereis.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
######################################################################
|
2
2
|
# test_whereis.rb
|
3
3
|
#
|
4
|
-
#
|
5
|
-
# via the 'rake test_whereis' task.
|
4
|
+
# Tests for the File.whereis method.
|
6
5
|
######################################################################
|
7
6
|
require 'rubygems'
|
8
7
|
gem 'test-unit'
|
@@ -13,40 +12,87 @@ require 'rbconfig'
|
|
13
12
|
include Config
|
14
13
|
|
15
14
|
class TC_FileWhereis < Test::Unit::TestCase
|
16
|
-
|
17
|
-
|
15
|
+
def self.startup
|
16
|
+
@@windows = Config::CONFIG['host_os'] =~ /mswin|win32|msdos|cygwin|mingw/i
|
17
|
+
end
|
18
|
+
|
19
|
+
def setup
|
20
|
+
@expected_locs = [File.join(CONFIG['bindir'], 'ruby')]
|
21
|
+
|
22
|
+
if @@windows
|
23
|
+
@expected_locs[0] << '.exe'
|
24
|
+
@expected_locs[0].tr!("/", "\\")
|
25
|
+
end
|
18
26
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
27
|
+
unless @@windows
|
28
|
+
@expected_locs << '/usr/local/bin/ruby'
|
29
|
+
@expected_locs << '/opt/sfw/bin/ruby'
|
30
|
+
@expected_locs << '/opt/bin/ruby'
|
31
|
+
@expected_locs << '/usr/bin/ruby'
|
32
|
+
end
|
33
|
+
|
34
|
+
@actual_locs = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
test "whereis basic functionality" do
|
38
|
+
assert_respond_to(File, :whereis)
|
39
|
+
assert_nothing_raised{ File.whereis('ruby') }
|
40
|
+
assert_kind_of([Array, NilClass], File.whereis('ruby'))
|
41
|
+
end
|
42
|
+
|
43
|
+
test "whereis accepts an optional second argument" do
|
44
|
+
assert_nothing_raised{ File.whereis('ruby', '/usr/bin:/usr/local/bin') }
|
45
|
+
end
|
46
|
+
|
47
|
+
test "whereis returns expected values" do
|
48
|
+
assert_nothing_raised{ @actual_locs = File.whereis('ruby') }
|
49
|
+
assert_kind_of(Array, @actual_locs)
|
50
|
+
assert_true((@expected_locs & @actual_locs).size > 0)
|
51
|
+
end
|
52
|
+
|
53
|
+
test "whereis returns nil if program not found" do
|
54
|
+
assert_nil(File.whereis('xxxyyy'))
|
55
|
+
end
|
56
|
+
|
57
|
+
test "whereis returns nil if program cannot be found in provided path" do
|
58
|
+
assert_nil(File.whereis('ruby', '/foo/bar'))
|
59
|
+
end
|
60
|
+
|
61
|
+
test "whereis returns single element array or nil if absolute path is provided" do
|
62
|
+
absolute = File.join(CONFIG['bindir'], 'ruby')
|
63
|
+
absolute << '.exe' if @@windows
|
64
|
+
assert_equal([absolute], File.whereis(absolute))
|
65
|
+
assert_nil(File.whereis('/foo/bar/baz/ruby'))
|
66
|
+
end
|
67
|
+
|
68
|
+
test "whereis works with an explicit extension on ms windows" do
|
69
|
+
omit_unless(@@windows, 'test skipped except on MS Windows')
|
70
|
+
assert_not_nil(File.whereis('ruby.exe'))
|
71
|
+
end
|
72
|
+
|
73
|
+
test "whereis requires at least one argument" do
|
74
|
+
assert_raise(ArgumentError){ File.whereis }
|
75
|
+
end
|
76
|
+
|
77
|
+
test "whereis returns unique paths only" do
|
78
|
+
assert_true(File.whereis('ruby') == File.whereis('ruby').uniq)
|
79
|
+
end
|
80
|
+
|
81
|
+
test "whereis accepts a maximum of two arguments" do
|
82
|
+
assert_raise(ArgumentError){ File.whereis('ruby', 'foo', 'bar') }
|
83
|
+
end
|
84
|
+
|
85
|
+
test "the second argument to whereis cannot be nil or empty" do
|
86
|
+
assert_raise(ArgumentError){ File.whereis('ruby', nil) }
|
87
|
+
assert_raise(ArgumentError){ File.whereis('ruby', '') }
|
88
|
+
end
|
89
|
+
|
90
|
+
def teardown
|
91
|
+
@expected_locs = nil
|
92
|
+
@actual_locs = nil
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.shutdown
|
96
|
+
@@windows = nil
|
97
|
+
end
|
52
98
|
end
|
data/test/test_which.rb
CHANGED
@@ -12,40 +12,98 @@ gem 'test-unit'
|
|
12
12
|
|
13
13
|
require 'test/unit'
|
14
14
|
require 'rbconfig'
|
15
|
+
require 'fileutils'
|
15
16
|
require 'ptools'
|
16
17
|
include Config
|
17
18
|
|
18
19
|
class TC_FileWhich < Test::Unit::TestCase
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
20
|
+
def self.startup
|
21
|
+
@@windows = Config::CONFIG['host_os'] =~ /mswin|msdos|win32|cygwin|mingw/i
|
22
|
+
@@dir = File.join(Dir.pwd, 'tempdir')
|
23
|
+
@@non_exe = File.join(Dir.pwd, 'tempfile')
|
24
|
+
|
25
|
+
Dir.mkdir(@@dir) unless File.exists?(@@dir)
|
26
|
+
FileUtils.touch(@@non_exe)
|
27
|
+
File.chmod(775, @@dir)
|
28
|
+
File.chmod(644, @@non_exe)
|
29
|
+
end
|
30
|
+
|
31
|
+
def setup
|
32
|
+
@ruby = RUBY_PLATFORM.match('java') ? 'jruby' : 'ruby'
|
33
|
+
@exe = File.join(CONFIG['bindir'], CONFIG['ruby_install_name'])
|
34
|
+
|
35
|
+
if @@windows
|
36
|
+
@exe.tr!('/','\\')
|
37
|
+
@exe << ".exe"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
test "which basic functionality" do
|
42
|
+
assert_respond_to(File, :which)
|
43
|
+
assert_nothing_raised{ File.which(@ruby) }
|
44
|
+
assert_kind_of(String, File.which(@ruby))
|
45
|
+
end
|
46
|
+
|
47
|
+
test "which accepts an optional path to search" do
|
48
|
+
assert_nothing_raised{ File.which(@ruby, "/usr/bin:/usr/local/bin") }
|
49
|
+
end
|
50
|
+
|
51
|
+
test "which returns nil if not found" do
|
52
|
+
assert_equal(nil, File.which(@ruby, '/bogus/path'))
|
53
|
+
assert_equal(nil, File.which('blahblahblah'))
|
54
|
+
end
|
55
|
+
|
56
|
+
test "which handles executables without extensions on windows" do
|
57
|
+
omit_unless(@@windows, "test skipped unless MS Windows")
|
58
|
+
assert_not_nil(File.which('ruby'))
|
59
|
+
assert_not_nil(File.which('notepad'))
|
60
|
+
end
|
61
|
+
|
62
|
+
test "which handles executables that already contain extensions on windows" do
|
63
|
+
omit_unless(@@windows, "test skipped unless MS Windows")
|
64
|
+
assert_not_nil(File.which('ruby.exe'))
|
65
|
+
assert_not_nil(File.which('notepad.exe'))
|
66
|
+
end
|
67
|
+
|
68
|
+
test "which returns argument if an existent absolute path is provided" do
|
69
|
+
assert_equal(@exe, File.which(@ruby))
|
70
|
+
end
|
71
|
+
|
72
|
+
test "which returns nil if a non-existent absolute path is provided" do
|
73
|
+
assert_nil(File.which('/foo/bar/baz/ruby'))
|
74
|
+
end
|
75
|
+
|
76
|
+
test "which does not pickup files that are not executable" do
|
77
|
+
assert_nil(File.which(@@non_exe))
|
78
|
+
end
|
79
|
+
|
80
|
+
test "which does not pickup executable directories" do
|
81
|
+
assert_nil(File.which(@@dir))
|
82
|
+
end
|
83
|
+
|
84
|
+
test "which accepts a minimum of one argument" do
|
85
|
+
assert_raises(ArgumentError){ File.which }
|
86
|
+
end
|
87
|
+
|
88
|
+
test "which accepts a maximum of two arguments" do
|
89
|
+
assert_raises(ArgumentError){ File.which(@ruby, "foo", "bar") }
|
90
|
+
end
|
91
|
+
|
92
|
+
test "the second argument cannot be nil or empty" do
|
93
|
+
assert_raises(ArgumentError){ File.which(@ruby, nil) }
|
94
|
+
assert_raises(ArgumentError){ File.which(@ruby, '') }
|
95
|
+
end
|
96
|
+
|
97
|
+
def teardown
|
98
|
+
@exe = nil
|
99
|
+
@ruby = nil
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.shutdown
|
103
|
+
FileUtils.rm(@@non_exe)
|
104
|
+
FileUtils.rm_rf(@@dir)
|
105
|
+
@@windows = nil
|
106
|
+
@@dir = nil
|
107
|
+
@@non_exe = nil
|
108
|
+
end
|
51
109
|
end
|