ptools 1.1.9 → 1.2.1
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/.gemtest +0 -0
- data/CHANGES +8 -0
- data/README +2 -1
- data/Rakefile +21 -1
- data/lib/ptools.rb +119 -97
- data/ptools.gemspec +3 -3
- data/test/test_constants.rb +1 -1
- data/test/test_is_sparse.rb +48 -0
- data/test/test_nlconvert.rb +87 -75
- data/test/test_null.rb +25 -22
- data/test/test_wc.rb +64 -38
- data/test/test_whereis.rb +15 -14
- data/test/test_which.rb +5 -4
- metadata +35 -25
data/.gemtest
ADDED
File without changes
|
data/CHANGES
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 1.2.1 - 20-May-2011
|
2
|
+
* Added an (empty) .gemtest file so that it can be used with test.rubygems.org.
|
3
|
+
* Fixed a sparse file test.
|
4
|
+
|
5
|
+
== 1.2.0 - 8-Jan-2011
|
6
|
+
* Added the File.sparse? method for Unix platforms. This method already
|
7
|
+
exists on Windows courtesy of the win32-file library.
|
8
|
+
|
1
9
|
== 1.1.9 - 25-Mar-2010
|
2
10
|
* Refactored File.which and File.whereis and added additional tests for each.
|
3
11
|
* Removed the block form of File.whereis.
|
data/README
CHANGED
@@ -22,6 +22,7 @@
|
|
22
22
|
File.touch("newfile") # "newfile" now exists
|
23
23
|
File.null # '/dev/null' on Unix, 'NUL' on Windows
|
24
24
|
File.binary?('some_file') # true or false
|
25
|
+
File.sparse?('some_file') # true or false
|
25
26
|
|
26
27
|
# Creates a copy of 'myfile' called 'newfile', in DOS format
|
27
28
|
File.nl_convert("myfile", "newfile", "dos")
|
@@ -52,7 +53,7 @@
|
|
52
53
|
Artistic 2.0
|
53
54
|
|
54
55
|
== Copyright
|
55
|
-
(C) 2003-
|
56
|
+
(C) 2003-2011 Daniel J. Berger
|
56
57
|
All Rights Reserved.
|
57
58
|
|
58
59
|
== Warranty
|
data/Rakefile
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'rake'
|
2
|
+
require 'rake/clean'
|
2
3
|
require 'rake/testtask'
|
3
4
|
require 'rbconfig'
|
4
5
|
include Config
|
5
6
|
|
7
|
+
CLEAN.include("**/*.gem", "**/*.rbc", "**/*coverage*")
|
8
|
+
|
6
9
|
desc 'Install the ptools package (non-gem)'
|
7
10
|
task :install do
|
8
11
|
sitelibdir = CONFIG["sitelibdir"]
|
@@ -12,7 +15,7 @@ end
|
|
12
15
|
|
13
16
|
namespace 'gem' do
|
14
17
|
desc 'Create the ptools gem'
|
15
|
-
task :create do
|
18
|
+
task :create => [:clean] do
|
16
19
|
Dir["*.gem"].each{ |f| File.delete(f) } # Clean first
|
17
20
|
spec = eval(IO.read('ptools.gemspec'))
|
18
21
|
Gem::Builder.new(spec).build
|
@@ -26,11 +29,19 @@ namespace 'gem' do
|
|
26
29
|
end
|
27
30
|
|
28
31
|
Rake::TestTask.new do |t|
|
32
|
+
task :test => :clean
|
29
33
|
t.verbose = true
|
30
34
|
t.warning = true
|
31
35
|
end
|
32
36
|
|
33
37
|
namespace 'test' do
|
38
|
+
desc "Check test coverage using rcov"
|
39
|
+
task :coverage => [:clean] do
|
40
|
+
require 'rcov'
|
41
|
+
rm_rf 'coverage'
|
42
|
+
sh "rcov -Ilib test/test*.rb"
|
43
|
+
end
|
44
|
+
|
34
45
|
Rake::TestTask.new('binary') do |t|
|
35
46
|
t.libs << 'test'
|
36
47
|
t.verbose = true
|
@@ -73,6 +84,13 @@ namespace 'test' do
|
|
73
84
|
t.test_files = FileList['test/test_null.rb']
|
74
85
|
end
|
75
86
|
|
87
|
+
Rake::TestTask.new('sparse') do |t|
|
88
|
+
t.libs << 'test'
|
89
|
+
t.verbose = true
|
90
|
+
t.warning = true
|
91
|
+
t.test_files = FileList['test/test_is_sparse.rb']
|
92
|
+
end
|
93
|
+
|
76
94
|
Rake::TestTask.new('tail') do |t|
|
77
95
|
t.libs << 'test'
|
78
96
|
t.verbose = true
|
@@ -108,3 +126,5 @@ namespace 'test' do
|
|
108
126
|
t.test_files = FileList['test/test_which.rb']
|
109
127
|
end
|
110
128
|
end
|
129
|
+
|
130
|
+
task :default => :test
|
data/lib/ptools.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
require 'rbconfig'
|
2
2
|
|
3
|
-
if
|
3
|
+
if File::ALT_SEPARATOR
|
4
4
|
require 'win32/file'
|
5
5
|
end
|
6
6
|
|
7
7
|
class File
|
8
8
|
# The version of the ptools library.
|
9
|
-
PTOOLS_VERSION = '1.1
|
9
|
+
PTOOLS_VERSION = '1.2.1'
|
10
10
|
|
11
11
|
# :stopdoc:
|
12
12
|
|
13
13
|
# The WIN32EXTS string is used as part of a Dir[] call in certain methods.
|
14
|
-
if
|
14
|
+
if File::ALT_SEPARATOR
|
15
15
|
MSWINDOWS = true
|
16
16
|
if ENV['PATHEXT']
|
17
17
|
WIN32EXTS = ('.{' + ENV['PATHEXT'].tr(';', ',').tr('.','') + '}').downcase
|
@@ -40,7 +40,7 @@ class File
|
|
40
40
|
# File.image?('somefile.txt') # => true
|
41
41
|
#--
|
42
42
|
# The approach I used here is based on information found at
|
43
|
-
# http://en.wikipedia.org/wiki/Magic_number_(programming)
|
43
|
+
# http://en.wikipedia.org/wiki/Magic_number_(programming)
|
44
44
|
#
|
45
45
|
def self.image?(file)
|
46
46
|
bool = IMAGE_EXT.include?(File.extname(file).downcase) # Match ext
|
@@ -63,7 +63,7 @@ class File
|
|
63
63
|
#
|
64
64
|
def self.null
|
65
65
|
case Config::CONFIG['host_os']
|
66
|
-
when /mswin|win32|msdos|cygwin|mingw/i
|
66
|
+
when /mswin|win32|msdos|cygwin|mingw|windows/i
|
67
67
|
'NUL'
|
68
68
|
when /amiga/i
|
69
69
|
'NIL:'
|
@@ -94,14 +94,14 @@ class File
|
|
94
94
|
s = (File.read(file, File.stat(file).blksize) || "").split(//)
|
95
95
|
((s.size - s.grep(" ".."~").size) / s.size.to_f) > 0.30
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
# Looks for the first occurrence of +program+ within +path+.
|
99
|
-
#
|
99
|
+
#
|
100
100
|
# On Windows, it looks for executables ending with the suffixes defined
|
101
101
|
# in your PATHEXT environment variable, or '.exe', '.bat' and '.com' if
|
102
102
|
# that isn't defined, which you may optionally include in +program+.
|
103
103
|
#
|
104
|
-
# Returns nil if not found.
|
104
|
+
# Returns nil if not found.
|
105
105
|
#
|
106
106
|
# Examples:
|
107
107
|
#
|
@@ -202,41 +202,43 @@ class File
|
|
202
202
|
paths.empty? ? nil : paths.uniq
|
203
203
|
end
|
204
204
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
IO.foreach(filename){ |line|
|
219
|
-
break if num_lines <= 0
|
220
|
-
num_lines -= 1
|
221
|
-
if block_given?
|
222
|
-
yield line
|
223
|
-
else
|
224
|
-
a << line
|
225
|
-
end
|
226
|
-
}
|
227
|
-
return a.empty? ? nil : a # Return nil in block form
|
228
|
-
end
|
205
|
+
# In block form, yields the first +num_lines+ from +filename+. In non-block
|
206
|
+
# form, returns an Array of +num_lines+
|
207
|
+
#
|
208
|
+
# Examples:
|
209
|
+
#
|
210
|
+
# # Return an array
|
211
|
+
# File.head('somefile.txt') # => ['This is line1', 'This is line2', ...]
|
212
|
+
#
|
213
|
+
# # Use a block
|
214
|
+
# File.head('somefile.txt'){ |line| puts line }
|
215
|
+
#
|
216
|
+
def self.head(filename, num_lines=10)
|
217
|
+
a = []
|
229
218
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
def self.middle(filename, from=10, to=20)
|
219
|
+
IO.foreach(filename){ |line|
|
220
|
+
break if num_lines <= 0
|
221
|
+
num_lines -= 1
|
234
222
|
if block_given?
|
235
|
-
|
223
|
+
yield line
|
236
224
|
else
|
237
|
-
|
225
|
+
a << line
|
238
226
|
end
|
239
|
-
|
227
|
+
}
|
228
|
+
|
229
|
+
return a.empty? ? nil : a # Return nil in block form
|
230
|
+
end
|
231
|
+
|
232
|
+
# In block form, yields line +from+ up to line +to+. In non-block form
|
233
|
+
# returns an Array of lines from +from+ to +to+.
|
234
|
+
#
|
235
|
+
def self.middle(filename, from=10, to=20)
|
236
|
+
if block_given?
|
237
|
+
IO.readlines(filename)[from-1..to-1].each{ |line| yield line }
|
238
|
+
else
|
239
|
+
IO.readlines(filename)[from-1..to-1]
|
240
|
+
end
|
241
|
+
end
|
240
242
|
|
241
243
|
# In block form, yields the last +num_lines+ of file +filename+.
|
242
244
|
# In non-block form, it returns the lines as an array.
|
@@ -259,68 +261,69 @@ class File
|
|
259
261
|
end
|
260
262
|
end
|
261
263
|
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
264
|
+
# Converts a text file from one OS platform format to another, ala
|
265
|
+
# 'dos2unix'. The possible values for +platform+ include:
|
266
|
+
#
|
267
|
+
# * MS Windows -> dos, windows, win32, mswin
|
268
|
+
# * Unix/BSD -> unix, linux, bsd
|
269
|
+
# * Mac -> mac, macintosh, apple, osx
|
270
|
+
#
|
271
|
+
# Note that this method is only valid for an ftype of "file". Otherwise a
|
272
|
+
# TypeError will be raised. If an invalid format value is received, an
|
273
|
+
# ArgumentError is raised.
|
274
|
+
#
|
275
|
+
def self.nl_convert(old_file, new_file = old_file, platform = 'dos')
|
276
|
+
unless File.file?(old_file)
|
277
|
+
raise ArgumentError, 'Only valid for plain text files'
|
278
|
+
end
|
277
279
|
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
280
|
+
if platform =~ /dos|windows|win32|mswin|cygwin|mingw/i
|
281
|
+
format = "\cM\cJ"
|
282
|
+
elsif platform =~ /unix|linux|bsd/i
|
283
|
+
format = "\cJ"
|
284
|
+
elsif platform =~ /mac|apple|macintosh|osx/i
|
285
|
+
format = "\cM"
|
286
|
+
else
|
287
|
+
raise ArgumentError, "Invalid platform string"
|
288
|
+
end
|
289
|
+
|
290
|
+
orig = $\
|
291
|
+
$\ = format
|
292
|
+
|
293
|
+
if old_file == new_file
|
294
|
+
require 'fileutils'
|
295
|
+
require 'tempfile'
|
296
|
+
|
297
|
+
begin
|
298
|
+
temp_name = Time.new.strftime("%Y%m%d%H%M%S")
|
299
|
+
tf = Tempfile.new('ruby_temp_' + temp_name)
|
300
|
+
tf.open
|
301
|
+
|
302
|
+
IO.foreach(old_file){ |line|
|
303
|
+
line.chomp!
|
304
|
+
tf.print line
|
305
|
+
}
|
306
|
+
ensure
|
307
|
+
tf.close if tf && !tf.closed?
|
286
308
|
end
|
287
309
|
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
IO.foreach(old_file){ |line|
|
301
|
-
line.chomp!
|
302
|
-
tf.print line
|
303
|
-
}
|
304
|
-
ensure
|
305
|
-
tf.close if tf && !tf.closed?
|
306
|
-
end
|
307
|
-
File.delete(old_file)
|
308
|
-
FileUtils.cp(tf.path, old_file)
|
309
|
-
else
|
310
|
-
begin
|
311
|
-
nf = File.new(new_file, 'w')
|
312
|
-
IO.foreach(old_file){ |line|
|
313
|
-
line.chomp!
|
314
|
-
nf.print line
|
315
|
-
}
|
316
|
-
ensure
|
317
|
-
nf.close if nf && !nf.closed?
|
318
|
-
end
|
310
|
+
File.delete(old_file)
|
311
|
+
FileUtils.cp(tf.path, old_file)
|
312
|
+
else
|
313
|
+
begin
|
314
|
+
nf = File.new(new_file, 'w')
|
315
|
+
IO.foreach(old_file){ |line|
|
316
|
+
line.chomp!
|
317
|
+
nf.print line
|
318
|
+
}
|
319
|
+
ensure
|
320
|
+
nf.close if nf && !nf.closed?
|
319
321
|
end
|
322
|
+
end
|
320
323
|
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
+
$\ = orig
|
325
|
+
self
|
326
|
+
end
|
324
327
|
|
325
328
|
# Changes the access and modification time if present, or creates a 0
|
326
329
|
# byte file +filename+ if it doesn't already exist.
|
@@ -350,6 +353,7 @@ class File
|
|
350
353
|
end
|
351
354
|
|
352
355
|
n = 0
|
356
|
+
|
353
357
|
if option == 'lines'
|
354
358
|
IO.foreach(filename){ n += 1 }
|
355
359
|
return n
|
@@ -386,6 +390,24 @@ class File
|
|
386
390
|
end
|
387
391
|
end
|
388
392
|
|
393
|
+
class << self
|
394
|
+
# Already provided by win32-file on MS Windows
|
395
|
+
unless respond_to?(:sparse?)
|
396
|
+
# Returns whether or not +file+ is a sparse file.
|
397
|
+
#
|
398
|
+
# A sparse file is a any file where its size is greater than the number
|
399
|
+
# of 512k blocks it consumes, i.e. its apparent and actual file size is
|
400
|
+
# not the same.
|
401
|
+
#
|
402
|
+
# See http://en.wikipedia.org/wiki/Sparse_file for more information.
|
403
|
+
#
|
404
|
+
def sparse?(file)
|
405
|
+
stats = File.stat(file)
|
406
|
+
stats.size > stats.blocks * 512
|
407
|
+
end
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
389
411
|
private
|
390
412
|
|
391
413
|
def self.bmp?(file)
|
@@ -401,6 +423,6 @@ class File
|
|
401
423
|
end
|
402
424
|
|
403
425
|
def self.gif?(file)
|
404
|
-
|
426
|
+
['GIF89a', 'GIF97a'].include?(IO.read(file, 6))
|
405
427
|
end
|
406
428
|
end
|
data/ptools.gemspec
CHANGED
@@ -3,7 +3,7 @@ require 'rbconfig'
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.name = 'ptools'
|
6
|
-
gem.version = '1.1
|
6
|
+
gem.version = '1.2.1'
|
7
7
|
gem.license = 'Artistic 2.0'
|
8
8
|
gem.author = 'Daniel J. Berger'
|
9
9
|
gem.email = 'djberg96@gmail.com'
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.summary = 'Extra methods for the File class'
|
12
12
|
gem.test_files = Dir['test/test*']
|
13
13
|
gem.has_rdoc = true
|
14
|
-
gem.files = Dir['**/*']
|
14
|
+
gem.files = Dir['**/*'] << '.gemtest'
|
15
15
|
|
16
16
|
gem.rubyforge_project = 'shards'
|
17
17
|
gem.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
|
@@ -24,7 +24,7 @@ Gem::Specification.new do |gem|
|
|
24
24
|
|
25
25
|
gem.add_development_dependency('test-unit', '>= 2.0.7')
|
26
26
|
|
27
|
-
if Config::CONFIG['host_os'] =~ /mswin|win32|msdos|cygwin|mingw/i
|
27
|
+
if Config::CONFIG['host_os'] =~ /mswin|win32|msdos|cygwin|mingw|windows/i
|
28
28
|
gem.platform = Gem::Platform::CURRENT
|
29
29
|
gem.add_dependency('win32-file', '>= 0.5.4')
|
30
30
|
end
|
data/test/test_constants.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
#####################################################################
|
2
|
+
# test_is_sparse.rb
|
3
|
+
#
|
4
|
+
# Test case for the File.sparse? method. You should run this test
|
5
|
+
# via the 'rake test:is_sparse' task.
|
6
|
+
#####################################################################
|
7
|
+
require 'rubygems'
|
8
|
+
gem 'test-unit'
|
9
|
+
|
10
|
+
require 'test/unit'
|
11
|
+
require 'ptools'
|
12
|
+
|
13
|
+
class TC_IsSparse < Test::Unit::TestCase
|
14
|
+
def self.startup
|
15
|
+
Dir.chdir("test") if File.exists?("test")
|
16
|
+
@@win = Config::CONFIG['host_os'] =~ /windows|mswin|dos|cygwin|mingw/i
|
17
|
+
@@osx = Config::CONFIG['host_os'] =~ /darwin|osx/i
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup
|
21
|
+
@sparse_file = '/var/log/lastlog'
|
22
|
+
@non_sparse_file = File.expand_path(File.basename(__FILE__))
|
23
|
+
end
|
24
|
+
|
25
|
+
test "is_sparse basic functionality" do
|
26
|
+
omit_if(@@win, "File.sparse? tests skipped on MS Windows")
|
27
|
+
assert_respond_to(File, :sparse?)
|
28
|
+
assert_nothing_raised{ File.sparse?(@sparse_file) }
|
29
|
+
assert_boolean(File.sparse?(@sparse_file))
|
30
|
+
end
|
31
|
+
|
32
|
+
test "is_sparse returns the expected results" do
|
33
|
+
omit_if(@@win, "File.sparse? tests skipped on MS Windows")
|
34
|
+
omit_if(@@osx, "File.sparse? tests skipped on OS X")
|
35
|
+
assert_true(File.sparse?(@sparse_file))
|
36
|
+
assert_false(File.sparse?(@non_sparse_file))
|
37
|
+
end
|
38
|
+
|
39
|
+
test "is_sparse only accepts one argument" do
|
40
|
+
omit_if(@@win, "File.sparse? tests skipped on MS Windows")
|
41
|
+
assert_raise(ArgumentError){ File.sparse?(@sparse_file, @sparse_file) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def teardown
|
45
|
+
@sparse_file = nil
|
46
|
+
@non_sparse_file = nil
|
47
|
+
end
|
48
|
+
end
|
data/test/test_nlconvert.rb
CHANGED
@@ -11,79 +11,91 @@ require 'test/unit'
|
|
11
11
|
require 'ptools'
|
12
12
|
|
13
13
|
class TC_FileNLConvert < Test::Unit::TestCase
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
14
|
+
def self.startup
|
15
|
+
Dir.chdir('test') if File.exists?('test')
|
16
|
+
@@test_file1 = 'test_nl_convert1.txt'
|
17
|
+
@@test_file2 = 'test_nl_convert2.txt'
|
18
|
+
File.open(@@test_file1, 'w'){ |fh| 10.times{ |n| fh.puts "line #{n}" } }
|
19
|
+
File.open(@@test_file2, 'w'){ |fh| 10.times{ |n| fh.puts "line #{n}" } }
|
20
|
+
end
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@test_file1 = 'test_nl_convert1.txt'
|
24
|
+
@test_file2 = 'test_nl_convert2.txt'
|
25
|
+
@dos_file = 'dos_test_file.txt'
|
26
|
+
@mac_file = 'mac_test_file.txt'
|
27
|
+
@unix_file = 'nix_test_file.txt'
|
28
|
+
end
|
29
|
+
|
30
|
+
test "nl_convert basic functionality" do
|
31
|
+
assert_respond_to(File, :nl_convert)
|
32
|
+
end
|
33
|
+
|
34
|
+
test "nl_convert accepts one, two or three arguments" do
|
35
|
+
assert_nothing_raised{ File.nl_convert(@test_file2) }
|
36
|
+
assert_nothing_raised{ File.nl_convert(@test_file2, @test_file2) }
|
37
|
+
assert_nothing_raised{ File.nl_convert(@test_file2, @test_file2, "unix") }
|
38
|
+
end
|
39
|
+
|
40
|
+
test "nl_convert with dos platform argument works as expected" do
|
41
|
+
msg = "dos file should be larger, but isn't"
|
42
|
+
|
43
|
+
assert_nothing_raised{ File.nl_convert(@test_file1, @dos_file, "dos") }
|
44
|
+
assert_true(File.size(@dos_file) > File.size(@test_file1), msg)
|
45
|
+
assert_equal(["\cM","\cJ"], IO.readlines(@dos_file).first.split("")[-2..-1])
|
46
|
+
end
|
47
|
+
|
48
|
+
test "nl_convert with mac platform argument works as expected" do
|
49
|
+
assert_nothing_raised{ File.nl_convert(@test_file1, @mac_file, 'mac') }
|
50
|
+
assert_equal("\cM", IO.readlines(@mac_file).first.split("").last)
|
51
|
+
|
52
|
+
omit_if(File::ALT_SEPARATOR)
|
53
|
+
msg = "=> Mac file should be the same size (or larger), but isn't"
|
54
|
+
assert_true(File.size(@mac_file) == File.size(@test_file1), msg)
|
55
|
+
end
|
56
|
+
|
57
|
+
test "nl_convert with unix platform argument works as expected" do
|
58
|
+
msg = "unix file should be the same size (or smaller), but isn't"
|
59
|
+
|
60
|
+
assert_nothing_raised{ File.nl_convert(@test_file1, @unix_file, "unix") }
|
61
|
+
assert_equal("\n", IO.readlines(@unix_file).first.split("").last)
|
62
|
+
|
63
|
+
if File::ALT_SEPARATOR
|
64
|
+
assert_true(File.size(@unix_file) >= File.size(@test_file1), msg)
|
65
|
+
else
|
66
|
+
assert_true(File.size(@unix_file) <= File.size(@test_file1), msg)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
test "nl_convert requires at least one argument" do
|
71
|
+
assert_raise(ArgumentError){ File.nl_convert }
|
72
|
+
end
|
73
|
+
|
74
|
+
test "nl_convert requires a valid platform string" do
|
75
|
+
assert_raise(ArgumentError){ File.nl_convert(@test_file1, "bogus.txt", "blah") }
|
76
|
+
end
|
77
|
+
|
78
|
+
test "nl_convert accepts a maximum of three arguments" do
|
79
|
+
assert_raise(ArgumentError){ File.nl_convert(@test_file1, @test_file2, 'dos', 1) }
|
80
|
+
end
|
81
|
+
|
82
|
+
test "nl_convert will fail on anything but plain files" do
|
83
|
+
assert_raise(ArgumentError){ File.nl_convert(File.null_device, @test_file1) }
|
84
|
+
end
|
85
|
+
|
86
|
+
def teardown
|
87
|
+
[@dos_file, @mac_file, @unix_file].each{ |file|
|
88
|
+
File.delete(file) if File.exists?(file)
|
89
|
+
}
|
90
|
+
@dos_file = nil
|
91
|
+
@mac_file = nil
|
92
|
+
@unix_file = nil
|
93
|
+
@test_file1 = nil
|
94
|
+
@test_file2 = nil
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.shutdown
|
98
|
+
File.delete(@@test_file1) if File.exists?(@@test_file1)
|
99
|
+
File.delete(@@test_file2) if File.exists?(@@test_file2)
|
100
|
+
end
|
89
101
|
end
|
data/test/test_null.rb
CHANGED
@@ -4,34 +4,37 @@
|
|
4
4
|
# Test case for the File.null method. You should run this test via
|
5
5
|
# the 'rake test_null' task.
|
6
6
|
#####################################################################
|
7
|
+
require 'rubygems'
|
8
|
+
gem 'test-unit'
|
9
|
+
|
7
10
|
require 'test/unit'
|
8
11
|
require 'ptools'
|
9
12
|
|
10
|
-
class
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
class TC_FileNull < Test::Unit::TestCase
|
14
|
+
def setup
|
15
|
+
@nulls = ['/dev/null', 'NUL', 'NIL:', 'NL:']
|
16
|
+
end
|
14
17
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
test "null method basic functionality" do
|
19
|
+
assert_respond_to(File, :null)
|
20
|
+
assert_nothing_raised{ File.null }
|
21
|
+
end
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
23
|
+
test "null method returns expected results" do
|
24
|
+
assert_kind_of(String, File.null)
|
25
|
+
assert(@nulls.include?(File.null))
|
26
|
+
end
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
test "null method does not accept any arguments" do
|
29
|
+
assert_raises(ArgumentError){ File.null(1) }
|
30
|
+
end
|
28
31
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
32
|
+
test "null_device is an alias for null" do
|
33
|
+
assert_respond_to(File, :null_device)
|
34
|
+
assert_alias_method(File, :null_device, :null)
|
35
|
+
end
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
+
def teardown
|
38
|
+
@nulls = nil
|
39
|
+
end
|
37
40
|
end
|
data/test/test_wc.rb
CHANGED
@@ -4,47 +4,73 @@
|
|
4
4
|
# Test case for the File.wc method. This test should be run via
|
5
5
|
# the 'rake test_wc' task.
|
6
6
|
#####################################################################
|
7
|
+
require 'rubygems'
|
8
|
+
gem 'test-unit'
|
9
|
+
|
7
10
|
require 'test/unit'
|
8
11
|
require 'ptools'
|
9
12
|
|
10
13
|
class TC_FileWC < Test::Unit::TestCase
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
def self.startup
|
15
|
+
Dir.chdir('test') if File.exists?('test')
|
16
|
+
File.open('test_file1.txt', 'w'){ |fh| 25.times{ |n| fh.puts "line#{n+1}" } }
|
17
|
+
@@test_file = 'test_file1.txt'
|
18
|
+
end
|
15
19
|
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
20
|
+
def setup
|
21
|
+
@test_file = 'test_file1.txt'
|
22
|
+
end
|
23
|
+
|
24
|
+
test "wc method basic functionality" do
|
25
|
+
assert_respond_to(File, :wc)
|
26
|
+
assert_nothing_raised{ File.wc(@test_file) }
|
27
|
+
end
|
28
|
+
|
29
|
+
test "wc accepts specific optional arguments" do
|
30
|
+
assert_nothing_raised{ File.wc(@test_file, 'bytes') }
|
31
|
+
assert_nothing_raised{ File.wc(@test_file, 'chars') }
|
32
|
+
assert_nothing_raised{ File.wc(@test_file, 'words') }
|
33
|
+
assert_nothing_raised{ File.wc(@test_file, 'lines') }
|
34
|
+
end
|
35
|
+
|
36
|
+
test "argument to wc ignores the case of the option argument" do
|
37
|
+
assert_nothing_raised{ File.wc(@test_file, 'LINES') }
|
38
|
+
end
|
39
|
+
|
40
|
+
test "wc with no option returns expected results" do
|
41
|
+
assert_kind_of(Array, File.wc(@test_file))
|
42
|
+
assert_equal([166,166,25,25], File.wc(@test_file))
|
43
|
+
end
|
44
|
+
|
45
|
+
test "wc with bytes option returns the expected result" do
|
46
|
+
assert_equal(166, File.wc(@test_file, 'bytes'), "Wrong number of bytes")
|
47
|
+
end
|
48
|
+
|
49
|
+
test "wc with chars option returns the expected result" do
|
50
|
+
assert_equal(166, File.wc(@test_file, 'chars'), "Wrong number of chars")
|
51
|
+
end
|
52
|
+
|
53
|
+
test "wc with words option returns the expected result" do
|
54
|
+
assert_equal(25, File.wc(@test_file, 'words'), "Wrong number of words")
|
55
|
+
end
|
56
|
+
|
57
|
+
test "wc with lines option returns the expected result" do
|
58
|
+
assert_equal(25, File.wc(@test_file, 'lines'), "Wrong number of lines")
|
59
|
+
end
|
60
|
+
|
61
|
+
test "wc requires at least on argument" do
|
62
|
+
assert_raises(ArgumentError){ File.wc }
|
63
|
+
end
|
64
|
+
|
65
|
+
test "an invalid option raises an error" do
|
66
|
+
assert_raises(ArgumentError){ File.wc(@test_file, 'bogus') }
|
67
|
+
end
|
68
|
+
|
69
|
+
def teardown
|
70
|
+
@test_file = nil
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.shutdown
|
74
|
+
File.delete(@@test_file) if File.exists?(@@test_file)
|
75
|
+
end
|
50
76
|
end
|
data/test/test_whereis.rb
CHANGED
@@ -14,10 +14,11 @@ include Config
|
|
14
14
|
class TC_FileWhereis < Test::Unit::TestCase
|
15
15
|
def self.startup
|
16
16
|
@@windows = Config::CONFIG['host_os'] =~ /mswin|win32|msdos|cygwin|mingw/i
|
17
|
+
@@ruby = RUBY_PLATFORM == 'java' ? 'jruby' : 'ruby'
|
17
18
|
end
|
18
19
|
|
19
20
|
def setup
|
20
|
-
@expected_locs = [File.join(CONFIG['bindir'],
|
21
|
+
@expected_locs = [File.join(CONFIG['bindir'], @@ruby)]
|
21
22
|
|
22
23
|
if @@windows
|
23
24
|
@expected_locs[0] << '.exe'
|
@@ -25,10 +26,10 @@ class TC_FileWhereis < Test::Unit::TestCase
|
|
25
26
|
end
|
26
27
|
|
27
28
|
unless @@windows
|
28
|
-
@expected_locs <<
|
29
|
-
@expected_locs <<
|
30
|
-
@expected_locs <<
|
31
|
-
@expected_locs <<
|
29
|
+
@expected_locs << "/usr/local/bin/#{@@ruby}"
|
30
|
+
@expected_locs << "/opt/sfw/bin/#{@@ruby}"
|
31
|
+
@expected_locs << "/opt/bin/#{@@ruby}"
|
32
|
+
@expected_locs << "/usr/bin/#{@@ruby}"
|
32
33
|
end
|
33
34
|
|
34
35
|
@actual_locs = nil
|
@@ -45,7 +46,7 @@ class TC_FileWhereis < Test::Unit::TestCase
|
|
45
46
|
end
|
46
47
|
|
47
48
|
test "whereis returns expected values" do
|
48
|
-
assert_nothing_raised{ @actual_locs = File.whereis(
|
49
|
+
assert_nothing_raised{ @actual_locs = File.whereis(@@ruby) }
|
49
50
|
assert_kind_of(Array, @actual_locs)
|
50
51
|
assert_true((@expected_locs & @actual_locs).size > 0)
|
51
52
|
end
|
@@ -55,19 +56,19 @@ class TC_FileWhereis < Test::Unit::TestCase
|
|
55
56
|
end
|
56
57
|
|
57
58
|
test "whereis returns nil if program cannot be found in provided path" do
|
58
|
-
assert_nil(File.whereis(
|
59
|
+
assert_nil(File.whereis(@@ruby, '/foo/bar'))
|
59
60
|
end
|
60
61
|
|
61
62
|
test "whereis returns single element array or nil if absolute path is provided" do
|
62
|
-
absolute = File.join(CONFIG['bindir'],
|
63
|
+
absolute = File.join(CONFIG['bindir'], @@ruby)
|
63
64
|
absolute << '.exe' if @@windows
|
64
65
|
assert_equal([absolute], File.whereis(absolute))
|
65
|
-
assert_nil(File.whereis(
|
66
|
+
assert_nil(File.whereis("/foo/bar/baz/#{@@ruby}"))
|
66
67
|
end
|
67
68
|
|
68
69
|
test "whereis works with an explicit extension on ms windows" do
|
69
70
|
omit_unless(@@windows, 'test skipped except on MS Windows')
|
70
|
-
assert_not_nil(File.whereis('
|
71
|
+
assert_not_nil(File.whereis(@@ruby + '.exe'))
|
71
72
|
end
|
72
73
|
|
73
74
|
test "whereis requires at least one argument" do
|
@@ -75,16 +76,16 @@ class TC_FileWhereis < Test::Unit::TestCase
|
|
75
76
|
end
|
76
77
|
|
77
78
|
test "whereis returns unique paths only" do
|
78
|
-
assert_true(File.whereis(
|
79
|
+
assert_true(File.whereis(@@ruby) == File.whereis(@@ruby).uniq)
|
79
80
|
end
|
80
81
|
|
81
82
|
test "whereis accepts a maximum of two arguments" do
|
82
|
-
assert_raise(ArgumentError){ File.whereis(
|
83
|
+
assert_raise(ArgumentError){ File.whereis(@@ruby, 'foo', 'bar') }
|
83
84
|
end
|
84
85
|
|
85
86
|
test "the second argument to whereis cannot be nil or empty" do
|
86
|
-
assert_raise(ArgumentError){ File.whereis(
|
87
|
-
assert_raise(ArgumentError){ File.whereis(
|
87
|
+
assert_raise(ArgumentError){ File.whereis(@@ruby, nil) }
|
88
|
+
assert_raise(ArgumentError){ File.whereis(@@ruby, '') }
|
88
89
|
end
|
89
90
|
|
90
91
|
def teardown
|
data/test/test_which.rb
CHANGED
@@ -14,7 +14,6 @@ require 'test/unit'
|
|
14
14
|
require 'rbconfig'
|
15
15
|
require 'fileutils'
|
16
16
|
require 'ptools'
|
17
|
-
include Config
|
18
17
|
|
19
18
|
class TC_FileWhich < Test::Unit::TestCase
|
20
19
|
def self.startup
|
@@ -30,7 +29,9 @@ class TC_FileWhich < Test::Unit::TestCase
|
|
30
29
|
|
31
30
|
def setup
|
32
31
|
@ruby = RUBY_PLATFORM.match('java') ? 'jruby' : 'ruby'
|
33
|
-
@
|
32
|
+
@ruby = 'rbx' if defined?(Rubinius)
|
33
|
+
|
34
|
+
@exe = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
|
34
35
|
|
35
36
|
if @@windows
|
36
37
|
@exe.tr!('/','\\')
|
@@ -38,7 +39,7 @@ class TC_FileWhich < Test::Unit::TestCase
|
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
|
-
test "which basic functionality" do
|
42
|
+
test "which method basic functionality" do
|
42
43
|
assert_respond_to(File, :which)
|
43
44
|
assert_nothing_raised{ File.which(@ruby) }
|
44
45
|
assert_kind_of(String, File.which(@ruby))
|
@@ -66,7 +67,7 @@ class TC_FileWhich < Test::Unit::TestCase
|
|
66
67
|
end
|
67
68
|
|
68
69
|
test "which returns argument if an existent absolute path is provided" do
|
69
|
-
assert_equal(@exe, File.which(@ruby))
|
70
|
+
assert_equal(@exe, File.which(@ruby), "=> May fail on a symlink")
|
70
71
|
end
|
71
72
|
|
72
73
|
test "which returns nil if a non-existent absolute path is provided" do
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ptools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 1
|
8
|
+
- 2
|
7
9
|
- 1
|
8
|
-
|
9
|
-
version: 1.1.9
|
10
|
+
version: 1.2.1
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Daniel J. Berger
|
@@ -14,16 +15,18 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date:
|
18
|
+
date: 2011-05-20 00:00:00 -06:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: test-unit
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
24
26
|
requirements:
|
25
27
|
- - ">="
|
26
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 1
|
27
30
|
segments:
|
28
31
|
- 2
|
29
32
|
- 0
|
@@ -42,24 +45,26 @@ extra_rdoc_files:
|
|
42
45
|
- CHANGES
|
43
46
|
- MANIFEST
|
44
47
|
files:
|
45
|
-
- CHANGES
|
46
|
-
- lib/ptools.rb
|
47
|
-
- MANIFEST
|
48
|
-
- ptools.gemspec
|
49
48
|
- Rakefile
|
50
49
|
- README
|
51
|
-
-
|
52
|
-
-
|
53
|
-
-
|
54
|
-
- test/
|
50
|
+
- ptools.gemspec
|
51
|
+
- lib/ptools.rb
|
52
|
+
- CHANGES
|
53
|
+
- test/test_whereis.rb
|
55
54
|
- test/test_middle.rb
|
55
|
+
- test/test_binary.rb
|
56
56
|
- test/test_nlconvert.rb
|
57
|
-
- test/test_null.rb
|
58
|
-
- test/test_tail.rb
|
59
57
|
- test/test_touch.rb
|
60
|
-
- test/test_wc.rb
|
61
|
-
- test/test_whereis.rb
|
62
58
|
- test/test_which.rb
|
59
|
+
- test/test_null.rb
|
60
|
+
- test/test_head.rb
|
61
|
+
- test/test_is_sparse.rb
|
62
|
+
- test/test_wc.rb
|
63
|
+
- test/test_image.rb
|
64
|
+
- test/test_constants.rb
|
65
|
+
- test/test_tail.rb
|
66
|
+
- MANIFEST
|
67
|
+
- .gemtest
|
63
68
|
has_rdoc: true
|
64
69
|
homepage: http://www.rubyforge.org/projects/shards
|
65
70
|
licenses:
|
@@ -70,36 +75,41 @@ rdoc_options: []
|
|
70
75
|
require_paths:
|
71
76
|
- lib
|
72
77
|
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
73
79
|
requirements:
|
74
80
|
- - ">="
|
75
81
|
- !ruby/object:Gem::Version
|
82
|
+
hash: 3
|
76
83
|
segments:
|
77
84
|
- 0
|
78
85
|
version: "0"
|
79
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
80
88
|
requirements:
|
81
89
|
- - ">="
|
82
90
|
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
83
92
|
segments:
|
84
93
|
- 0
|
85
94
|
version: "0"
|
86
95
|
requirements: []
|
87
96
|
|
88
97
|
rubyforge_project: shards
|
89
|
-
rubygems_version: 1.
|
98
|
+
rubygems_version: 1.6.2
|
90
99
|
signing_key:
|
91
100
|
specification_version: 3
|
92
101
|
summary: Extra methods for the File class
|
93
102
|
test_files:
|
94
|
-
- test/
|
95
|
-
- test/test_constants.rb
|
96
|
-
- test/test_head.rb
|
97
|
-
- test/test_image.rb
|
103
|
+
- test/test_whereis.rb
|
98
104
|
- test/test_middle.rb
|
105
|
+
- test/test_binary.rb
|
99
106
|
- test/test_nlconvert.rb
|
100
|
-
- test/test_null.rb
|
101
|
-
- test/test_tail.rb
|
102
107
|
- test/test_touch.rb
|
103
|
-
- test/test_wc.rb
|
104
|
-
- test/test_whereis.rb
|
105
108
|
- test/test_which.rb
|
109
|
+
- test/test_null.rb
|
110
|
+
- test/test_head.rb
|
111
|
+
- test/test_is_sparse.rb
|
112
|
+
- test/test_wc.rb
|
113
|
+
- test/test_image.rb
|
114
|
+
- test/test_constants.rb
|
115
|
+
- test/test_tail.rb
|