def _validate_response(self, response): """ Ensures response from IEX server is valid. Parameters ---------- response: requests.response A requests.response object Returns ------- response: Parsed JSON A json-formatted response Raises ------ ValueError If a single Share symbol is invalid IEXQueryError If the JSON response is empty or throws an error """ if response.text == "Unknown symbol": raise IEXQueryError() try: json_response = response.json(parse_int=self.json_parse_int, parse_float=self.json_parse_float) if "Error Message" in json_response: raise IEXQueryError() except ValueError: raise IEXQueryError() return json_response
def _execute_iex_query(self, url): """ Executes HTTP Request Given a URL, execute HTTP request from IEX server. If request is unsuccessful, attempt is made self.retry_count times with pause of self.pause in between. Parameters ---------- url: str A properly-formatted url Returns ------- response: requests.response Sends requests.response object to validator Raises ------ IEXQueryError If problems arise when making the query """ pause = self.pause for i in range(self.retry_count+1): response = self.session.get(url=url, params=self.params) if response.status_code == requests.codes.ok: return self._validate_response(response) time.sleep(pause) raise IEXQueryError()
def _validate_response(self, response): """ Ensures response from IEX server is valid. Parameters ---------- response: requests.response A requests.response object Returns ------- response: Parsed JSON A json-formatted response Raises ------ ValueError If a single Share symbol is invalid IEXQueryError If the JSON response is empty or throws an error """ # log the number of messages used key = "iexcloud-messages-used" if key in response.headers: msg = response.headers[key] else: msg = ("N/A") logger.info("MESSAGES USED: %s" % msg) if response.text == "Unknown symbol": raise IEXQueryError(response.status_code, response.text) try: json_response = response.json( parse_int=self.json_parse_int, parse_float=self.json_parse_float) if isinstance(json_response, str) and ("Error Message" in json_response): raise IEXQueryError(response.status_code, response.text) except ValueError: raise IEXQueryError(response.status_code, response.text) return json_response
def _output_format(self, response): if self.output_format == 'json': return response elif self.output_format == 'pandas' and self.acc_pandas: try: df = pd.DataFrame(response) return df except ValueError: raise IEXQueryError() elif self.acc_pandas is False: raise ValueError("Pandas not accepted for this function.") else: raise ValueError("Please input valid output format")
def get_available_symbols(**kwargs): """ MOVED to iexfinance.refdata.get_symbols """ import warnings warnings.warn(WNG_MSG % ("get_available_symbols", "refdata.get_symbols")) _ALL_SYMBOLS_URL = "https://api.iextrading.com/1.0/ref-data/symbols" handler = _IEXBase(**kwargs) response = handler._execute_iex_query(_ALL_SYMBOLS_URL) if not response: raise IEXQueryError("Could not download all symbols") else: return response
def _handle_error(self, response): """ Handles all responses which return an error status code """ auth_msg = "The query could not be completed. Invalid auth token." status_code = response.status_code if 400 <= status_code < 500: if status_code == 400: raise auth_error(auth_msg) else: raise IEXQueryError("The query could not be completed. " "There was a client-side error with your " "request.") elif 500 <= status_code < 600: raise auth_error("The query could not be completed. " "There was a server-side error with " "your request.") else: raise auth_error("The query could not be completed.")
def get_available_symbols(**kwargs): """ Top-level function to obtain IEX available symbols Parameters ---------- kwargs: Additional Request Parameters (see base class) Returns ------- data: list List of dictionary reference items for each symbol """ _ALL_SYMBOLS_URL = "https://api.iextrading.com/1.0/ref-data/symbols" handler = _IEXBase(**kwargs) response = handler._execute_iex_query(_ALL_SYMBOLS_URL) if not response: raise IEXQueryError("Could not download all symbols") else: return response
def _handle_error(self, response): """ Handles all responses which return an error status code """ raise IEXQueryError(response.status_code, response.text)