fakefs 0.16.0 → 0.17.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.
- checksums.yaml +4 -4
- data/lib/fakefs/dir.rb +1 -1
- data/lib/fakefs/file.rb +61 -7
- data/lib/fakefs/file_system.rb +6 -5
- data/lib/fakefs/globber.rb +7 -1
- data/lib/fakefs/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2615742cb54b7cea91ad40e51e1b1baf037ea9295eff338b0432fc20f1ea9483
|
4
|
+
data.tar.gz: e9e136d1eb2d10a18b0470ed45c8058b88656af040d45136f78a53fb21bf42c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 790f25734bd4b9bf2c4b82750421bbe40114a591efa327b909b61e0ef341360f5bdbde7c5d99c06a3931f46d655710f1fc7c302a24b67590cb849e506e750450
|
7
|
+
data.tar.gz: 73578d236fa95d8307311c87c9fba693c101295bdc915b2bc6adda0c074e9ea5eb782121af5cc3c3446cf8292d57a6ed8dd5c6979a4cdee9be2fb11053c4b65c
|
data/lib/fakefs/dir.rb
CHANGED
@@ -119,7 +119,7 @@ module FakeFS
|
|
119
119
|
|
120
120
|
def self.glob(pattern, flags = 0, &block)
|
121
121
|
matches_for_pattern = lambda do |matcher|
|
122
|
-
[FileSystem.find(matcher, flags) || []].flatten.map do |e|
|
122
|
+
[FileSystem.find(matcher, flags, true) || []].flatten.map do |e|
|
123
123
|
if Dir.pwd.match(%r{\A/?\z}) ||
|
124
124
|
!e.to_s.match(%r{\A#{Dir.pwd}/?})
|
125
125
|
e.to_s
|
data/lib/fakefs/file.rb
CHANGED
@@ -53,16 +53,20 @@ module FakeFS
|
|
53
53
|
class << self
|
54
54
|
alias exists? exist?
|
55
55
|
|
56
|
-
# Assuming that everyone can read and write files
|
57
|
-
alias readable? exist?
|
58
|
-
alias writable? exist?
|
59
|
-
|
60
56
|
# Assume nothing is sticky.
|
61
57
|
def sticky?(_path)
|
62
58
|
false
|
63
59
|
end
|
64
60
|
end
|
65
61
|
|
62
|
+
def self.readable?(path)
|
63
|
+
File.lstat(path).readable?
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.writable?(path)
|
67
|
+
File.lstat(path).writable?
|
68
|
+
end
|
69
|
+
|
66
70
|
def self.mtime(path)
|
67
71
|
if exists?(path)
|
68
72
|
FileSystem.find(path).mtime
|
@@ -363,13 +367,28 @@ module FakeFS
|
|
363
367
|
'file'
|
364
368
|
end
|
365
369
|
|
366
|
-
# assumes, like above, that all files are readable and writable.
|
367
370
|
def readable?
|
368
|
-
|
371
|
+
# a file is readable if, and only if, it has the following bits:
|
372
|
+
# 4 ( read permission )
|
373
|
+
# 5 ( read + execute permission )
|
374
|
+
# 6 ( read + write permission )
|
375
|
+
# 7 ( read + write + execute permission )
|
376
|
+
# for each group we will isolate the wanted numbers ( for owner, world, or group )
|
377
|
+
# and see if the third bit is set ( as that is the bit for read )
|
378
|
+
read_bit = 4
|
379
|
+
check_if_bit_set(read_bit)
|
369
380
|
end
|
370
381
|
|
371
382
|
def writable?
|
372
|
-
|
383
|
+
# a file is writable if, and only if, it has the following bits:
|
384
|
+
# 2 ( write permission )
|
385
|
+
# 3 ( write + execute permission )
|
386
|
+
# 6 ( read + write permission )
|
387
|
+
# 7 ( read + write + execute permission )
|
388
|
+
# for each group we will isolate the wanted numbers ( for owner, world, or group )
|
389
|
+
# and see if the second bit is set ( as that is the bit for write )
|
390
|
+
write_bit = 2
|
391
|
+
check_if_bit_set(write_bit)
|
373
392
|
end
|
374
393
|
|
375
394
|
# Assume nothing is sticky.
|
@@ -412,6 +431,41 @@ module FakeFS
|
|
412
431
|
def <=>(other)
|
413
432
|
@mtime <=> other.mtime
|
414
433
|
end
|
434
|
+
|
435
|
+
private
|
436
|
+
|
437
|
+
def check_if_bit_set(bit)
|
438
|
+
# get user's group and user ids
|
439
|
+
# NOTE: I am picking `Process` over `Etc` as we use `Process`
|
440
|
+
# when instaniating file classes. It may be worth it to ensure
|
441
|
+
# our Process/Group detection scheme is robust in all cases
|
442
|
+
uid = Process.uid
|
443
|
+
gid = Process.gid
|
444
|
+
|
445
|
+
# check if bit set for owner
|
446
|
+
owner_bits = (@mode >> 6) & 0o7
|
447
|
+
if uid == @uid
|
448
|
+
# the user is locked out of the file if they are owner of the file
|
449
|
+
# but do not have the bit set at the user level
|
450
|
+
return true if owner_bits & bit == bit
|
451
|
+
return false
|
452
|
+
end
|
453
|
+
|
454
|
+
# check if bit set for group
|
455
|
+
group_bits = (@mode >> 3) & 0o7
|
456
|
+
if gid == @gid
|
457
|
+
# the user is locked out of the file if they are in the group that
|
458
|
+
# owns the file but do not have the bit set at the group level
|
459
|
+
return true if group_bits & bit == bit
|
460
|
+
return false
|
461
|
+
end
|
462
|
+
|
463
|
+
# check if bit set for world
|
464
|
+
world_bits = @mode & 0o7
|
465
|
+
return true if world_bits & bit == bit
|
466
|
+
|
467
|
+
false
|
468
|
+
end
|
415
469
|
end
|
416
470
|
|
417
471
|
attr_reader :path
|
data/lib/fakefs/file_system.rb
CHANGED
@@ -20,13 +20,13 @@ module FakeFS
|
|
20
20
|
fs.entries
|
21
21
|
end
|
22
22
|
|
23
|
-
def find(path, find_flags = 0)
|
23
|
+
def find(path, find_flags = 0, gave_char_class = false)
|
24
24
|
parts = path_parts(normalize_path(path))
|
25
25
|
return fs if parts.empty? # '/'
|
26
26
|
|
27
27
|
entries = Globber.expand(path).flat_map do |pattern|
|
28
28
|
parts = path_parts(normalize_path(pattern))
|
29
|
-
find_recurser(fs, parts, find_flags).flatten
|
29
|
+
find_recurser(fs, parts, find_flags, gave_char_class).flatten
|
30
30
|
end
|
31
31
|
|
32
32
|
case entries.length
|
@@ -88,6 +88,7 @@ module FakeFS
|
|
88
88
|
dir_levels.push dir if blk
|
89
89
|
|
90
90
|
raise Errno::ENOENT, dir unless new_dir
|
91
|
+
raise Errno::ENOTDIR, dir unless File.directory? new_dir
|
91
92
|
|
92
93
|
dir_levels.push dir unless blk
|
93
94
|
yield(dir) if blk
|
@@ -116,7 +117,7 @@ module FakeFS
|
|
116
117
|
|
117
118
|
private
|
118
119
|
|
119
|
-
def find_recurser(dir, parts, find_flags = 0)
|
120
|
+
def find_recurser(dir, parts, find_flags = 0, gave_char_class = false)
|
120
121
|
return [] unless dir.respond_to? :[]
|
121
122
|
pattern, *parts = parts
|
122
123
|
matches =
|
@@ -139,14 +140,14 @@ module FakeFS
|
|
139
140
|
end
|
140
141
|
else
|
141
142
|
Globber.expand(pattern).flat_map do |subpattern|
|
142
|
-
dir.matches(Globber.regexp(subpattern, find_flags))
|
143
|
+
dir.matches(Globber.regexp(subpattern, find_flags, gave_char_class))
|
143
144
|
end
|
144
145
|
end
|
145
146
|
|
146
147
|
if parts.empty? # we're done recursing
|
147
148
|
matches
|
148
149
|
else
|
149
|
-
matches.map { |entry| find_recurser(entry, parts, find_flags) }
|
150
|
+
matches.map { |entry| find_recurser(entry, parts, find_flags, gave_char_class) }
|
150
151
|
end
|
151
152
|
end
|
152
153
|
|
data/lib/fakefs/globber.rb
CHANGED
@@ -60,7 +60,7 @@ module FakeFS
|
|
60
60
|
drop_root(result).reject(&:empty?)
|
61
61
|
end
|
62
62
|
|
63
|
-
def regexp(pattern, find_flags = 0)
|
63
|
+
def regexp(pattern, find_flags = 0, gave_char_class = false)
|
64
64
|
pattern = pattern.to_s
|
65
65
|
|
66
66
|
regex_body =
|
@@ -73,6 +73,12 @@ module FakeFS
|
|
73
73
|
.gsub(')', '\)')
|
74
74
|
.gsub('$', '\$')
|
75
75
|
|
76
|
+
# unless we're expecting character class contructs in regexes, escape all brackets
|
77
|
+
# since if we're expecting them, the string should already be properly escaped
|
78
|
+
unless gave_char_class
|
79
|
+
regex_body = regex_body.gsub('[', '\[').gsub(']', '\]')
|
80
|
+
end
|
81
|
+
|
76
82
|
# This matches nested braces and attempts to do something correct most of the time
|
77
83
|
# There are known issues (i.e. {,*,*/*}) that cannot be resolved with out a total
|
78
84
|
# refactoring
|
data/lib/fakefs/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fakefs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Wanstrath
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2018-07-
|
15
|
+
date: 2018-07-16 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: bump
|