ptools 1.1.7 → 1.1.9
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/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
|