docs: def read(self, source = None, **options):
          '''
          Reads and optionally parses a single message.
          
          :Parameters:
           - `source` - optional data buffer to be read, if not specified data is 
             read from the wrapped stream
          :Options:
           - `raw` (`boolean`) - indicates whether read data should parsed or 
             returned in raw byte form
           - `numpy_temporals` (`boolean`) - if ``False`` temporal vectors are
             backed by raw q representation (:class:`.QTemporalList`, 
             :class:`.QTemporal`) instances, otherwise are represented as 
             `numpy datetime64`/`timedelta64` arrays and atoms,
             **Default**: ``False``
           
          :returns: :class:`.QMessage` - read data (parsed or raw byte form) along
                    with meta information
          '''
          message = self.read_header(source)
          message.data = self.read_data(message.size, message.is_compressed, **options)
  
          return message