recls-ruby 2.6.4
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.
- checksums.yaml +7 -0
- data/LICENSE +31 -0
- data/README.md +2 -0
- data/examples/show_hidden_files.rb +15 -0
- data/examples/show_readonly_files.rb +14 -0
- data/lib/recls.rb +41 -0
- data/lib/recls/entry.rb +328 -0
- data/lib/recls/filesearch.rb +251 -0
- data/lib/recls/flags.rb +77 -0
- data/lib/recls/foreach.rb +103 -0
- data/lib/recls/recls.rb +113 -0
- data/lib/recls/stat.rb +104 -0
- data/lib/recls/util.rb +73 -0
- data/lib/recls/version.rb +53 -0
- data/lib/recls/ximpl/os.rb +85 -0
- data/lib/recls/ximpl/unix.rb +81 -0
- data/lib/recls/ximpl/util.rb +650 -0
- data/lib/recls/ximpl/windows.rb +197 -0
- data/test/scratch/test_display_parts.rb +40 -0
- data/test/scratch/test_entry.rb +81 -0
- data/test/scratch/test_foreach.rb +41 -0
- data/test/scratch/test_show_dev_and_ino.rb +13 -0
- data/test/scratch/test_show_hidden.rb +30 -0
- data/test/unit/tc_recls_entries.rb +55 -0
- data/test/unit/tc_recls_entry.rb +40 -0
- data/test/unit/tc_recls_file_search.rb +68 -0
- data/test/unit/tc_recls_module.rb +78 -0
- data/test/unit/tc_recls_util.rb +159 -0
- data/test/unit/tc_recls_ximpl_util.rb +908 -0
- data/test/unit/ts_all.rb +20 -0
- metadata +73 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 518087f6042cc31fe5d05f724d0f16e00d7192fa
|
4
|
+
data.tar.gz: e480c2ce6cf0aab32dc5ab01a1797c6c5fa275c4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 20fd43b0fff86081eb62e1ea43d889c45bfe0c9add816b70e9d62a568ba2203af551cdaeecbb221bb2d15939a1e31d072f3c4d8f0a4c9a0c86c8cac5bba1ad76
|
7
|
+
data.tar.gz: baa78f624be64f88e3ca5bbc2ec689ac23c7d907bd4ac1dba793816c3d978f70d30891089bf99661c689284093dfde6842640aac5211a1578646573d7baf597e
|
data/LICENSE
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
recls.Ruby
|
2
|
+
|
3
|
+
Copyright (c) 2003-2016, Matthew Wilson and Synesis Software
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
8
|
+
|
9
|
+
* Redistributions of source code must retain the above copyright notice, this
|
10
|
+
list of conditions and the following disclaimer.
|
11
|
+
|
12
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
14
|
+
and/or other materials provided with the distribution.
|
15
|
+
|
16
|
+
* Neither the names of recls or recls.Ruby nor the names of the copyright
|
17
|
+
holder nor the names of its contributors may be used to endorse or promote
|
18
|
+
products derived from this software without specific prior written
|
19
|
+
permission.
|
20
|
+
|
21
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
22
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
23
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
24
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
25
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
26
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
27
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
29
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
|
data/README.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
3
|
+
|
4
|
+
require 'recls'
|
5
|
+
|
6
|
+
# To find only hidden files, need to:
|
7
|
+
#
|
8
|
+
# 1. Ensure that they are returned in search, by including Recls::SHOW_HIDDEN
|
9
|
+
# 2. Filter returned entries by hidden? attribute
|
10
|
+
Recls::FileSearch.new('.', Recls::WILDCARDS_ALL, Recls::FILES | Recls::RECURSIVE | Recls::SHOW_HIDDEN).each do |fe|
|
11
|
+
|
12
|
+
puts fe.path if fe.hidden?
|
13
|
+
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
3
|
+
|
4
|
+
require 'recls'
|
5
|
+
|
6
|
+
# To find only readonly files, need to:
|
7
|
+
#
|
8
|
+
# 1. Filter returned entries by readonly? attribute
|
9
|
+
Recls::FileSearch.new('.', Recls::WILDCARDS_ALL, Recls::FILES | Recls::RECURSIVE).each do |fe|
|
10
|
+
|
11
|
+
puts fe.path if fe.readonly?
|
12
|
+
|
13
|
+
end
|
14
|
+
|
data/lib/recls.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# ######################################################################### #
|
2
|
+
# File: recls.rb
|
3
|
+
#
|
4
|
+
# Purpose: Top-level include for recls.Ruby library
|
5
|
+
#
|
6
|
+
# Created: 13th January 2012
|
7
|
+
# Updated: 27th August 2015
|
8
|
+
#
|
9
|
+
# Author: Matthew Wilson
|
10
|
+
#
|
11
|
+
# Copyright (c) 2012-2015, 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
|
+
require 'recls/recls'
|
40
|
+
|
41
|
+
# ############################## end of file ############################# #
|
data/lib/recls/entry.rb
ADDED
@@ -0,0 +1,328 @@
|
|
1
|
+
# ######################################################################### #
|
2
|
+
# File: recls/entry.rb
|
3
|
+
#
|
4
|
+
# Purpose: Defines the Recls::Entry class for the recls.Ruby library.
|
5
|
+
#
|
6
|
+
# Created: 24th July 2012
|
7
|
+
# Updated: 28th December 2015
|
8
|
+
#
|
9
|
+
# Author: Matthew Wilson
|
10
|
+
#
|
11
|
+
# Copyright (c) 2012-2015, 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
|
+
require 'recls/ximpl/os'
|
40
|
+
require 'recls/ximpl/' + (Recls::Ximpl::OS::OS_IS_WINDOWS ? 'windows' : 'unix')
|
41
|
+
require 'recls/ximpl/util'
|
42
|
+
require 'recls/flags'
|
43
|
+
|
44
|
+
module Recls
|
45
|
+
|
46
|
+
class Entry
|
47
|
+
|
48
|
+
private
|
49
|
+
def self.get_compare_path_(path)
|
50
|
+
return path.upcase if Recls::Ximpl::OS::OS_IS_WINDOWS
|
51
|
+
path
|
52
|
+
end
|
53
|
+
public
|
54
|
+
|
55
|
+
# initialises an entry instance from the given path,
|
56
|
+
# file_stat, and search_dir
|
57
|
+
def initialize(path, file_stat, search_dir, flags)
|
58
|
+
|
59
|
+
@file_stat = file_stat
|
60
|
+
|
61
|
+
@path = Recls::Ximpl.absolute_path path
|
62
|
+
@short_path = nil
|
63
|
+
@compare_path = Entry.get_compare_path_ @path
|
64
|
+
@hash = @compare_path.hash
|
65
|
+
|
66
|
+
windows_drive, directory, basename, file_name, file_ext = Recls::Ximpl::Util.split_path @path
|
67
|
+
|
68
|
+
@drive = windows_drive
|
69
|
+
@directory_path = "#{windows_drive}#{directory}"
|
70
|
+
@directory = directory ? directory : ''
|
71
|
+
@directory_parts = Recls::Ximpl.directory_parts_from_directory directory
|
72
|
+
@file_full_name = basename ? basename : ''
|
73
|
+
@file_short_name = nil
|
74
|
+
@file_name_only = file_name ? file_name : ''
|
75
|
+
@file_extension = file_ext ? file_ext : ''
|
76
|
+
|
77
|
+
@search_directory = search_dir
|
78
|
+
@search_relative_path = Recls::Ximpl.derive_relative_path search_dir, @path
|
79
|
+
@search_relative_directory_path = Recls::Ximpl.derive_relative_path search_dir, @directory_path
|
80
|
+
@search_relative_directory = @search_relative_directory_path
|
81
|
+
@search_relative_directory_parts = Recls::Ximpl.directory_parts_from_directory @search_relative_directory
|
82
|
+
|
83
|
+
if 0 != (Recls::MARK_DIRECTORIES & flags) && directory?
|
84
|
+
@path = Recls::Ximpl::Util.append_trailing_slash @path
|
85
|
+
@search_relative_path = Recls::Ximpl::Util.append_trailing_slash @search_relative_path
|
86
|
+
end
|
87
|
+
|
88
|
+
@dev = @file_stat.dev if @file_stat
|
89
|
+
@ino = @file_stat.ino if @file_stat
|
90
|
+
@nlink = @file_stat.nlink if @file_stat
|
91
|
+
|
92
|
+
if Recls::Ximpl::OS::OS_IS_WINDOWS && @file_stat
|
93
|
+
@dev = @file_stat.by_handle_information.volume_id
|
94
|
+
@ino = @file_stat.by_handle_information.file_index
|
95
|
+
@nlink = @file_stat.by_handle_information.num_links
|
96
|
+
@short_path = @file_stat.short_path
|
97
|
+
@file_short_name = Recls::Ximpl::Util.split_path(@short_path)[2]
|
98
|
+
else
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# ##########################
|
103
|
+
# Name-related attributes
|
104
|
+
|
105
|
+
attr_reader :compare_path
|
106
|
+
|
107
|
+
attr_reader :path
|
108
|
+
attr_reader :short_path
|
109
|
+
attr_reader :drive
|
110
|
+
attr_reader :directory_path
|
111
|
+
alias_method :dirname, :directory_path
|
112
|
+
attr_reader :directory
|
113
|
+
attr_reader :directory_parts
|
114
|
+
attr_reader :file_full_name
|
115
|
+
attr_reader :file_short_name
|
116
|
+
alias_method :basename, :file_full_name
|
117
|
+
attr_reader :file_name_only
|
118
|
+
alias_method :stem, :file_name_only
|
119
|
+
attr_reader :file_extension
|
120
|
+
alias_method :extension, :file_extension
|
121
|
+
attr_reader :search_directory
|
122
|
+
attr_reader :search_relative_path
|
123
|
+
attr_reader :search_relative_directory
|
124
|
+
attr_reader :search_relative_directory_path
|
125
|
+
attr_reader :search_relative_directory_parts
|
126
|
+
|
127
|
+
# ##########################
|
128
|
+
# Nature attributes
|
129
|
+
|
130
|
+
# indicates whether the given entry existed at the time the entry
|
131
|
+
# instance was created
|
132
|
+
def exist?
|
133
|
+
|
134
|
+
not @file_stat.nil?
|
135
|
+
end
|
136
|
+
|
137
|
+
# indicates whether the given entry is hidden
|
138
|
+
def hidden?
|
139
|
+
|
140
|
+
@file_stat.hidden?
|
141
|
+
end
|
142
|
+
|
143
|
+
# indicates whether the given entry is readonly
|
144
|
+
def readonly?
|
145
|
+
|
146
|
+
not @file_stat.writable?
|
147
|
+
end
|
148
|
+
|
149
|
+
# ##########################
|
150
|
+
# Comparison
|
151
|
+
|
152
|
+
if Recls::Ximpl::OS::OS_IS_WINDOWS
|
153
|
+
|
154
|
+
def system?
|
155
|
+
|
156
|
+
@file_stat.system?
|
157
|
+
end
|
158
|
+
|
159
|
+
def archive?
|
160
|
+
|
161
|
+
@file_stat.archive?
|
162
|
+
end
|
163
|
+
|
164
|
+
def device?
|
165
|
+
|
166
|
+
@file_stat.device?
|
167
|
+
end
|
168
|
+
|
169
|
+
def normal?
|
170
|
+
|
171
|
+
@file_stat.normal?
|
172
|
+
end
|
173
|
+
|
174
|
+
def temporary?
|
175
|
+
|
176
|
+
@file_stat.temporary?
|
177
|
+
end
|
178
|
+
|
179
|
+
def compressed?
|
180
|
+
|
181
|
+
@file_stat.compressed?
|
182
|
+
end
|
183
|
+
|
184
|
+
def encrypted?
|
185
|
+
|
186
|
+
@file_stat.encrypted?
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
# indicates whether the given entry represents a directory
|
191
|
+
def directory?
|
192
|
+
|
193
|
+
@file_stat.directory?
|
194
|
+
end
|
195
|
+
|
196
|
+
# indicates whether the given entry represents a file
|
197
|
+
def file?
|
198
|
+
|
199
|
+
@file_stat.file?
|
200
|
+
end
|
201
|
+
|
202
|
+
# indicates whether the given entry represents a link
|
203
|
+
def link?
|
204
|
+
|
205
|
+
@file_stat.link?
|
206
|
+
end
|
207
|
+
|
208
|
+
# indicates whether the given entry represents a socket
|
209
|
+
def socket?
|
210
|
+
|
211
|
+
@file_stat.socket?
|
212
|
+
end
|
213
|
+
|
214
|
+
# ##########################
|
215
|
+
# Size attributes
|
216
|
+
|
217
|
+
# indicates the size of the given entry
|
218
|
+
def size
|
219
|
+
|
220
|
+
@file_stat.size
|
221
|
+
end
|
222
|
+
|
223
|
+
# ##########################
|
224
|
+
# File-system entry attributes
|
225
|
+
|
226
|
+
# indicates the device of the given entry
|
227
|
+
#
|
228
|
+
# On Windows, this will be 0 if the entry cannot be
|
229
|
+
# opened
|
230
|
+
def dev
|
231
|
+
|
232
|
+
@dev
|
233
|
+
end
|
234
|
+
|
235
|
+
# indicates the ino of the given entry
|
236
|
+
#
|
237
|
+
# On Windows, this will be 0 if the entry cannot be
|
238
|
+
# opened
|
239
|
+
def ino
|
240
|
+
|
241
|
+
@ino
|
242
|
+
end
|
243
|
+
|
244
|
+
# number of links to the given entry
|
245
|
+
#
|
246
|
+
# On Windows, this will be 0 if the entry cannot be
|
247
|
+
# opened
|
248
|
+
def nlink
|
249
|
+
|
250
|
+
@nlink
|
251
|
+
end
|
252
|
+
|
253
|
+
# ##########################
|
254
|
+
# Time attributes
|
255
|
+
|
256
|
+
# indicates the last access time of the entry
|
257
|
+
def last_access_time
|
258
|
+
|
259
|
+
@file_stat.atime
|
260
|
+
end
|
261
|
+
|
262
|
+
# indicates the modification time of the entry
|
263
|
+
def modification_time
|
264
|
+
|
265
|
+
@file_stat.mtime
|
266
|
+
end
|
267
|
+
|
268
|
+
# ##########################
|
269
|
+
# Comparison
|
270
|
+
|
271
|
+
# determines whether rhs is an instance of Entry and
|
272
|
+
# refers to the same path
|
273
|
+
def eql?(rhs)
|
274
|
+
|
275
|
+
case rhs
|
276
|
+
when self.class
|
277
|
+
return compare_path == rhs.compare_path
|
278
|
+
else
|
279
|
+
return false
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
# determines whether rhs refers to the same path
|
284
|
+
def ==(rhs)
|
285
|
+
|
286
|
+
case rhs
|
287
|
+
when String
|
288
|
+
return compare_path == Entry.get_compare_path_(rhs)
|
289
|
+
when self.class
|
290
|
+
return compare_path == rhs.compare_path
|
291
|
+
else
|
292
|
+
return false
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
# compares this instance with rhs
|
297
|
+
def <=>(rhs)
|
298
|
+
|
299
|
+
compare_path <=> rhs.compare_path
|
300
|
+
end
|
301
|
+
|
302
|
+
# the hash
|
303
|
+
def hash
|
304
|
+
|
305
|
+
@hash
|
306
|
+
end
|
307
|
+
|
308
|
+
# ##########################
|
309
|
+
# Conversion
|
310
|
+
|
311
|
+
# represents the entry as a string (in the form of
|
312
|
+
# the full path)
|
313
|
+
def to_s
|
314
|
+
|
315
|
+
path
|
316
|
+
end
|
317
|
+
|
318
|
+
# represents the entry as a string (in the form of
|
319
|
+
# the full path)
|
320
|
+
def to_str
|
321
|
+
|
322
|
+
path
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
# ############################## end of file ############################# #
|
328
|
+
|