From 006e97a8bedfd9cf875428481a9fe62c621be468 Mon Sep 17 00:00:00 2001 From: Laurent Bachelier Date: Wed, 14 Mar 2012 03:24:02 +0100 Subject: [PATCH] PEP8 style fixes and other small style fixes I used autopep8 on some files and did carefully check the changes. I ignored E501,E302,E231,E225,E222,E221,E241,E203 in my search, and at least E501 on any autopep8 run. Other style fixes not related to PEP8: * Only use new-style classes. I don't think the usage of old-style classes was voluntary. Old-style classes are removed in Python 3. * Convert an if/else to a one-liner in mediawiki, change docstring style change to a comment something that wasn't really appropriate for a docstring. * Unneeded first if condition in meteofrance --- modules/aum/backend.py | 2 +- modules/aum/captcha.py | 6 +- modules/aum/contact.py | 22 ++- modules/aum/optim/priority_connection.py | 6 +- modules/aum/optim/profiles_walker.py | 6 +- modules/aum/test.py | 1 - modules/batoto/backend.py | 3 +- modules/batoto/test.py | 3 +- modules/boursorama/backend.py | 1 - modules/boursorama/browser.py | 6 +- modules/boursorama/pages/__init__.py | 3 +- modules/boursorama/pages/accounts_list.py | 50 +++---- modules/boursorama/pages/login.py | 2 +- modules/bp/browser.py | 2 +- modules/bp/pages/accounthistory.py | 2 +- modules/canalplus/video.py | 1 + modules/cmb/backend.py | 16 +-- modules/cragr/pages/accounts_list.py | 6 +- modules/creditmutuel/browser.py | 23 ++-- modules/dlfp/pages/news.py | 2 +- modules/eatmanga/backend.py | 3 +- modules/eatmanga/test.py | 3 +- modules/ehentai/backend.py | 2 +- modules/ehentai/browser.py | 3 +- modules/ehentai/pages.py | 6 +- modules/ehentai/test.py | 2 +- modules/fourchan/backend.py | 2 +- modules/hds/pages.py | 6 +- modules/inrocks/tools.py | 10 +- modules/izneo/backend.py | 10 +- modules/lcl/backend.py | 1 - modules/lcl/pages.py | 27 ++-- modules/lefigaro/pages/article.py | 2 +- modules/lefigaro/pages/flashactu.py | 4 +- modules/lefigaro/pages/simple.py | 3 +- modules/lefigaro/pages/special.py | 4 +- modules/lefigaro/tools.py | 10 +- modules/mangafox/backend.py | 3 +- modules/mangafox/test.py | 2 + modules/mangahere/backend.py | 3 +- modules/mangahere/test.py | 3 +- modules/mangareader/backend.py | 4 +- modules/mangareader/test.py | 3 +- modules/mediawiki/backend.py | 2 + modules/mediawiki/browser.py | 31 ++--- modules/meteofrance/pages/meteo.py | 9 +- modules/minutes20/backend.py | 2 +- modules/minutes20/pages/article.py | 4 +- modules/minutes20/pages/simple.py | 2 +- modules/minutes20/tools.py | 11 +- modules/newsfeed/test.py | 4 +- modules/nolifetv/pages/video.py | 3 +- modules/opacwebaloes/backend.py | 1 - modules/opacwebaloes/browser.py | 7 +- modules/orange/pages/compose.py | 11 +- modules/pastealacon/backend.py | 6 +- modules/simplyreadit/backend.py | 3 +- modules/simplyreadit/test.py | 3 +- modules/societegenerale/captcha.py | 11 +- modules/societegenerale/pages/__init__.py | 4 +- modules/societegenerale/pages/login.py | 5 +- modules/transilien/pages/station.py | 3 - modules/youjizz/pages/video.py | 1 - modules/youporn/backend.py | 1 + modules/youtube/pages.py | 6 +- setup.py | 26 ++-- tools/make_man.py | 20 ++- weboob/__init__.py | 1 - weboob/applications/__init__.py | 1 - weboob/applications/boobank/boobank.py | 10 +- .../applications/masstransit/masstransit.py | 10 +- .../applications/qwebcontentedit/__init__.py | 3 +- .../qwebcontentedit/qwebcontentedit.py | 3 +- .../applications/weboobrepos/weboobrepos.py | 9 +- weboob/capabilities/base.py | 3 +- weboob/capabilities/contact.py | 14 +- weboob/core/backendscfg.py | 8 +- weboob/core/repositories.py | 2 +- weboob/tools/__init__.py | 1 - weboob/tools/application/__init__.py | 1 - .../tools/application/formatters/__init__.py | 1 - .../application/formatters/iformatter.py | 2 +- .../formatters/webkit/webkitgtk.py | 6 +- weboob/tools/backend.py | 6 +- weboob/tools/capabilities/__init__.py | 1 - .../gallery/genericcomicreader.py | 5 +- .../capabilities/messages/GenericBackend.py | 9 +- .../capabilities/messages/genericArticle.py | 18 ++- weboob/tools/captcha/virtkeyboard.py | 130 +++++++++--------- weboob/tools/config/iconfig.py | 2 +- weboob/tools/decorators.py | 5 +- weboob/tools/log.py | 4 +- weboob/tools/misc.py | 3 + weboob/tools/newsfeed.py | 19 +-- weboob/tools/ordereddict.py | 1 - weboob/tools/parsers/__init__.py | 10 +- weboob/tools/parsers/html5libparser.py | 4 +- weboob/tools/property.py | 40 +++--- weboob/tools/storage.py | 2 +- 99 files changed, 440 insertions(+), 349 deletions(-) diff --git a/modules/aum/backend.py b/modules/aum/backend.py index e286817b..592799db 100644 --- a/modules/aum/backend.py +++ b/modules/aum/backend.py @@ -298,7 +298,7 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh yield thread.root except BrowserUnavailable, e: self.logger.debug('No messages, browser is unavailable: %s' % e) - pass # don't care about waiting + pass # don't care about waiting def set_message_read(self, message): if message.id == self.MAGIC_ID_BASKET: diff --git a/modules/aum/captcha.py b/modules/aum/captcha.py index c9806088..f235c6cf 100644 --- a/modules/aum/captcha.py +++ b/modules/aum/captcha.py @@ -24,7 +24,7 @@ import Image class CaptchaError(Exception): pass -class Tile: +class Tile(object): hash = { 'bc8d52d96058478a6def26226145d53b': 'A', 'c62ecdfddb72b2feaed96cd9fe7c2802': 'A', @@ -111,7 +111,7 @@ class Tile: print 'hash: %s' % checksum raise CaptchaError() -class Captcha: +class Captcha(object): def __init__(self, f): self.img = Image.open(f) self.w, self.h = self.img.size @@ -152,7 +152,7 @@ class Captcha: s += tile.letter return s -class Decoder: +class Decoder(object): def __init__(self): self.hash = {} diff --git a/modules/aum/contact.py b/modules/aum/contact.py index f90fbca2..c0ff46ad 100644 --- a/modules/aum/contact.py +++ b/modules/aum/contact.py @@ -26,7 +26,8 @@ from weboob.tools.ordereddict import OrderedDict from weboob.capabilities.contact import Contact as _Contact, ProfileNode from weboob.tools.misc import html2text -class FieldBase: + +class FieldBase(object): def __init__(self, key, key2=None): self.key = key self.key2 = key2 @@ -34,18 +35,22 @@ class FieldBase: def get_value(self, value, consts): raise NotImplementedError() + class FieldStr(FieldBase): def get_value(self, profile, consts): return html2text(unicode(profile[self.key])).strip() + class FieldBool(FieldBase): def get_value(self, profile, consts): return bool(int(profile[self.key])) + class FieldDist(FieldBase): def get_value(self, profile, consts): return '%.2f km' % float(profile[self.key]) + class FieldIP(FieldBase): def get_hostname(self, s): try: @@ -59,6 +64,7 @@ class FieldIP(FieldBase): s += ' (first %s)' % self.get_hostname(profile[self.key2]) return s + class FieldProfileURL(FieldBase): def get_value(self, profile, consts): id = int(profile[self.key]) @@ -67,10 +73,12 @@ class FieldProfileURL(FieldBase): else: return '' + class FieldPopu(FieldBase): def get_value(self, profile, consts): return unicode(profile['popu'][self.key]) + class FieldPopuRatio(FieldBase): def get_value(self, profile, consts): v1 = float(profile['popu'][self.key]) @@ -80,15 +88,18 @@ class FieldPopuRatio(FieldBase): else: return '%.2f' % (v1 / v2) + class FieldOld(FieldBase): def get_value(self, profile, consts): birthday = parse_dt(profile[self.key]) return int((datetime.now() - birthday).days / 365.25) + class FieldSplit(FieldBase): def get_value(self, profile, consts): return [html2text(s).strip() for s in profile[self.key].split(self.key2) if len(s.strip()) > 0] + class FieldBMI(FieldBase): def __init__(self, key, key2, fat=False): FieldBase.__init__(self, key, key2) @@ -100,7 +111,7 @@ class FieldBMI(FieldBase): if height == 0 or weight == 0: return '' - bmi = (weight/float(pow(height/100.0, 2))) + bmi = (weight / float(pow(height / 100.0, 2))) if not self.fat: return bmi elif bmi < 15.5: @@ -114,6 +125,7 @@ class FieldBMI(FieldBase): else: return 'obese' + class FieldFlags(FieldBase): def get_value(self, profile, consts): i = int(profile[self.key]) @@ -123,6 +135,7 @@ class FieldFlags(FieldBase): labels.append(html2text(d['label']).strip()) return labels + class FieldList(FieldBase): def get_value(self, profile, consts): i = int(profile[self.key]) @@ -131,6 +144,7 @@ class FieldList(FieldBase): return html2text(d['label']).strip() return '' + class Contact(_Contact): TABLE = OrderedDict(( ('_info', OrderedDict(( @@ -247,9 +261,9 @@ class Contact(_Contact): if node.flags & node.SECTION: result += u'\t' * level + node.label + '\n' for sub in node.value.itervalues(): - result += print_node(sub, level+1) + result += print_node(sub, level + 1) else: - if isinstance(node.value, (tuple,list)): + if isinstance(node.value, (tuple, list)): value = ', '.join(unicode(v) for v in node.value) elif isinstance(node.value, float): value = '%.2f' % node.value diff --git a/modules/aum/optim/priority_connection.py b/modules/aum/optim/priority_connection.py index d88844c7..5405f6c1 100644 --- a/modules/aum/optim/priority_connection.py +++ b/modules/aum/optim/priority_connection.py @@ -124,9 +124,9 @@ class PriorityConnection(Optimization): browser = AuMBrowser('%s@%s' % (name, self.config['domain']), proxy=self.browser.proxy) try: browser.register(password= password, - sex= 1, #slut - birthday_d= random.randint(1,28), - birthday_m= random.randint(1,12), + sex= 1, # slut + birthday_d= random.randint(1, 28), + birthday_m= random.randint(1, 12), birthday_y= random.randint(1975, 1990), zipcode= 75001, country= 'fr', diff --git a/modules/aum/optim/profiles_walker.py b/modules/aum/optim/profiles_walker.py index 2744510c..7d23a34a 100644 --- a/modules/aum/optim/profiles_walker.py +++ b/modules/aum/optim/profiles_walker.py @@ -49,7 +49,7 @@ class ProfilesWalker(Optimization): def start(self): self.walk_cron = self.sched.repeat(60, self.enqueue_profiles) - self.view_cron = self.sched.schedule(randint(10,40), self.view_profile) + self.view_cron = self.sched.schedule(randint(10, 40), self.view_profile) return True def stop(self): @@ -77,7 +77,7 @@ class ProfilesWalker(Optimization): try: id = self.profiles_queue.pop() except KeyError: - return # empty queue + return # empty queue try: with self.browser: @@ -101,4 +101,4 @@ class ProfilesWalker(Optimization): print e finally: if self.view_cron is not None: - self.view_cron = self.sched.schedule(randint(10,40), self.view_profile) + self.view_cron = self.sched.schedule(randint(10, 40), self.view_profile) diff --git a/modules/aum/test.py b/modules/aum/test.py index 61ed574e..b4bf6ac2 100644 --- a/modules/aum/test.py +++ b/modules/aum/test.py @@ -22,7 +22,6 @@ from weboob.tools.test import BackendTest from weboob.tools.browser import BrowserUnavailable - __all__ = ['AuMTest'] diff --git a/modules/batoto/backend.py b/modules/batoto/backend.py index 1d8ca2b0..5eb69c69 100644 --- a/modules/batoto/backend.py +++ b/modules/batoto/backend.py @@ -21,6 +21,7 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicRea __all__ = ['BatotoBackend'] + class BatotoBackend(GenericComicReaderBackend): NAME = 'batoto' DESCRIPTION = 'Batoto manga reading website' @@ -31,4 +32,4 @@ class BatotoBackend(GenericComicReaderBackend): ID_REGEXP = r'[^/]+/[^/]+' URL_REGEXP = r'.+batoto.(?:com|net)/read/_/(%s).+' % ID_REGEXP ID_TO_URL = 'http://www.batoto.net/read/_/%s' - PAGES = { URL_REGEXP: DisplayPage } + PAGES = {URL_REGEXP: DisplayPage} diff --git a/modules/batoto/test.py b/modules/batoto/test.py index 54b57b75..b715bc95 100644 --- a/modules/batoto/test.py +++ b/modules/batoto/test.py @@ -19,8 +19,9 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicReaderTest + class BatotoTest(GenericComicReaderTest): BACKEND = 'batoto' + def test_download(self): return self._test_download('26287/yurumates_ch4_by_primitive-scans') - diff --git a/modules/boursorama/backend.py b/modules/boursorama/backend.py index 02dcc170..236519f0 100644 --- a/modules/boursorama/backend.py +++ b/modules/boursorama/backend.py @@ -70,4 +70,3 @@ class BoursoramaBackend(BaseBackend, ICapBank): with self.browser: for coming in self.browser.get_coming_operations(account): yield coming - diff --git a/modules/boursorama/browser.py b/modules/boursorama/browser.py index 30e4f66d..4a362840 100644 --- a/modules/boursorama/browser.py +++ b/modules/boursorama/browser.py @@ -32,7 +32,7 @@ __all__ = ['Boursorama'] class Boursorama(BaseBrowser): DOMAIN = 'www.boursorama.com' PROTOCOL = 'https' - ENCODING = None # refer to the HTML encoding + ENCODING = None # refer to the HTML encoding PAGES = { '.*connexion.phtml.*': LoginPage, '.*/comptes/synthese.phtml': AccountsList, @@ -84,11 +84,11 @@ class Boursorama(BaseBrowser): self.location(account._link_id) operations = self.page.get_operations() # load last month as well - target = date.today() - relativedelta( months = 1 ) + target = date.today() - relativedelta(months=1) self.location(account._link_id + ("&month=%d&year=%d" % (target.month, target.year))) operations += self.page.get_operations() # and the month before, just in case you're greedy - target = date.today() - relativedelta( months = 2 ) + target = date.today() - relativedelta(months=2) self.location(account._link_id + ("&month=%d&year=%d" % (target.month, target.year))) operations += self.page.get_operations() for index, op in enumerate(operations): diff --git a/modules/boursorama/pages/__init__.py b/modules/boursorama/pages/__init__.py index 43bbcfc0..238809d9 100644 --- a/modules/boursorama/pages/__init__.py +++ b/modules/boursorama/pages/__init__.py @@ -23,7 +23,8 @@ from .account_history import AccountHistory from .accounts_list import AccountsList from .login import LoginPage -class AccountPrelevement(AccountsList): pass +class AccountPrelevement(AccountsList): + pass __all__ = ['LoginPage', 'AccountsList', diff --git a/modules/boursorama/pages/accounts_list.py b/modules/boursorama/pages/accounts_list.py index 9aa3e9dd..e5d22506 100644 --- a/modules/boursorama/pages/accounts_list.py +++ b/modules/boursorama/pages/accounts_list.py @@ -22,8 +22,8 @@ from weboob.capabilities.bank import Account from weboob.tools.browser import BasePage -class AccountsList(BasePage): +class AccountsList(BasePage): def on_loaded(self): pass @@ -34,34 +34,34 @@ class AccountsList(BasePage): for tr in div.getiterator('tr'): account = Account() for td in tr.getiterator('td'): - if td.attrib.get('class', '') == 'account-cb': - break + if td.attrib.get('class', '') == 'account-cb': + break - elif td.attrib.get('class', '') == 'account-name': - a = td.find('a') - account.label = a.text - account._link_id = a.get('href', '') + elif td.attrib.get('class', '') == 'account-name': + a = td.find('a') + account.label = a.text + account._link_id = a.get('href', '') - elif td.attrib.get('class', '') == 'account-number': - id = td.text - id = id.strip(u' \n\t') - account.id = id + elif td.attrib.get('class', '') == 'account-number': + id = td.text + id = id.strip(u' \n\t') + account.id = id - elif td.attrib.get('class', '') == 'account-total': - span = td.find('span') - if span == None: - balance = td.text - else: - balance = span.text - balance = balance.strip(u' \n\t€+').replace(',','.').replace(' ','') - if balance != "": - account.balance = float(balance) - else: - account.balance = 0.0 + elif td.attrib.get('class', '') == 'account-total': + span = td.find('span') + if span == None: + balance = td.text + else: + balance = span.text + balance = balance.strip(u' \n\t€+').replace(',', '.').replace(' ', '') + if balance != "": + account.balance = float(balance) + else: + account.balance = 0.0 else: - # because of some weird useless - if account.id != 0: - l.append(account) + # because of some weird useless + if account.id != 0: + l.append(account) return l diff --git a/modules/boursorama/pages/login.py b/modules/boursorama/pages/login.py index 98fe2f54..b4f5374b 100644 --- a/modules/boursorama/pages/login.py +++ b/modules/boursorama/pages/login.py @@ -26,7 +26,7 @@ __all__ = ['LoginPage'] class LoginPage(BasePage): def on_loaded(self): - pass + pass # for td in self.document.getroot().cssselect('td.LibelleErreur'): # if td.text is None: # continue diff --git a/modules/bp/browser.py b/modules/bp/browser.py index fc42cc99..e7518989 100644 --- a/modules/bp/browser.py +++ b/modules/bp/browser.py @@ -35,7 +35,7 @@ __all__ = ['BPBrowser'] class BPBrowser(BaseBrowser): DOMAIN = 'voscomptesenligne.labanquepostale.fr' PROTOCOL = 'https' - ENCODING = None # refer to the HTML encoding + ENCODING = None # refer to the HTML encoding PAGES = {r'.*wsost/OstBrokerWeb/loginform.*' : LoginPage, r'.*authentification/repositionnerCheminCourant-identif.ea' : repositionnerCheminCourant, r'.*authentification/initialiser-identif.ea' : Initident, diff --git a/modules/bp/pages/accounthistory.py b/modules/bp/pages/accounthistory.py index 648a07e1..da85d630 100644 --- a/modules/bp/pages/accounthistory.py +++ b/modules/bp/pages/accounthistory.py @@ -54,7 +54,7 @@ class AccountHistory(BasePage): for t in tmp: if r.search(t.text): amount = t.text - amount = ''.join( amount.replace('.', '').replace(',', '.').split() ) + amount = ''.join(amount.replace('.', '').replace(',', '.').split()) if amount[0] == "-": operation.amount = -float(amount[1:]) else: diff --git a/modules/canalplus/video.py b/modules/canalplus/video.py index 1c97eaa8..20c64780 100644 --- a/modules/canalplus/video.py +++ b/modules/canalplus/video.py @@ -26,6 +26,7 @@ __all__ = ['CanalplusVideo'] class CanalplusVideo(BaseVideo): swf_player = False + @classmethod def id2url(cls, _id): return 'http://service.canal-plus.com/video/rest/getVideosLiees/cplus/%s' % _id diff --git a/modules/cmb/backend.py b/modules/cmb/backend.py index c1c84be5..d9967f93 100644 --- a/modules/cmb/backend.py +++ b/modules/cmb/backend.py @@ -33,8 +33,10 @@ from lxml import etree from datetime import date from StringIO import StringIO + __all__ = ['CmbBackend'] + class CmbBackend(BaseBackend, ICapBank): NAME = 'cmb' MAINTAINER = 'Johann Broudin' @@ -83,7 +85,6 @@ class CmbBackend(BaseBackend, ICapBank): ) ] - cookie = None headers = { 'User-Agent': @@ -167,13 +168,13 @@ class CmbBackend(BaseBackend, ICapBank): balance = td[1].text - balance = balance.replace(',','.').replace(u"\xa0",'') + balance = balance.replace(',', '.').replace(u"\xa0", '') account.balance = float(balance) span = td[3].xpath('a/span') if len(span): - coming = span[0].text.replace(' ','').replace(',','.') - coming = coming.replace(u"\xa0",'') + coming = span[0].text.replace(' ', '').replace(',', '.') + coming = coming.replace(u"\xa0", '') account.coming = float(coming) else: account.coming = NotAvailable @@ -248,7 +249,7 @@ class CmbBackend(BaseBackend, ICapBank): operation.date = date(*reversed([int(x) for x in d])) div = td[2].xpath('div') - label = div[0].xpath('a')[0].text.replace('\n','') + label = div[0].xpath('a')[0].text.replace('\n', '') operation.raw = unicode(' '.join(label.split())) for pattern, _type, _label in self.LABEL_PATTERNS: mm = pattern.match(operation.raw) @@ -260,12 +261,11 @@ class CmbBackend(BaseBackend, ICapBank): amount = td[3].text if amount.count(',') != 1: amount = td[4].text - amount = amount.replace(',','.').replace(u'\xa0','') + amount = amount.replace(',', '.').replace(u'\xa0', '') operation.amount = float(amount) else: - amount = amount.replace(',','.').replace(u'\xa0','') + amount = amount.replace(',', '.').replace(u'\xa0', '') operation.amount = - float(amount) i += 1 yield operation - diff --git a/modules/cragr/pages/accounts_list.py b/modules/cragr/pages/accounts_list.py index d40bae13..a9e59189 100644 --- a/modules/cragr/pages/accounts_list.py +++ b/modules/cragr/pages/accounts_list.py @@ -24,6 +24,7 @@ from weboob.capabilities.bank import Account from .base import CragrBasePage from weboob.capabilities.bank import Transaction + def clean_amount(amount): """ Removes weird characters and converts to a float @@ -34,6 +35,7 @@ def clean_amount(amount): matches = re.findall('^(-?[0-9]+\.[0-9]{2}).*$', data) return float(matches[0]) if (matches) else 0.0 + class AccountsList(CragrBasePage): def get_list(self): @@ -109,7 +111,7 @@ class AccountsList(CragrBasePage): select_name is the name of the select field to analyze """ if not self.is_transfer_page(): - return False + return False source_accounts = {} source_account_options = self.document.xpath('/html/body//form//select[@name="%s"]/option' % select_name) for option in source_account_options: @@ -212,7 +214,7 @@ class AccountsList(CragrBasePage): year = today.year return date(year, month, day) - def get_history(self, start_index = 0, start_offset = 0): + def get_history(self, start_index=0, start_offset=0): """ Returns the history of a specific account. Note that this function expects the current page to be the one dedicated to this history. diff --git a/modules/creditmutuel/browser.py b/modules/creditmutuel/browser.py index 694f2b29..1bba3d09 100644 --- a/modules/creditmutuel/browser.py +++ b/modules/creditmutuel/browser.py @@ -26,6 +26,7 @@ from .pages import LoginPage, LoginErrorPage, AccountsPage, UserSpacePage, Opera __all__ = ['CreditMutuelBrowser'] + # Browser class CreditMutuelBrowser(BaseBrowser): PROTOCOL = 'https' @@ -36,11 +37,11 @@ class CreditMutuelBrowser(BaseBrowser): 'https://www.creditmutuel.fr/groupe/fr/identification/default.cgi': LoginErrorPage, 'https://www.creditmutuel.fr/.*/fr/banque/situation_financiere.cgi': AccountsPage, 'https://www.creditmutuel.fr/.*/fr/banque/espace_personnel.aspx': UserSpacePage, - 'https://www.creditmutuel.fr/.*/fr/banque/mouvements.cgi.*' : OperationsPage, - 'https://www.creditmutuel.fr/.*/fr/banque/nr/nr_devbooster.aspx.*' : OperationsPage, - 'https://www.creditmutuel.fr/.*/fr/banque/operations_carte\.cgi.*' : OperationsPage, - 'https://www.creditmutuel.fr/.*/fr/banque/BAD.*' : InfoPage, - 'https://www.creditmutuel.fr/.*/fr/banque/.*Vir.*' : TransfertPage + 'https://www.creditmutuel.fr/.*/fr/banque/mouvements.cgi.*': OperationsPage, + 'https://www.creditmutuel.fr/.*/fr/banque/nr/nr_devbooster.aspx.*': OperationsPage, + 'https://www.creditmutuel.fr/.*/fr/banque/operations_carte\.cgi.*': OperationsPage, + 'https://www.creditmutuel.fr/.*/fr/banque/BAD.*': InfoPage, + 'https://www.creditmutuel.fr/.*/fr/banque/.*Vir.*': TransfertPage } def __init__(self, *args, **kwargs): @@ -61,17 +62,17 @@ class CreditMutuelBrowser(BaseBrowser): if not self.is_on_page(LoginPage): self.location('https://www.creditmutuel.fr/', no_login=True) - self.page.login( self.username, self.password) + self.page.login(self.username, self.password) if not self.is_logged() or self.is_on_page(LoginErrorPage): raise BrowserIncorrectPassword() - self.SUB_BANKS = ['cmdv','cmcee','cmse', 'cmidf', 'cmsmb', 'cmma', 'cmmabn', 'cmc', 'cmlaco', 'cmnormandie', 'cmm'] + self.SUB_BANKS = ['cmdv', 'cmcee', 'cmse', 'cmidf', 'cmsmb', 'cmma', 'cmmabn', 'cmc', 'cmlaco', 'cmnormandie', 'cmm'] self.getCurrentSubBank() def get_accounts_list(self): if not self.is_on_page(AccountsPage): - self.location('https://www.creditmutuel.fr/%s/fr/banque/situation_financiere.cgi'%self.currentSubBank) + self.location('https://www.creditmutuel.fr/%s/fr/banque/situation_financiere.cgi' % self.currentSubBank) return self.page.get_list() def get_account(self, id): @@ -121,13 +122,13 @@ class CreditMutuelBrowser(BaseBrowser): def transfer(self, account, to, amount, reason=None): # access the transfer page transfert_url = 'WI_VPLV_VirUniSaiCpt.asp?RAZ=ALL&Cat=6&PERM=N&CHX=A' - self.location('https://%s/%s/fr/banque/%s'%(self.DOMAIN, self.currentSubBank, transfert_url)) + self.location('https://%s/%s/fr/banque/%s' % (self.DOMAIN, self.currentSubBank, transfert_url)) # fill the form self.select_form(name='FormVirUniSaiCpt') - self['IDB'] = [account[-1]] + self['IDB'] = [account[-1]] self['ICR'] = [to[-1]] - self['MTTVIR'] = '%s' % str(amount).replace('.',',') + self['MTTVIR'] = '%s' % str(amount).replace('.', ',') if reason != None: self['LIBDBT'] = reason self['LIBCRT'] = reason diff --git a/modules/dlfp/pages/news.py b/modules/dlfp/pages/news.py index 6945feb7..47303a19 100644 --- a/modules/dlfp/pages/news.py +++ b/modules/dlfp/pages/news.py @@ -27,7 +27,7 @@ from ..tools import url2id from .index import DLFPPage class RSSComment(DLFPPage): - def on_loaded(self): + def on_loaded(self): pass class Content(object): diff --git a/modules/eatmanga/backend.py b/modules/eatmanga/backend.py index 82b28968..3b8279e5 100644 --- a/modules/eatmanga/backend.py +++ b/modules/eatmanga/backend.py @@ -21,6 +21,7 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicRea __all__ = ['EatmangaBackend'] + class EatmangaBackend(GenericComicReaderBackend): NAME = 'eatmanga' DESCRIPTION = 'EatManga manga reading website' @@ -31,4 +32,4 @@ class EatmangaBackend(GenericComicReaderBackend): ID_REGEXP = r'[^/]+/[^/]+' URL_REGEXP = r'.+eatmanga.com/(?:index.php/)?Manga-Scan/(%s).+' % ID_REGEXP ID_TO_URL = 'http://www.eatmanga.com/index.php/Manga-Scan/%s' - PAGES = { URL_REGEXP: DisplayPage } + PAGES = {URL_REGEXP: DisplayPage} diff --git a/modules/eatmanga/test.py b/modules/eatmanga/test.py index ea30fa4d..b9fc2cfb 100644 --- a/modules/eatmanga/test.py +++ b/modules/eatmanga/test.py @@ -19,8 +19,9 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicReaderTest + class EatmangaTest(GenericComicReaderTest): BACKEND = 'eatmanga' + def test_download(self): return self._test_download('Glass-Mask/Glass-Mask-Vol-031') - diff --git a/modules/ehentai/backend.py b/modules/ehentai/backend.py index 1d2aedf3..d30761a5 100644 --- a/modules/ehentai/backend.py +++ b/modules/ehentai/backend.py @@ -96,4 +96,4 @@ class EHentaiBackend(BaseBackend, ICapGallery): OBJECTS = { EHentaiGallery: fill_gallery, - EHentaiImage: fill_image } + EHentaiImage: fill_image} diff --git a/modules/ehentai/browser.py b/modules/ehentai/browser.py index e70292b4..c799a8fe 100644 --- a/modules/ehentai/browser.py +++ b/modules/ehentai/browser.py @@ -61,7 +61,7 @@ class EHentaiBrowser(BaseBrowser): assert self.is_on_page(GalleryPage) i = 0 while True: - n = self.page._next_page_link(); + n = self.page._next_page_link() for img in self.page.image_pages(): yield EHentaiImage(img) @@ -104,4 +104,3 @@ class EHentaiBrowser(BaseBrowser): # necessary in order to reach the fjords self.home() - diff --git a/modules/ehentai/pages.py b/modules/ehentai/pages.py index ecb98699..f2a59a6b 100644 --- a/modules/ehentai/pages.py +++ b/modules/ehentai/pages.py @@ -27,6 +27,7 @@ from .gallery import EHentaiGallery __all__ = ['GalleryPage', 'ImagePage', 'IndexPage', 'HomePage', 'LoginPage'] + class LoginPage(BasePage): def is_logged(self): success_p = self.document.xpath( @@ -38,9 +39,11 @@ class LoginPage(BasePage): print 'not logged on' return False + class HomePage(BasePage): pass + class IndexPage(BasePage): def iter_galleries(self): lines = self.document.xpath('//table[@class="itg"]//tr[@class="gtr0" or @class="gtr1"]') @@ -50,6 +53,7 @@ class IndexPage(BasePage): title = a.text.strip() yield EHentaiGallery(re.search('(?<=/g/)\d+/[\dabcdef]+', url).group(0), title=title) + class GalleryPage(BasePage): def image_pages(self): return self.document.xpath('//div[@class="gdtm"]//a/attribute::href') @@ -102,7 +106,7 @@ class GalleryPage(BasePage): except IndexError: return None + class ImagePage(BasePage): def get_url(self): return self.document.xpath('//div[@class="sni"]/a/img/attribute::src')[0] - diff --git a/modules/ehentai/test.py b/modules/ehentai/test.py index f59ed3b6..9a78a66b 100644 --- a/modules/ehentai/test.py +++ b/modules/ehentai/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class EHentaiTest(BackendTest): BACKEND = 'ehentai' @@ -35,4 +36,3 @@ class EHentaiTest(BackendTest): self.backend.fillobj(img, ('url',)) self.assertTrue(v.url and v.url.startswith('http://'), 'URL for first image in gallery "%s" not found: %s' % (v.id, img.url)) self.backend.browser.openurl(img.url) - diff --git a/modules/fourchan/backend.py b/modules/fourchan/backend.py index ae86d002..13c8f11f 100644 --- a/modules/fourchan/backend.py +++ b/modules/fourchan/backend.py @@ -68,7 +68,7 @@ class FourChanBackend(BaseBackend, ICapMessages): thread = Thread(id) thread.title = _thread.filename thread.root = Message(thread=thread, - id=0, # root message + id=0, # root message title=_thread.filename, sender=_thread.author, receivers=None, diff --git a/modules/hds/pages.py b/modules/hds/pages.py index 4c02a206..9c12ce18 100644 --- a/modules/hds/pages.py +++ b/modules/hds/pages.py @@ -30,9 +30,11 @@ __all__ = ['ValidationPage', 'HomePage', 'HistoryPage', 'StoryPage'] class ValidationPage(BasePage): pass + class HomePage(BasePage): pass + class Author(object): (UNKNOWN, MALE, @@ -45,6 +47,7 @@ class Author(object): self.email = None self.description = None + class Story(object): def __init__(self, id): self.id = id @@ -54,6 +57,7 @@ class Story(object): self.author = None self.body = None + class HistoryPage(BasePage): def get_numerous(self): td = self.parser.select(self.document.getroot(), 'td.t0', 1) @@ -89,6 +93,7 @@ class HistoryPage(BasePage): yield story story = None + class StoryPage(BasePage): def get_story(self): p_tags = self.document.getroot().xpath('//body/p') @@ -179,4 +184,3 @@ class AuthorPage(BasePage): if author.description.startswith(u'0 récit '): self.logger.warning('This author does not have published any story.') return author - diff --git a/modules/inrocks/tools.py b/modules/inrocks/tools.py index 026c038f..c39dcf26 100644 --- a/modules/inrocks/tools.py +++ b/modules/inrocks/tools.py @@ -18,22 +18,24 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . - import re + def id2url(_id): "return an url from an id" regexp2 = re.compile("(\w+).([0-9]+).(.*$)") match = regexp2.match(_id) if match: - return 'http://www.20minutes.fr/%s/%s/%s' % ( match.group(1), - match.group(2), - match.group(3)) + return 'http://www.20minutes.fr/%s/%s/%s' % (match.group(1), + match.group(2), + match.group(3)) else: raise ValueError("id doesn't match") + def url2id(url): "return an id from an url" return url + def rssid(entry): return url2id(entry.id) diff --git a/modules/izneo/backend.py b/modules/izneo/backend.py index 96d12a57..7cea307e 100644 --- a/modules/izneo/backend.py +++ b/modules/izneo/backend.py @@ -32,6 +32,7 @@ from weboob.tools.browser import BaseBrowser, BasePage __all__ = ['IzneoBackend'] + class ReaderV2(BasePage): def get_ean(self): return self.document.xpath("//div[@id='viewer']/attribute::rel")[0] @@ -43,14 +44,15 @@ class ReaderV2(BasePage): % ean)) for page in pages: - width = 1200 # maximum width + width = 1200 # maximum width yield BaseImage(page['page'], gallery=gallery, url=("http://www.izneo.com/playerv2/%s/%s/%s/%d/%s" % (page['expires'], page['token'], ean, width, page['page']))) + class IzneoBrowser(BaseBrowser): - PAGES = { r'http://.+\.izneo.\w+/readv2-.+': ReaderV2 } + PAGES = {r'http://.+\.izneo.\w+/readv2-.+': ReaderV2} def iter_gallery_images(self, gallery): self.location(gallery.url) @@ -88,7 +90,7 @@ class IzneoBackend(BaseBackend, ICapGallery): return gallery def fill_gallery(self, gallery, fields): - gallery.title = gallery.id + gallery.title = gallery.id def fill_image(self, image, fields): with self.browser: @@ -96,4 +98,4 @@ class IzneoBackend(BaseBackend, ICapGallery): OBJECTS = { BaseGallery: fill_gallery, - BaseImage: fill_image } + BaseImage: fill_image} diff --git a/modules/lcl/backend.py b/modules/lcl/backend.py index 2f815513..c1dfe792 100644 --- a/modules/lcl/backend.py +++ b/modules/lcl/backend.py @@ -67,4 +67,3 @@ class LCLBackend(BaseBackend, ICapBank): with self.browser: for history in self.browser.get_history(account): yield history - diff --git a/modules/lcl/pages.py b/modules/lcl/pages.py index e5685321..63130765 100644 --- a/modules/lcl/pages.py +++ b/modules/lcl/pages.py @@ -28,17 +28,18 @@ import tempfile import math import random + class LCLVirtKeyboard(MappedVirtKeyboard): - symbols={'0':'9da2724133f2221482013151735f033c', - '1':'873ab0087447610841ae1332221be37b', - '2':'93ce6c330393ff5980949d7b6c800f77', - '3':'b2d70c69693784e1bf1f0973d81223c0', - '4':'498c8f5d885611938f94f1c746c32978', - '5':'359bcd60a9b8565917a7bf34522052c3', - '6':'aba912172f21f78cd6da437cfc4cdbd0', - '7':'f710190d6b947869879ec02d8e851dfa', - '8':'b42cc25e1539a15f767aa7a641f3bfec', - '9':'cc60e5894a9d8e12ee0c2c104c1d5490' + symbols={'0': '9da2724133f2221482013151735f033c', + '1': '873ab0087447610841ae1332221be37b', + '2': '93ce6c330393ff5980949d7b6c800f77', + '3': 'b2d70c69693784e1bf1f0973d81223c0', + '4': '498c8f5d885611938f94f1c746c32978', + '5': '359bcd60a9b8565917a7bf34522052c3', + '6': 'aba912172f21f78cd6da437cfc4cdbd0', + '7': 'f710190d6b947869879ec02d8e851dfa', + '8': 'b42cc25e1539a15f767aa7a641f3bfec', + '9': 'cc60e5894a9d8e12ee0c2c104c1d5490' } url="/outil/UAUT/Clavier/creationClavier?random=" @@ -66,9 +67,11 @@ class LCLVirtKeyboard(MappedVirtKeyboard): code+=self.get_symbol_code(self.symbols[c]) return code + class SkipPage(BasePage): pass + class LoginPage(BasePage): def myXOR(self,value,seed): s='' @@ -120,6 +123,7 @@ class LoginPage(BasePage): return True return False + class AccountsPage(BasePage): def get_list(self): l = [] @@ -145,6 +149,7 @@ class AccountsPage(BasePage): l.append(account) return l + class AccountHistoryPage(BasePage): def get_operations(self,account): operations = [] @@ -194,5 +199,3 @@ class AccountHistoryPage(BasePage): operation.amount=amount operations.append(operation) return operations - - diff --git a/modules/lefigaro/pages/article.py b/modules/lefigaro/pages/article.py index d9db3f0f..ecf80612 100644 --- a/modules/lefigaro/pages/article.py +++ b/modules/lefigaro/pages/article.py @@ -20,6 +20,7 @@ from weboob.tools.capabilities.messages.genericArticle import GenericNewsPage, remove_from_selector_list, drop_comments, try_drop_tree, try_remove_from_selector_list + class ArticlePage(GenericNewsPage): "ArticlePage object for inrocks" def on_loaded(self): @@ -51,7 +52,6 @@ class ArticlePage(GenericNewsPage): a.drop_tree() div.drop_tree() - # This part of the article seems manually generated. for crappy_title in self.parser.select(element_body, 'p strong'): if crappy_title.text == 'LIRE AUSSI :' or crappy_title.text == 'LIRE AUSSI:': diff --git a/modules/lefigaro/pages/flashactu.py b/modules/lefigaro/pages/flashactu.py index 2e38633a..90d7a31f 100644 --- a/modules/lefigaro/pages/flashactu.py +++ b/modules/lefigaro/pages/flashactu.py @@ -20,11 +20,12 @@ from weboob.tools.capabilities.messages.genericArticle import GenericNewsPage + class FlashActuPage(GenericNewsPage): "ArticlePage object for inrocks" def on_loaded(self): self.main_div = self.document.getroot() - self.element_title_selector = "h1" + self.element_title_selector = "h1" self.element_author_selector = "div.name>span" self.element_body_selector = "h2" @@ -32,4 +33,3 @@ class FlashActuPage(GenericNewsPage): element_body = self.get_element_body() element_body.tag = "div" return self.parser.tostring(element_body) - diff --git a/modules/lefigaro/pages/simple.py b/modules/lefigaro/pages/simple.py index 25128135..3c2b1863 100644 --- a/modules/lefigaro/pages/simple.py +++ b/modules/lefigaro/pages/simple.py @@ -20,10 +20,11 @@ from weboob.tools.capabilities.messages.genericArticle import GenericNewsPage + class SimplePage(GenericNewsPage): "ArticlePage object for minutes20" + def on_loaded(self): self.main_div = self.document.getroot() self.element_author_selector = "div.mna-signature" self.element_body_selector = "#article" - diff --git a/modules/lefigaro/pages/special.py b/modules/lefigaro/pages/special.py index 3cabddd0..f2ff5c3d 100644 --- a/modules/lefigaro/pages/special.py +++ b/modules/lefigaro/pages/special.py @@ -19,11 +19,12 @@ from weboob.tools.capabilities.messages.genericArticle import GenericNewsPage, try_remove_from_selector_list + class SpecialPage(GenericNewsPage): "ArticlePage object for inrocks" def on_loaded(self): self.main_div = self.document.getroot() - self.element_title_selector = "h2" + self.element_title_selector = "h2" self.element_author_selector = "div.name>span" self.element_body_selector = ".block-text" @@ -32,4 +33,3 @@ class SpecialPage(GenericNewsPage): try_remove_from_selector_list(self.parser, element_body, ['div']) element_body.tag = "div" return self.parser.tostring(element_body) - diff --git a/modules/lefigaro/tools.py b/modules/lefigaro/tools.py index d09d120c..15d6b9ec 100644 --- a/modules/lefigaro/tools.py +++ b/modules/lefigaro/tools.py @@ -18,22 +18,24 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . - import re + def id2url(_id): "return an url from an id" regexp2 = re.compile("(\w+).([0-9]+).(.*$)") match = regexp2.match(_id) if match: - return 'http://www.20minutes.fr/%s/%s/%s' % ( match.group(1), - match.group(2), - match.group(3)) + return 'http://www.20minutes.fr/%s/%s/%s' % (match.group(1), + match.group(2), + match.group(3)) else: raise ValueError("id doesn't match") + def url2id(url): "return an id from an url" return url + def rssid(entry): return url2id(entry.id) diff --git a/modules/mangafox/backend.py b/modules/mangafox/backend.py index 410b6830..33cde96e 100644 --- a/modules/mangafox/backend.py +++ b/modules/mangafox/backend.py @@ -21,6 +21,7 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicRea __all__ = ['MangafoxBackend'] + class MangafoxBackend(GenericComicReaderBackend): NAME = 'mangafox' DESCRIPTION = 'Manga Fox manga reading website' @@ -31,4 +32,4 @@ class MangafoxBackend(GenericComicReaderBackend): ID_REGEXP = r'[^/]+/[^/]+(?:/[^/]+)?' URL_REGEXP = r'.+mangafox.com/manga/(%s).*' % ID_REGEXP ID_TO_URL = 'http://www.mangafox.com/manga/%s' - PAGES = { r'http://.+\.mangafox.\w+/manga/[^/]+/[^/]+/([^/]+/)?(.+\.html)?': DisplayPage } + PAGES = {r'http://.+\.mangafox.\w+/manga/[^/]+/[^/]+/([^/]+/)?(.+\.html)?': DisplayPage} diff --git a/modules/mangafox/test.py b/modules/mangafox/test.py index 797ae7b4..ddb0a3f7 100644 --- a/modules/mangafox/test.py +++ b/modules/mangafox/test.py @@ -20,7 +20,9 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicReaderTest + class MangafoxTest(GenericComicReaderTest): BACKEND = 'mangafox' + def test_download(self): return self._test_download('glass_no_kamen/v02/c000') diff --git a/modules/mangahere/backend.py b/modules/mangahere/backend.py index 8b0e4150..07d25c6d 100644 --- a/modules/mangahere/backend.py +++ b/modules/mangahere/backend.py @@ -21,6 +21,7 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicRea __all__ = ['MangahereBackend'] + class MangahereBackend(GenericComicReaderBackend): NAME = 'mangahere' DESCRIPTION = 'Manga Here manga reading website' @@ -31,4 +32,4 @@ class MangahereBackend(GenericComicReaderBackend): ID_REGEXP = r'[^/]+/[^/]+/[^/]+' URL_REGEXP = r'.+mangahere.com/manga/(%s).+' % ID_REGEXP ID_TO_URL = 'http://www.mangahere.com/manga/%s' - PAGES = { URL_REGEXP: DisplayPage } + PAGES = {URL_REGEXP: DisplayPage} diff --git a/modules/mangahere/test.py b/modules/mangahere/test.py index c086d168..7d805191 100644 --- a/modules/mangahere/test.py +++ b/modules/mangahere/test.py @@ -19,8 +19,9 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicReaderTest + class MangahereTest(GenericComicReaderTest): BACKEND = 'mangahere' + def test_download(self): return self._test_download('glass_no_kamen/v02/c000') - diff --git a/modules/mangareader/backend.py b/modules/mangareader/backend.py index 76166c69..ddba6dd8 100644 --- a/modules/mangareader/backend.py +++ b/modules/mangareader/backend.py @@ -19,8 +19,10 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicReaderBackend, DisplayPage + __all__ = ['MangareaderBackend'] + class MangareaderBackend(GenericComicReaderBackend): NAME = 'mangareader' DESCRIPTION = 'MangaReader manga reading website' @@ -31,4 +33,4 @@ class MangareaderBackend(GenericComicReaderBackend): ID_REGEXP = r'[^/]+/[^/]+' URL_REGEXP = r'.+mangareader.net/(%s).+' % ID_REGEXP ID_TO_URL = 'http://www.mangareader.net/%s' - PAGES = { r'http://.+\.mangareader.net/.+': DisplayPage } # oh well + PAGES = {r'http://.+\.mangareader.net/.+': DisplayPage} # oh well diff --git a/modules/mangareader/test.py b/modules/mangareader/test.py index d8ef99f3..2335a63c 100644 --- a/modules/mangareader/test.py +++ b/modules/mangareader/test.py @@ -19,8 +19,9 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicReaderTest + class MangareaderTest(GenericComicReaderTest): BACKEND = 'mangareader' + def test_download(self): return self._test_download('glass-mask/3') - diff --git a/modules/mediawiki/backend.py b/modules/mediawiki/backend.py index 16858c9c..305c8f37 100644 --- a/modules/mediawiki/backend.py +++ b/modules/mediawiki/backend.py @@ -29,6 +29,7 @@ from .browser import MediawikiBrowser __all__ = ['MediawikiBackend'] + class MediawikiBackend(BaseBackend, ICapContent): NAME = 'mediawiki' MAINTAINER = u'Clément Schreiner' @@ -42,6 +43,7 @@ class MediawikiBackend(BaseBackend, ICapContent): ValueBackendPassword('password', label='Password', default='')) BROWSER = MediawikiBrowser + def create_default_browser(self): username = self.config['username'].get() if len(username) > 0: diff --git a/modules/mediawiki/browser.py b/modules/mediawiki/browser.py index 6ed9c0d4..90d52e78 100644 --- a/modules/mediawiki/browser.py +++ b/modules/mediawiki/browser.py @@ -21,7 +21,6 @@ from urlparse import urlsplit import urllib import datetime - from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword from weboob.capabilities.content import Revision @@ -37,6 +36,7 @@ __all__ = ['MediawikiBrowser'] class APIError(Exception): pass + # Browser class MediawikiBrowser(BaseBrowser): ENCODING = 'utf-8' @@ -63,8 +63,6 @@ class MediawikiBrowser(BaseBrowser): 'intoken': 'edit', } - - result = self.API_get(data) pageid = result['query']['pages'].keys()[0] if pageid == "-1": # Page does not exist @@ -83,8 +81,7 @@ class MediawikiBrowser(BaseBrowser): } result = self.API_get(data) pageid = result['query']['pages'].keys()[0] - return result['query']['pages'][str(pageid)][_type+'token'] - + return result['query']['pages'][str(pageid)][_type + 'token'] def set_wiki_source(self, content, message=None, minor=False): if len(self.username) > 0 and not self.is_logged(): @@ -138,7 +135,9 @@ class MediawikiBrowser(BaseBrowser): self.API_post(data) def iter_wiki_revisions(self, page, nb_entries): - '''Yield 'Revision' objects for the last revisions of the specified page.''' + """ + Yield 'Revision' objects for the last revisions of the specified page. + """ if len(self.username) > 0 and not self.is_logged(): self.login() data = {'action': 'query', @@ -158,14 +157,11 @@ class MediawikiBrowser(BaseBrowser): rev_content.revision = str(rev['revid']) rev_content.author = rev['user'] rev_content.timestamp = datetime.datetime.strptime(rev['timestamp'], '%Y-%m-%dT%H:%M:%SZ') - if rev.has_key('minor'): - rev_content.minor = True - else: - rev_content.minor = False + rev_content.minor = 'minor' in rev yield rev_content def home(self): - '''We don't need to change location, we're using the JSON API here.''' + # We don't need to change location, we're using the JSON API here. pass def check_result(self, result): @@ -173,17 +169,20 @@ class MediawikiBrowser(BaseBrowser): raise APIError('%s' % result['error']['info']) def API_get(self, data): - '''Submit a GET request to the website - The JSON data is parsed and returned as a dictionary''' + """ + Submit a GET request to the website + The JSON data is parsed and returned as a dictionary + """ data['format'] = 'json' result = simplejson.loads(self.readurl(self.buildurl(self.apiurl, **data)), 'utf-8') self.check_result(result) return result def API_post(self, data): - '''Submit a POST request to the website - The JSON data is parsed and returned as a dictionary''' - + """ + Submit a POST request to the website + The JSON data is parsed and returned as a dictionary + """ data['format'] = 'json' result = simplejson.loads(self.readurl(self.apiurl, urllib.urlencode(data)), 'utf-8') self.check_result(result) diff --git a/modules/meteofrance/pages/meteo.py b/modules/meteofrance/pages/meteo.py index 6f47ca03..19c11d6b 100644 --- a/modules/meteofrance/pages/meteo.py +++ b/modules/meteofrance/pages/meteo.py @@ -18,7 +18,6 @@ # along with weboob. If not, see . - from weboob.tools.browser import BasePage from weboob.capabilities.weather import Forecast, Current, City @@ -69,10 +68,10 @@ class WeatherPage(BasePage): Return the city from the forecastpage. """ for div in self.document.getiterator('div'): - if div.attrib.has_key("class") and div.attrib.get("class") == "choix": + if div.attrib.get("class", "") == "choix": for strong in div.getiterator("strong"): - city_name=strong.text +" "+ strong.tail.replace("(","").replace(")","") - city_id=self.url.split("/")[-1] + city_name = strong.text + " " + strong.tail.replace("(", "").replace(")", "") + city_id = self.url.split("/")[-1] return City(city_id, city_name) @@ -84,5 +83,5 @@ class CityPage(BasePage): city_name = li.text_content() for children in li.getchildren(): city_id = children.attrib.get("href").split("/")[-1] - mcity = City( city_id, city_name) + mcity = City(city_id, city_name) yield mcity diff --git a/modules/minutes20/backend.py b/modules/minutes20/backend.py index dfc7f950..7906e845 100644 --- a/modules/minutes20/backend.py +++ b/modules/minutes20/backend.py @@ -23,6 +23,7 @@ from weboob.tools.capabilities.messages.GenericBackend import GenericNewspaperBa from .browser import Newspaper20minutesBrowser from .tools import rssid + class Newspaper20minutesBackend(GenericNewspaperBackend, ICapMessages): MAINTAINER = 'Julien Hebert' EMAIL = 'juke@free.fr' @@ -34,4 +35,3 @@ class Newspaper20minutesBackend(GenericNewspaperBackend, ICapMessages): BROWSER = Newspaper20minutesBrowser RSS_FEED = 'http://www.20minutes.fr/rss/20minutes.xml' RSSID = rssid - diff --git a/modules/minutes20/pages/article.py b/modules/minutes20/pages/article.py index 70faa5fa..56d3f029 100644 --- a/modules/minutes20/pages/article.py +++ b/modules/minutes20/pages/article.py @@ -21,6 +21,7 @@ from weboob.tools.capabilities.messages.genericArticle import NoAuthorElement, try_remove, NoneMainDiv from .simple import SimplePage + class ArticlePage(SimplePage): "ArticlePage object for minutes20" def on_loaded(self): @@ -37,9 +38,8 @@ class ArticlePage(SimplePage): else: try_remove(self.parser, element_body, "div.mna-tools") try_remove(self.parser, element_body, "div.mna-comment-call") - try : + try: element_body.remove(self.get_element_author()) except NoAuthorElement: pass return self.parser.tostring(element_body) - diff --git a/modules/minutes20/pages/simple.py b/modules/minutes20/pages/simple.py index 46d3214d..b61ef7e5 100644 --- a/modules/minutes20/pages/simple.py +++ b/modules/minutes20/pages/simple.py @@ -20,6 +20,7 @@ from weboob.tools.capabilities.messages.genericArticle import GenericNewsPage + class SimplePage(GenericNewsPage): "ArticlePage object for minutes20" def on_loaded(self): @@ -27,4 +28,3 @@ class SimplePage(GenericNewsPage): self.element_title_selector = "h1" self.element_author_selector = "div.mna-signature" self.element_body_selector = "div.mna-body" - diff --git a/modules/minutes20/tools.py b/modules/minutes20/tools.py index 8ef572df..6c0318a7 100644 --- a/modules/minutes20/tools.py +++ b/modules/minutes20/tools.py @@ -18,24 +18,27 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . - import re + + def id2url(_id): "return an url from an id" regexp2 = re.compile("(\w+).([0-9]+).(.*$)") match = regexp2.match(_id) if match: - return 'http://www.20minutes.fr/%s/%s/%s' % ( match.group(1), - match.group(2), - match.group(3)) + return 'http://www.20minutes.fr/%s/%s/%s' % (match.group(1), + match.group(2), + match.group(3)) else: raise ValueError("id doesn't match") + def url2id(url): "return an id from an url" regexp = re.compile("http://www.20minutes.fr/(\w+)/([0-9]+)/(.*$)") match = regexp.match(url) return '%s.%d.%s' % (match.group(1), int(match.group(2)), match.group(3)) + def rssid(entry): return url2id(entry.id) diff --git a/modules/newsfeed/test.py b/modules/newsfeed/test.py index 20eda46c..e57e9ba7 100644 --- a/modules/newsfeed/test.py +++ b/modules/newsfeed/test.py @@ -20,10 +20,10 @@ from weboob.tools.test import BackendTest + class NewsfeedTest(BackendTest): BACKEND = 'newsfeed' - + def test_newsfeed(self): for message in self.backend.iter_unread_messages(): pass - diff --git a/modules/nolifetv/pages/video.py b/modules/nolifetv/pages/video.py index 1f26c7b7..8d7f80c1 100644 --- a/modules/nolifetv/pages/video.py +++ b/modules/nolifetv/pages/video.py @@ -35,8 +35,8 @@ __all__ = ['VideoPage'] class ForbiddenVideo(Exception): pass -class VideoPage(BasePage): +class VideoPage(BasePage): def get_video(self, video=None): _id = to_unicode(self.group_dict['id']) if video is None: @@ -84,4 +84,3 @@ class VideoPage(BasePage): video.url = values['url'] return video - diff --git a/modules/opacwebaloes/backend.py b/modules/opacwebaloes/backend.py index ace4b50f..112774ef 100644 --- a/modules/opacwebaloes/backend.py +++ b/modules/opacwebaloes/backend.py @@ -67,4 +67,3 @@ class AloesBackend(BaseBackend, ICapBook): def search_books(self, _string): raise NotImplementedError() - diff --git a/modules/opacwebaloes/browser.py b/modules/opacwebaloes/browser.py index 07df74cf..02fa64b1 100644 --- a/modules/opacwebaloes/browser.py +++ b/modules/opacwebaloes/browser.py @@ -42,7 +42,7 @@ class AloesBrowser(BaseBrowser): } def __init__(self, baseurl, *args, **kwargs): - self.BASEURL=baseurl + self.BASEURL = baseurl BaseBrowser.__init__(self, *args, **kwargs) def is_logged(self): @@ -60,10 +60,9 @@ class AloesBrowser(BaseBrowser): no_login=True) if not self.page.login(self.username, self.password) or \ not self.is_logged() or \ - (self.is_on_page(LoginPage) and self.page.is_error()) : + (self.is_on_page(LoginPage) and self.page.is_error()): raise BrowserIncorrectPassword() - def get_rented_books_list(self): if not self.is_on_page(RentedPage): self.location('%s://%s/index.aspx?IdPage=45' \ @@ -73,6 +72,6 @@ class AloesBrowser(BaseBrowser): def get_booked_books_list(self): if not self.is_on_page(BookedPage): - self.location('%s://%s/index.aspx?IdPage=44' \ + self.location('%s://%s/index.aspx?IdPage=44' \ % (self.PROTOCOL, self.BASEURL)) return self.page.get_list() diff --git a/modules/orange/pages/compose.py b/modules/orange/pages/compose.py index 40e23475..dfc7bfeb 100644 --- a/modules/orange/pages/compose.py +++ b/modules/orange/pages/compose.py @@ -24,6 +24,7 @@ from weboob.tools.browser import BasePage __all__ = ['ComposePage', 'ConfirmPage'] + class ConfirmPage(BasePage): def on_loaded(self): pass @@ -33,9 +34,9 @@ class ComposePage(BasePage): phone_regex = re.compile('^(\+33|0033|0)(6|7)(\d{8})$') def on_loaded(self): - #Deal with bad encoding... for ie6 ... + # Deal with bad encoding... for ie6... response = self.browser.response() - response.set_data(response.get_data().decode('utf-8', 'ignore') ) + response.set_data(response.get_data().decode('utf-8', 'ignore')) self.browser.set_response(response) def get_nb_remaining_free_sms(self): @@ -46,12 +47,12 @@ class ComposePage(BasePage): if self.phone_regex.match(receiver) is None: raise CantSendMessage(u'Invalid receiver: %s' % receiver) - listetel = ",,"+ receiver + listetel = ",," + receiver #Fill the form self.browser.select_form(name="formulaire") - self.browser.new_control("hidden", "autorize",{'value':''}) - self.browser.new_control("textarea", "msg", {'value':''}) + self.browser.new_control("hidden", "autorize", {'value': ''}) + self.browser.new_control("textarea", "msg", {'value': ''}) self.browser.set_all_readonly(False) diff --git a/modules/pastealacon/backend.py b/modules/pastealacon/backend.py index af3aee09..1223af9f 100644 --- a/modules/pastealacon/backend.py +++ b/modules/pastealacon/backend.py @@ -43,8 +43,8 @@ class PastealaconBackend(BaseBackend, BasePasteBackend): BROWSER = PastealaconBrowser EXPIRATIONS = { - 24*3600: 'd', - 24*3600*30: 'm', + 24 * 3600: 'd', + 24 * 3600 * 30: 'm', False: 'f', } @@ -83,7 +83,7 @@ class PastealaconBackend(BaseBackend, BasePasteBackend): self.browser.fill_paste(paste) return paste - def post_paste(self, paste, max_age = None): + def post_paste(self, paste, max_age=None): if max_age is not None: expiration = self.get_closest_expiration(max_age) else: diff --git a/modules/simplyreadit/backend.py b/modules/simplyreadit/backend.py index 090de6b5..040fc91e 100644 --- a/modules/simplyreadit/backend.py +++ b/modules/simplyreadit/backend.py @@ -21,6 +21,7 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicRea __all__ = ['SimplyreaditBackend'] + class SimplyreaditBackend(GenericComicReaderBackend): NAME = 'simplyreadit' DESCRIPTION = 'SimplyReadIt manga reading website' @@ -30,4 +31,4 @@ class SimplyreaditBackend(GenericComicReaderBackend): ID_TO_URL = 'http://www.simplyread.it/reader/read/%s' ID_REGEXP = r'[^/]+(?:/[^/]+)*' URL_REGEXP = r'.+simplyread.it/reader/read/(%s)/page/.+' % ID_REGEXP - PAGES = { r'http://.+\.simplyread.it/reader/read/.+': DisplayPage } + PAGES = {r'http://.+\.simplyread.it/reader/read/.+': DisplayPage} diff --git a/modules/simplyreadit/test.py b/modules/simplyreadit/test.py index 1530aa88..57aac411 100644 --- a/modules/simplyreadit/test.py +++ b/modules/simplyreadit/test.py @@ -19,8 +19,9 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicReaderTest + class SimplyreaditTest(GenericComicReaderTest): BACKEND = 'simplyreadit' + def test_download(self): return self._test_download('bonnouji/en/1/3') - diff --git a/modules/societegenerale/captcha.py b/modules/societegenerale/captcha.py index 17655a2b..b39db15a 100644 --- a/modules/societegenerale/captcha.py +++ b/modules/societegenerale/captcha.py @@ -21,18 +21,20 @@ import hashlib import Image + class TileError(Exception): - def __init__(self, msg, tile = None): + def __init__(self, msg, tile=None): Exception.__init__(self, msg) self.tile = tile -class Captcha: + +class Captcha(object): def __init__(self, file, infos): self.inim = Image.open(file) self.infos = infos self.nbr = int(infos["nblignes"]) self.nbc = int(infos["nbcolonnes"]) - (self.nx,self.ny) = self.inim.size + (self.nx, self.ny) = self.inim.size self.inmat = self.inim.load() self.map = {} @@ -77,7 +79,7 @@ class Captcha: self.map[num] = tile -class Tile: +class Tile(object): hash = {'ff1441b2c5f90703ef04e688e399aca5': 1, '53d7f3dfd64f54723b231fc398b6be57': 2, '5bcba7fa2107ba9a606e8d0131c162eb': 3, @@ -116,4 +118,3 @@ class Tile: def display(self): print self.checksum() - diff --git a/modules/societegenerale/pages/__init__.py b/modules/societegenerale/pages/__init__.py index ffbc07ed..fb752cd3 100644 --- a/modules/societegenerale/pages/__init__.py +++ b/modules/societegenerale/pages/__init__.py @@ -21,7 +21,9 @@ from .accounts_list import AccountsList from .login import LoginPage, BadLoginPage -class AccountPrelevement(AccountsList): pass + +class AccountPrelevement(AccountsList): + pass __all__ = ['LoginPage', 'BadLoginPage', diff --git a/modules/societegenerale/pages/login.py b/modules/societegenerale/pages/login.py index 6f87013f..a78038f5 100644 --- a/modules/societegenerale/pages/login.py +++ b/modules/societegenerale/pages/login.py @@ -53,11 +53,11 @@ class LoginPage(BasePage): infos_xml = etree.XML(infos_data) infos = {} for el in ("cryptogramme", "nblignes", "nbcolonnes"): - infos[el] = infos_xml.find(el).text + infos[el] = infos_xml.find(el).text infos["grille"] = "" for g in infos_xml.findall("grille"): - infos["grille"] += g.text + "," + infos["grille"] += g.text + "," infos["keyCodes"] = infos["grille"].split(",") url = base_url + '/cvcsgenimage?modeClavier=0&cryptogramme=' + infos["cryptogramme"] @@ -79,5 +79,6 @@ class LoginPage(BasePage): self.browser['cryptocvcs'] = infos["cryptogramme"] self.browser.submit() + class BadLoginPage(BasePage): pass diff --git a/modules/transilien/pages/station.py b/modules/transilien/pages/station.py index c2f42a39..6b436c67 100644 --- a/modules/transilien/pages/station.py +++ b/modules/transilien/pages/station.py @@ -16,6 +16,3 @@ # # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . - - - diff --git a/modules/youjizz/pages/video.py b/modules/youjizz/pages/video.py index 92987c35..cc5f8ca8 100644 --- a/modules/youjizz/pages/video.py +++ b/modules/youjizz/pages/video.py @@ -63,4 +63,3 @@ class VideoPage(BasePage): video.url = video_file_urls[0] return video - diff --git a/modules/youporn/backend.py b/modules/youporn/backend.py index 9db873e0..0bd11613 100644 --- a/modules/youporn/backend.py +++ b/modules/youporn/backend.py @@ -44,6 +44,7 @@ class YoupornBackend(BaseBackend, ICapVideo): return self.browser.get_video(_id) SORTBY = ['relevance', 'rating', 'views', 'time'] + def search_videos(self, pattern=None, sortby=ICapVideo.SEARCH_RELEVANCE, nsfw=False, max_results=None): if not nsfw: return set() diff --git a/modules/youtube/pages.py b/modules/youtube/pages.py index 8ad815af..e261373f 100644 --- a/modules/youtube/pages.py +++ b/modules/youtube/pages.py @@ -47,6 +47,7 @@ class LoginPage(BasePage): self.browser['Passwd'] = password self.browser.submit() + class LoginRedirectPage(BasePage): pass @@ -64,6 +65,7 @@ class BaseYoutubePage(BasePage): else: return True + class ForbiddenVideoPage(BaseYoutubePage): def on_loaded(self): element = self.parser.select(self.document.getroot(), '.yt-alert-content', 1) @@ -78,11 +80,13 @@ class VerifyAgePage(BaseYoutubePage): self.browser.select_form(predicate=lambda form: form.attrs.get('id', '') == 'confirm-age-form') self.browser.submit() + class VerifyControversyPage(BaseYoutubePage): def on_loaded(self): self.browser.select_form(predicate=lambda form: 'verify_controversy' in form.attrs.get('action', '')) self.browser.submit() + class VideoPage(BaseYoutubePage): AVAILABLE_FORMATS = [38, 37, 45, 22, 43, 35, 34, 18, 6, 5, 17, 13] FORMAT_EXTENSIONS = { @@ -91,7 +95,7 @@ class VideoPage(BaseYoutubePage): 18: 'mp4', 22: 'mp4', 37: 'mp4', - 38: 'video', # You actually don't know if this will be MOV, AVI or whatever + 38: 'video', # You actually don't know if this will be MOV, AVI or whatever 43: 'webm', 45: 'webm', } diff --git a/setup.py b/setup.py index 4633481e..a122b9d3 100755 --- a/setup.py +++ b/setup.py @@ -38,7 +38,7 @@ def check_executable_win(executable, error): path = filter(None, path.split(";")) if dotfirst: - path = ["."]+path + path = ["."] + path pathext = os.environ[pathextsrc] pathext = filter(None, pathext.split(";")) @@ -56,13 +56,14 @@ def check_executable_win(executable, error): for e in pathext: filePath = os.path.join(d, cmdName + e) if os.path.exists(filePath): - return filePath.replace( '\\', '/' ) + return filePath.replace('\\', '/') print >>sys.stderr, 'Error: %s is not installed on your system.' % executable if error: print >>sys.stderr, error sys.exit(1) + def check_executable_unix(executable, error): with open('/dev/null', 'w') as devnull: process = subprocess.Popen(['which', executable], stdout=devnull) @@ -80,28 +81,31 @@ if sys.platform == 'win32': else: check_executable = check_executable_unix + def build_qt(): print 'Building Qt applications' pyuic4 = check_executable('pyuic4', 'Install PyQt4-devel or disable Qt applications (with --no-qt).') if sys.platform == 'win32': - env={ 'PYUIC' : pyuic4, 'PATH':os.environ['PATH']} + env = {'PYUIC': pyuic4, 'PATH': os.environ['PATH']} extraMakeFlag = ['-e'] else: env = None extraMakeFlag = [] - subprocess.check_call(['make']+extraMakeFlag+['-C','weboob/applications/qboobmsg/ui'], env=env ) - subprocess.check_call(['make']+extraMakeFlag+['-C','weboob/applications/qhavedate/ui'], env=env ) + subprocess.check_call(['make']+extraMakeFlag+['-C', 'weboob/applications/qboobmsg/ui'], env=env) + subprocess.check_call(['make']+extraMakeFlag+['-C', 'weboob/applications/qhavedate/ui'], env=env) if sys.platform != 'win32': - subprocess.check_call(['make']+extraMakeFlag+['-C','weboob/applications/qvideoob/ui'], env=env ) - subprocess.check_call(['make']+extraMakeFlag+['-C','weboob/applications/qwebcontentedit/ui'], env=env ) - subprocess.check_call(['make']+extraMakeFlag+['-C','weboob/applications/qflatboob/ui'], env=env ) - subprocess.check_call(['make']+extraMakeFlag+['-C','weboob/tools/application/qt'], env=env ) + subprocess.check_call(['make']+extraMakeFlag+['-C', 'weboob/applications/qvideoob/ui'], env=env) + subprocess.check_call(['make']+extraMakeFlag+['-C', 'weboob/applications/qwebcontentedit/ui'], env=env) + subprocess.check_call(['make']+extraMakeFlag+['-C', 'weboob/applications/qflatboob/ui'], env=env) + subprocess.check_call(['make']+extraMakeFlag+['-C', 'weboob/tools/application/qt'], env=env) -class Options: + +class Options(object): pass + options = Options() options.hildon = False options.qt = True @@ -189,7 +193,7 @@ if options.xdg: setup( name='weboob', - version = '0.b', + version='0.b', description='Weboob, Web Out Of Browsers', long_description=open('README').read(), author='Romain Bignon', diff --git a/tools/make_man.py b/tools/make_man.py index 0afff1aa..6417262d 100755 --- a/tools/make_man.py +++ b/tools/make_man.py @@ -20,8 +20,11 @@ from __future__ import with_statement -import sys, os, tempfile -import imp, inspect +import sys +import os +import tempfile +import imp +import inspect import optparse import re import time @@ -31,8 +34,9 @@ from weboob.tools.application.base import BaseApplication BASE_PATH = os.path.join(os.path.dirname(__file__), os.pardir) DEST_DIR = 'man' + class ManpageHelpFormatter(optparse.HelpFormatter): - def __init__ (self, + def __init__(self, app, indent_increment=0, max_help_position=0, @@ -94,7 +98,7 @@ class ManpageHelpFormatter(optparse.HelpFormatter): def format_option_strings(self, option): opts = optparse.HelpFormatter.format_option_strings(self, option).split(", ") - return ".TP\n"+", ".join("\\fB%s\\fR" % opt for opt in opts) + return ".TP\n" + ", ".join("\\fB%s\\fR" % opt for opt in opts) def main(): @@ -129,17 +133,21 @@ def main(): analyze_application(klass, fname) finally: # Cleanup compiled files if needed - if (os.path.isfile(tmpfile+"c")): - os.unlink(tmpfile+"c") + if (os.path.isfile(tmpfile + "c")): + os.unlink(tmpfile + "c") + def format_title(title): return re.sub(r'^(.+):$', r'.SH \1\n.TP', title.group().upper()) + # XXX useful because the PyQt QApplication destructor crashes sometimes. By # keeping every applications until program end, it prevents to stop before # every manpages have been generated. If it crashes at exit, it's not a # really a problem. applications = [] + + def analyze_application(app, script_name): application = app() applications.append(application) diff --git a/weboob/__init__.py b/weboob/__init__.py index 8b137891..e69de29b 100644 --- a/weboob/__init__.py +++ b/weboob/__init__.py @@ -1 +0,0 @@ - diff --git a/weboob/applications/__init__.py b/weboob/applications/__init__.py index 8b137891..e69de29b 100644 --- a/weboob/applications/__init__.py +++ b/weboob/applications/__init__.py @@ -1 +0,0 @@ - diff --git a/weboob/applications/boobank/boobank.py b/weboob/applications/boobank/boobank.py index f2ed3c61..6558be7f 100644 --- a/weboob/applications/boobank/boobank.py +++ b/weboob/applications/boobank/boobank.py @@ -49,6 +49,7 @@ class QifFormatter(IFormatter): self.count += 1 return result + class TransactionsFormatter(IFormatter): MANDATORY_FIELDS = ('date', 'label', 'amount') TYPES = ['', 'Transfer', 'Order', 'Check', 'Deposit', 'Payback', 'Withdrawal', 'Card', 'Loan', 'Bank'] @@ -82,6 +83,7 @@ class TransactionsFormatter(IFormatter): result += ' %-10s %-12s %-50s %10.2f' % (item['date'].strftime('%Y-%m-%d'), _type, label[:50], item['amount']) return result + class TransferFormatter(IFormatter): MANDATORY_FIELDS = ('id', 'date', 'origin', 'recipient', 'amount') @@ -96,6 +98,7 @@ class TransferFormatter(IFormatter): result += u'Amount: %.2f\n' % item['amount'] return result + class RecipientListFormatter(IFormatter): MANDATORY_FIELDS = ('id', 'label') @@ -115,6 +118,7 @@ class RecipientListFormatter(IFormatter): return u'%s %-30s %s %s' % (self.BOLD, id, self.NC, item['label']) + class AccountListFormatter(IFormatter): MANDATORY_FIELDS = ('id', 'label', 'balance', 'coming') @@ -122,13 +126,12 @@ class AccountListFormatter(IFormatter): tot_balance = 0.0 tot_coming = 0.0 - def flush(self): if self.count < 1: return result = u'------------------------------------------%s+----------+----------\n' % (('-' * 15) if not self.interactive else '') - result +=u'%s Total %8s %8s' % ((' ' * 15) if not self.interactive else '', + result += u'%s Total %8s %8s' % ((' ' * 15) if not self.interactive else '', '%.2f' % self.tot_balance, '%.2f' % self.tot_coming) self.after_format(result) self.tot_balance = 0.0 @@ -156,6 +159,7 @@ class AccountListFormatter(IFormatter): self.tot_coming += item['coming'] return result + class Boobank(ReplApplication): APPNAME = 'boobank' VERSION = '0.b' @@ -278,7 +282,7 @@ class Boobank(ReplApplication): try: amount = float(amount) - except (TypeError,ValueError): + except (TypeError, ValueError): print >>sys.stderr, 'Error: please give a decimal amount to transfer' return 2 diff --git a/weboob/applications/masstransit/masstransit.py b/weboob/applications/masstransit/masstransit.py index 10162e0c..fd0154c8 100644 --- a/weboob/applications/masstransit/masstransit.py +++ b/weboob/applications/masstransit/masstransit.py @@ -124,7 +124,7 @@ class MasstransitHildon(): self.main_window.connect("destroy", self.on_main_window_destroy) self.refresh_button.connect("clicked", self.on_refresh_button_clicked) - + self.retour_button.set_sensitive(False) self.retour_button.connect("clicked", self.on_retour_button_clicked) @@ -165,8 +165,8 @@ class MasstransitHildon(): text=4 )) - - + + vertical_box = gtk.VBox() vertical_box.pack_start(horizontal_box) horizontal_box.pack_start(self.retour_button) @@ -187,7 +187,7 @@ class MasstransitHildon(): def fill_touch_selector_entry(self): liste = [] - + for backend in self.weboob.iter_backends(): for station in backend.iter_station_search(""): liste.append(station.name.capitalize()) @@ -272,7 +272,7 @@ class MasstransitHildon(): self.refresh_in_progress = False banner.set_timeout(1) - hildon.hildon_gtk_window_set_progress_indicator(self.main_window, 0) + hildon.hildon_gtk_window_set_progress_indicator(self.main_window, 0) class Masstransit(BaseApplication): diff --git a/weboob/applications/qwebcontentedit/__init__.py b/weboob/applications/qwebcontentedit/__init__.py index faa7196f..fbcba99a 100644 --- a/weboob/applications/qwebcontentedit/__init__.py +++ b/weboob/applications/qwebcontentedit/__init__.py @@ -1,3 +1,4 @@ from .qwebcontentedit import QWebContentEdit -__all__ = ['QWebContentEdit'] \ No newline at end of file + +__all__ = ['QWebContentEdit'] diff --git a/weboob/applications/qwebcontentedit/qwebcontentedit.py b/weboob/applications/qwebcontentedit/qwebcontentedit.py index 483a308d..cd6683c8 100644 --- a/weboob/applications/qwebcontentedit/qwebcontentedit.py +++ b/weboob/applications/qwebcontentedit/qwebcontentedit.py @@ -22,6 +22,7 @@ from weboob.capabilities.content import ICapContent from .main_window import MainWindow + class QWebContentEdit(QtApplication): APPNAME = 'qwebcontentedit' VERSION = '0.b' @@ -34,5 +35,3 @@ class QWebContentEdit(QtApplication): self.main_window = MainWindow(self.config, self.weboob) self.main_window.show() return self.weboob.loop() - - diff --git a/weboob/applications/weboobrepos/weboobrepos.py b/weboob/applications/weboobrepos/weboobrepos.py index 0eaf3855..c6fd5700 100644 --- a/weboob/applications/weboobrepos/weboobrepos.py +++ b/weboob/applications/weboobrepos/weboobrepos.py @@ -124,8 +124,8 @@ class WeboobRepos(ReplApplication): '--keyring', os.path.realpath(krname), '--import', os.path.realpath(keypath)]) # Does not make much sense in our case - if os.path.exists(krname+'~'): - os.remove(krname+'~') + if os.path.exists(krname + '~'): + os.remove(krname + '~') if not os.path.exists(krname): raise Exception('No valid key file found.') kr_mtime = mktime(strptime(str(r.key_update), '%Y%m%d%H%M')) @@ -134,7 +134,6 @@ class WeboobRepos(ReplApplication): else: print 'Keyring is up to date' - for name, module in r.modules.iteritems(): tarname = os.path.join(repo_path, '%s.tar.gz' % name) if r.signed: @@ -185,7 +184,7 @@ class WeboobRepos(ReplApplication): # Check if all files have an up to date signature for filename in sigfiles: filepath = os.path.realpath(os.path.join(repo_path, filename)) - sigpath = filepath+'.sig' + sigpath = filepath + '.sig' file_mtime = int(os.path.getmtime(filepath)) if os.path.exists(sigpath): sig_mtime = int(os.path.getmtime(sigpath)) @@ -202,7 +201,6 @@ class WeboobRepos(ReplApplication): os.utime(sigpath, (file_mtime, file_mtime)) print 'Signatures are up to date' - @staticmethod def _find_gpg(): if os.getenv('GPG_EXECUTABLE'): @@ -221,4 +219,3 @@ class WeboobRepos(ReplApplication): if filename.endswith('.png'): return True return False - diff --git a/weboob/capabilities/base.py b/weboob/capabilities/base.py index 3a7e76c8..d0edeabf 100644 --- a/weboob/capabilities/base.py +++ b/weboob/capabilities/base.py @@ -64,6 +64,7 @@ class NotLoaded(object): class IBaseCap(object): pass + class CapBaseObject(object): FIELDS = None _attribs = None @@ -128,7 +129,7 @@ class CapBaseObject(object): if self.FIELDS is None: yield 'id', self.id for key, value in iter_fields(self): - if key not in ('id', 'backend','FIELDS'): + if key not in ('id', 'backend', 'FIELDS'): yield key, value else: yield 'id', self.id diff --git a/weboob/capabilities/contact.py b/weboob/capabilities/contact.py index d15baae24..90336cb2 100644 --- a/weboob/capabilities/contact.py +++ b/weboob/capabilities/contact.py @@ -24,6 +24,7 @@ from weboob.tools.ordereddict import OrderedDict __all__ = ['ICapContact', 'Contact'] + class ProfileNode(object): HEAD = 0x01 SECTION = 0x02 @@ -38,6 +39,7 @@ class ProfileNode(object): def __getitem__(self, key): return self.value[key] + class ContactPhoto(CapBaseObject): def __init__(self, name): CapBaseObject.__init__(self, name) @@ -59,6 +61,7 @@ class ContactPhoto(CapBaseObject): len(self.data) if self.data else 0, len(self.thumbnail_data) if self.thumbnail_data else 0) + class Contact(CapBaseObject): STATUS_ONLINE = 0x001 STATUS_AWAY = 0x002 @@ -83,14 +86,17 @@ class Contact(CapBaseObject): for key, value in kwargs.iteritems(): setattr(photo, key, value) + class QueryError(Exception): pass + class Query(CapBaseObject): def __init__(self, id, message): CapBaseObject.__init__(self, id) self.add_field('message', basestring, message) + class ICapContact(IBaseCap): def iter_contacts(self, status=Contact.STATUS_ALL, ids=None): """ @@ -129,20 +135,20 @@ class ICapContact(IBaseCap): @except QueryError """ raise NotImplementedError() - + def get_notes(self, id): """ Get personal notes about a contact - + @param id the ID of the contact @return a unicode object """ raise NotImplementedError - + def save_notes(self, id, notes): """ Set personal notes about a contact - + @param id the ID of the contact @param notes the unicode object to save as notes """ diff --git a/weboob/core/backendscfg.py b/weboob/core/backendscfg.py index 6d6068e5..290f1dc6 100644 --- a/weboob/core/backendscfg.py +++ b/weboob/core/backendscfg.py @@ -28,9 +28,11 @@ from logging import warning __all__ = ['BackendsConfig', 'BackendAlreadyExists'] + class BackendAlreadyExists(Exception): pass + class BackendsConfig(object): class WrongPermissions(Exception): pass @@ -41,13 +43,13 @@ class BackendsConfig(object): mode = os.stat(confpath).st_mode except OSError: if sys.platform == 'win32': - fptr = open(confpath,'w') + fptr = open(confpath, 'w') fptr.close() else: try: os.mknod(confpath, 0600) except OSError: - fptr = open(confpath,'w') + fptr = open(confpath, 'w') fptr.close() os.chmod(confpath, 0600) else: @@ -129,5 +131,3 @@ class BackendsConfig(object): with open(self.confpath, 'w') as f: config.write(f) return True - - diff --git a/weboob/core/repositories.py b/weboob/core/repositories.py index 0ea0b4d2..f336d5cf 100644 --- a/weboob/core/repositories.py +++ b/weboob/core/repositories.py @@ -356,7 +356,7 @@ class Versions(object): with open(os.path.join(self.path, self.VERSIONS_LIST), 'wb') as fp: config.write(fp) -class IProgress: +class IProgress(object): def progress(self, percent, message): print '=== [%3.0f%%] %s' % (percent*100, message) diff --git a/weboob/tools/__init__.py b/weboob/tools/__init__.py index 8b137891..e69de29b 100644 --- a/weboob/tools/__init__.py +++ b/weboob/tools/__init__.py @@ -1 +0,0 @@ - diff --git a/weboob/tools/application/__init__.py b/weboob/tools/application/__init__.py index 8b137891..e69de29b 100644 --- a/weboob/tools/application/__init__.py +++ b/weboob/tools/application/__init__.py @@ -1 +0,0 @@ - diff --git a/weboob/tools/application/formatters/__init__.py b/weboob/tools/application/formatters/__init__.py index 8b137891..e69de29b 100644 --- a/weboob/tools/application/formatters/__init__.py +++ b/weboob/tools/application/formatters/__init__.py @@ -1 +0,0 @@ - diff --git a/weboob/tools/application/formatters/iformatter.py b/weboob/tools/application/formatters/iformatter.py index 3041ee7e..bfa4f671 100644 --- a/weboob/tools/application/formatters/iformatter.py +++ b/weboob/tools/application/formatters/iformatter.py @@ -92,7 +92,7 @@ class IFormatter(object): if sys.platform == 'win32': self.termrows = WConio.gettextinfo()[8] else: - self.termrows = int( subprocess.Popen('stty size', shell=True, stdout=subprocess.PIPE).communicate()[0].split()[0]) + self.termrows = int(subprocess.Popen('stty size', shell=True, stdout=subprocess.PIPE).communicate()[0].split()[0]) def after_format(self, formatted): if self.outfile != sys.stdout: diff --git a/weboob/tools/application/formatters/webkit/webkitgtk.py b/weboob/tools/application/formatters/webkit/webkitgtk.py index ca2c0f37..15d0a038 100644 --- a/weboob/tools/application/formatters/webkit/webkitgtk.py +++ b/weboob/tools/application/formatters/webkit/webkitgtk.py @@ -36,9 +36,9 @@ class WebBrowser(gtk.Window): self.connect('destroy', gtk.main_quit) self.set_default_size(800, 600) self.web_view = webkit.WebView() - sw = gtk.ScrolledWindow() - sw.add(self.web_view) - self.add(sw) + sw = gtk.ScrolledWindow() + sw.add(self.web_view) + self.add(sw) self.show_all() diff --git a/weboob/tools/backend.py b/weboob/tools/backend.py index 151479d5..6c00b840 100644 --- a/weboob/tools/backend.py +++ b/weboob/tools/backend.py @@ -62,6 +62,7 @@ class BackendStorage(object): if self.storage: return self.storage.save('backends', self.name) + class BackendConfig(ValuesDict): modname = None instname = None @@ -118,6 +119,7 @@ class BackendConfig(ValuesDict): self.weboob.backends_config.add_backend(self.instname, self.modname, dump, edit) + class BaseBackend(object): # Backend name. NAME = None @@ -149,7 +151,8 @@ class BaseBackend(object): # NOT yet filled. OBJECTS = {} - class ConfigError(Exception): pass + class ConfigError(Exception): + pass def __enter__(self): self.lock.acquire() @@ -184,6 +187,7 @@ class BaseBackend(object): class classprop(object): def __init__(self, fget): self.fget = fget + def __get__(self, inst, objtype=None): if inst: return self.fget(inst) diff --git a/weboob/tools/capabilities/__init__.py b/weboob/tools/capabilities/__init__.py index 8b137891..e69de29b 100644 --- a/weboob/tools/capabilities/__init__.py +++ b/weboob/tools/capabilities/__init__.py @@ -1 +0,0 @@ - diff --git a/weboob/tools/capabilities/gallery/genericcomicreader.py b/weboob/tools/capabilities/gallery/genericcomicreader.py index 2ceeb0fc..f4a857cf 100644 --- a/weboob/tools/capabilities/gallery/genericcomicreader.py +++ b/weboob/tools/capabilities/gallery/genericcomicreader.py @@ -28,6 +28,7 @@ from weboob.tools.test import BackendTest __all__ = ['GenericComicReaderBackend'] + class DisplayPage(BasePage): def get_page(self, gallery): src = self.document.xpath(self.browser.params['img_src_xpath'])[0] @@ -102,7 +103,6 @@ class GenericComicReaderBackend(BaseBackend, ICapGallery): else: return None - gallery = BaseGallery(_id, url=(self.ID_TO_URL % _id)) with self.browser: return gallery @@ -116,7 +116,7 @@ class GenericComicReaderBackend(BaseBackend, ICapGallery): OBJECTS = { BaseGallery: fill_gallery, - BaseImage: fill_image } + BaseImage: fill_image} class GenericComicReaderTest(BackendTest): @@ -126,4 +126,3 @@ class GenericComicReaderTest(BackendTest): it.next() img = it.next() self.backend.fillobj(img, ('url', 'data')) - diff --git a/weboob/tools/capabilities/messages/GenericBackend.py b/weboob/tools/capabilities/messages/GenericBackend.py index b5911eda..653b1b65 100644 --- a/weboob/tools/capabilities/messages/GenericBackend.py +++ b/weboob/tools/capabilities/messages/GenericBackend.py @@ -20,11 +20,12 @@ # python2.5 compatibility from __future__ import with_statement -import time +import time from weboob.capabilities.messages import ICapMessages, Message, Thread from weboob.tools.backend import BaseBackend from weboob.tools.newsfeed import Newsfeed + class GenericNewspaperBackend(BaseBackend, ICapMessages): "GenericNewspaperBackend class" MAINTAINER = 'Julien Hebert' @@ -71,13 +72,13 @@ class GenericNewspaperBackend(BaseBackend, ICapMessages): content=content.body, signature='URL: %s' % content.url, flags=flags, - children= []) + children=[]) return thread def iter_threads(self): for article in Newsfeed(self.RSS_FEED, GenericNewspaperBackend.RSSID).iter_entries(): thread = Thread(article.id) - thread.title = article.title + thread.title = article.title thread.date = article.datetime yield(thread) @@ -112,7 +113,7 @@ class GenericNewspaperBackend(BaseBackend, ICapMessages): if time.time() - lastpurge > 7200: self.storage.set('lastpurge', time.time()) for id in self.storage.get('seen', default={}): - l.append((int(url2id(id)), id)) + l.append((int(url2id(id)), id)) l.sort() l.reverse() tosave = [v[1] for v in l[0:self.RSSSIZE + 10]] diff --git a/weboob/tools/capabilities/messages/genericArticle.py b/weboob/tools/capabilities/messages/genericArticle.py index 18bc9447..2a29e3c7 100644 --- a/weboob/tools/capabilities/messages/genericArticle.py +++ b/weboob/tools/capabilities/messages/genericArticle.py @@ -23,8 +23,8 @@ from lxml.etree import Comment def try_remove(parser, base_element, selector): - try : - base_element.remove(parser.select(base_element, selector, 1 )) + try: + base_element.remove(parser.select(base_element, selector, 1)) except (BrokenPageError, ValueError): pass @@ -33,6 +33,7 @@ def try_drop_tree(parser, base_element, selector): for el in parser.select(base_element, selector): el.drop_tree() + def remove_from_selector_list(parser, base_element, selector_list): for selector in selector_list: base_element.remove(parser.select(base_element, selector, 1)) @@ -42,24 +43,28 @@ def try_remove_from_selector_list(parser, base_element, selector_list): for selector in selector_list: try_remove(parser, base_element, selector) + def drop_comments(base_element): for comment in base_element.getiterator(Comment): comment.drop_tree() - class NoAuthorElement(BrokenPageError): pass + class NoBodyElement(BrokenPageError): pass + class NoTitleException(BrokenPageError): pass + class NoneMainDiv(AttributeError): pass + class Article(object): author = u'' title = u'' @@ -71,10 +76,11 @@ class Article(object): self.url = u'' self.date = None + class GenericNewsPage(BasePage): __element_body = NotImplementedError __article = Article - element_title_selector = NotImplementedError + element_title_selector = NotImplementedError main_div = NotImplementedError element_body_selector = NotImplementedError element_author_selector = NotImplementedError @@ -90,7 +96,7 @@ class GenericNewsPage(BasePage): return self.__article.author def get_title(self): - try : + try: return self.parser.select( self.main_div, self.element_title_selector, @@ -108,7 +114,7 @@ class GenericNewsPage(BasePage): return self.get_title() def get_element_body(self): - try : + try: return self.parser.select(self.main_div, self.element_body_selector, 1) except BrokenPageError: raise NoBodyElement("no body on %s" % (self.browser)) diff --git a/weboob/tools/captcha/virtkeyboard.py b/weboob/tools/captcha/virtkeyboard.py index 12346db7..d546c3b8 100644 --- a/weboob/tools/captcha/virtkeyboard.py +++ b/weboob/tools/captcha/virtkeyboard.py @@ -21,87 +21,88 @@ import hashlib import Image + class VirtKeyboardError(Exception): def __init__(self, msg): Exception.__init__(self, msg) class VirtKeyboard(object): - def __init__(self, file,coords,color): + def __init__(self, file, coords, color): # file: virtual keyboard image # coords: dictionary : # color: color of the symbols in the image # depending on the image, it can be a single value or a tuple - img=Image.open(file) + img = Image.open(file) - self.bands=img.getbands() - if isinstance(color,int) and not isinstance(self.bands,str) and len(self.bands)!=1: + self.bands = img.getbands() + if isinstance(color, int) and not isinstance(self.bands, str) and len(self.bands) != 1: raise VirtKeyboardError("Color requires %i component but only 1 is provided" \ % len(self.bands)) - if not isinstance(color, int) and len(color)!=len(self.bands): + if not isinstance(color, int) and len(color) != len(self.bands): raise VirtKeyboardError("Color requires %i components but %i are provided" \ - % (len(self.bands),len(color))) - self.color=color + % (len(self.bands), len(color))) + self.color = color - (self.width,self.height)=img.size - self.pixar=img.load() - self.coords={} - self.md5={} + (self.width, self.height) = img.size + self.pixar = img.load() + self.coords = {} + self.md5 = {} for i in coords.keys(): - coord=self.get_symbol_coords(coords[i]) - if coord==(-1,-1,-1,-1): + coord = self.get_symbol_coords(coords[i]) + if coord == (-1, -1, -1, -1): continue - self.coords[i]=coord - self.md5[i]=self.checksum(self.coords[i]) + self.coords[i] = coord + self.md5[i] = self.checksum(self.coords[i]) - def get_symbol_coords(self,(x1,y1,x2,y2)): - newY1=-1 - newY2=-1 - for y in range(y1,min(y2+1,self.height)): - empty_line=True - for x in range(x1,min(x2+1,self.width)): - if self.pixar[x,y] == self.color: - empty_line=False - if newY1==-1: - newY1=y - break; - else: - break - if newY1!=-1 and not empty_line: - newY2=y - newX1=-1 - newX2=-1 - for x in range(x1,min(x2+1,self.width)): - empty_column=True - for y in range(y1,min(y2+1,self.height)): - if self.pixar[x,y] == self.color: - empty_column=False - if newX1==-1: - newX1=x + def get_symbol_coords(self, (x1, y1, x2, y2)): + newY1 = -1 + newY2 = -1 + for y in range(y1, min(y2 + 1, self.height)): + empty_line = True + for x in range(x1, min(x2 + 1, self.width)): + if self.pixar[x, y] == self.color: + empty_line = False + if newY1 == -1: + newY1 = y break else: break - if newX1!=-1 and not empty_column: - newX2=x - return (newX1,newY1,newX2,newY2) + if newY1 != -1 and not empty_line: + newY2 = y + newX1 = -1 + newX2 = -1 + for x in range(x1, min(x2 + 1, self.width)): + empty_column = True + for y in range(y1, min(y2 + 1, self.height)): + if self.pixar[x, y] == self.color: + empty_column = False + if newX1 == -1: + newX1 = x + break + else: + break + if newX1 != -1 and not empty_column: + newX2 = x + return (newX1, newY1, newX2, newY2) - def checksum(self,(x1,y1,x2,y2)): + def checksum(self, (x1, y1, x2, y2)): s = '' - for y in range(y1,min(y2+1,self.height)): - for x in range(x1,min(x2+1,self.width)): - if self.pixar[x,y]==self.color: + for y in range(y1, min(y2 + 1, self.height)): + for x in range(x1, min(x2 + 1, self.width)): + if self.pixar[x, y] == self.color: s += "." else: s += " " return hashlib.md5(s).hexdigest() - def get_symbol_code(self,md5sum): + def get_symbol_code(self, md5sum): for i in self.md5.keys(): if md5sum == self.md5[i]: return i raise VirtKeyboardError('Symbol not found') - def check_symbols(self,symbols,dirname): + def check_symbols(self, symbols, dirname): # symbols: dictionary : for s in symbols.keys(): try: @@ -109,32 +110,33 @@ class VirtKeyboard(object): except VirtKeyboardError: self.generate_MD5(dirname) raise VirtKeyboardError("Symbol '%s' not found; all symbol hashes are available in %s"\ - % (s,dirname)) + % (s, dirname)) - def generate_MD5(self,dir): + def generate_MD5(self, dir): for i in self.coords.keys(): - width=self.coords[i][2]-self.coords[i][0]+1 - height=self.coords[i][3]-self.coords[i][1]+1 - img=Image.new(''.join(self.bands),(width,height)) - matrix=img.load() + width = self.coords[i][2] - self.coords[i][0] + 1 + height = self.coords[i][3] - self.coords[i][1] + 1 + img = Image.new(''.join(self.bands), (width, height)) + matrix = img.load() for y in range(height): for x in range(width): - matrix[x,y]=self.pixar[self.coords[i][0]+x,self.coords[i][1]+y] - img.save(dir+"/"+self.md5[i]+".png") + matrix[x, y] = self.pixar[self.coords[i][0] + x, self.coords[i][1] + y] + img.save(dir + "/" + self.md5[i] + ".png") + class MappedVirtKeyboard(VirtKeyboard): def __init__(self, file, document, img_element, color, map_attr="onclick"): - map_id=img_element.attrib.get("usemap")[1:] - map=document.find("//map[@id='"+map_id+"']") + map_id = img_element.attrib.get("usemap")[1:] + map = document.find("//map[@id='" + map_id + "']") if map is None: - map=document.find("//map[@name='"+map_id+"']") + map = document.find("//map[@name='" + map_id + "']") - coords={} + coords = {} for area in map.getiterator("area"): - code=area.attrib.get(map_attr) - area_coords=[] + code = area.attrib.get(map_attr) + area_coords = [] for coord in area.attrib.get("coords").split(','): area_coords.append(int(coord)) - coords[code]=tuple(area_coords) + coords[code] = tuple(area_coords) - VirtKeyboard.__init__(self,file,coords,color) + VirtKeyboard.__init__(self, file, coords, color) diff --git a/weboob/tools/config/iconfig.py b/weboob/tools/config/iconfig.py index 7e2b99b7..46efd88d 100644 --- a/weboob/tools/config/iconfig.py +++ b/weboob/tools/config/iconfig.py @@ -22,7 +22,7 @@ class ConfigError(Exception): pass -class IConfig: +class IConfig(object): def load(self, default={}): raise NotImplementedError() diff --git a/weboob/tools/decorators.py b/weboob/tools/decorators.py index 52c88dd4..80b87297 100644 --- a/weboob/tools/decorators.py +++ b/weboob/tools/decorators.py @@ -40,13 +40,12 @@ def retry(ExceptionToCheck, tries=4, delay=3, backoff=2): try_one_last_time = False break except ExceptionToCheck, e: - logging.debug(u'%s, Retrying in %d seconds...' % (e, - mdelay)) + logging.debug(u'%s, Retrying in %d seconds...' % (e, mdelay)) time.sleep(mdelay) mtries -= 1 mdelay *= backoff if try_one_last_time: return f(*args, **kwargs) return - return f_retry # true decorator + return f_retry # true decorator return deco_retry diff --git a/weboob/tools/log.py b/weboob/tools/log.py index ba70ce28..57a66918 100644 --- a/weboob/tools/log.py +++ b/weboob/tools/log.py @@ -35,11 +35,13 @@ COLORS = { 'CRITICAL': COLOR_SEQ % ("\033[1;33m\033[1;41m"), } + def getLogger(name, parent=None): if parent: name = parent.name + '.' + name return _getLogger(name) + class ColoredFormatter(Formatter): """ Class written by airmind: @@ -52,9 +54,9 @@ class ColoredFormatter(Formatter): msg = COLORS[levelname] % msg return msg + def createColoredFormatter(stream, format): if (sys.platform != 'win32') and stream.isatty(): return ColoredFormatter(format) else: return Formatter(format) - diff --git a/weboob/tools/misc.py b/weboob/tools/misc.py index 8dcc7e11..26d80c4a 100644 --- a/weboob/tools/misc.py +++ b/weboob/tools/misc.py @@ -68,6 +68,7 @@ try: html2text = h2t.html2text except ImportError: warning('python-html2text is not present. HTML pages will not be converted into text.') + def html2text(html): return html @@ -117,6 +118,7 @@ def utc2local(date): date = date.astimezone(tz.tzlocal()) return date + def limit(iterator, lim): count = 0 iterator = iter(iterator) @@ -125,6 +127,7 @@ def limit(iterator, lim): count += 1 raise StopIteration() + def ratelimit(group, delay): """ Simple rate limiting. diff --git a/weboob/tools/newsfeed.py b/weboob/tools/newsfeed.py index b1c7c432..cfd5e890 100644 --- a/weboob/tools/newsfeed.py +++ b/weboob/tools/newsfeed.py @@ -29,46 +29,46 @@ if feedparser.__version__ >= '5.0': __all__ = ['Entry', 'Newsfeed'] -class Entry: +class Entry(object): def __init__(self, entry, rssid_func=None): if hasattr(entry, 'id'): self.id = entry.id else: self.id = None - if entry.has_key("link"): + if "link" in entry: self.link = entry["link"] else: self.link = None - if entry.has_key("title"): + if "title" in entry: self.title = entry["title"] else: self.title = None - if entry.has_key("author"): + if "author" in entry: self.author = entry["author"] else: self.author = None - if entry.has_key("updated_parsed"): + if "updated_parsed" in entry: self.datetime = datetime.datetime(*entry['updated_parsed'][:7]) else: self.datetime = None - if entry.has_key("summary"): + if "summary" in entry: self.summary = entry["summary"] else: self.summary = None self.content = [] - if entry.has_key("content"): + if "content" in entry: for i in entry["content"]: self.content.append(i.value) elif self.summary: self.content.append(self.summary) - if entry.has_key("wfw_commentrss"): + if "wfw_commentrss" in entry: self.rsscomment = entry["wfw_commentrss"] else: self.rsscomment = None @@ -76,7 +76,8 @@ class Entry: if rssid_func: self.id = rssid_func(self) -class Newsfeed: + +class Newsfeed(object): def __init__(self, url, rssid_func=None): self.feed = feedparser.parse(url) self.rssid_func = rssid_func diff --git a/weboob/tools/ordereddict.py b/weboob/tools/ordereddict.py index 9a70c71f..ece8ad41 100644 --- a/weboob/tools/ordereddict.py +++ b/weboob/tools/ordereddict.py @@ -30,7 +30,6 @@ except ImportError: ## {{{ http://code.activestate.com/recipes/576693/ (r6) from UserDict import DictMixin - class OrderedDict(dict, DictMixin): def __init__(self, *args, **kwds): diff --git a/weboob/tools/parsers/__init__.py b/weboob/tools/parsers/__init__.py index d1331629..7a3e7a2f 100644 --- a/weboob/tools/parsers/__init__.py +++ b/weboob/tools/parsers/__init__.py @@ -24,34 +24,42 @@ import logging __all__ = ['get_parser', 'NoParserFound'] -class NoParserFound(Exception): pass +class NoParserFound(Exception): + pass + def load_lxml(): from .lxmlparser import LxmlHtmlParser return LxmlHtmlParser + def load_lxmlsoup(): from .lxmlsoupparser import LxmlSoupParser return LxmlSoupParser + def load_html5lib(): from .html5libparser import Html5libParser return Html5libParser + def load_elementtidy(): from .elementtidyparser import ElementTidyParser return ElementTidyParser + def load_builtin(): from .htmlparser import HTMLParser return HTMLParser + def load_json(): # This parser doesn't read HTML, don't include it in the # preference_order default value below. from .jsonparser import JsonParser return JsonParser + def get_parser(preference_order=('lxml', 'lxmlsoup')): """ Get a parser from a preference order list. diff --git a/weboob/tools/parsers/html5libparser.py b/weboob/tools/parsers/html5libparser.py index 4d293ac9..ec9e3fe6 100644 --- a/weboob/tools/parsers/html5libparser.py +++ b/weboob/tools/parsers/html5libparser.py @@ -38,8 +38,8 @@ class Html5libParser(HTMLParser, IParser): """ # Default implementation for each type of API. - defaults = {'etree': ElementTree, - } + defaults = {'etree': ElementTree} + def __init__(self, api='etree'): # if no default implementation is defined for this api, set it to None # to let getTreeBuilder() using the corresponding implementation. diff --git a/weboob/tools/property.py b/weboob/tools/property.py index 6e49b687..22319e1a 100644 --- a/weboob/tools/property.py +++ b/weboob/tools/property.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# For Python 2.5-, this will enable the simliar property mechanism as in +# For Python 2.5-, this will enable the similar property mechanism as in # Python 2.6+/3.0+. The code is based on # http://bruynooghe.blogspot.com/2008/04/xsetter-syntax-in-python-25.html @@ -27,26 +27,26 @@ import __builtin__ class property(property): - def __init__(self, fget, *args, **kwargs): - self.__doc__ = fget.__doc__ - super(property, self).__init__(fget, *args, **kwargs) + def __init__(self, fget, *args, **kwargs): + self.__doc__ = fget.__doc__ + super(property, self).__init__(fget, *args, **kwargs) - def setter(self, fset): - cls_ns = sys._getframe(1).f_locals - for k, v in cls_ns.iteritems(): - if v == self: - propname = k - break - cls_ns[propname] = property(self.fget, fset, self.fdel, self.__doc__) - return cls_ns[propname] + def setter(self, fset): + cls_ns = sys._getframe(1).f_locals + for k, v in cls_ns.iteritems(): + if v == self: + propname = k + break + cls_ns[propname] = property(self.fget, fset, self.fdel, self.__doc__) + return cls_ns[propname] - def deleter(self, fdel): - cls_ns = sys._getframe(1).f_locals - for k, v in cls_ns.iteritems(): - if v == self: - propname = k - break - cls_ns[propname] = property(self.fget, self.fset, fdel, self.__doc__) - return cls_ns[propname] + def deleter(self, fdel): + cls_ns = sys._getframe(1).f_locals + for k, v in cls_ns.iteritems(): + if v == self: + propname = k + break + cls_ns[propname] = property(self.fget, self.fset, fdel, self.__doc__) + return cls_ns[propname] __builtin__.property = property diff --git a/weboob/tools/storage.py b/weboob/tools/storage.py index 2ec7b63f..bc1e3918 100644 --- a/weboob/tools/storage.py +++ b/weboob/tools/storage.py @@ -23,7 +23,7 @@ from copy import deepcopy from .config.yamlconfig import YamlConfig -class IStorage: +class IStorage(object): def load(self, what, name, default={}): raise NotImplementedError()