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 difflib
import importlib
import pkgutil
import sys
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(f"{woob.__name__} v{woob.__version__} {woob.__copyright__}")
[docs] @classmethod
def run(cls):
if sys.version_info < (3, 9):
print("woob requires python >= 3.9 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(f"woob: '{sys.argv[1]}' is not a woob command. See 'woob --help'.")
words = difflib.get_close_matches(sys.argv[1], app_list)
if words:
print()
print("The most similar command is\n\t{}".format("\n\t".join(words)))
return 1
return cls.run_app(sys.argv[1], sys.argv[2:])