def fetch_data( session_id:str, session:requests.Session=None, logger:logging.Logger=None, )->Quotecast: """ Fetch data from the feed. Args: session_id (str): API's session id. session (requests.Session, optional): This object will be generated if None. Defaults to None. logger (logging.Logger, optional): This object will be generated if None. Defaults to None. Raises: BrokenPipeError: A new "session_id" is required. Returns: Quotecast: quotecast.json_data : raw JSON data string. quotecast.metadata.response_datetime : reception timestamp. quotecast.metadata.request_duration : request duration. """ if logger is None: logger = build_logger() if session is None: session = build_session() url = f'{Endpoint.URL}/{session_id}' request = requests.Request(method='GET', url=url) prepped = session.prepare_request(request=request) start_ns = time.perf_counter_ns() response = session.send(request=prepped, verify=False) # We could have used : response.elapsed.total_seconds() duration_ns = time.perf_counter_ns() - start_ns if response.text == '[{"m":"sr"}]' : raise BrokenPipeError('A new "session_id" is required.') quotecast = Quotecast() quotecast.json_data = response.text # There is no "date" header returned # We could have used : response.cookies._now quotecast.metadata.response_datetime.GetCurrentTime() quotecast.metadata.request_duration.FromNanoseconds(duration_ns) return quotecast
def test_quotecast(quotecast_api): time.sleep(random.uniform(0, 2)) request = Quotecast.Request() request.subscriptions['AAPL.BATS,E'].extend([ 'LastDate', 'LastTime', 'LastPrice', 'LastVolume', 'AskPrice', 'BidPrice', ]) quotecast_api.subscribe(request=request) quotecast = quotecast_api.fetch_data() quotecast_parser = QuotecastParser() quotecast_parser.put_quotecast(quotecast=quotecast) ticker = quotecast_parser.ticker ticker_dict = pb_handler.message_to_dict(message=ticker) metrics = ticker_dict['products']['AAPL.BATS,E']['metrics'] assert 'AAPL.BATS,E' in ticker.product_list for metric in metrics: assert isinstance(metrics[metric], float)
def rebuild_request(self) -> Quotecast.Request: """ Rebuild the request from history (self.__references). Returns: Quotecast.Request: Request matching data-stream. """ references = self.references request = Quotecast.Request() for vwd_id, metric in references.values(): request.subscriptions[vwd_id].append(metric) return request
# SETUP CONFIG DICT with open('config/config.json') as config_file: config_dict = json.load(config_file) # SETUP CREDENTIALS user_token = config_dict['user_token'] # HERE GOES YOUR USER_TOKEN # SETUP API quotecast_api = QuotecastAPI(user_token=user_token) # CONNECTION quotecast_api.connect() # SUBSCRIBE TO METRICS request = Quotecast.Request() request.subscriptions['AAPL.BATS,E'].extend([ 'LastDate', 'LastTime', 'LastPrice', 'LastVolume', 'AskPrice', 'BidPrice', ]) quotecast_api.subscribe(request=request) # SETUP JSON PARSER quotecast_parser = QuotecastParser() while True: try: