fakefs 0.17.0 → 0.18.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/file.rb +92 -4
- 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: 9479bf3a7bc17238053ebfe0489449a54eaf93975c253873caa817cb608a6e12
|
4
|
+
data.tar.gz: e0071c3db4a4b16278a995b0f1ecce76a6781ce23847ef67194a0edb2f2999e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03be56fc4d1a9f05d410e75f2292cb498c0522f9a40508a28763ec757a5b6bf011be8c1462b52292987ea5f594ed54f04f64e1a4baefac2768c4db318ae5f389
|
7
|
+
data.tar.gz: 7fdd408a1814b6629271d4de1c9610c77836e9d1d8a3dfec8c7c4667bfa4d5fd02e5ed5b85aa111de3e5d5a84808c97b8ced730d2c4cbbad995cb87b703b3014
|
data/lib/fakefs/file.rb
CHANGED
@@ -60,10 +60,12 @@ module FakeFS
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def self.readable?(path)
|
63
|
+
return false unless exist? path
|
63
64
|
File.lstat(path).readable?
|
64
65
|
end
|
65
66
|
|
66
67
|
def self.writable?(path)
|
68
|
+
return false unless exist? path
|
67
69
|
File.lstat(path).writable?
|
68
70
|
end
|
69
71
|
|
@@ -281,8 +283,15 @@ module FakeFS
|
|
281
283
|
RealFile.split(path)
|
282
284
|
end
|
283
285
|
|
284
|
-
def self.chmod(
|
285
|
-
|
286
|
+
def self.chmod(mode, filename)
|
287
|
+
# chmod's mode can either be passed in in absolute mode, or symbolic mode
|
288
|
+
# for reference: https://ruby-doc.org/stdlib-2.2.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-chmod
|
289
|
+
# if the mode is passed in symbolic mode we must convert it to absolute mode
|
290
|
+
is_absolute_mode = mode.is_a? Numeric
|
291
|
+
unless is_absolute_mode
|
292
|
+
mode = convert_symbolic_chmod_to_absolute mode
|
293
|
+
end
|
294
|
+
FileSystem.find(filename).mode = 0o100000 + mode
|
286
295
|
end
|
287
296
|
|
288
297
|
# Not exactly right, returns true if the file is chmod +x for owner. In the
|
@@ -567,8 +576,15 @@ module FakeFS
|
|
567
576
|
self.class.mtime(@path)
|
568
577
|
end
|
569
578
|
|
570
|
-
def chmod(
|
571
|
-
|
579
|
+
def chmod(mode)
|
580
|
+
# chmod's mode can either be passed in in absolute mode, or symbolic mode
|
581
|
+
# for reference: https://ruby-doc.org/stdlib-2.2.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-chmod
|
582
|
+
# if the mode is passed in symbolic mode we must convert it to absolute mode
|
583
|
+
is_absolute_mode = mode.is_a? Numeric
|
584
|
+
unless is_absolute_mode
|
585
|
+
mode = convert_symbolic_chmod_to_absolute mode
|
586
|
+
end
|
587
|
+
@file.mode = 0o100000 + mode
|
572
588
|
end
|
573
589
|
|
574
590
|
def chown(owner_int, group_int)
|
@@ -672,6 +688,78 @@ module FakeFS
|
|
672
688
|
read_buf
|
673
689
|
end
|
674
690
|
|
691
|
+
def self.convert_symbolic_chmod_to_absolute(mode)
|
692
|
+
# mode always must be of form <GROUP1>=<FLAGS>,<GROUP2>=<FLAGS,...
|
693
|
+
# e.g.: u=wr,go=x
|
694
|
+
chmod_pairs = mode.split(',')
|
695
|
+
|
696
|
+
# - duplicating groups is OK ( e.g.: 'ugouuoouu' is valid and is interpretted as 'ugo' )
|
697
|
+
# - duplicating modes is OK ( e.g.: 'wwwwwwwww' is interpreted as 'w' )
|
698
|
+
# - omitting the right hand side is interpretted as removing all permission
|
699
|
+
# ( e.g.: 'ugo=' is really 'chmod 000' )
|
700
|
+
# - omitting the left hand side is interpretted as all groups ( e.g.: '=rwx' is really 'ugo=rwx' )
|
701
|
+
# - if we list a group more than once, we only apply the rightmost permissions
|
702
|
+
# ( e.g.: 'ug=rx,g=x' is really 'u=r,g=x' )
|
703
|
+
# - we cannot list any flags that are not 'rwx' ( e.g.: converting 'ug=rwx' to 'ug=7' is invalid )
|
704
|
+
# or else an error is raised
|
705
|
+
# - in the example above, the following error is raised: 'invalid `perm' symbol in file mode: 7 (ArgumentError)'
|
706
|
+
# - we cannot put in any groups that are not 'ugo' ( e.g.: listing groups as 'uzg=x' is invalid )
|
707
|
+
# or else an error is raised
|
708
|
+
# - in the example above, the following error is raised: 'invalid `who' symbol in file mode: z (ArgumentError)'
|
709
|
+
valid_groups_to_numeric_vals = { 'u' => 0o100, 'g' => 0o10, 'o' => 0o1 }
|
710
|
+
current_groups_to_vals = { 0o100 => 0o0, 0o10 => 0o0, 0o1 => 0o0 }
|
711
|
+
valid_modes_to_numeric_vals = { 'r' => 0o4, 'w' => 0o2, 'x' => 0o1 }
|
712
|
+
chmod_pairs.each do |pair|
|
713
|
+
groups = pair.rpartition('=').first
|
714
|
+
modes = pair.rpartition('=').last
|
715
|
+
|
716
|
+
# if we give no modes, then we are removing all permission
|
717
|
+
chmod_perm_num = 0o0
|
718
|
+
if modes != ''
|
719
|
+
# make sure there are no invalid flags in the modes
|
720
|
+
# and that we discard duplicates as chmod does
|
721
|
+
given_modes = modes.split('')
|
722
|
+
given_modes = given_modes.uniq
|
723
|
+
given_modes.each do |specific_mode|
|
724
|
+
# ensure that the mode is valid
|
725
|
+
unless valid_modes_to_numeric_vals.key? specific_mode
|
726
|
+
raise ArgumentError, "Invalid `perm' symbol in file mode: #{specific_mode}"
|
727
|
+
end
|
728
|
+
|
729
|
+
chmod_addend = valid_modes_to_numeric_vals[specific_mode]
|
730
|
+
chmod_perm_num += chmod_addend
|
731
|
+
end
|
732
|
+
end
|
733
|
+
|
734
|
+
# if we give no groups, then we are giving all groups
|
735
|
+
if groups == ''
|
736
|
+
current_groups_to_vals[0o100] = chmod_perm_num
|
737
|
+
current_groups_to_vals[0o10] = chmod_perm_num
|
738
|
+
current_groups_to_vals[0o1] = chmod_perm_num
|
739
|
+
else
|
740
|
+
# make sure there are no invalid flags in the groups
|
741
|
+
# and that we discard duplicates as chmod does
|
742
|
+
given_groups = groups.split('')
|
743
|
+
given_groups = given_groups.uniq
|
744
|
+
given_groups.each do |specific_group|
|
745
|
+
# ensure that the group is valid
|
746
|
+
unless valid_groups_to_numeric_vals.key? specific_group
|
747
|
+
raise ArgumentError, "Invalid `who' symbol in file mode: #{specific_group}"
|
748
|
+
end
|
749
|
+
|
750
|
+
# take the current chmod amt from earlier and assosciate that as the current chmod factor for the group
|
751
|
+
group_num = valid_groups_to_numeric_vals[specific_group]
|
752
|
+
current_groups_to_vals[group_num] = chmod_perm_num
|
753
|
+
end
|
754
|
+
end
|
755
|
+
end
|
756
|
+
|
757
|
+
# return an octal chmod value for the value
|
758
|
+
0o100 * current_groups_to_vals[0o100] + 0o10 * current_groups_to_vals[0o10] + current_groups_to_vals[0o1]
|
759
|
+
end
|
760
|
+
|
761
|
+
private_class_method :convert_symbolic_chmod_to_absolute
|
762
|
+
|
675
763
|
private
|
676
764
|
|
677
765
|
def check_modes!
|
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.18.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-23 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: bump
|