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, {})
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'])
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())