Class: MemFs::IO

Inherits:
Object
  • Object
show all
Extended by:
SingleForwardable
Includes:
Constants
Defined in:
lib/memfs/io.rb

Direct Known Subclasses

File

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#autoclose=(value) ⇒ Object (writeonly)

Sets the attribute autoclose

Parameters:

  • value

    the value to set the attribute autoclose to.



62
63
64
# File 'lib/memfs/io.rb', line 62

def autoclose=(value)
  @autoclose = value
end

#close_on_exec=(value) ⇒ Object (writeonly)

Sets the attribute close_on_exec

Parameters:

  • value

    the value to set the attribute close_on_exec to.



62
63
64
# File 'lib/memfs/io.rb', line 62

def close_on_exec=(value)
  @close_on_exec = value
end

Class Method Details

.read(path, *args) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/memfs/io.rb', line 17

def self.read(path, *args)
  options = args.last.is_a?(Hash) ? args.pop : {}
  options = {
    mode: File::RDONLY,
    encoding: nil,
    open_args: nil
  }.merge(options)
  open_args = options[:open_args] ||
              [options[:mode], encoding: options[:encoding]]

  length, offset = args

  file = open(path, *open_args)
  file.seek(offset || 0)
  file.read(length)
ensure
  file.close if file
end

.write(path, string, offset = 0, open_args = nil) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/memfs/io.rb', line 36

def self.write(path, string, offset = 0, open_args = nil)
  open_args ||= [File::WRONLY, encoding: nil]

  offset = 0 if offset.nil?
  unless offset.respond_to?(:to_int)
    fail TypeError, "no implicit conversion from #{offset.class}"
  end
  offset = offset.to_int

  if offset > 0
    fail NotImplementedError,
         'MemFs::IO.write with offset not yet supported.'
  end

  file = open(path, *open_args)
  file.seek(offset)
  file.write(string)
ensure
  file.close if file
end

Instance Method Details

#<<(object) ⇒ Object



65
66
67
68
69
# File 'lib/memfs/io.rb', line 65

def <<(object)
  fail IOError, 'not opened for writing' unless writable?

  content << object.to_s
end

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



71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/memfs/io.rb', line 71

def advise(advice_type, _offset = 0, _len = 0)
  advice_types = [
    :dontneed,
    :noreuse,
    :normal,
    :random,
    :sequential,
    :willneed
  ]
  unless advice_types.include?(advice_type)
    fail NotImplementedError, "Unsupported advice: #{advice_type.inspect}"
  end
  nil
end

#autoclose?Boolean

Returns:

  • (Boolean)


86
87
88
# File 'lib/memfs/io.rb', line 86

def autoclose?
  defined?(@autoclose) ? !!@autoclose : true
end

#binmodeObject



90
91
92
93
94
# File 'lib/memfs/io.rb', line 90

def binmode
  @binmode = true
  @external_encoding = Encoding::ASCII_8BIT
  self
end

#binmode?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'lib/memfs/io.rb', line 96

def binmode?
  defined?(@binmode) ? @binmode : false
end

#closeObject



100
101
102
# File 'lib/memfs/io.rb', line 100

def close
  self.closed = true
end

#close_on_exec?Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/memfs/io.rb', line 108

def close_on_exec?
  defined?(@close_on_exec) ? !!@close_on_exec : true
end

#closed?Boolean

Returns:

  • (Boolean)


104
105
106
# File 'lib/memfs/io.rb', line 104

def closed?
  closed
end

#each(sep = $/) ⇒ Object



125
126
127
128
129
130
# File 'lib/memfs/io.rb', line 125

def each(sep = $/)
  return to_enum(__callee__) unless block_given?
  fail IOError, 'not opened for reading' unless readable?
  content.each_line(sep) { |line| yield(line) }
  self
end

#each_byteObject Also known as: bytes



132
133
134
135
136
137
# File 'lib/memfs/io.rb', line 132

def each_byte
  return to_enum(__callee__) unless block_given?
  fail IOError, 'not opened for reading' unless readable?
  content.each_byte { |byte| yield(byte) }
  self
end

#each_charObject Also known as: chars



140
141
142
143
144
145
# File 'lib/memfs/io.rb', line 140

def each_char
  return to_enum(__callee__) unless block_given?
  fail IOError, 'not opened for reading' unless readable?
  content.each_char { |char| yield(char) }
  self
end

#eof?Boolean Also known as: eof

Returns:

  • (Boolean)


112
113
114
# File 'lib/memfs/io.rb', line 112

def eof?
  pos >= content.size
end

#external_encodingObject



117
118
119
120
121
122
123
# File 'lib/memfs/io.rb', line 117

def external_encoding
  if writable?
    @external_encoding
  else
    @external_encoding ||= Encoding.default_external
  end
end

#posObject



148
149
150
# File 'lib/memfs/io.rb', line 148

def pos
  entry.pos
end


152
153
154
155
156
# File 'lib/memfs/io.rb', line 152

def print(*objs)
  objs << $_ if objs.empty?
  self << objs.join($,) << $\.to_s
  nil
end

#printf(format_string, *objs) ⇒ Object



158
159
160
# File 'lib/memfs/io.rb', line 158

def printf(format_string, *objs)
  print format_string % objs
end

#puts(text) ⇒ Object



162
163
164
165
166
# File 'lib/memfs/io.rb', line 162

def puts(text)
  fail IOError, 'not opened for writing' unless writable?

  content.puts text
end

#read(length = nil, buffer = '') ⇒ Object



168
169
170
171
172
173
174
# File 'lib/memfs/io.rb', line 168

def read(length = nil, buffer = '')
  unless entry
    fail(Errno::ENOENT, path)
  end
  default = length ? nil : ''
  content.read(length, buffer) || default
end

#seek(amount, whence = ::IO::SEEK_SET) ⇒ Object



176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/memfs/io.rb', line 176

def seek(amount, whence = ::IO::SEEK_SET)
  new_pos = case whence
            when ::IO::SEEK_CUR then entry.pos + amount
            when ::IO::SEEK_END then content.to_s.length + amount
            when ::IO::SEEK_SET then amount
            end

  fail Errno::EINVAL, path if new_pos.nil? || new_pos < 0

  entry.pos = new_pos
  0
end

#statObject



189
190
191
# File 'lib/memfs/io.rb', line 189

def stat
  File.stat(path)
end

#write(string) ⇒ Object



193
194
195
196
197
# File 'lib/memfs/io.rb', line 193

def write(string)
  fail IOError, 'not opened for writing' unless writable?

  content.write(string.to_s)
end