From 0edd8d2d457df08354de8da4e954398afe85e034 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 25 Aug 2017 00:18:13 -0400 Subject: [PATCH] oh yeah --- scraper.py | 50 +++++++++++++++++++++++++++++++++++++++++++- server.py | 46 +++------------------------------------- templates/index.html | 5 +++-- 3 files changed, 55 insertions(+), 46 deletions(-) diff --git a/scraper.py b/scraper.py index 1d1c2a9..3d27fa8 100644 --- a/scraper.py +++ b/scraper.py @@ -46,6 +46,43 @@ class MWT(object): return func +class Coin(): + """A Coin, unlike Mario's.""" + + def __init__(self, ticker): + self.ticker = ticker + self.name = None + self.rank = None + self._value = None + + self.update() + + def update(self): + coins = get_coins() + print(f'Fetching data on {self.ticker}') + + self.name = coins[self.ticker]['name'] + self.rank = coins[self.ticker]['rank'] + self._usd = coins[self.ticker]['usd'] + + @property + def usd(self): + return self._usd + + @property + def btc(self): + coins = get_coins() + rate = coins['btc']['usd'] + return float(self.usd / rate) + + def value(self, coin): + """Example: BTC -> ETH""" + return (self.btc / Coin(coin).btc) + + def __repr__(self): + return f'' + + @MWT(timeout=300) def get_coins(): coins_db = OrderedDict() @@ -54,15 +91,26 @@ def get_coins(): html = pq(pq(r.content)('table')[0]).html() df = pandas.read_html("{}
".format(html)) df = pandas.concat(df) + + btc_value = float(df.to_dict()['Price'][0][1:].replace(',', '')) + for row in df.itertuples(): rank = int(row[1]) name = row[2] ticker = row[3].lower() usd = float(row[5][1:].replace(',', '')) + btc = usd / btc_value - coins_db.update({ticker: {'rank': rank, 'name': name, 'ticker': ticker, 'usd': usd}}) + coins_db.update({ticker: {'rank': rank, 'name': name, 'ticker': ticker, 'usd': usd, 'btc': btc}}) return coins_db + +def get_coin(ticker): + return Coin(ticker) + + + + diff --git a/server.py b/server.py index 4338956..21be4f5 100644 --- a/server.py +++ b/server.py @@ -1,6 +1,6 @@ import os -from scraper import get_coins +from scraper import get_coins, get_coin, Coin from wallets import wallets from flask import Flask, jsonify, render_template, request @@ -15,46 +15,6 @@ API_KEYS = os.environ.get('API_KEYS', '').split(':') db = records.Database() pro_db = records.Database(os.environ['HEROKU_POSTGRESQL_TEAL_URL']) -class Coin(): - """A Coin, unlike Mario's.""" - - def __init__(self, ticker): - self.ticker = ticker - self.name = None - self.rank = None - self._value = None - - self.update() - - def update(self): - coins = get_coins() - print(f'Fetching data on {self.ticker}') - - self.name = coins[self.ticker]['name'] - self.rank = coins[self.ticker]['rank'] - self._usd = coins[self.ticker]['usd'] - - @property - def usd(self): - return self._usd - - @property - def btc(self): - coins = get_coins() - rate = coins['btc']['usd'] - return float(self.usd / rate) - - def value(self, coin): - """Example: BTC -> ETH""" - return (self.btc / Coin(coin).btc) - - def __repr__(self): - return f'' - - -def get_coin(ticker): - return Coin(ticker) - app = Flask(__name__) app.debug = True @@ -69,7 +29,7 @@ def hello(): lbc_sc = get_exchange('lbc', 'sc') lbc_42_sc = get_exchange_value('lbc', 'sc', 42.01) - return render_template('index.html', lbc=lbc, lbc_42=lbc_42, lbc_sc=lbc_sc, lbc_42_sc=lbc_42_sc, coins=get_coins().keys()) + return render_template('index.html', lbc=lbc, lbc_42=lbc_42, lbc_sc=lbc_sc, lbc_42_sc=lbc_42_sc, coins=get_coins().values()) @app.route('/thanks') def thanks(): @@ -78,7 +38,7 @@ def thanks(): @app.route('/coins') def all_coins(): - return jsonify(coins=[k for k in get_coins().keys()]) + return jsonify(coins=get_coins()) @app.route('/') diff --git a/templates/index.html b/templates/index.html index ea4cfe8..7199c12 100644 --- a/templates/index.html +++ b/templates/index.html @@ -15,7 +15,7 @@

A Human–Friendly API Service for Crypto Currency Information.

-

This service provides machine (and human) friendly JSON data for all known crypto–currencies. All active & known coins are supported.

+

This service provides machine (and human) friendly JSON data for all known crypto–currencies. All {{ coins|length }} active & known coins are supported.

Historical data, exchange rates, conversion ratios, and value conversion endpoints are all available, free of chargeIf you enjoy this service, consider sending us a tip!. Data is refreshed every five minutes.

@@ -82,7 +82,8 @@
 {
   "coins": [{% for coin in coins %}
-    "{{ coin }}", {% endfor %}
+    "{{ coin['ticker'] }}":
+      {{ coin }},{% endfor %}
   ]
 }