From 8f032d2e214a93a4cdd09ed375d64f8e212673f5 Mon Sep 17 00:00:00 2001 From: Lowik Bourgeoisat Date: Wed, 20 Feb 2019 17:42:06 +0100 Subject: [PATCH] Add a helper method to generate TableElement code --- .../applications/weboobdebug/weboobdebug.py | 5 ++- weboob/browser/elements.py | 35 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/weboob/applications/weboobdebug/weboobdebug.py b/weboob/applications/weboobdebug/weboobdebug.py index 587625e1d5..b8872dd898 100644 --- a/weboob/applications/weboobdebug/weboobdebug.py +++ b/weboob/applications/weboobdebug/weboobdebug.py @@ -22,6 +22,7 @@ from optparse import OptionGroup from weboob.tools.application.base import Application +from weboob.browser.elements import generate_table_element class WeboobDebug(Application): @@ -57,7 +58,9 @@ def main(self, argv): print(u'Unable to load backend "%s"' % backend_name, file=self.stderr) return 1 - locs = dict(backend=backend, browser=backend.browser, application=self, weboob=self.weboob) + locs = dict(backend=backend, browser=backend.browser, + application=self, weboob=self.weboob, + generate_table_element=generate_table_element) banner = 'Weboob debug shell\nBackend "%s" loaded.\nAvailable variables:\n' % backend_name \ + '\n'.join([' %s: %s' % (k, v) for k, v in locs.items()]) diff --git a/weboob/browser/elements.py b/weboob/browser/elements.py index 39df7a7d46..8f01f78b34 100644 --- a/weboob/browser/elements.py +++ b/weboob/browser/elements.py @@ -40,6 +40,41 @@ __all__ = ['DataError', 'AbstractElement', 'ListElement', 'ItemElement', 'TableElement', 'SkipItem'] +def generate_table_element(doc, head_xpath, cleaner=CleanText): + """ + Prints generated base code for TableElement/TableCell usage. + It is intended for development purposes, typically in weboob-debug. + :param doc: lxml tree of the page (e.g. browser.page.doc) + :param head_xpath: xpath of header columns (e.g. //table//th) + :type head_xpath: str + :param cleaner: cleaner class (Filter) + :type cleaner: Filter + """ + from unidecode import unidecode + indent = 4 + headers = doc.xpath(head_xpath) + cols = dict() + for el in headers: + th = cleaner.clean(el) + cols.update({re.sub('[^a-zA-Z]', '_', unidecode(th)).lower(): th}) + + print(' ' * indent + '@method') + print(' ' * indent + 'class get_items(TableElement):') + if cleaner is not CleanText: + print(' ' * indent * 2 + 'cleaner = %s' % cleaner.__name__) + print(' ' * indent * 2 + 'head_xpath = ' + repr(head_xpath)) + print(' ' * indent * 2 + 'item_xpath = ' + repr('...') + '\n') + + for col, name in cols.items(): + print(' ' * indent * 2 + 'col_' + col + ' = ' + repr(name)) + + print('\n' + ' ' * indent * 2 + 'class item(ItemElement):') + print(' ' * indent * 3 + 'klass = BaseObject' + '\n') + + for col in cols: + print(' ' * indent * 3 + 'obj_' + col + ' = ' + "TableCell('%s') & CleanText()" % col) + + class DataError(Exception): """ Returned data from pages are incoherent. -- GitLab