code: def readline(self, size=-1):
      
      self._check_open()
      if size == 0 or not self._remaining():
        return ''
  
      data_list = []
      newline_offset = self._buffer.find_newline(size)
      while newline_offset < 0:
        data = self._buffer.read(size)
        size -= len(data)
        self._offset += len(data)
        data_list.append(data)
        if size == 0 or not self._remaining():
          return ''.join(data_list)
        self._buffer.reset(self._buffer_future.get_result())
        self._request_next_buffer()
        newline_offset = self._buffer.find_newline(size)
  
      data = self._buffer.read_to_offset(newline_offset + 1)
      self._offset += len(data)
      data_list.append(data)
  
      return ''.join(data_list)
docs: Read one line delimited by '\n' from the file.
  
      A trailing newline character is kept in the string. It may be absent when a
      file ends with an incomplete line. If the size argument is non-negative,
      it specifies the maximum string size (counting the newline) to return.
      A negative size is the same as unspecified. Empty string is returned
      only when EOF is encountered immediately.
  
      Args:
        size: Maximum number of bytes to read. If not specified, readline stops
          only on '\n' or EOF.
  
      Returns:
        The data read as a string.
  
      Raises:
        IOError: When this buffer is closed.