docs: def encode_timeseries_put(self, tsobj):
          """
          Fills an TsPutReq message with the appropriate data and
          metadata from a TsObject.
  
          :param tsobj: a TsObject
          :type tsobj: TsObject
          :param req: the protobuf message to fill
          :type req: riak.pb.riak_ts_pb2.TsPutReq
          """
          req = riak.pb.riak_ts_pb2.TsPutReq()
          req.table = str_to_bytes(tsobj.table.name)
  
          if tsobj.columns:
              raise NotImplementedError("columns are not implemented yet")
  
          if tsobj.rows and isinstance(tsobj.rows, list):
              for row in tsobj.rows:
                  tsr = req.rows.add()  # NB: type TsRow
                  if not isinstance(row, list):
                      raise ValueError("TsObject row must be a list of values")
                  for cell in row:
                      tsc = tsr.cells.add()  # NB: type TsCell
                      self.encode_to_ts_cell(cell, tsc)
          else:
              raise RiakError("TsObject requires a list of rows")
  
          mc = riak.pb.messages.MSG_CODE_TS_PUT_REQ
          rc = riak.pb.messages.MSG_CODE_TS_PUT_RESP
          return Msg(mc, req.SerializeToString(), rc)