def xontrib_data(ns): """Collects and returns the data about xontribs.""" meta = get_xontribs() data = {} names: tp.Set[str] = set() if not ns else set(ns.names) for xo_name in meta: if xo_name not in names: continue spec = find_xontrib(xo_name) if spec is None: installed = loaded = False else: installed = True loaded = spec.name in sys.modules data[xo_name] = { "name": xo_name, "installed": installed, "loaded": loaded } installed_xontribs = xontrib_installed(names) for name in installed_xontribs: if name not in data: loaded = f"xontrib.{name}" in sys.modules data[name] = {"name": name, "installed": True, "loaded": loaded} return dict(sorted(data.items()))
def _list_installed_xontribs(): meta = xmt.get_xontribs() installed = [] for name in meta: spec = xx.find_xontrib(name) if spec is not None: installed.append(spec.name.rsplit(".")[-1]) return installed
def xontrib_names_completer(**_): meta = get_xontribs() spec = importlib.util.find_spec("xontrib") for module in pkgutil.walk_packages(spec.submodule_search_locations): xont = meta.get(module.name) full_name = f"xontrib.{module.name}" if xont and full_name not in sys.modules: yield RichCompletion( module.name, append_space=True, description=xont.description )
def prompt_xontrib_install(names: tp.List[str]): """Returns a formatted string with name of xontrib package to prompt user""" xontribs = get_xontribs() packages = [] for name in names: if name in xontribs: xontrib = xontribs[name] if xontrib.package: packages.append(xontrib.package.name) print("The following xontribs are enabled but not installed: \n" " {xontribs}\n" "To install them run \n" " xpip install {packages}".format(xontribs=" ".join(names), packages=" ".join(packages)))
def make_xontribs_wiz(): """Makes a xontrib wizard.""" return _make_flat_wiz(make_xontrib, get_xontribs().items())
def make_xontribs(): xons = get_xontribs() names = sorted(xons) s = ".. list-table::\n" " :header-rows: 0\n\n" table = [] ncol = 5 row = " {0} - :ref:`{1} <{2}>`" for i, name in enumerate(names): star = "*" if i % ncol == 0 else " " table.append(row.format(star, name, name.lower())) table.extend([" -"] * ((ncol - len(names) % ncol) % ncol)) s += "\n".join(table) + "\n\n" s += "Information\n" "-----------\n\n" sec = (".. _{low}:\n\n" "{title}\n" "{under}\n" ":Website: {url}\n" ":Package: {pkg}\n\n" "{desc}\n\n" "{inst}\n\n" "{usage}" "-------\n\n") for name in names: d = xons[name] title = name under = "." * len(title) desc = d.description if not isinstance(desc, str): desc = "".join(desc) if d.package is None: pkg = "unknown" inst = "" usage = "" else: pkg = d.package.name if d.package.url: pkg = "`{0} website <{1}>`_".format(pkg, d.package.url) if d.package.license: pkg = pkg + ", " + d.package.license inst = "" installd = d.package.install if d.package.name == "xonsh": inst = "This xontrib is preinstalled with xonsh.\n\n" elif len(installd) > 0: inst = "**Installation:**\n\n" ".. code-block:: xonsh\n\n" for k, v in sorted(installd.items()): cmd = "\n ".join(v.split("\n")) inst += (" # install with {k}\n" " {cmd}").format(k=k, cmd=cmd) usage = ("**Usage:**\n\n" "Run the following command to enable (or add " "it to your :doc:`.xonshrc </xonshrc>` file to enable " "on startup.)\n\n" ".. code-block:: xonsh\n\n") usage += " xontrib load {}\n\n".format(name) s += sec.format( low=name.lower(), title=title, under=under, url=d.url or "unknown", desc=desc, pkg=pkg, inst=inst, usage=usage, ) s = s[:-9] fname = os.path.join(os.path.dirname(__file__), "xontribsbody") with open(fname, "w") as f: f.write(s)