From 14a7a1d36296190ae771cd62ce84d335b1dd0ac6 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Tue, 3 Jan 2012 12:10:21 +0100 Subject: [PATCH] support repositories to manage backends (closes #747) --- contrib/hds/export.py | 22 +- {weboob/backends => modules}/__init__.py | 0 {weboob/backends => modules}/arte/__init__.py | 0 {weboob/backends => modules}/arte/backend.py | 0 {weboob/backends => modules}/arte/browser.py | 0 icons/arte.png => modules/arte/favicon.png | Bin {weboob/backends => modules}/arte/pages.py | 0 {weboob/backends => modules}/arte/test.py | 0 {weboob/backends => modules}/arte/video.py | 0 {weboob/backends => modules}/aum/API.txt | 0 {weboob/backends => modules}/aum/__init__.py | 0 {weboob/backends => modules}/aum/antispam.py | 0 {weboob/backends => modules}/aum/backend.py | 0 {weboob/backends => modules}/aum/browser.py | 0 {weboob/backends => modules}/aum/captcha.py | 2 +- {weboob/backends => modules}/aum/contact.py | 0 icons/aum.png => modules/aum/favicon.png | Bin .../aum/optim/__init__.py | 0 .../aum/optim/priority_connection.py | 6 +- .../aum/optim/profiles_walker.py | 0 .../aum/optim/queries_queue.py | 0 .../aum/optim/visibility.py | 0 {weboob/backends => modules}/aum/test.py | 0 .../backends => modules}/batoto/__init__.py | 0 .../backends => modules}/batoto/backend.py | 0 {weboob/backends => modules}/batoto/test.py | 0 .../backends => modules}/bnporc/__init__.py | 0 .../backends => modules}/bnporc/backend.py | 0 .../backends => modules}/bnporc/browser.py | 2 +- {weboob/backends => modules}/bnporc/errors.py | 0 .../bnporc.png => modules/bnporc/favicon.png | Bin .../bnporc/pages/__init__.py | 0 .../bnporc/pages/account_coming.py | 0 .../bnporc/pages/account_history.py | 0 .../bnporc/pages/accounts_list.py | 0 .../bnporc/pages/login.py | 0 .../bnporc/pages/transfer.py | 0 {weboob/backends => modules}/bnporc/test.py | 0 .../boursorama/__init__.py | 0 .../boursorama/backend.py | 0 .../boursorama/browser.py | 2 +- .../boursorama/pages/__init__.py | 0 .../boursorama/pages/account_history.py | 0 .../boursorama/pages/accounts_list.py | 0 .../boursorama/pages/login.py | 0 .../backends => modules}/boursorama/test.py | 0 .../backends => modules}/bouygues/__init__.py | 0 .../backends => modules}/bouygues/backend.py | 0 .../backends => modules}/bouygues/browser.py | 0 .../bouygues/favicon.png | Bin .../bouygues/pages/__init__.py | 0 .../bouygues/pages/compose.py | 0 .../bouygues/pages/login.py | 0 {weboob/backends => modules}/bouygues/test.py | 0 {weboob/backends => modules}/bp/__init__.py | 0 {weboob/backends => modules}/bp/backend.py | 0 {weboob/backends => modules}/bp/browser.py | 0 icons/bp.png => modules/bp/favicon.png | Bin .../backends => modules}/bp/pages/__init__.py | 0 .../bp/pages/accounthistory.py | 0 .../bp/pages/accountlist.py | 0 .../backends => modules}/bp/pages/login.py | 0 .../backends => modules}/bp/pages/transfer.py | 0 .../canalplus/__init__.py | 0 .../backends => modules}/canalplus/backend.py | 0 .../backends => modules}/canalplus/browser.py | 0 .../canalplus/favicon.png | Bin .../canalplus/pages/__init__.py | 0 .../canalplus/pages/initpage.py | 0 .../canalplus/pages/video.py | 0 .../canalplus/pages/videopage.py | 0 .../backends => modules}/canalplus/test.py | 0 .../backends => modules}/canaltp/__init__.py | 0 .../backends => modules}/canaltp/backend.py | 0 .../backends => modules}/canaltp/browser.py | 0 .../canaltp/favicon.png | Bin {weboob/backends => modules}/canaltp/test.py | 0 {weboob/backends => modules}/cmb/__init__.py | 0 {weboob/backends => modules}/cmb/backend.py | 0 .../backends => modules}/cragr/__init__.py | 0 {weboob/backends => modules}/cragr/backend.py | 0 {weboob/backends => modules}/cragr/browser.py | 2 +- icons/cragr.png => modules/cragr/favicon.png | Bin .../cragr/pages/__init__.py | 0 .../cragr/pages/accounts_list.py | 0 .../backends => modules}/cragr/pages/base.py | 0 .../backends => modules}/cragr/pages/login.py | 0 {weboob/backends => modules}/cragr/test.py | 0 .../creditmutuel/__init__.py | 0 .../creditmutuel/backend.py | 0 .../creditmutuel/browser.py | 0 .../creditmutuel/favicon.png | Bin .../creditmutuel/pages.py | 0 .../backends => modules}/creditmutuel/test.py | 0 .../dailymotion/__init__.py | 0 .../dailymotion/backend.py | 0 .../dailymotion/browser.py | 0 .../dailymotion/favicon.png | Bin .../backends => modules}/dailymotion/pages.py | 0 .../backends => modules}/dailymotion/test.py | 0 .../backends => modules}/dailymotion/video.py | 0 {weboob/backends => modules}/dlfp/__init__.py | 0 {weboob/backends => modules}/dlfp/backend.py | 0 {weboob/backends => modules}/dlfp/browser.py | 0 icons/dlfp.png => modules/dlfp/favicon.png | Bin .../dlfp/pages/__init__.py | 0 .../backends => modules}/dlfp/pages/board.py | 0 .../backends => modules}/dlfp/pages/index.py | 0 .../backends => modules}/dlfp/pages/news.py | 2 +- .../backends => modules}/dlfp/pages/wiki.py | 0 {weboob/backends => modules}/dlfp/test.py | 2 +- {weboob/backends => modules}/dlfp/tools.py | 0 .../backends => modules}/eatmanga/__init__.py | 0 .../backends => modules}/eatmanga/backend.py | 0 {weboob/backends => modules}/eatmanga/test.py | 0 .../backends => modules}/ecrans/__init__.py | 0 .../backends => modules}/ecrans/backend.py | 0 .../backends => modules}/ecrans/browser.py | 0 .../ecrans.png => modules/ecrans/favicon.png | Bin .../ecrans/pages/__init__.py | 0 .../ecrans/pages/article.py | 0 {weboob/backends => modules}/ecrans/test.py | 0 {weboob/backends => modules}/ecrans/tools.py | 0 .../backends => modules}/ehentai/__init__.py | 0 .../backends => modules}/ehentai/backend.py | 0 .../backends => modules}/ehentai/browser.py | 0 .../ehentai/favicon.png | Bin .../backends => modules}/ehentai/gallery.py | 0 {weboob/backends => modules}/ehentai/pages.py | 0 {weboob/backends => modules}/ehentai/test.py | 0 .../backends => modules}/fourchan/__init__.py | 0 .../backends => modules}/fourchan/backend.py | 0 .../backends => modules}/fourchan/browser.py | 0 .../fourchan/favicon.png | Bin .../fourchan/pages/__init__.py | 0 .../fourchan/pages/board.py | 0 {weboob/backends => modules}/fourchan/test.py | 0 .../franceinter/__init__.py | 0 .../franceinter/backend.py | 0 .../franceinter/favicon.png | Bin .../backends => modules}/franceinter/test.py | 0 .../francetelevisions/__init__.py | 0 .../francetelevisions/backend.py | 0 .../francetelevisions/browser.py | 0 .../francetelevisions/favicon.png | Bin .../francetelevisions/pages.py | 0 .../francetelevisions/test.py | 0 .../francetelevisions/video.py | 0 .../backends => modules}/gazelle/__init__.py | 0 .../backends => modules}/gazelle/backend.py | 0 .../backends => modules}/gazelle/browser.py | 0 .../gazelle/favicon.png | Bin .../gazelle/pages/__init__.py | 0 .../gazelle/pages/base.py | 0 .../gazelle/pages/index.py | 0 .../gazelle/pages/torrents.py | 0 {weboob/backends => modules}/gazelle/test.py | 0 .../backends => modules}/geolocip/__init__.py | 0 .../backends => modules}/geolocip/backend.py | 0 .../geolocip/favicon.png | Bin {weboob/backends => modules}/geolocip/test.py | 0 {weboob/backends => modules}/hds/__init__.py | 0 {weboob/backends => modules}/hds/backend.py | 0 {weboob/backends => modules}/hds/browser.py | 0 icons/hds.png => modules/hds/favicon.png | Bin {weboob/backends => modules}/hds/pages.py | 0 {weboob/backends => modules}/hds/test.py | 0 {weboob/backends => modules}/ina/__init__.py | 0 {weboob/backends => modules}/ina/backend.py | 0 {weboob/backends => modules}/ina/browser.py | 0 icons/ina.png => modules/ina/favicon.png | Bin .../ina/pages/__init__.py | 0 .../backends => modules}/ina/pages/search.py | 0 .../backends => modules}/ina/pages/video.py | 0 {weboob/backends => modules}/ina/test.py | 0 {weboob/backends => modules}/ina/video.py | 0 {weboob/backends => modules}/ing/__init__.py | 0 {weboob/backends => modules}/ing/backend.py | 0 {weboob/backends => modules}/ing/browser.py | 2 +- .../ing/pages/__init__.py | 0 .../ing/pages/account_history.py | 0 .../ing/pages/accounts_list.py | 0 .../backends => modules}/ing/pages/login.py | 0 {weboob/backends => modules}/ing/test.py | 0 .../backends => modules}/inrocks/__init__.py | 0 .../backends => modules}/inrocks/backend.py | 0 .../backends => modules}/inrocks/browser.py | 0 .../inrocks/favicon.png | Bin .../inrocks/pages/__init__.py | 0 .../inrocks/pages/article.py | 0 .../inrocks/pages/inrockstv.py | 0 {weboob/backends => modules}/inrocks/test.py | 0 {weboob/backends => modules}/inrocks/tools.py | 0 .../backends => modules}/ipinfodb/__init__.py | 0 .../backends => modules}/ipinfodb/backend.py | 0 .../ipinfodb/favicon.png | Bin {weboob/backends => modules}/ipinfodb/test.py | 0 .../backends => modules}/isohunt/__init__.py | 0 .../backends => modules}/isohunt/backend.py | 0 .../backends => modules}/isohunt/browser.py | 0 .../isohunt/favicon.png | Bin .../isohunt/pages/__init__.py | 0 .../isohunt/pages/torrents.py | 0 {weboob/backends => modules}/isohunt/test.py | 0 .../backends => modules}/izneo/__init__.py | 0 {weboob/backends => modules}/izneo/backend.py | 0 icons/izneo.png => modules/izneo/favicon.png | Bin .../backends => modules}/kickass/__init__.py | 0 .../backends => modules}/kickass/backend.py | 0 .../backends => modules}/kickass/browser.py | 0 .../kickass/favicon.png | Bin .../kickass/pages/__init__.py | 0 .../kickass/pages/torrents.py | 0 {weboob/backends => modules}/kickass/test.py | 0 {weboob/backends => modules}/lcl/__init__.py | 0 {weboob/backends => modules}/lcl/backend.py | 0 {weboob/backends => modules}/lcl/browser.py | 0 icons/lcl.png => modules/lcl/favicon.png | Bin {weboob/backends => modules}/lcl/pages.py | 0 {weboob/backends => modules}/lcl/test.py | 0 .../backends => modules}/lefigaro/__init__.py | 0 .../backends => modules}/lefigaro/backend.py | 0 .../backends => modules}/lefigaro/browser.py | 0 .../lefigaro/favicon.png | Bin .../lefigaro/pages/__init__.py | 0 .../lefigaro/pages/article.py | 0 .../lefigaro/pages/flashactu.py | 0 .../lefigaro/pages/simple.py | 0 .../lefigaro/pages/special.py | 0 {weboob/backends => modules}/lefigaro/test.py | 0 .../backends => modules}/lefigaro/tools.py | 0 .../backends => modules}/lemouv/__init__.py | 0 .../backends => modules}/lemouv/backend.py | 0 .../lemouv.png => modules/lemouv/favicon.png | Bin {weboob/backends => modules}/lemouv/test.py | 0 .../backends => modules}/mangafox/__init__.py | 0 .../backends => modules}/mangafox/backend.py | 0 {weboob/backends => modules}/mangafox/test.py | 0 .../mangahere/__init__.py | 0 .../backends => modules}/mangahere/backend.py | 0 .../backends => modules}/mangahere/test.py | 0 .../mangareader/__init__.py | 0 .../mangareader/backend.py | 0 .../backends => modules}/mangareader/test.py | 0 .../mangatoshokan/__init__.py | 0 .../mangatoshokan/backend.py | 0 .../mangatoshokan/test.py | 0 .../mediawiki/__init__.py | 0 .../backends => modules}/mediawiki/backend.py | 0 .../backends => modules}/mediawiki/browser.py | 0 .../mediawiki/favicon.png | Bin .../backends => modules}/mediawiki/test.py | 0 .../meteofrance/__init__.py | 0 .../meteofrance/backend.py | 0 .../meteofrance/browser.py | 0 .../meteofrance/favicon.png | Bin .../meteofrance/pages/__init__.py | 0 .../meteofrance/pages/meteo.py | 0 .../backends => modules}/meteofrance/test.py | 0 .../minutes20/__init__.py | 0 .../backends => modules}/minutes20/backend.py | 0 .../backends => modules}/minutes20/browser.py | 0 .../minutes20/favicon.png | Bin .../minutes20/pages/__init__.py | 0 .../minutes20/pages/article.py | 0 .../minutes20/pages/simple.py | 0 .../backends => modules}/minutes20/test.py | 0 .../backends => modules}/minutes20/tools.py | 0 .../backends => modules}/newsfeed/__init__.py | 0 .../backends => modules}/newsfeed/backend.py | 0 .../newsfeed/favicon.png | Bin {weboob/backends => modules}/newsfeed/test.py | 0 .../backends => modules}/nolifetv/__init__.py | 0 .../backends => modules}/nolifetv/backend.py | 0 .../backends => modules}/nolifetv/browser.py | 0 .../nolifetv/pages/__init__.py | 0 .../nolifetv/pages/index.py | 0 .../nolifetv/pages/video.py | 0 {weboob/backends => modules}/nolifetv/test.py | 0 .../backends => modules}/nolifetv/video.py | 0 {weboob/backends => modules}/nova/__init__.py | 0 {weboob/backends => modules}/nova/backend.py | 0 icons/nova.png => modules/nova/favicon.png | Bin {weboob/backends => modules}/nova/test.py | 0 .../backends => modules}/orange/__init__.py | 0 .../backends => modules}/orange/backend.py | 0 .../backends => modules}/orange/browser.py | 0 .../orange.png => modules/orange/favicon.png | Bin .../orange/pages/__init__.py | 0 .../orange/pages/compose.py | 0 .../orange/pages/login.py | 0 .../backends => modules}/ouifm/__init__.py | 0 {weboob/backends => modules}/ouifm/backend.py | 0 icons/ouifm.png => modules/ouifm/favicon.png | Bin {weboob/backends => modules}/ouifm/test.py | 0 .../pastealacon/__init__.py | 0 .../pastealacon/backend.py | 0 .../pastealacon/browser.py | 0 .../pastealacon/favicon.png | Bin .../backends => modules}/pastealacon/pages.py | 0 .../backends => modules}/pastealacon/paste.py | 0 .../backends => modules}/pastealacon/test.py | 0 .../backends => modules}/pastebin/__init__.py | 0 .../backends => modules}/pastebin/backend.py | 0 .../backends => modules}/pastebin/browser.py | 0 .../pastebin/favicon.png | Bin .../backends => modules}/pastebin/pages.py | 0 .../backends => modules}/pastebin/paste.py | 0 {weboob/backends => modules}/pastebin/test.py | 0 .../backends => modules}/phpbb/__init__.py | 0 {weboob/backends => modules}/phpbb/backend.py | 0 {weboob/backends => modules}/phpbb/browser.py | 0 icons/phpbb.png => modules/phpbb/favicon.png | Bin .../phpbb/pages/__init__.py | 0 .../backends => modules}/phpbb/pages/forum.py | 0 .../backends => modules}/phpbb/pages/index.py | 0 {weboob/backends => modules}/phpbb/test.py | 0 {weboob/backends => modules}/phpbb/tools.py | 0 .../piratebay/__init__.py | 0 .../backends => modules}/piratebay/backend.py | 0 .../backends => modules}/piratebay/browser.py | 0 .../piratebay/favicon.png | Bin .../piratebay/pages/__init__.py | 0 .../piratebay/pages/index.py | 0 .../piratebay/pages/torrents.py | 0 .../backends => modules}/piratebay/test.py | 0 .../backends => modules}/redmine/__init__.py | 0 .../backends => modules}/redmine/backend.py | 0 .../backends => modules}/redmine/browser.py | 0 .../redmine/favicon.png | Bin .../redmine/pages/__init__.py | 0 .../redmine/pages/index.py | 0 .../redmine/pages/issues.py | 0 .../redmine/pages/wiki.py | 0 {weboob/backends => modules}/sfr/__init__.py | 0 {weboob/backends => modules}/sfr/backend.py | 0 {weboob/backends => modules}/sfr/browser.py | 0 icons/sfr.png => modules/sfr/favicon.png | Bin .../sfr/pages/__init__.py | 0 .../backends => modules}/sfr/pages/compose.py | 0 .../backends => modules}/sfr/pages/login.py | 0 {weboob/backends => modules}/sfr/test.py | 0 .../simplyreadit/__init__.py | 0 .../simplyreadit/backend.py | 0 .../backends => modules}/simplyreadit/test.py | 0 .../societegenerale/__init__.py | 0 .../societegenerale/backend.py | 0 .../societegenerale/browser.py | 2 +- .../societegenerale/captcha.py | 0 .../societegenerale/favicon.png | Bin .../societegenerale/pages/__init__.py | 0 .../societegenerale/pages/accounts_list.py | 0 .../societegenerale/pages/login.py | 2 +- .../societegenerale/test.py | 0 .../transilien/__init__.py | 0 .../transilien/backend.py | 0 .../transilien/browser.py | 0 .../transilien/favicon.png | Bin .../transilien/pages/__init__.py | 0 .../transilien/pages/departures.py | 0 .../transilien/pages/roadmap.py | 0 .../transilien/pages/station.py | 0 .../transilien/stations.py | 0 .../backends => modules}/transilien/test.py | 0 .../backends => modules}/yahoo/__init__.py | 0 {weboob/backends => modules}/yahoo/backend.py | 0 icons/yahoo.png => modules/yahoo/favicon.png | Bin {weboob/backends => modules}/yahoo/test.py | 0 .../backends => modules}/youjizz/__init__.py | 0 .../backends => modules}/youjizz/backend.py | 0 .../backends => modules}/youjizz/browser.py | 0 .../youjizz/favicon.png | Bin .../youjizz/pages/__init__.py | 0 .../youjizz/pages/index.py | 0 .../youjizz/pages/video.py | 0 {weboob/backends => modules}/youjizz/test.py | 0 {weboob/backends => modules}/youjizz/video.py | 0 .../backends => modules}/youporn/__init__.py | 0 .../backends => modules}/youporn/backend.py | 0 .../backends => modules}/youporn/browser.py | 0 .../youporn/favicon.png | Bin .../youporn/pages/__init__.py | 0 .../youporn/pages/base.py | 0 .../youporn/pages/index.py | 0 .../youporn/pages/video.py | 0 {weboob/backends => modules}/youporn/test.py | 0 {weboob/backends => modules}/youporn/video.py | 0 .../backends => modules}/youtube/__init__.py | 0 .../backends => modules}/youtube/backend.py | 0 .../backends => modules}/youtube/browser.py | 0 .../youtube/favicon.png | Bin {weboob/backends => modules}/youtube/pages.py | 0 {weboob/backends => modules}/youtube/test.py | 0 {weboob/backends => modules}/youtube/video.py | 0 scripts/weboob-repos | 27 + tools/pyflakes.sh | 2 +- tools/weboob_lint.py | 27 +- weboob/applications/boobathon/boobathon.py | 4 +- weboob/applications/weboobcfg/weboobcfg.py | 118 ++-- weboob/applications/weboobrepos/__init__.py | 23 + .../applications/weboobrepos/weboobrepos.py | 125 +++++ weboob/core/modules.py | 52 +- weboob/core/ouiboube.py | 30 +- weboob/core/repositories.py | 502 ++++++++++++++++++ weboob/tools/application/base.py | 8 +- weboob/tools/application/console.py | 93 ++-- weboob/tools/application/qt/backendcfg.py | 242 +++++---- weboob/tools/application/qt/backendcfg.ui | 44 +- weboob/tools/application/repl.py | 20 +- weboob/tools/backend.py | 13 +- 410 files changed, 1079 insertions(+), 297 deletions(-) rename {weboob/backends => modules}/__init__.py (100%) rename {weboob/backends => modules}/arte/__init__.py (100%) rename {weboob/backends => modules}/arte/backend.py (100%) rename {weboob/backends => modules}/arte/browser.py (100%) rename icons/arte.png => modules/arte/favicon.png (100%) rename {weboob/backends => modules}/arte/pages.py (100%) rename {weboob/backends => modules}/arte/test.py (100%) rename {weboob/backends => modules}/arte/video.py (100%) rename {weboob/backends => modules}/aum/API.txt (100%) rename {weboob/backends => modules}/aum/__init__.py (100%) rename {weboob/backends => modules}/aum/antispam.py (100%) rename {weboob/backends => modules}/aum/backend.py (100%) rename {weboob/backends => modules}/aum/browser.py (100%) rename {weboob/backends => modules}/aum/captcha.py (99%) rename {weboob/backends => modules}/aum/contact.py (100%) rename icons/aum.png => modules/aum/favicon.png (100%) rename {weboob/backends => modules}/aum/optim/__init__.py (100%) rename {weboob/backends => modules}/aum/optim/priority_connection.py (97%) rename {weboob/backends => modules}/aum/optim/profiles_walker.py (100%) rename {weboob/backends => modules}/aum/optim/queries_queue.py (100%) rename {weboob/backends => modules}/aum/optim/visibility.py (100%) rename {weboob/backends => modules}/aum/test.py (100%) rename {weboob/backends => modules}/batoto/__init__.py (100%) rename {weboob/backends => modules}/batoto/backend.py (100%) rename {weboob/backends => modules}/batoto/test.py (100%) rename {weboob/backends => modules}/bnporc/__init__.py (100%) rename {weboob/backends => modules}/bnporc/backend.py (100%) rename {weboob/backends => modules}/bnporc/browser.py (99%) rename {weboob/backends => modules}/bnporc/errors.py (100%) rename icons/bnporc.png => modules/bnporc/favicon.png (100%) rename {weboob/backends => modules}/bnporc/pages/__init__.py (100%) rename {weboob/backends => modules}/bnporc/pages/account_coming.py (100%) rename {weboob/backends => modules}/bnporc/pages/account_history.py (100%) rename {weboob/backends => modules}/bnporc/pages/accounts_list.py (100%) rename {weboob/backends => modules}/bnporc/pages/login.py (100%) rename {weboob/backends => modules}/bnporc/pages/transfer.py (100%) rename {weboob/backends => modules}/bnporc/test.py (100%) rename {weboob/backends => modules}/boursorama/__init__.py (100%) rename {weboob/backends => modules}/boursorama/backend.py (100%) rename {weboob/backends => modules}/boursorama/browser.py (98%) rename {weboob/backends => modules}/boursorama/pages/__init__.py (100%) rename {weboob/backends => modules}/boursorama/pages/account_history.py (100%) rename {weboob/backends => modules}/boursorama/pages/accounts_list.py (100%) rename {weboob/backends => modules}/boursorama/pages/login.py (100%) rename {weboob/backends => modules}/boursorama/test.py (100%) rename {weboob/backends => modules}/bouygues/__init__.py (100%) rename {weboob/backends => modules}/bouygues/backend.py (100%) rename {weboob/backends => modules}/bouygues/browser.py (100%) rename icons/bouygues.png => modules/bouygues/favicon.png (100%) rename {weboob/backends => modules}/bouygues/pages/__init__.py (100%) rename {weboob/backends => modules}/bouygues/pages/compose.py (100%) rename {weboob/backends => modules}/bouygues/pages/login.py (100%) rename {weboob/backends => modules}/bouygues/test.py (100%) rename {weboob/backends => modules}/bp/__init__.py (100%) rename {weboob/backends => modules}/bp/backend.py (100%) rename {weboob/backends => modules}/bp/browser.py (100%) rename icons/bp.png => modules/bp/favicon.png (100%) rename {weboob/backends => modules}/bp/pages/__init__.py (100%) rename {weboob/backends => modules}/bp/pages/accounthistory.py (100%) rename {weboob/backends => modules}/bp/pages/accountlist.py (100%) rename {weboob/backends => modules}/bp/pages/login.py (100%) rename {weboob/backends => modules}/bp/pages/transfer.py (100%) rename {weboob/backends => modules}/canalplus/__init__.py (100%) rename {weboob/backends => modules}/canalplus/backend.py (100%) rename {weboob/backends => modules}/canalplus/browser.py (100%) rename icons/canalplus.png => modules/canalplus/favicon.png (100%) rename {weboob/backends => modules}/canalplus/pages/__init__.py (100%) rename {weboob/backends => modules}/canalplus/pages/initpage.py (100%) rename {weboob/backends => modules}/canalplus/pages/video.py (100%) rename {weboob/backends => modules}/canalplus/pages/videopage.py (100%) rename {weboob/backends => modules}/canalplus/test.py (100%) rename {weboob/backends => modules}/canaltp/__init__.py (100%) rename {weboob/backends => modules}/canaltp/backend.py (100%) rename {weboob/backends => modules}/canaltp/browser.py (100%) rename icons/canaltp.png => modules/canaltp/favicon.png (100%) rename {weboob/backends => modules}/canaltp/test.py (100%) rename {weboob/backends => modules}/cmb/__init__.py (100%) rename {weboob/backends => modules}/cmb/backend.py (100%) rename {weboob/backends => modules}/cragr/__init__.py (100%) rename {weboob/backends => modules}/cragr/backend.py (100%) rename {weboob/backends => modules}/cragr/browser.py (99%) rename icons/cragr.png => modules/cragr/favicon.png (100%) rename {weboob/backends => modules}/cragr/pages/__init__.py (100%) rename {weboob/backends => modules}/cragr/pages/accounts_list.py (100%) rename {weboob/backends => modules}/cragr/pages/base.py (100%) rename {weboob/backends => modules}/cragr/pages/login.py (100%) rename {weboob/backends => modules}/cragr/test.py (100%) rename {weboob/backends => modules}/creditmutuel/__init__.py (100%) rename {weboob/backends => modules}/creditmutuel/backend.py (100%) rename {weboob/backends => modules}/creditmutuel/browser.py (100%) rename icons/creditmutuel.png => modules/creditmutuel/favicon.png (100%) rename {weboob/backends => modules}/creditmutuel/pages.py (100%) rename {weboob/backends => modules}/creditmutuel/test.py (100%) rename {weboob/backends => modules}/dailymotion/__init__.py (100%) rename {weboob/backends => modules}/dailymotion/backend.py (100%) rename {weboob/backends => modules}/dailymotion/browser.py (100%) rename icons/dailymotion.png => modules/dailymotion/favicon.png (100%) rename {weboob/backends => modules}/dailymotion/pages.py (100%) rename {weboob/backends => modules}/dailymotion/test.py (100%) rename {weboob/backends => modules}/dailymotion/video.py (100%) rename {weboob/backends => modules}/dlfp/__init__.py (100%) rename {weboob/backends => modules}/dlfp/backend.py (100%) rename {weboob/backends => modules}/dlfp/browser.py (100%) rename icons/dlfp.png => modules/dlfp/favicon.png (100%) rename {weboob/backends => modules}/dlfp/pages/__init__.py (100%) rename {weboob/backends => modules}/dlfp/pages/board.py (100%) rename {weboob/backends => modules}/dlfp/pages/index.py (100%) rename {weboob/backends => modules}/dlfp/pages/news.py (99%) rename {weboob/backends => modules}/dlfp/pages/wiki.py (100%) rename {weboob/backends => modules}/dlfp/test.py (97%) rename {weboob/backends => modules}/dlfp/tools.py (100%) rename {weboob/backends => modules}/eatmanga/__init__.py (100%) rename {weboob/backends => modules}/eatmanga/backend.py (100%) rename {weboob/backends => modules}/eatmanga/test.py (100%) rename {weboob/backends => modules}/ecrans/__init__.py (100%) rename {weboob/backends => modules}/ecrans/backend.py (100%) rename {weboob/backends => modules}/ecrans/browser.py (100%) rename icons/ecrans.png => modules/ecrans/favicon.png (100%) rename {weboob/backends => modules}/ecrans/pages/__init__.py (100%) rename {weboob/backends => modules}/ecrans/pages/article.py (100%) rename {weboob/backends => modules}/ecrans/test.py (100%) rename {weboob/backends => modules}/ecrans/tools.py (100%) rename {weboob/backends => modules}/ehentai/__init__.py (100%) rename {weboob/backends => modules}/ehentai/backend.py (100%) rename {weboob/backends => modules}/ehentai/browser.py (100%) rename icons/ehentai.png => modules/ehentai/favicon.png (100%) rename {weboob/backends => modules}/ehentai/gallery.py (100%) rename {weboob/backends => modules}/ehentai/pages.py (100%) rename {weboob/backends => modules}/ehentai/test.py (100%) rename {weboob/backends => modules}/fourchan/__init__.py (100%) rename {weboob/backends => modules}/fourchan/backend.py (100%) rename {weboob/backends => modules}/fourchan/browser.py (100%) rename icons/fourchan.png => modules/fourchan/favicon.png (100%) rename {weboob/backends => modules}/fourchan/pages/__init__.py (100%) rename {weboob/backends => modules}/fourchan/pages/board.py (100%) rename {weboob/backends => modules}/fourchan/test.py (100%) rename {weboob/backends => modules}/franceinter/__init__.py (100%) rename {weboob/backends => modules}/franceinter/backend.py (100%) rename icons/franceinter.png => modules/franceinter/favicon.png (100%) rename {weboob/backends => modules}/franceinter/test.py (100%) rename {weboob/backends => modules}/francetelevisions/__init__.py (100%) rename {weboob/backends => modules}/francetelevisions/backend.py (100%) rename {weboob/backends => modules}/francetelevisions/browser.py (100%) rename icons/francetelevisions.png => modules/francetelevisions/favicon.png (100%) rename {weboob/backends => modules}/francetelevisions/pages.py (100%) rename {weboob/backends => modules}/francetelevisions/test.py (100%) rename {weboob/backends => modules}/francetelevisions/video.py (100%) rename {weboob/backends => modules}/gazelle/__init__.py (100%) rename {weboob/backends => modules}/gazelle/backend.py (100%) rename {weboob/backends => modules}/gazelle/browser.py (100%) rename icons/gazelle.png => modules/gazelle/favicon.png (100%) rename {weboob/backends => modules}/gazelle/pages/__init__.py (100%) rename {weboob/backends => modules}/gazelle/pages/base.py (100%) rename {weboob/backends => modules}/gazelle/pages/index.py (100%) rename {weboob/backends => modules}/gazelle/pages/torrents.py (100%) rename {weboob/backends => modules}/gazelle/test.py (100%) rename {weboob/backends => modules}/geolocip/__init__.py (100%) rename {weboob/backends => modules}/geolocip/backend.py (100%) rename icons/geolocip.png => modules/geolocip/favicon.png (100%) rename {weboob/backends => modules}/geolocip/test.py (100%) rename {weboob/backends => modules}/hds/__init__.py (100%) rename {weboob/backends => modules}/hds/backend.py (100%) rename {weboob/backends => modules}/hds/browser.py (100%) rename icons/hds.png => modules/hds/favicon.png (100%) rename {weboob/backends => modules}/hds/pages.py (100%) rename {weboob/backends => modules}/hds/test.py (100%) rename {weboob/backends => modules}/ina/__init__.py (100%) rename {weboob/backends => modules}/ina/backend.py (100%) rename {weboob/backends => modules}/ina/browser.py (100%) rename icons/ina.png => modules/ina/favicon.png (100%) rename {weboob/backends => modules}/ina/pages/__init__.py (100%) rename {weboob/backends => modules}/ina/pages/search.py (100%) rename {weboob/backends => modules}/ina/pages/video.py (100%) rename {weboob/backends => modules}/ina/test.py (100%) rename {weboob/backends => modules}/ina/video.py (100%) rename {weboob/backends => modules}/ing/__init__.py (100%) rename {weboob/backends => modules}/ing/backend.py (100%) rename {weboob/backends => modules}/ing/browser.py (98%) rename {weboob/backends => modules}/ing/pages/__init__.py (100%) rename {weboob/backends => modules}/ing/pages/account_history.py (100%) rename {weboob/backends => modules}/ing/pages/accounts_list.py (100%) rename {weboob/backends => modules}/ing/pages/login.py (100%) rename {weboob/backends => modules}/ing/test.py (100%) rename {weboob/backends => modules}/inrocks/__init__.py (100%) rename {weboob/backends => modules}/inrocks/backend.py (100%) rename {weboob/backends => modules}/inrocks/browser.py (100%) rename icons/inrocks.png => modules/inrocks/favicon.png (100%) rename {weboob/backends => modules}/inrocks/pages/__init__.py (100%) rename {weboob/backends => modules}/inrocks/pages/article.py (100%) rename {weboob/backends => modules}/inrocks/pages/inrockstv.py (100%) rename {weboob/backends => modules}/inrocks/test.py (100%) rename {weboob/backends => modules}/inrocks/tools.py (100%) rename {weboob/backends => modules}/ipinfodb/__init__.py (100%) rename {weboob/backends => modules}/ipinfodb/backend.py (100%) rename icons/ipinfodb.png => modules/ipinfodb/favicon.png (100%) rename {weboob/backends => modules}/ipinfodb/test.py (100%) rename {weboob/backends => modules}/isohunt/__init__.py (100%) rename {weboob/backends => modules}/isohunt/backend.py (100%) rename {weboob/backends => modules}/isohunt/browser.py (100%) rename icons/isohunt.png => modules/isohunt/favicon.png (100%) rename {weboob/backends => modules}/isohunt/pages/__init__.py (100%) rename {weboob/backends => modules}/isohunt/pages/torrents.py (100%) rename {weboob/backends => modules}/isohunt/test.py (100%) rename {weboob/backends => modules}/izneo/__init__.py (100%) rename {weboob/backends => modules}/izneo/backend.py (100%) rename icons/izneo.png => modules/izneo/favicon.png (100%) rename {weboob/backends => modules}/kickass/__init__.py (100%) rename {weboob/backends => modules}/kickass/backend.py (100%) rename {weboob/backends => modules}/kickass/browser.py (100%) rename icons/kickass.png => modules/kickass/favicon.png (100%) rename {weboob/backends => modules}/kickass/pages/__init__.py (100%) rename {weboob/backends => modules}/kickass/pages/torrents.py (100%) rename {weboob/backends => modules}/kickass/test.py (100%) rename {weboob/backends => modules}/lcl/__init__.py (100%) rename {weboob/backends => modules}/lcl/backend.py (100%) rename {weboob/backends => modules}/lcl/browser.py (100%) rename icons/lcl.png => modules/lcl/favicon.png (100%) rename {weboob/backends => modules}/lcl/pages.py (100%) rename {weboob/backends => modules}/lcl/test.py (100%) rename {weboob/backends => modules}/lefigaro/__init__.py (100%) rename {weboob/backends => modules}/lefigaro/backend.py (100%) rename {weboob/backends => modules}/lefigaro/browser.py (100%) rename icons/lefigaro.png => modules/lefigaro/favicon.png (100%) rename {weboob/backends => modules}/lefigaro/pages/__init__.py (100%) rename {weboob/backends => modules}/lefigaro/pages/article.py (100%) rename {weboob/backends => modules}/lefigaro/pages/flashactu.py (100%) rename {weboob/backends => modules}/lefigaro/pages/simple.py (100%) rename {weboob/backends => modules}/lefigaro/pages/special.py (100%) rename {weboob/backends => modules}/lefigaro/test.py (100%) rename {weboob/backends => modules}/lefigaro/tools.py (100%) rename {weboob/backends => modules}/lemouv/__init__.py (100%) rename {weboob/backends => modules}/lemouv/backend.py (100%) rename icons/lemouv.png => modules/lemouv/favicon.png (100%) rename {weboob/backends => modules}/lemouv/test.py (100%) rename {weboob/backends => modules}/mangafox/__init__.py (100%) rename {weboob/backends => modules}/mangafox/backend.py (100%) rename {weboob/backends => modules}/mangafox/test.py (100%) rename {weboob/backends => modules}/mangahere/__init__.py (100%) rename {weboob/backends => modules}/mangahere/backend.py (100%) rename {weboob/backends => modules}/mangahere/test.py (100%) rename {weboob/backends => modules}/mangareader/__init__.py (100%) rename {weboob/backends => modules}/mangareader/backend.py (100%) rename {weboob/backends => modules}/mangareader/test.py (100%) rename {weboob/backends => modules}/mangatoshokan/__init__.py (100%) rename {weboob/backends => modules}/mangatoshokan/backend.py (100%) rename {weboob/backends => modules}/mangatoshokan/test.py (100%) rename {weboob/backends => modules}/mediawiki/__init__.py (100%) rename {weboob/backends => modules}/mediawiki/backend.py (100%) rename {weboob/backends => modules}/mediawiki/browser.py (100%) rename icons/mediawiki.png => modules/mediawiki/favicon.png (100%) rename {weboob/backends => modules}/mediawiki/test.py (100%) rename {weboob/backends => modules}/meteofrance/__init__.py (100%) rename {weboob/backends => modules}/meteofrance/backend.py (100%) rename {weboob/backends => modules}/meteofrance/browser.py (100%) rename icons/meteofrance.png => modules/meteofrance/favicon.png (100%) rename {weboob/backends => modules}/meteofrance/pages/__init__.py (100%) rename {weboob/backends => modules}/meteofrance/pages/meteo.py (100%) rename {weboob/backends => modules}/meteofrance/test.py (100%) rename {weboob/backends => modules}/minutes20/__init__.py (100%) rename {weboob/backends => modules}/minutes20/backend.py (100%) rename {weboob/backends => modules}/minutes20/browser.py (100%) rename icons/minutes20.png => modules/minutes20/favicon.png (100%) rename {weboob/backends => modules}/minutes20/pages/__init__.py (100%) rename {weboob/backends => modules}/minutes20/pages/article.py (100%) rename {weboob/backends => modules}/minutes20/pages/simple.py (100%) rename {weboob/backends => modules}/minutes20/test.py (100%) rename {weboob/backends => modules}/minutes20/tools.py (100%) rename {weboob/backends => modules}/newsfeed/__init__.py (100%) rename {weboob/backends => modules}/newsfeed/backend.py (100%) rename icons/newsfeed.png => modules/newsfeed/favicon.png (100%) rename {weboob/backends => modules}/newsfeed/test.py (100%) rename {weboob/backends => modules}/nolifetv/__init__.py (100%) rename {weboob/backends => modules}/nolifetv/backend.py (100%) rename {weboob/backends => modules}/nolifetv/browser.py (100%) rename {weboob/backends => modules}/nolifetv/pages/__init__.py (100%) rename {weboob/backends => modules}/nolifetv/pages/index.py (100%) rename {weboob/backends => modules}/nolifetv/pages/video.py (100%) rename {weboob/backends => modules}/nolifetv/test.py (100%) rename {weboob/backends => modules}/nolifetv/video.py (100%) rename {weboob/backends => modules}/nova/__init__.py (100%) rename {weboob/backends => modules}/nova/backend.py (100%) rename icons/nova.png => modules/nova/favicon.png (100%) rename {weboob/backends => modules}/nova/test.py (100%) rename {weboob/backends => modules}/orange/__init__.py (100%) rename {weboob/backends => modules}/orange/backend.py (100%) rename {weboob/backends => modules}/orange/browser.py (100%) rename icons/orange.png => modules/orange/favicon.png (100%) rename {weboob/backends => modules}/orange/pages/__init__.py (100%) rename {weboob/backends => modules}/orange/pages/compose.py (100%) rename {weboob/backends => modules}/orange/pages/login.py (100%) rename {weboob/backends => modules}/ouifm/__init__.py (100%) rename {weboob/backends => modules}/ouifm/backend.py (100%) rename icons/ouifm.png => modules/ouifm/favicon.png (100%) rename {weboob/backends => modules}/ouifm/test.py (100%) rename {weboob/backends => modules}/pastealacon/__init__.py (100%) rename {weboob/backends => modules}/pastealacon/backend.py (100%) rename {weboob/backends => modules}/pastealacon/browser.py (100%) rename icons/pastealacon.png => modules/pastealacon/favicon.png (100%) rename {weboob/backends => modules}/pastealacon/pages.py (100%) rename {weboob/backends => modules}/pastealacon/paste.py (100%) rename {weboob/backends => modules}/pastealacon/test.py (100%) rename {weboob/backends => modules}/pastebin/__init__.py (100%) rename {weboob/backends => modules}/pastebin/backend.py (100%) rename {weboob/backends => modules}/pastebin/browser.py (100%) rename icons/pastebin.png => modules/pastebin/favicon.png (100%) rename {weboob/backends => modules}/pastebin/pages.py (100%) rename {weboob/backends => modules}/pastebin/paste.py (100%) rename {weboob/backends => modules}/pastebin/test.py (100%) rename {weboob/backends => modules}/phpbb/__init__.py (100%) rename {weboob/backends => modules}/phpbb/backend.py (100%) rename {weboob/backends => modules}/phpbb/browser.py (100%) rename icons/phpbb.png => modules/phpbb/favicon.png (100%) rename {weboob/backends => modules}/phpbb/pages/__init__.py (100%) rename {weboob/backends => modules}/phpbb/pages/forum.py (100%) rename {weboob/backends => modules}/phpbb/pages/index.py (100%) rename {weboob/backends => modules}/phpbb/test.py (100%) rename {weboob/backends => modules}/phpbb/tools.py (100%) rename {weboob/backends => modules}/piratebay/__init__.py (100%) rename {weboob/backends => modules}/piratebay/backend.py (100%) rename {weboob/backends => modules}/piratebay/browser.py (100%) rename icons/piratebay.png => modules/piratebay/favicon.png (100%) rename {weboob/backends => modules}/piratebay/pages/__init__.py (100%) rename {weboob/backends => modules}/piratebay/pages/index.py (100%) rename {weboob/backends => modules}/piratebay/pages/torrents.py (100%) rename {weboob/backends => modules}/piratebay/test.py (100%) rename {weboob/backends => modules}/redmine/__init__.py (100%) rename {weboob/backends => modules}/redmine/backend.py (100%) rename {weboob/backends => modules}/redmine/browser.py (100%) rename icons/redmine.png => modules/redmine/favicon.png (100%) rename {weboob/backends => modules}/redmine/pages/__init__.py (100%) rename {weboob/backends => modules}/redmine/pages/index.py (100%) rename {weboob/backends => modules}/redmine/pages/issues.py (100%) rename {weboob/backends => modules}/redmine/pages/wiki.py (100%) rename {weboob/backends => modules}/sfr/__init__.py (100%) rename {weboob/backends => modules}/sfr/backend.py (100%) rename {weboob/backends => modules}/sfr/browser.py (100%) rename icons/sfr.png => modules/sfr/favicon.png (100%) rename {weboob/backends => modules}/sfr/pages/__init__.py (100%) rename {weboob/backends => modules}/sfr/pages/compose.py (100%) rename {weboob/backends => modules}/sfr/pages/login.py (100%) rename {weboob/backends => modules}/sfr/test.py (100%) rename {weboob/backends => modules}/simplyreadit/__init__.py (100%) rename {weboob/backends => modules}/simplyreadit/backend.py (100%) rename {weboob/backends => modules}/simplyreadit/test.py (100%) rename {weboob/backends => modules}/societegenerale/__init__.py (100%) rename {weboob/backends => modules}/societegenerale/backend.py (100%) rename {weboob/backends => modules}/societegenerale/browser.py (98%) rename {weboob/backends => modules}/societegenerale/captcha.py (100%) rename icons/societegenerale.png => modules/societegenerale/favicon.png (100%) rename {weboob/backends => modules}/societegenerale/pages/__init__.py (100%) rename {weboob/backends => modules}/societegenerale/pages/accounts_list.py (100%) rename {weboob/backends => modules}/societegenerale/pages/login.py (97%) rename {weboob/backends => modules}/societegenerale/test.py (100%) rename {weboob/backends => modules}/transilien/__init__.py (100%) rename {weboob/backends => modules}/transilien/backend.py (100%) rename {weboob/backends => modules}/transilien/browser.py (100%) rename icons/transilien.png => modules/transilien/favicon.png (100%) rename {weboob/backends => modules}/transilien/pages/__init__.py (100%) rename {weboob/backends => modules}/transilien/pages/departures.py (100%) rename {weboob/backends => modules}/transilien/pages/roadmap.py (100%) rename {weboob/backends => modules}/transilien/pages/station.py (100%) rename {weboob/backends => modules}/transilien/stations.py (100%) rename {weboob/backends => modules}/transilien/test.py (100%) rename {weboob/backends => modules}/yahoo/__init__.py (100%) rename {weboob/backends => modules}/yahoo/backend.py (100%) rename icons/yahoo.png => modules/yahoo/favicon.png (100%) rename {weboob/backends => modules}/yahoo/test.py (100%) rename {weboob/backends => modules}/youjizz/__init__.py (100%) rename {weboob/backends => modules}/youjizz/backend.py (100%) rename {weboob/backends => modules}/youjizz/browser.py (100%) rename icons/youjizz.png => modules/youjizz/favicon.png (100%) rename {weboob/backends => modules}/youjizz/pages/__init__.py (100%) rename {weboob/backends => modules}/youjizz/pages/index.py (100%) rename {weboob/backends => modules}/youjizz/pages/video.py (100%) rename {weboob/backends => modules}/youjizz/test.py (100%) rename {weboob/backends => modules}/youjizz/video.py (100%) rename {weboob/backends => modules}/youporn/__init__.py (100%) rename {weboob/backends => modules}/youporn/backend.py (100%) rename {weboob/backends => modules}/youporn/browser.py (100%) rename icons/youporn.png => modules/youporn/favicon.png (100%) rename {weboob/backends => modules}/youporn/pages/__init__.py (100%) rename {weboob/backends => modules}/youporn/pages/base.py (100%) rename {weboob/backends => modules}/youporn/pages/index.py (100%) rename {weboob/backends => modules}/youporn/pages/video.py (100%) rename {weboob/backends => modules}/youporn/test.py (100%) rename {weboob/backends => modules}/youporn/video.py (100%) rename {weboob/backends => modules}/youtube/__init__.py (100%) rename {weboob/backends => modules}/youtube/backend.py (100%) rename {weboob/backends => modules}/youtube/browser.py (100%) rename icons/youtube.png => modules/youtube/favicon.png (100%) rename {weboob/backends => modules}/youtube/pages.py (100%) rename {weboob/backends => modules}/youtube/test.py (100%) rename {weboob/backends => modules}/youtube/video.py (100%) create mode 100755 scripts/weboob-repos create mode 100644 weboob/applications/weboobrepos/__init__.py create mode 100644 weboob/applications/weboobrepos/weboobrepos.py create mode 100644 weboob/core/repositories.py diff --git a/contrib/hds/export.py b/contrib/hds/export.py index a13d6d06b9..b2b7a11798 100755 --- a/contrib/hds/export.py +++ b/contrib/hds/export.py @@ -23,23 +23,35 @@ except ImportError, e: from pysqlite2 import dbapi2 as sqlite +from weboob.core import Weboob +from weboob.core.modules import ModuleLoadError import sys import logging level = logging.DEBUG logging.basicConfig(stream=sys.stdout, level=level) -from weboob.backends.hds.browser import HDSBrowser - def main(filename): + weboob = Weboob() + try: + hds = weboob.modules_loader.load_module('hds') + except ModuleLoadError, e: + print >>sys.stderr, 'Unable to load "hds" module: %s' % e + return 1 + try: db = sqlite.connect(database=filename, timeout=10.0) except sqlite.OperationalError, err: - print 'Unable to open %s database: %s' % (filename, err) + print >>sys.stderr, 'Unable to open %s database: %s' % (filename, err) return 1 sys.stdout.write('Reading database... ') sys.stdout.flush() - results = db.execute('SELECT id, author FROM stories') + try: + results = db.execute('SELECT id, author FROM stories') + except sqlite.OperationalError, err: + print >>sys.stderr, 'fail!\nUnable to read database: %s' % err + return 1 + stored = set() authors = set() for r in results: @@ -48,7 +60,7 @@ def main(filename): stored_authors = set([s[0] for s in db.execute('SELECT name FROM authors')]) sys.stdout.write('ok\n') - br = HDSBrowser() + br = hds.browser.HDSBrowser() to_fetch = set() sys.stdout.write('Getting stories list from website... ') sys.stdout.flush() diff --git a/weboob/backends/__init__.py b/modules/__init__.py similarity index 100% rename from weboob/backends/__init__.py rename to modules/__init__.py diff --git a/weboob/backends/arte/__init__.py b/modules/arte/__init__.py similarity index 100% rename from weboob/backends/arte/__init__.py rename to modules/arte/__init__.py diff --git a/weboob/backends/arte/backend.py b/modules/arte/backend.py similarity index 100% rename from weboob/backends/arte/backend.py rename to modules/arte/backend.py diff --git a/weboob/backends/arte/browser.py b/modules/arte/browser.py similarity index 100% rename from weboob/backends/arte/browser.py rename to modules/arte/browser.py diff --git a/icons/arte.png b/modules/arte/favicon.png similarity index 100% rename from icons/arte.png rename to modules/arte/favicon.png diff --git a/weboob/backends/arte/pages.py b/modules/arte/pages.py similarity index 100% rename from weboob/backends/arte/pages.py rename to modules/arte/pages.py diff --git a/weboob/backends/arte/test.py b/modules/arte/test.py similarity index 100% rename from weboob/backends/arte/test.py rename to modules/arte/test.py diff --git a/weboob/backends/arte/video.py b/modules/arte/video.py similarity index 100% rename from weboob/backends/arte/video.py rename to modules/arte/video.py diff --git a/weboob/backends/aum/API.txt b/modules/aum/API.txt similarity index 100% rename from weboob/backends/aum/API.txt rename to modules/aum/API.txt diff --git a/weboob/backends/aum/__init__.py b/modules/aum/__init__.py similarity index 100% rename from weboob/backends/aum/__init__.py rename to modules/aum/__init__.py diff --git a/weboob/backends/aum/antispam.py b/modules/aum/antispam.py similarity index 100% rename from weboob/backends/aum/antispam.py rename to modules/aum/antispam.py diff --git a/weboob/backends/aum/backend.py b/modules/aum/backend.py similarity index 100% rename from weboob/backends/aum/backend.py rename to modules/aum/backend.py diff --git a/weboob/backends/aum/browser.py b/modules/aum/browser.py similarity index 100% rename from weboob/backends/aum/browser.py rename to modules/aum/browser.py diff --git a/weboob/backends/aum/captcha.py b/modules/aum/captcha.py similarity index 99% rename from weboob/backends/aum/captcha.py rename to modules/aum/captcha.py index 3ec8d2210b..c980608859 100644 --- a/weboob/backends/aum/captcha.py +++ b/modules/aum/captcha.py @@ -157,7 +157,7 @@ def __init__(self): self.hash = {} def process(self): - from weboob.backends.aum.browser import AuMBrowser + from aum.browser import AuMBrowser browser = AuMBrowser('') browser.openurl('/register2.php') c = Captcha(browser.openurl('/captcha.php')) diff --git a/weboob/backends/aum/contact.py b/modules/aum/contact.py similarity index 100% rename from weboob/backends/aum/contact.py rename to modules/aum/contact.py diff --git a/icons/aum.png b/modules/aum/favicon.png similarity index 100% rename from icons/aum.png rename to modules/aum/favicon.png diff --git a/weboob/backends/aum/optim/__init__.py b/modules/aum/optim/__init__.py similarity index 100% rename from weboob/backends/aum/optim/__init__.py rename to modules/aum/optim/__init__.py diff --git a/weboob/backends/aum/optim/priority_connection.py b/modules/aum/optim/priority_connection.py similarity index 97% rename from weboob/backends/aum/optim/priority_connection.py rename to modules/aum/optim/priority_connection.py index 2bf13642af..d88844c78b 100644 --- a/weboob/backends/aum/optim/priority_connection.py +++ b/modules/aum/optim/priority_connection.py @@ -28,9 +28,9 @@ from weboob.tools.log import getLogger from weboob.tools.value import Value, ValuesDict, ValueInt -from weboob.backends.aum.captcha import CaptchaError -from weboob.backends.aum.exceptions import AdopteWait, AdopteBanned -from weboob.backends.aum.browser import AuMBrowser +from aum.captcha import CaptchaError +from aum.exceptions import AdopteWait, AdopteBanned +from aum.browser import AuMBrowser __all__ = ['PriorityConnection'] diff --git a/weboob/backends/aum/optim/profiles_walker.py b/modules/aum/optim/profiles_walker.py similarity index 100% rename from weboob/backends/aum/optim/profiles_walker.py rename to modules/aum/optim/profiles_walker.py diff --git a/weboob/backends/aum/optim/queries_queue.py b/modules/aum/optim/queries_queue.py similarity index 100% rename from weboob/backends/aum/optim/queries_queue.py rename to modules/aum/optim/queries_queue.py diff --git a/weboob/backends/aum/optim/visibility.py b/modules/aum/optim/visibility.py similarity index 100% rename from weboob/backends/aum/optim/visibility.py rename to modules/aum/optim/visibility.py diff --git a/weboob/backends/aum/test.py b/modules/aum/test.py similarity index 100% rename from weboob/backends/aum/test.py rename to modules/aum/test.py diff --git a/weboob/backends/batoto/__init__.py b/modules/batoto/__init__.py similarity index 100% rename from weboob/backends/batoto/__init__.py rename to modules/batoto/__init__.py diff --git a/weboob/backends/batoto/backend.py b/modules/batoto/backend.py similarity index 100% rename from weboob/backends/batoto/backend.py rename to modules/batoto/backend.py diff --git a/weboob/backends/batoto/test.py b/modules/batoto/test.py similarity index 100% rename from weboob/backends/batoto/test.py rename to modules/batoto/test.py diff --git a/weboob/backends/bnporc/__init__.py b/modules/bnporc/__init__.py similarity index 100% rename from weboob/backends/bnporc/__init__.py rename to modules/bnporc/__init__.py diff --git a/weboob/backends/bnporc/backend.py b/modules/bnporc/backend.py similarity index 100% rename from weboob/backends/bnporc/backend.py rename to modules/bnporc/backend.py diff --git a/weboob/backends/bnporc/browser.py b/modules/bnporc/browser.py similarity index 99% rename from weboob/backends/bnporc/browser.py rename to modules/bnporc/browser.py index 29b628b4e0..decd95b95b 100644 --- a/weboob/backends/bnporc/browser.py +++ b/modules/bnporc/browser.py @@ -23,7 +23,7 @@ from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword from weboob.capabilities.bank import TransferError, Transfer -from weboob.backends.bnporc import pages +from bnporc import pages from .errors import PasswordExpired diff --git a/weboob/backends/bnporc/errors.py b/modules/bnporc/errors.py similarity index 100% rename from weboob/backends/bnporc/errors.py rename to modules/bnporc/errors.py diff --git a/icons/bnporc.png b/modules/bnporc/favicon.png similarity index 100% rename from icons/bnporc.png rename to modules/bnporc/favicon.png diff --git a/weboob/backends/bnporc/pages/__init__.py b/modules/bnporc/pages/__init__.py similarity index 100% rename from weboob/backends/bnporc/pages/__init__.py rename to modules/bnporc/pages/__init__.py diff --git a/weboob/backends/bnporc/pages/account_coming.py b/modules/bnporc/pages/account_coming.py similarity index 100% rename from weboob/backends/bnporc/pages/account_coming.py rename to modules/bnporc/pages/account_coming.py diff --git a/weboob/backends/bnporc/pages/account_history.py b/modules/bnporc/pages/account_history.py similarity index 100% rename from weboob/backends/bnporc/pages/account_history.py rename to modules/bnporc/pages/account_history.py diff --git a/weboob/backends/bnporc/pages/accounts_list.py b/modules/bnporc/pages/accounts_list.py similarity index 100% rename from weboob/backends/bnporc/pages/accounts_list.py rename to modules/bnporc/pages/accounts_list.py diff --git a/weboob/backends/bnporc/pages/login.py b/modules/bnporc/pages/login.py similarity index 100% rename from weboob/backends/bnporc/pages/login.py rename to modules/bnporc/pages/login.py diff --git a/weboob/backends/bnporc/pages/transfer.py b/modules/bnporc/pages/transfer.py similarity index 100% rename from weboob/backends/bnporc/pages/transfer.py rename to modules/bnporc/pages/transfer.py diff --git a/weboob/backends/bnporc/test.py b/modules/bnporc/test.py similarity index 100% rename from weboob/backends/bnporc/test.py rename to modules/bnporc/test.py diff --git a/weboob/backends/boursorama/__init__.py b/modules/boursorama/__init__.py similarity index 100% rename from weboob/backends/boursorama/__init__.py rename to modules/boursorama/__init__.py diff --git a/weboob/backends/boursorama/backend.py b/modules/boursorama/backend.py similarity index 100% rename from weboob/backends/boursorama/backend.py rename to modules/boursorama/backend.py diff --git a/weboob/backends/boursorama/browser.py b/modules/boursorama/browser.py similarity index 98% rename from weboob/backends/boursorama/browser.py rename to modules/boursorama/browser.py index b2006704d4..6ad5b5d668 100644 --- a/weboob/backends/boursorama/browser.py +++ b/modules/boursorama/browser.py @@ -20,7 +20,7 @@ from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword -from weboob.backends.boursorama import pages +from boursorama import pages from datetime import date from dateutil.relativedelta import relativedelta diff --git a/weboob/backends/boursorama/pages/__init__.py b/modules/boursorama/pages/__init__.py similarity index 100% rename from weboob/backends/boursorama/pages/__init__.py rename to modules/boursorama/pages/__init__.py diff --git a/weboob/backends/boursorama/pages/account_history.py b/modules/boursorama/pages/account_history.py similarity index 100% rename from weboob/backends/boursorama/pages/account_history.py rename to modules/boursorama/pages/account_history.py diff --git a/weboob/backends/boursorama/pages/accounts_list.py b/modules/boursorama/pages/accounts_list.py similarity index 100% rename from weboob/backends/boursorama/pages/accounts_list.py rename to modules/boursorama/pages/accounts_list.py diff --git a/weboob/backends/boursorama/pages/login.py b/modules/boursorama/pages/login.py similarity index 100% rename from weboob/backends/boursorama/pages/login.py rename to modules/boursorama/pages/login.py diff --git a/weboob/backends/boursorama/test.py b/modules/boursorama/test.py similarity index 100% rename from weboob/backends/boursorama/test.py rename to modules/boursorama/test.py diff --git a/weboob/backends/bouygues/__init__.py b/modules/bouygues/__init__.py similarity index 100% rename from weboob/backends/bouygues/__init__.py rename to modules/bouygues/__init__.py diff --git a/weboob/backends/bouygues/backend.py b/modules/bouygues/backend.py similarity index 100% rename from weboob/backends/bouygues/backend.py rename to modules/bouygues/backend.py diff --git a/weboob/backends/bouygues/browser.py b/modules/bouygues/browser.py similarity index 100% rename from weboob/backends/bouygues/browser.py rename to modules/bouygues/browser.py diff --git a/icons/bouygues.png b/modules/bouygues/favicon.png similarity index 100% rename from icons/bouygues.png rename to modules/bouygues/favicon.png diff --git a/weboob/backends/bouygues/pages/__init__.py b/modules/bouygues/pages/__init__.py similarity index 100% rename from weboob/backends/bouygues/pages/__init__.py rename to modules/bouygues/pages/__init__.py diff --git a/weboob/backends/bouygues/pages/compose.py b/modules/bouygues/pages/compose.py similarity index 100% rename from weboob/backends/bouygues/pages/compose.py rename to modules/bouygues/pages/compose.py diff --git a/weboob/backends/bouygues/pages/login.py b/modules/bouygues/pages/login.py similarity index 100% rename from weboob/backends/bouygues/pages/login.py rename to modules/bouygues/pages/login.py diff --git a/weboob/backends/bouygues/test.py b/modules/bouygues/test.py similarity index 100% rename from weboob/backends/bouygues/test.py rename to modules/bouygues/test.py diff --git a/weboob/backends/bp/__init__.py b/modules/bp/__init__.py similarity index 100% rename from weboob/backends/bp/__init__.py rename to modules/bp/__init__.py diff --git a/weboob/backends/bp/backend.py b/modules/bp/backend.py similarity index 100% rename from weboob/backends/bp/backend.py rename to modules/bp/backend.py diff --git a/weboob/backends/bp/browser.py b/modules/bp/browser.py similarity index 100% rename from weboob/backends/bp/browser.py rename to modules/bp/browser.py diff --git a/icons/bp.png b/modules/bp/favicon.png similarity index 100% rename from icons/bp.png rename to modules/bp/favicon.png diff --git a/weboob/backends/bp/pages/__init__.py b/modules/bp/pages/__init__.py similarity index 100% rename from weboob/backends/bp/pages/__init__.py rename to modules/bp/pages/__init__.py diff --git a/weboob/backends/bp/pages/accounthistory.py b/modules/bp/pages/accounthistory.py similarity index 100% rename from weboob/backends/bp/pages/accounthistory.py rename to modules/bp/pages/accounthistory.py diff --git a/weboob/backends/bp/pages/accountlist.py b/modules/bp/pages/accountlist.py similarity index 100% rename from weboob/backends/bp/pages/accountlist.py rename to modules/bp/pages/accountlist.py diff --git a/weboob/backends/bp/pages/login.py b/modules/bp/pages/login.py similarity index 100% rename from weboob/backends/bp/pages/login.py rename to modules/bp/pages/login.py diff --git a/weboob/backends/bp/pages/transfer.py b/modules/bp/pages/transfer.py similarity index 100% rename from weboob/backends/bp/pages/transfer.py rename to modules/bp/pages/transfer.py diff --git a/weboob/backends/canalplus/__init__.py b/modules/canalplus/__init__.py similarity index 100% rename from weboob/backends/canalplus/__init__.py rename to modules/canalplus/__init__.py diff --git a/weboob/backends/canalplus/backend.py b/modules/canalplus/backend.py similarity index 100% rename from weboob/backends/canalplus/backend.py rename to modules/canalplus/backend.py diff --git a/weboob/backends/canalplus/browser.py b/modules/canalplus/browser.py similarity index 100% rename from weboob/backends/canalplus/browser.py rename to modules/canalplus/browser.py diff --git a/icons/canalplus.png b/modules/canalplus/favicon.png similarity index 100% rename from icons/canalplus.png rename to modules/canalplus/favicon.png diff --git a/weboob/backends/canalplus/pages/__init__.py b/modules/canalplus/pages/__init__.py similarity index 100% rename from weboob/backends/canalplus/pages/__init__.py rename to modules/canalplus/pages/__init__.py diff --git a/weboob/backends/canalplus/pages/initpage.py b/modules/canalplus/pages/initpage.py similarity index 100% rename from weboob/backends/canalplus/pages/initpage.py rename to modules/canalplus/pages/initpage.py diff --git a/weboob/backends/canalplus/pages/video.py b/modules/canalplus/pages/video.py similarity index 100% rename from weboob/backends/canalplus/pages/video.py rename to modules/canalplus/pages/video.py diff --git a/weboob/backends/canalplus/pages/videopage.py b/modules/canalplus/pages/videopage.py similarity index 100% rename from weboob/backends/canalplus/pages/videopage.py rename to modules/canalplus/pages/videopage.py diff --git a/weboob/backends/canalplus/test.py b/modules/canalplus/test.py similarity index 100% rename from weboob/backends/canalplus/test.py rename to modules/canalplus/test.py diff --git a/weboob/backends/canaltp/__init__.py b/modules/canaltp/__init__.py similarity index 100% rename from weboob/backends/canaltp/__init__.py rename to modules/canaltp/__init__.py diff --git a/weboob/backends/canaltp/backend.py b/modules/canaltp/backend.py similarity index 100% rename from weboob/backends/canaltp/backend.py rename to modules/canaltp/backend.py diff --git a/weboob/backends/canaltp/browser.py b/modules/canaltp/browser.py similarity index 100% rename from weboob/backends/canaltp/browser.py rename to modules/canaltp/browser.py diff --git a/icons/canaltp.png b/modules/canaltp/favicon.png similarity index 100% rename from icons/canaltp.png rename to modules/canaltp/favicon.png diff --git a/weboob/backends/canaltp/test.py b/modules/canaltp/test.py similarity index 100% rename from weboob/backends/canaltp/test.py rename to modules/canaltp/test.py diff --git a/weboob/backends/cmb/__init__.py b/modules/cmb/__init__.py similarity index 100% rename from weboob/backends/cmb/__init__.py rename to modules/cmb/__init__.py diff --git a/weboob/backends/cmb/backend.py b/modules/cmb/backend.py similarity index 100% rename from weboob/backends/cmb/backend.py rename to modules/cmb/backend.py diff --git a/weboob/backends/cragr/__init__.py b/modules/cragr/__init__.py similarity index 100% rename from weboob/backends/cragr/__init__.py rename to modules/cragr/__init__.py diff --git a/weboob/backends/cragr/backend.py b/modules/cragr/backend.py similarity index 100% rename from weboob/backends/cragr/backend.py rename to modules/cragr/backend.py diff --git a/weboob/backends/cragr/browser.py b/modules/cragr/browser.py similarity index 99% rename from weboob/backends/cragr/browser.py rename to modules/cragr/browser.py index e1a2c35bfa..6b55b35c02 100644 --- a/weboob/backends/cragr/browser.py +++ b/modules/cragr/browser.py @@ -20,7 +20,7 @@ from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword from weboob.capabilities.bank import Transfer, TransferError -from weboob.backends.cragr import pages +from cragr import pages import mechanize from datetime import datetime import re diff --git a/icons/cragr.png b/modules/cragr/favicon.png similarity index 100% rename from icons/cragr.png rename to modules/cragr/favicon.png diff --git a/weboob/backends/cragr/pages/__init__.py b/modules/cragr/pages/__init__.py similarity index 100% rename from weboob/backends/cragr/pages/__init__.py rename to modules/cragr/pages/__init__.py diff --git a/weboob/backends/cragr/pages/accounts_list.py b/modules/cragr/pages/accounts_list.py similarity index 100% rename from weboob/backends/cragr/pages/accounts_list.py rename to modules/cragr/pages/accounts_list.py diff --git a/weboob/backends/cragr/pages/base.py b/modules/cragr/pages/base.py similarity index 100% rename from weboob/backends/cragr/pages/base.py rename to modules/cragr/pages/base.py diff --git a/weboob/backends/cragr/pages/login.py b/modules/cragr/pages/login.py similarity index 100% rename from weboob/backends/cragr/pages/login.py rename to modules/cragr/pages/login.py diff --git a/weboob/backends/cragr/test.py b/modules/cragr/test.py similarity index 100% rename from weboob/backends/cragr/test.py rename to modules/cragr/test.py diff --git a/weboob/backends/creditmutuel/__init__.py b/modules/creditmutuel/__init__.py similarity index 100% rename from weboob/backends/creditmutuel/__init__.py rename to modules/creditmutuel/__init__.py diff --git a/weboob/backends/creditmutuel/backend.py b/modules/creditmutuel/backend.py similarity index 100% rename from weboob/backends/creditmutuel/backend.py rename to modules/creditmutuel/backend.py diff --git a/weboob/backends/creditmutuel/browser.py b/modules/creditmutuel/browser.py similarity index 100% rename from weboob/backends/creditmutuel/browser.py rename to modules/creditmutuel/browser.py diff --git a/icons/creditmutuel.png b/modules/creditmutuel/favicon.png similarity index 100% rename from icons/creditmutuel.png rename to modules/creditmutuel/favicon.png diff --git a/weboob/backends/creditmutuel/pages.py b/modules/creditmutuel/pages.py similarity index 100% rename from weboob/backends/creditmutuel/pages.py rename to modules/creditmutuel/pages.py diff --git a/weboob/backends/creditmutuel/test.py b/modules/creditmutuel/test.py similarity index 100% rename from weboob/backends/creditmutuel/test.py rename to modules/creditmutuel/test.py diff --git a/weboob/backends/dailymotion/__init__.py b/modules/dailymotion/__init__.py similarity index 100% rename from weboob/backends/dailymotion/__init__.py rename to modules/dailymotion/__init__.py diff --git a/weboob/backends/dailymotion/backend.py b/modules/dailymotion/backend.py similarity index 100% rename from weboob/backends/dailymotion/backend.py rename to modules/dailymotion/backend.py diff --git a/weboob/backends/dailymotion/browser.py b/modules/dailymotion/browser.py similarity index 100% rename from weboob/backends/dailymotion/browser.py rename to modules/dailymotion/browser.py diff --git a/icons/dailymotion.png b/modules/dailymotion/favicon.png similarity index 100% rename from icons/dailymotion.png rename to modules/dailymotion/favicon.png diff --git a/weboob/backends/dailymotion/pages.py b/modules/dailymotion/pages.py similarity index 100% rename from weboob/backends/dailymotion/pages.py rename to modules/dailymotion/pages.py diff --git a/weboob/backends/dailymotion/test.py b/modules/dailymotion/test.py similarity index 100% rename from weboob/backends/dailymotion/test.py rename to modules/dailymotion/test.py diff --git a/weboob/backends/dailymotion/video.py b/modules/dailymotion/video.py similarity index 100% rename from weboob/backends/dailymotion/video.py rename to modules/dailymotion/video.py diff --git a/weboob/backends/dlfp/__init__.py b/modules/dlfp/__init__.py similarity index 100% rename from weboob/backends/dlfp/__init__.py rename to modules/dlfp/__init__.py diff --git a/weboob/backends/dlfp/backend.py b/modules/dlfp/backend.py similarity index 100% rename from weboob/backends/dlfp/backend.py rename to modules/dlfp/backend.py diff --git a/weboob/backends/dlfp/browser.py b/modules/dlfp/browser.py similarity index 100% rename from weboob/backends/dlfp/browser.py rename to modules/dlfp/browser.py diff --git a/icons/dlfp.png b/modules/dlfp/favicon.png similarity index 100% rename from icons/dlfp.png rename to modules/dlfp/favicon.png diff --git a/weboob/backends/dlfp/pages/__init__.py b/modules/dlfp/pages/__init__.py similarity index 100% rename from weboob/backends/dlfp/pages/__init__.py rename to modules/dlfp/pages/__init__.py diff --git a/weboob/backends/dlfp/pages/board.py b/modules/dlfp/pages/board.py similarity index 100% rename from weboob/backends/dlfp/pages/board.py rename to modules/dlfp/pages/board.py diff --git a/weboob/backends/dlfp/pages/index.py b/modules/dlfp/pages/index.py similarity index 100% rename from weboob/backends/dlfp/pages/index.py rename to modules/dlfp/pages/index.py diff --git a/weboob/backends/dlfp/pages/news.py b/modules/dlfp/pages/news.py similarity index 99% rename from weboob/backends/dlfp/pages/news.py rename to modules/dlfp/pages/news.py index 864cf56a6c..57d4c126a1 100644 --- a/weboob/backends/dlfp/pages/news.py +++ b/modules/dlfp/pages/news.py @@ -22,7 +22,7 @@ from weboob.tools.browser import BrokenPageError from weboob.tools.misc import local2utc -from weboob.backends.dlfp.tools import url2id +from dlfp.tools import url2id from .index import DLFPPage diff --git a/weboob/backends/dlfp/pages/wiki.py b/modules/dlfp/pages/wiki.py similarity index 100% rename from weboob/backends/dlfp/pages/wiki.py rename to modules/dlfp/pages/wiki.py diff --git a/weboob/backends/dlfp/test.py b/modules/dlfp/test.py similarity index 97% rename from weboob/backends/dlfp/test.py rename to modules/dlfp/test.py index bf4bc6b930..d3f4bdfe9b 100644 --- a/weboob/backends/dlfp/test.py +++ b/modules/dlfp/test.py @@ -21,7 +21,7 @@ from datetime import datetime from weboob.tools.test import BackendTest -from weboob.backends.dlfp.browser import DLFP +from dlfp.browser import DLFP __all__ = ['DLFPTest'] diff --git a/weboob/backends/dlfp/tools.py b/modules/dlfp/tools.py similarity index 100% rename from weboob/backends/dlfp/tools.py rename to modules/dlfp/tools.py diff --git a/weboob/backends/eatmanga/__init__.py b/modules/eatmanga/__init__.py similarity index 100% rename from weboob/backends/eatmanga/__init__.py rename to modules/eatmanga/__init__.py diff --git a/weboob/backends/eatmanga/backend.py b/modules/eatmanga/backend.py similarity index 100% rename from weboob/backends/eatmanga/backend.py rename to modules/eatmanga/backend.py diff --git a/weboob/backends/eatmanga/test.py b/modules/eatmanga/test.py similarity index 100% rename from weboob/backends/eatmanga/test.py rename to modules/eatmanga/test.py diff --git a/weboob/backends/ecrans/__init__.py b/modules/ecrans/__init__.py similarity index 100% rename from weboob/backends/ecrans/__init__.py rename to modules/ecrans/__init__.py diff --git a/weboob/backends/ecrans/backend.py b/modules/ecrans/backend.py similarity index 100% rename from weboob/backends/ecrans/backend.py rename to modules/ecrans/backend.py diff --git a/weboob/backends/ecrans/browser.py b/modules/ecrans/browser.py similarity index 100% rename from weboob/backends/ecrans/browser.py rename to modules/ecrans/browser.py diff --git a/icons/ecrans.png b/modules/ecrans/favicon.png similarity index 100% rename from icons/ecrans.png rename to modules/ecrans/favicon.png diff --git a/weboob/backends/ecrans/pages/__init__.py b/modules/ecrans/pages/__init__.py similarity index 100% rename from weboob/backends/ecrans/pages/__init__.py rename to modules/ecrans/pages/__init__.py diff --git a/weboob/backends/ecrans/pages/article.py b/modules/ecrans/pages/article.py similarity index 100% rename from weboob/backends/ecrans/pages/article.py rename to modules/ecrans/pages/article.py diff --git a/weboob/backends/ecrans/test.py b/modules/ecrans/test.py similarity index 100% rename from weboob/backends/ecrans/test.py rename to modules/ecrans/test.py diff --git a/weboob/backends/ecrans/tools.py b/modules/ecrans/tools.py similarity index 100% rename from weboob/backends/ecrans/tools.py rename to modules/ecrans/tools.py diff --git a/weboob/backends/ehentai/__init__.py b/modules/ehentai/__init__.py similarity index 100% rename from weboob/backends/ehentai/__init__.py rename to modules/ehentai/__init__.py diff --git a/weboob/backends/ehentai/backend.py b/modules/ehentai/backend.py similarity index 100% rename from weboob/backends/ehentai/backend.py rename to modules/ehentai/backend.py diff --git a/weboob/backends/ehentai/browser.py b/modules/ehentai/browser.py similarity index 100% rename from weboob/backends/ehentai/browser.py rename to modules/ehentai/browser.py diff --git a/icons/ehentai.png b/modules/ehentai/favicon.png similarity index 100% rename from icons/ehentai.png rename to modules/ehentai/favicon.png diff --git a/weboob/backends/ehentai/gallery.py b/modules/ehentai/gallery.py similarity index 100% rename from weboob/backends/ehentai/gallery.py rename to modules/ehentai/gallery.py diff --git a/weboob/backends/ehentai/pages.py b/modules/ehentai/pages.py similarity index 100% rename from weboob/backends/ehentai/pages.py rename to modules/ehentai/pages.py diff --git a/weboob/backends/ehentai/test.py b/modules/ehentai/test.py similarity index 100% rename from weboob/backends/ehentai/test.py rename to modules/ehentai/test.py diff --git a/weboob/backends/fourchan/__init__.py b/modules/fourchan/__init__.py similarity index 100% rename from weboob/backends/fourchan/__init__.py rename to modules/fourchan/__init__.py diff --git a/weboob/backends/fourchan/backend.py b/modules/fourchan/backend.py similarity index 100% rename from weboob/backends/fourchan/backend.py rename to modules/fourchan/backend.py diff --git a/weboob/backends/fourchan/browser.py b/modules/fourchan/browser.py similarity index 100% rename from weboob/backends/fourchan/browser.py rename to modules/fourchan/browser.py diff --git a/icons/fourchan.png b/modules/fourchan/favicon.png similarity index 100% rename from icons/fourchan.png rename to modules/fourchan/favicon.png diff --git a/weboob/backends/fourchan/pages/__init__.py b/modules/fourchan/pages/__init__.py similarity index 100% rename from weboob/backends/fourchan/pages/__init__.py rename to modules/fourchan/pages/__init__.py diff --git a/weboob/backends/fourchan/pages/board.py b/modules/fourchan/pages/board.py similarity index 100% rename from weboob/backends/fourchan/pages/board.py rename to modules/fourchan/pages/board.py diff --git a/weboob/backends/fourchan/test.py b/modules/fourchan/test.py similarity index 100% rename from weboob/backends/fourchan/test.py rename to modules/fourchan/test.py diff --git a/weboob/backends/franceinter/__init__.py b/modules/franceinter/__init__.py similarity index 100% rename from weboob/backends/franceinter/__init__.py rename to modules/franceinter/__init__.py diff --git a/weboob/backends/franceinter/backend.py b/modules/franceinter/backend.py similarity index 100% rename from weboob/backends/franceinter/backend.py rename to modules/franceinter/backend.py diff --git a/icons/franceinter.png b/modules/franceinter/favicon.png similarity index 100% rename from icons/franceinter.png rename to modules/franceinter/favicon.png diff --git a/weboob/backends/franceinter/test.py b/modules/franceinter/test.py similarity index 100% rename from weboob/backends/franceinter/test.py rename to modules/franceinter/test.py diff --git a/weboob/backends/francetelevisions/__init__.py b/modules/francetelevisions/__init__.py similarity index 100% rename from weboob/backends/francetelevisions/__init__.py rename to modules/francetelevisions/__init__.py diff --git a/weboob/backends/francetelevisions/backend.py b/modules/francetelevisions/backend.py similarity index 100% rename from weboob/backends/francetelevisions/backend.py rename to modules/francetelevisions/backend.py diff --git a/weboob/backends/francetelevisions/browser.py b/modules/francetelevisions/browser.py similarity index 100% rename from weboob/backends/francetelevisions/browser.py rename to modules/francetelevisions/browser.py diff --git a/icons/francetelevisions.png b/modules/francetelevisions/favicon.png similarity index 100% rename from icons/francetelevisions.png rename to modules/francetelevisions/favicon.png diff --git a/weboob/backends/francetelevisions/pages.py b/modules/francetelevisions/pages.py similarity index 100% rename from weboob/backends/francetelevisions/pages.py rename to modules/francetelevisions/pages.py diff --git a/weboob/backends/francetelevisions/test.py b/modules/francetelevisions/test.py similarity index 100% rename from weboob/backends/francetelevisions/test.py rename to modules/francetelevisions/test.py diff --git a/weboob/backends/francetelevisions/video.py b/modules/francetelevisions/video.py similarity index 100% rename from weboob/backends/francetelevisions/video.py rename to modules/francetelevisions/video.py diff --git a/weboob/backends/gazelle/__init__.py b/modules/gazelle/__init__.py similarity index 100% rename from weboob/backends/gazelle/__init__.py rename to modules/gazelle/__init__.py diff --git a/weboob/backends/gazelle/backend.py b/modules/gazelle/backend.py similarity index 100% rename from weboob/backends/gazelle/backend.py rename to modules/gazelle/backend.py diff --git a/weboob/backends/gazelle/browser.py b/modules/gazelle/browser.py similarity index 100% rename from weboob/backends/gazelle/browser.py rename to modules/gazelle/browser.py diff --git a/icons/gazelle.png b/modules/gazelle/favicon.png similarity index 100% rename from icons/gazelle.png rename to modules/gazelle/favicon.png diff --git a/weboob/backends/gazelle/pages/__init__.py b/modules/gazelle/pages/__init__.py similarity index 100% rename from weboob/backends/gazelle/pages/__init__.py rename to modules/gazelle/pages/__init__.py diff --git a/weboob/backends/gazelle/pages/base.py b/modules/gazelle/pages/base.py similarity index 100% rename from weboob/backends/gazelle/pages/base.py rename to modules/gazelle/pages/base.py diff --git a/weboob/backends/gazelle/pages/index.py b/modules/gazelle/pages/index.py similarity index 100% rename from weboob/backends/gazelle/pages/index.py rename to modules/gazelle/pages/index.py diff --git a/weboob/backends/gazelle/pages/torrents.py b/modules/gazelle/pages/torrents.py similarity index 100% rename from weboob/backends/gazelle/pages/torrents.py rename to modules/gazelle/pages/torrents.py diff --git a/weboob/backends/gazelle/test.py b/modules/gazelle/test.py similarity index 100% rename from weboob/backends/gazelle/test.py rename to modules/gazelle/test.py diff --git a/weboob/backends/geolocip/__init__.py b/modules/geolocip/__init__.py similarity index 100% rename from weboob/backends/geolocip/__init__.py rename to modules/geolocip/__init__.py diff --git a/weboob/backends/geolocip/backend.py b/modules/geolocip/backend.py similarity index 100% rename from weboob/backends/geolocip/backend.py rename to modules/geolocip/backend.py diff --git a/icons/geolocip.png b/modules/geolocip/favicon.png similarity index 100% rename from icons/geolocip.png rename to modules/geolocip/favicon.png diff --git a/weboob/backends/geolocip/test.py b/modules/geolocip/test.py similarity index 100% rename from weboob/backends/geolocip/test.py rename to modules/geolocip/test.py diff --git a/weboob/backends/hds/__init__.py b/modules/hds/__init__.py similarity index 100% rename from weboob/backends/hds/__init__.py rename to modules/hds/__init__.py diff --git a/weboob/backends/hds/backend.py b/modules/hds/backend.py similarity index 100% rename from weboob/backends/hds/backend.py rename to modules/hds/backend.py diff --git a/weboob/backends/hds/browser.py b/modules/hds/browser.py similarity index 100% rename from weboob/backends/hds/browser.py rename to modules/hds/browser.py diff --git a/icons/hds.png b/modules/hds/favicon.png similarity index 100% rename from icons/hds.png rename to modules/hds/favicon.png diff --git a/weboob/backends/hds/pages.py b/modules/hds/pages.py similarity index 100% rename from weboob/backends/hds/pages.py rename to modules/hds/pages.py diff --git a/weboob/backends/hds/test.py b/modules/hds/test.py similarity index 100% rename from weboob/backends/hds/test.py rename to modules/hds/test.py diff --git a/weboob/backends/ina/__init__.py b/modules/ina/__init__.py similarity index 100% rename from weboob/backends/ina/__init__.py rename to modules/ina/__init__.py diff --git a/weboob/backends/ina/backend.py b/modules/ina/backend.py similarity index 100% rename from weboob/backends/ina/backend.py rename to modules/ina/backend.py diff --git a/weboob/backends/ina/browser.py b/modules/ina/browser.py similarity index 100% rename from weboob/backends/ina/browser.py rename to modules/ina/browser.py diff --git a/icons/ina.png b/modules/ina/favicon.png similarity index 100% rename from icons/ina.png rename to modules/ina/favicon.png diff --git a/weboob/backends/ina/pages/__init__.py b/modules/ina/pages/__init__.py similarity index 100% rename from weboob/backends/ina/pages/__init__.py rename to modules/ina/pages/__init__.py diff --git a/weboob/backends/ina/pages/search.py b/modules/ina/pages/search.py similarity index 100% rename from weboob/backends/ina/pages/search.py rename to modules/ina/pages/search.py diff --git a/weboob/backends/ina/pages/video.py b/modules/ina/pages/video.py similarity index 100% rename from weboob/backends/ina/pages/video.py rename to modules/ina/pages/video.py diff --git a/weboob/backends/ina/test.py b/modules/ina/test.py similarity index 100% rename from weboob/backends/ina/test.py rename to modules/ina/test.py diff --git a/weboob/backends/ina/video.py b/modules/ina/video.py similarity index 100% rename from weboob/backends/ina/video.py rename to modules/ina/video.py diff --git a/weboob/backends/ing/__init__.py b/modules/ing/__init__.py similarity index 100% rename from weboob/backends/ing/__init__.py rename to modules/ing/__init__.py diff --git a/weboob/backends/ing/backend.py b/modules/ing/backend.py similarity index 100% rename from weboob/backends/ing/backend.py rename to modules/ing/backend.py diff --git a/weboob/backends/ing/browser.py b/modules/ing/browser.py similarity index 98% rename from weboob/backends/ing/browser.py rename to modules/ing/browser.py index 95dfbcce95..62dd1b7dba 100644 --- a/weboob/backends/ing/browser.py +++ b/modules/ing/browser.py @@ -19,7 +19,7 @@ from weboob.tools.browser import BaseBrowser -from weboob.backends.ing import pages +from ing import pages __all__ = ['Ing'] diff --git a/weboob/backends/ing/pages/__init__.py b/modules/ing/pages/__init__.py similarity index 100% rename from weboob/backends/ing/pages/__init__.py rename to modules/ing/pages/__init__.py diff --git a/weboob/backends/ing/pages/account_history.py b/modules/ing/pages/account_history.py similarity index 100% rename from weboob/backends/ing/pages/account_history.py rename to modules/ing/pages/account_history.py diff --git a/weboob/backends/ing/pages/accounts_list.py b/modules/ing/pages/accounts_list.py similarity index 100% rename from weboob/backends/ing/pages/accounts_list.py rename to modules/ing/pages/accounts_list.py diff --git a/weboob/backends/ing/pages/login.py b/modules/ing/pages/login.py similarity index 100% rename from weboob/backends/ing/pages/login.py rename to modules/ing/pages/login.py diff --git a/weboob/backends/ing/test.py b/modules/ing/test.py similarity index 100% rename from weboob/backends/ing/test.py rename to modules/ing/test.py diff --git a/weboob/backends/inrocks/__init__.py b/modules/inrocks/__init__.py similarity index 100% rename from weboob/backends/inrocks/__init__.py rename to modules/inrocks/__init__.py diff --git a/weboob/backends/inrocks/backend.py b/modules/inrocks/backend.py similarity index 100% rename from weboob/backends/inrocks/backend.py rename to modules/inrocks/backend.py diff --git a/weboob/backends/inrocks/browser.py b/modules/inrocks/browser.py similarity index 100% rename from weboob/backends/inrocks/browser.py rename to modules/inrocks/browser.py diff --git a/icons/inrocks.png b/modules/inrocks/favicon.png similarity index 100% rename from icons/inrocks.png rename to modules/inrocks/favicon.png diff --git a/weboob/backends/inrocks/pages/__init__.py b/modules/inrocks/pages/__init__.py similarity index 100% rename from weboob/backends/inrocks/pages/__init__.py rename to modules/inrocks/pages/__init__.py diff --git a/weboob/backends/inrocks/pages/article.py b/modules/inrocks/pages/article.py similarity index 100% rename from weboob/backends/inrocks/pages/article.py rename to modules/inrocks/pages/article.py diff --git a/weboob/backends/inrocks/pages/inrockstv.py b/modules/inrocks/pages/inrockstv.py similarity index 100% rename from weboob/backends/inrocks/pages/inrockstv.py rename to modules/inrocks/pages/inrockstv.py diff --git a/weboob/backends/inrocks/test.py b/modules/inrocks/test.py similarity index 100% rename from weboob/backends/inrocks/test.py rename to modules/inrocks/test.py diff --git a/weboob/backends/inrocks/tools.py b/modules/inrocks/tools.py similarity index 100% rename from weboob/backends/inrocks/tools.py rename to modules/inrocks/tools.py diff --git a/weboob/backends/ipinfodb/__init__.py b/modules/ipinfodb/__init__.py similarity index 100% rename from weboob/backends/ipinfodb/__init__.py rename to modules/ipinfodb/__init__.py diff --git a/weboob/backends/ipinfodb/backend.py b/modules/ipinfodb/backend.py similarity index 100% rename from weboob/backends/ipinfodb/backend.py rename to modules/ipinfodb/backend.py diff --git a/icons/ipinfodb.png b/modules/ipinfodb/favicon.png similarity index 100% rename from icons/ipinfodb.png rename to modules/ipinfodb/favicon.png diff --git a/weboob/backends/ipinfodb/test.py b/modules/ipinfodb/test.py similarity index 100% rename from weboob/backends/ipinfodb/test.py rename to modules/ipinfodb/test.py diff --git a/weboob/backends/isohunt/__init__.py b/modules/isohunt/__init__.py similarity index 100% rename from weboob/backends/isohunt/__init__.py rename to modules/isohunt/__init__.py diff --git a/weboob/backends/isohunt/backend.py b/modules/isohunt/backend.py similarity index 100% rename from weboob/backends/isohunt/backend.py rename to modules/isohunt/backend.py diff --git a/weboob/backends/isohunt/browser.py b/modules/isohunt/browser.py similarity index 100% rename from weboob/backends/isohunt/browser.py rename to modules/isohunt/browser.py diff --git a/icons/isohunt.png b/modules/isohunt/favicon.png similarity index 100% rename from icons/isohunt.png rename to modules/isohunt/favicon.png diff --git a/weboob/backends/isohunt/pages/__init__.py b/modules/isohunt/pages/__init__.py similarity index 100% rename from weboob/backends/isohunt/pages/__init__.py rename to modules/isohunt/pages/__init__.py diff --git a/weboob/backends/isohunt/pages/torrents.py b/modules/isohunt/pages/torrents.py similarity index 100% rename from weboob/backends/isohunt/pages/torrents.py rename to modules/isohunt/pages/torrents.py diff --git a/weboob/backends/isohunt/test.py b/modules/isohunt/test.py similarity index 100% rename from weboob/backends/isohunt/test.py rename to modules/isohunt/test.py diff --git a/weboob/backends/izneo/__init__.py b/modules/izneo/__init__.py similarity index 100% rename from weboob/backends/izneo/__init__.py rename to modules/izneo/__init__.py diff --git a/weboob/backends/izneo/backend.py b/modules/izneo/backend.py similarity index 100% rename from weboob/backends/izneo/backend.py rename to modules/izneo/backend.py diff --git a/icons/izneo.png b/modules/izneo/favicon.png similarity index 100% rename from icons/izneo.png rename to modules/izneo/favicon.png diff --git a/weboob/backends/kickass/__init__.py b/modules/kickass/__init__.py similarity index 100% rename from weboob/backends/kickass/__init__.py rename to modules/kickass/__init__.py diff --git a/weboob/backends/kickass/backend.py b/modules/kickass/backend.py similarity index 100% rename from weboob/backends/kickass/backend.py rename to modules/kickass/backend.py diff --git a/weboob/backends/kickass/browser.py b/modules/kickass/browser.py similarity index 100% rename from weboob/backends/kickass/browser.py rename to modules/kickass/browser.py diff --git a/icons/kickass.png b/modules/kickass/favicon.png similarity index 100% rename from icons/kickass.png rename to modules/kickass/favicon.png diff --git a/weboob/backends/kickass/pages/__init__.py b/modules/kickass/pages/__init__.py similarity index 100% rename from weboob/backends/kickass/pages/__init__.py rename to modules/kickass/pages/__init__.py diff --git a/weboob/backends/kickass/pages/torrents.py b/modules/kickass/pages/torrents.py similarity index 100% rename from weboob/backends/kickass/pages/torrents.py rename to modules/kickass/pages/torrents.py diff --git a/weboob/backends/kickass/test.py b/modules/kickass/test.py similarity index 100% rename from weboob/backends/kickass/test.py rename to modules/kickass/test.py diff --git a/weboob/backends/lcl/__init__.py b/modules/lcl/__init__.py similarity index 100% rename from weboob/backends/lcl/__init__.py rename to modules/lcl/__init__.py diff --git a/weboob/backends/lcl/backend.py b/modules/lcl/backend.py similarity index 100% rename from weboob/backends/lcl/backend.py rename to modules/lcl/backend.py diff --git a/weboob/backends/lcl/browser.py b/modules/lcl/browser.py similarity index 100% rename from weboob/backends/lcl/browser.py rename to modules/lcl/browser.py diff --git a/icons/lcl.png b/modules/lcl/favicon.png similarity index 100% rename from icons/lcl.png rename to modules/lcl/favicon.png diff --git a/weboob/backends/lcl/pages.py b/modules/lcl/pages.py similarity index 100% rename from weboob/backends/lcl/pages.py rename to modules/lcl/pages.py diff --git a/weboob/backends/lcl/test.py b/modules/lcl/test.py similarity index 100% rename from weboob/backends/lcl/test.py rename to modules/lcl/test.py diff --git a/weboob/backends/lefigaro/__init__.py b/modules/lefigaro/__init__.py similarity index 100% rename from weboob/backends/lefigaro/__init__.py rename to modules/lefigaro/__init__.py diff --git a/weboob/backends/lefigaro/backend.py b/modules/lefigaro/backend.py similarity index 100% rename from weboob/backends/lefigaro/backend.py rename to modules/lefigaro/backend.py diff --git a/weboob/backends/lefigaro/browser.py b/modules/lefigaro/browser.py similarity index 100% rename from weboob/backends/lefigaro/browser.py rename to modules/lefigaro/browser.py diff --git a/icons/lefigaro.png b/modules/lefigaro/favicon.png similarity index 100% rename from icons/lefigaro.png rename to modules/lefigaro/favicon.png diff --git a/weboob/backends/lefigaro/pages/__init__.py b/modules/lefigaro/pages/__init__.py similarity index 100% rename from weboob/backends/lefigaro/pages/__init__.py rename to modules/lefigaro/pages/__init__.py diff --git a/weboob/backends/lefigaro/pages/article.py b/modules/lefigaro/pages/article.py similarity index 100% rename from weboob/backends/lefigaro/pages/article.py rename to modules/lefigaro/pages/article.py diff --git a/weboob/backends/lefigaro/pages/flashactu.py b/modules/lefigaro/pages/flashactu.py similarity index 100% rename from weboob/backends/lefigaro/pages/flashactu.py rename to modules/lefigaro/pages/flashactu.py diff --git a/weboob/backends/lefigaro/pages/simple.py b/modules/lefigaro/pages/simple.py similarity index 100% rename from weboob/backends/lefigaro/pages/simple.py rename to modules/lefigaro/pages/simple.py diff --git a/weboob/backends/lefigaro/pages/special.py b/modules/lefigaro/pages/special.py similarity index 100% rename from weboob/backends/lefigaro/pages/special.py rename to modules/lefigaro/pages/special.py diff --git a/weboob/backends/lefigaro/test.py b/modules/lefigaro/test.py similarity index 100% rename from weboob/backends/lefigaro/test.py rename to modules/lefigaro/test.py diff --git a/weboob/backends/lefigaro/tools.py b/modules/lefigaro/tools.py similarity index 100% rename from weboob/backends/lefigaro/tools.py rename to modules/lefigaro/tools.py diff --git a/weboob/backends/lemouv/__init__.py b/modules/lemouv/__init__.py similarity index 100% rename from weboob/backends/lemouv/__init__.py rename to modules/lemouv/__init__.py diff --git a/weboob/backends/lemouv/backend.py b/modules/lemouv/backend.py similarity index 100% rename from weboob/backends/lemouv/backend.py rename to modules/lemouv/backend.py diff --git a/icons/lemouv.png b/modules/lemouv/favicon.png similarity index 100% rename from icons/lemouv.png rename to modules/lemouv/favicon.png diff --git a/weboob/backends/lemouv/test.py b/modules/lemouv/test.py similarity index 100% rename from weboob/backends/lemouv/test.py rename to modules/lemouv/test.py diff --git a/weboob/backends/mangafox/__init__.py b/modules/mangafox/__init__.py similarity index 100% rename from weboob/backends/mangafox/__init__.py rename to modules/mangafox/__init__.py diff --git a/weboob/backends/mangafox/backend.py b/modules/mangafox/backend.py similarity index 100% rename from weboob/backends/mangafox/backend.py rename to modules/mangafox/backend.py diff --git a/weboob/backends/mangafox/test.py b/modules/mangafox/test.py similarity index 100% rename from weboob/backends/mangafox/test.py rename to modules/mangafox/test.py diff --git a/weboob/backends/mangahere/__init__.py b/modules/mangahere/__init__.py similarity index 100% rename from weboob/backends/mangahere/__init__.py rename to modules/mangahere/__init__.py diff --git a/weboob/backends/mangahere/backend.py b/modules/mangahere/backend.py similarity index 100% rename from weboob/backends/mangahere/backend.py rename to modules/mangahere/backend.py diff --git a/weboob/backends/mangahere/test.py b/modules/mangahere/test.py similarity index 100% rename from weboob/backends/mangahere/test.py rename to modules/mangahere/test.py diff --git a/weboob/backends/mangareader/__init__.py b/modules/mangareader/__init__.py similarity index 100% rename from weboob/backends/mangareader/__init__.py rename to modules/mangareader/__init__.py diff --git a/weboob/backends/mangareader/backend.py b/modules/mangareader/backend.py similarity index 100% rename from weboob/backends/mangareader/backend.py rename to modules/mangareader/backend.py diff --git a/weboob/backends/mangareader/test.py b/modules/mangareader/test.py similarity index 100% rename from weboob/backends/mangareader/test.py rename to modules/mangareader/test.py diff --git a/weboob/backends/mangatoshokan/__init__.py b/modules/mangatoshokan/__init__.py similarity index 100% rename from weboob/backends/mangatoshokan/__init__.py rename to modules/mangatoshokan/__init__.py diff --git a/weboob/backends/mangatoshokan/backend.py b/modules/mangatoshokan/backend.py similarity index 100% rename from weboob/backends/mangatoshokan/backend.py rename to modules/mangatoshokan/backend.py diff --git a/weboob/backends/mangatoshokan/test.py b/modules/mangatoshokan/test.py similarity index 100% rename from weboob/backends/mangatoshokan/test.py rename to modules/mangatoshokan/test.py diff --git a/weboob/backends/mediawiki/__init__.py b/modules/mediawiki/__init__.py similarity index 100% rename from weboob/backends/mediawiki/__init__.py rename to modules/mediawiki/__init__.py diff --git a/weboob/backends/mediawiki/backend.py b/modules/mediawiki/backend.py similarity index 100% rename from weboob/backends/mediawiki/backend.py rename to modules/mediawiki/backend.py diff --git a/weboob/backends/mediawiki/browser.py b/modules/mediawiki/browser.py similarity index 100% rename from weboob/backends/mediawiki/browser.py rename to modules/mediawiki/browser.py diff --git a/icons/mediawiki.png b/modules/mediawiki/favicon.png similarity index 100% rename from icons/mediawiki.png rename to modules/mediawiki/favicon.png diff --git a/weboob/backends/mediawiki/test.py b/modules/mediawiki/test.py similarity index 100% rename from weboob/backends/mediawiki/test.py rename to modules/mediawiki/test.py diff --git a/weboob/backends/meteofrance/__init__.py b/modules/meteofrance/__init__.py similarity index 100% rename from weboob/backends/meteofrance/__init__.py rename to modules/meteofrance/__init__.py diff --git a/weboob/backends/meteofrance/backend.py b/modules/meteofrance/backend.py similarity index 100% rename from weboob/backends/meteofrance/backend.py rename to modules/meteofrance/backend.py diff --git a/weboob/backends/meteofrance/browser.py b/modules/meteofrance/browser.py similarity index 100% rename from weboob/backends/meteofrance/browser.py rename to modules/meteofrance/browser.py diff --git a/icons/meteofrance.png b/modules/meteofrance/favicon.png similarity index 100% rename from icons/meteofrance.png rename to modules/meteofrance/favicon.png diff --git a/weboob/backends/meteofrance/pages/__init__.py b/modules/meteofrance/pages/__init__.py similarity index 100% rename from weboob/backends/meteofrance/pages/__init__.py rename to modules/meteofrance/pages/__init__.py diff --git a/weboob/backends/meteofrance/pages/meteo.py b/modules/meteofrance/pages/meteo.py similarity index 100% rename from weboob/backends/meteofrance/pages/meteo.py rename to modules/meteofrance/pages/meteo.py diff --git a/weboob/backends/meteofrance/test.py b/modules/meteofrance/test.py similarity index 100% rename from weboob/backends/meteofrance/test.py rename to modules/meteofrance/test.py diff --git a/weboob/backends/minutes20/__init__.py b/modules/minutes20/__init__.py similarity index 100% rename from weboob/backends/minutes20/__init__.py rename to modules/minutes20/__init__.py diff --git a/weboob/backends/minutes20/backend.py b/modules/minutes20/backend.py similarity index 100% rename from weboob/backends/minutes20/backend.py rename to modules/minutes20/backend.py diff --git a/weboob/backends/minutes20/browser.py b/modules/minutes20/browser.py similarity index 100% rename from weboob/backends/minutes20/browser.py rename to modules/minutes20/browser.py diff --git a/icons/minutes20.png b/modules/minutes20/favicon.png similarity index 100% rename from icons/minutes20.png rename to modules/minutes20/favicon.png diff --git a/weboob/backends/minutes20/pages/__init__.py b/modules/minutes20/pages/__init__.py similarity index 100% rename from weboob/backends/minutes20/pages/__init__.py rename to modules/minutes20/pages/__init__.py diff --git a/weboob/backends/minutes20/pages/article.py b/modules/minutes20/pages/article.py similarity index 100% rename from weboob/backends/minutes20/pages/article.py rename to modules/minutes20/pages/article.py diff --git a/weboob/backends/minutes20/pages/simple.py b/modules/minutes20/pages/simple.py similarity index 100% rename from weboob/backends/minutes20/pages/simple.py rename to modules/minutes20/pages/simple.py diff --git a/weboob/backends/minutes20/test.py b/modules/minutes20/test.py similarity index 100% rename from weboob/backends/minutes20/test.py rename to modules/minutes20/test.py diff --git a/weboob/backends/minutes20/tools.py b/modules/minutes20/tools.py similarity index 100% rename from weboob/backends/minutes20/tools.py rename to modules/minutes20/tools.py diff --git a/weboob/backends/newsfeed/__init__.py b/modules/newsfeed/__init__.py similarity index 100% rename from weboob/backends/newsfeed/__init__.py rename to modules/newsfeed/__init__.py diff --git a/weboob/backends/newsfeed/backend.py b/modules/newsfeed/backend.py similarity index 100% rename from weboob/backends/newsfeed/backend.py rename to modules/newsfeed/backend.py diff --git a/icons/newsfeed.png b/modules/newsfeed/favicon.png similarity index 100% rename from icons/newsfeed.png rename to modules/newsfeed/favicon.png diff --git a/weboob/backends/newsfeed/test.py b/modules/newsfeed/test.py similarity index 100% rename from weboob/backends/newsfeed/test.py rename to modules/newsfeed/test.py diff --git a/weboob/backends/nolifetv/__init__.py b/modules/nolifetv/__init__.py similarity index 100% rename from weboob/backends/nolifetv/__init__.py rename to modules/nolifetv/__init__.py diff --git a/weboob/backends/nolifetv/backend.py b/modules/nolifetv/backend.py similarity index 100% rename from weboob/backends/nolifetv/backend.py rename to modules/nolifetv/backend.py diff --git a/weboob/backends/nolifetv/browser.py b/modules/nolifetv/browser.py similarity index 100% rename from weboob/backends/nolifetv/browser.py rename to modules/nolifetv/browser.py diff --git a/weboob/backends/nolifetv/pages/__init__.py b/modules/nolifetv/pages/__init__.py similarity index 100% rename from weboob/backends/nolifetv/pages/__init__.py rename to modules/nolifetv/pages/__init__.py diff --git a/weboob/backends/nolifetv/pages/index.py b/modules/nolifetv/pages/index.py similarity index 100% rename from weboob/backends/nolifetv/pages/index.py rename to modules/nolifetv/pages/index.py diff --git a/weboob/backends/nolifetv/pages/video.py b/modules/nolifetv/pages/video.py similarity index 100% rename from weboob/backends/nolifetv/pages/video.py rename to modules/nolifetv/pages/video.py diff --git a/weboob/backends/nolifetv/test.py b/modules/nolifetv/test.py similarity index 100% rename from weboob/backends/nolifetv/test.py rename to modules/nolifetv/test.py diff --git a/weboob/backends/nolifetv/video.py b/modules/nolifetv/video.py similarity index 100% rename from weboob/backends/nolifetv/video.py rename to modules/nolifetv/video.py diff --git a/weboob/backends/nova/__init__.py b/modules/nova/__init__.py similarity index 100% rename from weboob/backends/nova/__init__.py rename to modules/nova/__init__.py diff --git a/weboob/backends/nova/backend.py b/modules/nova/backend.py similarity index 100% rename from weboob/backends/nova/backend.py rename to modules/nova/backend.py diff --git a/icons/nova.png b/modules/nova/favicon.png similarity index 100% rename from icons/nova.png rename to modules/nova/favicon.png diff --git a/weboob/backends/nova/test.py b/modules/nova/test.py similarity index 100% rename from weboob/backends/nova/test.py rename to modules/nova/test.py diff --git a/weboob/backends/orange/__init__.py b/modules/orange/__init__.py similarity index 100% rename from weboob/backends/orange/__init__.py rename to modules/orange/__init__.py diff --git a/weboob/backends/orange/backend.py b/modules/orange/backend.py similarity index 100% rename from weboob/backends/orange/backend.py rename to modules/orange/backend.py diff --git a/weboob/backends/orange/browser.py b/modules/orange/browser.py similarity index 100% rename from weboob/backends/orange/browser.py rename to modules/orange/browser.py diff --git a/icons/orange.png b/modules/orange/favicon.png similarity index 100% rename from icons/orange.png rename to modules/orange/favicon.png diff --git a/weboob/backends/orange/pages/__init__.py b/modules/orange/pages/__init__.py similarity index 100% rename from weboob/backends/orange/pages/__init__.py rename to modules/orange/pages/__init__.py diff --git a/weboob/backends/orange/pages/compose.py b/modules/orange/pages/compose.py similarity index 100% rename from weboob/backends/orange/pages/compose.py rename to modules/orange/pages/compose.py diff --git a/weboob/backends/orange/pages/login.py b/modules/orange/pages/login.py similarity index 100% rename from weboob/backends/orange/pages/login.py rename to modules/orange/pages/login.py diff --git a/weboob/backends/ouifm/__init__.py b/modules/ouifm/__init__.py similarity index 100% rename from weboob/backends/ouifm/__init__.py rename to modules/ouifm/__init__.py diff --git a/weboob/backends/ouifm/backend.py b/modules/ouifm/backend.py similarity index 100% rename from weboob/backends/ouifm/backend.py rename to modules/ouifm/backend.py diff --git a/icons/ouifm.png b/modules/ouifm/favicon.png similarity index 100% rename from icons/ouifm.png rename to modules/ouifm/favicon.png diff --git a/weboob/backends/ouifm/test.py b/modules/ouifm/test.py similarity index 100% rename from weboob/backends/ouifm/test.py rename to modules/ouifm/test.py diff --git a/weboob/backends/pastealacon/__init__.py b/modules/pastealacon/__init__.py similarity index 100% rename from weboob/backends/pastealacon/__init__.py rename to modules/pastealacon/__init__.py diff --git a/weboob/backends/pastealacon/backend.py b/modules/pastealacon/backend.py similarity index 100% rename from weboob/backends/pastealacon/backend.py rename to modules/pastealacon/backend.py diff --git a/weboob/backends/pastealacon/browser.py b/modules/pastealacon/browser.py similarity index 100% rename from weboob/backends/pastealacon/browser.py rename to modules/pastealacon/browser.py diff --git a/icons/pastealacon.png b/modules/pastealacon/favicon.png similarity index 100% rename from icons/pastealacon.png rename to modules/pastealacon/favicon.png diff --git a/weboob/backends/pastealacon/pages.py b/modules/pastealacon/pages.py similarity index 100% rename from weboob/backends/pastealacon/pages.py rename to modules/pastealacon/pages.py diff --git a/weboob/backends/pastealacon/paste.py b/modules/pastealacon/paste.py similarity index 100% rename from weboob/backends/pastealacon/paste.py rename to modules/pastealacon/paste.py diff --git a/weboob/backends/pastealacon/test.py b/modules/pastealacon/test.py similarity index 100% rename from weboob/backends/pastealacon/test.py rename to modules/pastealacon/test.py diff --git a/weboob/backends/pastebin/__init__.py b/modules/pastebin/__init__.py similarity index 100% rename from weboob/backends/pastebin/__init__.py rename to modules/pastebin/__init__.py diff --git a/weboob/backends/pastebin/backend.py b/modules/pastebin/backend.py similarity index 100% rename from weboob/backends/pastebin/backend.py rename to modules/pastebin/backend.py diff --git a/weboob/backends/pastebin/browser.py b/modules/pastebin/browser.py similarity index 100% rename from weboob/backends/pastebin/browser.py rename to modules/pastebin/browser.py diff --git a/icons/pastebin.png b/modules/pastebin/favicon.png similarity index 100% rename from icons/pastebin.png rename to modules/pastebin/favicon.png diff --git a/weboob/backends/pastebin/pages.py b/modules/pastebin/pages.py similarity index 100% rename from weboob/backends/pastebin/pages.py rename to modules/pastebin/pages.py diff --git a/weboob/backends/pastebin/paste.py b/modules/pastebin/paste.py similarity index 100% rename from weboob/backends/pastebin/paste.py rename to modules/pastebin/paste.py diff --git a/weboob/backends/pastebin/test.py b/modules/pastebin/test.py similarity index 100% rename from weboob/backends/pastebin/test.py rename to modules/pastebin/test.py diff --git a/weboob/backends/phpbb/__init__.py b/modules/phpbb/__init__.py similarity index 100% rename from weboob/backends/phpbb/__init__.py rename to modules/phpbb/__init__.py diff --git a/weboob/backends/phpbb/backend.py b/modules/phpbb/backend.py similarity index 100% rename from weboob/backends/phpbb/backend.py rename to modules/phpbb/backend.py diff --git a/weboob/backends/phpbb/browser.py b/modules/phpbb/browser.py similarity index 100% rename from weboob/backends/phpbb/browser.py rename to modules/phpbb/browser.py diff --git a/icons/phpbb.png b/modules/phpbb/favicon.png similarity index 100% rename from icons/phpbb.png rename to modules/phpbb/favicon.png diff --git a/weboob/backends/phpbb/pages/__init__.py b/modules/phpbb/pages/__init__.py similarity index 100% rename from weboob/backends/phpbb/pages/__init__.py rename to modules/phpbb/pages/__init__.py diff --git a/weboob/backends/phpbb/pages/forum.py b/modules/phpbb/pages/forum.py similarity index 100% rename from weboob/backends/phpbb/pages/forum.py rename to modules/phpbb/pages/forum.py diff --git a/weboob/backends/phpbb/pages/index.py b/modules/phpbb/pages/index.py similarity index 100% rename from weboob/backends/phpbb/pages/index.py rename to modules/phpbb/pages/index.py diff --git a/weboob/backends/phpbb/test.py b/modules/phpbb/test.py similarity index 100% rename from weboob/backends/phpbb/test.py rename to modules/phpbb/test.py diff --git a/weboob/backends/phpbb/tools.py b/modules/phpbb/tools.py similarity index 100% rename from weboob/backends/phpbb/tools.py rename to modules/phpbb/tools.py diff --git a/weboob/backends/piratebay/__init__.py b/modules/piratebay/__init__.py similarity index 100% rename from weboob/backends/piratebay/__init__.py rename to modules/piratebay/__init__.py diff --git a/weboob/backends/piratebay/backend.py b/modules/piratebay/backend.py similarity index 100% rename from weboob/backends/piratebay/backend.py rename to modules/piratebay/backend.py diff --git a/weboob/backends/piratebay/browser.py b/modules/piratebay/browser.py similarity index 100% rename from weboob/backends/piratebay/browser.py rename to modules/piratebay/browser.py diff --git a/icons/piratebay.png b/modules/piratebay/favicon.png similarity index 100% rename from icons/piratebay.png rename to modules/piratebay/favicon.png diff --git a/weboob/backends/piratebay/pages/__init__.py b/modules/piratebay/pages/__init__.py similarity index 100% rename from weboob/backends/piratebay/pages/__init__.py rename to modules/piratebay/pages/__init__.py diff --git a/weboob/backends/piratebay/pages/index.py b/modules/piratebay/pages/index.py similarity index 100% rename from weboob/backends/piratebay/pages/index.py rename to modules/piratebay/pages/index.py diff --git a/weboob/backends/piratebay/pages/torrents.py b/modules/piratebay/pages/torrents.py similarity index 100% rename from weboob/backends/piratebay/pages/torrents.py rename to modules/piratebay/pages/torrents.py diff --git a/weboob/backends/piratebay/test.py b/modules/piratebay/test.py similarity index 100% rename from weboob/backends/piratebay/test.py rename to modules/piratebay/test.py diff --git a/weboob/backends/redmine/__init__.py b/modules/redmine/__init__.py similarity index 100% rename from weboob/backends/redmine/__init__.py rename to modules/redmine/__init__.py diff --git a/weboob/backends/redmine/backend.py b/modules/redmine/backend.py similarity index 100% rename from weboob/backends/redmine/backend.py rename to modules/redmine/backend.py diff --git a/weboob/backends/redmine/browser.py b/modules/redmine/browser.py similarity index 100% rename from weboob/backends/redmine/browser.py rename to modules/redmine/browser.py diff --git a/icons/redmine.png b/modules/redmine/favicon.png similarity index 100% rename from icons/redmine.png rename to modules/redmine/favicon.png diff --git a/weboob/backends/redmine/pages/__init__.py b/modules/redmine/pages/__init__.py similarity index 100% rename from weboob/backends/redmine/pages/__init__.py rename to modules/redmine/pages/__init__.py diff --git a/weboob/backends/redmine/pages/index.py b/modules/redmine/pages/index.py similarity index 100% rename from weboob/backends/redmine/pages/index.py rename to modules/redmine/pages/index.py diff --git a/weboob/backends/redmine/pages/issues.py b/modules/redmine/pages/issues.py similarity index 100% rename from weboob/backends/redmine/pages/issues.py rename to modules/redmine/pages/issues.py diff --git a/weboob/backends/redmine/pages/wiki.py b/modules/redmine/pages/wiki.py similarity index 100% rename from weboob/backends/redmine/pages/wiki.py rename to modules/redmine/pages/wiki.py diff --git a/weboob/backends/sfr/__init__.py b/modules/sfr/__init__.py similarity index 100% rename from weboob/backends/sfr/__init__.py rename to modules/sfr/__init__.py diff --git a/weboob/backends/sfr/backend.py b/modules/sfr/backend.py similarity index 100% rename from weboob/backends/sfr/backend.py rename to modules/sfr/backend.py diff --git a/weboob/backends/sfr/browser.py b/modules/sfr/browser.py similarity index 100% rename from weboob/backends/sfr/browser.py rename to modules/sfr/browser.py diff --git a/icons/sfr.png b/modules/sfr/favicon.png similarity index 100% rename from icons/sfr.png rename to modules/sfr/favicon.png diff --git a/weboob/backends/sfr/pages/__init__.py b/modules/sfr/pages/__init__.py similarity index 100% rename from weboob/backends/sfr/pages/__init__.py rename to modules/sfr/pages/__init__.py diff --git a/weboob/backends/sfr/pages/compose.py b/modules/sfr/pages/compose.py similarity index 100% rename from weboob/backends/sfr/pages/compose.py rename to modules/sfr/pages/compose.py diff --git a/weboob/backends/sfr/pages/login.py b/modules/sfr/pages/login.py similarity index 100% rename from weboob/backends/sfr/pages/login.py rename to modules/sfr/pages/login.py diff --git a/weboob/backends/sfr/test.py b/modules/sfr/test.py similarity index 100% rename from weboob/backends/sfr/test.py rename to modules/sfr/test.py diff --git a/weboob/backends/simplyreadit/__init__.py b/modules/simplyreadit/__init__.py similarity index 100% rename from weboob/backends/simplyreadit/__init__.py rename to modules/simplyreadit/__init__.py diff --git a/weboob/backends/simplyreadit/backend.py b/modules/simplyreadit/backend.py similarity index 100% rename from weboob/backends/simplyreadit/backend.py rename to modules/simplyreadit/backend.py diff --git a/weboob/backends/simplyreadit/test.py b/modules/simplyreadit/test.py similarity index 100% rename from weboob/backends/simplyreadit/test.py rename to modules/simplyreadit/test.py diff --git a/weboob/backends/societegenerale/__init__.py b/modules/societegenerale/__init__.py similarity index 100% rename from weboob/backends/societegenerale/__init__.py rename to modules/societegenerale/__init__.py diff --git a/weboob/backends/societegenerale/backend.py b/modules/societegenerale/backend.py similarity index 100% rename from weboob/backends/societegenerale/backend.py rename to modules/societegenerale/backend.py diff --git a/weboob/backends/societegenerale/browser.py b/modules/societegenerale/browser.py similarity index 98% rename from weboob/backends/societegenerale/browser.py rename to modules/societegenerale/browser.py index 67a45837e8..6e0b64212a 100644 --- a/weboob/backends/societegenerale/browser.py +++ b/modules/societegenerale/browser.py @@ -19,7 +19,7 @@ from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword -from weboob.backends.societegenerale import pages +from societegenerale import pages __all__ = ['SocieteGenerale'] diff --git a/weboob/backends/societegenerale/captcha.py b/modules/societegenerale/captcha.py similarity index 100% rename from weboob/backends/societegenerale/captcha.py rename to modules/societegenerale/captcha.py diff --git a/icons/societegenerale.png b/modules/societegenerale/favicon.png similarity index 100% rename from icons/societegenerale.png rename to modules/societegenerale/favicon.png diff --git a/weboob/backends/societegenerale/pages/__init__.py b/modules/societegenerale/pages/__init__.py similarity index 100% rename from weboob/backends/societegenerale/pages/__init__.py rename to modules/societegenerale/pages/__init__.py diff --git a/weboob/backends/societegenerale/pages/accounts_list.py b/modules/societegenerale/pages/accounts_list.py similarity index 100% rename from weboob/backends/societegenerale/pages/accounts_list.py rename to modules/societegenerale/pages/accounts_list.py diff --git a/weboob/backends/societegenerale/pages/login.py b/modules/societegenerale/pages/login.py similarity index 97% rename from weboob/backends/societegenerale/pages/login.py rename to modules/societegenerale/pages/login.py index 24c4507012..5cc63a2e75 100644 --- a/weboob/backends/societegenerale/pages/login.py +++ b/modules/societegenerale/pages/login.py @@ -21,7 +21,7 @@ from logging import error from weboob.tools.browser import BasePage, BrowserUnavailable -from weboob.backends.societegenerale.captcha import Captcha, TileError +from societegenerale.captcha import Captcha, TileError from lxml import etree diff --git a/weboob/backends/societegenerale/test.py b/modules/societegenerale/test.py similarity index 100% rename from weboob/backends/societegenerale/test.py rename to modules/societegenerale/test.py diff --git a/weboob/backends/transilien/__init__.py b/modules/transilien/__init__.py similarity index 100% rename from weboob/backends/transilien/__init__.py rename to modules/transilien/__init__.py diff --git a/weboob/backends/transilien/backend.py b/modules/transilien/backend.py similarity index 100% rename from weboob/backends/transilien/backend.py rename to modules/transilien/backend.py diff --git a/weboob/backends/transilien/browser.py b/modules/transilien/browser.py similarity index 100% rename from weboob/backends/transilien/browser.py rename to modules/transilien/browser.py diff --git a/icons/transilien.png b/modules/transilien/favicon.png similarity index 100% rename from icons/transilien.png rename to modules/transilien/favicon.png diff --git a/weboob/backends/transilien/pages/__init__.py b/modules/transilien/pages/__init__.py similarity index 100% rename from weboob/backends/transilien/pages/__init__.py rename to modules/transilien/pages/__init__.py diff --git a/weboob/backends/transilien/pages/departures.py b/modules/transilien/pages/departures.py similarity index 100% rename from weboob/backends/transilien/pages/departures.py rename to modules/transilien/pages/departures.py diff --git a/weboob/backends/transilien/pages/roadmap.py b/modules/transilien/pages/roadmap.py similarity index 100% rename from weboob/backends/transilien/pages/roadmap.py rename to modules/transilien/pages/roadmap.py diff --git a/weboob/backends/transilien/pages/station.py b/modules/transilien/pages/station.py similarity index 100% rename from weboob/backends/transilien/pages/station.py rename to modules/transilien/pages/station.py diff --git a/weboob/backends/transilien/stations.py b/modules/transilien/stations.py similarity index 100% rename from weboob/backends/transilien/stations.py rename to modules/transilien/stations.py diff --git a/weboob/backends/transilien/test.py b/modules/transilien/test.py similarity index 100% rename from weboob/backends/transilien/test.py rename to modules/transilien/test.py diff --git a/weboob/backends/yahoo/__init__.py b/modules/yahoo/__init__.py similarity index 100% rename from weboob/backends/yahoo/__init__.py rename to modules/yahoo/__init__.py diff --git a/weboob/backends/yahoo/backend.py b/modules/yahoo/backend.py similarity index 100% rename from weboob/backends/yahoo/backend.py rename to modules/yahoo/backend.py diff --git a/icons/yahoo.png b/modules/yahoo/favicon.png similarity index 100% rename from icons/yahoo.png rename to modules/yahoo/favicon.png diff --git a/weboob/backends/yahoo/test.py b/modules/yahoo/test.py similarity index 100% rename from weboob/backends/yahoo/test.py rename to modules/yahoo/test.py diff --git a/weboob/backends/youjizz/__init__.py b/modules/youjizz/__init__.py similarity index 100% rename from weboob/backends/youjizz/__init__.py rename to modules/youjizz/__init__.py diff --git a/weboob/backends/youjizz/backend.py b/modules/youjizz/backend.py similarity index 100% rename from weboob/backends/youjizz/backend.py rename to modules/youjizz/backend.py diff --git a/weboob/backends/youjizz/browser.py b/modules/youjizz/browser.py similarity index 100% rename from weboob/backends/youjizz/browser.py rename to modules/youjizz/browser.py diff --git a/icons/youjizz.png b/modules/youjizz/favicon.png similarity index 100% rename from icons/youjizz.png rename to modules/youjizz/favicon.png diff --git a/weboob/backends/youjizz/pages/__init__.py b/modules/youjizz/pages/__init__.py similarity index 100% rename from weboob/backends/youjizz/pages/__init__.py rename to modules/youjizz/pages/__init__.py diff --git a/weboob/backends/youjizz/pages/index.py b/modules/youjizz/pages/index.py similarity index 100% rename from weboob/backends/youjizz/pages/index.py rename to modules/youjizz/pages/index.py diff --git a/weboob/backends/youjizz/pages/video.py b/modules/youjizz/pages/video.py similarity index 100% rename from weboob/backends/youjizz/pages/video.py rename to modules/youjizz/pages/video.py diff --git a/weboob/backends/youjizz/test.py b/modules/youjizz/test.py similarity index 100% rename from weboob/backends/youjizz/test.py rename to modules/youjizz/test.py diff --git a/weboob/backends/youjizz/video.py b/modules/youjizz/video.py similarity index 100% rename from weboob/backends/youjizz/video.py rename to modules/youjizz/video.py diff --git a/weboob/backends/youporn/__init__.py b/modules/youporn/__init__.py similarity index 100% rename from weboob/backends/youporn/__init__.py rename to modules/youporn/__init__.py diff --git a/weboob/backends/youporn/backend.py b/modules/youporn/backend.py similarity index 100% rename from weboob/backends/youporn/backend.py rename to modules/youporn/backend.py diff --git a/weboob/backends/youporn/browser.py b/modules/youporn/browser.py similarity index 100% rename from weboob/backends/youporn/browser.py rename to modules/youporn/browser.py diff --git a/icons/youporn.png b/modules/youporn/favicon.png similarity index 100% rename from icons/youporn.png rename to modules/youporn/favicon.png diff --git a/weboob/backends/youporn/pages/__init__.py b/modules/youporn/pages/__init__.py similarity index 100% rename from weboob/backends/youporn/pages/__init__.py rename to modules/youporn/pages/__init__.py diff --git a/weboob/backends/youporn/pages/base.py b/modules/youporn/pages/base.py similarity index 100% rename from weboob/backends/youporn/pages/base.py rename to modules/youporn/pages/base.py diff --git a/weboob/backends/youporn/pages/index.py b/modules/youporn/pages/index.py similarity index 100% rename from weboob/backends/youporn/pages/index.py rename to modules/youporn/pages/index.py diff --git a/weboob/backends/youporn/pages/video.py b/modules/youporn/pages/video.py similarity index 100% rename from weboob/backends/youporn/pages/video.py rename to modules/youporn/pages/video.py diff --git a/weboob/backends/youporn/test.py b/modules/youporn/test.py similarity index 100% rename from weboob/backends/youporn/test.py rename to modules/youporn/test.py diff --git a/weboob/backends/youporn/video.py b/modules/youporn/video.py similarity index 100% rename from weboob/backends/youporn/video.py rename to modules/youporn/video.py diff --git a/weboob/backends/youtube/__init__.py b/modules/youtube/__init__.py similarity index 100% rename from weboob/backends/youtube/__init__.py rename to modules/youtube/__init__.py diff --git a/weboob/backends/youtube/backend.py b/modules/youtube/backend.py similarity index 100% rename from weboob/backends/youtube/backend.py rename to modules/youtube/backend.py diff --git a/weboob/backends/youtube/browser.py b/modules/youtube/browser.py similarity index 100% rename from weboob/backends/youtube/browser.py rename to modules/youtube/browser.py diff --git a/icons/youtube.png b/modules/youtube/favicon.png similarity index 100% rename from icons/youtube.png rename to modules/youtube/favicon.png diff --git a/weboob/backends/youtube/pages.py b/modules/youtube/pages.py similarity index 100% rename from weboob/backends/youtube/pages.py rename to modules/youtube/pages.py diff --git a/weboob/backends/youtube/test.py b/modules/youtube/test.py similarity index 100% rename from weboob/backends/youtube/test.py rename to modules/youtube/test.py diff --git a/weboob/backends/youtube/video.py b/modules/youtube/video.py similarity index 100% rename from weboob/backends/youtube/video.py rename to modules/youtube/video.py diff --git a/scripts/weboob-repos b/scripts/weboob-repos new file mode 100755 index 0000000000..afe09433fa --- /dev/null +++ b/scripts/weboob-repos @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# vim: ft=python et softtabstop=4 cinoptions=4 shiftwidth=4 ts=4 ai + +# Copyright(C) 2012 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +from weboob.applications.weboobrepos import WeboobRepos + + +if __name__ == '__main__': + WeboobRepos.run() diff --git a/tools/pyflakes.sh b/tools/pyflakes.sh index bd64f22177..33af65c000 100755 --- a/tools/pyflakes.sh +++ b/tools/pyflakes.sh @@ -4,4 +4,4 @@ cd .. # grep will return 0 only if it founds something, but our script # wants to return 0 when it founds nothing! -pyflakes weboob scripts/* | grep -v redefinition && exit 1 || exit 0 +pyflakes weboob modules contrib scripts/* | grep -v redefinition && exit 1 || exit 0 diff --git a/tools/weboob_lint.py b/tools/weboob_lint.py index d57a3476b3..e662c28235 100755 --- a/tools/weboob_lint.py +++ b/tools/weboob_lint.py @@ -1,19 +1,28 @@ #!/usr/bin/env python -from weboob.core.modules import ModulesLoader +# Hint: use this script with file:///path/to/local/modules/ in sources.list +# if you want to correctly check all modules. + +from weboob.core import Weboob import weboob.backends import os -loader = ModulesLoader() -loader.load_all() - -backends_without_icons = [name for name, backend in loader.loaded.iteritems() if backend.icon_path is None] -if backends_without_icons: - print 'Backends without icons: %s' % backends_without_icons +weboob = Weboob() +weboob.modules_loader.load_all() backends_without_tests = [] -for name, backend in loader.loaded.iteritems(): - if not os.path.exists(os.path.join(weboob.backends.__path__[0], name, 'test.py')): +backends_without_icons = [] + +for name, backend in weboob.modules_loader.loaded.iteritems(): + path = backend.package.__path__[0] + if not os.path.exists(os.path.join(path, 'test.py')): backends_without_tests.append(name) + if not os.path.exists(os.path.join(path, 'favicon.png')) and \ + not os.path.exists(os.path.join(weboob.repositories.icons_dir, '%s.png' % name)) and \ + not backend.icon: + backends_without_icons.append(name) + if backends_without_tests: print 'Backends without tests: %s' % backends_without_tests +if backends_without_icons: + print 'Backends without icons: %s' % backends_without_icons diff --git a/weboob/applications/boobathon/boobathon.py b/weboob/applications/boobathon/boobathon.py index ae92d1cd55..60678746a2 100644 --- a/weboob/applications/boobathon/boobathon.py +++ b/weboob/applications/boobathon/boobathon.py @@ -780,8 +780,8 @@ def load_default_backends(self): print "Ok, so leave now, fag." sys.exit(0) - def is_backend_loadable(self, backend): + def is_module_loadable(self, module): """ Overload a ConsoleApplication method. """ - return backend.name == 'redmine' + return module.name == 'redmine' diff --git a/weboob/applications/weboobcfg/weboobcfg.py b/weboob/applications/weboobcfg/weboobcfg.py index ced7bacb48..6eea8fe343 100644 --- a/weboob/applications/weboobcfg/weboobcfg.py +++ b/weboob/applications/weboobcfg/weboobcfg.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Romain Bignon, Christophe Benz +# Copyright(C) 2010-2012 Romain Bignon, Christophe Benz # # This file is part of weboob. # @@ -24,6 +24,7 @@ from copy import copy from weboob.capabilities.account import ICapAccount +from weboob.core.repositories import IProgress from weboob.core.modules import ModuleLoadError from weboob.tools.application.repl import ReplApplication from weboob.tools.ordereddict import OrderedDict @@ -35,10 +36,10 @@ class WeboobCfg(ReplApplication): APPNAME = 'weboob-config' VERSION = '0.a' - COPYRIGHT = 'Copyright(C) 2010-2011 Christophe Benz, Romain Bignon' + COPYRIGHT = 'Copyright(C) 2010-2012 Christophe Benz, Romain Bignon' DESCRIPTION = "Weboob-Config is a console application to add/edit/remove backends, " \ "and to register new website accounts." - COMMANDS_FORMATTERS = {'backends': 'table', + COMMANDS_FORMATTERS = {'modules': 'table', 'list': 'table', } DISABLE_REPL = True @@ -53,10 +54,10 @@ def do_add(self, line): """ add NAME [OPTIONS ...] - Add a configured backend. + Add a backend. """ if not line: - print >>sys.stderr, 'You must specify a backend name. Hint: use the "backends" command.' + print >>sys.stderr, 'You must specify a module name. Hint: use the "modules" command.' return 2 name, options = self.parse_command_args(line, 2, 1) if options: @@ -78,9 +79,9 @@ def do_add(self, line): def do_register(self, line): """ - register NAME + register MODULE - Register a new account on a backend. + Register a new account on a module. """ self.register_backend(line) @@ -117,15 +118,15 @@ def do_list(self, line): """ list [CAPS ..] - Show configured backends. + Show backends. """ caps = line.split() for instance_name, name, params in sorted(self.weboob.backends_config.iter_backends()): backend = self.weboob.modules_loader.get_or_load_module(name) if caps and not self.caps_included(backend.iter_caps(), caps): continue - row = OrderedDict([('Instance name', instance_name), - ('Backend', name), + row = OrderedDict([('Name', instance_name), + ('Module', name), ('Configuration', ', '.join( '%s=%s' % (key, ('*****' if key in backend.config and backend.config[key].masked \ else value)) \ @@ -138,7 +139,7 @@ def do_remove(self, instance_name): """ remove NAME - Remove a configured backend. + Remove a backend. """ if not self.weboob.backends_config.remove_backend(instance_name): print >>sys.stderr, 'Backend instance "%s" does not exist' % instance_name @@ -155,7 +156,7 @@ def _do_toggle(self, name, state): def do_enable(self, name): """ - enable NAME + enable BACKEND Enable a disabled backend """ @@ -163,7 +164,7 @@ def do_enable(self, name): def do_disable(self, name): """ - disable NAME + disable BACKEND Disable a backend """ @@ -171,7 +172,7 @@ def do_disable(self, name): def do_edit(self, line): """ - edit NAME + edit BACKEND Edit a backend """ @@ -181,20 +182,17 @@ def do_edit(self, line): print >>sys.stderr, 'Error: backend "%s" not found' % line return 1 - def do_backends(self, line): + def do_modules(self, line): """ - backends [CAPS ...] + modules [CAPS ...] - Show available backends. + Show available modules. """ caps = line.split() - self.weboob.modules_loader.load_all() - for name, backend in sorted(self.weboob.modules_loader.loaded.iteritems()): - if caps and not self.caps_included(backend.iter_caps(), caps): - continue + for name, info in sorted(self.weboob.repositories.get_all_modules_info(caps).iteritems()): row = OrderedDict([('Name', name), - ('Capabilities', ', '.join(cap.__name__ for cap in backend.iter_caps())), - ('Description', backend.description), + ('Capabilities', ', '.join(info.capabilities)), + ('Description', info.description), ]) self.format(row) self.flush() @@ -203,40 +201,44 @@ def do_info(self, line): """ info NAME - Display information about a backend. + Display information about a module. """ if not line: - print >>sys.stderr, 'You must specify a backend name. Hint: use the "backends" command.' + print >>sys.stderr, 'You must specify a module name. Hint: use the "modules" command.' return 2 + minfo = self.weboob.repositories.get_module_info(line) + if not minfo: + print >>sys.stderr, 'Module "%s" does not exist.' % line + return 1 + try: - backend = self.weboob.modules_loader.get_or_load_module(line) + module = self.weboob.modules_loader.get_or_load_module(line) except ModuleLoadError: - backend = None - - if not backend: - print >>sys.stderr, 'Backend "%s" does not exist.' % line - return 1 + module = None print '.------------------------------------------------------------------------------.' - print '| Backend %-68s |' % backend.name + print '| Module %-69s |' % minfo.name print "+-----------------.------------------------------------------------------------'" - print '| Version | %s' % backend.version - print '| Maintainer | %s' % backend.maintainer - print '| License | %s' % backend.license - print '| Description | %s' % backend.description - print '| Capabilities | %s' % ', '.join([cap.__name__ for cap in backend.iter_caps()]) - first = True - for key, field in backend.config.iteritems(): - value = field.label - if not field.default is None: - value += ' (default: %s)' % field.default - if first: - print '| | ' - print '| Configuration | %s: %s' % (key, value) - first = False - else: - print '| | %s: %s' % (key, value) + print '| Version | %s' % minfo.version + print '| Maintainer | %s' % minfo.maintainer + print '| License | %s' % minfo.license + print '| Description | %s' % minfo.description + print '| Capabilities | %s' % ', '.join(minfo.capabilities) + print '| Installed | %s%s' % (('yes' if module else 'no'), ' (new version available)' if self.weboob.repositories.versions.get(minfo.name) > minfo.version else '') + print '| Location | %s' % (minfo.url or os.path.join(minfo.path, minfo.name)) + if module: + first = True + for key, field in module.config.iteritems(): + value = field.label + if not field.default is None: + value += ' (default: %s)' % field.default + if first: + print '| | ' + print '| Configuration | %s: %s' % (key, value) + first = False + else: + print '| | %s: %s' % (key, value) print "'-----------------'" def do_applications(self, line): @@ -254,3 +256,23 @@ def do_applications(self, line): if m and '__init__.py' in files: applications.add(m.group(1)) print ' '.join(sorted(applications)).encode('utf-8') + + def do_update(self, line): + """ + update + + Update weboob. + """ + class Progress(IProgress): + def progress(self, percent, message): + print '=== [%3.0f%%] %s' % (percent*100, message) + + self.weboob.repositories.update(Progress()) + + def do_install(self, line): + """ + install MODULE + + Install a module. + """ + self.install_module(line) diff --git a/weboob/applications/weboobrepos/__init__.py b/weboob/applications/weboobrepos/__init__.py new file mode 100644 index 0000000000..6dc33dae2a --- /dev/null +++ b/weboob/applications/weboobrepos/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010-2012 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +from .weboobrepos import WeboobRepos + +__all__ = ['WeboobRepos'] diff --git a/weboob/applications/weboobrepos/weboobrepos.py b/weboob/applications/weboobrepos/weboobrepos.py new file mode 100644 index 0000000000..67fcc0f7a7 --- /dev/null +++ b/weboob/applications/weboobrepos/weboobrepos.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2012 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +from datetime import datetime +import tarfile +import os +import shutil +import sys +from copy import copy + +from weboob.core.repositories import Repository + +from weboob.tools.application.repl import ReplApplication + + +__all__ = ['WeboobRepos'] + + +class WeboobRepos(ReplApplication): + APPNAME = 'weboob-repos' + VERSION = '0.a' + COPYRIGHT = 'Copyright(C) 2012 Romain Bignon' + DESCRIPTION = "Weboob-repos is a console application to manage a Weboob Repository." + COMMANDS_FORMATTERS = {'backends': 'table', + 'list': 'table', + } + DISABLE_REPL = True + + weboob_commands = copy(ReplApplication.weboob_commands) + weboob_commands.remove('backends') + + def load_default_backends(self): + pass + + def do_create(self, line): + """ + create NAME [PATH] + + Create a new repository. If PATH is missing, create repository + on the current directory. + """ + name, path = self.parse_command_args(line, 2, 1) + if not path: + path = os.getcwd() + else: + path = os.path.realpath(path) + + if not os.path.exists(path): + os.mkdir(path) + elif not os.path.isdir(path): + print u'"%s" is not a directory' % path + return 1 + + r = Repository('http://') + r.name = name + r.maintainer = self.ask('Enter maintainer of the repository') + r.save(os.path.join(path, r.INDEX)) + print u'Repository "%s" created.' % path + + def do_build(self, line): + """ + build SOURCE REPOSITORY + + Build backends contained in SOURCE to REPOSITORY. + + Example: + $ weboob-repos build $HOME/src/weboob/modules /var/www/updates.weboob.org/0.a/ + """ + source_path, repo_path = self.parse_command_args(line, 2, 2) + index_file = os.path.join(repo_path, Repository.INDEX) + + r = Repository('http://') + try: + with open(index_file, 'r') as fp: + r.parse_index(fp) + except IOError, e: + print >>sys.stderr, 'Unable to open repository: %s' % e + print >>sys.stderr, 'Use the "create" command before.' + return 1 + + r.build_index(source_path, index_file) + + for name, module in r.modules.iteritems(): + tarname = os.path.join(repo_path, '%s.tar.gz' % name) + module_path = os.path.join(source_path, name) + if os.path.exists(tarname): + tar_mtime = int(datetime.fromtimestamp(os.path.getmtime(tarname)).strftime('%Y%m%d%H%M')) + if tar_mtime >= module.version: + continue + + print 'Create archive for %s' % name + with tarfile.open(tarname, 'w:gz') as tar: + tar.add(module_path, arcname=name, filter=self._archive_filter) + + # Copy icon. + icon_path = os.path.join(module_path, 'favicon.png') + if os.path.exists(icon_path): + shutil.copy(icon_path, os.path.join(repo_path, '%s.png' % name)) + + def _archive_filter(self, tarinfo): + # Skip *.pyc files in tarballs. + if tarinfo.name.endswith('.pyc'): + return None + # Don't include *.png files in tarball + if tarinfo.name.endswith('.png'): + return None + return tarinfo + diff --git a/weboob/core/modules.py b/weboob/core/modules.py index 29df9a3ea1..bfc374a529 100644 --- a/weboob/core/modules.py +++ b/weboob/core/modules.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Romain Bignon +# Copyright(C) 2010-2012 Romain Bignon # # This file is part of weboob. # @@ -17,9 +17,8 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . - +import sys import logging -import os from weboob.tools.backend import BaseBackend from weboob.tools.log import getLogger @@ -77,7 +76,7 @@ def website(self): return None @property - def icon_path(self): + def icon(self): return self.klass.ICON def iter_caps(self): @@ -97,7 +96,8 @@ def create_instance(self, weboob, instance_name, config, storage): class ModulesLoader(object): - def __init__(self): + def __init__(self, repositories): + self.repositories = repositories self.loaded = {} self.logger = getLogger('modules') @@ -110,15 +110,8 @@ def get_or_load_module(self, module_name): return self.loaded[module_name] def iter_existing_module_names(self): - try: - import weboob.backends - except ImportError: - return - for path in weboob.backends.__path__: - for root, dirs, files in os.walk(path): - if os.path.dirname( root ) == path and '__init__.py' in files: - s = os.path.basename( root ) - yield s + for name in self.repositories.get_all_modules_info().iterkeys(): + yield name def load_all(self): for existing_module_name in self.iter_existing_module_names(): @@ -128,15 +121,26 @@ def load_all(self): self.logger.warning(e) def load_module(self, module_name): - try: - package_name = 'weboob.backends.%s' % module_name - module = Module(__import__(package_name, fromlist=[str(package_name)])) - except Exception, e: - if self.logger.level == logging.DEBUG: - self.logger.exception(e) - raise ModuleLoadError(module_name, e) - if module.name in self.loaded: - self.logger.debug('Module "%s" is already loaded from %s' % (module_name, module.package.__path__[0])) + if module_name in self.loaded: + self.logger.debug('Module "%s" is already loaded from %s' % (module_name, self.loaded[module_name].package.__path__[0])) return - self.loaded[module.name] = module + + minfo = self.repositories.get_module_info(module_name) + if minfo is None: + raise ModuleLoadError(module_name, 'No such module') + if minfo.path is None: + raise ModuleLoadError(module_name, 'Module is not installed') + + try: + sys.path.append(minfo.path) + try: + module = Module(__import__(module_name, fromlist=[str(module_name)])) + except Exception, e: + if self.logger.level == logging.DEBUG: + self.logger.exception(e) + raise ModuleLoadError(module_name, e) + finally: + sys.path.remove(minfo.path) + + self.loaded[module_name] = module self.logger.debug('Loaded module "%s" from %s' % (module_name, module.package.__path__[0])) diff --git a/weboob/core/ouiboube.py b/weboob/core/ouiboube.py index e39c8394ac..a37a969f74 100644 --- a/weboob/core/ouiboube.py +++ b/weboob/core/ouiboube.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Romain Bignon +# Copyright(C) 2010-2012 Romain Bignon # # This file is part of weboob. # @@ -25,6 +25,7 @@ from weboob.core.bcall import BackendsCall from weboob.core.modules import ModulesLoader, ModuleLoadError from weboob.core.backendscfg import BackendsConfig +from weboob.core.repositories import Repositories from weboob.core.scheduler import Scheduler from weboob.tools.backend import BaseBackend from weboob.tools.log import getLogger @@ -34,12 +35,12 @@ class Weboob(object): + VERSION = '0.a' WORKDIR = os.path.join(os.path.expanduser('~'), '.weboob') BACKENDS_FILENAME = 'backends' - def __init__(self, workdir=WORKDIR, backends_filename=None, scheduler=None, storage=None): + def __init__(self, workdir=None, backends_filename=None, scheduler=None, storage=None): self.logger = getLogger('weboob') - self.workdir = workdir self.backend_instances = {} self.callbacks = {'login': lambda backend_name, value: None, 'captcha': lambda backend_name, image: None, @@ -51,17 +52,24 @@ def __init__(self, workdir=WORKDIR, backends_filename=None, scheduler=None, stor self.scheduler = scheduler # Create WORKDIR + if workdir is None: + workdir = os.environ.get('WEBOOB_WORKDIR', self.WORKDIR) + self.workdir = os.path.realpath(workdir) + if not os.path.exists(self.workdir): os.mkdir(self.workdir, 0700) elif not os.path.isdir(self.workdir): self.logger.warning(u'"%s" is not a directory' % self.workdir) + # Repositories management + self.repositories = Repositories(self.workdir, self.VERSION) + # Backends loader - self.modules_loader = ModulesLoader() + self.modules_loader = ModulesLoader(self.repositories) # Backend instances config if not backends_filename: - backends_filename = os.path.join(self.workdir, self.BACKENDS_FILENAME) + backends_filename = os.environ.get('WEBOOB_BACKENDS', os.path.join(self.workdir, self.BACKENDS_FILENAME)) elif not backends_filename.startswith('/'): backends_filename = os.path.join(self.workdir, backends_filename) self.backends_config = BackendsConfig(backends_filename) @@ -100,6 +108,16 @@ def load_backends(self, caps=None, names=None, modules=None, storage=None, error names is not None and instance_name not in names or \ modules is not None and module_name not in modules: continue + + minfo = self.repositories.get_module_info(module_name) + if minfo is None: + self.logger.warning(u'Backend "%s" is referenced in %s but was not found. ' + 'Perhaps a missing repository?' % (module_name, self.backends_config.confpath)) + continue + + if caps is not None and not minfo.has_caps(caps): + continue + module = None try: module = self.modules_loader.get_or_load_module(module_name) @@ -110,8 +128,6 @@ def load_backends(self, caps=None, names=None, modules=None, storage=None, error 'configuration file, but was not found. ' 'Hint: is it installed?' % module_name) continue - if caps is not None and not module.has_caps(caps): - continue if instance_name in self.backend_instances: self.logger.warning(u'Oops, the backend "%s" is already loaded. Unload it before reloading...' % instance_name) diff --git a/weboob/core/repositories.py b/weboob/core/repositories.py new file mode 100644 index 0000000000..255bef0110 --- /dev/null +++ b/weboob/core/repositories.py @@ -0,0 +1,502 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010-2012 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +import tarfile +import posixpath +import shutil +import re +import sys +import os +from datetime import datetime + +from .modules import Module +from weboob.tools.log import getLogger +from weboob.tools.misc import to_unicode +from weboob.tools.browser import StandardBrowser, BrowserUnavailable +from ConfigParser import RawConfigParser, DEFAULTSECT + +class ModuleInfo(object): + def __init__(self, name): + self.name = name + + # path to the local directory containing this module. + self.path = None + self.url = None + + self.version = 0 + self.capabilities = () + self.description = u'' + self.maintainer = u'' + self.license = u'' + self.icon = u'' + self.urls = u'' + + def load(self, items): + self.version = int(items['version']) + self.capabilities = items['capabilities'].split() + self.description = to_unicode(items['description']) + self.maintainer = to_unicode(items['maintainer']) + self.license = to_unicode(items['license']) + self.icon = items['icon'] + self.urls = items['urls'] + + def has_caps(self, caps): + if not isinstance(caps, (list,tuple)): + caps = [caps] + for c in caps: + if type(c) == type: + c = c.__name__ + if c in self.capabilities: + return True + return False + + def is_installed(self): + return self.path is not None + + def is_local(self): + return self.url is None + + def dump(self): + return (('version', self.version), + ('capabilities', ' '.join(self.capabilities)), + ('description', self.description), + ('maintainer', self.maintainer), + ('license', self.license), + ('icon', self.icon), + ('urls', self.urls), + ) + +class RepositoryUnavailable(Exception): + pass + +class Repository(object): + INDEX = 'modules.list' + + def __init__(self, url): + self.url = url + self.name = u'' + self.update = 0 + self.maintainer = u'' + self.local = None + + self.modules = {} + + if self.url.startswith('file://'): + self.local = True + elif re.match('https?://.*', self.url): + self.local = False + else: + # This is probably a file in ~/.weboob/repositories/, we + # don't know if this is a local or a remote repository. + with open(self.url, 'r') as fp: + self.parse_index(fp) + + def localurl2path(self): + """ + Get a local path of a file:// URL. + """ + assert self.local == True + + if self.url.startswith('file://'): + return self.url[len('file://'):] + return self.url + + def retrieve_index(self, dest_path): + """ + Retrieve the index file of this repository. It can use network + if this is a remote repository. + + @param dest_path [str] path to save the downloaded index file. + """ + if self.local: + # Repository is local, open the file. + filename = os.path.join(self.localurl2path(), self.INDEX) + try: + fp = open(filename, 'r') + except IOError, e: + # This local repository doesn't contain a built modules.list index. + self.name = self.url.replace(os.path.sep, '_') + self.build_index(self.localurl2path(), filename) + fp = open(filename, 'r') + else: + # This is a remote repository, download file + browser = StandardBrowser() + try: + fp = browser.openurl(posixpath.join(self.url, self.INDEX)) + except BrowserUnavailable, e: + raise RepositoryUnavailable(unicode(e)) + + self.parse_index(fp) + + if self.local: + # Always rebuild index of a local repository. + self.build_index(self.localurl2path(), filename) + + # Save the repository index in ~/.weboob/repositories/ + self.save(dest_path, private=True) + + def parse_index(self, fp): + """ + Parse index of a repository + + @param fp [buffer] file descriptor to read + """ + config = RawConfigParser() + config.readfp(fp) + + # Read default parameters + items = dict(config.items(DEFAULTSECT)) + try: + self.name = items['name'] + self.update = int(items['update']) + self.maintainer = items['maintainer'] + except KeyError, e: + raise RepositoryUnavailable('Missing global parameters in repository: %s' % e) + except ValueError, e: + raise RepositoryUnavailable('Incorrect value in repository parameters: %s' % e) + + if len(self.name) == 0: + raise RepositoryUnavailable('Name is empty') + + if 'url' in items: + self.url = items['url'] + self.local = self.url.startswith('file://') + elif self.local is None: + raise RepositoryUnavailable('Missing "url" key in settings') + + # Load modules + self.modules.clear() + for section in config.sections(): + module = ModuleInfo(section) + module.load(dict(config.items(section))) + if not self.local: + module.url = posixpath.join(self.url, '%s.tar.gz' % module.name) + self.modules[section] = module + + def build_index(self, path, filename): + """ + Rebuild index of modules of repository. + + @param path [str] path of the repository + @param filename [str] file to save index + """ + print 'Rebuild index' + self.modules.clear() + + sys.path.append(path) + for name in sorted(os.listdir(path)): + module_path = os.path.join(path, name) + if not os.path.isdir(module_path) or '.' in name: + continue + + try: + module = Module(__import__(name, fromlist=[str(name)])) + except Exception, e: + print 'ERROR: %s' % e + else: + m = ModuleInfo(module.name) + m.version = int(datetime.fromtimestamp(os.path.getmtime(module_path)).strftime('%Y%m%d%H%M')) + m.capabilities = [c.__name__ for c in module.iter_caps()] + m.description = module.description + m.maintainer = module.maintainer + m.license = module.license + m.icon = module.icon or '' + self.modules[module.name] = m + sys.path.remove(path) + + self.update = int(datetime.now().strftime('%Y%m%d%H%M')) + self.save(filename) + + def save(self, filename, private=False): + """ + Save repository into a file (modules.list for example). + + @param filename [str] path to file to save repository. + @param private [bool] if enabled, save URL of repository. + """ + config = RawConfigParser() + config.set(DEFAULTSECT, 'name', self.name) + config.set(DEFAULTSECT, 'update', self.update) + config.set(DEFAULTSECT, 'maintainer', self.maintainer) + if private: + config.set(DEFAULTSECT, 'url', self.url) + + for module in self.modules.itervalues(): + config.add_section(module.name) + for key, value in module.dump(): + config.set(module.name, key, to_unicode(value).encode('utf-8')) + + with open(filename, 'wb') as f: + config.write(f) + +class Versions(object): + VERSIONS_LIST = 'versions.list' + + def __init__(self, path): + self.path = path + self.versions = {} + + try: + with open(os.path.join(self.path, self.VERSIONS_LIST), 'r') as fp: + config = RawConfigParser() + config.readfp(fp) + + # Read default parameters + for key, value in config.items(DEFAULTSECT): + self.versions[key] = int(value) + except IOError: + pass + + def get(self, name): + return self.versions.get(name, None) + + def set(self, name, version): + self.versions[name] = int(version) + self.save() + + def save(self): + config = RawConfigParser() + for name, version in self.versions.iteritems(): + config.set(DEFAULTSECT, name, version) + with open(os.path.join(self.path, self.VERSIONS_LIST), 'wb') as fp: + config.write(fp) + +class IProgress: + def progress(self, percent, message): + pass + +class ModuleInstallError(Exception): + pass + +DEFAULT_SOURCES_LIST = \ +"""# List of Weboob repositories + +http://updates.weboob.org/%(version)s/main/ +# To enable NSFW backends, uncomment the following line: +#http://updates.weboob.org/%(version)s/nsfw/ + +# DEVELOPMENT +# If you want to hack on Weboob backends, you may add a reference +# to sources, for example: +#file:///home/rom1/src/weboob/modules/ +""" + +class Repositories(object): + SOURCES_LIST = 'sources.list' + MODULES_DIR = 'modules' + REPOSITORIES_DIR = 'repositories' + ICONS_DIR = 'icons' + + def __init__(self, workdir, version): + self.logger = getLogger('repositories') + self.version = version + self.workdir = workdir + self.sources_list = os.path.join(self.workdir, self.SOURCES_LIST) + self.modules_dir = os.path.join(self.workdir, self.MODULES_DIR) + self.repos_dir = os.path.join(self.workdir, self.REPOSITORIES_DIR) + self.icons_dir = os.path.join(self.workdir, self.ICONS_DIR) + + self.create_dir(self.repos_dir) + self.create_dir(self.modules_dir) + self.create_dir(self.icons_dir) + + self.versions = Versions(self.modules_dir) + + self.repositories = [] + + if not os.path.exists(self.sources_list): + with open(self.sources_list, 'w') as f: + f.write(DEFAULT_SOURCES_LIST) + self.update() + else: + self.load() + + def create_dir(self, name): + if not os.path.exists(name): + os.mkdir(name) + elif not os.path.isdir(name): + self.logger.warning(u'"%s" is not a directory' % name) + + def _extend_module_info(self, repos, info): + if repos.local: + info.path = repos.localurl2path() + elif self.versions.get(info.name) is not None: + info.path = self.modules_dir + return info + + def get_all_modules_info(self, caps=None): + """ + Get all ModuleInfo instances available. + + @param caps [list(str)] Filter on capabilities. + @return [dict(ModuleInfo)] + """ + modules = {} + for repos in reversed(self.repositories): + for name, info in repos.modules.iteritems(): + if not name in modules and (not caps or info.has_caps(caps)): + modules[name] = self._extend_module_info(repos, info) + return modules + + def get_module_info(self, name): + """ + Get ModuleInfo object of a module. + + It tries all repositories from last to first, and set + the 'path' attribute of ModuleInfo if it is installed. + """ + for repos in reversed(self.repositories): + if name in repos.modules: + m = repos.modules[name] + self._extend_module_info(repos, m) + return m + return None + + def load(self): + """ + Load repositories from ~/.weboob/repositories/. + """ + self.repositories = [] + for name in os.listdir(self.repos_dir): + repository = Repository(os.path.join(self.repos_dir, name)) + self.repositories.append(repository) + + def retrieve_icon(self, module): + """ + Retrieve the icon of a module and save it in ~/.weboob/icons/. + """ + if not isinstance(module, ModuleInfo): + module = self.get_module_info(module) + + dest_path = os.path.join(self.icons_dir, '%s.png' % module.name) + + if module.is_local(): + icon_path = os.path.join(module.path, module.name, 'favicon.png') + if module.path and os.path.exists(icon_path): + shutil.copy(icon_path, dest_path) + return + + if module.icon: + icon_url = module.icon + else: + icon_url = module.url.replace('.tar.gz', '.png') + + browser = StandardBrowser() + try: + icon = browser.openurl(icon_url) + except BrowserUnavailable: + pass # no icon, no problem + else: + with open(dest_path, 'wb') as fp: + fp.write(icon.read()) + + def update(self, progress=IProgress()): + """ + Update list of repositories by downloading them + and put them in ~/.weboob/repositories/. + + @param progress [IProgress] observer object. + """ + self.repositories = [] + for name in os.listdir(self.repos_dir): + os.remove(os.path.join(self.repos_dir, name)) + + with open(self.sources_list, 'r') as f: + for line in f.xreadlines(): + line = line.strip() % {'version': self.version} + m = re.match('(file|https?)://.*', line) + if m: + print 'Getting %s' % line + repository = Repository(line) + dest_path = os.path.join(self.repos_dir, '%02d-%s' % (len(self.repositories), + repository.url.replace(os.path.sep, '_'))) + try: + repository.retrieve_index(dest_path) + except RepositoryUnavailable, e: + print 'Error: %s' % e + else: + self.repositories.append(repository) + + to_update = [] + for name, info in self.get_all_modules_info().iteritems(): + if not info.is_local() and info.is_installed(): + to_update.append(info) + + class InstallProgress(IProgress): + def __init__(self, n): + self.n = n + + def progress(self, percent, message): + progress.progress(float(self.n)/len(to_update) + 1.0/len(to_update)*percent, message) + + for n, info in enumerate(to_update): + inst_progress = InstallProgress(n) + try: + self.install(info, inst_progress) + except ModuleInstallError, e: + inst_progress.progress(1.0, unicode(e)) + + def install(self, module, progress=IProgress()): + """ + Install a module. + + @paran module [str,ModuleInfo] module to install. + @param progress [IProgress] observer object. + """ + if isinstance(module, ModuleInfo): + info = module + elif isinstance(module, basestring): + progress.progress(0.0, 'Looking for module %s' % module) + info = self.get_module_info(module) + if not info: + raise ModuleInstallError('Module "%s" does not exist' % module) + else: + raise ValueError('"module" parameter might be a ModuleInfo object or a string, not %r' % module) + + if info.is_local(): + raise ModuleInstallError('%s is available on local.' % info.name) + + installed = self.versions.get(info.name) + if installed is None: + progress.progress(0.3, 'Module is not installed yet') + elif info.version > installed: + progress.progress(0.3, 'A new version of this module is available') + else: + raise ModuleInstallError('The last version is already installed') + + browser = StandardBrowser() + progress.progress(0.2, 'Downloading module...') + try: + fp = browser.openurl(info.url) + except BrowserUnavailable, e: + raise ModuleInstallError('Unable to fetch module: %s' % e) + + progress.progress(0.7, 'Setting up module...') + + # Extract module from tarball. + with tarfile.open('', 'r:gz', fp) as tar: + tar.extractall(self.modules_dir) + + self.versions.set(info.name, info.version) + + progress.progress(0.9, 'Downloading icon...') + self.retrieve_icon(info) + + progress.progress(1.0, 'Module %s has been installed!' % info.name) diff --git a/weboob/tools/application/base.py b/weboob/tools/application/base.py index 63aecf5eb4..c535681e91 100644 --- a/weboob/tools/application/base.py +++ b/weboob/tools/application/base.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Romain Bignon, Christophe Benz +# Copyright(C) 2010-2012 Romain Bignon, Christophe Benz # # This file is part of weboob. # @@ -75,8 +75,8 @@ class BaseApplication(object): # Application name APPNAME = '' - # Configuration and work directory (default: ~/.weboob/) - CONFDIR = os.path.join(os.path.expanduser('~'), '.weboob') + # Configuration and work directory (if None, use the Weboob instance one) + CONFDIR = None # Default configuration dict (can only contain key/values) CONFIG = {} # Default storage tree @@ -128,6 +128,8 @@ def handle_application_options(self): def __init__(self, option_parser=None): self.logger = getLogger(self.APPNAME) self.weboob = self.create_weboob() + if self.CONFDIR is None: + self.CONFDIR = self.weboob.workdir self.config = None self.options = None if option_parser is None: diff --git a/weboob/tools/application/console.py b/weboob/tools/application/console.py index 6de85efc9d..495564b8ca 100644 --- a/weboob/tools/application/console.py +++ b/weboob/tools/application/console.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Christophe Benz, Romain Bignon +# Copyright(C) 2010-2012 Christophe Benz, Romain Bignon # # This file is part of weboob. # @@ -28,6 +28,7 @@ from weboob.capabilities.account import ICapAccount, Account, AccountRegisterError from weboob.core.backendscfg import BackendAlreadyExists from weboob.core.modules import ModuleLoadError +from weboob.core.repositories import IProgress, ModuleInstallError from weboob.tools.browser import BrowserUnavailable, BrowserIncorrectPassword from weboob.tools.value import Value, ValueBool, ValueFloat, ValueInt from weboob.tools.misc import to_unicode @@ -84,8 +85,8 @@ def unload_backends(self, *args, **kwargs): pass return unloaded - def is_backend_loadable(self, backend): - return self.CAPS is None or self.caps_included(backend.iter_caps(), self.CAPS.__name__) + def is_module_loadable(self, info): + return self.CAPS is None or info.has_caps(self.CAPS) def load_backends(self, *args, **kwargs): if 'errors' in kwargs: @@ -118,15 +119,14 @@ def check_loaded_backends(self, default_config=None): return True def prompt_create_backends(self, default_config=None): - self.weboob.modules_loader.load_all() r = '' while r != 'q': - backends = [] - print '\nAvailable backends:' - for name, backend in sorted(self.weboob.modules_loader.loaded.iteritems()): - if not self.is_backend_loadable(backend): + modules = [] + print '\nAvailable modules:' + for name, info in sorted(self.weboob.repositories.get_all_modules_info().iteritems()): + if not self.is_module_loadable(info): continue - backends.append(name) + modules.append(name) loaded = ' ' for bi in self.weboob.iter_backends(): if bi.NAME == name: @@ -136,17 +136,17 @@ def prompt_create_backends(self, default_config=None): loaded = 2 else: loaded += 1 - print '%s%d)%s [%s] %s%-15s%s %s' % (self.BOLD, len(backends), self.NC, loaded, - self.BOLD, name, self.NC, backend.description) + print '%s%d)%s [%s] %s%-15s%s %s' % (self.BOLD, len(modules), self.NC, loaded, + self.BOLD, name, self.NC, info.description) print '%sq)%s --stop--\n' % (self.BOLD, self.NC) - r = self.ask('Select a backend to add (q to stop)', regexp='^(\d+|q)$') + r = self.ask('Select a backend to create (q to stop)', regexp='^(\d+|q)$') if str(r).isdigit(): i = int(r) - 1 - if i < 0 or i >= len(backends): + if i < 0 or i >= len(modules): print >>sys.stderr, 'Error: %s is not a valid choice' % r continue - name = backends[i] + name = modules[i] try: inst = self.add_backend(name, default_config) if inst: @@ -195,15 +195,6 @@ def parse_id(self, _id, unique_backend=False): raise BackendNotFound(backend_name) return _id, backend_name - def caps_included(self, modcaps, caps): - modcaps = [x.__name__ for x in modcaps] - if not isinstance(caps, (list,set,tuple)): - caps = (caps,) - for cap in caps: - if not cap in modcaps: - return False - return True - # user interaction related methods def register_backend(self, name, ask_add=True): @@ -258,6 +249,19 @@ def register_backend(self, name, ask_add=True): return backend_config + def install_module(self, name): + class Progress(IProgress): + def progress(self, percent, message): + print '=== %s' % message + + try: + self.weboob.repositories.install(name, Progress()) + except ModuleInstallError, e: + print >>sys.stderr, 'Unable to install module "%s": %s' % (name, e) + return 1 + + print '' + def edit_backend(self, name, params=None): return self.add_backend(name, params, True) @@ -265,26 +269,29 @@ def add_backend(self, name, params=None, edit=False, ask_register=True): if params is None: params = {} - backend = None + module = None config = None - if not edit: - try: - backend = self.weboob.modules_loader.get_or_load_module(name) - config = backend.config - except ModuleLoadError: - backend = None - else: - bname, items = self.weboob.backends_config.get_backend(name) - try: - backend = self.weboob.modules_loader.get_or_load_module(bname) - except ModuleLoadError: - backend = None + try: + if not edit: + minfo = self.weboob.repositories.get_module_info(name) + if minfo is None: + raise ModuleLoadError(name, 'Module does not exist') + if not minfo.is_installed(): + print 'Module "%s" is available but not installed.' % minfo.name + if self.ask('Do you want to install it now?', default=True): + self.install_module(minfo) + else: + return 1 + module = self.weboob.modules_loader.get_or_load_module(name) + config = module.config else: + bname, items = self.weboob.backends_config.get_backend(name) + module = self.weboob.modules_loader.get_or_load_module(bname) items.update(params) params = items - config = backend.config.load(self.weboob, bname, name, params, nofail=True) - if not backend: - print >>sys.stderr, 'Backend "%s" does not exist. Hint: use the "backends" command.' % name + config = module.config.load(self.weboob, bname, name, params, nofail=True) + except ModuleLoadError: + print >>sys.stderr, 'Module "%s" does not exist. Hint: use the "modules" command.' % name return 1 # ask for params non-specified on command-line arguments @@ -303,20 +310,20 @@ def add_backend(self, name, params=None, edit=False, ask_register=True): while not edit and self.weboob.backends_config.backend_exists(name): print >>sys.stderr, 'Backend instance "%s" already exists in "%s"' % (name, self.weboob.backends_config.confpath) - if not self.ask('Add new instance of "%s" backend?' % backend.name, default=False): + if not self.ask('Add new backend for module "%s"?' % module.name, default=False): return 1 - name = self.ask('Please give new instance name (could be "%s_1")' % backend.name, regexp=r'^[\w\-_]+$') + name = self.ask('Please give new instance name' % module.name, default='%s2' % name, regexp=r'^[\w\-_]+$') try: - config = config.load(self.weboob, backend.name, name, params, nofail=True) + config = config.load(self.weboob, module.name, name, params, nofail=True) for key, value in params.iteritems(): config[key].set(value) config.save(edit=edit) print 'Backend "%s" successfully added.' % name return name except BackendAlreadyExists: - print >>sys.stderr, 'Instance "%s" already exists.' % name + print >>sys.stderr, 'Backend "%s" already exists.' % name return 1 def ask(self, question, default=None, masked=False, regexp=None, choices=None): diff --git a/weboob/tools/application/qt/backendcfg.py b/weboob/tools/application/qt/backendcfg.py index 669f7f71fe..99b2f300b9 100644 --- a/weboob/tools/application/qt/backendcfg.py +++ b/weboob/tools/application/qt/backendcfg.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Romain Bignon +# Copyright(C) 2010-2012 Romain Bignon # # This file is part of weboob. # @@ -21,17 +21,20 @@ from PyQt4.QtGui import QDialog, QTreeWidgetItem, QLabel, QFormLayout, \ QMessageBox, QPixmap, QImage, QIcon, QHeaderView, \ QListWidgetItem, QTextDocument, QVBoxLayout, \ - QDialogButtonBox + QDialogButtonBox, QProgressDialog from PyQt4.QtCore import SIGNAL, Qt, QVariant, QUrl import re +import os from logging import warning from weboob.core.modules import ModuleLoadError +from weboob.core.repositories import IProgress, ModuleInstallError from weboob.core.backendscfg import BackendAlreadyExists from weboob.capabilities.account import ICapAccount, Account, AccountRegisterError from weboob.tools.application.qt.backendcfg_ui import Ui_BackendCfg from weboob.tools.ordereddict import OrderedDict +from weboob.tools.misc import to_unicode from .qt import QtValue @@ -41,7 +44,7 @@ def __init__(self, weboob, caps=None, parent=None): self.ui = Ui_BackendCfg() self.ui.setupUi(self) - self.ui.configuredBackendsList.sortByColumn(0, Qt.AscendingOrder) + self.ui.backendsList.sortByColumn(0, Qt.AscendingOrder) self.to_unload = set() self.to_load = set() @@ -57,29 +60,23 @@ def __init__(self, weboob, caps=None, parent=None): # is_enabling is a counter to prevent race conditions. self.is_enabling = 0 - self.weboob.modules_loader.load_all() - - self.ui.configuredBackendsList.header().setResizeMode(QHeaderView.ResizeToContents) + self.ui.backendsList.header().setResizeMode(QHeaderView.ResizeToContents) self.ui.configFrame.hide() self.icon_cache = {} - for name, backend in reversed(sorted(list(self.weboob.modules_loader.loaded.iteritems()))): - if not self.caps or backend.has_caps(*self.caps): - item = QListWidgetItem(name.capitalize()) - - if backend.icon_path: - item.setIcon(self.get_icon_cache(backend.icon_path)) + for name, module in sorted(self.weboob.repositories.get_all_modules_info(self.caps).iteritems()): + item = QListWidgetItem(name.capitalize()) + self.set_icon(item, module) + self.ui.modulesList.addItem(item) - self.ui.backendsList.addItem(item) + self.loadBackendsList() - self.loadConfiguredBackendsList() - - self.connect(self.ui.configuredBackendsList, SIGNAL('itemClicked(QTreeWidgetItem *, int)'), - self.configuredBackendClicked) - self.connect(self.ui.configuredBackendsList, SIGNAL('itemChanged(QTreeWidgetItem *, int)'), - self.configuredBackendEnabled) - self.connect(self.ui.backendsList, SIGNAL('itemSelectionChanged()'), self.backendSelectionChanged) + self.connect(self.ui.backendsList, SIGNAL('itemClicked(QTreeWidgetItem *, int)'), + self.backendClicked) + self.connect(self.ui.backendsList, SIGNAL('itemChanged(QTreeWidgetItem *, int)'), + self.backendEnabled) + self.connect(self.ui.modulesList, SIGNAL('itemSelectionChanged()'), self.moduleSelectionChanged) self.connect(self.ui.proxyBox, SIGNAL('toggled(bool)'), self.proxyEditEnabled) self.connect(self.ui.addButton, SIGNAL('clicked()'), self.addEvent) self.connect(self.ui.removeButton, SIGNAL('clicked()'), self.removeEvent) @@ -93,27 +90,66 @@ def get_icon_cache(self, path): self.icon_cache[path] = QIcon(QPixmap.fromImage(img)) return self.icon_cache[path] - def loadConfiguredBackendsList(self): - self.ui.configuredBackendsList.clear() - for instance_name, name, params in self.weboob.backends_config.iter_backends(): - try: - backend = self.weboob.modules_loader.get_or_load_module(name) - except ModuleLoadError: - backend = None + def set_icon(self, item, minfo): + icon_path = os.path.join(self.weboob.repositories.icons_dir, '%s.png' % minfo.name) + + icon = self.icon_cache.get(icon_path, None) + if icon is None: + if not os.path.exists(icon_path): + self.weboob.repositories.retrieve_icon(minfo) + if not os.path.exists(icon_path): + return + + icon = self.get_icon_cache(icon_path) + + try: + item.setIcon(icon) + except TypeError: + item.setIcon(0, icon) + + def askInstallModule(self, minfo): + reply = QMessageBox.question(self, self.tr('Install a module'), + unicode(self.tr("Module %s is not installed. Do you want to install it?")) % minfo.name, + QMessageBox.Yes|QMessageBox.No) + + if reply != QMessageBox.Yes: + return False - if not backend or self.caps and not backend.has_caps(*self.caps): + return self.installModule(minfo) + + def installModule(self, minfo): + pd = QProgressDialog('Installation of %s' % minfo.name, "Cancel", 0, 100, self) + pd.setWindowModality(Qt.WindowModal) + class Progress(IProgress): + def progress(self, percent, message): + pd.setValue(int(percent*100)) + pd.setLabelText(message) + + try: + self.weboob.repositories.install(minfo, Progress()) + except ModuleInstallError, err: + QMessageBox.critical(self, self.tr('Install error'), + unicode(self.tr('Unable to install mode %s: %s' % (minfo.name, err))), + QMessageBox.Ok) + pd.setValue(100) + return True + + def loadBackendsList(self): + self.ui.backendsList.clear() + for instance_name, name, params in self.weboob.backends_config.iter_backends(): + info = self.weboob.repositories.get_module_info(name) + if not info or (self.caps and not info.has_caps(self.caps)): continue item = QTreeWidgetItem(None, [instance_name, name]) item.setCheckState(0, Qt.Checked if params.get('_enabled', '1').lower() in ('1', 'y', 'true') \ else Qt.Unchecked) - if backend.icon_path: - item.setIcon(0, self.get_icon_cache(backend.icon_path)) + self.set_icon(item, info) - self.ui.configuredBackendsList.addTopLevelItem(item) + self.ui.backendsList.addTopLevelItem(item) - def configuredBackendEnabled(self, item, col): + def backendEnabled(self, item, col): self.is_enabling += 1 instname = unicode(item.text(0)) @@ -131,7 +167,7 @@ def configuredBackendEnabled(self, item, col): self.weboob.backends_config.edit_backend(instname, bname, {'_enabled': enabled}) - def configuredBackendClicked(self, item, col): + def backendClicked(self, item, col): if self.is_enabling: self.is_enabling -= 1 return @@ -144,7 +180,7 @@ def addEvent(self): self.editBackend() def removeEvent(self): - item = self.ui.configuredBackendsList.currentItem() + item = self.ui.backendsList.currentItem() if not item: return @@ -163,7 +199,7 @@ def removeEvent(self): except KeyError: pass self.ui.configFrame.hide() - self.loadConfiguredBackendsList() + self.loadBackendsList() def editBackend(self, name=None): self.ui.registerButton.hide() @@ -172,12 +208,12 @@ def editBackend(self, name=None): if name is not None: bname, params = self.weboob.backends_config.get_backend(name) - items = self.ui.backendsList.findItems(bname, Qt.MatchFixedString) + items = self.ui.modulesList.findItems(bname, Qt.MatchFixedString) if not items: warning('Backend not found') else: - self.ui.backendsList.setCurrentItem(items[0]) - self.ui.backendsList.setEnabled(False) + self.ui.modulesList.setCurrentItem(items[0]) + self.ui.modulesList.setEnabled(False) self.ui.nameEdit.setText(name) self.ui.nameEdit.setEnabled(False) @@ -191,23 +227,26 @@ def editBackend(self, name=None): params.pop('_enabled', None) - backend = self.weboob.modules_loader.loaded[bname] - for key, value in backend.config.load(self.weboob, bname, name, params, nofail=True).iteritems(): - try: - l, widget = self.config_widgets[key] - except KeyError: - warning('Key "%s" is not found' % key) - else: - widget.set_value(value) - else: - self.ui.nameEdit.clear() - self.ui.nameEdit.setEnabled(True) - self.ui.proxyBox.setChecked(False) - self.ui.proxyEdit.clear() - self.ui.backendsList.setEnabled(True) - self.ui.backendsList.setCurrentRow(-1) - - def backendSelectionChanged(self): + info = self.weboob.repositories.get_module_info(name) + if info.is_installed() or self.askInstallModule(info): + backend = self.weboob.modules_loader.get_or_load_module(bname) + for key, value in backend.config.load(self.weboob, bname, name, params, nofail=True).iteritems(): + try: + l, widget = self.config_widgets[key] + except KeyError: + warning('Key "%s" is not found' % key) + else: + widget.set_value(value) + return + + self.ui.nameEdit.clear() + self.ui.nameEdit.setEnabled(True) + self.ui.proxyBox.setChecked(False) + self.ui.proxyEdit.clear() + self.ui.modulesList.setEnabled(True) + self.ui.modulesList.setCurrentRow(-1) + + def moduleSelectionChanged(self): for key, (label, value) in self.config_widgets.iteritems(): label.hide() value.hide() @@ -216,48 +255,57 @@ def backendSelectionChanged(self): label.deleteLater() value.deleteLater() self.config_widgets = {} - self.ui.backendInfo.clear() + self.ui.moduleInfo.clear() - selection = self.ui.backendsList.selectedItems() + selection = self.ui.modulesList.selectedItems() if not selection: return - backend = self.weboob.modules_loader.loaded[unicode(selection[0].text()).lower()] + minfo = self.weboob.repositories.get_module_info(unicode(selection[0].text()).lower()) + if not minfo: + warning('Module not found') + return + + if not minfo.is_installed() and not self.askInstallModule(minfo): + self.editBackend(None) + return + + module = self.weboob.modules_loader.get_or_load_module(minfo.name) - if backend.icon_path: - img = QImage(backend.icon_path) - self.ui.backendInfo.document().addResource(QTextDocument.ImageResource, QUrl('mydata://logo.png'), - QVariant(img)) + icon_path = os.path.join(self.weboob.repositories.icons_dir, '%s.png' % minfo.name) + img = QImage(icon_path) + self.ui.moduleInfo.document().addResource(QTextDocument.ImageResource, QUrl('mydata://logo.png'), + QVariant(img)) - if not backend.name in [n for n, ign, ign2 in self.weboob.backends_config.iter_backends()]: - self.ui.nameEdit.setText(backend.name) + if not module.name in [n for n, ign, ign2 in self.weboob.backends_config.iter_backends()]: + self.ui.nameEdit.setText(module.name) else: self.ui.nameEdit.setText('') - self.ui.backendInfo.setText(unicode(self.tr( - '

%s Backend %s

' + self.ui.moduleInfo.setText(to_unicode(self.tr( + u'

%s Module %s

' 'Version: %s
' 'Maintainer: %s
' 'License: %s
' '%s' 'Description: %s
' 'Capabilities: %s
')) - % ('' if backend.icon_path else '', - backend.name.capitalize(), - backend.version, - backend.maintainer.replace('&', '&').replace('<', '<').replace('>', '>'), - backend.license, - (unicode(self.tr('Website: %s
')) % backend.website) if backend.website else '', - backend.description, - ', '.join(sorted(cap.__name__.replace('ICap', '') for cap in backend.iter_caps())))) - - if backend.has_caps(ICapAccount) and self.ui.nameEdit.isEnabled() and \ - backend.klass.ACCOUNT_REGISTER_PROPERTIES is not None: + % ('', + module.name.capitalize(), + module.version, + to_unicode(module.maintainer).replace(u'&', u'&').replace(u'<', u'<').replace(u'>', u'>'), + module.license, + (unicode(self.tr('Website: %s
')) % module.website) if module.website else '', + module.description, + ', '.join(sorted(cap.__name__.replace('ICap', '') for cap in module.iter_caps())))) + + if module.has_caps(ICapAccount) and self.ui.nameEdit.isEnabled() and \ + module.klass.ACCOUNT_REGISTER_PROPERTIES is not None: self.ui.registerButton.show() else: self.ui.registerButton.hide() - for key, field in backend.config.iteritems(): + for key, field in module.config.iteritems(): label = QLabel(u'%s:' % field.label) qvalue = QtValue(field) self.ui.configLayout.addRow(label, qvalue) @@ -268,21 +316,21 @@ def proxyEditEnabled(self, state): def acceptBackend(self): bname = unicode(self.ui.nameEdit.text()) - selection = self.ui.backendsList.selectedItems() + selection = self.ui.modulesList.selectedItems() if not selection: - QMessageBox.critical(self, self.tr('Unable to add a configured backend'), - self.tr('Please select a backend')) + QMessageBox.critical(self, self.tr('Unable to add a backend'), + self.tr('Please select a module')) return try: - backend = self.weboob.modules_loader.get_or_load_module(unicode(selection[0].text()).lower()) + module = self.weboob.modules_loader.get_or_load_module(unicode(selection[0].text()).lower()) except ModuleLoadError: - backend = None + module = None - if not backend: - QMessageBox.critical(self, self.tr('Unable to add a configured backend'), - self.tr('The selected backend does not exist.')) + if not module: + QMessageBox.critical(self, self.tr('Unable to add a backend'), + self.tr('The selected module does not exist.')) return params = {} @@ -307,7 +355,7 @@ def acceptBackend(self): QMessageBox.critical(self, self.tr('Missing field'), self.tr('Please specify a proxy URL')) return - config = backend.config.load(self.weboob, backend.name, bname, {}, nofail=True) + config = module.config.load(self.weboob, module.name, bname, {}, nofail=True) for key, field in config.iteritems(): label, qtvalue = self.config_widgets[key] @@ -330,34 +378,34 @@ def acceptBackend(self): self.to_load.add(bname) self.ui.configFrame.hide() - self.loadConfiguredBackendsList() + self.loadBackendsList() def rejectBackend(self): self.ui.configFrame.hide() def registerEvent(self): - selection = self.ui.backendsList.selectedItems() + selection = self.ui.modulesList.selectedItems() if not selection: return try: - backend = self.weboob.modules_loader.get_or_load_module(unicode(selection[0].text()).lower()) + module = self.weboob.modules_loader.get_or_load_module(unicode(selection[0].text()).lower()) except ModuleLoadError: - backend = None + module = None - if not backend: + if not module: return dialog = QDialog(self) vbox = QVBoxLayout(dialog) - if backend.website: - website = 'on the website %s' % backend.website + if module.website: + website = 'on the website %s' % module.website else: - website = 'with the backend %s' % backend.name + website = 'with the module %s' % module.name vbox.addWidget(QLabel('To create an account %s, please give these informations:' % website)) formlayout = QFormLayout() props_widgets = OrderedDict() - for key, prop in backend.klass.ACCOUNT_REGISTER_PROPERTIES.iteritems(): + for key, prop in module.klass.ACCOUNT_REGISTER_PROPERTIES.iteritems(): widget = QtValue(prop) formlayout.addRow(QLabel(u'%s:' % prop.label), widget) props_widgets[prop.id] = widget @@ -387,7 +435,7 @@ def registerEvent(self): account.properties[key] = v if end: try: - backend.klass.register_account(account) + module.klass.register_account(account) except AccountRegisterError, e: QMessageBox.critical(self, self.tr('Error during register'), unicode(self.tr('Unable to register account %s:

%s')) % (website, e)) diff --git a/weboob/tools/application/qt/backendcfg.ui b/weboob/tools/application/qt/backendcfg.ui index 7ad8e7df96..048043c461 100644 --- a/weboob/tools/application/qt/backendcfg.ui +++ b/weboob/tools/application/qt/backendcfg.ui @@ -22,14 +22,14 @@ - + QAbstractItemView::NoEditTriggers - 48 - 48 + 24 + 24 @@ -59,12 +59,6 @@ true - - false - - - true - Name @@ -72,7 +66,7 @@ - Backend + Module @@ -131,12 +125,12 @@ - Available backends + Available modules: - + 0 @@ -145,8 +139,8 @@ - 32 - 32 + 24 + 24 @@ -175,7 +169,7 @@ - + 0 @@ -192,13 +186,6 @@ QFormLayout::ExpandingFieldsGrow - - - - Name: - - - @@ -223,6 +210,13 @@ + + + + Name: + + + @@ -252,11 +246,11 @@ - configuredBackendsList + backendsList addButton removeButton - backendsList - backendInfo + modulesList + moduleInfo nameEdit proxyBox proxyEdit diff --git a/weboob/tools/application/repl.py b/weboob/tools/application/repl.py index 0704a6d535..c7009a4acd 100644 --- a/weboob/tools/application/repl.py +++ b/weboob/tools/application/repl.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Christophe Benz, Romain Bignon +# Copyright(C) 2010-2012 Christophe Benz, Romain Bignon # # This file is part of weboob. # @@ -28,7 +28,6 @@ from weboob.capabilities.base import FieldNotFound, CapBaseObject from weboob.core import CallErrors -from weboob.core.modules import ModuleLoadError from weboob.tools.application.formatters.iformatter import MandatoryFieldsNotFound from weboob.tools.misc import to_unicode from weboob.tools.path import Path @@ -498,10 +497,8 @@ def complete_backends(self, text, line, begidx, endidx): elif args[1] == 'disable': choices = sorted(enabled_backends_names) elif args[1] in ('add', 'register') and len(args) == 3: - self.weboob.modules_loader.load_all() - for name, module in sorted(self.weboob.modules_loader.loaded.iteritems()): - if not self.CAPS or self.caps_included(module.iter_caps(), self.CAPS.__name__): - choices.append(name) + for name, module in sorted(self.weboob.repositories.get_all_modules_info(self.CAPS).iteritems()): + choices.append(name) elif args[1] == 'edit': choices = sorted(available_backends_names) elif args[1] == 'remove': @@ -536,14 +533,13 @@ def do_backends(self, line): for backend_name in given_backend_names: if action in ('add', 'register'): - try: - module = self.weboob.modules_loader.get_or_load_module(backend_name) - except ModuleLoadError: - print >>sys.stderr, 'Backend "%s" does not exist.' % backend_name + minfo = self.weboob.repositories.get_module_info(backend_name) + if minfo is None: + print >>sys.stderr, 'Module "%s" does not exist.' % backend_name return 1 else: - if self.CAPS and not self.caps_included(module.iter_caps(), self.CAPS.__name__): - print >>sys.stderr, 'Backend "%s" is not supported by this application => skipping.' % backend_name + if not minfo.has_caps(self.CAPS): + print >>sys.stderr, 'Module "%s" is not supported by this application => skipping.' % backend_name return 1 else: if backend_name not in [backend.name for backend in self.weboob.iter_backends()]: diff --git a/weboob/tools/backend.py b/weboob/tools/backend.py index 3ebea530ef..9e4a93df90 100644 --- a/weboob/tools/backend.py +++ b/weboob/tools/backend.py @@ -138,6 +138,10 @@ class BaseBackend(object): STORAGE = {} # Browser class BROWSER = None + # URL to an optional icon. + # If you want to create your own icon, create a 'favicon.ico' ico in + # the module's directory, and keep the ICON value to None. + ICON = None # Supported objects to fill # The key is the class and the value the method to call to fill # Method prototype: method(object, fields) @@ -186,15 +190,6 @@ def __get__(self, inst, objtype=None): else: return self.fget(objtype) - @classprop - def ICON(klass): - try: - import xdg.IconTheme - except ImportError: - getLogger(klass.NAME).debug(u'Python xdg module was not found. Please install it to read icon files.') - else: - return xdg.IconTheme.getIconPath(klass.NAME) - _browser = None @property -- GitLab