Source code for seamm_installer.show
# -*- coding: utf-8 -*-
"""Show the status of the SEAMM installation."""
import textwrap
from tabulate import tabulate
from . import my
from .util import find_packages, run_plugin_installer
[docs]
def setup(parser):
"""Define the command-line interface for installing SEAMM components.
Parameters
----------
parser : argparse.ArgumentParser
The main parser for the application.
"""
# Install
subparser = parser.add_parser("show")
subparser.set_defaults(func=show)
[docs]
def show():
my.logger.debug("Entering show part of the SEAMM installer")
# See if Conda is installed
if not my.conda.is_installed:
print("Conda is not installed, so none of SEAMM is.")
return
packages = find_packages(progress=True)
print("")
print("Showing the modules in SEAMM:")
data = []
am_current = True
state = {}
count = 0
for package in packages:
count += 1
if count > 50:
count = 0
print("\n.", end="", flush=True)
else:
print(".", end="", flush=True)
if package in packages and "description" in packages[package]:
description = packages[package]["description"].strip()
description = textwrap.fill(description, width=50)
else:
description = "description unavailable"
try:
version = my.pip.show(package)["version"]
except Exception:
available = packages[package]["version"]
data.append(["*" + package, "--", available, description])
am_current = False
state[package] = "not installed"
else:
available = packages[package]["version"]
if version < available:
am_current = False
state[package] = "not up-to-date"
else:
state[package] = "up-to-date"
# See if the package has an installer
result = run_plugin_installer(package, "show", verbose=False)
if result is not None:
if result.returncode == 0:
for line in result.stdout.splitlines():
description += f"\n{line}"
else:
description += (
f"\nThe installer for {package} "
f"returned code {result.returncode}"
)
for line in result.stderr.splitlines():
description += f"\n {line}"
if version < available:
data.append(["*" + package, version, available, description])
else:
data.append([package, version, available, description])
# Sort by the plug-in names
for ptype in ("Core package", "MolSSI plug-in", "3rd-party plug-in"):
group = []
count = 1
for m, i, a, d in data:
if packages[m.lstrip("*")]["type"] == ptype:
group.append([m, i, a, d])
group.sort(key=lambda x: x[0])
# And number
for i, line in enumerate(group, start=1):
line.insert(0, i)
print("")
if ptype == "Core package":
print("Core modules of SEAMM")
headers = ["Number", "Component", "Installed", "Available", "Description"]
else:
print(f"{ptype}s")
headers = ["Number", "Plug-in", "Installed", "Available", "Description"]
print(tabulate(group, headers, tablefmt="fancy_grid"))
if am_current:
print("SEAMM is up-to-date.")
else:
print("* indicates the component is not up-to-date.")
print("")