ptools 1.0.0 → 1.1.0

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 CHANGED
@@ -1,3 +1,12 @@
1
+ == 1.1.0 - 23-Aug-2006
2
+ * Added the File.null method which returns the bit bucket on your platform.
3
+ * The suffixes on MS Windows are now based on the PATHEXT environment variable,
4
+ and defaults to '.com', '.bat' and '.exe' only if it's not defined.
5
+ * The File.which and File.whereis methods were tweaked a bit for Windows so
6
+ that they ignore the case of suffixes.
7
+ * Modified the platform checking and path separator handling.
8
+ * Added and tweaked some tests.
9
+
1
10
  == 1.0.0 - 2-Jun-2005
2
11
  * Modified the File.middle method to accept an optional block.
3
12
  * File.whereis is now limited to unique values so that redundant PATH entries
data/MANIFEST CHANGED
@@ -11,6 +11,7 @@ test/tc_constants.rb
11
11
  test/tc_head.rb
12
12
  test/tc_middle.rb
13
13
  test/tc_nlconvert.rb
14
+ test/tc_null.rb
14
15
  test/tc_tail.rb
15
16
  test/tc_touch.rb
16
17
  test/tc_wc.rb
data/README CHANGED
@@ -6,6 +6,10 @@
6
6
  Ruby 1.8.0 or later is recommended but not required.
7
7
 
8
8
  == Installation
9
+ === Gem
10
+ ruby ptools.gemspec
11
+ gem install ptools-x.y.z.gem
12
+ === Manual
9
13
  ruby test/ts_all.rb (optional)
10
14
  ruby install.rb
11
15
 
@@ -21,6 +25,7 @@
21
25
  File.wc("myfile",'words') # Returns the number of words in 'myfile'
22
26
 
23
27
  File.touch("newfile") # "newfile" now exists
28
+ File.null # '/dev/null' on Unix, 'NUL' on Windows
24
29
 
25
30
  # Creates a copy of 'myfile' called 'newfile', in DOS format
26
31
  File.nl_convert("myfile", "newfile", "dos")
@@ -48,7 +53,7 @@
48
53
  Ruby's
49
54
 
50
55
  == Copyright
51
- (C) 2003-2005 Daniel J. Berger
56
+ (C) 2003-2006 Daniel J. Berger
52
57
  All Rights Reserved.
53
58
 
54
59
  == Warranty
@@ -1,21 +1,41 @@
1
1
  class File
2
+ PTOOLS_VERSION = '1.1.0'
3
+ IS_WINDOWS = RUBY_PLATFORM.match('mswin') ? true : false
2
4
 
3
- PTOOLS_VERSION = "1.0.0"
4
- WIN32EXTS = %w/.exe .com .bat/
5
+ WIN32EXTS = ENV['PATHEXT'].split(';').map{ |e| e.downcase } rescue %w/.exe .com .bat/
6
+
7
+ # Returns the null device (aka bitbucket) on your platform. On most
8
+ # Unix-like systems this is '/dev/null', on Windows it's 'NUL', etc.
9
+ #--
10
+ # Based on information from http://en.wikipedia.org/wiki//dev/null
11
+ #
12
+ def self.null
13
+ case RUBY_PLATFORM
14
+ when /mswin/i
15
+ 'NUL'
16
+ when /amiga/i
17
+ 'NIL:'
18
+ when /openvms/i
19
+ 'NL:'
20
+ else
21
+ '/dev/null'
22
+ end
23
+ end
5
24
 
6
25
  # Looks for the first occurrence of +program+ within +path+.
7
26
  #
8
- # On Win32, it looks for executables ending with .exe, .bat and .com
9
- # which you may optionally include in the program name.
27
+ # On Windows, it looks for executables ending with the suffixes defined
28
+ # in your PATHEXT environment variable, or '.exe', '.bat' and '.com' if
29
+ # that isn't defined, which you may optionally include in +program+.
30
+ #
31
+ # Returns nil if not found.
10
32
  #
11
- # Returns nil if not found.
12
33
  def self.which(program, path=ENV['PATH'])
13
34
  programs = program.to_a
14
35
 
15
- # If no file extension is provided on Windows, try .bat, .com
16
- # and .exe in turn.
17
- if File::ALT_SEPARATOR && File.extname(program).empty?
18
- unless WIN32EXTS.include?(File.extname(program))
36
+ # If no file extension is provided on Windows, try the WIN32EXT's in turn
37
+ if IS_WINDOWS && File.extname(program).empty?
38
+ unless WIN32EXTS.include?(File.extname(program).downcase)
19
39
  WIN32EXTS.each{ |ext|
20
40
  programs.push(program + ext)
21
41
  }
@@ -29,7 +49,7 @@ class File
29
49
  f = File.join(dir, prog)
30
50
  if File.executable?(f) && !File.directory?(f)
31
51
  location = File.join(dir, prog)
32
- location.tr!('/',File::ALT_SEPARATOR) if File::ALT_SEPARATOR
52
+ location.tr!('/', File::ALT_SEPARATOR) if File::ALT_SEPARATOR
33
53
  throw(:done, location)
34
54
  end
35
55
  }
@@ -42,17 +62,20 @@ class File
42
62
 
43
63
  # In block form, yields each +program+ within +path+. In non-block
44
64
  # form, returns an array of each +program+ within +path+.
45
- #
46
- # On Win32, it looks for executables ending with .exe, .bat and .com
47
- # which you may optionally include in the program name.
65
+ #
66
+ # On Windows, it looks for executables ending with the suffixes defined
67
+ # in your PATHEXT environment variable, or '.exe', '.bat' and '.com' if
68
+ # that isn't defined, which you may optionally include in +program+.
69
+ #
70
+ # Returns nil if not found.
71
+ #
48
72
  def self.whereis(program, path=ENV['PATH'])
49
73
  dirs = []
50
74
  programs = program.to_a
51
75
 
52
- # If no file extension is provided on Windows, try .bat, .com
53
- # and .exe in turn.
54
- if File::ALT_SEPARATOR && File.extname(program).empty?
55
- unless WIN32EXTS.include?(File.extname(program))
76
+ # If no file extension is provided on Windows, try the WIN32EXT's in turn
77
+ if IS_WINDOWS && File.extname(program).empty?
78
+ unless WIN32EXTS.include?(File.extname(program).downcase)
56
79
  WIN32EXTS.each{ |ext|
57
80
  programs.push(program + ext)
58
81
  }
@@ -62,7 +85,7 @@ class File
62
85
  path.split(File::PATH_SEPARATOR).each{ |dir|
63
86
  programs.each{ |prog|
64
87
  file = File.join(dir,prog)
65
- file.tr!('/',File::ALT_SEPARATOR) if File::ALT_SEPARATOR
88
+ file.tr!('/', File::ALT_SEPARATOR) if File::ALT_SEPARATOR
66
89
  if File.executable?(file) && !File.directory?(file)
67
90
  if block_given?
68
91
  yield file
@@ -77,6 +100,7 @@ class File
77
100
 
78
101
  # In block form, yields the first +num_lines+ from +filename+. In non-block
79
102
  # form, returns an Array of +num_lines+
103
+ #
80
104
  def self.head(filename, num_lines=10)
81
105
  a = []
82
106
  IO.foreach(filename){ |line|
@@ -93,6 +117,7 @@ class File
93
117
 
94
118
  # In block form, yields line +from+ up to line +to+. In non-block form
95
119
  # returns an Array of lines from +from+ to +to+.
120
+ #
96
121
  def self.middle(filename, from=10, to=20)
97
122
  if block_given?
98
123
  IO.readlines(filename)[from-1..to-1].each{ |line| yield line }
@@ -107,6 +132,7 @@ class File
107
132
  # Note that this method slurps the entire file, so I don't recommend it
108
133
  # for very large files. Also note that 'tail -f' functionality is not
109
134
  # present.
135
+ #
110
136
  def self.tail(filename, num_lines=10)
111
137
  if block_given?
112
138
  IO.readlines(filename).reverse[0..num_lines-1].reverse.each{ |line|
@@ -120,21 +146,21 @@ class File
120
146
  # Converts a text file from one OS platform format to another, ala
121
147
  # 'dos2unix'. Valid values for 'format', which are case insensitve,
122
148
  # include:
123
-
124
- # * MS Windows -> dos, windows, win32
149
+ #
150
+ # * MS Windows -> dos, windows, win32, mswin
125
151
  # * Unix/BSD -> unix, linux, bsd
126
152
  # * Mac -> mac, macintosh, apple, osx
127
-
153
+ #
128
154
  # Note that this method is only valid for an ftype of "file". Otherwise a
129
155
  # TypeError will be raised. If an invalid format value is received, an
130
156
  # ArgumentError is raised.
157
+ #
131
158
  def self.nl_convert(filename, newfilename=filename, platform="dos")
132
-
133
159
  unless File.ftype(filename) == "file"
134
160
  raise TypeError, "Only valid for plain text files"
135
161
  end
136
162
 
137
- if platform =~ /dos|windows|win32/i
163
+ if platform =~ /dos|windows|win32|mswin/i
138
164
  format = "\cM\cJ"
139
165
  elsif platform =~ /unix|linux|bsd/i
140
166
  format = "\cJ"
@@ -173,17 +199,19 @@ class File
173
199
  end
174
200
 
175
201
  # Creates the 0 byte file +filename+.
202
+ #
176
203
  def self.touch(filename)
177
- File.open(filename,"w+"){}
204
+ File.open(filename, 'w'){}
178
205
  self
179
206
  end
180
207
 
181
208
  # With no arguments, returns a four element array consisting of the number
182
209
  # of bytes, characters, words and lines in filename, respectively.
183
-
210
+ #
184
211
  # Valid options are 'bytes', 'characters' (or just 'chars'), 'words' and
185
212
  # 'lines'.
186
- def self.wc(filename,option='all')
213
+ #
214
+ def self.wc(filename, option='all')
187
215
  option.downcase!
188
216
  valid = %w/all bytes characters chars lines words/
189
217
 
@@ -17,6 +17,14 @@ require "ptools"
17
17
 
18
18
  class TC_Constants < Test::Unit::TestCase
19
19
  def test_version
20
- assert_equal("1.0.0", File::PTOOLS_VERSION, "Bad VERSION")
20
+ assert_equal("1.1.0", File::PTOOLS_VERSION, "Bad VERSION")
21
+ end
22
+
23
+ def test_windows
24
+ assert_not_nil(File::IS_WINDOWS)
25
+ end
26
+
27
+ def test_win32exts
28
+ assert_not_nil(File::WIN32EXTS)
21
29
  end
22
30
  end
@@ -42,8 +42,8 @@ class TC_FileNLConvert < Test::Unit::TestCase
42
42
  end
43
43
 
44
44
  def test_nl_convert_to_mac
45
- if File::ALT_SEPARATOR
46
- msg = "test may fail on Win32"
45
+ if PLATFORM.match("mswin")
46
+ msg = "test may fail on MS Windows"
47
47
  else
48
48
  msg = "mac file should be the same size (or larger), but isn't"
49
49
  end
@@ -68,7 +68,9 @@ class TC_FileNLConvert < Test::Unit::TestCase
68
68
 
69
69
  def test_nl_convert_expected_errors
70
70
  assert_raises(ArgumentError){ File.nl_convert }
71
- assert_raises(ArgumentError){ File.nl_convert(@test_file1, "bogus.txt", "blah") }
71
+ assert_raises(ArgumentError){
72
+ File.nl_convert(@test_file1, "bogus.txt", "blah")
73
+ }
72
74
  end
73
75
 
74
76
  def teardown
@@ -0,0 +1,40 @@
1
+ ##########################################
2
+ # tc_null.rb
3
+ #
4
+ # Test case for the File.null method.
5
+ ##########################################
6
+ base = File.basename(Dir.pwd)
7
+
8
+ if base == "test" or base =~ /ptools/
9
+ Dir.chdir("..") if base == "test"
10
+ $LOAD_PATH.unshift(Dir.pwd)
11
+ $LOAD_PATH.unshift(Dir.pwd + "/lib")
12
+ Dir.chdir("test") if Dir.pwd != "test"
13
+ end
14
+
15
+ require "test/unit"
16
+ require "ptools"
17
+
18
+ class TC_Null < Test::Unit::TestCase
19
+ def setup
20
+ @nulls = ['/dev/null', 'NUL', 'NIL:', 'NL:']
21
+ end
22
+
23
+ def test_null_basic
24
+ assert_respond_to(File, :null)
25
+ assert_nothing_raised{ File.null }
26
+ end
27
+
28
+ def test_null_expected_results
29
+ assert_kind_of(String, File.null)
30
+ assert(@nulls.include?(File.null))
31
+ end
32
+
33
+ def test_null_expected_errors
34
+ assert_raises(ArgumentError){ File.null(1) }
35
+ end
36
+
37
+ def teardown
38
+ @nulls = nil
39
+ end
40
+ end
@@ -36,8 +36,10 @@ class TC_FileWhereis < Test::Unit::TestCase
36
36
  end
37
37
 
38
38
  def test_whereis_expected_return_values
39
- assert_kind_of(Array, File.whereis("ruby"))
40
- assert_equal(true, @expected_locs.include?(File.whereis("ruby").first))
39
+ msg = "You may need to adjust the setup method if this test failed"
40
+ locs = File.whereis('ruby').map{ |e| e.downcase }
41
+ assert_kind_of(Array, locs)
42
+ assert(@expected_locs.include?(locs.first), msg)
41
43
  assert_equal(nil, File.whereis("blahblah"))
42
44
  end
43
45
 
@@ -10,6 +10,7 @@ require 'tc_constants'
10
10
  require 'tc_head'
11
11
  require 'tc_middle'
12
12
  require 'tc_nlconvert'
13
+ require 'tc_null'
13
14
  require 'tc_tail'
14
15
  require 'tc_touch'
15
16
  require 'tc_wc'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.10
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: ptools
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.0.0
7
- date: 2005-06-02
6
+ version: 1.1.0
7
+ date: 2006-08-23 00:00:00 -06:00
8
8
  summary: Extra methods for the File class
9
9
  require_paths:
10
- - lib
10
+ - lib
11
11
  email: djberg96@gmail.com
12
12
  homepage: http://www.rubyforge.org/projects/shards
13
13
  rubyforge_project:
@@ -18,38 +18,46 @@ bindir: bin
18
18
  has_rdoc: true
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
- -
22
- - ">"
23
- - !ruby/object:Gem::Version
24
- version: 0.0.0
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
25
24
  version:
26
25
  platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
27
29
  authors:
28
- - Daniel J. Berger
30
+ - Daniel J. Berger
29
31
  files:
30
- - lib/ptools.rb
31
- - README
32
- - CHANGES
33
- - MANIFEST
34
- - test/tc_head.rb
35
- - test/ts_all.rb
36
- - test/tc_whereis.rb
37
- - test/tc_middle.rb
38
- - test/tc_which.rb
39
- - test/tc_constants.rb
40
- - test/tc_tail.rb
41
- - test/tc_wc.rb
42
- - test/tc_nlconvert.rb
43
- - test/test_file1.txt
44
- - test/test_file2.txt
45
- - test/tc_touch.rb
32
+ - lib/ptools.rb
33
+ - CHANGES
34
+ - MANIFEST
35
+ - README
36
+ - test/tc_constants.rb
37
+ - test/tc_head.rb
38
+ - test/tc_middle.rb
39
+ - test/tc_nlconvert.rb
40
+ - test/tc_null.rb
41
+ - test/tc_tail.rb
42
+ - test/tc_touch.rb
43
+ - test/tc_wc.rb
44
+ - test/tc_whereis.rb
45
+ - test/tc_which.rb
46
+ - test/test_file1.txt
47
+ - test/test_file2.txt
48
+ - test/ts_all.rb
46
49
  test_files:
47
- - test/ts_all.rb
50
+ - test/ts_all.rb
48
51
  rdoc_options: []
52
+
49
53
  extra_rdoc_files:
50
- - README
51
- - CHANGES
54
+ - README
55
+ - CHANGES
52
56
  executables: []
57
+
53
58
  extensions: []
59
+
54
60
  requirements: []
55
- dependencies: []
61
+
62
+ dependencies: []
63
+