recls-ruby 2.9.1 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,11 +4,11 @@
4
4
  # Purpose: Definition of Recls::foreach() utility function
5
5
  #
6
6
  # Created: 22nd October 2014
7
- # Updated: 9th June 2016
7
+ # Updated: 14th April 2019
8
8
  #
9
9
  # Author: Matthew Wilson
10
10
  #
11
- # Copyright (c) 2012-2016, Matthew Wilson and Synesis Software
11
+ # Copyright (c) 2012-2019, Matthew Wilson and Synesis Software
12
12
  # All rights reserved.
13
13
  #
14
14
  # Redistribution and use in source and binary forms, with or without
@@ -38,10 +38,15 @@
38
38
 
39
39
  require 'recls/file_search'
40
40
 
41
+ =begin
42
+ =end
43
+
44
+ class Object; end # :nodoc:
45
+
41
46
  module Recls
42
47
 
43
48
  private
44
- class FileSearchLineEnumerator
49
+ class FileSearchLineEnumerator # :nodoc: all
45
50
 
46
51
  include Enumerable
47
52
 
@@ -54,7 +59,7 @@ module Recls
54
59
 
55
60
  @fs.each do |fe|
56
61
 
57
- IO::readlines(fe).each_with_index do |line, index|
62
+ IO.readlines(fe).each_with_index do |line, index|
58
63
 
59
64
  case block.arity
60
65
  when 1
@@ -69,9 +74,36 @@ module Recls
69
74
  end
70
75
  end
71
76
  end
72
- end
77
+ end # class FileSearchLineEnumerator
73
78
  public
74
79
 
80
+ # Performs a recursive search and enumerates the lines of all files
81
+ # found
82
+ #
83
+ # === Signature
84
+ #
85
+ # * *Parameters:*
86
+ # - +searchable+ A searchable instance obtained from Recls::file_search() or Recls::file_rsearch()
87
+ # - +search_root+ (String, Recls::Entry) The root directory of the search. May be +nil+, in which case the current directory is assumed
88
+ # - +patterns+ (String, Array) The pattern(s) for which to search. May be +nil+, in which case Recls::WILDCARDS_ALL is assumed
89
+ # - +options+ (Hash) An options hash
90
+ # - +flags+ (Integer) Combination of flags (with behaviour as described below for the +flags+ option)
91
+ #
92
+ # * *Block:*
93
+ # An optional block that will be executed once for each line in each file
94
+ # found, where the block must take 1, 2, or 3 parameters, representing the
95
+ # line [ + file-line-index [ + entry ]]. If no block is given, an
96
+ # enumerator is returned.
97
+ #
98
+ # ==== Parameter Ordering
99
+ #
100
+ # The parameters may be expressed in any of the following permutations:
101
+ # - +searchable+
102
+ # - +search_root+, +patterns+, +flags+
103
+ # - +search_root+, +patterns+, +options+
104
+ #
105
+ # === Return
106
+ #
75
107
  def self.foreach(*args, &block)
76
108
 
77
109
  fs = nil
@@ -97,7 +129,7 @@ module Recls
97
129
  return FileSearchLineEnumerator.new(fs)
98
130
  end
99
131
  end
100
- end
132
+ end # module Recls
101
133
 
102
134
  # ############################## end of file ############################# #
103
135
 
@@ -0,0 +1,99 @@
1
+ # ######################################################################### #
2
+ # File: recls/obsolete.rb
3
+ #
4
+ # Purpose: Obsolete elements
5
+ #
6
+ # Created: 19th July 2012
7
+ # Updated: 14th April 2019
8
+ #
9
+ # Author: Matthew Wilson
10
+ #
11
+ # Copyright (c) 2012-2019, Matthew Wilson and Synesis Software
12
+ # All rights reserved.
13
+ #
14
+ # Redistribution and use in source and binary forms, with or without
15
+ # modification, are permitted provided that the following conditions are met:
16
+ #
17
+ # * Redistributions of source code must retain the above copyright notice,
18
+ # this list of conditions and the following disclaimer.
19
+ #
20
+ # * Redistributions in binary form must reproduce the above copyright notice,
21
+ # this list of conditions and the following disclaimer in the documentation
22
+ # and/or other materials provided with the distribution.
23
+ #
24
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
28
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ # POSSIBILITY OF SUCH DAMAGE.
35
+ #
36
+ # ######################################################################### #
37
+
38
+
39
+
40
+ # ######################################################################### #
41
+ # Obsolete symbols
42
+
43
+ if not defined? RECLS_NO_OBSOLETE
44
+
45
+ module Recls # :nodoc: all
46
+
47
+ def self.pathNameSeparator
48
+
49
+ PATH_NAME_SEPARATOR
50
+ end
51
+
52
+ def self.pathSeparator
53
+
54
+ PATH_SEPARATOR
55
+ end
56
+
57
+ def self.wildcardsAll
58
+
59
+ WILDCARDS_ALL
60
+ end
61
+
62
+ class FileSearch # :nodoc:
63
+
64
+ alias_method :searchRoot, :search_root
65
+ alias_method :pattern, :patterns
66
+ end
67
+
68
+ class Entry # :nodoc:
69
+
70
+ alias_method :uncDrive, :drive
71
+ alias_method :directoryPath, :directory_path
72
+ alias_method :directoryParts, :directory_parts
73
+ alias_method :file, :file_full_name
74
+ alias_method :shortFile, :file_short_name
75
+ alias_method :fileBaseName, :file_name_only
76
+ alias_method :fileName, :file_name_only
77
+ alias_method :fileExt, :file_extension
78
+ alias_method :searchDirectory, :search_directory
79
+ alias_method :searchRelativePath, :search_relative_path
80
+
81
+ alias_method :isDirectory, :directory?
82
+ alias_method :isFile, :file?
83
+ #alias_method :isLink, :link?
84
+ alias_method :isReadOnly, :readonly?
85
+ def isUNC
86
+
87
+ d = drive
88
+
89
+ d and d.size > 2
90
+ end
91
+
92
+ alias_method :creationTime, :modification_time
93
+ end
94
+ end # module Recls
95
+ end
96
+
97
+ # ############################## end of file ############################# #
98
+
99
+
@@ -4,11 +4,11 @@
4
4
  # Purpose: Main source file for recls library
5
5
  #
6
6
  # Created: 19th July 2012
7
- # Updated: 9th June 2016
7
+ # Updated: 14th April 2019
8
8
  #
9
9
  # Author: Matthew Wilson
10
10
  #
11
- # Copyright (c) 2012-2015, Matthew Wilson and Synesis Software
11
+ # Copyright (c) 2012-2019, Matthew Wilson and Synesis Software
12
12
  # All rights reserved.
13
13
  #
14
14
  # Redistribution and use in source and binary forms, with or without
@@ -39,76 +39,47 @@
39
39
  require 'recls/version'
40
40
 
41
41
  require 'recls/api'
42
+ require 'recls/entry'
42
43
  require 'recls/file_search'
43
44
  require 'recls/foreach'
44
45
  require 'recls/stat'
45
46
  require 'recls/util'
46
47
  require 'recls/ximpl/os'
47
48
 
49
+
50
+ # The *recls* module
51
+ #
52
+ # == Significant Components
53
+ # - Recls::Entry
54
+ # - Recls::absolute_path
55
+ # - Recls::absolute_path?
56
+ # - Recls::canonicalise_path
57
+ # - Recls::derive_relative_path
58
+ # - Recls::directory?
59
+ # - Recls::exist?
60
+ # - Recls::file?
61
+ # - Recls::file_rsearch
62
+ # - Recls::file_search
63
+ # - Recls::foreach
64
+ # - Recls::stat
65
+ module Recls
66
+
67
+ end # module Recls
68
+
48
69
  module Recls
49
70
 
50
71
  # Represents the "all" wildcards string for the ambient operating
51
72
  # system
52
73
  WILDCARDS_ALL = Recls::Ximpl::OS::WILDCARDS_ALL
53
74
 
75
+ # The string sequence used to separate names in paths, e.g. "/" on UNIX
54
76
  PATH_NAME_SEPARATOR = Recls::Ximpl::OS::PATH_NAME_SEPARATOR
55
77
 
78
+ # The string sequence used to separate paths, e.g. ":" on UNIX
56
79
  PATH_SEPARATOR = Recls::Ximpl::OS::PATH_SEPARATOR
57
- end
58
-
59
- # ######################################################################### #
60
- # Obsolete symbols
61
-
62
- if not defined? RECLS_NO_OBSOLETE
63
-
64
- module Recls
65
-
66
- def self.pathNameSeparator
67
- PATH_NAME_SEPARATOR
68
- end
69
-
70
- def self.pathSeparator
71
- PATH_SEPARATOR
72
- end
73
-
74
- def self.wildcardsAll
75
- WILDCARDS_ALL
76
- end
77
-
78
- class FileSearch
79
-
80
- alias_method :searchRoot, :search_root
81
- alias_method :pattern, :patterns
82
- end
83
-
84
- class Entry
85
-
86
- alias_method :uncDrive, :drive
87
- alias_method :directoryPath, :directory_path
88
- alias_method :directoryParts, :directory_parts
89
- alias_method :file, :file_full_name
90
- alias_method :shortFile, :file_short_name
91
- alias_method :fileBaseName, :file_name_only
92
- alias_method :fileName, :file_name_only
93
- alias_method :fileExt, :file_extension
94
- alias_method :searchDirectory, :search_directory
95
- alias_method :searchRelativePath, :search_relative_path
96
-
97
- alias_method :isDirectory, :directory?
98
- alias_method :isFile, :file?
99
- #alias_method :isLink, :link?
100
- alias_method :isReadOnly, :readonly?
101
- def isUNC
102
-
103
- d = drive
104
-
105
- d and d.size > 2
106
- end
80
+ end # module Recls
107
81
 
108
- alias_method :creationTime, :modification_time
109
- end
110
- end
111
- end
82
+ require 'recls/obsolete'
112
83
 
113
84
  # ############################## end of file ############################# #
114
85
 
@@ -4,7 +4,7 @@
4
4
  # Purpose: Defines the Recls.stat() method for the recls.Ruby library.
5
5
  #
6
6
  # Created: 24th July 2012
7
- # Updated: 21st March 2019
7
+ # Updated: 14th March 2019
8
8
  #
9
9
  # Author: Matthew Wilson
10
10
  #
@@ -39,10 +39,27 @@
39
39
  require 'recls/entry'
40
40
  require 'recls/flags'
41
41
 
42
+ =begin
43
+ =end
44
+
45
+ class Object; end # :nodoc:
46
+
42
47
  module Recls
43
48
 
44
- # Performs a +stat()+ but returns +nil+ if an obtained entry is not a
45
- # directory
49
+ # Equivalent to a Recls::stat() but only returns (a non-+nil+ value) if the
50
+ # path exists _and_ represents a directory
51
+ #
52
+ # This has two advantages over +File.directory?+: it obtains a
53
+ # Recls::Entry in the case where the path represents a directory; and
54
+ # it does '~' interpretation
55
+ #
56
+ # === Signature
57
+ #
58
+ # * *Parameters:*
59
+ # - +path+ (String, Recls::Entry) The path
60
+ #
61
+ # === Return
62
+ # (Recls::Entry, nil) The entry if +path+ exists and is a directory; +nil+ otherwise
46
63
  def self.directory?(path, *args)
47
64
 
48
65
  fe = self.stat(path, *args)
@@ -55,8 +72,20 @@ module Recls
55
72
  fe
56
73
  end
57
74
 
58
- # Performs a +stat()+ but returns +nil+ if an obtained entry is not a
59
- # file
75
+ # Equivalent to a Recls::stat() but only returns (a non-+nil+ value) if the
76
+ # path exists _and_ represents a file
77
+ #
78
+ # This has two advantages over +File.file?+: it obtains a
79
+ # Recls::Entry in the case where the path represents a file; and
80
+ # it does '~' interpretation
81
+ #
82
+ # === Signature
83
+ #
84
+ # * *Parameters:*
85
+ # - +path+ (String, Recls::Entry) The path
86
+ #
87
+ # === Return
88
+ # (Recls::Entry, nil) The entry if +path+ exists and is a file; +nil+ otherwise
60
89
  def self.file?(path, *args)
61
90
 
62
91
  fe = self.stat(path, *args)
@@ -69,13 +98,31 @@ module Recls
69
98
  fe
70
99
  end
71
100
 
72
- # USAGE:
101
+ # Obtains a single Recls::Entry instance from a path, according to the
102
+ # given arguments, which can be any combination of search-root and
103
+ # flags, as discussed below
104
+ #
105
+ # === Signature
106
+ #
107
+ # * *Parameters:*
108
+ # - +path+ (String) A path to evaluate. May not be +nil+
109
+ # - +search_root+ (String, Recls::Entry) A directory from which the returned Entry instance's search-relative attributes are evaluated
110
+ # - +flags+ (Integer) A bit-combined set of flags (such as Recls::DIRECTORIES, Recls::FILES, Recls::RECURSIVE, Recls::DETAILS_LATER, and so on)
111
+ #
112
+ # ==== Parameter Ordering
73
113
  #
74
- # - stat(path)
75
- # - stat(path, flags)
76
- # - stat(path, search_root)
77
- # - stat(path, search_root, flags)
78
- # - stat(path, flags, search_root)
114
+ # The parameters may be expressed in any of the following permutations:
115
+ # - +path+
116
+ # - +path+, +flags+
117
+ # - +path+, +search_root+
118
+ # - +path+, +flags+, +search_root+
119
+ # - +path+, +search_root+, +flags+
120
+ #
121
+ # === Return
122
+ # (Recls::Entry) An entry representing the path on the file-system, or
123
+ # +nil+ if the path does not refer to an existing entity. If the
124
+ # Recls::DETAILS_LATER flag is included, then an entry is returned
125
+ # regardless of its existence
79
126
  def self.stat(path, *args)
80
127
 
81
128
  flags = 0
@@ -86,50 +133,46 @@ module Recls
86
133
 
87
134
  case args.size
88
135
  when 0
136
+
89
137
  ;
90
138
  when 1
139
+
91
140
  case args[0]
92
141
  when ::Integer
142
+
93
143
  flags = args[0]
94
144
  when ::String
145
+
95
146
  search_root = args[0]
96
147
  else
148
+
97
149
  message = "argument '#{args[0]}' (#{args[0].class}) not valid"
98
150
  end
99
151
  when 2
152
+
100
153
  if false
101
154
  elsif ::Integer === args[0] && ::String === args[1]
155
+
102
156
  flags = args[0]
103
157
  search_root = args[1]
104
158
  elsif ::String === args[0] && ::Integer === args[1]
159
+
105
160
  search_root = args[0]
106
161
  flags = args[1]
107
162
  else
163
+
108
164
  message = "invalid combination of arguments"
109
165
  end
110
166
  else
167
+
111
168
  message = "too many arguments"
112
169
  end
113
170
 
114
171
  raise ArgumentError, "#{message}: Recls.stat() takes one (path), two (path+flags or path+search_root), or three (path+search_root+flags) arguments" if message
115
172
 
116
- begin
117
-
118
- Recls::Entry.new(path, Recls::Ximpl::FileStat.stat(path), search_root, flags)
119
- rescue Errno::ENOENT => x
120
-
121
- x = x # suppress warning
122
-
123
- if 0 != (flags & Recls::DETAILS_LATER)
124
-
125
- Recls::Entry.new(path, nil, search_root, flags)
126
- else
127
-
128
- nil
129
- end
130
- end
131
- end
132
- end
173
+ Recls::Ximpl.stat_prep(path, search_root, flags)
174
+ end
175
+ end # module Recls
133
176
 
134
177
  # ############################## end of file ############################# #
135
178