def total(self):
     if self._total_count is None:
         raise FacebookUnavailablePropertyException(
             "Couldn't retrieve the object total count for that type "
             "of request.",
         )
     return self._total_count
示例#2
0
 def summary(self):
     if self._summary is None or not isinstance(self._summary, dict):
         raise FacebookUnavailablePropertyException(
             "Couldn't retrieve the object summary for that type "
             "of request.", )
     return "<Summary> %s" % (json.dumps(
         self._summary,
         sort_keys=True,
         indent=4,
         separators=(',', ': '),
     ), )
    def extract_results(self):
        """
        If future is done, removes it from the futures list, dict and iterator itself.
        Then, if future finished successfully,

        :rtype: facebook_business.asyncobjects.AioEdgeIterator
        """
        self._request_failed = False

        # If no future in iterator and the iterator is finished, returns the iterator itself.
        if not self._future:
            if self._finished_iteration:
                return self
            raise FacebookUnavailablePropertyException("first submit new async call")

        if self._future.done():
            result = self._future.result()
            self._source_object.get_api_assured().remove_from_futures(self)
            del self._future
            self._future = None

            if self.last_error_type == "rate limit error":
                self.delay_next_call_for -= 10
                if self.delay_next_call_for < 0:
                    self.delay_next_call_for = 0
            else:
                self.delay_next_call_for = 0

            self.last_yield = time.time()
            if result.is_failure():
                self.on_error(result)
            else:
                self.on_success(result)

        else:
            if not self._future.running() and not self._future.cancelled():
                # still not running, just pending in a queue
                self._request_failed = False
                self._page_ready = False
            elif self._future.cancelled():
                # was cancelled
                self.last_yield = time.time()
                self._request_failed = True
                self.delay_next_call_for = 0
                logger.warning("request {} was cancelled, endpoint: {}, params: {}".format(
                        str(self._future), str(self._path), self.params))
                self.last_error = Exception("request {} was cancelled, endpoint: {}, params: {}".format(
                        str(self._future), str(self._path), self.params))
                self._source_object.get_api_assured().remove_from_futures(self)
                del self._future
                self._future = None
            elif int(time.time() - self.last_yield) > 600:
                # running for too long
                self.future_timed_out()
                if self.errors_streak >= 5:
                    return self
                self.last_yield = time.time()
                self.recover_tmp_error(self.last_error)
            else:
                # just running
                self._request_failed = False
                self._page_ready = False
        return self