Class: FakeFS::Dir

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/fakefs/dir.rb

Overview

FakeFs Dir class

Defined Under Namespace

Modules: Tmpname

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(string) ⇒ Dir

Returns a new instance of Dir.



13
14
15
16
17
18
19
20
21
# File 'lib/fakefs/dir.rb', line 13

def initialize(string)
  self.class._check_for_valid_file(string)

  @path     = FileSystem.normalize_path(string)
  @open     = true
  @pointer  = 0
  @contents = ['.', '..'] + FileSystem.find(@path).entries
  @inode    = FakeInode.new(self)
end

Instance Attribute Details

#pathObject (readonly)

Returns the value of attribute path.



7
8
9
# File 'lib/fakefs/dir.rb', line 7

def path
  @path
end

Class Method Details

.[](*pattern) ⇒ Object



69
70
71
# File 'lib/fakefs/dir.rb', line 69

def self.[](*pattern)
  glob pattern
end

._check_for_valid_file(path) ⇒ Object

Raises:

  • (Errno::ENOENT)


9
10
11
# File 'lib/fakefs/dir.rb', line 9

def self._check_for_valid_file(path)
  raise Errno::ENOENT, path.to_s unless FileSystem.find(path)
end

.chdir(dir, &blk) ⇒ Object



77
78
79
# File 'lib/fakefs/dir.rb', line 77

def self.chdir(dir, &blk)
  FileSystem.chdir(dir, &blk)
end

.children(dirname, _options = nil) ⇒ Object



98
99
100
# File 'lib/fakefs/dir.rb', line 98

def self.children(dirname, _options = nil)
  entries(dirname) - ['.', '..']
end

.chroot(_string) ⇒ Object

Raises:

  • (NotImplementedError)


81
82
83
# File 'lib/fakefs/dir.rb', line 81

def self.chroot(_string)
  raise NotImplementedError
end

.delete(string) ⇒ Object Also known as: rmdir, unlink

Raises:

  • (Errno::ENOTEMPTY)


85
86
87
88
89
90
# File 'lib/fakefs/dir.rb', line 85

def self.delete(string)
  _check_for_valid_file(string)
  raise Errno::ENOTEMPTY, string.to_s unless FileSystem.find(string).empty?

  FileSystem.delete(string)
end

.each_child(dirname, &_block) ⇒ Object



102
103
104
105
106
107
108
109
# File 'lib/fakefs/dir.rb', line 102

def self.each_child(dirname, &_block)
  Dir.open(dirname) do |dir|
    dir.each do |file|
      next if ['.', '..'].include?(file)
      yield file
    end
  end
end

.empty?(dirname) ⇒ Boolean

Returns:

  • (Boolean)


112
113
114
115
116
117
118
119
# File 'lib/fakefs/dir.rb', line 112

def self.empty?(dirname)
  _check_for_valid_file(dirname)
  if File.directory?(dirname)
    Dir.new(dirname).count <= 2
  else
    false
  end
end

.entries(dirname, _options = nil) ⇒ Object



92
93
94
95
96
# File 'lib/fakefs/dir.rb', line 92

def self.entries(dirname, _options = nil)
  _check_for_valid_file(dirname)

  Dir.new(dirname).map { |file| File.basename(file) }
end

.exist?(path) ⇒ Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/fakefs/dir.rb', line 73

def self.exist?(path)
  File.exist?(path) && File.directory?(path)
end

.foreach(dirname, &_block) ⇒ Object



122
123
124
125
126
127
128
# File 'lib/fakefs/dir.rb', line 122

def self.foreach(dirname, &_block)
  Dir.open(dirname) do |dir|
    dir.each do |file|
      yield file
    end
  end
end

.glob(pattern, _flags = 0, flags: _flags, base: nil, sort: true, &block) ⇒ Object

rubocop:disable Lint/UnderscorePrefixedVariableName



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/fakefs/dir.rb', line 130

def self.glob(pattern, _flags = 0, flags: _flags, base: nil, sort: true, &block) # rubocop:disable Lint/UnderscorePrefixedVariableName
  pwd = FileSystem.normalize_path(base || Dir.pwd)
  matches_for_pattern = lambda do |matcher|
    matched = [FileSystem.find_with_glob(matcher, flags, true, dir: pwd) || []].flatten.map do |e|
      pwd_regex = %r{\A#{pwd.gsub('+') { '\+' }}/?}
      if pwd.match(%r{\A/?\z}) ||
         !e.to_s.match(pwd_regex)
        e.to_s
      else
        e.to_s.match(pwd_regex).post_match
      end
    end
    matched.sort! if sort
    matched
  end

  files =
    if pattern.is_a?(Array)
      pattern.map do |matcher|
        matches_for_pattern.call matcher
      end.flatten
    else
      matches_for_pattern.call pattern
    end

  block_given? ? files.each { |file| block.call(file) } : files
end

.home(user = nil) ⇒ Object



158
159
160
# File 'lib/fakefs/dir.rb', line 158

def self.home(user = nil)
  RealDir.home(user)
end

.mkdir(string, _integer = 0) ⇒ Object



162
163
164
# File 'lib/fakefs/dir.rb', line 162

def self.mkdir(string, _integer = 0)
  FileUtils.mkdir(string)
end

.mktmpdir(prefix_suffix = nil, tmpdir = nil) ⇒ Object

This code has been borrowed from Rubinius



241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# File 'lib/fakefs/dir.rb', line 241

def self.mktmpdir(prefix_suffix = nil, tmpdir = nil)
  case prefix_suffix
  when nil
    prefix = 'd'
    suffix = ''
  when String
    prefix = prefix_suffix
    suffix = ''
  when Array
    prefix = prefix_suffix[0]
    suffix = prefix_suffix[1]
  else
    raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
  end

  t = Time.now.strftime('%Y%m%d')
  n = nil

  begin
    path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
    path << "-#{n}" if n
    path << suffix
    mkdir(path, 0o700)
  rescue Errno::EEXIST
    n ||= 0
    n += 1
    retry
  end

  if block_given?
    begin
      yield path
    ensure
      require 'fileutils'
      # This here was using FileUtils.remove_entry_secure instead of just
      # .rm_r. However, the security concerns that apply to
      # .rm_r/.remove_entry_secure shouldn't apply to a test fake
      # filesystem. :^)
      FileUtils.rm_r path
    end
  else
    path
  end
end

.open(string, &_block) ⇒ Object



166
167
168
169
170
171
172
173
174
175
# File 'lib/fakefs/dir.rb', line 166

def self.open(string, &_block)
  dir = Dir.new(string)
  if block_given?
    result = yield(dir)
    dir.close
    result
  else
    dir
  end
end

.pwdObject Also known as: getwd



181
182
183
# File 'lib/fakefs/dir.rb', line 181

def self.pwd
  FileSystem.current_dir.to_s
end

.tmpdirObject



177
178
179
# File 'lib/fakefs/dir.rb', line 177

def self.tmpdir
  '/tmp'
end

Instance Method Details

#childrenObject



40
41
42
# File 'lib/fakefs/dir.rb', line 40

def children
  each.to_a
end

#closeObject



23
24
25
26
27
28
# File 'lib/fakefs/dir.rb', line 23

def close
  @open = false
  @pointer = nil
  @contents = nil
  nil
end

#eachObject



30
31
32
33
34
35
36
37
38
# File 'lib/fakefs/dir.rb', line 30

def each
  if block_given?
    while (f = read)
      yield f
    end
  else
    @contents.map { |entry| entry_to_relative_path(entry) }.each
  end
end

#inoObject



236
237
238
# File 'lib/fakefs/dir.rb', line 236

def ino
  @inode.inode_num
end

#posObject



44
45
46
# File 'lib/fakefs/dir.rb', line 44

def pos
  @pointer
end

#pos=(integer) ⇒ Object



48
49
50
# File 'lib/fakefs/dir.rb', line 48

def pos=(integer)
  @pointer = integer
end

#readObject

Raises:

  • (IOError)


52
53
54
55
56
57
# File 'lib/fakefs/dir.rb', line 52

def read
  raise IOError, 'closed directory' unless @pointer
  entry = @contents[@pointer]
  @pointer += 1
  entry_to_relative_path(entry) if entry
end

#rewindObject



59
60
61
# File 'lib/fakefs/dir.rb', line 59

def rewind
  @pointer = 0
end

#seek(integer) ⇒ Object

Raises:

  • (IOError)


63
64
65
66
67
# File 'lib/fakefs/dir.rb', line 63

def seek(integer)
  raise IOError, 'closed directory' if @pointer.nil?
  @pointer = integer
  @contents[integer]
end