Skip to content

Commit 503e35c

Browse files
committed
Refactored logging
1 parent 96dc857 commit 503e35c

File tree

6 files changed

+110
-135
lines changed

6 files changed

+110
-135
lines changed

RatesBot/DB/RatesDB.py

+7-38
Original file line numberDiff line numberDiff line change
@@ -25,86 +25,55 @@
2525
from RatesBot.Tools.ScreenColors import clr
2626
import RatesBot.Config as cfg
2727

28-
ratesdb_logger = colorlog.getLogger('RatesBot.RatesDB')
29-
30-
class RatesDB():
28+
class RatesDB(Logger):
3129

3230
def __init__(self, *args, **kwargs):
31+
super(RatesDB, self).__init__(*args, **kwargs)
3332

34-
35-
self.db_uname = kwargs['db_uname'] if (kwargs.get('db_uname') is not None) else "ratesuser"
36-
self.db_pass = kwargs['db_pass'] if (kwargs.get('db_pass') is not None) else "ratesuserpass"
37-
self.db_host = kwargs['db_host'] if (kwargs.get('db_host') is not None) else "localhost"
38-
self.db_name = kwargs['db_name'] if (kwargs.get('db_name') is not None) else "ratesdb"
33+
self.db_uname = self.init_kwarg('db_uname', default="ratesuser")
34+
self.db_pass = self.init_kwarg('db_pass', default="ratesuserpass")
35+
self.db_host = self.init_kwarg('db_host', default="localhost")
36+
self.db_name = self.init_kwarg('db_name', default="ratesdb")
3937

4038
self.conn_str = "mysql+mysqldb://{}:{}@{}/{}?charset=utf8mb4".format(self.db_uname, self.db_pass, self.db_host, self.db_name)
41-
4239
self.engine = create_engine(self.conn_str)
43-
4440
self.base = Base
45-
4641
self.base.metadata.create_all(self.engine)
47-
4842
self.session = scoped_session( sessionmaker(bind=self.engine) )
4943

50-
5144
def __get_service_inst(self, service):
5245

5346
'''Get the instance of a service from the database, create it if it does not exist by name.'''
5447

5548
service_inst = self.session.query(Service).filter_by(name=service.service_name).first()
5649

57-
58-
5950
if service_inst is None:
60-
6151
new_service = self.__add_service(service_name=service.service_name, url=service.url)
62-
6352
return new_service
64-
6553
else:
66-
6754
return service_inst
6855

69-
70-
7156
def __add_service(self, service_name, url):
7257
'''Insert a new service in the databse'''
7358

7459
inst = Service(name=service_name, url=url)
75-
7660
self.session.add(inst)
7761

7862
return inst
7963

80-
81-
8264
def get_last_rates(self, service):
8365
'''Query the database to get the last row inserted into the database'''
8466

8567
service_inst = self.__get_service_inst(service)
86-
87-
#last_insert = self.session.query(Rate).filter_by(id=select([func.max(Rate.id)])).one()
88-
8968
last_insert = self.session.query(Rate).filter(Rate.id == self.session.query(func.max(Rate.id)).filter(Rate.service_id==service_inst.id)).one()
9069

9170
return [last_insert.rate_morning,last_insert.rate_evening]
9271

93-
94-
9572
def insert_rate(self, service):
9673
'''Insert rates into the database, which were queried from the service'''
9774

9875
service_inst = self.__get_service_inst(service)
99-
10076
service_inst.rates.append(Rate(rate_morning=service.rate_morning, rate_evening=service.rate_evening))
101-
10277
self.session.commit()
103-
104-
return service_inst
10578

106-
107-
108-
109-
110-
79+
return service_inst

RatesBot/Main.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@
2020

2121
import schedule
2222
import time
23-
from Rates.GetRates import check_rates
23+
from Rates.GetRates import RateChecker
2424

2525
def main(freq_mins=5):
2626

27-
check_rates()
28-
schedule.every(freq_mins).minutes.do(check_rates)
27+
rates = RateChecker(debug_level='d')
28+
rates.check_rates()
29+
schedule.every(freq_mins).minutes.do(rates.check_rates)
2930

3031
while 1:
3132

RatesBot/Rates/GetRates.py

+22-23
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,31 @@
2222
import telegram
2323
import RatesBot.Config as cfg
2424

25-
Rates_logger = colorlog.getLogger('RatesBot.GetRates')
26-
#Service_logger.setLevel(logging.DEBUG)
25+
class RateChecker(Logger):
2726

28-
bot = telegram.Bot(token=cfg.bot_token)
29-
chat_id = cfg.chat_id
27+
def __init__(self, *args, **kwargs):
28+
super(RateChecker, self).__init__(*args, **kwargs)
3029

30+
self.bot = telegram.Bot(token=cfg.bot_token)
31+
self.chat_id = cfg.chat_id
3132

32-
33-
def check_rates():
34-
'''
35-
Execute scraping and parsing of each service. If rates have changed since last checking, send a telegram message.
36-
This is done for each of the services implemented as a dervied class of the ServiceBase class.
37-
'''
38-
39-
for service in ServiceBase.__subclasses__():
40-
41-
srv = service(total_units = cfg.total_units)
42-
43-
srv.get_rates()
44-
45-
if srv.rates_changed():
46-
Rates_logger.info("Rates changed: {}".format(srv.service_name))
47-
Rates_logger.info("Sending Message: {}".format(srv.prices_text))
48-
bot.send_message(chat_id=chat_id, text=srv.prices_text)
49-
else:
50-
Rates_logger.info("Rates not Changed ({})".format(srv.service_name))
33+
def check_rates(self):
34+
'''
35+
Execute scraping and parsing of each service. If rates have changed since last checking, send a telegram message.
36+
This is done for each of the services implemented as a dervied class of the ServiceBase class.
37+
'''
38+
39+
for service in ServiceBase.__subclasses__():
40+
41+
srv = service(total_units = cfg.total_units, debug_level=self.debug_level)
42+
srv.get_rates()
43+
44+
if srv.rates_changed():
45+
self.logger.info("Rates changed: {}".format(srv.service_name))
46+
self.logger.info("Sending Message: {}".format(srv.prices_text))
47+
self.bot.send_message(chat_id=self.chat_id, text=srv.prices_text)
48+
else:
49+
self.logger.info("Rates not Changed ({})".format(srv.service_name))
5150

5251

5352

RatesBot/Services/Service.py

+15-70
Original file line numberDiff line numberDiff line change
@@ -17,46 +17,29 @@
1717
#
1818
# You should have received a copy of the GNU General Public License along with this program.
1919
# If not, see <https://www.gnu.org/licenses/>
20-
2120
from RatesBot.Tools.LoggerLib import *
2221
from RatesBot.Tools.ScreenColors import clr
2322
from bs4 import BeautifulSoup
2423
import urllib2
25-
2624
from RatesBot.DB.RatesDB import RatesDB
27-
2825
import RatesBot.Config as cfg
2926

30-
Service_logger = colorlog.getLogger('RatesBot.Service')
31-
#Service_logger.setLevel(logging.DEBUG)
32-
33-
34-
class ServiceBase(object):
27+
class ServiceBase(Logger):
3528
'''Common base class for all services that provide rates'''
3629

3730
def __init__(self, *args, **kwargs):
38-
39-
40-
self.url = kwargs['url']
41-
42-
self.service_name = kwargs['service_name']
43-
44-
self.total_units = kwargs['total_units'] if (kwargs.get('total_units') is not None) else 1
31+
super(ServiceBase, self).__init__(*args, **kwargs)
4532

33+
self.url = self.init_kwarg('url')
34+
self.service_name = self.init_kwarg('service_name')
35+
self.total_units = self.init_kwarg('total_units', default=1)
4636
self.page = ""
47-
4837
self.soup = ""
49-
5038
self._rate_morning = 0.00
51-
5239
self._rate_evening = 0.00
53-
5440
self._prices_text = ""
55-
5641
self.db = RatesDB(db_uname=cfg.db['uname'],db_pass=cfg.db['pass'],db_host=cfg.db['host'],db_name=cfg.db['name'])
57-
5842
self.user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'
59-
6043
self.headers = {'User-Agent':self.user_agent,}
6144

6245
@property
@@ -82,124 +65,94 @@ def current_value_morning(self):
8265

8366
@property
8467
def current_value_evening(self):
85-
8668
return self.total_units*self._rate_evening
8769

88-
89-
9070
@property
9171
def value_text_morning(self):
92-
9372
return "\n\nTotal Value ({} units @ {}) : {}".format(self.total_units, self._rate_morning, self.current_value_morning)
9473

95-
9674
@property
9775
def value_text_evening(self):
98-
9976
return "\n\nTotal Value ({} units @ {}) : {}".format(self.total_units, self._rate_evening, self.current_value_evening)
10077

101-
10278
@property
10379
def value_text(self):
104-
10580
return self.value_text_morning + self.value_text_evening
10681

10782
@property
10883
def prices_text(self):
109-
11084
return self._prices_text + self.value_text
11185

112-
11386
def __read_url(self):
11487

115-
Service_logger.info("Reading website: {}".format(self.url))
88+
self.logger.info("Reading website: {}".format(self.url))
11689
req = urllib2.Request(self.url, headers=self.headers)
11790
self.page = urllib2.urlopen(req)
11891

11992
def __parse_html(self):
12093

121-
Service_logger.info("Parsing HTML: {}".format(self.url))
94+
self.logger.info("Parsing HTML: {}".format(self.url))
12295

12396
self.soup = BeautifulSoup(self.page.read(),features="html.parser")
12497

125-
126-
12798
def db_save(self):
12899
'''Save rates to the database'''
129100

130101
self.db.insert_rate(self)
131-
132102
self.db.session.close()
133-
134103
self.db.session.remove()
135-
136-
Service_logger.info("Rates saved to Database")
137-
104+
self.logger.info("Rates saved to Database")
138105

139106
def db_last_rates(self):
140107
'''Get the last rates inserted in the DB for the service'''
141-
142-
Service_logger.debug("Getting last saved rates from the DB")
143108

144109
last_rates = self.db.get_last_rates(self)
145-
146110
self.db.session.close()
147-
148111
self.db.session.remove()
149-
150-
Service_logger.debug("Last rates from DB: {}".format(str(last_rates)))
112+
self.logger.debug("Last rates from DB: {}".format(str(last_rates)))
151113

152114
return last_rates
153-
154-
155-
115+
156116
def get_rates(self):
157117
'''
158118
Retreive rates from a provider.
159119
This method should be implemented for each of the derived classes that will be implemented for each of the service.
160120
It should populate the fields - _prices_text, _rate_morning and _rate_evening after scraping the service and return prices_text
161121
'''
162-
163122
self.__read_url()
164-
165123
self.__parse_html()
166124

167125
def rates_changed(self):
168126
'''Check latest rates from a service and compare to saved rates from last time the rates were checked.'''
169127

128+
self.logger.debug("Current rates from {} : {}".format(self.service_name, "[{}, {}]".format(self.rate_morning,self.rate_evening)))
129+
170130
if [self.rate_morning,self.rate_evening] == self.db_last_rates():
171131
return False
172132
else:
173-
174133
self.db_save()
175134

176135
return True
177-
178-
136+
179137
def format_rate(self, rate):
180-
181138
return 0.00 if (rate == "" or rate == "-") else float(rate.split()[0])
182139

183140

184141
class KTRates(ServiceBase):
185142
'''Class derived from ServiceBase. Retrieves gold rates from www.khaleejtimes.com'''
186-
143+
187144
def __init__(self, *args, **kwargs):
188145

189146
url = "http://www.khaleejtimes.com/gold-forex/"
190-
191147
service_name = "Khaleej Times"
192-
193148
super(KTRates, self).__init__(url=url, service_name=service_name, *args, **kwargs)
194149

195-
196-
197150
def get_rates(self):
198151

199152
super(KTRates, self).get_rates()
200153

201154
for i in self.soup.findAll('tr',{'class':'gold_r1'}):
202-
155+
203156
if "22" in i.td.text:
204157
rates = i.text.replace(" ","").replace("\r\n","").strip().split("\n")
205158
break
@@ -213,7 +166,6 @@ def get_rates(self):
213166
self._prices_text += "\nMorning - {}\nEvening - {}\nYesterday - {}".format(rates[1], rates[2], rates[3])
214167

215168
self._rate_morning = self.format_rate(rates[1])
216-
217169
self._rate_evening = self.format_rate(rates[2])
218170

219171
return self.prices_text
@@ -224,25 +176,18 @@ class GPDRates(ServiceBase):
224176
def __init__(self, *args, **kwargs):
225177

226178
url = "http://www.goldpricesdubai.com/"
227-
228179
service_name = "Gold Prices Dubai"
229-
230180
super(GPDRates, self).__init__(url=url, service_name=service_name, *args, **kwargs)
231181

232182

233183
def get_rates(self):
234184

235185
super(GPDRates, self).get_rates()
236186

237-
238187
rates = [txt.text for txt in self.soup.findAll('table',{'class':'now'})[0].findChildren('tr')[6].findChildren('td')]
239-
240188
self._prices_text += "\n{} gold prices updated\n".format(self.service_name)
241-
242189
self._prices_text += "\nMorning - {}\nEvening - {}".format(rates[0],rates[1])
243-
244190
self._rate_morning = self.format_rate(rates[0])
245-
246191
self._rate_evening = self.format_rate(rates[1])
247192

248193
return self.prices_text

0 commit comments

Comments
 (0)