Ejemplo n.º 1
0
    def build_response(self, response, path=None, parser=json_decode_wrapper):
        """ Builds a List or Dict response object.

            Wrapper for a response from the DataSift REST API, can be accessed as a list.

            :param response: HTTP response to wrap
            :type response: :class:`~datasift.requests.DictResponse`
            :param parser: optional parser to overload how the data is loaded
            :type parser: func
            :raises: :class:`~datasift.exceptions.DataSiftApiException`, :class:`~datasift.exceptions.DataSiftApiFailure`, :class:`~datasift.exceptions.AuthException`, :class:`requests.exceptions.HTTPError`, :class:`~datasift.exceptions.RateLimitException`
        """
        if response.status_code != 204:
            try:
                data = parser(response.headers, response.text)
            except ValueError as e:
                raise DataSiftApiFailure(u"Unable to decode returned data: %s" % e)
            if "error" in data:
                if response.status_code == 401:
                    raise AuthException(data)
                if response.status_code == 403:
                    if int(response.headers.get("x-ratelimit-cost")) > int(response.headers.get("x-ratelimit-remaining")):
                        raise RateLimitException(data)
                raise DataSiftApiException(DictResponse(response, data))
            response.raise_for_status()
            if isinstance(data, dict):
                r = DictResponse(response, data)
            elif isinstance(data, (list, map)):
                r = ListResponse(response, data)
            outputmapper(r)
            return r

        else:
            # empty dict
            return DictResponse(response, {})
Ejemplo n.º 2
0
    def build_response(self, response, path=None, parser=json_decode_wrapper):
        """ Builds a List or Dict response object.

            Wrapper for a response from the DataSift REST API, can be accessed as a list.

            :param response: HTTP response to wrap
            :type response: :class:`~datasift.requests.DictResponse`
            :param parser: optional parser to overload how the data is loaded
            :type parser: func
            :raises: :class:`~datasift.exceptions.DataSiftApiException`, :class:`~datasift.exceptions.DataSiftApiFailure`, :class:`~datasift.exceptions.AuthException`, :class:`requests.exceptions.HTTPError`, :class:`~datasift.exceptions.RateLimitException`
        """
        if response.status_code != 204:
            try:
                data = parser(response.headers, response.text)
            except ValueError as e:
                raise DataSiftApiFailure(u"Unable to decode returned data: %s" % e)
            if "error" in data:
                if response.status_code == 401:
                    raise AuthException(data)
                if response.status_code == 403:
                    if int(response.headers.get("x-ratelimit-cost")) > int(response.headers.get("x-ratelimit-remaining")):
                        raise RateLimitException(data)
                raise DataSiftApiException(DictResponse(response, data))
            response.raise_for_status()
            if isinstance(data, dict):
                r = DictResponse(response, data)
            elif isinstance(data, (list, map)):
                r = ListResponse(response, data)
            outputmapper(r)
            return r

        else:
            # empty dict
            return DictResponse(response, {})
Ejemplo n.º 3
0
 def _on_message(self, msg, binary):  # pragma: no cover
     interaction = json.loads(msg.decode("utf8"))
     outputmapper(interaction)
     if 'data' in interaction and 'deleted' in interaction['data']:
         if not self._on_delete:
             raise DeleteRequired()  # really should never happen since we check on subscribe but just in case
         self._on_delete(interaction)
     elif 'status' in interaction:
         if self._on_ds_message:
             self._on_ds_message(interaction)
     else:
         stream = interaction['hash']
         if stream in self.subscriptions:
             self.subscriptions[stream](interaction['data'])
Ejemplo n.º 4
0
                raise DataSiftApiFailure(u"Unable to decode returned data: %s" % e)
            if "error" in data:
                if response.status_code == 401:
                    raise AuthException(data)
                if response.status_code == 403:
                    if not response.headers.get("x-ratelimit-cost"):
                        raise DataSiftApiException(DictResponse(response, data))
                    if int(response.headers.get("x-ratelimit-cost")) > int(response.headers.get("x-ratelimit-remaining")):
                        raise RateLimitException(data)
                raise DataSiftApiException(DictResponse(response, data))
            response.raise_for_status()
            if isinstance(data, dict):
                r = DictResponse(response, data)
            elif isinstance(data, (list, map)):
                r = ListResponse(response, data)
            outputmapper(r)
            return r

        else:
            # empty dict
            return DictResponse(response, {})

    # Helpers

    def path(self, *args):
        return '/'.join(a.strip('/') for a in args if a)

    def dicts(self, *dicts):
        return dict(kv for d in dicts if d for kv in d.items())