Class: FakeFS::File

Inherits:
StringIO
  • Object
show all
Defined in:
lib/fakefs/file.rb,
lib/fakefs/flockable_file.rb

Overview

Be careful using this, as it may break things if you obtain more that one flock per file using different descriptors. Real flock call blocks/returns false in that case - see man7.org/linux/man-pages/man2/flock.2.html, it says it “may be denied”, but it does, it fact, deny. This implementation simply returns 0. This may also be a problem if you, it fact, are accessing a real file, which is locked by another process.

Defined Under Namespace

Classes: Stat

Constant Summary collapse

MODES =
[
  READ_ONLY           = 'r',
  READ_WRITE          = 'r+',
  WRITE_ONLY          = 'w',
  READ_WRITE_TRUNCATE = 'w+',
  APPEND_WRITE_ONLY   = 'a',
  APPEND_READ_WRITE   = 'a+'
].freeze
FMODE_READABLE =
0x00000001
FMODE_WRITABLE =
0x00000002
FMODE_READWRITE =
(FMODE_READABLE | FMODE_WRITABLE)
FMODE_BINMODE =
0x00000004
FMODE_APPEND =
0x00000040
FMODE_CREATE =
0x00000080
FMODE_EXCL =
0x00000400
FMODE_TRUNC =
0x00000800
FMODE_TEXTMODE =
0x00001000
TEXT_MODES =
{
  'r' => FMODE_READABLE,
  'w' => FMODE_WRITABLE | FMODE_TRUNC | FMODE_CREATE,
  'a' => FMODE_WRITABLE | FMODE_APPEND | FMODE_CREATE
}.freeze
FILE_CREATION_MODES =
(MODES - [READ_ONLY, READ_WRITE]).freeze
FILE_ACCESS_MODE =
(RealFile::RDONLY | RealFile::WRONLY | RealFile::RDWR)
MODE_BITMASK =
(
  RealFile::RDONLY |
  RealFile::WRONLY |
  RealFile::RDWR |
  RealFile::APPEND |
  RealFile::CREAT |
  RealFile::EXCL |
  RealFile::NONBLOCK |
  RealFile::TRUNC |
  RealFile::BINARY |
  (RealFile.const_defined?(:NOCTTY) ? RealFile::NOCTTY : 0) |
  (RealFile.const_defined?(:SYNC) ? RealFile::SYNC : 0)
)
FAKE_FS_ALLOWED_FLOCK_MODES =

yep, File::LOCK_UN | File::LOCK_NB is allowed

[RealFile::LOCK_EX, RealFile::LOCK_SH, RealFile::LOCK_UN].flat_map do |mode|
  [mode, mode | RealFile::LOCK_NB]
end.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, *args) ⇒ File

Returns a new instance of File.

Raises:

  • (ArgumentError)


512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
# File 'lib/fakefs/file.rb', line 512

def initialize(path, *args)
  # unable to pass args otherwise on jruby, it may cause false passes on MRI, though
  # because explicit hash isn't supported
  opts = args.last.is_a?(Hash) ? args.pop : {}
  if args.size > 2
    raise ArgumentError, "wrong number of arguments (given #{args.size + 1}, expected 1..3)"
  end
  mode, _perm = args

  @path = path
  @file = FileSystem.find(@path)
  # real rb_scan_open_args - and rb_io_extract_modeenc - is much more complex
  raise ArgumentError, 'mode specified twice' unless mode.nil? || opts[:mode].nil?

  mode_opt = mode.nil? ? opts[:mode] : mode
  # see vmode_handle
  if mode_opt.nil?
    @oflags = RealFile::RDONLY
  elsif mode_opt.respond_to?(:to_int) && (intmode = mode_opt.to_int).instance_of?(Integer)
    @oflags = intmode
  else
    unless mode_opt.is_a?(String)
      unless mode_opt.respond_to?(:to_str)
        raise TypeError, "no implicit conversion of #{mode_opt.class} into String"
      end

      strmode = mode_opt.to_str
      unless strmode.is_a?(String)
        raise TypeError, "can't convert #{mode_opt.class} to String " \
          "(#{mode_opt.class}#to_str gives #{strmode.class})"
      end

      mode_opt = strmode
    end

    @oflags, @fmode = parse_strmode_oflags(mode_opt)
  end
  unless opts[:flags].nil?
    if opts[:flags].is_a?(Integer)
      @oflags |= opts[:flags]
    elsif opts[:flags].respond_to?(:to_int)
      intflags = opts[:flags].to_int
      unless intflags.instance_of?(Integer)
        raise TypeError, "can't convert #{opts[:flags].class} to Integer " \
          "(#{opts[:flags].class}#to_int gives #{intflags.class})"
      end

      @oflags |= intflags
      @fmode = create_fmode(@oflags)
    else
      raise TypeError, "no implicit conversion of #{opts[:flags].class} into Integer"
    end
  end
  @fmode ||= create_fmode(@oflags)
  @fmode = extract_binmode(opts, @fmode)

  @autoclose = true
  file_creation_mode? ? create_missing_file : check_file_existence!
  # StringIO changes enciding of the underlying string to binary
  # when binary data is written if it's opened in binary mode,
  # so content might have binary encoding. StringIO also switches to
  # binary mode if its string have binary encoding, but it might not
  # be what we want, so insteed we use encoding parsed after super call
  # and force set it back.

  # truncate doesn't work
  unless @file.is_a?(FakeFS::FakeDir)
    @file.content = @file.content.dup.force_encoding(Encoding.default_external)
  end
  # StringIO.new 'content', nil, **{} # works in MRI, but fails in JRuby
  # but File.open 'filename', nil, **{} is ok both in MRI and JRuby

  # JRuby StringIO doesn't support kwargs without mode
  #  StringIO.new "buff", encoding: 'binary' # work on MRI, fails on JRuby
  if RUBY_PLATFORM == "java"
    # other opts aren't supported
    super(@file.content, mode_opt || 'r')
    binmode if binmode? # Looks like it doesn't care about 'b'
    mode_opt_str = mode_opt.is_a?(String) ? mode_opt : ''
    raise ArgumentError, 'encoding specified twice' if mode_opt_str[':'] && opts[:encoding]

    # Might raise where real File just warns
    str_encoding = mode_opt_str.split(':')[1] # internal encoding is ignored anyway
    if opts[:encoding]
      set_encoding(opts[:encoding])
    elsif str_encoding && str_encoding != ''
      set_encoding(str_encoding)
    elsif opts[:binmode]
      set_encoding(Encoding::BINARY)
    end
  else
    super(@file.content, mode, **opts)
  end

  # StringIO is wrtable and readable by default, so we need to disable it
  # but maybe it was explicitly disabled by opts
  close_write if @fmode & FMODE_WRITABLE == 0 && !StringIO.instance_method(:closed_write?).bind(self).call
  close_read if @fmode & FMODE_READABLE == 0 && !StringIO.instance_method(:closed_read?).bind(self).call
end

Instance Attribute Details

#autocloseObject

Returns the value of attribute autoclose.



751
752
753
# File 'lib/fakefs/file.rb', line 751

def autoclose
  @autoclose
end

#pathObject (readonly)

Returns the value of attribute path.



510
511
512
# File 'lib/fakefs/file.rb', line 510

def path
  @path
end

Class Method Details

.absolute_path(file_name, dir_name = Dir.getwd) ⇒ Object



747
748
749
# File 'lib/fakefs/file.rb', line 747

def self.absolute_path(file_name, dir_name = Dir.getwd)
  RealFile.absolute_path(file_name, dir_name)
end

.atime(path) ⇒ Object



109
110
111
112
113
114
115
# File 'lib/fakefs/file.rb', line 109

def self.atime(path)
  if exist?(path)
    FileSystem.find(path).atime
  else
    raise Errno::ENOENT
  end
end

.basename(*args) ⇒ Object



190
191
192
# File 'lib/fakefs/file.rb', line 190

def self.basename(*args)
  RealFile.basename(*args)
end

.binread(file, length = nil, offset = 0) ⇒ Object



348
349
350
# File 'lib/fakefs/file.rb', line 348

def self.binread(file, length = nil, offset = 0)
  File.read(file, length, offset, mode: 'rb:ASCII-8BIT')
end

.binwrite(file, content, offset = nil) ⇒ Object



352
353
354
355
# File 'lib/fakefs/file.rb', line 352

def self.binwrite(file, content, offset = nil)
  mode = offset ? 'r+b:ASCII-8BIT' : 'wb:ASCII-8BIT'
  File.write(file, content, offset, mode: mode)
end

.birthtime(path) ⇒ Object



799
800
801
802
803
804
805
# File 'lib/fakefs/file.rb', line 799

def self.birthtime(path)
  if exist?(path)
    FileSystem.find(path).birthtime
  else
    raise Errno::ENOENT
  end
end

.chmod(new_mode, filename) ⇒ Object



311
312
313
314
315
316
317
318
319
320
321
# File 'lib/fakefs/file.rb', line 311

def self.chmod(new_mode, filename)
  # chmod's mode can either be passed in in absolute mode, or symbolic mode
  # for reference: https://ruby-doc.org/stdlib-2.2.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-chmod
  # if the mode is passed in symbolic mode we must convert it to absolute mode
  is_absolute_mode = new_mode.is_a? Numeric
  unless is_absolute_mode
    current_mode = FileSystem.find(filename).mode
    new_mode = convert_symbolic_chmod_to_absolute(new_mode, current_mode)
  end
  FileSystem.find(filename).mode = 0o100000 + new_mode
end

.chown(owner_int, group_int, filename) ⇒ Object



331
332
333
334
335
336
337
338
339
340
341
342
# File 'lib/fakefs/file.rb', line 331

def self.chown(owner_int, group_int, filename)
  file = FileSystem.find(filename)

  if owner_int && owner_int != -1
    owner_int.is_a?(Integer) || raise(TypeError, "can't convert String into Integer")
    file.uid = owner_int
  end
  if group_int && group_int != -1
    group_int.is_a?(Integer) || raise(TypeError, "can't convert String into Integer")
    file.gid = group_int
  end
end

.const_missing(name) ⇒ Object



152
153
154
# File 'lib/fakefs/file.rb', line 152

def self.const_missing(name)
  RealFile.const_get(name)
end

.ctime(path) ⇒ Object



101
102
103
104
105
106
107
# File 'lib/fakefs/file.rb', line 101

def self.ctime(path)
  if exist?(path)
    FileSystem.find(path).ctime
  else
    raise Errno::ENOENT
  end
end

.delete(*files) ⇒ Object Also known as: unlink



280
281
282
283
284
285
286
287
288
289
# File 'lib/fakefs/file.rb', line 280

def self.delete(*files)
  files.each do |file|
    file_name = (file.instance_of?(FakeFS::File) ? file.path : file.to_s)
    raise Errno::ENOENT, file_name unless exist?(file_name)

    FileUtils.rm(file_name)
  end

  files.size
end

.directory?(path) ⇒ Boolean

Returns:

  • (Boolean)


156
157
158
159
160
161
162
163
# File 'lib/fakefs/file.rb', line 156

def self.directory?(path)
  if path.respond_to? :entry
    path.entry.is_a? FakeDir
  else
    result = FileSystem.find(path)
    result ? result.entry.is_a?(FakeDir) : false
  end
end

.dirname(*args) ⇒ Object



194
195
196
# File 'lib/fakefs/file.rb', line 194

def self.dirname(*args)
  RealFile.dirname(*args)
end

.executable?(filename) ⇒ Boolean

Not exactly right, returns true if the file is chmod +x for owner. In the context of when you would use fakefs, this is usually what you want.

Returns:

  • (Boolean)


325
326
327
328
329
# File 'lib/fakefs/file.rb', line 325

def self.executable?(filename)
  file = FileSystem.find(filename)
  return false unless file
  (file.mode - 0o100000) & 0o100 != 0
end

.exist?(path) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
66
67
68
69
70
# File 'lib/fakefs/file.rb', line 63

def self.exist?(path)
  if File.symlink?(path)
    referent = File.expand_path(File.readlink(path), File.dirname(path))
    exist?(referent)
  else
    !FileSystem.find(path).nil?
  end
end

.expand_path(file_name, dir_string = FileSystem.current_dir.to_s) ⇒ Object



186
187
188
# File 'lib/fakefs/file.rb', line 186

def self.expand_path(file_name, dir_string = FileSystem.current_dir.to_s)
  RealFile.expand_path(file_name, RealFile.expand_path(dir_string, Dir.pwd))
end

.extname(path) ⇒ Object



51
52
53
# File 'lib/fakefs/file.rb', line 51

def self.extname(path)
  RealFile.extname(path)
end

.file?(path) ⇒ Boolean

Returns:

  • (Boolean)


173
174
175
176
177
178
179
180
# File 'lib/fakefs/file.rb', line 173

def self.file?(path)
  if path.respond_to? :entry
    path.entry.is_a? FakeFile
  else
    result = FileSystem.find(path)
    result ? result.entry.is_a?(FakeFile) : false
  end
end

.fnmatch?(pattern, path, flags = 0) ⇒ Boolean Also known as: fnmatch

Returns:

  • (Boolean)


357
358
359
# File 'lib/fakefs/file.rb', line 357

def self.fnmatch?(pattern, path, flags = 0)
  RealFile.fnmatch?(pattern, path, flags)
end

.foreach(path, *args, &block) ⇒ Object



228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/fakefs/file.rb', line 228

def self.foreach(path, *args, &block)
  file = new(path)
  if file.exists?
    FileSystem.find(path).atime = Time.now
    if block_given?
      file.each_line(*args, &block)
    else
      file.each_line(*args)
    end
  else
    raise Errno::ENOENT
  end
end

.ftype(filename) ⇒ Object



182
183
184
# File 'lib/fakefs/file.rb', line 182

def self.ftype(filename)
  File.lstat(filename).ftype
end

.identical?(one_path, another_path) ⇒ Boolean

Returns:

  • (Boolean)


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

def identical?(one_path, another_path)
  FileSystem.find(one_path) == FileSystem.find(another_path)
end

.join(*parts) ⇒ Object



55
56
57
# File 'lib/fakefs/file.rb', line 55

def self.join(*parts)
  RealFile.join(parts)
end

Raises:

  • (Errno::EPERM)


268
269
270
271
272
273
274
275
276
277
278
# File 'lib/fakefs/file.rb', line 268

def self.link(source, dest)
  raise Errno::EPERM, "#{source} or #{dest}" if directory?(source)
  raise Errno::ENOENT, "#{source} or #{dest}" unless exist?(source)
  raise Errno::EEXIST, "#{source} or #{dest}" if exist?(dest)

  source = FileSystem.find(source)
  dest = FileSystem.add(dest, source.entry.clone)
  source.link(dest)

  0
end

.lstat(file) ⇒ Object



303
304
305
# File 'lib/fakefs/file.rb', line 303

def self.lstat(file)
  File::Stat.new(file, true)
end

.mtime(path) ⇒ Object



93
94
95
96
97
98
99
# File 'lib/fakefs/file.rb', line 93

def self.mtime(path)
  if exist?(path)
    FileSystem.find(path).mtime
  else
    raise Errno::ENOENT
  end
end

.path(file) ⇒ Object



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

def self.path(file)
  RealFile.path(file)
end

.read(path, *args) ⇒ Object

TODO: support open_key_args

Raises:

  • (Errno::ENOENT)


204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/fakefs/file.rb', line 204

def self.read(path, *args)
  options = args[-1].is_a?(Hash) ? args.pop : {}
  length = args.empty? ? nil : args.shift
  offset = args.empty? ? 0 : args.shift
  file = new(path, **options)

  raise Errno::ENOENT unless file.exists?
  raise Errno::EISDIR, path.to_s if directory?(path)

  FileSystem.find(path).atime = Time.now
  file.seek(offset)
  file.read(length)
end

.readable?(path) ⇒ Boolean

Returns:

  • (Boolean)


83
84
85
86
# File 'lib/fakefs/file.rb', line 83

def self.readable?(path)
  return false unless exist? path
  File.lstat(path).readable?
end

.readlines(path, chomp: false) ⇒ Object



218
219
220
221
222
223
224
225
226
# File 'lib/fakefs/file.rb', line 218

def self.readlines(path, chomp: false)
  file = new(path)
  if file.exists?
    FileSystem.find(path).atime = Time.now
    chomp ? file.readlines.map(&:chomp) : file.readlines
  else
    raise Errno::ENOENT
  end
end


198
199
200
201
# File 'lib/fakefs/file.rb', line 198

def self.readlink(path)
  symlink = FileSystem.find(path)
  symlink.target
end

.realdirpath(*args) ⇒ Object



763
764
765
# File 'lib/fakefs/file.rb', line 763

def self.realdirpath(*args)
  RealFile.realdirpath(*args)
end

.realpath(*args) ⇒ Object



726
727
728
# File 'lib/fakefs/file.rb', line 726

def self.realpath(*args)
  RealFile.realpath(*args)
end

.rename(source, dest) ⇒ Object



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
# File 'lib/fakefs/file.rb', line 242

def self.rename(source, dest)
  if directory?(source) && file?(dest)
    raise Errno::ENOTDIR, "#{source} or #{dest}"
  elsif file?(source) && directory?(dest)
    raise Errno::EISDIR, "#{source} or #{dest}"
  elsif !exist?(dirname(dest))
    raise Errno::ENOENT, "#{source} or #{dest}"
  end

  if (target = FileSystem.find(source))
    return 0 if source == dest

    if target.is_a?(FakeFS::FakeSymlink)
      File.symlink(target.target, dest)
    else
      FileSystem.add(dest, target.entry.clone)
    end

    FileSystem.delete(source)
  else
    raise Errno::ENOENT, "#{source} or #{dest}"
  end

  0
end

.size(path) ⇒ Object



130
131
132
133
134
135
136
# File 'lib/fakefs/file.rb', line 130

def self.size(path)
  if directory?(path)
    64 + (32 * FileSystem.find(path).entries.size)
  else
    read(path).bytesize
  end
end

.size?(path) ⇒ Boolean

Returns:

  • (Boolean)


138
139
140
# File 'lib/fakefs/file.rb', line 138

def self.size?(path)
  size(path) if exist?(path) && !size(path).zero?
end

.split(path) ⇒ Object



307
308
309
# File 'lib/fakefs/file.rb', line 307

def self.split(path)
  RealFile.split(path)
end

.stat(file) ⇒ Object



299
300
301
# File 'lib/fakefs/file.rb', line 299

def self.stat(file)
  File::Stat.new(file)
end

.sticky?(_path) ⇒ Boolean

Assume nothing is sticky.

Returns:

  • (Boolean)


78
79
80
# File 'lib/fakefs/file.rb', line 78

def sticky?(_path)
  false
end


295
296
297
# File 'lib/fakefs/file.rb', line 295

def self.symlink(source, dest)
  FileUtils.ln_s(source, dest)
end

.symlink?(path) ⇒ Boolean

Returns:

  • (Boolean)


165
166
167
168
169
170
171
# File 'lib/fakefs/file.rb', line 165

def self.symlink?(path)
  if path.respond_to? :entry
    path.is_a? FakeSymlink
  else
    FileSystem.find(path).is_a? FakeSymlink
  end
end

.umask(*args) ⇒ Object



344
345
346
# File 'lib/fakefs/file.rb', line 344

def self.umask(*args)
  RealFile.umask(*args)
end

.utime(atime, mtime, *paths) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/fakefs/file.rb', line 117

def self.utime(atime, mtime, *paths)
  paths.each do |path|
    if exist?(path)
      FileSystem.find(path).atime = atime
      FileSystem.find(path).mtime = mtime
    else
      raise Errno::ENOENT
    end
  end

  paths.size
end

.writable?(path) ⇒ Boolean

Returns:

  • (Boolean)


88
89
90
91
# File 'lib/fakefs/file.rb', line 88

def self.writable?(path)
  return false unless exist? path
  File.lstat(path).writable?
end

.write(filename, contents, offset = nil, **open_args) ⇒ Object



769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
# File 'lib/fakefs/file.rb', line 769

def self.write(filename, contents, offset = nil, **open_args)
  mode = offset ? 'r+' : 'w'
  if open_args[:open_args]
    # see open_key_args
    # todo: foreach, readlines, read also use it
    # Treat a final argument as keywords if it is a hash, and not as keywords otherwise.
    open_args = open_args[:open_args]
    if open_args.last.is_a?(Hash)
      args = open_args[0...-1]
      opt = open_args.last
    else
      args = open_args
      opt = {}
    end
  else
    args = [open_args.delete(:mode) || mode]
    opt = open_args
  end
  if offset
    open(filename, *args, **opt) do |f| # rubocop:disable Security/Open
      f.seek(offset)
      f.write(contents)
    end
  else
    open(filename, *args, **opt) do |f| # rubocop:disable Security/Open
      f.write(contents)
    end
  end
end

.zero?(path) ⇒ Boolean Also known as: empty?

Returns:

  • (Boolean)


142
143
144
# File 'lib/fakefs/file.rb', line 142

def self.zero?(path)
  exist?(path) && size(path) == 0
end

Instance Method Details

#advise(_advice, _offset = 0, _len = 0) ⇒ Object



767
# File 'lib/fakefs/file.rb', line 767

def advise(_advice, _offset = 0, _len = 0); end

#atimeObject



684
685
686
# File 'lib/fakefs/file.rb', line 684

def atime
  self.class.atime(@path)
end

#autoclose?Boolean

Returns:

  • (Boolean)


753
754
755
# File 'lib/fakefs/file.rb', line 753

def autoclose?
  @autoclose ? true : false
end

#binmode?Boolean

Returns:

  • (Boolean)


730
731
732
733
# File 'lib/fakefs/file.rb', line 730

def binmode?
  # File.open('test_mode', mode: 'w:binary').binmode? # => false
  @fmode & FMODE_BINMODE != 0
end

#birthtimeObject



807
808
809
# File 'lib/fakefs/file.rb', line 807

def birthtime
  self.class.birthtime(@path)
end

#chmod(new_mode) ⇒ Object



700
701
702
703
704
705
706
707
708
709
710
# File 'lib/fakefs/file.rb', line 700

def chmod(new_mode)
  # chmod's mode can either be passed in in absolute mode, or symbolic mode
  # for reference: https://ruby-doc.org/stdlib-2.2.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-chmod
  # if the mode is passed in symbolic mode we must convert it to absolute mode
  is_absolute_mode = new_mode.is_a? Numeric
  unless is_absolute_mode
    current_mode = @file.mode
    new_mode = convert_symbolic_chmod_to_absolute(new_mode, current_mode)
  end
  @file.mode = 0o100000 + new_mode
end

#chown(owner_int, group_int) ⇒ Object



712
713
714
715
716
717
718
719
720
721
722
723
724
# File 'lib/fakefs/file.rb', line 712

def chown(owner_int, group_int)
  return unless group_int && group_int != -1

  owner_int.is_a?(Integer) || raise(
    TypeError, "can't convert String into Integer"
  )
  @file.uid = owner_int

  group_int.is_a?(Integer) || raise(
    TypeError, "can't convert String into Integer"
  )
  @file.gid = group_int
end

#close_on_exec=(_bool) ⇒ Object

Raises:

  • (NotImplementedError)


735
736
737
# File 'lib/fakefs/file.rb', line 735

def close_on_exec=(_bool)
  raise NotImplementedError
end

#close_on_exec?Boolean

Returns:

  • (Boolean)

Raises:

  • (NotImplementedError)


739
740
741
# File 'lib/fakefs/file.rb', line 739

def close_on_exec?
  raise NotImplementedError
end

#ctimeObject



688
689
690
# File 'lib/fakefs/file.rb', line 688

def ctime
  self.class.ctime(@path)
end

#exists?Boolean

Returns:

  • (Boolean)


612
613
614
# File 'lib/fakefs/file.rb', line 612

def exists?
  true
end

#flock(mode) ⇒ Object

Raises:

  • (NotImplementedError)


692
693
694
# File 'lib/fakefs/file.rb', line 692

def flock(*)
  raise NotImplementedError
end

#ioctlObject

Raises:

  • (NotImplementedError)


649
650
651
# File 'lib/fakefs/file.rb', line 649

def ioctl(*)
  raise NotImplementedError
end

#is_a?(klass) ⇒ Boolean

Returns:

  • (Boolean)


641
642
643
# File 'lib/fakefs/file.rb', line 641

def is_a?(klass)
  RealFile.allocate.is_a?(klass)
end

#lstatObject



661
662
663
# File 'lib/fakefs/file.rb', line 661

def lstat
  self.class.lstat(@path)
end

#mtimeObject



696
697
698
# File 'lib/fakefs/file.rb', line 696

def mtime
  self.class.mtime(@path)
end

#read_nonblockObject

Raises:

  • (NotImplementedError)


653
654
655
# File 'lib/fakefs/file.rb', line 653

def read_nonblock
  raise NotImplementedError
end

#readpartialObject



680
681
682
# File 'lib/fakefs/file.rb', line 680

def readpartial(*)
  super
end

#sizeObject



759
760
761
# File 'lib/fakefs/file.rb', line 759

def size
  File.size(@path)
end

#statObject



657
658
659
# File 'lib/fakefs/file.rb', line 657

def stat
  self.class.stat(@path)
end

#stringObject



645
646
647
# File 'lib/fakefs/file.rb', line 645

def string
  gets(nil)
end

#sysseek(position, whence = SEEK_SET) ⇒ Object



665
666
667
668
# File 'lib/fakefs/file.rb', line 665

def sysseek(position, whence = SEEK_SET)
  seek(position, whence)
  pos
end

#syswriteObject



624
625
626
627
628
# File 'lib/fakefs/file.rb', line 624

def write(*args)
  val = super(*args)
  @file.mtime = Time.now
  val
end

#to_ioObject



672
673
674
# File 'lib/fakefs/file.rb', line 672

def to_io
  self
end

#to_pathObject



743
744
745
# File 'lib/fakefs/file.rb', line 743

def to_path
  @path
end

#write(*args) ⇒ Object



616
617
618
619
620
# File 'lib/fakefs/file.rb', line 616

def write(*args)
  val = super(*args)
  @file.mtime = Time.now
  val
end

#write_nonblockObject

Raises:

  • (NotImplementedError)


676
677
678
# File 'lib/fakefs/file.rb', line 676

def write_nonblock(*)
  raise NotImplementedError
end