recls-ruby 2.9.0 → 2.12.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.
@@ -1,12 +1,12 @@
1
1
  # ######################################################################### #
2
- # File: recls/ximpl/util.rb
2
+ # File: recls/ximpl/util.rb
3
3
  #
4
- # Purpose: Internal implementation constructs for the recls library.
4
+ # Purpose: Internal implementation constructs for the recls library.
5
5
  #
6
- # Created: 24th July 2012
7
- # Updated: 21st Jannuary 2019
6
+ # Created: 24th July 2012
7
+ # Updated: 14th April 2019
8
8
  #
9
- # Author: Matthew Wilson
9
+ # Author: Matthew Wilson
10
10
  #
11
11
  # Copyright (c) 2012-2019, Matthew Wilson and Synesis Software
12
12
  # All rights reserved.
@@ -41,13 +41,19 @@ require 'recls/flags'
41
41
 
42
42
  require 'pathname'
43
43
 
44
- module Recls
44
+ =begin
45
+ =end
46
+
47
+ module Recls # :nodoc:
48
+
49
+ # :stopdoc:
45
50
 
46
- module Ximpl
51
+ module Ximpl # :nodoc: all
47
52
 
48
- module Util
53
+ module Util # :nodoc: all
49
54
 
50
- def self.is_path_name_separator(c)
55
+ # @!visibility private
56
+ def self.is_path_name_separator(c) # :nodoc:
51
57
 
52
58
  return true if ?/ == c
53
59
 
@@ -62,7 +68,9 @@ module Recls
62
68
  # Indicates whether a trailing slash is on the given path
63
69
  #
64
70
  # dependencies: none
65
- def self.has_trailing_slash(p)
71
+ #
72
+ # @!visibility private
73
+ def self.has_trailing_slash(p) # :nodoc:
66
74
 
67
75
  return p if p.nil? or p.empty?
68
76
 
@@ -72,7 +80,9 @@ module Recls
72
80
  # returns the trailing slash, or nil if none present
73
81
  #
74
82
  # dependencies: none
75
- def self.get_trailing_slash(p, args = {})
83
+ #
84
+ # @!visibility private
85
+ def self.get_trailing_slash(p, args = {}) # :nodoc:
76
86
 
77
87
  return nil if p.nil?
78
88
  return nil if p.empty?
@@ -84,7 +94,9 @@ module Recls
84
94
  # present
85
95
  #
86
96
  # dependencies: none
87
- def self.append_trailing_slash(p, slash = nil)
97
+ #
98
+ # @!visibility private
99
+ def self.append_trailing_slash(p, slash = nil) # :nodoc:
88
100
 
89
101
  return p if not p or p.empty?
90
102
 
@@ -99,7 +111,9 @@ module Recls
99
111
  # root
100
112
  #
101
113
  # dependencies: none
102
- def self.trim_trailing_slash(p)
114
+ #
115
+ # @!visibility private
116
+ def self.trim_trailing_slash(p) # :nodoc:
103
117
 
104
118
  return p if not p or p.empty?
105
119
 
@@ -117,7 +131,9 @@ module Recls
117
131
  # [ nil, nil ] if p is nil
118
132
  #
119
133
  # dependencies: none
120
- def self.get_windows_root(p)
134
+ #
135
+ # @!visibility private
136
+ def self.get_windows_root(p) # :nodoc:
121
137
 
122
138
  return [ nil, nil ] if not p
123
139
 
@@ -161,7 +177,9 @@ module Recls
161
177
 
162
178
  # obtains the parts from a path, including any Windows root and
163
179
  # the file basename
164
- def self.path_parts(path)
180
+ #
181
+ # @!visibility private
182
+ def self.path_parts(path) # :nodoc:
165
183
 
166
184
  return nil if path.nil?
167
185
  return [] if path.empty?
@@ -201,7 +219,9 @@ module Recls
201
219
  # f7. array of all path parts, which may be empty (not nil)
202
220
  #
203
221
  # dependencies: Util.path_parts, Util.get_windows_root
204
- def self.split_path(p)
222
+ #
223
+ # @!visibility private
224
+ def self.split_path(p) # :nodoc:
205
225
 
206
226
  f1_windows_root, remainder = self.get_windows_root p
207
227
  f1_windows_root = nil if not f1_windows_root or f1_windows_root.empty?
@@ -267,14 +287,12 @@ module Recls
267
287
  # f2. A boolean indicating whether to 'consume' the basename
268
288
  #
269
289
  # dependencies: OS.is_root_dir_, OS.get_number_of_dots_dir_,
270
- def self.canonicalise_parts(parts, basename = nil)
290
+ #
291
+ # @!visibility private
292
+ def self.canonicalise_parts(parts, basename = nil) # :nodoc:
271
293
 
272
294
  newParts = []
273
295
 
274
- =begin
275
- trailing_slash = parts.empty? ? nil : self.get_trailing_slash(parts[-1])
276
- =end
277
-
278
296
  lastSingleDots = nil
279
297
 
280
298
  path_is_rooted = nil
@@ -423,18 +441,22 @@ module Recls
423
441
 
424
442
  [ newParts.join(''), consume_basename ]
425
443
  end
426
- end
444
+ end # module Util
427
445
 
428
446
  # Canonicalises a path
429
447
  #
430
448
  # Note: contains a trailing slash if, in the context of the given
431
449
  # path, the last element of the canonicalised path is a directory
432
450
  # unequivocally
433
- def self.canonicalise_path(path)
451
+ #
452
+ # @!visibility private
453
+ def self.canonicalise_path(path) # :nodoc:
434
454
 
435
455
  return nil if not path
436
456
  return '' if path.empty?
437
457
 
458
+ path = File.expand_path(path) if '~' == path[0].to_s
459
+
438
460
  f1_windows_root, f2_directory, f3_basename, dummy1, dummy2, directory_parts, dummy3 = Util.split_path(path)
439
461
 
440
462
  # suppress unused warnings
@@ -454,8 +476,44 @@ module Recls
454
476
  return "#{f1_windows_root}#{canonicalised_directory}#{f3_basename}"
455
477
  end
456
478
 
479
+ # @!visibility private
480
+ def self.absolute_path?(path) # :nodoc:
481
+
482
+ case path
483
+ when nil
484
+
485
+ return nil
486
+ when ::String
487
+
488
+ return nil if path.empty?
489
+
490
+ path = File.expand_path(path) if '~' == path[0]
491
+ when ::Recls::Entry
492
+
493
+ return path
494
+ else
495
+
496
+ raise TypeError, "parameter path ('#{path}') is of type #{path.class} must be nil or an instance of #{::String} or #{::Recls::Entry}"
497
+ end
498
+
499
+ f1_windows_root, f2_directory, dummy1, dummy2, dummy3, dummy4, dummy5 = Util.split_path(path)
500
+
501
+ dummy1 = dummy2 = dummy3 = dummy4 = dummy5 = nil
502
+
503
+ unless f1_windows_root
504
+
505
+ return nil unless f2_directory
506
+
507
+ return nil unless Util.is_path_name_separator(f2_directory[0])
508
+ end
509
+
510
+ Recls::Ximpl.stat_prep(path, nil, Recls::DETAILS_LATER)
511
+ end
512
+
457
513
  # determines the absolute path of a given path
458
- def self.absolute_path(path, refdir = nil)
514
+ #
515
+ # @!visibility private
516
+ def self.absolute_path(path, refdir = nil) # :nodoc:
459
517
 
460
518
  case path
461
519
  when ::NilClass
@@ -463,7 +521,10 @@ module Recls
463
521
  return nil
464
522
  when ::String
465
523
 
466
- path = path.to_s
524
+ path = File.expand_path(path) if '~' == path[0]
525
+ when ::Recls::Entry
526
+
527
+ return path.path
467
528
  else
468
529
 
469
530
  raise TypeError, "parameter path ('#{path}') is of type #{path.class} must be an instance of #{::String} or Recls::Entry"
@@ -523,7 +584,8 @@ module Recls
523
584
  # is
524
585
  # ghi.jkl
525
586
  #
526
- def self.basename(path)
587
+ # @!visibility private
588
+ def self.basename(path) # :nodoc:
527
589
 
528
590
  return nil if not path
529
591
 
@@ -566,7 +628,9 @@ module Recls
566
628
  # ghi.jkl
567
629
  # is
568
630
  # .jkl
569
- def self.file_ext(path)
631
+ #
632
+ # @!visibility private
633
+ def self.file_ext(path) # :nodoc:
570
634
 
571
635
  return nil if not path
572
636
 
@@ -604,7 +668,8 @@ module Recls
604
668
 
605
669
  # obtains the directory from the directory path
606
670
  #
607
- def self.directory_from_directory_path(directory_path)
671
+ # @!visibility private
672
+ def self.directory_from_directory_path(directory_path) # :nodoc:
608
673
 
609
674
  wr, rem = Util.get_windows_root(directory_path)
610
675
 
@@ -615,7 +680,9 @@ module Recls
615
680
  end
616
681
 
617
682
  # obtains the directory parts from a directory
618
- def self.directory_parts_from_directory(directory)
683
+ #
684
+ # @!visibility private
685
+ def self.directory_parts_from_directory(directory) # :nodoc:
619
686
 
620
687
  return nil if not directory
621
688
 
@@ -639,7 +706,9 @@ module Recls
639
706
 
640
707
  # obtains the relative path of a given path and
641
708
  # a reference directory
642
- def self.derive_relative_path(origin, path)
709
+ #
710
+ # @!visibility private
711
+ def self.derive_relative_path(origin, path) # :nodoc:
643
712
 
644
713
  return nil if path.nil?
645
714
  return nil if path.empty?
@@ -649,10 +718,16 @@ module Recls
649
718
  path = self.canonicalise_path path
650
719
  origin = self.canonicalise_path origin
651
720
 
721
+ path = self.absolute_path path
722
+ origin = self.absolute_path origin
723
+
724
+ return path if /^\.[\\\/]*$/ =~ origin
725
+
652
726
  path_splits = Util.split_path(path)
653
727
  origin_splits = Util.split_path(origin)
654
728
 
655
729
  # if different windows root, then cannot provide relative
730
+
656
731
  if path_splits[0] and origin_splits[0]
657
732
 
658
733
  return path if path_splits[0] != origin_splits[0]
@@ -663,7 +738,7 @@ module Recls
663
738
  path_parts = path_splits[6]
664
739
  origin_parts = origin_splits[6]
665
740
 
666
- while true
741
+ loop do
667
742
 
668
743
  break if path_parts.empty?
669
744
  break if origin_parts.empty?
@@ -696,12 +771,14 @@ module Recls
696
771
  return '../' * origin_parts.size + path_parts.join('')
697
772
  end
698
773
 
699
-
700
- def self.combine_paths(paths, options)
774
+ # @!visibility private
775
+ def self.combine_paths(paths, options) # :nodoc:
701
776
 
702
777
  paths = [ paths ] unless ::Array === paths
703
778
  abs_ix = 0
704
779
 
780
+ paths = paths.map { |path| '~' == path[0].to_s ? File.expand_path(path) : path }
781
+
705
782
  paths.each_with_index do |path, index|
706
783
 
707
784
  dummy1, f2_directory, dummy2, dummy3, dummy4, dummy5, dummy6 = Util.split_path(path)
@@ -752,7 +829,8 @@ module Recls
752
829
  # * (Mac OSX) /dev/fd/<N> - some of these stat() as directories but
753
830
  # Dir.new fails with ENOTDIR
754
831
  #
755
- def self.dir_entries_maybe(dir, flags)
832
+ # @!visibility private
833
+ def self.dir_entries_maybe(dir, flags) # :nodoc:
756
834
 
757
835
  begin
758
836
 
@@ -770,8 +848,31 @@ module Recls
770
848
  return []
771
849
  end
772
850
  end
773
- end
774
- end
851
+
852
+ # @!visibility private
853
+ def self.stat_prep(path, search_root, flags) # :nodoc:
854
+
855
+ begin
856
+
857
+ Recls::Entry.new(path, Recls::Ximpl::FileStat.stat(path), search_root, flags)
858
+ rescue Errno::ENOENT, Errno::ENXIO => x
859
+
860
+ x = x # suppress warning
861
+
862
+ if 0 != (flags & Recls::DETAILS_LATER)
863
+
864
+ Recls::Entry.new(path, nil, search_root, flags)
865
+ else
866
+
867
+ nil
868
+ end
869
+ end
870
+ end
871
+ end # module Ximpl
872
+
873
+ # :startdoc:
874
+
875
+ end # module Recls
775
876
 
776
877
  # ############################## end of file ############################# #
777
878
 
@@ -1,14 +1,14 @@
1
1
  # ######################################################################### #
2
- # File: recls/ximpl/windows.rb
2
+ # File: recls/ximpl/windows.rb
3
3
  #
4
- # Purpose: Windows-specific constructs for the recls library.
4
+ # Purpose: Windows-specific constructs for the recls library.
5
5
  #
6
- # Created: 19th February 2014
7
- # Updated: 18th June 2016
6
+ # Created: 19th February 2014
7
+ # Updated: 14th April 2019
8
8
  #
9
- # Author: Matthew Wilson
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,11 +38,17 @@
38
38
 
39
39
  require 'Win32API'
40
40
 
41
- module Recls
41
+ =begin
42
+ =end
42
43
 
43
- module Ximpl
44
+ module Recls # :nodoc:
44
45
 
45
- class FileStat < File::Stat
46
+ # :stopdoc:
47
+
48
+ module Ximpl # :nodoc: all
49
+
50
+ # @!visibility private
51
+ class FileStat < File::Stat # :nodoc:
46
52
 
47
53
  private
48
54
  GetFileAttributes = Win32API.new('kernel32', 'GetFileAttributes', [ 'P' ], 'I')
@@ -70,9 +76,11 @@ module Recls
70
76
 
71
77
  BHFI_pack_string = 'LQQQLLLLLL'
72
78
 
73
- class ByHandleInformation
79
+ # @!visibility private
80
+ class ByHandleInformation # :nodoc:
74
81
 
75
- def initialize(path)
82
+ # @!visibility private
83
+ def initialize(path) # :nodoc:
76
84
 
77
85
  @volume_id = 0
78
86
  @file_index = 0
@@ -101,19 +109,24 @@ module Recls
101
109
  end
102
110
  end
103
111
 
112
+ # @!visibility private
104
113
  attr_reader :volume_id
114
+ # @!visibility private
105
115
  attr_reader :file_index
116
+ # @!visibility private
106
117
  attr_reader :num_links
107
118
  end
108
119
 
109
120
  private
110
- def has_attribute_? (attr)
121
+ # @!visibility private
122
+ def has_attribute_? (attr) # :nodoc:
111
123
 
112
124
  0 != (attr & @attributes)
113
125
  end
114
126
 
115
127
  private
116
- def initialize(path)
128
+ # @!visibility private
129
+ def initialize(path) # :nodoc:
117
130
 
118
131
  @path = path
119
132
 
@@ -121,8 +134,10 @@ module Recls
121
134
  attributes = GetFileAttributes.call("#{path}")
122
135
 
123
136
  if 0xffffffff == attributes
137
+
124
138
  @attributes = 0
125
139
  else
140
+
126
141
  @attributes = attributes
127
142
  end
128
143
 
@@ -137,62 +152,78 @@ module Recls
137
152
  end
138
153
 
139
154
  public
155
+ # @!visibility private
140
156
  attr_reader :attributes
157
+ # @!visibility private
141
158
  attr_reader :path
159
+ # @!visibility private
142
160
  attr_reader :by_handle_information
161
+ # @!visibility private
143
162
  attr_reader :short_path
144
163
 
145
- def hidden?
164
+ # @!visibility private
165
+ def hidden? # :nodoc:
146
166
 
147
167
  0 != (FILE_ATTRIBUTE_HIDDEN & @attributes)
148
168
  end
149
169
 
150
170
  # Windows-specific attributes
151
171
 
152
- def system?
172
+ # @!visibility private
173
+ def system? # :nodoc:
153
174
 
154
175
  has_attribute_? FILE_ATTRIBUTE_SYSTEM
155
176
  end
156
177
 
157
- def archive?
178
+ # @!visibility private
179
+ def archive? # :nodoc:
158
180
 
159
181
  has_attribute_? FILE_ATTRIBUTE_ARCHIVE
160
182
  end
161
183
 
162
- def device?
184
+ # @!visibility private
185
+ def device? # :nodoc:
163
186
 
164
187
  has_attribute_? FILE_ATTRIBUTE_DEVICE
165
188
  end
166
189
 
167
- def normal?
190
+ # @!visibility private
191
+ def normal? # :nodoc:
168
192
 
169
193
  has_attribute_? FILE_ATTRIBUTE_NORMAL
170
194
  end
171
195
 
172
- def temporary?
196
+ # @!visibility private
197
+ def temporary? # :nodoc:
173
198
 
174
199
  has_attribute_? FILE_ATTRIBUTE_TEMPORARY
175
200
  end
176
201
 
177
- def compressed?
202
+ # @!visibility private
203
+ def compressed? # :nodoc:
178
204
 
179
205
  has_attribute_? FILE_ATTRIBUTE_COMPRESSED
180
206
  end
181
207
 
182
- def encrypted?
208
+ # @!visibility private
209
+ def encrypted? # :nodoc:
183
210
 
184
211
  has_attribute_? FILE_ATTRIBUTE_ENCRYPTED
185
212
  end
186
213
 
187
214
 
188
215
  public
189
- def FileStat.stat(path)
216
+ # @!visibility private
217
+ def FileStat.stat(path) # :nodoc:
190
218
 
191
219
  Recls::Ximpl::FileStat.new(path)
192
220
  end
193
- end
194
- end
195
- end
221
+ end # class FileStat
222
+ end # module Ximpl
223
+
224
+ # :startdoc:
225
+
226
+ end # module Recls
196
227
 
197
228
  # ############################## end of file ############################# #
198
229