Source code for woob.launcher
# Copyright(C) 2009-2021 Romain Bignon
#
# This file is part of woob.
#
# woob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# woob 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with woob. If not, see <http://www.gnu.org/licenses/>.
import sys
import difflib
import importlib
import pkgutil
import woob
import woob.applications
try:
import woob_applications
except ImportError:
woob_applications = None
__all__ = ['Launcher']
[docs]class Launcher:
[docs] @classmethod
def list_apps(cls):
apps = set()
for module in pkgutil.iter_modules(woob.applications.__path__):
apps.add(module.name)
if woob_applications:
for module in pkgutil.iter_modules(woob_applications.__path__):
apps.add(module.name)
apps.remove("main")
return sorted(apps)
[docs] @classmethod
def load_app(cls, app):
try:
app_module = importlib.import_module("woob.applications.%s" % app)
except ImportError:
if woob_applications is None:
raise
app_module = importlib.import_module("woob_applications.%s" % app)
return getattr(app_module, app_module.__all__[0])
[docs] @classmethod
def run_app(cls, app, args):
app_class = cls.load_app(app)
return app_class.run([app] + args)
[docs] @classmethod
def print_list(cls, app_list):
print('usage: woob [--version] <command> [<args>]')
print()
print('Use one of this commands:')
for app in app_list:
try:
app_class = cls.load_app(app)
except ImportError as e:
print(' %-15s (unable to load: %s)' % (app, e))
else:
print(' %-15s %s' % (app_class.APPNAME, app_class.SHORT_DESCRIPTION))
print()
print('For more information about a command, use:')
print(' $ man woob-<command>')
print('or')
print(' $ woob <command> --help')
[docs] @classmethod
def print_version(cls):
print('%s v%s %s' % (woob.__name__, woob.__version__, woob.__copyright__))
[docs] @classmethod
def run(cls):
if sys.version_info < (3, 7):
print('woob requires python >= 3.7 to work', file=sys.stderr)
return 1
app_list = cls.list_apps()
if len(sys.argv) < 2 or sys.argv[1] == '--help':
return cls.print_list(app_list)
if sys.argv[1] == '--version':
return cls.print_version()
if sys.argv[1] == 'update':
sys.argv.insert(1, 'config')
if sys.argv[1] not in app_list:
print("woob: '{0}' is not a woob command. See 'woob --help'.".format(sys.argv[1]))
words = difflib.get_close_matches(sys.argv[1], app_list)
if words:
print()
print('The most similar command is\n\t{0}'.format('\n\t'.join(words)))
return 1
return cls.run_app(sys.argv[1], sys.argv[2:])