fakefs 0.18.0 → 0.18.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fakefs/file.rb +120 -37
- data/lib/fakefs/pathname.rb +2 -2
- data/lib/fakefs/version.rb +1 -1
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b8f0d4485537e8357f305f9d095421de79719f65ada17d30c21443d8f331649
|
4
|
+
data.tar.gz: f2cc6f45b43483d18552d92aa2fcc39e8112bb0a0ed5ce17ed05c8ae92410903
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fadd520bccc2df062eec7b09324c2d80e3df433d74a969b965dc362e2e7b853ee4f5975688b8eceb325ed4170b580583bebfa34a43e3a8a7d77ca7376f4cc52
|
7
|
+
data.tar.gz: 7646dfab7046723fae643785d606ef9a2ab366231780aa63d4e6bce2a20c38688332688f4890573a51df5641dbeade4c6f5a73da38aac9571e9d9b2df92a500e
|
data/lib/fakefs/file.rb
CHANGED
@@ -283,15 +283,16 @@ module FakeFS
|
|
283
283
|
RealFile.split(path)
|
284
284
|
end
|
285
285
|
|
286
|
-
def self.chmod(
|
286
|
+
def self.chmod(new_mode, filename)
|
287
287
|
# chmod's mode can either be passed in in absolute mode, or symbolic mode
|
288
288
|
# for reference: https://ruby-doc.org/stdlib-2.2.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-chmod
|
289
289
|
# if the mode is passed in symbolic mode we must convert it to absolute mode
|
290
|
-
is_absolute_mode =
|
290
|
+
is_absolute_mode = new_mode.is_a? Numeric
|
291
291
|
unless is_absolute_mode
|
292
|
-
|
292
|
+
current_mode = FileSystem.find(filename).mode
|
293
|
+
new_mode = convert_symbolic_chmod_to_absolute(new_mode, current_mode)
|
293
294
|
end
|
294
|
-
FileSystem.find(filename).mode = 0o100000 +
|
295
|
+
FileSystem.find(filename).mode = 0o100000 + new_mode
|
295
296
|
end
|
296
297
|
|
297
298
|
# Not exactly right, returns true if the file is chmod +x for owner. In the
|
@@ -576,15 +577,16 @@ module FakeFS
|
|
576
577
|
self.class.mtime(@path)
|
577
578
|
end
|
578
579
|
|
579
|
-
def chmod(
|
580
|
+
def chmod(new_mode)
|
580
581
|
# chmod's mode can either be passed in in absolute mode, or symbolic mode
|
581
582
|
# for reference: https://ruby-doc.org/stdlib-2.2.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-chmod
|
582
583
|
# if the mode is passed in symbolic mode we must convert it to absolute mode
|
583
|
-
is_absolute_mode =
|
584
|
+
is_absolute_mode = new_mode.is_a? Numeric
|
584
585
|
unless is_absolute_mode
|
585
|
-
|
586
|
+
current_mode = @file.mode
|
587
|
+
new_mode = convert_symbolic_chmod_to_absolute(new_mode, current_mode)
|
586
588
|
end
|
587
|
-
@file.mode = 0o100000 +
|
589
|
+
@file.mode = 0o100000 + new_mode
|
588
590
|
end
|
589
591
|
|
590
592
|
def chown(owner_int, group_int)
|
@@ -688,10 +690,10 @@ module FakeFS
|
|
688
690
|
read_buf
|
689
691
|
end
|
690
692
|
|
691
|
-
def self.convert_symbolic_chmod_to_absolute(
|
693
|
+
def self.convert_symbolic_chmod_to_absolute(new_mode, current_mode)
|
692
694
|
# mode always must be of form <GROUP1>=<FLAGS>,<GROUP2>=<FLAGS,...
|
693
695
|
# e.g.: u=wr,go=x
|
694
|
-
chmod_pairs =
|
696
|
+
chmod_pairs = new_mode.split(',')
|
695
697
|
|
696
698
|
# - duplicating groups is OK ( e.g.: 'ugouuoouu' is valid and is interpretted as 'ugo' )
|
697
699
|
# - duplicating modes is OK ( e.g.: 'wwwwwwwww' is interpreted as 'w' )
|
@@ -707,38 +709,56 @@ module FakeFS
|
|
707
709
|
# or else an error is raised
|
708
710
|
# - in the example above, the following error is raised: 'invalid `who' symbol in file mode: z (ArgumentError)'
|
709
711
|
valid_groups_to_numeric_vals = { 'u' => 0o100, 'g' => 0o10, 'o' => 0o1 }
|
712
|
+
|
713
|
+
# make sure we preload the current group values.
|
714
|
+
# chmod works by calculating new permissions based off of existing permissions
|
710
715
|
current_groups_to_vals = { 0o100 => 0o0, 0o10 => 0o0, 0o1 => 0o0 }
|
711
|
-
|
716
|
+
[0o100, 0o10, 0o1].each do |group_num|
|
717
|
+
perm_amt = get_perms_for_group(current_mode, group_num)
|
718
|
+
current_groups_to_vals[group_num] = perm_amt
|
719
|
+
end
|
720
|
+
|
712
721
|
chmod_pairs.each do |pair|
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
raise ArgumentError, "Invalid `perm' symbol in file mode: #{specific_mode}"
|
727
|
-
end
|
722
|
+
# see if we are dealing with +/- ( granting or removing permissions ) or = ( assigning permissions )
|
723
|
+
# note that it IS valid to mix assignment and granting/revoking perissions ( things like u=wrx,g+x are valid )
|
724
|
+
assign_perms = '='
|
725
|
+
remove_perms = '-'
|
726
|
+
add_perms = '+'
|
727
|
+
assignment_mode = nil
|
728
|
+
if pair.include? remove_perms
|
729
|
+
assignment_mode = remove_perms
|
730
|
+
elsif pair.include? add_perms
|
731
|
+
assignment_mode = add_perms
|
732
|
+
elsif pair.include? assign_perms
|
733
|
+
assignment_mode = assign_perms
|
734
|
+
end
|
728
735
|
|
729
|
-
|
730
|
-
|
731
|
-
|
736
|
+
# if we can't find a mode, then raise an exception as real `chmod` would
|
737
|
+
if assignment_mode.nil?
|
738
|
+
raise ArgumentError, "Invalid file mode: #{mode}"
|
732
739
|
end
|
740
|
+
adding_removing_perms = [add_perms, remove_perms].include?(assignment_mode)
|
741
|
+
|
742
|
+
groups = pair.rpartition(assignment_mode).first
|
743
|
+
modes = pair.rpartition(assignment_mode).last
|
744
|
+
|
745
|
+
# get the numeric chmod value associated with the symbolic entry
|
746
|
+
chmod_perm_num = calculate_chmod_amt_for_mode modes
|
733
747
|
|
734
748
|
# if we give no groups, then we are giving all groups
|
735
749
|
if groups == ''
|
736
|
-
|
737
|
-
|
738
|
-
|
750
|
+
if adding_removing_perms
|
751
|
+
[0o100, 0o10, 0o1].each do |group_num|
|
752
|
+
perm_amt = set_perms_for_group(current_groups_to_vals, group_num, assignment_mode, chmod_perm_num)
|
753
|
+
current_groups_to_vals[group_num] = perm_amt
|
754
|
+
end
|
755
|
+
else
|
756
|
+
[0o100, 0o10, 0o1].each do |group_num|
|
757
|
+
current_groups_to_vals[group_num] = chmod_perm_num
|
758
|
+
end
|
759
|
+
end
|
739
760
|
else
|
740
|
-
# make sure there are no invalid flags in the groups
|
741
|
-
# and that we discard duplicates as chmod does
|
761
|
+
# make sure there are no invalid flags in the groups and that we discard duplicates as chmod does
|
742
762
|
given_groups = groups.split('')
|
743
763
|
given_groups = given_groups.uniq
|
744
764
|
given_groups.each do |specific_group|
|
@@ -747,9 +767,15 @@ module FakeFS
|
|
747
767
|
raise ArgumentError, "Invalid `who' symbol in file mode: #{specific_group}"
|
748
768
|
end
|
749
769
|
|
750
|
-
# take the current chmod amt from earlier and
|
770
|
+
# take the current chmod amt from earlier and associate that as the current chmod factor for the group
|
771
|
+
# if we are adding or removing groups ( via +/- ) then we must make sure that we adjust
|
772
|
+
# the current chmod perm number for the group
|
751
773
|
group_num = valid_groups_to_numeric_vals[specific_group]
|
752
|
-
|
774
|
+
adjusted_chmod = chmod_perm_num
|
775
|
+
if adding_removing_perms
|
776
|
+
adjusted_chmod = set_perms_for_group(current_groups_to_vals, group_num, assignment_mode, chmod_perm_num)
|
777
|
+
end
|
778
|
+
current_groups_to_vals[group_num] = adjusted_chmod
|
753
779
|
end
|
754
780
|
end
|
755
781
|
end
|
@@ -758,7 +784,64 @@ module FakeFS
|
|
758
784
|
0o100 * current_groups_to_vals[0o100] + 0o10 * current_groups_to_vals[0o10] + current_groups_to_vals[0o1]
|
759
785
|
end
|
760
786
|
|
761
|
-
|
787
|
+
# return the group mode for group num based off the provided current_file_mode
|
788
|
+
def self.get_perms_for_group(current_file_mode, group_num)
|
789
|
+
# get the current recorded mode of the group and return it to the caller
|
790
|
+
# note we don't shift for 'o' since that is the bottom 3 bits
|
791
|
+
# note we multiply by 7 since the group num is 1, and octal represents digits 1-7 and we want all 3 bits
|
792
|
+
current_group_mode = current_file_mode & (group_num * 7)
|
793
|
+
if group_num == 0o100
|
794
|
+
current_group_mode = current_group_mode >> 6
|
795
|
+
elsif group_num == 0o10
|
796
|
+
current_group_mode = current_group_mode >> 3
|
797
|
+
end
|
798
|
+
|
799
|
+
current_group_mode
|
800
|
+
end
|
801
|
+
|
802
|
+
# given the current chmod values for a file return the result of adding or removing chmod_perm_num from the
|
803
|
+
# requested groups permissions ( so performing <GROUP>+<PERMS> or <GROUP>-<PERMS>
|
804
|
+
def self.set_perms_for_group(current_groups_to_vals, group_num, assignment_mode, chmod_perm_num)
|
805
|
+
# get the current recorded mode of the group
|
806
|
+
current_group_mode = current_groups_to_vals[group_num]
|
807
|
+
|
808
|
+
# now that we have the current value of the group, add or remove bits accordingly
|
809
|
+
if assignment_mode == '+'
|
810
|
+
current_group_mode | chmod_perm_num
|
811
|
+
elsif assignment_mode == '-'
|
812
|
+
current_group_mode & ~chmod_perm_num
|
813
|
+
else
|
814
|
+
raise ArguementError "Unknown assignment mode #{assignment_mode}"
|
815
|
+
end
|
816
|
+
end
|
817
|
+
|
818
|
+
# given a list of modes [rwx] (a) ensure all modes are valid and (b) return the numeric value
|
819
|
+
# associated with the modes
|
820
|
+
def self.calculate_chmod_amt_for_mode(modes)
|
821
|
+
valid_modes_to_numeric_vals = { 'r' => 0o4, 'w' => 0o2, 'x' => 0o1 }
|
822
|
+
|
823
|
+
# if we give no modes, then we are removing all permission
|
824
|
+
chmod_perm_num = 0o0
|
825
|
+
if modes != ''
|
826
|
+
# make sure there are no invalid flags in the modes and that we discard duplicates as chmod does
|
827
|
+
given_modes = modes.split('')
|
828
|
+
given_modes = given_modes.uniq
|
829
|
+
given_modes.each do |specific_mode|
|
830
|
+
# ensure that the mode is valid
|
831
|
+
unless valid_modes_to_numeric_vals.key? specific_mode
|
832
|
+
raise ArgumentError, "Invalid `perm' symbol in file mode: #{specific_mode}"
|
833
|
+
end
|
834
|
+
|
835
|
+
chmod_perm_num += valid_modes_to_numeric_vals[specific_mode]
|
836
|
+
end
|
837
|
+
end
|
838
|
+
|
839
|
+
chmod_perm_num
|
840
|
+
end
|
841
|
+
|
842
|
+
# split the private class method decleration so rubocop doesn't complain the line is too long
|
843
|
+
private_class_method :convert_symbolic_chmod_to_absolute, :calculate_chmod_amt_for_mode
|
844
|
+
private_class_method :get_perms_for_group, :set_perms_for_group
|
762
845
|
|
763
846
|
private
|
764
847
|
|
data/lib/fakefs/pathname.rb
CHANGED
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.18.
|
4
|
+
version: 0.18.1
|
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:
|
15
|
+
date: 2019-01-16 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: bump
|
@@ -28,20 +28,6 @@ dependencies:
|
|
28
28
|
- - "~>"
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: 0.5.3
|
31
|
-
- !ruby/object:Gem::Dependency
|
32
|
-
name: bundler
|
33
|
-
requirement: !ruby/object:Gem::Requirement
|
34
|
-
requirements:
|
35
|
-
- - "~>"
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '1.3'
|
38
|
-
type: :development
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
requirements:
|
42
|
-
- - "~>"
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
version: '1.3'
|
45
31
|
- !ruby/object:Gem::Dependency
|
46
32
|
name: minitest
|
47
33
|
requirement: !ruby/object:Gem::Requirement
|