From 7094931c92e74a61e4fc27d09b39286b6de22b5e Mon Sep 17 00:00:00 2001 From: Laurent Bachelier Date: Fri, 15 Mar 2013 20:01:49 +0100 Subject: [PATCH] Easy spacing fixes, trailing stuff Remove useless trailing \ Remove trailing spaces Add missing empty lines autopep8 -ir -j2 --select=E301,E302,E502,W291,W293,W391 . Diff quickly checked. --- contrib/boobot.py | 9 ++++++--- contrib/downloadboob/downloadboob.py | 4 ++++ .../videoob_web/videoob_web/videoob_web.py | 2 +- docs/source/genapi.py | 1 + modules/arte/pages.py | 1 + modules/attilasub/pages.py | 2 +- modules/attilasub/test.py | 1 + modules/aum/backend.py | 2 ++ modules/aum/browser.py | 1 + modules/aum/captcha.py | 4 ++++ modules/aum/contact.py | 1 + modules/axabanque/pages.py | 2 ++ modules/axabanque/test.py | 1 + modules/banquepopulaire/pages.py | 4 ++++ modules/banquepopulaire/test.py | 1 + modules/barclays/pages.py | 8 ++++++++ modules/barclays/test.py | 1 + modules/bnporc/perso/login.py | 3 +++ modules/bnporc/perso/transactions.py | 1 + modules/bnporc/perso/transfer.py | 1 + modules/bnporc/pro.py | 2 ++ modules/boursorama/pages/__init__.py | 1 + modules/boursorama/pages/account_history.py | 2 ++ modules/boursorama/pages/login.py | 2 ++ modules/boursorama/test.py | 1 + modules/bouygues/test.py | 1 + modules/bp/pages/accounthistory.py | 2 ++ modules/bp/pages/login.py | 4 ++++ modules/bred/pages.py | 5 +++++ modules/bred/test.py | 1 + modules/btmon/pages.py | 3 +-- modules/btmon/test.py | 1 + modules/caissedepargne/pages.py | 4 ++++ modules/caissedepargne/test.py | 1 + modules/canalplus/test.py | 1 + modules/canaltp/test.py | 1 + modules/carrefourbanque/pages.py | 3 +++ modules/carrefourbanque/test.py | 1 + modules/cic/pages.py | 12 ++++++++++++ modules/cic/test.py | 1 + modules/cmb/hellhttp.py | 5 +++-- modules/cmso/pages.py | 1 + modules/cmso/test.py | 1 + modules/cragr/browser.py | 1 + modules/cragr/pages/accounts_list.py | 2 ++ modules/cragr/pages/base.py | 1 + modules/cragr/pages/tokenextractor.py | 6 ++++++ modules/cragr/test.py | 1 + modules/creditcooperatif/perso/pages.py | 6 ++++++ modules/creditcooperatif/pro/pages.py | 6 ++++++ modules/creditcooperatif/test.py | 1 + modules/creditdunord/pages.py | 3 +++ modules/creditdunord/test.py | 1 + modules/creditmutuel/pages.py | 12 ++++++++++++ modules/creditmutuel/test.py | 3 +-- modules/dailymotion/backend.py | 1 + modules/dailymotion/pages.py | 1 + modules/dlfp/backend.py | 2 +- modules/dlfp/browser.py | 2 ++ modules/dlfp/pages/board.py | 3 +++ modules/dlfp/pages/index.py | 3 +++ modules/dlfp/pages/news.py | 9 +++++++++ modules/dlfp/pages/wiki.py | 1 + modules/dlfp/tools.py | 5 +++++ modules/dresdenwetter/pages.py | 4 ++-- modules/ehentai/backend.py | 1 + modules/ehentai/gallery.py | 2 ++ modules/europarl/pages.py | 7 ++++--- modules/europarl/video.py | 1 - modules/fortuneo/browser.py | 1 + modules/fortuneo/pages/accounts_list.py | 3 +++ modules/fortuneo/pages/login.py | 1 + modules/fortuneo/test.py | 1 + modules/fourchan/test.py | 1 + modules/francetelevisions/test.py | 1 + modules/ganassurances/pages.py | 2 ++ modules/ganassurances/test.py | 1 + modules/gazelle/test.py | 1 + modules/gdcvault/pages.py | 5 +++-- modules/gdcvault/video.py | 1 - modules/geolocip/test.py | 1 + modules/googletranslate/browser.py | 2 +- modules/hds/browser.py | 2 ++ modules/hsbc/browser.py | 1 + modules/hsbc/pages/accounts.py | 4 ++++ modules/hsbc/test.py | 1 + modules/imdb/browser.py | 2 ++ modules/imdb/pages.py | 1 + modules/imdb/test.py | 3 ++- modules/ina/test.py | 1 + modules/ing/pages/accounts_list.py | 1 + modules/inrocks/backend.py | 1 + modules/inrocks/pages/article.py | 1 + modules/inrocks/pages/inrockstv.py | 1 + modules/inrocks/tools.py | 1 + modules/ipinfodb/backend.py | 12 ++++++------ modules/ipinfodb/test.py | 1 + modules/isohunt/test.py | 1 + modules/kickass/pages.py | 2 +- modules/kickass/test.py | 1 + modules/lcl/browser.py | 4 ++-- modules/lcl/pages.py | 4 ++++ modules/lcl/test.py | 1 + modules/lefigaro/backend.py | 1 + modules/lefigaro/browser.py | 1 + modules/lefigaro/tools.py | 1 + modules/mangago/__init__.py | 1 - modules/mangago/backend.py | 2 +- modules/mangago/test.py | 3 ++- modules/marmiton/browser.py | 1 + modules/marmiton/pages.py | 2 +- modules/marmiton/test.py | 2 +- modules/mediawiki/test.py | 1 + modules/meteofrance/test.py | 1 + modules/nolifetv/pages/video.py | 1 + modules/nova/test.py | 1 + modules/okc/backend.py | 2 ++ modules/okc/browser.py | 1 + modules/okc/pages.py | 5 +++++ modules/opacwebaloes/browser.py | 6 +++--- modules/opacwebaloes/pages.py | 5 +++++ modules/opacwebaloes/test.py | 1 + modules/opensubtitles/browser.py | 1 + modules/opensubtitles/test.py | 1 + modules/orange/browser.py | 1 + modules/orange/pages/login.py | 1 + modules/pap/browser.py | 1 + modules/pap/pages.py | 1 + modules/parolesmania/test.py | 1 + modules/parolesmusique/backend.py | 2 +- modules/parolesmusique/pages.py | 1 + modules/parolesmusique/test.py | 1 + modules/pastealacon/browser.py | 1 + modules/pastealacon/pages.py | 3 +++ modules/pastealacon/test.py | 1 + modules/pastebin/test.py | 1 + modules/phpbb/pages/forum.py | 3 +++ modules/phpbb/pages/index.py | 2 ++ modules/phpbb/tools.py | 4 ++++ modules/piratebay/backend.py | 1 + modules/piratebay/test.py | 1 + modules/prixcarburants/pages.py | 2 ++ modules/redmine/pages/index.py | 4 ++++ modules/redmine/pages/issues.py | 6 ++++++ modules/seeklyrics/test.py | 1 + modules/seloger/pages.py | 1 + modules/sfr/test.py | 1 + .../societegenerale/pages/accounts_list.py | 3 +++ modules/societegenerale/test.py | 1 + modules/transilien/backend.py | 1 + modules/transilien/browser.py | 2 ++ modules/transilien/pages/departures.py | 1 + modules/transilien/pages/roadmap.py | 2 ++ modules/transilien/test.py | 1 + modules/trictractv/test.py | 1 + modules/tvsubtitles/browser.py | 1 + modules/tvsubtitles/test.py | 1 + modules/vimeo/pages.py | 1 + modules/vimeo/video.py | 1 - modules/weather/backend.py | 1 + modules/weather/browser.py | 1 + modules/weather/pages.py | 2 ++ modules/weather/test.py | 1 + modules/wordreference/browser.py | 2 +- modules/wordreference/pages.py | 1 - modules/yahoo/test.py | 1 + modules/youtube/pages.py | 2 +- tools/boilerplate_data/base_test.py | 1 + weboob/applications/boobathon/boobathon.py | 3 +++ weboob/applications/boobill/boobill.py | 2 +- weboob/applications/cineoob/cineoob.py | 3 +++ .../applications/masstransit/masstransit.py | 2 ++ weboob/applications/qboobmsg/main_window.py | 1 + .../applications/qboobmsg/messages_manager.py | 1 + weboob/applications/qcineoob/main_window.py | 1 + weboob/applications/qcineoob/minimovie.py | 1 + weboob/applications/qcineoob/miniperson.py | 1 + weboob/applications/qcineoob/minisubtitle.py | 1 + weboob/applications/qcineoob/minitorrent.py | 1 + weboob/applications/qcineoob/movie.py | 1 + weboob/applications/qcineoob/person.py | 1 + weboob/applications/qcineoob/qcineoob.py | 1 + weboob/applications/qcineoob/subtitle.py | 2 +- weboob/applications/qcineoob/torrent.py | 2 +- weboob/applications/qflatboob/main_window.py | 2 ++ weboob/applications/qflatboob/query.py | 3 ++- weboob/applications/qhavedate/contacts.py | 8 ++++++-- weboob/applications/qhavedate/events.py | 1 + weboob/applications/qhavedate/main_window.py | 1 + weboob/applications/qhavedate/qhavedate.py | 1 + weboob/applications/qhavedate/status.py | 2 ++ weboob/applications/qvideoob/main_window.py | 1 + weboob/applications/qvideoob/minivideo.py | 1 + weboob/applications/qvideoob/qvideoob.py | 1 + weboob/applications/qvideoob/video.py | 1 + .../qwebcontentedit/main_window.py | 19 ++++++++++--------- weboob/applications/videoob/videoob.py | 1 + weboob/capabilities/account.py | 2 ++ weboob/capabilities/bank.py | 5 +++++ weboob/capabilities/bill.py | 3 +++ weboob/capabilities/bugtracker.py | 10 ++++++++++ weboob/capabilities/chat.py | 1 + weboob/capabilities/content.py | 2 ++ weboob/capabilities/dating.py | 1 + weboob/capabilities/geolocip.py | 1 + weboob/capabilities/housing.py | 4 ++++ weboob/capabilities/library.py | 2 ++ weboob/capabilities/messages.py | 5 +++++ weboob/capabilities/paste.py | 1 + weboob/capabilities/pricecomparison.py | 3 +++ weboob/capabilities/radio.py | 3 +++ weboob/capabilities/travel.py | 5 +++++ weboob/capabilities/weather.py | 4 ++++ weboob/core/bcall.py | 3 +++ weboob/core/modules.py | 1 + weboob/core/scheduler.py | 2 ++ weboob/tools/application/base.py | 1 + weboob/tools/application/console.py | 2 ++ weboob/tools/application/formatters/load.py | 1 + weboob/tools/application/formatters/table.py | 2 +- weboob/tools/application/media_player.py | 4 ++-- weboob/tools/application/qt/backendcfg.py | 2 +- weboob/tools/application/qt/qt.py | 12 ++++++++++++ weboob/tools/browser/browser.py | 9 +++++++++ weboob/tools/browser/decorators.py | 1 + .../capabilities/messages/genericArticle.py | 2 ++ weboob/tools/capabilities/paste.py | 1 + weboob/tools/captcha/virtkeyboard.py | 6 +++--- weboob/tools/parsers/iparser.py | 1 + weboob/tools/test.py | 1 + weboob/tools/value.py | 5 +++++ 231 files changed, 474 insertions(+), 67 deletions(-) diff --git a/contrib/boobot.py b/contrib/boobot.py index 7bbfe6df14..8ffb57662f 100755 --- a/contrib/boobot.py +++ b/contrib/boobot.py @@ -33,6 +33,7 @@ IRC_SERVER = 'irc.freenode.org' STORAGE_FILE = 'boobot.storage' + class MyThread(Thread): def __init__(self, bot): Thread.__init__(self) @@ -50,9 +51,9 @@ def run(self): self.weboob.loop() def find_keywords(self, text): - for word in ['weboob', 'videoob', 'havesex', 'havedate', 'monboob', 'boobmsg', \ - 'flatboob', 'boobill', 'pastoob', 'radioob', 'translaboob', 'traveloob', \ - 'boobathon', 'boobank', 'boobtracker', 'comparoob', 'wetboobs', \ + for word in ['weboob', 'videoob', 'havesex', 'havedate', 'monboob', 'boobmsg', + 'flatboob', 'boobill', 'pastoob', 'radioob', 'translaboob', 'traveloob', + 'boobathon', 'boobank', 'boobtracker', 'comparoob', 'wetboobs', 'webcontentedit', 'weboorrents', 'capabilit', u'sàt', u'salut à toi']: if word in text.lower(): return word @@ -80,6 +81,7 @@ def iter_messages(backend): def stop(self): self.weboob.want_stop() + class TestBot(SingleServerIRCBot): def __init__(self, channel, nickname, server, port=6667): SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname + "`") @@ -121,6 +123,7 @@ def obj_info_housing(self, backend, id): if h: self.send_message(u'Housing: %s (%sm² / %s%s)' % (h.title, h.area, h.cost, h.currency)) + def main(): logging.basicConfig(level=logging.DEBUG) bot = TestBot(IRC_CHANNEL, IRC_NICKNAME, IRC_SERVER) diff --git a/contrib/downloadboob/downloadboob.py b/contrib/downloadboob/downloadboob.py index babce1c470..49e9fcebea 100755 --- a/contrib/downloadboob/downloadboob.py +++ b/contrib/downloadboob/downloadboob.py @@ -39,14 +39,18 @@ # end of hack + def removeNonAscii(s): return "".join(i for i in s if ord(i)<128) rx = re.compile(u'[ \\/\\?\\:\\>\\<\\!\\\\\\*]+', re.UNICODE) + + def removeSpecial(s): return rx.sub(u' ', u'%s' % s) DOWNLOAD_DIRECTORY=".files" + class Downloadboob: def __init__(self, backend_name, download_directory, links_directory): diff --git a/contrib/videoob_web/videoob_web/videoob_web.py b/contrib/videoob_web/videoob_web/videoob_web.py index 465531444f..822e538635 100644 --- a/contrib/videoob_web/videoob_web/videoob_web.py +++ b/contrib/videoob_web/videoob_web/videoob_web.py @@ -100,7 +100,7 @@ def index(self, req): page_url=video.page_url, url=video.url if video.url else '/download?id=%s' % video.id, thumbnail_url=video.thumbnail.url, - ) \ + ) for video in backend.search_videos(pattern=q, nsfw=nsfw)] if videos: if merge: diff --git a/docs/source/genapi.py b/docs/source/genapi.py index 53a6c0922f..9994c52a76 100755 --- a/docs/source/genapi.py +++ b/docs/source/genapi.py @@ -4,6 +4,7 @@ import os + def genapi(): os.system('rm -rf api') os.system('mkdir api') diff --git a/modules/arte/pages.py b/modules/arte/pages.py index e391ee0378..230b73fc5b 100644 --- a/modules/arte/pages.py +++ b/modules/arte/pages.py @@ -75,6 +75,7 @@ def iter_videos(self): yield video + class VideoPage(BasePage): def get_video(self, video=None, lang='fr', quality='hd'): if not video: diff --git a/modules/attilasub/pages.py b/modules/attilasub/pages.py index 3cd0ae1fab..31b2092a87 100644 --- a/modules/attilasub/pages.py +++ b/modules/attilasub/pages.py @@ -87,7 +87,7 @@ def iter_subtitles(self,language, pattern): traduced_title_words = traduced_title.split() original_title_words = original_title.split() - # if the pattern is one word and in the title OR if the + # if the pattern is one word and in the title OR if the # intersection between pattern and the title is at least 2 words if (len(pattern_words) == 1 and pattern in traduced_title_words) or\ (len(pattern_words) == 1 and pattern in original_title_words) or\ diff --git a/modules/attilasub/test.py b/modules/attilasub/test.py index 942d37ef16..2746db6582 100644 --- a/modules/attilasub/test.py +++ b/modules/attilasub/test.py @@ -22,6 +22,7 @@ import urllib from random import choice + class AttilasubTest(BackendTest): BACKEND = 'attilasub' diff --git a/modules/aum/backend.py b/modules/aum/backend.py index f640008c4a..bf57762f10 100644 --- a/modules/aum/backend.py +++ b/modules/aum/backend.py @@ -55,6 +55,7 @@ def parse_dt(s): d = _parse_dt(s) return local2utc(d) + class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapChat, ICapContact, ICapAccount): NAME = 'aum' MAINTAINER = u'Romain Bignon' @@ -503,6 +504,7 @@ def register_account(klass, account): browser = None REGISTER_REGEXP = re.compile('.*http://www.adopteunmec.com/register4.php\?([^\' ]*)\'') + def confirm_account(self, mail): msg = email.message_from_string(mail) diff --git a/modules/aum/browser.py b/modules/aum/browser.py index f15b368bed..c420e5a66d 100644 --- a/modules/aum/browser.py +++ b/modules/aum/browser.py @@ -64,6 +64,7 @@ def __init__(self, code): Exception.__init__(self, self.ERRORS.get(code, code)) self.code = code + class AuMBrowser(BaseBrowser): DOMAIN = 'www.adopteunmec.com' APIKEY = 'fb0123456789abcd' diff --git a/modules/aum/captcha.py b/modules/aum/captcha.py index 462d359a02..44683a950e 100644 --- a/modules/aum/captcha.py +++ b/modules/aum/captcha.py @@ -26,8 +26,10 @@ except ImportError: raise ImportError('Please install python-imaging') + class CaptchaError(Exception): pass + class Tile(object): hash = { 'bc8d52d96058478a6def26226145d53b': 'A', @@ -115,6 +117,7 @@ def letter(self): print 'hash: %s' % checksum raise CaptchaError() + class Captcha(object): def __init__(self, f): self.img = Image.open(f) @@ -156,6 +159,7 @@ def text(self): s += tile.letter return s + class Decoder(object): def __init__(self): self.hash = {} diff --git a/modules/aum/contact.py b/modules/aum/contact.py index 7355655609..edf28680a6 100644 --- a/modules/aum/contact.py +++ b/modules/aum/contact.py @@ -140,6 +140,7 @@ def get_value(self, profile, consts): labels.append(consts[self.key][i]) return labels + class Contact(_Contact): TABLE = OrderedDict(( ('_info', OrderedDict(( diff --git a/modules/axabanque/pages.py b/modules/axabanque/pages.py index e74565de06..41d0265b93 100644 --- a/modules/axabanque/pages.py +++ b/modules/axabanque/pages.py @@ -40,6 +40,7 @@ class UnavailablePage(BasePage): def on_loaded(self): raise BrowserUnavailable() + class VirtKeyboard(MappedVirtKeyboard): symbols={'0':'f47e48cfdf3abc6716a6b0aadf8eebe3', '1':'3495abaf658dc550e51c5c92ea56b60b', @@ -148,6 +149,7 @@ def get_list(self): account._args = args yield account + class Transaction(FrenchTransaction): PATTERNS = [(re.compile('^RET(RAIT) DAB (?P
\d{2})/(?P\d{2}) (?P.*)'), FrenchTransaction.TYPE_WITHDRAWAL), diff --git a/modules/axabanque/test.py b/modules/axabanque/test.py index b170710eab..8853c50616 100644 --- a/modules/axabanque/test.py +++ b/modules/axabanque/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class AXABanqueTest(BackendTest): BACKEND = 'axabanque' diff --git a/modules/banquepopulaire/pages.py b/modules/banquepopulaire/pages.py index f8d4993a61..76771c30fe 100644 --- a/modules/banquepopulaire/pages.py +++ b/modules/banquepopulaire/pages.py @@ -39,6 +39,7 @@ def on_loaded(self): else: self.browser.location(a.attrib['href']) + class LoginPage(BasePage): def login(self, login, passwd): self.browser.select_form(name='Login') @@ -46,6 +47,7 @@ def login(self, login, passwd): self.browser['IDToken2'] = passwd.encode(self.browser.ENCODING) self.browser.submit(nologin=True) + class IndexPage(BasePage): def get_token(self): url = self.document.getroot().xpath('//frame[@name="portalHeader"]')[0].attrib['src'] @@ -53,6 +55,7 @@ def get_token(self): args = dict(parse_qsl(v.query)) return args['token'] + class AccountsPage(BasePage): ACCOUNT_TYPES = {u'Mes comptes d\'épargne': Account.TYPE_SAVINGS, u'Mes comptes': Account.TYPE_CHECKING, @@ -101,6 +104,7 @@ def get_list(self): return + class Transaction(FrenchTransaction): PATTERNS = [(re.compile('^RET DAB (?P.*?) RETRAIT (DU|LE) (?P
\d{2})(?P\d{2})(?P\d+).*'), FrenchTransaction.TYPE_WITHDRAWAL), diff --git a/modules/banquepopulaire/test.py b/modules/banquepopulaire/test.py index 61a9db2835..08aabe2150 100644 --- a/modules/banquepopulaire/test.py +++ b/modules/banquepopulaire/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class BanquePopulaireTest(BackendTest): BACKEND = 'banquepopulaire' diff --git a/modules/barclays/pages.py b/modules/barclays/pages.py index 0e640041f0..90742b59ff 100644 --- a/modules/barclays/pages.py +++ b/modules/barclays/pages.py @@ -44,6 +44,7 @@ def has_redirect(self): else: return True + class Login2Page(BasePage): def login(self, secret): label = self.document.xpath('//span[@class="PF_LABEL"]')[0].text.strip() @@ -55,9 +56,11 @@ def login(self, secret): self.browser['word'] = letters self.browser.submit(name='valider', nologin=True) + class IndexPage(BasePage): pass + class AccountsPage(BasePage): ACCOUNT_TYPES = {u'Epargne': Account.TYPE_SAVINGS, u'Liquidités': Account.TYPE_CHECKING, @@ -170,11 +173,13 @@ class Transaction(FrenchTransaction): FrenchTransaction.TYPE_UNKNOWN), ] + class HistoryBasePage(BasePage): def get_history(self): self.logger.warning('Do not support account of type %s' % type(self).__name__) return iter([]) + class TransactionsPage(HistoryBasePage): def get_history(self): for tr in self.document.xpath('//table[@id="operation"]/tbody/tr'): @@ -229,11 +234,14 @@ def get_history(self): t.set_amount(amount) yield t + class ValuationPage(HistoryBasePage): pass + class LoanPage(HistoryBasePage): pass + class MarketPage(HistoryBasePage): pass diff --git a/modules/barclays/test.py b/modules/barclays/test.py index ab919703c5..3c9519095e 100644 --- a/modules/barclays/test.py +++ b/modules/barclays/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class BarclaysTest(BackendTest): BACKEND = 'barclays' diff --git a/modules/bnporc/perso/login.py b/modules/bnporc/perso/login.py index 0a560e1264..423961bd70 100644 --- a/modules/bnporc/perso/login.py +++ b/modules/bnporc/perso/login.py @@ -28,6 +28,7 @@ __all__ = ['LoginPage', 'ConfirmPage', 'ChangePasswordPage'] + class BNPVirtKeyboard(MappedVirtKeyboard): symbols={'0':'9cc4789a2cb223e8f2d5e676e90264b5', '1':'e10b58fc085f9683052d5a63c96fc912', @@ -100,10 +101,12 @@ def get_relocate_url(self): if m: return m.group(1) + class InfoMessagePage(BasePage): def on_loaded(self): pass + class ChangePasswordPage(BasePage): def change_password(self, current, new): try: diff --git a/modules/bnporc/perso/transactions.py b/modules/bnporc/perso/transactions.py index 6c4899dd7c..bdf1ca8c3c 100644 --- a/modules/bnporc/perso/transactions.py +++ b/modules/bnporc/perso/transactions.py @@ -44,6 +44,7 @@ class Transaction(FrenchTransaction): (re.compile('^(?PREMISE CHEQUES)(?P.*)'), FrenchTransaction.TYPE_DEPOSIT), ] + class AccountHistory(BasePage): def iter_operations(self): for tr in self.document.xpath('//table[@id="tableCompte"]//tr'): diff --git a/modules/bnporc/perso/transfer.py b/modules/bnporc/perso/transfer.py index cdfdaad43d..e771667cb4 100644 --- a/modules/bnporc/perso/transfer.py +++ b/modules/bnporc/perso/transfer.py @@ -35,6 +35,7 @@ def __init__(self, id, label, send_checkbox, receive_checkbox): self.send_checkbox = send_checkbox self.receive_checkbox = receive_checkbox + class TransferPage(BasePage): def on_loaded(self): for td in self.document.xpath('//td[@class="hdvon1"]'): diff --git a/modules/bnporc/pro.py b/modules/bnporc/pro.py index 023bef6cf6..5ea8227442 100644 --- a/modules/bnporc/pro.py +++ b/modules/bnporc/pro.py @@ -36,6 +36,7 @@ class ProAccountsList(BasePage): COL_ID = 2 COL_BALANCE = 3 COL_COMING = 5 + def get_list(self): for tr in self.document.xpath('//tr[@class="comptes"]'): cols = tr.findall('td') @@ -57,6 +58,7 @@ def get_list(self): yield account + class ProAccountHistory(BasePage): COL_DATE = 0 COL_LABEL = 1 diff --git a/modules/boursorama/pages/__init__.py b/modules/boursorama/pages/__init__.py index 615a7ef3d7..1b67004054 100644 --- a/modules/boursorama/pages/__init__.py +++ b/modules/boursorama/pages/__init__.py @@ -23,6 +23,7 @@ from .accounts_list import AccountsList from .login import LoginPage, UpdateInfoPage + class AccountPrelevement(AccountsList): pass diff --git a/modules/boursorama/pages/account_history.py b/modules/boursorama/pages/account_history.py index 7b1aa6aea9..705375205d 100644 --- a/modules/boursorama/pages/account_history.py +++ b/modules/boursorama/pages/account_history.py @@ -29,6 +29,7 @@ __all__ = ['AccountHistory'] + class Transaction(FrenchTransaction): PATTERNS = [(re.compile(u'^CHQ\. (?P.*)'), FrenchTransaction.TYPE_CHECK), (re.compile('^(ACHAT|PAIEMENT) CARTE (?P
\d{2})(?P\d{2})(?P\d{2}) (?P.*)'), @@ -42,6 +43,7 @@ class Transaction(FrenchTransaction): (re.compile('^REM CHQ (?P.*)'), FrenchTransaction.TYPE_DEPOSIT), ] + class AccountHistory(BasePage): def on_loaded(self): diff --git a/modules/boursorama/pages/login.py b/modules/boursorama/pages/login.py index 14504d6bec..5732bcd9b6 100644 --- a/modules/boursorama/pages/login.py +++ b/modules/boursorama/pages/login.py @@ -75,6 +75,7 @@ def checksum(self, (x1, y1, x2, y2)): s += " " return hashlib.md5(s).hexdigest() + class LoginPage(BasePage): def on_loaded(self): pass @@ -98,6 +99,7 @@ def login(self, login, password): self.browser.location(form.attrib['action'], urllib.urlencode(args), no_login=True) + class UpdateInfoPage(BasePage): def on_loaded(self): raise BrowserIncorrectPassword('Please update your user informations') diff --git a/modules/boursorama/test.py b/modules/boursorama/test.py index 667b3210cf..40e2ad26b9 100644 --- a/modules/boursorama/test.py +++ b/modules/boursorama/test.py @@ -21,6 +21,7 @@ from weboob.tools.test import BackendTest + class BoursoramaTest(BackendTest): BACKEND = 'boursorama' diff --git a/modules/bouygues/test.py b/modules/bouygues/test.py index 8bdf6745ba..511554fcd8 100644 --- a/modules/bouygues/test.py +++ b/modules/bouygues/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class BouyguesTest(BackendTest): BACKEND = 'bouygues' diff --git a/modules/bp/pages/accounthistory.py b/modules/bp/pages/accounthistory.py index 2a04fa6e7b..a5fa82ef7a 100644 --- a/modules/bp/pages/accounthistory.py +++ b/modules/bp/pages/accounthistory.py @@ -47,6 +47,7 @@ class Transaction(FrenchTransaction): (re.compile('^(?PREMISE DE CHEQUE) (?P.*)'), FrenchTransaction.TYPE_DEPOSIT), ] + class AccountHistory(BasePage): def get_next_link(self): for a in self.document.xpath('//a[@class="btn_crt"]'): @@ -105,6 +106,7 @@ def get_history(self, deferred=False): operations.append(op) return operations + class CardsList(BasePage): def get_cards(self): cards = [] diff --git a/modules/bp/pages/login.py b/modules/bp/pages/login.py index c0a3e5a047..3b939ea72a 100644 --- a/modules/bp/pages/login.py +++ b/modules/bp/pages/login.py @@ -30,6 +30,7 @@ def md5(f): md5.update(f.read()) return md5.hexdigest() + class UnavailablePage(BasePage): def on_loaded(self): raise BrowserUnavailable() @@ -57,14 +58,17 @@ def login(self, login, pwd): self.browser['username'] = login self.browser.submit() + class repositionnerCheminCourant(BasePage): def on_loaded(self): self.browser.open("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/securite/authentification/initialiser-identif.ea") + class Initident(BasePage): def on_loaded(self): self.browser.open("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/securite/authentification/verifierMotDePasse-identif.ea") + class CheckPassword(BasePage): def on_loaded(self): self.browser.open("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/comptesCommun/synthese_assurancesEtComptes/init-synthese.ea") diff --git a/modules/bred/pages.py b/modules/bred/pages.py index 4d36d3316d..accdb48b22 100644 --- a/modules/bred/pages.py +++ b/modules/bred/pages.py @@ -37,6 +37,7 @@ def login(self, login, passwd): self.browser['pass'] = passwd.encode(self.browser.ENCODING) self.browser.submit(nologin=True) + class LoginResultPage(BasePage): def confirm(self): self.browser.location('MainAuth?typeDemande=AC', no_login=True) @@ -52,9 +53,11 @@ def get_error(self): return error.text.strip() + class EmptyPage(BasePage): pass + class BredBasePage(BasePage): def js2args(self, s): cur_arg = None @@ -70,6 +73,7 @@ def js2args(self, s): return args + class AccountsPage(BredBasePage): def get_list(self): accounts = [] @@ -123,6 +127,7 @@ def get_list(self): return accounts + class Transaction(FrenchTransaction): PATTERNS = [(re.compile('^RETRAIT G.A.B. \d+ (?P.*?)( CARTE .*)? LE (?P
\d{2})/(?P\d{2})/(?P\d{2}).*'), FrenchTransaction.TYPE_WITHDRAWAL), diff --git a/modules/bred/test.py b/modules/bred/test.py index 4e24f66db9..105901a782 100644 --- a/modules/bred/test.py +++ b/modules/bred/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class BredTest(BackendTest): BACKEND = 'bred' diff --git a/modules/btmon/pages.py b/modules/btmon/pages.py index 98a1e03c5e..7b343e48ba 100644 --- a/modules/btmon/pages.py +++ b/modules/btmon/pages.py @@ -64,7 +64,6 @@ def iter_torrents(self): torrent.description = NotLoaded torrent.files = NotLoaded yield torrent - class TorrentPage(BasePage): @@ -86,7 +85,7 @@ def get_torrent(self): href_t = self.parser.select(div,'a.down',1).attrib.get('href','') url = u'http://%s%s'%(self.browser.DOMAIN,href_t) magnet = unicode(self.parser.select(div,'a.magnet',1).attrib.get('href','')) - + divtabs = self.parser.select(div,'div#tabs',1) files_div = self.parser.select(divtabs,'div.body > div.doubleblock > div.leftblock') files = [] diff --git a/modules/btmon/test.py b/modules/btmon/test.py index 6ba714fccf..bc356ae562 100644 --- a/modules/btmon/test.py +++ b/modules/btmon/test.py @@ -22,6 +22,7 @@ from random import choice + class BtmonTest(BackendTest): BACKEND = 'btmon' diff --git a/modules/caissedepargne/pages.py b/modules/caissedepargne/pages.py index 1c161f0c98..f1fafdffe8 100644 --- a/modules/caissedepargne/pages.py +++ b/modules/caissedepargne/pages.py @@ -54,6 +54,7 @@ def login3(self, passwd): self.browser.form.action = m.group(1) self.browser.submit(nologin=True) + class ErrorPage(BasePage): def get_error(self): try: @@ -61,6 +62,7 @@ def get_error(self): except BrokenPageError: return None + class UnavailablePage(BasePage): def on_loaded(self): try: @@ -68,6 +70,7 @@ def on_loaded(self): except BrokenPageError: raise BrowserUnavailable() + class Transaction(FrenchTransaction): PATTERNS = [(re.compile('^CB (?P.*?) FACT (?P
\d{2})(?P\d{2})(?P\d{2})'), FrenchTransaction.TYPE_CARD), @@ -87,6 +90,7 @@ class Transaction(FrenchTransaction): (re.compile('^CB [\d\*]+ (?P.*)'), FrenchTransaction.TYPE_CARD), ] + class IndexPage(BasePage): ACCOUNT_TYPES = {u'Epargne liquide': Account.TYPE_SAVINGS, u'Compte Courant': Account.TYPE_CHECKING, diff --git a/modules/caissedepargne/test.py b/modules/caissedepargne/test.py index 41beac04ae..8b489abe37 100644 --- a/modules/caissedepargne/test.py +++ b/modules/caissedepargne/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class CaisseEpargneTest(BackendTest): BACKEND = 'caissedepargne' diff --git a/modules/canalplus/test.py b/modules/canalplus/test.py index e7d756895a..41b76cc9a7 100644 --- a/modules/canalplus/test.py +++ b/modules/canalplus/test.py @@ -21,6 +21,7 @@ from weboob.tools.test import BackendTest from weboob.capabilities.video import BaseVideo + class CanalPlusTest(BackendTest): BACKEND = 'canalplus' diff --git a/modules/canaltp/test.py b/modules/canaltp/test.py index 23b02cf58d..5207b31906 100644 --- a/modules/canaltp/test.py +++ b/modules/canaltp/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class CanalTPTest(BackendTest): BACKEND = 'canaltp' diff --git a/modules/carrefourbanque/pages.py b/modules/carrefourbanque/pages.py index 74b2c6a1f7..4647e9528d 100644 --- a/modules/carrefourbanque/pages.py +++ b/modules/carrefourbanque/pages.py @@ -39,9 +39,11 @@ def redirect(self): except FormNotFoundError: raise BrowserIncorrectPassword() + class HomePage(BasePage): pass + class AccountsPage(BasePage): def get_list(self): div = self.document.xpath('//div[@id="descriptifdroite"]')[0] @@ -73,6 +75,7 @@ def get_list(self): yield account + class TransactionsPage(BasePage): COL_DATE = 0 COL_TEXT = 1 diff --git a/modules/carrefourbanque/test.py b/modules/carrefourbanque/test.py index 2fd36ba609..e67a3da76c 100644 --- a/modules/carrefourbanque/test.py +++ b/modules/carrefourbanque/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class CarrefourBanqueTest(BackendTest): BACKEND = 'carrefourbanque' diff --git a/modules/cic/pages.py b/modules/cic/pages.py index b387547489..54bf887ee5 100644 --- a/modules/cic/pages.py +++ b/modules/cic/pages.py @@ -28,6 +28,7 @@ from weboob.capabilities.bank import Account from weboob.tools.capabilities.bank.transactions import FrenchTransaction + class LoginPage(BasePage): def login(self, login, passwd): self.browser.select_form(name='ident') @@ -35,25 +36,32 @@ def login(self, login, passwd): self.browser['_cm_pwd'] = passwd self.browser.submit(nologin=True) + class LoginErrorPage(BasePage): pass + class ChangePasswordPage(BasePage): def on_loaded(self): raise BrowserIncorrectPassword('Please change your password') + class InfoPage(BasePage): pass + class EmptyPage(BasePage): pass + class TransfertPage(BasePage): pass + class UserSpacePage(BasePage): pass + class AccountsPage(BasePage): def get_list(self): accounts = OrderedDict() @@ -102,6 +110,7 @@ def get_list(self): return accounts.itervalues() + class Transaction(FrenchTransaction): PATTERNS = [(re.compile('^VIR(EMENT)? (?P.*)'), FrenchTransaction.TYPE_TRANSFER), (re.compile('^PRLV (?P.*)'), FrenchTransaction.TYPE_ORDER), @@ -116,6 +125,7 @@ class Transaction(FrenchTransaction): _is_coming = False + class OperationsPage(BasePage): def get_history(self): index = 0 @@ -181,6 +191,7 @@ def go_next(self): return True + class CardPage(OperationsPage): def get_history(self): index = 0 @@ -200,6 +211,7 @@ def get_history(self): tr.set_amount(tds[-1].text) yield tr + class NoOperationsPage(OperationsPage): def get_history(self): return iter([]) diff --git a/modules/cic/test.py b/modules/cic/test.py index 2391716b7c..50b96311df 100644 --- a/modules/cic/test.py +++ b/modules/cic/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class CICTest(BackendTest): BACKEND = 'cic' diff --git a/modules/cmb/hellhttp.py b/modules/cmb/hellhttp.py index f755947199..56c445ac49 100644 --- a/modules/cmb/hellhttp.py +++ b/modules/cmb/hellhttp.py @@ -29,6 +29,7 @@ PROXY_PORT = 8080 + class HTTPSVerifiedConnection(httplib.HTTPSConnection): """ This class allows communication via SSL, and will checks certificates @@ -54,7 +55,7 @@ def connect(self): if self._tunnel_host: self.sock = sock self._tunnel() - + if self.ca_file: self.sock = ssl.wrap_socket(sock, self.key_file, @@ -102,7 +103,7 @@ def __init__(self, host, port=None, proxy=None, proxy_port=None, else: self.conn = HTTPSVerifiedConnection(host, port, key_file, cert_file, ca_file, strict, timeout, callBack) - + def request(self, *args, **kwargs): self.conn.request(*args, **kwargs) diff --git a/modules/cmso/pages.py b/modules/cmso/pages.py index b3361dd8b9..dca98bd507 100644 --- a/modules/cmso/pages.py +++ b/modules/cmso/pages.py @@ -37,6 +37,7 @@ def login(self, login, passwd): self.browser['motDePasse'] = passwd.encode(self.browser.ENCODING) self.browser.submit(nologin=True) + class AccountsPage(BasePage): def get_list(self): names = set() diff --git a/modules/cmso/test.py b/modules/cmso/test.py index d13661b970..86456875be 100644 --- a/modules/cmso/test.py +++ b/modules/cmso/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class CmsoTest(BackendTest): BACKEND = 'cmso' diff --git a/modules/cragr/browser.py b/modules/cragr/browser.py index 2eed4e9731..f8e5ff120c 100644 --- a/modules/cragr/browser.py +++ b/modules/cragr/browser.py @@ -26,6 +26,7 @@ from datetime import datetime import re + class Cragr(BaseBrowser): PROTOCOL = 'https' ENCODING = 'utf-8' diff --git a/modules/cragr/pages/accounts_list.py b/modules/cragr/pages/accounts_list.py index 1432c69b8c..2d881ca9df 100644 --- a/modules/cragr/pages/accounts_list.py +++ b/modules/cragr/pages/accounts_list.py @@ -25,6 +25,7 @@ from .tokenextractor import TokenExtractor from weboob.tools.capabilities.bank.transactions import FrenchTransaction + class Transaction(FrenchTransaction): PATTERNS = [ (re.compile('^(Vp|Vt|Vrt|Virt|Vir(ement)?)\s*(?P.*)', re.IGNORECASE), FrenchTransaction.TYPE_TRANSFER), @@ -44,6 +45,7 @@ class Transaction(FrenchTransaction): (re.compile('^RET.CARTE (?P.*)', re.IGNORECASE), FrenchTransaction.TYPE_WITHDRAWAL), ] + class AccountsList(CragrBasePage): """ Unlike most pages used with the Browser class, this class represents diff --git a/modules/cragr/pages/base.py b/modules/cragr/pages/base.py index 8b40651ecd..bf969c9e65 100644 --- a/modules/cragr/pages/base.py +++ b/modules/cragr/pages/base.py @@ -21,6 +21,7 @@ from weboob.tools.browser import BasePage from weboob.tools.browser import BrowserUnavailable + class CragrBasePage(BasePage): def on_loaded(self): # Check for an error diff --git a/modules/cragr/pages/tokenextractor.py b/modules/cragr/pages/tokenextractor.py index abdd280e0a..d599702302 100644 --- a/modules/cragr/pages/tokenextractor.py +++ b/modules/cragr/pages/tokenextractor.py @@ -17,16 +17,19 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . + class TokenExtractor: """ Extracts texts token from an HTML document """ def __init__(self): self.iterated_elements = [] + def clear(self): """ Reset any content stored within a TokenExtractor object. Useful to start a new parsing without creating a new instance. """ self.iterated_elements = [] + def element_iterated_already(self, html_element): if html_element in self.iterated_elements: return True @@ -34,6 +37,7 @@ def element_iterated_already(self, html_element): if ancestor in self.iterated_elements: return True return False + def extract_tokens(self, html_element): if self.element_iterated_already(html_element): return @@ -44,10 +48,12 @@ def extract_tokens(self, html_element): for token in self.split_text_into_smaller_tokens(text): if self.token_looks_relevant(token): yield token.strip() + @staticmethod def split_text_into_smaller_tokens(text): for subtext1 in text.split('\t'): yield subtext1 + @staticmethod def token_looks_relevant(token): return len(token.strip()) > 1 diff --git a/modules/cragr/test.py b/modules/cragr/test.py index 8545f4a34c..58424d1789 100644 --- a/modules/cragr/test.py +++ b/modules/cragr/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class CrAgrTest(BackendTest): BACKEND = 'cragr' diff --git a/modules/creditcooperatif/perso/pages.py b/modules/creditcooperatif/perso/pages.py index 2cbd9a6585..0fadd3836a 100644 --- a/modules/creditcooperatif/perso/pages.py +++ b/modules/creditcooperatif/perso/pages.py @@ -37,6 +37,7 @@ def login(self, login, password): self.browser['j_password'] = password.encode('iso-8859-15') self.browser.submit(nologin=True) + class LoggedPage(BasePage): def get_error(self): div = self.document.xpath('//div[@class="errorForm-msg"]') @@ -46,6 +47,7 @@ def get_error(self): msg = u', '.join([li.text.strip() for li in div[0].xpath('.//li')]) return re.sub('[\r\n\t\xa0]+', ' ', msg) + class AccountsPage(BasePage): ACCOUNT_TYPES = {u'COMPTE NEF': Account.TYPE_CHECKING} @@ -65,6 +67,7 @@ def get_list(self): yield account + class Transaction(FrenchTransaction): PATTERNS = [(re.compile('^(?PRETRAIT DAB) (?P
\d{2})-(?P\d{2})-([\d\-]+)'), FrenchTransaction.TYPE_WITHDRAWAL), @@ -88,9 +91,11 @@ class Transaction(FrenchTransaction): FrenchTransaction.TYPE_UNKNOWN), ] + class TransactionsPage(BasePage): pass + class TransactionsJSONPage(BasePage): ROW_DATE = 0 ROW_TEXT = 2 @@ -104,6 +109,7 @@ def get_transactions(self): t.set_amount(tr[self.ROW_CREDIT], tr[self.ROW_DEBIT]) yield t + class ComingTransactionsPage(BasePage): ROW_REF = 0 ROW_TEXT = 1 diff --git a/modules/creditcooperatif/pro/pages.py b/modules/creditcooperatif/pro/pages.py index 1d30d131b1..44d66d8459 100644 --- a/modules/creditcooperatif/pro/pages.py +++ b/modules/creditcooperatif/pro/pages.py @@ -29,6 +29,7 @@ __all__ = ['LoginPage', 'AccountsPage', 'TransactionsPage', 'ComingTransactionsPage'] + class LoginPage(BasePage): def login(self, login, pin, strong_auth): form_nb = 1 if strong_auth else 0 @@ -41,6 +42,7 @@ def login(self, login, pin, strong_auth): assert self.browser['identType'] == indentType self.browser.submit(nologin=True) + class AccountsPage(BasePage): ACCOUNT_TYPES = {u'COMPTE NEF': Account.TYPE_CHECKING} @@ -77,6 +79,7 @@ def get_list(self): return + class Transaction(FrenchTransaction): PATTERNS = [(re.compile('^RETRAIT DAB (?P.*?).*'), FrenchTransaction.TYPE_WITHDRAWAL), @@ -95,6 +98,7 @@ class Transaction(FrenchTransaction): FrenchTransaction.TYPE_UNKNOWN), ] + class TransactionsPage(BasePage): def get_next_url(self): # can be 'Suivant' or ' Suivant' @@ -109,6 +113,7 @@ def get_next_url(self): TR_TEXT = 2 TR_DEBIT = 3 TR_CREDIT = 4 + def get_history(self): for tr in self.document.xpath('//table[@id="operation"]/tbody/tr'): tds = tr.findall('td') @@ -129,6 +134,7 @@ def get_content(td): yield t + class ComingTransactionsPage(BasePage): COM_TR_COMMENT = 0 COM_TR_DATE = 1 diff --git a/modules/creditcooperatif/test.py b/modules/creditcooperatif/test.py index 1ba65654cf..39bd5d212b 100644 --- a/modules/creditcooperatif/test.py +++ b/modules/creditcooperatif/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class CreditCooperatifTest(BackendTest): BACKEND = 'creditcooperatif' diff --git a/modules/creditdunord/pages.py b/modules/creditdunord/pages.py index 193907dba6..17712f9a14 100644 --- a/modules/creditdunord/pages.py +++ b/modules/creditdunord/pages.py @@ -34,6 +34,7 @@ class LoginPage(BasePage): pass + class CDNBasePage(BasePage): def get_from_js(self, pattern, end, is_list=False): """ @@ -69,6 +70,7 @@ def get_from_js(self, pattern, end, is_list=False): def get_execution(self): return self.get_from_js("name: 'execution', value: '", "'") + class AccountsPage(CDNBasePage): COL_HISTORY = 2 COL_ID = 4 @@ -113,6 +115,7 @@ def get_list(self): return iter(accounts) + class Transaction(FrenchTransaction): PATTERNS = [(re.compile(r'^(?PRET DAB \w+ .*?) LE (?P
\d{2})(?P\d{2})$'), FrenchTransaction.TYPE_WITHDRAWAL), diff --git a/modules/creditdunord/test.py b/modules/creditdunord/test.py index 4cf04dbd26..d23db48f83 100644 --- a/modules/creditdunord/test.py +++ b/modules/creditdunord/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class CreditDuNordTest(BackendTest): BACKEND = 'creditdunord' diff --git a/modules/creditmutuel/pages.py b/modules/creditmutuel/pages.py index 5cf0794f41..bb933c6a72 100644 --- a/modules/creditmutuel/pages.py +++ b/modules/creditmutuel/pages.py @@ -28,6 +28,7 @@ from weboob.capabilities.bank import Account from weboob.tools.capabilities.bank.transactions import FrenchTransaction + class LoginPage(BasePage): def login(self, login, passwd): self.browser.select_form(nr=0) @@ -35,25 +36,32 @@ def login(self, login, passwd): self.browser['_cm_pwd'] = passwd self.browser.submit(nologin=True) + class LoginErrorPage(BasePage): pass + class ChangePasswordPage(BasePage): def on_loaded(self): raise BrowserIncorrectPassword('Please change your password') + class InfoPage(BasePage): pass + class EmptyPage(BasePage): pass + class TransfertPage(BasePage): pass + class UserSpacePage(BasePage): pass + class AccountsPage(BasePage): def get_list(self): accounts = OrderedDict() @@ -102,6 +110,7 @@ def get_list(self): return accounts.itervalues() + class Transaction(FrenchTransaction): PATTERNS = [(re.compile('^VIR(EMENT)? (?P.*)'), FrenchTransaction.TYPE_TRANSFER), (re.compile('^PRLV (?P.*)'), FrenchTransaction.TYPE_ORDER), @@ -116,6 +125,7 @@ class Transaction(FrenchTransaction): _is_coming = False + class OperationsPage(BasePage): def get_history(self): index = 0 @@ -181,6 +191,7 @@ def go_next(self): return True + class CardPage(OperationsPage): def get_history(self): index = 0 @@ -200,6 +211,7 @@ def get_history(self): tr.set_amount(tds[-1].text) yield tr + class NoOperationsPage(OperationsPage): def get_history(self): return iter([]) diff --git a/modules/creditmutuel/test.py b/modules/creditmutuel/test.py index e34a480bbc..b152b39e63 100644 --- a/modules/creditmutuel/test.py +++ b/modules/creditmutuel/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class CreditMutuelTest(BackendTest): BACKEND = 'creditmutuel' @@ -28,5 +29,3 @@ def test_crmut(self): if len(l) > 0: a = l[0] list(self.backend.iter_history(a)) - - diff --git a/modules/dailymotion/backend.py b/modules/dailymotion/backend.py index 03a0589677..b348f2f72a 100644 --- a/modules/dailymotion/backend.py +++ b/modules/dailymotion/backend.py @@ -45,6 +45,7 @@ def get_video(self, _id): return self.browser.get_video(_id) SORTBY = ['relevance', 'rated', 'visited', None] + def search_videos(self, pattern, sortby=ICapVideo.SEARCH_RELEVANCE, nsfw=False, max_results=None): with self.browser: return self.browser.search_videos(pattern, self.SORTBY[sortby]) diff --git a/modules/dailymotion/pages.py b/modules/dailymotion/pages.py index dd90c35c20..dda038c153 100644 --- a/modules/dailymotion/pages.py +++ b/modules/dailymotion/pages.py @@ -85,6 +85,7 @@ def get_rate(self, div): self.browser.logger.warning('Unable to parse rating: %s' % div.attrib['style']) return 0 + class VideoPage(BasePage): def get_video(self, video=None): if video is None: diff --git a/modules/dlfp/backend.py b/modules/dlfp/backend.py index a0874ab474..59ca9a6d12 100644 --- a/modules/dlfp/backend.py +++ b/modules/dlfp/backend.py @@ -167,7 +167,7 @@ def _insert_comment(self, com, parent, getseen=True): date=com.date, parent=parent, content=com.body, - signature=com.signature + \ + signature=com.signature + '
'.join(['Score: %d' % com.score, 'URL: %s' % com.url]), children=[], diff --git a/modules/dlfp/browser.py b/modules/dlfp/browser.py index bb20ba9078..a597636caa 100644 --- a/modules/dlfp/browser.py +++ b/modules/dlfp/browser.py @@ -33,6 +33,8 @@ from .tools import id2url, url2id # Browser + + class DLFP(BaseBrowser): DOMAIN = 'linuxfr.org' PROTOCOL = 'https' diff --git a/modules/dlfp/pages/board.py b/modules/dlfp/pages/board.py index 122feaebea..9bf60ad401 100644 --- a/modules/dlfp/pages/board.py +++ b/modules/dlfp/pages/board.py @@ -23,8 +23,10 @@ from weboob.tools.browser import BasePage + class Message(object): TIMESTAMP_REGEXP = re.compile(r'(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})') + def __init__(self, id, timestamp, login, message, is_me): self.id = id self.timestamp = timestamp @@ -40,6 +42,7 @@ def __init__(self, id, timestamp, login, message, is_me): else: warning('Unable to parse timestamp "%s"' % timestamp) + class BoardIndexPage(BasePage): def is_logged(self): return True diff --git a/modules/dlfp/pages/index.py b/modules/dlfp/pages/index.py index 27e0620f61..227f768f90 100644 --- a/modules/dlfp/pages/index.py +++ b/modules/dlfp/pages/index.py @@ -20,6 +20,7 @@ from weboob.tools.browser import BasePage + class DLFPPage(BasePage): def is_logged(self): for form in self.document.getiterator('form'): @@ -28,6 +29,7 @@ def is_logged(self): return True + class IndexPage(DLFPPage): def get_login_token(self): form = self.parser.select(self.document.getroot(), 'form#new_account_sidebar', 1) @@ -35,5 +37,6 @@ def get_login_token(self): if i.attrib['name'] == 'authenticity_token': return i.attrib['value'] + class LoginPage(DLFPPage): pass diff --git a/modules/dlfp/pages/news.py b/modules/dlfp/pages/news.py index d363a69373..b49bd22845 100644 --- a/modules/dlfp/pages/news.py +++ b/modules/dlfp/pages/news.py @@ -26,10 +26,12 @@ from .index import DLFPPage + class RSSComment(DLFPPage): def on_loaded(self): pass + class Content(object): TAGGABLE = False @@ -50,6 +52,7 @@ def __init__(self, browser): def is_taggable(self): return False + class Comment(Content): def __init__(self, article, div, reply_id): Content.__init__(self, article.browser) @@ -105,6 +108,7 @@ def iter_all_comments(self): def __repr__(self): return u"" % (self.id, self.author, self.title) + class Article(Content): TAGGABLE = True @@ -149,11 +153,13 @@ def iter_all_comments(self): for c in comment.iter_all_comments(): yield c + class CommentPage(DLFPPage): def get_comment(self): article = Article(self.browser, self.url, None) return Comment(article, self.parser.select(self.document.getroot(), 'li.comment', 1), 0) + class ContentPage(DLFPPage): def on_loaded(self): self.article = None @@ -192,9 +198,11 @@ def get_post_comment_url(self): def get_tag_url(self): return self.parser.select(self.document.getroot(), 'div.tag_in_place', 1).find('a').attrib['href'] + class NewCommentPage(DLFPPage): pass + class NewTagPage(DLFPPage): def _is_tag_form(self, form): return form.action.endswith('/tags') @@ -204,6 +212,7 @@ def tag(self, tag): self.browser['tags'] = tag self.browser.submit() + class NodePage(DLFPPage): def get_errors(self): try: diff --git a/modules/dlfp/pages/wiki.py b/modules/dlfp/pages/wiki.py index 655b6fcfe7..e59165fe15 100644 --- a/modules/dlfp/pages/wiki.py +++ b/modules/dlfp/pages/wiki.py @@ -21,6 +21,7 @@ from .index import DLFPPage + class WikiEditPage(DLFPPage): def get_body(self): try: diff --git a/modules/dlfp/tools.py b/modules/dlfp/tools.py index 5248656536..5a2933b0bf 100644 --- a/modules/dlfp/tools.py +++ b/modules/dlfp/tools.py @@ -31,9 +31,11 @@ '/forums/%s/posts/%s': 'B%s.%s', } + def f2re(f): return '.*' + f.replace('%s', '([^ /]+)') + def rssid(entry): m = RSSID_RE.match(entry.id) if not m: @@ -53,6 +55,7 @@ def rssid(entry): else: return '%s.%s' % (ind, m.group(2)) + def id2url(id): m = ID2URL_RE.match(id) if not m: @@ -67,6 +70,7 @@ def id2url(id): else: return url_re % m.group(3) + def url2id(url): for url_re, id_re in REGEXPS.iteritems(): m = re.match(f2re(url_re), url) @@ -75,6 +79,7 @@ def url2id(url): return id_re % m.groups() + def id2threadid(id): m = ID2URL_RE.match(id) if m: diff --git a/modules/dresdenwetter/pages.py b/modules/dresdenwetter/pages.py index b4faae81ea..abd7dbc692 100644 --- a/modules/dresdenwetter/pages.py +++ b/modules/dresdenwetter/pages.py @@ -26,7 +26,7 @@ class StartPage(BasePage): - name = [u"Temperatur", u"Wind", u"Luftdruck", u"Luftfeuchtigkeit",\ + name = [u"Temperatur", u"Wind", u"Luftdruck", u"Luftfeuchtigkeit", u"Niederschlag", u"Globalstrahlung", u"Schneehoehe"] unit = [u"°C", u"km/h", u"hPa", u"%", u"mm", u"W/m²", u"cm"] @@ -54,7 +54,7 @@ def get_sensors_list(self): lastvalue.level = float(text.split('\n')[2].split('hPa')[0]) if i == 3: text = paraph.xpath('span/font[@size="4"]/b')[0].text - lastvalue.level = float(text.split('\n')[2].split(u'%')[0]\ + lastvalue.level = float(text.split('\n')[2].split(u'%')[0] .split(':')[1]) if i == 4: text = paraph.xpath('b/font[@size="4"]/span')[0].text diff --git a/modules/ehentai/backend.py b/modules/ehentai/backend.py index ba5df4e2a0..cab872a4ad 100644 --- a/modules/ehentai/backend.py +++ b/modules/ehentai/backend.py @@ -65,6 +65,7 @@ def iter_gallery_images(self, gallery): ID_REGEXP = r'/?\d+/[\dabcdef]+/?' URL_REGEXP = r'.+/g/(%s)' % ID_REGEXP + def get_gallery(self, _id): match = re.match(r'^%s$' % self.URL_REGEXP, _id) if match: diff --git a/modules/ehentai/gallery.py b/modules/ehentai/gallery.py index 4b8ff8300d..4b839288b5 100644 --- a/modules/ehentai/gallery.py +++ b/modules/ehentai/gallery.py @@ -21,10 +21,12 @@ __all_ = ['EHentaiGallery', 'EHentaiImage'] + class EHentaiGallery(BaseGallery): def __init__(self, *args, **kwargs): BaseGallery.__init__(self, *args, **kwargs) + class EHentaiImage(BaseImage): def __init__(self, *args, **kwargs): BaseImage.__init__(self, *args, **kwargs) diff --git a/modules/europarl/pages.py b/modules/europarl/pages.py index 9e5378f3de..4d10de3140 100644 --- a/modules/europarl/pages.py +++ b/modules/europarl/pages.py @@ -34,6 +34,7 @@ __all__ = ['VideoPage'] + class VideoPage(BasePage): def get_video(self, video=None): if video is None: @@ -67,7 +68,7 @@ def get_title(self): for span in self.parser.select(obj[0], 'span.ep_acronym, span.ep_theme'): if span.text_content(): title += ' ' + span.text_content().strip() - + return title def set_details(self, v): @@ -89,7 +90,7 @@ def set_details(self, v): day=int(day), hour=int(hour), minute=int(minute)) - + obj = self.parser.select(self.document.getroot(), 'span.ep_subtitle', 1) if obj is not None: span = self.parser.select(obj, 'span.ep_date', 1) @@ -104,7 +105,7 @@ def set_details(self, v): day = m.group(5) month = m.group(6) year = m.group(7) - + start = datetime.datetime(year=int(year), month=int(month), day=int(day), diff --git a/modules/europarl/video.py b/modules/europarl/video.py index c1cc3907a5..d4ce00872f 100644 --- a/modules/europarl/video.py +++ b/modules/europarl/video.py @@ -47,4 +47,3 @@ def id2url(cls, _id): if m: return u'http://www.europarl.europa.eu/ep-live/en/plenary/video?debate=%s' % _id return None - diff --git a/modules/fortuneo/browser.py b/modules/fortuneo/browser.py index 481743fa73..8000bd59ff 100644 --- a/modules/fortuneo/browser.py +++ b/modules/fortuneo/browser.py @@ -29,6 +29,7 @@ __all__ = ['Fortuneo'] + class Fortuneo(BaseBrowser): DOMAIN_LOGIN = 'www.fortuneo.fr' DOMAIN = 'www.fortuneo.fr' diff --git a/modules/fortuneo/pages/accounts_list.py b/modules/fortuneo/pages/accounts_list.py index 36f46f3b7d..20447aa075 100644 --- a/modules/fortuneo/pages/accounts_list.py +++ b/modules/fortuneo/pages/accounts_list.py @@ -52,6 +52,7 @@ class Transaction(FrenchTransaction): (re.compile('^(?PREMISE CHEQUES)(?P.*)'), FrenchTransaction.TYPE_DEPOSIT), ] + class AccountHistoryPage(BasePage): def get_operations(self, _id): """history, see http://docs.weboob.org/api/capabilities/bank.html?highlight=transaction#weboob.capabilities.bank.Transaction""" @@ -85,6 +86,7 @@ def get_operations(self, _id): yield operation + class AccountsList(BasePage): def on_loaded(self): warn = self.document.xpath('//div[@id="message_renouvellement_mot_passe"]') @@ -156,6 +158,7 @@ def get_list(self): yield account + class GlobalAccountsList(BasePage): pass diff --git a/modules/fortuneo/pages/login.py b/modules/fortuneo/pages/login.py index 6893815d51..285032f108 100644 --- a/modules/fortuneo/pages/login.py +++ b/modules/fortuneo/pages/login.py @@ -25,6 +25,7 @@ __all__ = ['LoginPage'] + class LoginPage(BasePage): def login(self, login, passwd): msgb = self.document.xpath(".//*[@id='message_client']/text()") diff --git a/modules/fortuneo/test.py b/modules/fortuneo/test.py index 4894c65175..04dcd6557b 100644 --- a/modules/fortuneo/test.py +++ b/modules/fortuneo/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class FortuneoTest(BackendTest): BACKEND = 'fortuneo' diff --git a/modules/fourchan/test.py b/modules/fourchan/test.py index 245e34eb23..c60e97b98e 100644 --- a/modules/fourchan/test.py +++ b/modules/fourchan/test.py @@ -21,6 +21,7 @@ from logging import debug from weboob.tools.test import BackendTest + class FourChanTest(BackendTest): BACKEND = 'fourchan' diff --git a/modules/francetelevisions/test.py b/modules/francetelevisions/test.py index 0d7acd297d..5f3cb75cf1 100644 --- a/modules/francetelevisions/test.py +++ b/modules/francetelevisions/test.py @@ -21,6 +21,7 @@ from weboob.tools.test import BackendTest from weboob.capabilities.video import BaseVideo + class PluzzTest(BackendTest): BACKEND = 'francetelevisions' diff --git a/modules/ganassurances/pages.py b/modules/ganassurances/pages.py index b427448daf..ae8da63bba 100644 --- a/modules/ganassurances/pages.py +++ b/modules/ganassurances/pages.py @@ -37,6 +37,7 @@ def login(self, login, passwd): self.browser['LoginPortletFormPassword1'] = passwd.encode(self.browser.ENCODING) self.browser.submit(nologin=True) + class AccountsPage(BasePage): ACCOUNT_TYPES = {u'Solde des comptes bancaires - Groupama Banque': Account.TYPE_CHECKING, u'Epargne bancaire constituée - Groupama Banque': Account.TYPE_SAVINGS, @@ -89,6 +90,7 @@ class Transaction(FrenchTransaction): (re.compile('(?PInt .*)'), FrenchTransaction.TYPE_BANK), ] + class TransactionsPage(BasePage): def get_history(self): count = 0 diff --git a/modules/ganassurances/test.py b/modules/ganassurances/test.py index 327cbe0325..cd6c65eff4 100644 --- a/modules/ganassurances/test.py +++ b/modules/ganassurances/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class GanAssurancesTest(BackendTest): BACKEND = 'ganassurances' diff --git a/modules/gazelle/test.py b/modules/gazelle/test.py index 330d7f9738..b12b9d0d9c 100644 --- a/modules/gazelle/test.py +++ b/modules/gazelle/test.py @@ -19,6 +19,7 @@ from weboob.tools.test import BackendTest + class GazelleTest(BackendTest): BACKEND = 'gazelle' diff --git a/modules/gdcvault/pages.py b/modules/gdcvault/pages.py index 44316f9c96..9df3663efe 100644 --- a/modules/gdcvault/pages.py +++ b/modules/gdcvault/pages.py @@ -37,6 +37,7 @@ __all__ = ['VideoPage'] + class VideoPage(BasePage): def get_video(self, video=None): if video is None: @@ -127,7 +128,7 @@ def set_details(self, v): day=int(day), hour=int(hour), minute=int(minute)) - + obj = self.parser.select(self.document.getroot(), 'span.ep_subtitle', 1) if obj is not None: span = self.parser.select(obj, 'span.ep_date', 1) @@ -142,7 +143,7 @@ def set_details(self, v): day = m.group(5) month = m.group(6) year = m.group(7) - + start = datetime.datetime(year=int(year), month=int(month), day=int(day), diff --git a/modules/gdcvault/video.py b/modules/gdcvault/video.py index a65fd47196..6aab480474 100644 --- a/modules/gdcvault/video.py +++ b/modules/gdcvault/video.py @@ -41,4 +41,3 @@ def id2url(cls, _id): if m: return u'http://www.gdcvault.com/play/%s#slides' % _id return u'http://www.gdcvault.com/play/%s' % _id - diff --git a/modules/geolocip/test.py b/modules/geolocip/test.py index 5191dadbb5..d1f88c2332 100644 --- a/modules/geolocip/test.py +++ b/modules/geolocip/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class GeolocIPTest(BackendTest): BACKEND = 'geolocip' diff --git a/modules/googletranslate/browser.py b/modules/googletranslate/browser.py index c9390d3b5c..dce314ce23 100644 --- a/modules/googletranslate/browser.py +++ b/modules/googletranslate/browser.py @@ -35,7 +35,7 @@ class GoogleTranslateBrowser(BaseBrowser): PAGES = { 'https?://translate\.google\.com': TranslatePage } - + def __init__(self, *args, **kwargs): BaseBrowser.__init__(self, *args, **kwargs) diff --git a/modules/hds/browser.py b/modules/hds/browser.py index 5bdb4b1049..68c9a11e5c 100644 --- a/modules/hds/browser.py +++ b/modules/hds/browser.py @@ -23,6 +23,8 @@ from .pages import ValidationPage, HomePage, HistoryPage, StoryPage, AuthorPage # Browser + + class HDSBrowser(BaseBrowser): ENCODING = 'ISO-8859-1' DOMAIN = 'histoires-de-sexe.net' diff --git a/modules/hsbc/browser.py b/modules/hsbc/browser.py index 035ace1b72..62ec4725cd 100644 --- a/modules/hsbc/browser.py +++ b/modules/hsbc/browser.py @@ -33,6 +33,7 @@ class NotLoggedPage(BasePage): pass + class HSBC(BaseBrowser): DOMAIN = 'client.hsbc.fr' PROTOCOL = 'https' diff --git a/modules/hsbc/pages/accounts.py b/modules/hsbc/pages/accounts.py index 76a3373c41..84d9d8234f 100644 --- a/modules/hsbc/pages/accounts.py +++ b/modules/hsbc/pages/accounts.py @@ -73,6 +73,7 @@ def get_list(self): return iter(accounts) + class Transaction(FrenchTransaction): PATTERNS = [(re.compile('^VIR(EMENT)? (?P.*)'), FrenchTransaction.TYPE_TRANSFER), (re.compile('^PRLV (?P.*)'), FrenchTransaction.TYPE_ORDER), @@ -85,6 +86,7 @@ class Transaction(FrenchTransaction): (re.compile('^REMISE (?P.*)'), FrenchTransaction.TYPE_DEPOSIT), ] + class HistoryPage(BasePage): def get_next_link(self): return None @@ -92,6 +94,7 @@ def get_next_link(self): def get_operations(self, num_page, date_guesser): raise NotImplementedError() + class CPTHistoryPage(HistoryPage): def get_operations(self, num_page, date_guesser): for script in self.document.getiterator('script'): @@ -105,6 +108,7 @@ def get_operations(self, num_page, date_guesser): op._coming = (re.match('\d+/\d+/\d+', m.group(2)) is None) yield op + class CardHistoryPage(HistoryPage): def get_next_link(self): ok = False diff --git a/modules/hsbc/test.py b/modules/hsbc/test.py index 6ebce485f6..ea59dd2fb0 100644 --- a/modules/hsbc/test.py +++ b/modules/hsbc/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class HSBCTest(BackendTest): BACKEND = 'hsbc' diff --git a/modules/imdb/browser.py b/modules/imdb/browser.py index ecf72987c9..82fef92cad 100644 --- a/modules/imdb/browser.py +++ b/modules/imdb/browser.py @@ -218,6 +218,8 @@ def get_movie_releases(self,id, country): 'â': u'â', 'ç': u'ç' } + + def latin2unicode(word): for key in dict_hex.keys(): word = word.replace(key,dict_hex[key]) diff --git a/modules/imdb/pages.py b/modules/imdb/pages.py index 64fbe2b29a..0c31711109 100644 --- a/modules/imdb/pages.py +++ b/modules/imdb/pages.py @@ -187,6 +187,7 @@ def get_person(self,id): person.thumbnail_url = thumbnail_url return person + class FilmographyPage(BasePage): ''' Page of detailed filmography of a person, sorted by type of role This page is easier to parse than the main person page filmography diff --git a/modules/imdb/test.py b/modules/imdb/test.py index 73a134e370..80a469726a 100644 --- a/modules/imdb/test.py +++ b/modules/imdb/test.py @@ -19,6 +19,7 @@ from weboob.tools.test import BackendTest + class ImdbTest(BackendTest): BACKEND = 'imdb' @@ -26,7 +27,7 @@ def test_search_movie(self): movies = list(self.backend.iter_movies('spiderman')) for movie in movies: assert movie.id - + def test_get_movie(self): movie = self.backend.get_movie('tt0079980') assert movie.id diff --git a/modules/ina/test.py b/modules/ina/test.py index b8156cae14..abc25a0afd 100644 --- a/modules/ina/test.py +++ b/modules/ina/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class INATest(BackendTest): BACKEND = 'ina' diff --git a/modules/ing/pages/accounts_list.py b/modules/ing/pages/accounts_list.py index e518fed513..a173a17062 100644 --- a/modules/ing/pages/accounts_list.py +++ b/modules/ing/pages/accounts_list.py @@ -31,6 +31,7 @@ __all__ = ['AccountsList'] + class Transaction(FrenchTransaction): PATTERNS = [(re.compile(u'^retrait dab (?P
\d{2})/(?P\d{2})/(?P\d{4}) (?P.*)'), FrenchTransaction.TYPE_WITHDRAWAL), (re.compile(u'^carte (?P
\d{2})/(?P\d{2})/(?P\d{4}) (?P.*)'), Transaction.TYPE_CARD), diff --git a/modules/inrocks/backend.py b/modules/inrocks/backend.py index 509175960b..18628693d4 100644 --- a/modules/inrocks/backend.py +++ b/modules/inrocks/backend.py @@ -23,6 +23,7 @@ from .browser import NewspaperInrocksBrowser from .tools import rssid + class NewspaperInrocksBackend(GenericNewspaperBackend, ICapMessages): MAINTAINER = u'Julien Hebert' EMAIL = 'juke@free.fr' diff --git a/modules/inrocks/pages/article.py b/modules/inrocks/pages/article.py index 3a499556d1..5c9dab3191 100644 --- a/modules/inrocks/pages/article.py +++ b/modules/inrocks/pages/article.py @@ -23,6 +23,7 @@ try_remove_from_selector_list, \ drop_comments, NoneMainDiv + class ArticlePage(GenericNewsPage): "ArticlePage object for inrocks" def on_loaded(self): diff --git a/modules/inrocks/pages/inrockstv.py b/modules/inrocks/pages/inrockstv.py index dceebe2d57..75caa1fe93 100644 --- a/modules/inrocks/pages/inrockstv.py +++ b/modules/inrocks/pages/inrockstv.py @@ -20,6 +20,7 @@ from weboob.tools.capabilities.messages.genericArticle import GenericNewsPage + class InrocksTvPage(GenericNewsPage): "ArticlePage object for inrocks" def on_loaded(self): diff --git a/modules/inrocks/tools.py b/modules/inrocks/tools.py index c39dcf2638..309cccae02 100644 --- a/modules/inrocks/tools.py +++ b/modules/inrocks/tools.py @@ -20,6 +20,7 @@ import re + def id2url(_id): "return an url from an id" regexp2 = re.compile("(\w+).([0-9]+).(.*$)") diff --git a/modules/ipinfodb/backend.py b/modules/ipinfodb/backend.py index 38a28aa175..efd319e77d 100644 --- a/modules/ipinfodb/backend.py +++ b/modules/ipinfodb/backend.py @@ -50,12 +50,12 @@ def get_location(self, ipaddr): if 'Invalid IP or domain name' in content: raise Exception('Bad parameter') else: - tab = {'City' : 'NA' ,\ - 'Country name' : 'NA' ,\ - 'Region' : 'NA' ,\ - 'Latitude' : 'NA' ,\ - 'Longitude' : 'NA' ,\ - 'hostname' : 'NA' ,\ + tab = {'City' : 'NA' , + 'Country name' : 'NA' , + 'Region' : 'NA' , + 'Latitude' : 'NA' , + 'Longitude' : 'NA' , + 'hostname' : 'NA' , 'zipcode' : 'NA'} line = '' for line in content.split('\n'): diff --git a/modules/ipinfodb/test.py b/modules/ipinfodb/test.py index e3d62d6044..8d0d16d8b2 100644 --- a/modules/ipinfodb/test.py +++ b/modules/ipinfodb/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class IpinfodbTest(BackendTest): BACKEND = 'ipinfodb' diff --git a/modules/isohunt/test.py b/modules/isohunt/test.py index 420ca6476b..d054ba21c1 100644 --- a/modules/isohunt/test.py +++ b/modules/isohunt/test.py @@ -21,6 +21,7 @@ from random import choice + class IsohuntTest(BackendTest): BACKEND = 'isohunt' diff --git a/modules/kickass/pages.py b/modules/kickass/pages.py index cdedf4325a..92a60ae3e8 100644 --- a/modules/kickass/pages.py +++ b/modules/kickass/pages.py @@ -125,7 +125,7 @@ def get_torrent(self, id): for span in self.document.getiterator('span'): # sometimes there are others span, this is not so sure but the size of the children list # is enough to know if this is the right span - if (span.attrib.get('class', '') == 'folder' \ + if (span.attrib.get('class', '') == 'folder' or span.attrib.get('class', '') == 'folderopen') \ and len(span.getchildren()) > 2: size = span.getchildren()[1].tail diff --git a/modules/kickass/test.py b/modules/kickass/test.py index 4ce76f6363..87a3ed1e13 100644 --- a/modules/kickass/test.py +++ b/modules/kickass/test.py @@ -23,6 +23,7 @@ import urllib from random import choice + class KickassTest(BackendTest): BACKEND = 'kickass' diff --git a/modules/lcl/browser.py b/modules/lcl/browser.py index fc13b4644f..651ce5541b 100644 --- a/modules/lcl/browser.py +++ b/modules/lcl/browser.py @@ -63,7 +63,7 @@ def login(self): assert self.agency.isdigit() if not self.is_on_page(LoginPage): - self.location('%s://%s/outil/UAUT/Authentication/authenticate' \ + self.location('%s://%s/outil/UAUT/Authentication/authenticate' % (self.PROTOCOL, self.DOMAIN), no_login=True) @@ -71,7 +71,7 @@ def login(self): not self.is_logged() or \ (self.is_on_page(LoginPage) and self.page.is_error()) : raise BrowserIncorrectPassword("invalid login/password.\nIf you did not change anything, be sure to check for password renewal request\non the original web site.\nAutomatic renewal will be implemented later.") - self.location('%s://%s/outil/UWSP/Synthese' \ + self.location('%s://%s/outil/UWSP/Synthese' % (self.PROTOCOL, self.DOMAIN), no_login=True) diff --git a/modules/lcl/pages.py b/modules/lcl/pages.py index 7625c0a8ac..d8663a6a6b 100644 --- a/modules/lcl/pages.py +++ b/modules/lcl/pages.py @@ -136,6 +136,7 @@ def select_contract(self): self.browser.select_form(predicate=lambda form: form.attrs.get('id', '') == 'mainForm') self.browser.submit() + class AccountsPage(BasePage): def on_loaded(self): warn = self.document.xpath('//div[@id="attTxt"]') @@ -222,6 +223,7 @@ class Transaction(FrenchTransaction): (re.compile('^(?PREM CHQ) (?P.*)'), FrenchTransaction.TYPE_DEPOSIT), ] + class AccountHistoryPage(BasePage): def get_table(self): tables=self.document.findall("//table[@class='tagTab pyjama']") @@ -303,6 +305,7 @@ def get_operations(self): operations.append(operation) return operations + class CBHistoryPage(AccountHistoryPage): def get_table(self): # there is only one table on the page @@ -320,6 +323,7 @@ def get_operations(self): tr.type = tr.TYPE_CARD yield tr + class CBListPage(CBHistoryPage): def get_cards(self): cards = [] diff --git a/modules/lcl/test.py b/modules/lcl/test.py index 30dcc66be4..1c354019df 100644 --- a/modules/lcl/test.py +++ b/modules/lcl/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class LCLtTest(BackendTest): BACKEND = 'lcl' diff --git a/modules/lefigaro/backend.py b/modules/lefigaro/backend.py index 68beba504f..9fd58375c2 100644 --- a/modules/lefigaro/backend.py +++ b/modules/lefigaro/backend.py @@ -23,6 +23,7 @@ from .browser import NewspaperFigaroBrowser from .tools import rssid + class NewspaperFigaroBackend(GenericNewspaperBackend, ICapMessages): MAINTAINER = u'Julien Hebert' EMAIL = 'juke@free.fr' diff --git a/modules/lefigaro/browser.py b/modules/lefigaro/browser.py index e64c15e1d2..a453a345a5 100644 --- a/modules/lefigaro/browser.py +++ b/modules/lefigaro/browser.py @@ -22,6 +22,7 @@ from .pages.flashactu import FlashActuPage from weboob.tools.browser import BaseBrowser, BasePage + class IndexPage(BasePage): pass diff --git a/modules/lefigaro/tools.py b/modules/lefigaro/tools.py index 15d6b9ec9e..6f45c08c22 100644 --- a/modules/lefigaro/tools.py +++ b/modules/lefigaro/tools.py @@ -20,6 +20,7 @@ import re + def id2url(_id): "return an url from an id" regexp2 = re.compile("(\w+).([0-9]+).(.*$)") diff --git a/modules/mangago/__init__.py b/modules/mangago/__init__.py index c3dff900fa..171bfe1879 100644 --- a/modules/mangago/__init__.py +++ b/modules/mangago/__init__.py @@ -21,4 +21,3 @@ from .backend import MangagoBackend __all__ = ['MangagoBackend'] - diff --git a/modules/mangago/backend.py b/modules/mangago/backend.py index fb11ad5d97..aa191b5194 100644 --- a/modules/mangago/backend.py +++ b/modules/mangago/backend.py @@ -22,6 +22,7 @@ __all__ = ['MangagoBackend'] + class MangagoBackend(GenericComicReaderBackend): NAME = 'mangago' DESCRIPTION = 'Mangago manga reading site' @@ -33,4 +34,3 @@ class MangagoBackend(GenericComicReaderBackend): URL_REGEXP = r'.+mangago.com/r/l_manga/(%s).+' % ID_REGEXP ID_TO_URL = 'http://www.mangago.com/r/l_manga/%s' PAGES = { URL_REGEXP: DisplayPage } - diff --git a/modules/mangago/test.py b/modules/mangago/test.py index 0751f64326..0e6d81992e 100644 --- a/modules/mangago/test.py +++ b/modules/mangago/test.py @@ -19,8 +19,9 @@ from weboob.tools.capabilities.gallery.genericcomicreader import GenericComicReaderTest + class MangagoTest(GenericComicReaderTest): BACKEND = 'mangago' + def test_download(self): return self._test_download('manga/love_scar/mh/manga/love_scar/c001/') - diff --git a/modules/marmiton/browser.py b/modules/marmiton/browser.py index f68ba496f7..9c6a50b5f1 100644 --- a/modules/marmiton/browser.py +++ b/modules/marmiton/browser.py @@ -25,6 +25,7 @@ __all__ = ['MarmitonBrowser'] + class MarmitonBrowser(BaseBrowser): DOMAIN = 'www.marmiton.org' PROTOCOL = 'http' diff --git a/modules/marmiton/pages.py b/modules/marmiton/pages.py index e6ed295ea5..69e31a56cb 100644 --- a/modules/marmiton/pages.py +++ b/modules/marmiton/pages.py @@ -53,7 +53,7 @@ def iter_recipes(self): recipe.cooking_time = NotLoaded recipe.preparation_time = NotLoaded yield recipe - + class RecipePage(BasePage): """ Page which contains a recipe diff --git a/modules/marmiton/test.py b/modules/marmiton/test.py index 9e9885d582..d8f30ee590 100644 --- a/modules/marmiton/test.py +++ b/modules/marmiton/test.py @@ -19,6 +19,7 @@ from weboob.tools.test import BackendTest + class MarmitonTest(BackendTest): BACKEND = 'marmiton' @@ -30,4 +31,3 @@ def test_recipe(self): assert full_recipe.ingredients assert full_recipe.title assert full_recipe.preparation_time - diff --git a/modules/mediawiki/test.py b/modules/mediawiki/test.py index 2ee72fe16f..0aced62134 100644 --- a/modules/mediawiki/test.py +++ b/modules/mediawiki/test.py @@ -21,6 +21,7 @@ from weboob.tools.test import BackendTest from datetime import datetime + class MediawikiTest(BackendTest): BACKEND = 'mediawiki' diff --git a/modules/meteofrance/test.py b/modules/meteofrance/test.py index d748a8690c..1743ab10a7 100644 --- a/modules/meteofrance/test.py +++ b/modules/meteofrance/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class MeteoFranceTest(BackendTest): BACKEND = 'meteofrance' diff --git a/modules/nolifetv/pages/video.py b/modules/nolifetv/pages/video.py index 5c86dcad8d..2d2cec219c 100644 --- a/modules/nolifetv/pages/video.py +++ b/modules/nolifetv/pages/video.py @@ -104,6 +104,7 @@ def get_video(self, video=None): return video SALT = 'a53be1853770f0ebe0311d6993c7bcbe' + def genkey(self): # This website is really useful to get info: http://www.showmycode.com/ timestamp = str(int(time.time())) diff --git a/modules/nova/test.py b/modules/nova/test.py index 69c939820b..9b806797d4 100644 --- a/modules/nova/test.py +++ b/modules/nova/test.py @@ -21,6 +21,7 @@ from weboob.tools.test import BackendTest from weboob.capabilities.radio import Radio + class NovaTest(BackendTest): BACKEND = 'nova' diff --git a/modules/okc/backend.py b/modules/okc/backend.py index 52745ba9ec..2e7fd3cf67 100644 --- a/modules/okc/backend.py +++ b/modules/okc/backend.py @@ -38,6 +38,7 @@ __all__ = ['OkCBackend'] + def parse_dt(s): now = datetime.datetime.now() if s is None: @@ -62,6 +63,7 @@ def parse_dt(s): d = _parse_dt(s) return local2utc(d) + class OkCBackend(BaseBackend, ICapMessages, ICapContact, ICapMessagesPost): NAME = 'okc' MAINTAINER = u'Roger Philibert' diff --git a/modules/okc/browser.py b/modules/okc/browser.py index 57e6acce2f..57b1324771 100644 --- a/modules/okc/browser.py +++ b/modules/okc/browser.py @@ -30,6 +30,7 @@ class OkCException(Exception): pass + class OkCBrowser(BaseBrowser): DOMAIN = 'm.okcupid.com' PROTOCOL = 'https' diff --git a/modules/okc/pages.py b/modules/okc/pages.py index 0b8dc03452..15104e48cc 100644 --- a/modules/okc/pages.py +++ b/modules/okc/pages.py @@ -23,6 +23,7 @@ from weboob.tools.ordereddict import OrderedDict from weboob.capabilities.contact import ProfileNode + class LoginPage(BasePage): def login(self, username, password): self.browser.select_form(name='loginf') @@ -30,6 +31,7 @@ def login(self, username, password): self.browser['password'] = password.encode(self.browser.ENCODING) self.browser.submit(id='login_btn', nologin=True) + class ThreadPage(BasePage): def get_threads(self): li_elems = self.parser.select(self.document.getroot(), "//div[@id='page_content']//li", method= 'xpath') @@ -45,6 +47,7 @@ def get_threads(self): return threads + class MessagesPage(BasePage): def get_thread_mails(self, count): ul_item = self.parser.select(self.document.getroot(), "//ul[@id='rows']", method='xpath')[0] @@ -158,11 +161,13 @@ def get_profile(self): return profile + class PhotosPage(BasePage): def get_photos(self): imgs = self.parser.select(self.document.getroot(), "//div[@class='pic clearfix']//img", method='xpath') return [unicode(img.get('src')) for img in imgs] + class PostMessagePage(BasePage): def post_mail(self, id, content): self.browser.select_form(name='f2') diff --git a/modules/opacwebaloes/browser.py b/modules/opacwebaloes/browser.py index 3daea7c9f9..bb33d44af7 100644 --- a/modules/opacwebaloes/browser.py +++ b/modules/opacwebaloes/browser.py @@ -55,7 +55,7 @@ def login(self): assert isinstance(self.username, basestring) assert isinstance(self.password, basestring) if not self.is_on_page(HomePage): - self.location('%s://%s/index.aspx' \ + self.location('%s://%s/index.aspx' % (self.PROTOCOL, self.BASEURL), no_login=True) if not self.page.login(self.username, self.password) or \ @@ -65,13 +65,13 @@ def login(self): def get_rented_books_list(self): if not self.is_on_page(RentedPage): - self.location('%s://%s/index.aspx?IdPage=45' \ + self.location('%s://%s/index.aspx?IdPage=45' % (self.PROTOCOL, self.BASEURL) ) return self.page.get_list() 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/opacwebaloes/pages.py b/modules/opacwebaloes/pages.py index 640d1b9d17..c801782d96 100644 --- a/modules/opacwebaloes/pages.py +++ b/modules/opacwebaloes/pages.py @@ -22,12 +22,15 @@ from weboob.tools.browser import BasePage, BrowserUnavailable from weboob.tools.mech import ClientForm + class SkipPage(BasePage): pass + class HomePage(BasePage): pass + def txt2date(s): return date(*reversed([int(x) for x in s.split(' ')[-1].split('/')])) @@ -51,6 +54,7 @@ def iter_books(self, el, start): book.date = txt2date(tr[start+5].text) yield book + class HistoryPage(BasePage): pass @@ -75,6 +79,7 @@ def get_list(self): book.late = False yield book + class LoginPage(BasePage): def login(self, login, passwd): self.browser.select_form(predicate=lambda x: x.attrs.get('id','')=='aspnetForm') diff --git a/modules/opacwebaloes/test.py b/modules/opacwebaloes/test.py index d105c76d7d..517fdf2f52 100644 --- a/modules/opacwebaloes/test.py +++ b/modules/opacwebaloes/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class AloestTest(BackendTest): BACKEND = 'aloes' diff --git a/modules/opensubtitles/browser.py b/modules/opensubtitles/browser.py index fefed5af5b..19b523e5d4 100644 --- a/modules/opensubtitles/browser.py +++ b/modules/opensubtitles/browser.py @@ -26,6 +26,7 @@ __all__ = ['OpensubtitlesBrowser'] + class OpensubtitlesBrowser(BaseBrowser): DOMAIN = 'www.opensubtitles.org' PROTOCOL = 'http' diff --git a/modules/opensubtitles/test.py b/modules/opensubtitles/test.py index be484df210..66e7e568df 100644 --- a/modules/opensubtitles/test.py +++ b/modules/opensubtitles/test.py @@ -21,6 +21,7 @@ from random import choice + class OpensubtitlesTest(BackendTest): BACKEND = 'opensubtitles' diff --git a/modules/orange/browser.py b/modules/orange/browser.py index 36816b6ece..a9ea84bdc5 100644 --- a/modules/orange/browser.py +++ b/modules/orange/browser.py @@ -37,6 +37,7 @@ class OrangeBrowser(BaseBrowser): 'http://smsmms1.orange.fr/./Sms/sms_write.php.*' : ComposePage, 'http://smsmms1.orange.fr/./Sms/sms_write.php?command=send' : ConfirmPage, } + def get_nb_remaining_free_sms(self): self.location("http://smsmms1.orange.fr/M/Sms/sms_write.php") return self.page.get_nb_remaining_free_sms() diff --git a/modules/orange/pages/login.py b/modules/orange/pages/login.py index 8fa7173065..72afcf4263 100644 --- a/modules/orange/pages/login.py +++ b/modules/orange/pages/login.py @@ -22,6 +22,7 @@ __all__ = ['LoginPage'] + class LoginPage(BasePage): def on_loaded(self): pass diff --git a/modules/pap/browser.py b/modules/pap/browser.py index 57c45a35cd..c2ba06cc1a 100644 --- a/modules/pap/browser.py +++ b/modules/pap/browser.py @@ -47,6 +47,7 @@ def search_geo(self, pattern): TYPES = {Query.TYPE_RENT: 'location', Query.TYPE_SALE: 'vente', } + def search_housings(self, type, cities, nb_rooms, area_min, area_max, cost_min, cost_max): data = {'geo_objets_ids': ','.join(cities), 'surface[min]': area_min or '', diff --git a/modules/pap/pages.py b/modules/pap/pages.py index 7eed3659f0..742260faba 100644 --- a/modules/pap/pages.py +++ b/modules/pap/pages.py @@ -88,6 +88,7 @@ def iter_housings(self): yield housing + class HousingPage(BasePage): def get_housing(self): div = self.parser.select(self.document.getroot(), 'div#annonce_detail', 1) diff --git a/modules/parolesmania/test.py b/modules/parolesmania/test.py index 19a70d6fff..d397eae2bc 100644 --- a/modules/parolesmania/test.py +++ b/modules/parolesmania/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest from weboob.capabilities.base import NotLoaded + class ParolesmaniaTest(BackendTest): BACKEND = 'parolesmania' diff --git a/modules/parolesmusique/backend.py b/modules/parolesmusique/backend.py index 8f328c175a..be427e65aa 100644 --- a/modules/parolesmusique/backend.py +++ b/modules/parolesmusique/backend.py @@ -48,7 +48,7 @@ def fill_songlyrics(self, songlyrics, fields): sl = self.get_lyrics(songlyrics.id) songlyrics.content = sl.content return songlyrics - + OBJECTS = { SongLyrics:fill_songlyrics } diff --git a/modules/parolesmusique/pages.py b/modules/parolesmusique/pages.py index 9f3354acea..7aad55e763 100644 --- a/modules/parolesmusique/pages.py +++ b/modules/parolesmusique/pages.py @@ -38,6 +38,7 @@ def iter_lyrics(self,criteria,pattern): for lyr in self.browser.page.iter_lyrics(): yield lyr + class ArtistResultsPage(BasePage): def iter_lyrics(self): for link in self.parser.select(self.document.getroot(),'div.cont_cat table a.std'): diff --git a/modules/parolesmusique/test.py b/modules/parolesmusique/test.py index a9b2a9f367..1008b769f3 100644 --- a/modules/parolesmusique/test.py +++ b/modules/parolesmusique/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest from weboob.capabilities.base import NotLoaded + class ParolesmusiqueTest(BackendTest): BACKEND = 'parolesmusique' diff --git a/modules/pastealacon/browser.py b/modules/pastealacon/browser.py index c5291a1b66..b6acfde96a 100644 --- a/modules/pastealacon/browser.py +++ b/modules/pastealacon/browser.py @@ -30,6 +30,7 @@ __all__ = ['PastealaconBrowser'] + class PastealaconBrowser(BaseBrowser): DOMAIN = 'pastealacon.com' ENCODING = 'ISO-8859-1' diff --git a/modules/pastealacon/pages.py b/modules/pastealacon/pages.py index 2d54a07403..7a395f8455 100644 --- a/modules/pastealacon/pages.py +++ b/modules/pastealacon/pages.py @@ -26,6 +26,7 @@ __all__ = ['PastePage', 'PostPage', 'CaptchaPage'] + class PastePage(BasePage): def fill_paste(self, paste): root = self.document.getroot() @@ -46,6 +47,7 @@ def get_id(self): """ return self.group_dict['id'] + class PostPage(BasePage): def post(self, paste, expiration=None): self.browser.select_form(name='editor') @@ -55,5 +57,6 @@ def post(self, paste, expiration=None): self.browser['expiry'] = [expiration] self.browser.submit() + class CaptchaPage(BasePage): pass diff --git a/modules/pastealacon/test.py b/modules/pastealacon/test.py index 0624b299aa..7e87faedad 100644 --- a/modules/pastealacon/test.py +++ b/modules/pastealacon/test.py @@ -24,6 +24,7 @@ from weboob.capabilities.paste import PasteNotFound + class PastealaconTest(BackendTest): BACKEND = 'pastealacon' diff --git a/modules/pastebin/test.py b/modules/pastebin/test.py index 040dc77dd8..d6d9604845 100644 --- a/modules/pastebin/test.py +++ b/modules/pastebin/test.py @@ -21,6 +21,7 @@ from weboob.capabilities.base import NotLoaded from weboob.capabilities.paste import PasteNotFound + class PastebinTest(BackendTest): BACKEND = 'pastebin' diff --git a/modules/phpbb/pages/forum.py b/modules/phpbb/pages/forum.py index c9bb2fa0d6..2d8b03c1a9 100644 --- a/modules/phpbb/pages/forum.py +++ b/modules/phpbb/pages/forum.py @@ -40,6 +40,7 @@ def __init__(self, type, url): self.title = u'' self.date = None + class ForumPage(PhpBBPage): def iter_links(self): for li in self.parser.select(self.document.getroot(), 'ul.forums li.row'): @@ -72,6 +73,7 @@ def iter_all_forums(self): yield value, option.text.strip(u'» \xa0\n\r') + class Post(object): def __init__(self, forum_id, topic_id, id): self.id = int(id) @@ -84,6 +86,7 @@ def __init__(self, forum_id, topic_id, id): self.signature = u'' self.parent = 0 + class TopicPage(PhpBBPage): def on_loaded(self): div = self.document.getroot().cssselect('div.pagination')[0] diff --git a/modules/phpbb/pages/index.py b/modules/phpbb/pages/index.py index 46ad3b7a9d..b41edbef34 100644 --- a/modules/phpbb/pages/index.py +++ b/modules/phpbb/pages/index.py @@ -20,6 +20,7 @@ from weboob.tools.browser import BasePage + class PhpBBPage(BasePage): def is_logged(self): return len(self.document.getroot().cssselect('li.icon-register')) == 0 @@ -35,5 +36,6 @@ def get_error_message(self): errors.append(div.text.strip()) return ', '.join(errors) + class LoginPage(PhpBBPage): pass diff --git a/modules/phpbb/tools.py b/modules/phpbb/tools.py index 292bf18b38..f384dbf4ab 100644 --- a/modules/phpbb/tools.py +++ b/modules/phpbb/tools.py @@ -42,6 +42,7 @@ def url2id(url, nopost=False): return None + def id2url(id): v = id.split('.') if len(v) == 1: @@ -54,15 +55,18 @@ def id2url(id): int(v[2]), int(v[2])) + def id2topic(id): try: return int(id.split('.')[1]) except IndexError: return None + def rssid(id): return id + def parse_date(s): s = s.replace(u'Fév', 'Feb') \ .replace(u'Avr', 'Apr') \ diff --git a/modules/piratebay/backend.py b/modules/piratebay/backend.py index 40941a113e..b3347a90d6 100644 --- a/modules/piratebay/backend.py +++ b/modules/piratebay/backend.py @@ -26,6 +26,7 @@ __all__ = ['PiratebayBackend'] + class PiratebayBackend(BaseBackend, ICapTorrent): NAME = 'piratebay' MAINTAINER = u'Julien Veyssier' diff --git a/modules/piratebay/test.py b/modules/piratebay/test.py index ca01336c95..65b7fa8399 100644 --- a/modules/piratebay/test.py +++ b/modules/piratebay/test.py @@ -22,6 +22,7 @@ from random import choice + class PiratebayTest(BackendTest): BACKEND = 'piratebay' diff --git a/modules/prixcarburants/pages.py b/modules/prixcarburants/pages.py index 55775ff6b2..336c3dff0b 100644 --- a/modules/prixcarburants/pages.py +++ b/modules/prixcarburants/pages.py @@ -44,6 +44,7 @@ def iter_products(self): yield product + class ComparisonResultsPage(BasePage): def get_product_name(self): try: @@ -75,6 +76,7 @@ def iter_results(self, product=None): price.set_empty_fields(NotAvailable) yield price + class ShopInfoPage(BasePage): def get_info(self): return self.parser.tostring(self.parser.select(self.document.getroot(), 'div.colg', 1)) diff --git a/modules/redmine/pages/index.py b/modules/redmine/pages/index.py index 532c0c0ee0..a384b709a4 100644 --- a/modules/redmine/pages/index.py +++ b/modules/redmine/pages/index.py @@ -20,6 +20,7 @@ from weboob.tools.browser import BasePage + class LoginPage(BasePage): def login(self, username, password): self.browser.select_form(nr=1) @@ -27,12 +28,15 @@ def login(self, username, password): self.browser['password'] = password self.browser.submit() + class IndexPage(BasePage): pass + class MyPage(BasePage): pass + class ProjectsPage(BasePage): def iter_projects(self): for ul in self.parser.select(self.document.getroot(), 'ul.projects'): diff --git a/modules/redmine/pages/issues.py b/modules/redmine/pages/issues.py index dc7379793b..b996d0172e 100644 --- a/modules/redmine/pages/issues.py +++ b/modules/redmine/pages/issues.py @@ -26,6 +26,7 @@ from weboob.tools.misc import to_unicode from weboob.tools.mech import ClientForm + class BaseIssuePage(BasePage): def parse_datetime(self, text): m = re.match('(\d+)/(\d+)/(\d+) (\d+):(\d+) (\w+)', text) @@ -80,6 +81,7 @@ def get_authenticity_token(self): token = tokens[0].attrib['value'] return token + class IssuesPage(BaseIssuePage): PROJECT_FIELDS = {'members': 'values_assigned_to_id', 'categories': 'values_category_id', @@ -129,6 +131,7 @@ def iter_issues(self): if len(issue) != 0: yield issue + class NewIssuePage(BaseIssuePage): PROJECT_FIELDS = {'members': 'issue_assigned_to_id', 'categories': 'issue_category_id', @@ -182,6 +185,7 @@ def fill_form(self, **kwargs): getattr(self, 'set_%s' % key)(value) self.browser.submit() + class IssuePage(NewIssuePage): def _parse_selection(self, id): try: @@ -291,6 +295,7 @@ def get_params(self): return params + class IssueLogTimePage(BasePage): def logtime(self, hours, message): self.browser.select_form(predicate=lambda form: form.attrs.get('action', '').endswith('/edit')) @@ -299,5 +304,6 @@ def logtime(self, hours, message): self.browser['time_entry[activity_id]'] = ['8'] self.browser.submit() + class IssueTimeEntriesPage(BasePage): pass diff --git a/modules/seeklyrics/test.py b/modules/seeklyrics/test.py index 64a3a4ab67..d0d4056eda 100644 --- a/modules/seeklyrics/test.py +++ b/modules/seeklyrics/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest from weboob.capabilities.base import NotLoaded + class SeeklyricsTest(BackendTest): BACKEND = 'seeklyrics' diff --git a/modules/seloger/pages.py b/modules/seloger/pages.py index e005a38707..d6c805f701 100644 --- a/modules/seloger/pages.py +++ b/modules/seloger/pages.py @@ -59,6 +59,7 @@ def iter_housings(self): yield housing + class HousingPage(BasePage): def get_housing(self, housing=None): if housing is None: diff --git a/modules/sfr/test.py b/modules/sfr/test.py index 7c525d8fb0..c17b980afa 100644 --- a/modules/sfr/test.py +++ b/modules/sfr/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class SFRTest(BackendTest): BACKEND = 'sfr' diff --git a/modules/societegenerale/pages/accounts_list.py b/modules/societegenerale/pages/accounts_list.py index 52cfaedfeb..1f7bc31021 100644 --- a/modules/societegenerale/pages/accounts_list.py +++ b/modules/societegenerale/pages/accounts_list.py @@ -87,6 +87,7 @@ def get_list(self): accounts.append(account) return iter(accounts) + class CardsList(BasePage): def iter_cards(self): for tr in self.document.getiterator('tr'): @@ -96,6 +97,7 @@ def iter_cards(self): yield tr.xpath('.//a')[0].attrib['href'] + class Transaction(FrenchTransaction): PATTERNS = [(re.compile(r'^CARTE \w+ RETRAIT DAB.* (?P
\d{2})/(?P\d{2})( (?P\d+)H(?P\d+))? (?P.*)'), FrenchTransaction.TYPE_WITHDRAWAL), @@ -123,6 +125,7 @@ class Transaction(FrenchTransaction): FrenchTransaction.TYPE_WITHDRAWAL), ] + class AccountHistory(BasePage): def get_part_url(self): for script in self.document.getiterator('script'): diff --git a/modules/societegenerale/test.py b/modules/societegenerale/test.py index 45102f19fc..63973a3981 100644 --- a/modules/societegenerale/test.py +++ b/modules/societegenerale/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class SocieteGeneraleTest(BackendTest): BACKEND = 'societegenerale' diff --git a/modules/transilien/backend.py b/modules/transilien/backend.py index 6131007738..7ecf6661a6 100644 --- a/modules/transilien/backend.py +++ b/modules/transilien/backend.py @@ -26,6 +26,7 @@ from .browser import Transilien from .stations import STATIONS + class TransilienBackend(BaseBackend, ICapTravel): NAME = 'transilien' MAINTAINER = u'Julien Hébert' diff --git a/modules/transilien/browser.py b/modules/transilien/browser.py index 8c82859c60..a4ad867db2 100644 --- a/modules/transilien/browser.py +++ b/modules/transilien/browser.py @@ -23,10 +23,12 @@ from .pages.departures import DeparturesPage from .pages.roadmap import RoadmapSearchPage, RoadmapConfirmPage, RoadmapPage + class UnavailablePage(BasePage): def on_loaded(self): raise BrowserUnavailable('Website is currently unavailable') + class Transilien(BaseBrowser): DOMAIN = 'www.transilien.com' PROTOCOL = 'https' diff --git a/modules/transilien/pages/departures.py b/modules/transilien/pages/departures.py index a2c0cb31b4..5a24c18bd7 100644 --- a/modules/transilien/pages/departures.py +++ b/modules/transilien/pages/departures.py @@ -30,6 +30,7 @@ class StationNotFound(UserError): pass + class DeparturesPage(BasePage): def iter_routes(self): try: diff --git a/modules/transilien/pages/roadmap.py b/modules/transilien/pages/roadmap.py index f51c7742c6..43088936d5 100644 --- a/modules/transilien/pages/roadmap.py +++ b/modules/transilien/pages/roadmap.py @@ -54,6 +54,7 @@ def search(self, departure, arrival, departure_time, arrival_time): raise RoadmapError('Unable to establish a roadmap with %s time at "%s"' % ('departure' if departure_time else 'arrival', time)) self.browser.submit() + class RoadmapPage(BasePage): def get_steps(self): errors = [] @@ -95,6 +96,7 @@ def parse_duration(self, dur): return datetime.timedelta(hours=int(m.group(1)), minutes=int(m.group(2))) + class RoadmapConfirmPage(RoadmapPage): def select(self, name, num): try: diff --git a/modules/transilien/test.py b/modules/transilien/test.py index 0eb3994108..6d90efbacd 100644 --- a/modules/transilien/test.py +++ b/modules/transilien/test.py @@ -22,6 +22,7 @@ from weboob.capabilities.travel import RoadmapFilters from weboob.tools.test import BackendTest + class TransilienTest(BackendTest): BACKEND = 'transilien' diff --git a/modules/trictractv/test.py b/modules/trictractv/test.py index 1fa835fbfd..621287f525 100644 --- a/modules/trictractv/test.py +++ b/modules/trictractv/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class TricTracTVTest(BackendTest): BACKEND = 'trictractv' diff --git a/modules/tvsubtitles/browser.py b/modules/tvsubtitles/browser.py index 8703393808..079e9e44e3 100644 --- a/modules/tvsubtitles/browser.py +++ b/modules/tvsubtitles/browser.py @@ -29,6 +29,7 @@ 'ar','hu','pl','tr','nl','pt','sv','da','fi', 'ko','cn','jp','bg','cz','ro'] + class TvsubtitlesBrowser(BaseBrowser): DOMAIN = 'www.tvsubtitles.net' PROTOCOL = 'http' diff --git a/modules/tvsubtitles/test.py b/modules/tvsubtitles/test.py index e53dfd093e..2432ee0026 100644 --- a/modules/tvsubtitles/test.py +++ b/modules/tvsubtitles/test.py @@ -21,6 +21,7 @@ from random import choice + class TvsubtitlesTest(BackendTest): BACKEND = 'tvsubtitles' diff --git a/modules/vimeo/pages.py b/modules/vimeo/pages.py index 06becb8900..44981b0921 100644 --- a/modules/vimeo/pages.py +++ b/modules/vimeo/pages.py @@ -40,6 +40,7 @@ __all__ = ['VideoPage'] + class VideoPage(BasePage): def get_video(self, video=None): if video is None: diff --git a/modules/vimeo/video.py b/modules/vimeo/video.py index a9e5820065..f4e26b7dff 100644 --- a/modules/vimeo/video.py +++ b/modules/vimeo/video.py @@ -32,4 +32,3 @@ def __init__(self, *args, **kwargs): @classmethod def id2url(cls, _id): return u'http://vimeo.com/%s' % _id - diff --git a/modules/weather/backend.py b/modules/weather/backend.py index 8800e8817b..25d5a94ce0 100644 --- a/modules/weather/backend.py +++ b/modules/weather/backend.py @@ -25,6 +25,7 @@ __all__ = ['WeatherBackend'] + class WeatherBackend(BaseBackend, ICapWeather): NAME = 'weather' MAINTAINER = u'Arno Renevier' diff --git a/modules/weather/browser.py b/modules/weather/browser.py index 6294137049..d70b465d29 100644 --- a/modules/weather/browser.py +++ b/modules/weather/browser.py @@ -26,6 +26,7 @@ __all__ = ['WeatherBrowser'] + class WeatherBrowser(BaseBrowser): DOMAIN = 'www.weather.com' PROTOCOL = 'http' diff --git a/modules/weather/pages.py b/modules/weather/pages.py index 0f15d0b0c3..58971922cf 100644 --- a/modules/weather/pages.py +++ b/modules/weather/pages.py @@ -36,6 +36,7 @@ def iter_city_search(self): city_id = item.find('a').attrib.get("href", "").split("+")[-1] yield City(city_id, city_name) + class WeatherPage(BasePage): def get_city(self): parts = self.url.split('/')[-1].split('+') @@ -47,6 +48,7 @@ def get_current(self): temp = float(self.document.find('//p[@class="wx-temp"]').text_content().strip().split(u'°')[0]) return Current(date, temp, text, u'F') + class ForecastPage(BasePage): def iter_forecast(self): divs = self.document.findall('//div[@class="wx-daypart"]') diff --git a/modules/weather/test.py b/modules/weather/test.py index 49b826baca..56e8efd0fe 100644 --- a/modules/weather/test.py +++ b/modules/weather/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class WeatherTest(BackendTest): BACKEND = 'weather' diff --git a/modules/wordreference/browser.py b/modules/wordreference/browser.py index 41c5a7cd5f..7cefe5ff94 100644 --- a/modules/wordreference/browser.py +++ b/modules/wordreference/browser.py @@ -35,7 +35,7 @@ class WordReferenceBrowser(BaseBrowser): PAGES = { 'https?://www\.wordreference\.com/.*/.*': TranslatePage } - + def __init__(self, *args, **kwargs): BaseBrowser.__init__(self, *args, **kwargs) diff --git a/modules/wordreference/pages.py b/modules/wordreference/pages.py index f4735a236c..b09d054e57 100644 --- a/modules/wordreference/pages.py +++ b/modules/wordreference/pages.py @@ -53,4 +53,3 @@ def get_translation(self): return u''+td.text_content().split(';')[0].strip() if td.attrib.get('class','') == 'roman1': prev_was_roman1 = True - diff --git a/modules/yahoo/test.py b/modules/yahoo/test.py index 281bde339b..421817106f 100644 --- a/modules/yahoo/test.py +++ b/modules/yahoo/test.py @@ -20,6 +20,7 @@ from weboob.tools.test import BackendTest + class YahooTest(BackendTest): BACKEND = 'yahoo' diff --git a/modules/youtube/pages.py b/modules/youtube/pages.py index 782c464b0b..2ff6c5de93 100644 --- a/modules/youtube/pages.py +++ b/modules/youtube/pages.py @@ -25,7 +25,7 @@ from weboob.tools.json import json -__all__ = ['LoginPage', 'LoginRedirectPage', 'ForbiddenVideo', 'ForbiddenVideoPage', \ +__all__ = ['LoginPage', 'LoginRedirectPage', 'ForbiddenVideo', 'ForbiddenVideoPage', 'VerifyAgePage', 'VerifyControversyPage', 'VideoPage'] diff --git a/tools/boilerplate_data/base_test.py b/tools/boilerplate_data/base_test.py index ed8c17359d..e6a9500353 100644 --- a/tools/boilerplate_data/base_test.py +++ b/tools/boilerplate_data/base_test.py @@ -1,6 +1,7 @@ <%inherit file="layout.py"/> from weboob.tools.test import BackendTest + class ${r.classname}Test(BackendTest): BACKEND = '${r.name}' diff --git a/weboob/applications/boobathon/boobathon.py b/weboob/applications/boobathon/boobathon.py index adb8db6330..8be18c22d3 100644 --- a/weboob/applications/boobathon/boobathon.py +++ b/weboob/applications/boobathon/boobathon.py @@ -47,6 +47,7 @@ def __init__(self, backend, capability): def __repr__(self): return '' % (self.backend, self.capability) + class Member(object): def __init__(self, id, name): self.name = name @@ -63,6 +64,7 @@ def shortname(self): name = '%s..' % name[:18] return name + class Event(object): def __init__(self, name, backend): self.my_id = backend.browser.get_userid() @@ -272,6 +274,7 @@ def save(self, message): self.content.content = s self.backend.push_content(self.content, message) + class Boobathon(ReplApplication): APPNAME = 'boobathon' VERSION = '0.f' diff --git a/weboob/applications/boobill/boobill.py b/weboob/applications/boobill/boobill.py index b40d6d5bbd..f94ee27e41 100644 --- a/weboob/applications/boobill/boobill.py +++ b/weboob/applications/boobill/boobill.py @@ -145,7 +145,7 @@ def do_bills(self, id): Get the list of bills documents for subscriptions. If no ID given, display bills of all backends """ - self.exec_method(id, 'iter_bills') + self.exec_method(id, 'iter_bills') def do_download(self, line): """ diff --git a/weboob/applications/cineoob/cineoob.py b/weboob/applications/cineoob/cineoob.py index 93f1a731ca..a30077408c 100644 --- a/weboob/applications/cineoob/cineoob.py +++ b/weboob/applications/cineoob/cineoob.py @@ -38,6 +38,7 @@ ROLE_LIST = ['actor','director','writer','composer','producer'] COUNTRY_LIST = ['us','fr','de','jp'] + class MovieInfoFormatter(IFormatter): MANDATORY_FIELDS = ('id', 'original_title', 'release_date', 'other_titles', 'duration', 'pitch', 'note', 'roles', 'country') @@ -100,6 +101,7 @@ def yearsago(years, from_date=None): return from_date.replace(month=2, day=28, year=from_date.year-years) + def num_years(begin, end=None): if end is None: end = datetime.now() @@ -109,6 +111,7 @@ def num_years(begin, end=None): else: return num_years + class PersonInfoFormatter(IFormatter): MANDATORY_FIELDS = ('id', 'name', 'birth_date', 'birth_place', 'short_biography') diff --git a/weboob/applications/masstransit/masstransit.py b/weboob/applications/masstransit/masstransit.py index f00fbfd61f..5f75687a02 100644 --- a/weboob/applications/masstransit/masstransit.py +++ b/weboob/applications/masstransit/masstransit.py @@ -29,6 +29,7 @@ class FakeConic(object): STATUS_CONNECTED = None STATUS_DISCONNECTED = None CONNECT_FLAG_NONE = None + def Connection(self): raise NotImplementedError() try: @@ -50,6 +51,7 @@ def Connection(self): __all__ = ['Masstransit'] + class MasstransitHildon(): "hildon interface" diff --git a/weboob/applications/qboobmsg/main_window.py b/weboob/applications/qboobmsg/main_window.py index f5b76d49cb..6cd5ddc40d 100644 --- a/weboob/applications/qboobmsg/main_window.py +++ b/weboob/applications/qboobmsg/main_window.py @@ -26,6 +26,7 @@ from .ui.main_window_ui import Ui_MainWindow from .messages_manager import MessagesManager + class MainWindow(QtMainWindow): def __init__(self, config, weboob, parent=None): QtMainWindow.__init__(self, parent) diff --git a/weboob/applications/qboobmsg/messages_manager.py b/weboob/applications/qboobmsg/messages_manager.py index dc73098f6a..3aa4d8ae1b 100644 --- a/weboob/applications/qboobmsg/messages_manager.py +++ b/weboob/applications/qboobmsg/messages_manager.py @@ -29,6 +29,7 @@ from .ui.messages_manager_ui import Ui_MessagesManager + class MessagesManager(QWidget): def __init__(self, weboob, parent=None): QWidget.__init__(self, parent) diff --git a/weboob/applications/qcineoob/main_window.py b/weboob/applications/qcineoob/main_window.py index 2e1a1f0762..44095f5612 100644 --- a/weboob/applications/qcineoob/main_window.py +++ b/weboob/applications/qcineoob/main_window.py @@ -40,6 +40,7 @@ from .torrent import Torrent from .subtitle import Subtitle + class MainWindow(QtMainWindow): def __init__(self, config, weboob, parent=None): QtMainWindow.__init__(self, parent) diff --git a/weboob/applications/qcineoob/minimovie.py b/weboob/applications/qcineoob/minimovie.py index d4ec0d7ab9..4983657017 100644 --- a/weboob/applications/qcineoob/minimovie.py +++ b/weboob/applications/qcineoob/minimovie.py @@ -25,6 +25,7 @@ from weboob.applications.qcineoob.ui.minimovie_ui import Ui_MiniMovie from weboob.capabilities.base import empty + class MiniMovie(QFrame): def __init__(self, weboob, backend, movie, parent=None): QFrame.__init__(self, parent) diff --git a/weboob/applications/qcineoob/miniperson.py b/weboob/applications/qcineoob/miniperson.py index 828357c74d..e2af29ac08 100644 --- a/weboob/applications/qcineoob/miniperson.py +++ b/weboob/applications/qcineoob/miniperson.py @@ -25,6 +25,7 @@ from weboob.applications.qcineoob.ui.miniperson_ui import Ui_MiniPerson from weboob.capabilities.base import empty + class MiniPerson(QFrame): def __init__(self, weboob, backend, person, parent=None): QFrame.__init__(self, parent) diff --git a/weboob/applications/qcineoob/minisubtitle.py b/weboob/applications/qcineoob/minisubtitle.py index 4f3f5fc9c5..95313a16f0 100644 --- a/weboob/applications/qcineoob/minisubtitle.py +++ b/weboob/applications/qcineoob/minisubtitle.py @@ -22,6 +22,7 @@ from weboob.applications.qcineoob.ui.minisubtitle_ui import Ui_MiniSubtitle from weboob.capabilities.base import empty + class MiniSubtitle(QFrame): def __init__(self, weboob, backend, subtitle, parent=None): QFrame.__init__(self, parent) diff --git a/weboob/applications/qcineoob/minitorrent.py b/weboob/applications/qcineoob/minitorrent.py index 32d0fdc793..8eb906385d 100644 --- a/weboob/applications/qcineoob/minitorrent.py +++ b/weboob/applications/qcineoob/minitorrent.py @@ -23,6 +23,7 @@ from weboob.applications.weboorrents.weboorrents import sizeof_fmt from weboob.capabilities.base import empty + class MiniTorrent(QFrame): def __init__(self, weboob, backend, torrent, parent=None): QFrame.__init__(self, parent) diff --git a/weboob/applications/qcineoob/movie.py b/weboob/applications/qcineoob/movie.py index f895cbcbcc..f1889c6c52 100644 --- a/weboob/applications/qcineoob/movie.py +++ b/weboob/applications/qcineoob/movie.py @@ -27,6 +27,7 @@ from weboob.applications.suboob.suboob import LANGUAGE_CONV from weboob.applications.cineoob.cineoob import ROLE_LIST + class Movie(QFrame): def __init__(self, movie, backend, parent=None): QFrame.__init__(self, parent) diff --git a/weboob/applications/qcineoob/person.py b/weboob/applications/qcineoob/person.py index 6c5f01ea37..7836e5462a 100644 --- a/weboob/applications/qcineoob/person.py +++ b/weboob/applications/qcineoob/person.py @@ -26,6 +26,7 @@ from weboob.capabilities.base import empty from weboob.applications.cineoob.cineoob import ROLE_LIST + class Person(QFrame): def __init__(self, person, backend, parent=None): QFrame.__init__(self, parent) diff --git a/weboob/applications/qcineoob/qcineoob.py b/weboob/applications/qcineoob/qcineoob.py index b072413e48..1a54667462 100644 --- a/weboob/applications/qcineoob/qcineoob.py +++ b/weboob/applications/qcineoob/qcineoob.py @@ -36,6 +36,7 @@ class QCineoob(QtApplication): CONFIG = {'settings': {'backend': '', } } + def main(self, argv): self.load_backends([ICapCinema,ICapTorrent,ICapSubtitle]) self.load_config() diff --git a/weboob/applications/qcineoob/subtitle.py b/weboob/applications/qcineoob/subtitle.py index b25cf4d7af..fdf1cb2a9a 100644 --- a/weboob/applications/qcineoob/subtitle.py +++ b/weboob/applications/qcineoob/subtitle.py @@ -25,6 +25,7 @@ from weboob.applications.qcineoob.ui.subtitle_ui import Ui_Subtitle from weboob.capabilities.base import empty + class Subtitle(QFrame): def __init__(self, subtitle, backend, parent=None): QFrame.__init__(self, parent) @@ -77,4 +78,3 @@ def download(self): print >>sys.stderr, 'Unable to write subtitle file in "%s": %s' % (dest, e) return 1 return - diff --git a/weboob/applications/qcineoob/torrent.py b/weboob/applications/qcineoob/torrent.py index cfbbfdb269..2b26c66190 100644 --- a/weboob/applications/qcineoob/torrent.py +++ b/weboob/applications/qcineoob/torrent.py @@ -26,6 +26,7 @@ from weboob.applications.weboorrents.weboorrents import sizeof_fmt from weboob.capabilities.base import empty + class Torrent(QFrame): def __init__(self, torrent, backend, parent=None): QFrame.__init__(self, parent) @@ -77,4 +78,3 @@ def download(self): print >>sys.stderr, 'Unable to write .torrent in "%s": %s' % (dest, e) return 1 return - diff --git a/weboob/applications/qflatboob/main_window.py b/weboob/applications/qflatboob/main_window.py index 8f17165a80..5f1ca45477 100644 --- a/weboob/applications/qflatboob/main_window.py +++ b/weboob/applications/qflatboob/main_window.py @@ -30,6 +30,7 @@ from .ui.main_window_ui import Ui_MainWindow from .query import QueryDialog + class HousingListWidgetItem(QListWidgetItem): def __init__(self, housing, *args, **kwargs): QListWidgetItem.__init__(self, *args, **kwargs) @@ -56,6 +57,7 @@ def setAttrs(self, storage): elif self.background().color() != QColor(0,0,0): self.setBackground(QBrush()) + class MainWindow(QtMainWindow): def __init__(self, config, storage, weboob, parent=None): QtMainWindow.__init__(self, parent) diff --git a/weboob/applications/qflatboob/query.py b/weboob/applications/qflatboob/query.py index 6b06c6ec4a..b91004889b 100644 --- a/weboob/applications/qflatboob/query.py +++ b/weboob/applications/qflatboob/query.py @@ -24,6 +24,7 @@ from .ui.query_ui import Ui_QueryDialog + class QueryDialog(QDialog): def __init__(self, weboob, parent=None): QDialog.__init__(self, parent) @@ -43,7 +44,7 @@ def __init__(self, weboob, parent=None): if hasattr(self.ui.cityEdit, "setPlaceholderText"): self.ui.cityEdit.setPlaceholderText("Press enter to search city") - + def keyPressEvent(self, event): """ Disable handler and to prevent closing the window. diff --git a/weboob/applications/qhavedate/contacts.py b/weboob/applications/qhavedate/contacts.py index 377eef7b10..3643119156 100644 --- a/weboob/applications/qhavedate/contacts.py +++ b/weboob/applications/qhavedate/contacts.py @@ -37,6 +37,7 @@ from .ui.profile_ui import Ui_Profile from .ui.notes_ui import Ui_Notes + class ThreadMessage(QFrame): """ This class represents a message in the thread tab. @@ -70,6 +71,7 @@ def __eq__(self, m): return False return self.message == m.message + class ContactThread(QWidget): """ The thread of the selected contact. @@ -341,6 +343,7 @@ def display_photo(self): text += '
(Hidden photo)' self.ui.photoUrlLabel.setText(text) + class ContactNotes(QWidget): """ Widget for storing notes about a contact """ @@ -399,6 +402,7 @@ def _saveNotes_eb(self, backend, error, backtrace): QMessageBox.critical(self, self.tr('Error while saving notes'), content, QMessageBox.Ok) + class IGroup(object): def __init__(self, weboob, id, name): self.id = id @@ -408,6 +412,7 @@ def __init__(self, weboob, id, name): def iter_contacts(self, cb): raise NotImplementedError() + class MetaGroup(IGroup): def iter_contacts(self, cb): if self.id == 'online': @@ -427,6 +432,7 @@ def cb(self, cb, backend, contact): self.process = None cb(None) + class ContactsWidget(QWidget): def __init__(self, weboob, parent=None): QWidget.__init__(self, parent) @@ -587,5 +593,3 @@ def retrieveContact_eb(self, backend, error, backtrace): content += u'\n%s\n' % to_unicode(backtrace) QMessageBox.critical(self, self.tr('Error while getting contact'), content, QMessageBox.Ok) - - diff --git a/weboob/applications/qhavedate/events.py b/weboob/applications/qhavedate/events.py index 7260d9f797..d67743c355 100644 --- a/weboob/applications/qhavedate/events.py +++ b/weboob/applications/qhavedate/events.py @@ -25,6 +25,7 @@ from .ui.events_ui import Ui_Events + class EventsWidget(QWidget): def __init__(self, weboob, parent=None): QWidget.__init__(self, parent) diff --git a/weboob/applications/qhavedate/main_window.py b/weboob/applications/qhavedate/main_window.py index 4bfec3ffaa..378ab75ab4 100644 --- a/weboob/applications/qhavedate/main_window.py +++ b/weboob/applications/qhavedate/main_window.py @@ -35,6 +35,7 @@ from .contacts import ContactsWidget from .events import EventsWidget + class MainWindow(QtMainWindow): def __init__(self, config, weboob, parent=None): QtMainWindow.__init__(self, parent) diff --git a/weboob/applications/qhavedate/qhavedate.py b/weboob/applications/qhavedate/qhavedate.py index 231cf19c8a..c025e706f5 100644 --- a/weboob/applications/qhavedate/qhavedate.py +++ b/weboob/applications/qhavedate/qhavedate.py @@ -23,6 +23,7 @@ from .main_window import MainWindow + class QHaveDate(QtApplication): APPNAME = 'qhavedate' VERSION = '0.f' diff --git a/weboob/applications/qhavedate/status.py b/weboob/applications/qhavedate/status.py index ae7591cb58..dbef05e415 100644 --- a/weboob/applications/qhavedate/status.py +++ b/weboob/applications/qhavedate/status.py @@ -24,6 +24,7 @@ from weboob.tools.application.qt import QtDo from weboob.tools.misc import to_unicode + class Account(QFrame): def __init__(self, weboob, backend, parent=None): QFrame.__init__(self, parent) @@ -103,6 +104,7 @@ def updateStats_eb(self, backend, err, backtrace): self.body.setText(u'Unable to connect: %s' % to_unicode(err)) self.title.setText(u'%s' % unicode(self.title.text())) + class AccountsStatus(QScrollArea): def __init__(self, weboob, parent=None): QScrollArea.__init__(self, parent) diff --git a/weboob/applications/qvideoob/main_window.py b/weboob/applications/qvideoob/main_window.py index def9ded93d..704df56863 100644 --- a/weboob/applications/qvideoob/main_window.py +++ b/weboob/applications/qvideoob/main_window.py @@ -29,6 +29,7 @@ from .video import Video from .minivideo import MiniVideo + class MainWindow(QtMainWindow): def __init__(self, config, weboob, parent=None): QtMainWindow.__init__(self, parent) diff --git a/weboob/applications/qvideoob/minivideo.py b/weboob/applications/qvideoob/minivideo.py index 1aa7171fbc..066581a9d3 100644 --- a/weboob/applications/qvideoob/minivideo.py +++ b/weboob/applications/qvideoob/minivideo.py @@ -24,6 +24,7 @@ from weboob.applications.qvideoob.ui.minivideo_ui import Ui_MiniVideo from .video import Video + class MiniVideo(QFrame): def __init__(self, weboob, backend, video, parent=None): QFrame.__init__(self, parent) diff --git a/weboob/applications/qvideoob/qvideoob.py b/weboob/applications/qvideoob/qvideoob.py index 6001a9792f..e92a6640c8 100644 --- a/weboob/applications/qvideoob/qvideoob.py +++ b/weboob/applications/qvideoob/qvideoob.py @@ -37,6 +37,7 @@ class QVideoob(QtApplication): 'backend': '' } } + def main(self, argv): self.load_backends(ICapVideo) self.load_config() diff --git a/weboob/applications/qvideoob/video.py b/weboob/applications/qvideoob/video.py index 337b512055..4e5d03979e 100644 --- a/weboob/applications/qvideoob/video.py +++ b/weboob/applications/qvideoob/video.py @@ -24,6 +24,7 @@ from weboob.applications.qvideoob.ui.video_ui import Ui_Video + class Video(QDialog): def __init__(self, video, parent=None): QDialog.__init__(self, parent) diff --git a/weboob/applications/qwebcontentedit/main_window.py b/weboob/applications/qwebcontentedit/main_window.py index 907c8ee16b..637b3f8959 100644 --- a/weboob/applications/qwebcontentedit/main_window.py +++ b/weboob/applications/qwebcontentedit/main_window.py @@ -30,6 +30,7 @@ from .ui.main_window_ui import Ui_MainWindow + class MainWindow(QtMainWindow): def __init__(self, config, weboob, parent=None): QtMainWindow.__init__(self, parent) @@ -102,11 +103,11 @@ def loadPage(self): _id = unicode(self.ui.idEdit.text()) if not _id: return - + self.ui.loadButton.setEnabled(False) self.ui.loadButton.setText('Loading...') self.ui.contentEdit.setReadOnly(True) - + backend = str(self.ui.backendBox.currentText()) self.process = QtDo(self.weboob, self._loadedPage, @@ -137,7 +138,7 @@ def _loadedPage(self, backend, data): self.ui.contentEdit.setPlainText(self.content.content) self.setWindowTitle("QWebcontentedit - %s@%s" %(self.content.id, backend.name)) - self.backend = backend + self.backend = backend def _errorLoadPage(self, backend, error, backtrace): """ Error callback for loadPage """ @@ -203,7 +204,7 @@ def loadHistory(self): self.ui.loadHistoryButton.setEnabled(False) self.ui.loadHistoryButton.setText("Loading...") - + self.ui.historyTable.clear() self.ui.historyTable.setRowCount(0) @@ -212,7 +213,7 @@ def loadHistory(self): "Author", "Summary"]) self.ui.historyTable.setColumnWidth(3, 1000) - + self.process = QtDo(self.weboob, self._gotRevision, self._errorHistory) @@ -234,13 +235,13 @@ def _gotRevision(self, backend, revision): # are not modifiable (they are modifiable by default) item_revision = QTableWidgetItem(revision.id) item_revision.setFlags(Qt.ItemIsEnabled) - + item_time = QTableWidgetItem(revision.timestamp.strftime('%Y-%m-%d %H:%M:%S')) item_time.setFlags(Qt.ItemIsEnabled) - + item_author = QTableWidgetItem(revision.author) item_author.setFlags(Qt.ItemIsEnabled) - + item_summary = QTableWidgetItem(revision.comment) item_summary.setFlags(Qt.ItemIsEnabled) @@ -260,6 +261,6 @@ def _errorHistory(self, backend, error, backtrace): content += '\n%s\n' % to_unicode(backtrace) QMessageBox.critical(self, self.tr('Error while loading history'), content, QMessageBox.Ok) - + self.ui.loadHistoryButton.setEnabled(True) self.ui.loadHistoryButton.setText("Reload") diff --git a/weboob/applications/videoob/videoob.py b/weboob/applications/videoob/videoob.py index 353b22223c..ae6460a0f5 100644 --- a/weboob/applications/videoob/videoob.py +++ b/weboob/applications/videoob/videoob.py @@ -49,6 +49,7 @@ def get_description(self, obj): result += u' (%s/%s)' % (obj.rating, obj.rating_max) return result + class Videoob(ReplApplication): APPNAME = 'videoob' VERSION = '0.f' diff --git a/weboob/capabilities/account.py b/weboob/capabilities/account.py index 0c492d80de..abd0600b10 100644 --- a/weboob/capabilities/account.py +++ b/weboob/capabilities/account.py @@ -29,6 +29,7 @@ class AccountRegisterError(UserError): Raised when there is an error during registration. """ + class Account(CapBaseObject): """ Describe an account and its properties. @@ -40,6 +41,7 @@ class Account(CapBaseObject): def __init__(self, id=None): CapBaseObject.__init__(self, id) + class StatusField(object): """ Field of an account status. diff --git a/weboob/capabilities/bank.py b/weboob/capabilities/bank.py index 1dce091bec..d9cc377247 100644 --- a/weboob/capabilities/bank.py +++ b/weboob/capabilities/bank.py @@ -36,11 +36,13 @@ class AccountNotFound(UserError): def __init__(self, msg='Account not found'): UserError.__init__(self, msg) + class TransferError(UserError): """ A transfer has failed. """ + class Currency(object): CUR_UNKNOWN = 0 CUR_EUR = 1 @@ -92,6 +94,7 @@ class Recipient(CapBaseObject): def __init__(self): CapBaseObject.__init__(self, 0) + class Account(Recipient, Currency): """ Bank account. @@ -144,6 +147,7 @@ def __repr__(self): return "" % (self.date, label, self.amount) + class Transfer(CapBaseObject): """ Transfer from an account to a recipient. @@ -155,6 +159,7 @@ class Transfer(CapBaseObject): recipient = Field('Recipient', int, long, basestring) reason = StringField('Reason') + class ICapBank(ICapCollection): """ Capability of bank websites to see accounts and transactions. diff --git a/weboob/capabilities/bill.py b/weboob/capabilities/bill.py index f1f21c3676..25018a889f 100644 --- a/weboob/capabilities/bill.py +++ b/weboob/capabilities/bill.py @@ -53,6 +53,7 @@ class Detail(CapBaseObject): def __init__(self): CapBaseObject.__init__(self, 0) + class Bill(CapBaseObject): """ Bill. @@ -65,6 +66,7 @@ class Bill(CapBaseObject): def __init__(self): CapBaseObject.__init__(self, 0) + class Subscription(CapBaseObject): """ Subscription to a service. @@ -74,6 +76,7 @@ class Subscription(CapBaseObject): validity = DateField('End validity date of the subscription') renewdate = DateField('Reset date of consumption') + class ICapBill(ICapCollection): def iter_resources(self, objs, split_path): """ diff --git a/weboob/capabilities/bugtracker.py b/weboob/capabilities/bugtracker.py index 71a44e1d3d..f93468f2de 100644 --- a/weboob/capabilities/bugtracker.py +++ b/weboob/capabilities/bugtracker.py @@ -31,6 +31,7 @@ class IssueError(UserError): Raised when there is an error with an issue. """ + class Project(CapBaseObject): """ Represents a project. @@ -101,6 +102,7 @@ def find_status(self, name): return None return None + class User(CapBaseObject): """ User. @@ -114,6 +116,7 @@ def __init__(self, id, name): def __repr__(self): return '' % self.name + class Version(CapBaseObject): """ Version of a project. @@ -127,6 +130,7 @@ def __init__(self, id, name): def __repr__(self): return '' % self.name + class Status(CapBaseObject): """ Status of an issue. @@ -150,6 +154,7 @@ def __init__(self, id, name, value): def __repr__(self): return '' % self.name + class Attachment(CapBaseObject): """ Attachment of an issue. @@ -160,6 +165,7 @@ class Attachment(CapBaseObject): def __repr__(self): return '' % self.filename + class Change(CapBaseObject): """ A change of an update. @@ -168,6 +174,7 @@ class Change(CapBaseObject): last = StringField('Last value of field') new = StringField('New value of field') + class Update(CapBaseObject): """ Represents an update of an issue. @@ -182,6 +189,7 @@ class Update(CapBaseObject): def __repr__(self): return '' % self.id + class Issue(CapBaseObject): """ Represents an issue. @@ -199,6 +207,7 @@ class Issue(CapBaseObject): version = Field('Target version of this issue', Version) status = Field('Status of this issue', Status) + class Query(CapBaseObject): """ Query to find an issue. @@ -214,6 +223,7 @@ class Query(CapBaseObject): def __init__(self): CapBaseObject.__init__(self, '') + class ICapBugTracker(IBaseCap): """ Bug trackers websites. diff --git a/weboob/capabilities/chat.py b/weboob/capabilities/chat.py index dd585be4f3..aacae24f98 100644 --- a/weboob/capabilities/chat.py +++ b/weboob/capabilities/chat.py @@ -51,6 +51,7 @@ def __init__(self, id_from, id_to, message, date=None): if self.date is None: self.date = datetime.datetime.utcnow() + class ICapChat(IBaseCap): """ Websites with a chat system. diff --git a/weboob/capabilities/content.py b/weboob/capabilities/content.py index 8d528e0f74..06a315b34c 100644 --- a/weboob/capabilities/content.py +++ b/weboob/capabilities/content.py @@ -33,6 +33,7 @@ class Content(CapBaseObject): content = StringField('Body') revision = StringField('ID of revision') + class Revision(CapBaseObject): """ Revision of a change on a content. @@ -42,6 +43,7 @@ class Revision(CapBaseObject): timestamp = DateField('Date of revision') minor = Field('Is this change minor?', bool) + class ICapContent(IBaseCap): def get_content(self, id, revision=None): """ diff --git a/weboob/capabilities/dating.py b/weboob/capabilities/dating.py index ff934cac5c..eaa012878c 100644 --- a/weboob/capabilities/dating.py +++ b/weboob/capabilities/dating.py @@ -88,6 +88,7 @@ class Event(CapBaseObject): type = StringField('Type of event') message = StringField('Message of the event') + class ICapDating(IBaseCap): """ Capability for dating websites. diff --git a/weboob/capabilities/geolocip.py b/weboob/capabilities/geolocip.py index 6a071a9c01..a7a384b230 100644 --- a/weboob/capabilities/geolocip.py +++ b/weboob/capabilities/geolocip.py @@ -42,6 +42,7 @@ def __init__(self, ipaddr): CapBaseObject.__init__(self, ipaddr) self.ipaddr = ipaddr + class ICapGeolocIp(IBaseCap): """ Access information about IP addresses database. diff --git a/weboob/capabilities/housing.py b/weboob/capabilities/housing.py index 11c1fd1179..7d8b2d5363 100644 --- a/weboob/capabilities/housing.py +++ b/weboob/capabilities/housing.py @@ -45,6 +45,7 @@ def __str__(self): def __repr__(self): return u'' % (self.id, len(self.data) if self.data else 0) + class Housing(CapBaseObject): """ Content of a housing. @@ -61,6 +62,7 @@ class Housing(CapBaseObject): photos = Field('List of photos', list) details = Field('Key/values of details', dict) + class Query(CapBaseObject): """ Query to find housings. @@ -79,12 +81,14 @@ class Query(CapBaseObject): def __init__(self): CapBaseObject.__init__(self, '') + class City(CapBaseObject): """ City. """ name = StringField('Name of city') + class ICapHousing(IBaseCap): """ Capability of websites to search housings. diff --git a/weboob/capabilities/library.py b/weboob/capabilities/library.py index ebe0169f56..68caff7dc9 100644 --- a/weboob/capabilities/library.py +++ b/weboob/capabilities/library.py @@ -34,12 +34,14 @@ class Book(CapBaseObject): date = DateField('The due date') late = Field('Are you late?', bool) + class Renew(CapBaseObject): """ A renew message. """ message = StringField('Message') + class ICapBook(ICapCollection): """ Library websites. diff --git a/weboob/capabilities/messages.py b/weboob/capabilities/messages.py index 711875dfa6..ada4f95f6e 100644 --- a/weboob/capabilities/messages.py +++ b/weboob/capabilities/messages.py @@ -34,10 +34,12 @@ class _Message(CapBaseObject): """ Base message. """ pass + class _Thread(CapBaseObject): """ Base Thread. """ pass + class Message(_Message): """ Represents a message read or to send. @@ -131,6 +133,7 @@ def __repr__(self): return '' % ( self.full_id, self.title, self.date, self.sender) + class Thread(_Thread): """ Thread containing messages. @@ -199,11 +202,13 @@ def set_message_read(self, message): """ raise NotImplementedError() + class CantSendMessage(UserError): """ Raised when a message can't be send. """ + class ICapMessagesPost(IBaseCap): """ This capability allow user to send a message. diff --git a/weboob/capabilities/paste.py b/weboob/capabilities/paste.py index f8b9ef6ddf..ce9833dfc5 100644 --- a/weboob/capabilities/paste.py +++ b/weboob/capabilities/paste.py @@ -29,6 +29,7 @@ class PasteNotFound(UserError): Raised when a paste is not found. """ + class BasePaste(CapBaseObject): """ Represents a pasted text. diff --git a/weboob/capabilities/pricecomparison.py b/weboob/capabilities/pricecomparison.py index aa1625a94a..a6ae0f2d84 100644 --- a/weboob/capabilities/pricecomparison.py +++ b/weboob/capabilities/pricecomparison.py @@ -31,6 +31,7 @@ class Product(CapBaseObject): """ name = StringField('Name of product') + class Shop(CapBaseObject): """ A shop where the price is. @@ -39,6 +40,7 @@ class Shop(CapBaseObject): location = StringField('Location of the shop') info = StringField('Information about the shop') + class Price(CapBaseObject): """ Price. @@ -50,6 +52,7 @@ class Price(CapBaseObject): shop = Field('Shop information', Shop) product = Field('Product', Product) + class ICapPriceComparison(IBaseCap): """ Capability for price comparison websites. diff --git a/weboob/capabilities/radio.py b/weboob/capabilities/radio.py index daaa41fc89..67be4f4ff6 100644 --- a/weboob/capabilities/radio.py +++ b/weboob/capabilities/radio.py @@ -41,6 +41,7 @@ def __unicode__(self): else: return self.title + class Stream(CapBaseObject): """ Stream of a radio. @@ -54,6 +55,7 @@ def __unicode__(self): def __repr__(self): return self.__unicode__() + class Radio(CapBaseObject): """ Radio object. @@ -63,6 +65,7 @@ class Radio(CapBaseObject): current = Field('Current emission', Emission) streams = Field('List of streams', list) + class ICapRadio(IBaseCap): """ Capability of radio websites. diff --git a/weboob/capabilities/travel.py b/weboob/capabilities/travel.py index 73fde9c126..8f8cd75604 100644 --- a/weboob/capabilities/travel.py +++ b/weboob/capabilities/travel.py @@ -40,6 +40,7 @@ def __init__(self, id, name): def __repr__(self): return "" % (self.id, self.name) + class Departure(CapBaseObject): """ Describes a departure. @@ -62,6 +63,7 @@ def __repr__(self): return u"" % ( self.id, self.type, self.time.strftime('%H:%M'), self.departure_station, self.arrival_station) + class RoadStep(CapBaseObject): """ A step on a roadmap. @@ -73,11 +75,13 @@ class RoadStep(CapBaseObject): arrival = StringField('Arrival station') duration = DeltaField('Duration of this step') + class RoadmapError(UserError): """ Raised when the roadmap is unable to be calculated. """ + class RoadmapFilters(CapBaseObject): """ Filters to get a roadmap. @@ -88,6 +92,7 @@ class RoadmapFilters(CapBaseObject): def __init__(self): CapBaseObject.__init__(self, '') + class ICapTravel(IBaseCap): """ Travel websites. diff --git a/weboob/capabilities/weather.py b/weboob/capabilities/weather.py index 074df49ab3..1252705b20 100644 --- a/weboob/capabilities/weather.py +++ b/weboob/capabilities/weather.py @@ -71,6 +71,7 @@ def __init__(self, date, low, high, text, unit): self.high = Temperature(high, unit) self.text = text + class Current(CapBaseObject): """ Current weather. @@ -85,6 +86,7 @@ def __init__(self, date, temp, text, unit): self.text = text self.temp = Temperature(temp, unit) + class City(CapBaseObject): """ City where to find weather. @@ -95,11 +97,13 @@ def __init__(self, id, name): CapBaseObject.__init__(self, id) self.name = name + class CityNotFound(UserError): """ Raised when a city is not found. """ + class ICapWeather(IBaseCap): """ Capability for weather websites. diff --git a/weboob/core/bcall.py b/weboob/core/bcall.py index 7a20ad9dab..1a0492d6f2 100644 --- a/weboob/core/bcall.py +++ b/weboob/core/bcall.py @@ -43,13 +43,16 @@ def __init__(self, errors): def __iter__(self): return self.errors.__iter__() + class IResultsCondition(object): def is_valid(self, obj): raise NotImplementedError() + class ResultsConditionError(Exception): pass + class BackendsCall(object): def __init__(self, backends, condition, function, *args, **kwargs): """ diff --git a/weboob/core/modules.py b/weboob/core/modules.py index 25024233c3..1d67f3a564 100644 --- a/weboob/core/modules.py +++ b/weboob/core/modules.py @@ -32,6 +32,7 @@ def __init__(self, module_name, msg): Exception.__init__(self, msg) self.module = module_name + class Module(object): def __init__(self, package): self.logger = getLogger('backend') diff --git a/weboob/core/scheduler.py b/weboob/core/scheduler.py index 3c19a50e94..bf2b555e53 100644 --- a/weboob/core/scheduler.py +++ b/weboob/core/scheduler.py @@ -44,6 +44,7 @@ def run(self): def want_stop(self): raise NotImplementedError() + class RepeatedTimer(_Timer): def run(self): while not self.finished.isSet(): @@ -55,6 +56,7 @@ def run(self): self.finished.wait(self.interval) self.finished.set() + class Scheduler(IScheduler): def __init__(self): self.logger = getLogger('scheduler') diff --git a/weboob/tools/application/base.py b/weboob/tools/application/base.py index 3768876c53..bb0accf6b5 100644 --- a/weboob/tools/application/base.py +++ b/weboob/tools/application/base.py @@ -64,6 +64,7 @@ def save(self): if self.storage: return self.storage.save('applications', self.name) + class BaseApplication(object): """ Base application. diff --git a/weboob/tools/application/console.py b/weboob/tools/application/console.py index a22aa4d744..000ad903e0 100644 --- a/weboob/tools/application/console.py +++ b/weboob/tools/application/console.py @@ -50,9 +50,11 @@ def __init__(self, id, backends): Exception.__init__(self, 'Please specify a backend to use for this argument (%s@backend_name). ' 'Availables: %s.' % (id, ', '.join(name for name, backend in backends))) + class BackendNotFound(Exception): pass + class ConsoleApplication(BaseApplication): """ Base application class for CLI applications. diff --git a/weboob/tools/application/formatters/load.py b/weboob/tools/application/formatters/load.py index 3bc544ab45..810de04b27 100644 --- a/weboob/tools/application/formatters/load.py +++ b/weboob/tools/application/formatters/load.py @@ -24,6 +24,7 @@ class FormatterLoadError(Exception): pass + class FormattersLoader(object): BUILTINS = ['htmltable', 'multiline', 'simple', 'table', 'csv', 'webkit', 'json'] diff --git a/weboob/tools/application/formatters/table.py b/weboob/tools/application/formatters/table.py index 55e7468819..7ac6a7ab3f 100644 --- a/weboob/tools/application/formatters/table.py +++ b/weboob/tools/application/formatters/table.py @@ -70,7 +70,7 @@ def get_formatted_table(self): table = PrettyTable(list(column_headers)) for column_header in column_headers: # API changed in python-prettytable. The try/except is a bad hack to support both versions - # Note: two versions are not exactly the same... + # Note: two versions are not exactly the same... # (first one: header in center. Second one: left align for header too) try: table.set_field_align(column_header, 'l') diff --git a/weboob/tools/application/media_player.py b/weboob/tools/application/media_player.py index 0c83df3c90..4e068c3584 100644 --- a/weboob/tools/application/media_player.py +++ b/weboob/tools/application/media_player.py @@ -39,7 +39,7 @@ class MediaPlayerNotFound(Exception): def __init__(self): - Exception.__init__(self, u'No media player found on this system. Please install one of them: %s.' % \ + Exception.__init__(self, u'No media player found on this system. Please install one of them: %s.' % ', '.join(player[0] for player in PLAYERS)) @@ -75,7 +75,7 @@ def play(self, media, player_name=None, player_args=None): """ player_names = [player[0] for player in PLAYERS] if not player_name: - self.logger.debug(u'No media player given. Using the first available from: %s.' % \ + self.logger.debug(u'No media player given. Using the first available from: %s.' % ', '.join(player_names)) player_name = self.guess_player_name() if player_name is None: diff --git a/weboob/tools/application/qt/backendcfg.py b/weboob/tools/application/qt/backendcfg.py index ff1873e792..fc0d7ccb4d 100644 --- a/weboob/tools/application/qt/backendcfg.py +++ b/weboob/tools/application/qt/backendcfg.py @@ -221,7 +221,7 @@ def loadBackendsList(self): continue item = QTreeWidgetItem(None, [instance_name, name]) - item.setCheckState(0, Qt.Checked if params.get('_enabled', '1').lower() in ('1', 'y', 'true') \ + item.setCheckState(0, Qt.Checked if params.get('_enabled', '1').lower() in ('1', 'y', 'true') else Qt.Unchecked) self.set_icon(item, info) diff --git a/weboob/tools/application/qt/qt.py b/weboob/tools/application/qt/qt.py index 05bf79fe12..81000c6d9b 100644 --- a/weboob/tools/application/qt/qt.py +++ b/weboob/tools/application/qt/qt.py @@ -39,6 +39,7 @@ __all__ = ['QtApplication', 'QtMainWindow', 'QtDo', 'HTMLDelegate'] + class QtScheduler(IScheduler): def __init__(self, app): self.app = app @@ -81,6 +82,7 @@ def want_stop(self): def run(self): self.app.exec_() + class QCallbacksManager(QObject): class Request(object): def __init__(self): @@ -132,6 +134,7 @@ def add_request(self, request): request.event.wait() return request.answer + class QtApplication(QApplication, BaseApplication): def __init__(self): QApplication.__init__(self, sys.argv) @@ -143,10 +146,12 @@ def __init__(self): def create_weboob(self): return Weboob(scheduler=QtScheduler(self)) + class QtMainWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) + class QtDo(QObject): def __init__(self, weboob, cb, eb=None): QObject.__init__(self) @@ -223,6 +228,7 @@ def thread_cb(self, backend, data): def thread_eb(self, backend, error, backtrace): self.emit(SIGNAL('eb'), backend, error, backtrace) + class HTMLDelegate(QStyledItemDelegate): def paint(self, painter, option, index): optionV4 = QStyleOptionViewItemV4(option) @@ -260,6 +266,7 @@ def sizeHint(self, option, index): return QSize(doc.idealWidth(), max(doc.size().height(), optionV4.decorationSize.height())) + class _QtValueStr(QLineEdit): def __init__(self, value): QLineEdit.__init__(self) @@ -277,11 +284,13 @@ def get_value(self): self._value.set(unicode(self.text())) return self._value + class _QtValueBackendPassword(_QtValueStr): def get_value(self): self._value._domain = None return _QtValueStr.get_value(self) + class _QtValueBool(QCheckBox): def __init__(self, value): QCheckBox.__init__(self) @@ -297,6 +306,7 @@ def get_value(self): self._value.set(self.isChecked()) return self._value + class _QtValueInt(QSpinBox): def __init__(self, value): QSpinBox.__init__(self) @@ -312,6 +322,7 @@ def get_value(self): self._value.set(self.getValue()) return self._value + class _QtValueChoices(QComboBox): def __init__(self, value): QComboBox.__init__(self) @@ -332,6 +343,7 @@ def get_value(self): self._value.set(unicode(self.itemData(self.currentIndex()).toString())) return self._value + def QtValue(value): if isinstance(value, ValueBool): klass = _QtValueBool diff --git a/weboob/tools/browser/browser.py b/weboob/tools/browser/browser.py index 9caacd6c89..7a0c5fa024 100644 --- a/weboob/tools/browser/browser.py +++ b/weboob/tools/browser/browser.py @@ -70,12 +70,15 @@ class BrowserIncorrectPassword(Exception): pass + class BrowserForbidden(Exception): pass + class BrowserBanned(BrowserIncorrectPassword): pass + class BrowserPasswordExpired(BrowserIncorrectPassword): pass @@ -83,9 +86,11 @@ class BrowserPasswordExpired(BrowserIncorrectPassword): class BrowserUnavailable(Exception): pass + class BrowserHTTPNotFound(BrowserUnavailable): pass + class BrowserHTTPError(BrowserUnavailable): pass @@ -113,9 +118,11 @@ def clear(self): def close(self): pass + class BrokenPageError(Exception): pass + class BasePage(object): """ Base page @@ -138,6 +145,7 @@ def on_loaded(self): """ pass + def check_location(func): def inner(self, *args, **kwargs): if args and isinstance(args[0], basestring): @@ -152,6 +160,7 @@ def inner(self, *args, **kwargs): return func(self, *args, **kwargs) return inner + class StandardBrowser(mechanize.Browser): """ Standard Browser. diff --git a/weboob/tools/browser/decorators.py b/weboob/tools/browser/decorators.py index 436f38f3f3..a15a74a0cb 100644 --- a/weboob/tools/browser/decorators.py +++ b/weboob/tools/browser/decorators.py @@ -23,6 +23,7 @@ from urlparse import urlsplit import re + class check_url(object): """ Checks if the first argument matches the given regular expression (given as str, diff --git a/weboob/tools/capabilities/messages/genericArticle.py b/weboob/tools/capabilities/messages/genericArticle.py index 76f50c05fa..14731d19db 100644 --- a/weboob/tools/capabilities/messages/genericArticle.py +++ b/weboob/tools/capabilities/messages/genericArticle.py @@ -50,6 +50,8 @@ def drop_comments(base_element): # Replace relative url in link and image with a complete url # Arguments: the html element to clean, and the domain name (with http:// prefix) + + def clean_relativ_urls(base_element, domain): for a in base_element.findall('.//a'): if "href" in a.attrib: diff --git a/weboob/tools/capabilities/paste.py b/weboob/tools/capabilities/paste.py index 09135a556e..305582f939 100644 --- a/weboob/tools/capabilities/paste.py +++ b/weboob/tools/capabilities/paste.py @@ -48,6 +48,7 @@ def get_closest_expiration(self, max_age): if max_age is False or max_age >= e: return e + def test(): class MockPasteBackend(BasePasteBackend): def __init__(self, expirations): diff --git a/weboob/tools/captcha/virtkeyboard.py b/weboob/tools/captcha/virtkeyboard.py index 8840dac53d..8f0a36fb0e 100644 --- a/weboob/tools/captcha/virtkeyboard.py +++ b/weboob/tools/captcha/virtkeyboard.py @@ -46,10 +46,10 @@ def __init__(self, file, coords, color, convert=None): 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" \ + 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): - raise VirtKeyboardError("Color requires %i components but %i are provided" \ + raise VirtKeyboardError("Color requires %i components but %i are provided" % (len(self.bands), len(color))) self.color = color @@ -123,7 +123,7 @@ def check_symbols(self, symbols, dirname): if dirname is None: dirname = tempfile.mkdtemp(prefix='weboob_session_') self.generate_MD5(dirname) - raise VirtKeyboardError("Symbol '%s' not found; all symbol hashes are available in %s"\ + raise VirtKeyboardError("Symbol '%s' not found; all symbol hashes are available in %s" % (s, dirname)) def generate_MD5(self, dir): diff --git a/weboob/tools/parsers/iparser.py b/weboob/tools/parsers/iparser.py index 161e009a04..072ba8cebb 100644 --- a/weboob/tools/parsers/iparser.py +++ b/weboob/tools/parsers/iparser.py @@ -54,6 +54,7 @@ def strip(self, data): p = re.compile(r'<.*?>') return p.sub(' ', data).strip() + class RawParser(IParser): def parse(self, data, encoding=None): return data.read() diff --git a/weboob/tools/test.py b/weboob/tools/test.py index e6ce1d996b..65b175a233 100644 --- a/weboob/tools/test.py +++ b/weboob/tools/test.py @@ -26,6 +26,7 @@ __all__ = ['TestCase', 'BackendTest'] + class BackendTest(TestCase): BACKEND = None diff --git a/weboob/tools/value.py b/weboob/tools/value.py index 6024551585..217b1a49b7 100644 --- a/weboob/tools/value.py +++ b/weboob/tools/value.py @@ -37,6 +37,7 @@ def __init__(self, *values): for v in values: self[v.id] = v + class Value(object): """ Value. @@ -116,6 +117,7 @@ def get(self): """ return self._value + class ValueBackendPassword(Value): _domain = None _callbacks = {} @@ -190,6 +192,7 @@ def get(self): self._stored = False return self._value + class ValueInt(Value): def __init__(self, *args, **kwargs): kwargs['regexp'] = '^\d+$' @@ -198,6 +201,7 @@ def __init__(self, *args, **kwargs): def get(self): return int(self._value) + class ValueFloat(Value): def __init__(self, *args, **kwargs): kwargs['regexp'] = '^[\d\.]+$' @@ -212,6 +216,7 @@ def check_valid(self, v): def get(self): return float(self._value) + class ValueBool(Value): def __init__(self, *args, **kwargs): kwargs['choices'] = {'y': 'True', 'n': 'False'} -- GitLab