parse exception handling, remove info, cache change

This commit is contained in:
Bloodhunter4rc
2022-12-19 15:36:28 +01:00
parent 6380c3d462
commit 43f5a16006
3 changed files with 41 additions and 36 deletions

View File

@@ -6,7 +6,7 @@ Provides pair list fetched from a remote source
import json
import logging
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple
from typing import Any, Dict, List, Tuple
import requests
from cachetools import TTLCache
@@ -41,7 +41,7 @@ class RemotePairList(IPairList):
self._number_pairs = self._pairlistconfig['number_assets']
self._refresh_period: int = self._pairlistconfig.get('refresh_period', 1800)
self._keep_pairlist_on_failure = self._pairlistconfig.get('keep_pairlist_on_failure', True)
self._pair_cache: Optional[TTLCache] = None
self._pair_cache: TTLCache = TTLCache(maxsize=1, ttl=self._refresh_period)
self._pairlist_url = self._pairlistconfig.get('pairlist_url', '')
self._read_timeout = self._pairlistconfig.get('read_timeout', 60)
self._bearer_token = self._pairlistconfig.get('bearer_token', '')
@@ -63,28 +63,20 @@ class RemotePairList(IPairList):
"""
return f"{self.name} - {self._pairlistconfig['number_assets']} pairs from RemotePairlist."
def process_json(self, jsonparse) -> Tuple[List[str], str]:
def process_json(self, jsonparse) -> List[str]:
pairlist = jsonparse.get('pairs', [])
remote_info = jsonparse.get('info', '')[:256].strip()
remote_refresh_period = jsonparse.get('refresh_period', self._refresh_period)
remote_refresh_period = int(jsonparse.get('refresh_period', self._refresh_period))
info = "".join(char if char.isalnum() or
char in " +-.,%:" else "-" for char in remote_info)
if not self._init_done:
if self._refresh_period < remote_refresh_period:
self.log_once(f'Refresh Period has been increased from {self._refresh_period}'
f' to {remote_refresh_period} from Remote.', logger.info)
self._refresh_period = remote_refresh_period
self._pair_cache = TTLCache(maxsize=1, ttl=self._refresh_period)
else:
self._pair_cache = TTLCache(maxsize=1, ttl=self._refresh_period)
if self._refresh_period < remote_refresh_period:
self.log_once(f'Refresh Period has been increased from {self._refresh_period}'
f' to minimum allowed: {remote_refresh_period} from Remote.', logger.info)
self._refresh_period = remote_refresh_period
self._pair_cache = TTLCache(maxsize=1, ttl=remote_refresh_period)
self._init_done = True
return pairlist, info
return pairlist
def return_last_pairlist(self) -> List[str]:
if self._keep_pairlist_on_failure:
@@ -95,7 +87,7 @@ class RemotePairList(IPairList):
return pairlist
def fetch_pairlist(self) -> Tuple[List[str], float, str]:
def fetch_pairlist(self) -> Tuple[List[str], float]:
headers = {
'User-Agent': 'Freqtrade/' + __version__ + ' Remotepairlist'
@@ -104,8 +96,6 @@ class RemotePairList(IPairList):
if self._bearer_token:
headers['Authorization'] = f'Bearer {self._bearer_token}'
info = "Pairlist"
try:
response = requests.get(self._pairlist_url, headers=headers,
timeout=self._read_timeout)
@@ -114,7 +104,17 @@ class RemotePairList(IPairList):
if "application/json" in str(content_type):
jsonparse = response.json()
pairlist, info = self.process_json(jsonparse)
try:
pairlist = self.process_json(jsonparse)
except Exception as e:
if self._init_done:
pairlist = self.return_last_pairlist()
logger.warning(f'Error while processing JSON data: {type(e)}')
else:
raise OperationalException(f'Error while processing JSON data: {type(e)}')
else:
if self._init_done:
self.log_once(f'Error: RemotePairList is not of type JSON: '
@@ -131,7 +131,7 @@ class RemotePairList(IPairList):
time_elapsed = 0
return pairlist, time_elapsed, info
return pairlist, time_elapsed
def gen_pairlist(self, tickers: Tickers) -> List[str]:
"""
@@ -140,7 +140,7 @@ class RemotePairList(IPairList):
:return: List of pairs
"""
if self._init_done and self._pair_cache is not None:
if self._init_done:
pairlist = self._pair_cache.get('pairlist')
else:
pairlist = []
@@ -159,25 +159,33 @@ class RemotePairList(IPairList):
with open(filename) as json_file:
# Load the JSON data into a dictionary
jsonparse = json.load(json_file)
pairlist, info = self.process_json(jsonparse)
try:
pairlist = self.process_json(jsonparse)
except Exception as e:
if self._init_done:
pairlist = self.return_last_pairlist()
logger.warning(f'Error while processing JSON data: {type(e)}')
else:
raise OperationalException('Error while processing'
f'JSON data: {type(e)}')
else:
raise ValueError(f"{self._pairlist_url} does not exist.")
else:
# Fetch Pairlist from Remote URL
pairlist, time_elapsed, info = self.fetch_pairlist()
pairlist, time_elapsed = self.fetch_pairlist()
self.log_once(f"Fetched pairs: {pairlist}", logger.debug)
pairlist = self._whitelist_for_active_markets(pairlist)
pairlist = pairlist[:self._number_pairs]
if self._pair_cache is not None:
self._pair_cache['pairlist'] = pairlist.copy()
self._pair_cache['pairlist'] = pairlist.copy()
if time_elapsed != 0.0:
self.log_once(f'{info} Fetched in {time_elapsed} seconds.', logger.info)
self.log_once(f'Pairlist Fetched in {time_elapsed} seconds.', logger.info)
else:
self.log_once(f'{info} Fetched Pairlist.', logger.info)
self.log_once('Fetched Pairlist.', logger.info)
self._last_pairlist = list(pairlist)