From f17324361cd2c769e8a58cfb745b74f0b76591a6 Mon Sep 17 00:00:00 2001 From: Christophe Benz Date: Thu, 22 Apr 2010 15:21:39 +0200 Subject: [PATCH 1/5] simplify option parsing --- weboob/tools/application/base.py | 45 ++++++++++------------------- weboob/tools/application/console.py | 15 +++++----- 2 files changed, 23 insertions(+), 37 deletions(-) diff --git a/weboob/tools/application/base.py b/weboob/tools/application/base.py index a673c837..e4b55f53 100644 --- a/weboob/tools/application/base.py +++ b/weboob/tools/application/base.py @@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import sys, os import logging -from optparse import OptionParser +from optparse import OptionGroup, OptionParser from weboob import Weboob from weboob.tools.config.iconfig import ConfigError @@ -46,6 +46,19 @@ class BaseApplication(object): def __init__(self): self.weboob = self.create_weboob() self.config = None + version = None + if self.VERSION: + if self.COPYRIGHT: + version = '%s v%s (%s)' % (self.APPNAME, self.VERSION, self.COPYRIGHT) + else: + version = '%s v%s' % (self.APPNAME, self.VERSION) + self._parser = OptionParser(self.SYNOPSIS, version=version) + self._parser.add_option('-b', '--backends', help='what backend(s) to enable (comma separated)') + logging_options = OptionGroup(self._parser, 'Logging Options') + logging_options.add_option('-d', '--debug', action='store_true', help='display debug messages') + logging_options.add_option('-q', '--quiet', action='store_true', help='display only error messages') + logging_options.add_option('-v', '--verbose', action='store_true', help='display info messages') + self._parser.add_option_group(logging_options) def create_weboob(self): return Weboob(self.APPNAME) @@ -99,19 +112,6 @@ class BaseApplication(object): """ Main function """ raise NotImplementedError() - def configure_parser(self, parser): - """ - Frontend parser configuration. - Overload this method to add custom options for your parser. - Options will be available in the BaseApplication.options variable. - - @param parser [OptionParser] the parser object. - """ - pass - - def _configure_parser(self, parser): - pass - def load_backends(self, caps=None, names=None, *args, **kwargs): if names is None: names = self._enabled_backends @@ -123,22 +123,9 @@ class BaseApplication(object): self.weboob.load_modules(caps, names, *args, **kwargs) @classmethod - def run(klass): + def run(klass, args=sys.argv): app = klass() - version = None - if app.VERSION: - if app.COPYRIGHT: - version = '%s v%s (%s)' % (app.APPNAME, app.VERSION, app.COPYRIGHT) - else: - version = '%s v%s' % (app.APPNAME, app.VERSION) - parser = OptionParser(app.SYNOPSIS, version=version) - parser.add_option('-b', '--backends', help='what backend(s) to enable (comma separated)') - parser.add_option('-d', '--debug', action='store_true', help='display debug messages') - parser.add_option('-q', '--quiet', action='store_true', help='display only error messages') - parser.add_option('-v', '--verbose', action='store_true', help='display info messages') - app._configure_parser(parser) - app.configure_parser(parser) - app.options, args = parser.parse_args(sys.argv) + app.options, args = app._parser.parse_args(args) if app.options.debug: level=logging.DEBUG elif app.options.verbose: diff --git a/weboob/tools/application/console.py b/weboob/tools/application/console.py index abc5bc06..e468e9dc 100644 --- a/weboob/tools/application/console.py +++ b/weboob/tools/application/console.py @@ -102,17 +102,16 @@ class ConsoleApplication(BaseApplication): sys.exit(1) self.default_output_format = None - def _configure_parser(self, parser): - parser.format_description = lambda x: parser.description + self._parser.format_description = lambda x: self._parser.description - if parser.description is None: - parser.description = '' - parser.description += 'Available commands:\n' + if self._parser.description is None: + self._parser.description = '' + self._parser.description += 'Available commands:\n' for f in self._command_help: - parser.description += ' %s\n' % f + self._parser.description += ' %s\n' % f - parser.add_option('-o', '--output-format', choices=formatters.keys(), - help='output format %s (default: table)' % formatters.keys()) + self._parser.add_option('-o', '--output-format', choices=formatters.keys(), + help='output format %s (default: table)' % formatters.keys()) def ask(self, question, default=None, masked=False, regexp=None): """ From b3a71d513e11857f3bcbc489baf9a851af5f96f6 Mon Sep 17 00:00:00 2001 From: Christophe Benz Date: Thu, 22 Apr 2010 15:21:48 +0200 Subject: [PATCH 2/5] remove help command, prefer --help --- weboob/tools/application/console.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/weboob/tools/application/console.py b/weboob/tools/application/console.py index e468e9dc..a7900a67 100644 --- a/weboob/tools/application/console.py +++ b/weboob/tools/application/console.py @@ -149,7 +149,11 @@ class ConsoleApplication(BaseApplication): return line - def process_command(self, command='help', *args): + def process_command(self, command=None, *args): + if command is None: + self._parser.print_help() + return 0 + def f(x): return x.startswith('command_' + command) @@ -231,11 +235,5 @@ class ConsoleApplication(BaseApplication): def command(doc_string, f=register_command): return partial(f, doc_string=doc_string) - @command("display this notice") - def command_help(self): - sys.stdout.write("Available commands:\n") - for f in self._command_help: - sys.stdout.write(' %s\n' % f) - register_command = staticmethod(register_command) command = staticmethod(command) From 5527617640493b16712ae5df1761870e6852de54 Mon Sep 17 00:00:00 2001 From: Christophe Benz Date: Thu, 22 Apr 2010 15:26:27 +0200 Subject: [PATCH 3/5] use new enabled_backends feature --- weboob/frontends/boobank/boobank.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weboob/frontends/boobank/boobank.py b/weboob/frontends/boobank/boobank.py index 6cb5f843..f5523c8d 100644 --- a/weboob/frontends/boobank/boobank.py +++ b/weboob/frontends/boobank/boobank.py @@ -38,7 +38,7 @@ class Boobank(ConsoleApplication): COPYRIGHT = 'Copyright(C) 2010 Romain Bignon' def main(self, argv): - self.load_backends(ICapBank, names=self.enabled_backends) + self.load_backends(ICapBank) return self.process_command(*argv[1:]) @ConsoleApplication.command('List every available accounts') From 0a7936097548c6410c1114ee680654c2feb79ed4 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Thu, 22 Apr 2010 15:27:55 +0200 Subject: [PATCH 4/5] display error message for each methods to change page --- weboob/tools/browser.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weboob/tools/browser.py b/weboob/tools/browser.py index d4ee69b3..cdb09a20 100644 --- a/weboob/tools/browser.py +++ b/weboob/tools/browser.py @@ -195,7 +195,7 @@ class BaseBrowser(mechanize.Browser): try: return mechanize.Browser.open(self, *args, **kwargs) except (mechanize.response_seek_wrapper, urllib2.HTTPError, urllib2.URLError), e: - error(e) + error('Error opening URL "%s": %s' % (args and args[0] or 'None', e)) raise BrowserUnavailable() except mechanize.BrowserStateError: self.home() @@ -208,7 +208,7 @@ class BaseBrowser(mechanize.Browser): try: self._change_location(mechanize.Browser.submit(self, *args, **kwargs)) except (mechanize.response_seek_wrapper, urllib2.HTTPError, urllib2.URLError), e: - error(e) + error('Error submitting FORM: %s' % e) self.page = None raise BrowserUnavailable() except (mechanize.BrowserStateError, BrowserRetry): @@ -222,7 +222,7 @@ class BaseBrowser(mechanize.Browser): try: self._change_location(mechanize.Browser.follow_link(self, *args, **kwargs)) except (mechanize.response_seek_wrapper, urllib2.HTTPError, urllib2.URLError), e: - error(e) + error('Error following link "%s": %s' % (args and args[0] or "None", e)) self.page = None raise BrowserUnavailable() except (mechanize.BrowserStateError, BrowserRetry): @@ -250,7 +250,7 @@ class BaseBrowser(mechanize.Browser): if not self.page or not args or self.page.url != args[0]: self.location(keep_args, keep_kwargs) except (mechanize.response_seek_wrapper, urllib2.HTTPError, urllib2.URLError), e: - error('Error opening URL "%s": %s' % (args[0], e)) + error('Error changing location to "%s": %s' % (args and args[0] or 'None', e)) self.page = None raise BrowserUnavailable() except mechanize.BrowserStateError: From 6538b4b6571abfa54d2ca7cb34c531381d04950b Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Thu, 22 Apr 2010 17:11:17 +0200 Subject: [PATCH 5/5] correctly decode Subject --- scripts/monboob | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/monboob b/scripts/monboob index ebbecedb..50d142bc 100755 --- a/scripts/monboob +++ b/scripts/monboob @@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. from email.mime.text import MIMEText from smtplib import SMTP -from email.Header import Header +from email.Header import Header, decode_header from email.Utils import parseaddr, formataddr from email import message_from_file import time @@ -61,6 +61,14 @@ class Monboob(ConsoleApplication): if m: reply_to = m.group(1) title = msg.get('Subject') + if title: + new_title = u'' + for part in decode_header(title): + if part[1]: + new_title += unicode(part[0], part[1]) + else: + new_title += unicode(part[0]) + title = new_title content = u'' for part in msg.walk():