Class: Bio::FlatFile::BufferedInputStream

Inherits:
Object
  • Object
show all
Defined in:
lib/bio/io/flatfile.rb

Overview

Wrapper for a IO (or IO-like) object. It can input with a buffer.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(io, path) ⇒ BufferedInputStream

Creates a new input stream wrapper



32
33
34
35
36
37
# File 'lib/bio/io/flatfile.rb', line 32

def initialize(io, path)
  @io = io
  @path = path
  # initialize prefetch buffer
  @buffer = ''
end

Instance Attribute Details

#pathObject (readonly)

Pathname, filename or URI to open the object. Like File#path, returned value isn’t normalized.



95
96
97
# File 'lib/bio/io/flatfile.rb', line 95

def path
  @path
end

Class Method Details

.for_io(io) ⇒ Object

Creates a new input stream wrapper from the given IO object.



40
41
42
43
44
45
46
47
# File 'lib/bio/io/flatfile.rb', line 40

def self.for_io(io)
  begin
    path = io.path
  rescue NameError
    path = nil
  end
  self.new(io, path)
end

.open_file(filename, *arg) ⇒ Object

Creates a new input stream wrapper to open file filename by using File.open. *arg is passed to File.open.

Like File.open, a block can be accepted.



54
55
56
57
58
59
60
61
62
63
# File 'lib/bio/io/flatfile.rb', line 54

def self.open_file(filename, *arg)
  if block_given? then
    File.open(filename, *arg) do |fobj|
      yield self.new(fobj, filename)
    end
  else
    fobj = File.open(filename, *arg)
    self.new(fobj, filename)
  end
end

.open_uri(uri, *arg) ⇒ Object

Creates a new input stream wrapper from URI specified as uri. by using OpenURI.open_uri or URI#open. uri must be a String or URI object. *arg is passed to OpenURI.open_uri or URI#open.

Like OpenURI.open_uri, it can accept a block.



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/bio/io/flatfile.rb', line 71

def self.open_uri(uri, *arg)
  if uri.kind_of?(URI)
    if block_given?
      uri.open(*arg) do |fobj|
        yield self.new(fobj, uri.to_s)
      end
    else
      fobj = uri.open(*arg)
      self.new(fobj, uri.to_s)
    end
  else
    if block_given?
      OpenURI.open_uri(uri, *arg) do |fobj|
        yield self.new(fobj, uri)
      end
    else
      fobj = OpenURI.open_uri(uri, *arg)
      self.new(fobj, uri)
    end
  end
end

Instance Method Details

#closeObject

Closes the IO object if possible



103
104
105
# File 'lib/bio/io/flatfile.rb', line 103

def close
  @io.close
end

#eof?Boolean

Returns true if end-of-file. Otherwise, returns false.

Note that it returns false if internal buffer is this wrapper is not empty,

Returns:

  • (Boolean)


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

def eof?
  if @buffer.size > 0
    false
  else
    @io.eof?
  end
end

#getcObject

Same as IO#getc.



189
190
191
192
193
194
195
196
197
# File 'lib/bio/io/flatfile.rb', line 189

def getc
  if @buffer.size > 0 then
    r = @buffer[0]
    @buffer = @buffer[1..-1]
  else
    r = @io.getc
  end
  r
end

#gets(io_rs = $/) ⇒ Object

Same as IO#gets.



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/bio/io/flatfile.rb', line 141

def gets(io_rs = $/)
  if @buffer.size > 0
    if io_rs == nil then
      r = @buffer + @io.gets(nil).to_s
      @buffer = ''
    else
      if io_rs == '' then
        sp_rs = /\n\n/n
        sp_rs_orig = "\n\n"
      else
        sp_rs = Regexp.new(Regexp.escape(io_rs, 'n'), 0, 'n')
        sp_rs_orig = io_rs
      end
      a = @buffer.split(sp_rs, 2)
      if a.size > 1 then
        r = a[0] + sp_rs_orig
        @buffer = a[1]
      else
        @buffer << @io.gets(io_rs).to_s
        a = @buffer.split(sp_rs, 2)
        if a.size > 1 then
          r = a[0] + sp_rs_orig
          @buffer = a[1].to_s
        else
          r = @buffer
          @buffer = ''
        end
      end
    end
    r
  else
    @io.gets(io_rs)
  end
end

#posObject

Returns current file position



116
117
118
# File 'lib/bio/io/flatfile.rb', line 116

def pos
  @io.pos - @buffer.size
end

#pos=(p) ⇒ Object

Sets current file position if possible Internal buffer in this wrapper is cleared.



122
123
124
125
126
# File 'lib/bio/io/flatfile.rb', line 122

def pos=(p)
  r = (@io.pos = p)
  @buffer = ''
  r
end

#prefetch_bufferObject

Gets current prefetch buffer



207
208
209
# File 'lib/bio/io/flatfile.rb', line 207

def prefetch_buffer
  @buffer
end

#prefetch_gets(*arg) ⇒ Object

It does @io.gets, and addes returned string to the internal buffer, and returns the string.



213
214
215
216
217
# File 'lib/bio/io/flatfile.rb', line 213

def prefetch_gets(*arg)
  r = @io.gets(*arg)
  @buffer << r if r
  r
end

#prefetch_readpartial(*arg) ⇒ Object

It does @io.readpartial, and addes returned string to the internal buffer, and returns the string.



221
222
223
224
225
# File 'lib/bio/io/flatfile.rb', line 221

def prefetch_readpartial(*arg)
  r = @io.readpartial(*arg)
  @buffer << r if r
  r
end

#rewindObject

Rewinds the IO object if possible Internal buffer in this wrapper is cleared.



109
110
111
112
113
# File 'lib/bio/io/flatfile.rb', line 109

def rewind
  r = @io.rewind
  @buffer = ''
  r
end

#skip_spacesObject

Skips space characters in the stream. returns nil.



229
230
231
232
233
234
235
236
237
238
# File 'lib/bio/io/flatfile.rb', line 229

def skip_spaces
  ws = { ?\s => true, ?\n => true, ?\r => true, ?\t => true }
  while r = self.getc
    unless ws[r] then
      self.ungetc(r)
      break
    end
  end
  nil
end

#to_ioObject

Converts to IO object if possible



98
99
100
# File 'lib/bio/io/flatfile.rb', line 98

def to_io
  @io.to_io
end

#ungetc(c) ⇒ Object

Pushes back one character into the internal buffer. Unlike IO#getc, it can be called more than one time.



201
202
203
204
# File 'lib/bio/io/flatfile.rb', line 201

def ungetc(c)
  @buffer = sprintf("%c", c) + @buffer
  nil
end

#ungets(str) ⇒ Object

Pushes back given str to the internal buffer. Returns nil. str must be read previously with the wrapper object.

Note that in current implementation, the str can be everything, but please don’t depend on it.



183
184
185
186
# File 'lib/bio/io/flatfile.rb', line 183

def ungets(str)
  @buffer = str + @buffer
  nil
end