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:])