def get_quote(self, code, as_json=False): """ gets the quote for a given stock code :param code: :return: dict or None :raises: HTTPError, URLError """ code = code.upper() if self.is_valid_code(code): url = self.build_url_for_quote(code) req = Request(url, None, self.headers) # this can raise HTTPError and URLError, but we are not handling it # north bound APIs should use it for exception handling res = self.opener.open(req) # for py3 compat covert byte file like object to # string file like object res = byte_adaptor(res) # Now parse the response to get the relevant data match = re.search(\ r'\{<div\s+id="responseDiv"\s+style="display:none">\s+(\{.*?\{.*?\}.*?\})', res.read(), re.S ) # ast can raise SyntaxError, let's catch only this error try: buffer = match.group(1) buffer = js_adaptor(buffer) response = self.clean_server_response(ast.literal_eval(buffer)['data'][0]) except SyntaxError as err: raise Exception('ill formatted response') else: return self.render_response(response, as_json) else: return None
def __get_quote__(code): code = code.upper() if self.is_valid_code(code): url = self.build_url_for_quote(code) res = read_url(url, self.headers) # Now parse the response to get the relevant data match = re.search( r'\{<div\s+id="responseDiv"\s+style="display:none">\s+(\{.*?\{.*?\}.*?\})', res.read(), re.S) # ast can raise SyntaxError, let's catch only this error try: buffer = match.group(1) buffer = js_adaptor(buffer) response = self.clean_server_response( ast.literal_eval(buffer)['data'][0]) except Exception as err: raise Exception('Symbol Not Traded today') else: rendered_response = self.render_response(response, as_json) # Check if the market is open (to avoid repeated network computation) return rendered_response
def test_jsadptor(self): buffer = 'abc:true, def:false, ghi:NaN, jkl:none' expected_buffer = 'abc:True, def:False, ghi:"NaN", jkl:None' ret = js_adaptor(buffer) self.assertEqual(ret, expected_buffer)