Prettier code
This commit is contained in:
		
							parent
							
								
									59bab52160
								
							
						
					
					
						commit
						69c6ee4cd0
					
				@ -39,7 +39,7 @@ Print the current amount of meuros for the given amount of euros every interval-
 | 
				
			|||||||
##### When the date is set to None the current date is used. Otherwise a datetime-object is expected
 | 
					##### When the date is set to None the current date is used. Otherwise a datetime-object is expected
 | 
				
			||||||
### Cache
 | 
					### Cache
 | 
				
			||||||
Because we dont want to annoy the ecb, we cache their data while we are running and for up to an hour on disc.
 | 
					Because we dont want to annoy the ecb, we cache their data while we are running and for up to an hour on disc.
 | 
				
			||||||
#### _loadYearsTable(maxCacheSeconds=3600)
 | 
					#### reload(maxCacheSeconds=3600)
 | 
				
			||||||
Will reload the cache if it is older than maxCacheSeconds
 | 
					Will reload the cache if it is older than maxCacheSeconds
 | 
				
			||||||
## Caveats
 | 
					## Caveats
 | 
				
			||||||
The ecb only gives an estimate for the inflation of the last month and no data for the current month.  
 | 
					The ecb only gives an estimate for the inflation of the last month and no data for the current month.  
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										72
									
								
								meuro.py
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								meuro.py
									
									
									
									
									
								
							@ -6,49 +6,16 @@ from dateutil import parser as dparser
 | 
				
			|||||||
from dateutil.parser._parser import ParserError as DateParserError
 | 
					from dateutil.parser._parser import ParserError as DateParserError
 | 
				
			||||||
from collections import defaultdict
 | 
					from collections import defaultdict
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Our inflation-table as a global-var
 | 
				
			||||||
_years = None
 | 
					_years = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _loadYearsTable(maxCacheSeconds=3600):
 | 
					 | 
				
			||||||
    global _years
 | 
					 | 
				
			||||||
    if os.path.isfile('cache.json'):
 | 
					 | 
				
			||||||
        with open('cache.json', 'r') as f:
 | 
					 | 
				
			||||||
            cacheUpdate, cacheYears = json.loads(f.read())
 | 
					 | 
				
			||||||
        if (datetime.now() - dparser.isoparse(cacheUpdate)).total_seconds() < maxCacheSeconds:
 | 
					 | 
				
			||||||
            # JSON does not allow integers as keys; so we convert them back here...
 | 
					 | 
				
			||||||
            cacheYears = {int(y):{int(m):float(n) for m,n in ms.items()} for y,ms in cacheYears.items()}
 | 
					 | 
				
			||||||
            _years = defaultdict(lambda: {m:1 + 0.02/12 for m in range(1,13)}, cacheYears)
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
    _years = _loadYearsTableWeb()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def _loadYearsTableWeb():
 | 
					 | 
				
			||||||
    print('[i] Fetching new data from ECB-Servers...')
 | 
					 | 
				
			||||||
    url = 'https://sdw.ecb.europa.eu/quickviewexport.do?SERIES_KEY=122.ICP.M.U2.N.000000.4.ANR&type=csv'
 | 
					 | 
				
			||||||
    resp = requests.get(url)
 | 
					 | 
				
			||||||
    lines = resp.text.split('\n')[6:]
 | 
					 | 
				
			||||||
    years = defaultdict(lambda: {m:1 + 0.02/12 for m in range(1,13)})
 | 
					 | 
				
			||||||
    for line in lines:
 | 
					 | 
				
			||||||
        vals = line.split(',')
 | 
					 | 
				
			||||||
        year = int(vals[0][:4])
 | 
					 | 
				
			||||||
        month = datetime.strptime(vals[0][4:],'%b').month
 | 
					 | 
				
			||||||
        inflation = float(vals[1])
 | 
					 | 
				
			||||||
        years[year][month] = 1 + (inflation/100)/12
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for year in years:
 | 
					 | 
				
			||||||
        months = years[year]
 | 
					 | 
				
			||||||
        for month in range(1,13):
 | 
					 | 
				
			||||||
            if month not in months:
 | 
					 | 
				
			||||||
                years[year][month] = 1 + 0.02/12 # Lets say the ECB archives their target
 | 
					 | 
				
			||||||
    with open('cache.json', 'w') as f:
 | 
					 | 
				
			||||||
        f.write(json.dumps([datetime.now().isoformat(),years]))
 | 
					 | 
				
			||||||
    return years
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Gives you the exchange rate between euros and meuros for the given date.
 | 
					# Gives you the exchange rate between euros and meuros for the given date.
 | 
				
			||||||
# (Should always be a float < 1)
 | 
					# (Should always be a float < 1)
 | 
				
			||||||
# date should be either a datetime-object or None (= current date)
 | 
					# date should be either a datetime-object or None (= current date)
 | 
				
			||||||
def exchangeRate(date=None):
 | 
					def exchangeRate(date=None):
 | 
				
			||||||
    global _years
 | 
					    global _years
 | 
				
			||||||
    if _years==None:
 | 
					    if _years==None:
 | 
				
			||||||
        _loadYearsTable()
 | 
					        reload()
 | 
				
			||||||
    if date==None:
 | 
					    if date==None:
 | 
				
			||||||
        date = datetime.now()
 | 
					        date = datetime.now()
 | 
				
			||||||
    month, year = date.month, date.year
 | 
					    month, year = date.month, date.year
 | 
				
			||||||
@ -99,6 +66,41 @@ def _extractDate(s):
 | 
				
			|||||||
    except DateParserError:
 | 
					    except DateParserError:
 | 
				
			||||||
        return datetime.now()
 | 
					        return datetime.now()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def reload(maxCacheSeconds=3600):
 | 
				
			||||||
 | 
					    global _years
 | 
				
			||||||
 | 
					    if os.path.isfile('cache.json'):
 | 
				
			||||||
 | 
					        with open('cache.json', 'r') as f:
 | 
				
			||||||
 | 
					            cacheUpdate, cacheYears = json.loads(f.read())
 | 
				
			||||||
 | 
					        if (datetime.now() - dparser.isoparse(cacheUpdate)).total_seconds() < maxCacheSeconds:
 | 
				
			||||||
 | 
					            # JSON does not allow integers as keys; so we convert them back here...
 | 
				
			||||||
 | 
					            cacheYears = {int(y):{int(m):float(n) for m,n in ms.items()} for y,ms in cacheYears.items()}
 | 
				
			||||||
 | 
					            _years = defaultdict(lambda: {m:1 + 0.02/12 for m in range(1,13)}, cacheYears)
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					    _years = _loadYearsTableWeb()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def _loadYearsTableWeb():
 | 
				
			||||||
 | 
					    print('[i] Fetching new data from ECB-Servers...')
 | 
				
			||||||
 | 
					    url = 'https://sdw.ecb.europa.eu/quickviewexport.do?SERIES_KEY=122.ICP.M.U2.N.000000.4.ANR&type=csv'
 | 
				
			||||||
 | 
					    resp = requests.get(url)
 | 
				
			||||||
 | 
					    lines = resp.text.split('\n')[6:]
 | 
				
			||||||
 | 
					    years = defaultdict(lambda: {m:1 + 0.02/12 for m in range(1,13)})
 | 
				
			||||||
 | 
					    for line in lines:
 | 
				
			||||||
 | 
					        vals = line.split(',')
 | 
				
			||||||
 | 
					        year = int(vals[0][:4])
 | 
				
			||||||
 | 
					        month = datetime.strptime(vals[0][4:],'%b').month
 | 
				
			||||||
 | 
					        inflation = float(vals[1])
 | 
				
			||||||
 | 
					        years[year][month] = 1 + (inflation/100)/12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for year in years:
 | 
				
			||||||
 | 
					        months = years[year]
 | 
				
			||||||
 | 
					        for month in range(1,13):
 | 
				
			||||||
 | 
					            if month not in months:
 | 
				
			||||||
 | 
					                years[year][month] = 1 + 0.02/12 # Lets say the ECB archives their target
 | 
				
			||||||
 | 
					    with open('cache.json', 'w') as f:
 | 
				
			||||||
 | 
					        f.write(json.dumps([datetime.now().isoformat(),years]))
 | 
				
			||||||
 | 
					    return years
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def cliInterface():
 | 
					def cliInterface():
 | 
				
			||||||
    import sys, re
 | 
					    import sys, re
 | 
				
			||||||
    arg = " ".join(sys.argv[1:]).replace(',','')
 | 
					    arg = " ".join(sys.argv[1:]).replace(',','')
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user