docs: def _refresh_state(self):
      """ Get the state of a job. If the job is complete this does nothing;
          otherwise it gets a refreshed copy of the job resource.
      """
      # TODO(gram): should we put a choke on refreshes? E.g. if the last call was less than
      # a second ago should we return the cached value?
      if self._is_complete:
        return
  
      try:
        response = self._api.jobs_get(self._job_id)
      except Exception as e:
        raise e
  
      if 'status' in response:
        status = response['status']
        if 'state' in status and status['state'] == 'DONE':
          self._end_time = datetime.datetime.utcnow()
          self._is_complete = True
          self._process_job_status(status)
  
      if 'statistics' in response:
        statistics = response['statistics']
        start_time = statistics.get('creationTime', None)
        end_time = statistics.get('endTime', None)
        if start_time and end_time and end_time >= start_time:
          self._start_time = datetime.datetime.fromtimestamp(float(start_time) / 1000.0)
          self._end_time = datetime.datetime.fromtimestamp(float(end_time) / 1000.0)