Merge pull request #3960 from jnoortheen/use-individual-file-for-xontrib-meta

Use individual file for xontrib meta
This commit is contained in:
Anthony Scopatz 2020-11-10 14:44:41 -06:00 committed by GitHub
commit 913077b0b0
Failed to generate hash of commit
16 changed files with 738 additions and 754 deletions

4
.gitignore vendored
View file

@ -71,10 +71,6 @@ rever/
xonsh/webconfig/elm-stuff/ xonsh/webconfig/elm-stuff/
xonsh/webconfig/js/app.js xonsh/webconfig/js/app.js
# venv (e.g, autovox)
venv/
.venv/
# VS Code # VS Code
.vscode/ .vscode/

View file

@ -76,6 +76,7 @@ For those of you who want the gritty details.
dumb_shell dumb_shell
wizard wizard
xonfig xonfig
xontribs_meta
codecache codecache
contexts contexts
@ -84,6 +85,5 @@ For those of you who want the gritty details.
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
mplhooks mplhooks
vox vox

View file

@ -0,0 +1,11 @@
.. _xonsh_xontribs_meta:
***********************************************
Xontribs (``xonsh.xontribs_meta``)
***********************************************
.. automodule:: xonsh.xontribs_meta
:members:
:undoc-members:
:private-members:

View file

@ -17,7 +17,7 @@ os.environ["XONSH_DEBUG"] = "1"
from xonsh import __version__ as XONSH_VERSION from xonsh import __version__ as XONSH_VERSION
from xonsh.environ import DEFAULT_VARS, Env from xonsh.environ import DEFAULT_VARS, Env
from xonsh.xontribs import xontrib_metadata from xonsh.xontribs_meta import get_xontribs
from xonsh import main from xonsh import main
from xonsh.commands_cache import CommandsCache from xonsh.commands_cache import CommandsCache
@ -320,8 +320,8 @@ def make_envvars():
def make_xontribs(): def make_xontribs():
md = xontrib_metadata() xons = get_xontribs()
names = sorted(d["name"] for d in md["xontribs"] if "name" in d) names = sorted(xons)
s = ".. list-table::\n" " :header-rows: 0\n\n" s = ".. list-table::\n" " :header-rows: 0\n\n"
table = [] table = []
ncol = 5 ncol = 5
@ -344,33 +344,29 @@ def make_xontribs():
"-------\n\n" "-------\n\n"
) )
for name in names: for name in names:
for d in md["xontribs"]: d = xons[name]
if d.get("name", None) == name:
break
title = name title = name
under = "." * len(title) under = "." * len(title)
desc = d.get("description", "") desc = d.description
if not isinstance(desc, str): if not isinstance(desc, str):
desc = "".join(desc) desc = "".join(desc)
pkgname = d.get("package", None) if d.package is None:
if pkgname is None:
pkg = "unknown" pkg = "unknown"
inst = "" inst = ""
usage = "" usage = ""
else: else:
pd = md["packages"].get(pkgname, {}) pkg = d.package.name
pkg = pkgname if d.package.url:
if "url" in pd: pkg = "`{0} website <{1}>`_".format(pkg, d.package.url)
pkg = "`{0} website <{1}>`_".format(pkg, pd["url"]) if d.package.license:
if "license" in pd: pkg = pkg + ", " + d.package.license
pkg = pkg + ", " + pd["license"]
inst = "" inst = ""
installd = pd.get("install", {}) installd = d.package.install
if pkgname == "xonsh": if d.package.name == "xonsh":
inst = "This xontrib is preinstalled with xonsh.\n\n" inst = "This xontrib is preinstalled with xonsh.\n\n"
elif len(installd) > 0: elif len(installd) > 0:
inst = "**Installation:**\n\n" ".. code-block:: xonsh\n\n" inst = "**Installation:**\n\n" ".. code-block:: xonsh\n\n"
for k, v in sorted(pd.get("install", {}).items()): for k, v in sorted(installd.items()):
cmd = "\n ".join(v.split("\n")) cmd = "\n ".join(v.split("\n"))
inst += (" # install with {k}\n" " {cmd}").format( inst += (" # install with {k}\n" " {cmd}").format(
k=k, cmd=cmd k=k, cmd=cmd
@ -387,7 +383,7 @@ def make_xontribs():
low=name.lower(), low=name.lower(),
title=title, title=title,
under=under, under=under,
url=d.get("url", "unknown"), url=d.url or "unknown",
desc=desc, desc=desc,
pkg=pkg, pkg=pkg,
inst=inst, inst=inst,

View file

@ -176,46 +176,39 @@ Of course, you're under no obligation to register your xontrib. Users will
still be able to load your xontrib, as long as they have it installed. still be able to load your xontrib, as long as they have it installed.
To register a xontrib, add an entry to To register a xontrib, add an entry to
`the xontribs.json file <https://github.com/xonsh/xonsh/blob/master/xonsh/xontribs.json>`_ `the xontribs_meta.py file <https://github.com/xonsh/xonsh/blob/master/xonsh/xontribs_meta.py>`_
in the main xonsh repository. A pull request is probably best, but if you in the main xonsh repository. A pull request is probably best, but if you
are having trouble figuring it out please contact one of the xonsh devs are having trouble figuring it out please contact one of the xonsh devs
with the relevant information. with the relevant information.
This is a JSON file with two top-level keys: ``"xontribs"`` and ``"packages"``. This is Python file holds classes and functions to register new Xontrib.
The ``"xontribs"`` key is a list of dictionaries that describes the xontrib The ``xontribs_meta.define_xontribs`` function returns a dictionary of all Xontribs.
module itself. Such entries have the following structure: A sample ``Xontrib`` definition looks like this,
.. code-block:: json .. code-block:: python
{"xontribs": [ {
{"name": "xontrib-name", "awesome": Xontrib(
"package": "package-name", url="http://example.com/api/xontrib",
"url": "http://example.com/api/xontrib", description="Description and short intro for your xontrib."
"description": ["Textual description as string or list or strings ", "It can span multi-lines. "
"enabling long content to be split over many lines."] "Feel free to use a triple quotes if you want to have line-endings.",
} package=_XontribPkg(
] name="xontrib-awesome",
license="BSD",
install={
"pip": "xpip install xontrib-awesome",
"conda": "conda install xontrib-awesome",
},
url="https://example.com/",
),
)
} }
The ``"packages"`` key, on the other hand, is a dict mapping package names .. note:: Note that you can have as many entries in the ``"install"`` dict as you
(associated with the xontrib entries) to metadata about the package. Package want. Also, the keys are arbitrary labels, so feel free to pick whatever
entries have the following structure: you want.
.. code-block:: json .. seealso:: Checkout the API docs of the :doc:`api/xontribs_meta`
{"packages": {
"package-name": {
"license": "WTFPL v1.1",
"url": "http://example",
"install": {
"conda": "conda install package-name",
"pip": "xpip install package-name"}
}
}
}
Note that you can have as many entries in the ``"install"`` dict as you
want. Also, the keys are arbitrary labels, so feel free to pick whatever
you want.
Go forth! Go forth!

View file

@ -0,0 +1,23 @@
**Added:**
* <news item>
**Changed:**
* Use ``xontribs_meta.py`` instead of ``xontribs.json``
**Deprecated:**
* <news item>
**Removed:**
* <news item>
**Fixed:**
* <news item>
**Security:**
* <news item>

View file

@ -1,5 +1,6 @@
#!/usr/bin/env xonsh #!/usr/bin/env xonsh
import argparse import argparse
import subprocess
from typing import List from typing import List
@ -7,7 +8,7 @@ $XONSH_DEBUG = 1
$RAISE_SUBPROC_ERROR = True $RAISE_SUBPROC_ERROR = True
def _replace_args(args:List[str], num:int) -> List[str]: def _replace_args(args: List[str], num: int) -> List[str]:
return [ return [
(arg % num) if "%d" in arg else arg (arg % num) if "%d" in arg else arg
for arg in args for arg in args
@ -72,4 +73,7 @@ if __name__ == '__main__':
qa_parser.set_defaults(func=qa) qa_parser.set_defaults(func=qa)
args = parser.parse_args() args = parser.parse_args()
args.func(args) try:
args.func(args)
except subprocess.CalledProcessError as ex:
parser.exit(1, f"Failed with {ex}")

View file

@ -19,8 +19,7 @@ exclude =
feedstock, feedstock,
rever, rever,
.venv*/, .venv*/,
# remove later .local.out*/
pygments_cache.py
# lint nits that are acceptable in Xonsh project: # lint nits that are acceptable in Xonsh project:
ignore = ignore =
D100, # Missing docstring in public module D100, # Missing docstring in public module
@ -46,8 +45,7 @@ ignore =
D411, # Missing blank line before section D411, # Missing blank line before section
D407, # Missing dashed underline after section D407, # Missing dashed underline after section
E122, E122,
# E203 whitespace before ':' E203, # whitespace before ':'
E203,
E402, E402,
W503, # line break before binary operators is a good thing W503, # line break before binary operators is a good thing
E731, # accept lambda assigned to a variable E731, # accept lambda assigned to a variable

View file

@ -1,12 +1,7 @@
"""xontrib tests, such as they are""" """xontrib tests, such as they are"""
import sys import sys
import pytest import pytest
from xonsh.xontribs import xontrib_metadata, xontrib_context, xontribs_load, xontribs_loaded from xonsh.xontribs import xontrib_context, xontribs_load, xontribs_loaded
def test_load_xontrib_metadata():
# Simply tests that the xontribs JSON files isn't malformed.
xontrib_metadata()
@pytest.fixture @pytest.fixture
@ -78,6 +73,7 @@ hello = 'world'
ctx = xontrib_context("script") ctx = xontrib_context("script")
assert ctx == {"hello": "world"} assert ctx == {"hello": "world"}
def test_xontrib_load(tmpmod): def test_xontrib_load(tmpmod):
""" """
Test that .xsh xontribs are loadable Test that .xsh xontribs are loadable
@ -90,7 +86,8 @@ hello = 'world'
) )
xontribs_load(["script"]) xontribs_load(["script"])
assert 'script' in xontribs_loaded() assert "script" in xontribs_loaded()
def test_xontrib_load_dashed(tmpmod): def test_xontrib_load_dashed(tmpmod):
""" """
@ -104,5 +101,4 @@ hello = 'world'
) )
xontribs_load(["scri-pt"]) xontribs_load(["scri-pt"])
assert 'scri-pt' in xontribs_loaded() assert "scri-pt" in xontribs_loaded()

View file

@ -14,6 +14,8 @@ else:
try: try:
from xonsh import __amalgam__ from xonsh import __amalgam__
xontribs_meta = __amalgam__
_sys.modules["xonsh.xontribs_meta"] = __amalgam__
contexts = __amalgam__ contexts = __amalgam__
_sys.modules["xonsh.contexts"] = __amalgam__ _sys.modules["xonsh.contexts"] = __amalgam__
lazyasd = __amalgam__ lazyasd = __amalgam__

View file

@ -1,6 +1,7 @@
"""Provides completions for xonsh internal utilities""" """Provides completions for xonsh internal utilities"""
import xonsh.xontribs as xx import xonsh.xontribs as xx
import xonsh.xontribs_meta as xmt
import xonsh.tools as xt import xonsh.tools as xt
from xonsh.xonfig import XONFIG_MAIN_ACTIONS from xonsh.xonfig import XONFIG_MAIN_ACTIONS
@ -21,10 +22,9 @@ def complete_xonfig(prefix, line, start, end, ctx):
def _list_installed_xontribs(): def _list_installed_xontribs():
meta = xx.xontrib_metadata() meta = xmt.get_xontribs()
installed = [] installed = []
for md in meta["xontribs"]: for name in meta:
name = md["name"]
spec = xx.find_xontrib(name) spec = xx.find_xontrib(name)
if spec is not None: if spec is not None:
installed.append(spec.name.rsplit(".")[-1]) installed.append(spec.name.rsplit(".")[-1])

View file

@ -15,7 +15,7 @@ from xonsh.color_tools import rgb_to_ints
from xonsh.pygments_cache import get_all_styles from xonsh.pygments_cache import get_all_styles
from xonsh.pyghooks import XonshStyle, xonsh_style_proxy, XonshHtmlFormatter, Token, XonshLexer from xonsh.pyghooks import XonshStyle, xonsh_style_proxy, XonshHtmlFormatter, Token, XonshLexer
from xonsh.prompt.base import PromptFormatter from xonsh.prompt.base import PromptFormatter
from xonsh.xontribs import xontrib_metadata from xonsh.xontribs_meta import get_xontribs, Xontrib
$RAISE_SUBPROC_ERROR = True $RAISE_SUBPROC_ERROR = True
@ -199,17 +199,23 @@ type alias XontribData =
xontribs : List XontribData xontribs : List XontribData
xontribs =""" xontribs ="""
def get_xontrib_item(xontrib_name: str, xontrib: Xontrib):
item = 'name = "' + xontrib_name + '", '
item += 'url = "' + xontrib.url + '", '
item += 'license = "' + (xontrib.package.license if xontrib.package else "") + '", '
d = rst_to_html("".join(xontrib.description)).replace("\n", "\\n")
item += 'description = "' + escape(d) + '"'
return item
def render_xontribs(lines): def render_xontribs(lines):
print_color("Rendering {GREEN}xontribs{RESET}") print_color("Rendering {GREEN}xontribs{RESET}")
lines.append(xontrib_header) lines.append(xontrib_header)
md = xontrib_metadata() md = get_xontribs()
packages = md["packages"] for i, xontrib_name in enumerate(md):
for i, xontrib in enumerate(md["xontribs"]): xontrib = md[xontrib_name]
item = 'name = "' + xontrib["name"] + '", ' item = get_xontrib_item(xontrib_name, xontrib)
item += 'url = "' + xontrib["url"] + '", '
item += 'license = "' + packages.get(xontrib["package"], {}).get("license", "") + '", '
d = rst_to_html("".join(xontrib["description"])).replace("\n", "\\n")
item += 'description = "' + escape(d) + '"'
pre = " [ " if i == 0 else " , " pre = " [ " if i == 0 else " , "
lines.append(pre + "{ " + item + " }") lines.append(pre + "{ " + item + " }")
lines.append(" ]") lines.append(" ]")

View file

@ -47,7 +47,8 @@ from xonsh.tools import (
color_style, color_style,
) )
from xonsh.foreign_shells import CANON_SHELL_NAMES from xonsh.foreign_shells import CANON_SHELL_NAMES
from xonsh.xontribs import xontrib_metadata, find_xontrib, xontribs_loaded from xonsh.xontribs import find_xontrib, xontribs_loaded
from xonsh.xontribs_meta import get_xontribs, Xontrib
from xonsh.lazyasd import lazyobject from xonsh.lazyasd import lazyobject
HR = "'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'" HR = "'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'`-.,_,.-*'"
@ -356,25 +357,23 @@ def _xontrib_path(visitor=None, node=None, val=None):
return ("xontribs", len(visitor.state.get("xontribs", ()))) return ("xontribs", len(visitor.state.get("xontribs", ())))
def make_xontrib(xontrib, package): def make_xontrib(name: str, xontrib: Xontrib):
"""Makes a message and StoreNonEmpty node for a xontrib.""" """Makes a message and StoreNonEmpty node for a xontrib."""
name = xontrib.get("name", "<unknown-xontrib-name>") name = name or "<unknown-xontrib-name>"
msg = "\n{BOLD_CYAN}" + name + "{RESET}\n" msg = "\n{BOLD_CYAN}" + name + "{RESET}\n"
if "url" in xontrib: if xontrib.url:
msg += "{RED}url:{RESET} " + xontrib["url"] + "\n" msg += "{RED}url:{RESET} " + xontrib.url + "\n"
if "package" in xontrib: if xontrib.package:
msg += "{RED}package:{RESET} " + xontrib["package"] + "\n" pkg = xontrib.package
if "url" in package: msg += "{RED}package:{RESET} " + pkg.name + "\n"
if "url" in xontrib and package["url"] != xontrib["url"]: if pkg.url:
msg += "{RED}package-url:{RESET} " + package["url"] + "\n" if xontrib.url and pkg.url != xontrib.url:
if "license" in package: msg += "{RED}package-url:{RESET} " + pkg.url + "\n"
msg += "{RED}license:{RESET} " + package["license"] + "\n" if pkg.license:
msg += "{RED}license:{RESET} " + pkg.license + "\n"
msg += "{PURPLE}installed?{RESET} " msg += "{PURPLE}installed?{RESET} "
msg += ("no" if find_xontrib(name) is None else "yes") + "\n" msg += ("no" if find_xontrib(name) is None else "yes") + "\n"
desc = xontrib.get("description", "") msg += _wrap_paragraphs(xontrib.description, width=69)
if not isinstance(desc, str):
desc = "".join(desc)
msg += _wrap_paragraphs(desc, width=69)
if msg.endswith("\n"): if msg.endswith("\n"):
msg = msg[:-1] msg = msg[:-1]
mnode = wiz.Message(message=msg) mnode = wiz.Message(message=msg)
@ -385,10 +384,7 @@ def make_xontrib(xontrib, package):
def make_xontribs_wiz(): def make_xontribs_wiz():
"""Makes a xontrib wizard.""" """Makes a xontrib wizard."""
md = xontrib_metadata() return _make_flat_wiz(make_xontrib, get_xontribs().items())
pkgs = [md["packages"].get(d.get("package", None), {}) for d in md["xontribs"]]
w = _make_flat_wiz(make_xontrib, md["xontribs"], pkgs)
return w
def make_xonfig_wizard(default_file=None, confirm=False, no_wizard_file=None): def make_xonfig_wizard(default_file=None, confirm=False, no_wizard_file=None):

View file

@ -1,584 +0,0 @@
{"xontribs": [
{"name": "abbrevs",
"package": "xonsh",
"url": "http://xon.sh",
"description": [
"Adds ``abbrevs`` dictionary to hold user-defined command abbreviations. ",
"The dictionary is searched as you type and the matching words are replaced ",
"at the command line by the corresponding dictionary contents once you hit ",
"'Space' or 'Return' key. For instance a frequently used command such as ",
"``git status`` can be abbreviated to ``gst`` as follows::\n\n",
" $ xontrib load abbrevs\n",
" $ abbrevs['gst'] = 'git status'\n",
" $ gst # Once you hit <space> or <return>, 'gst' gets expanded to 'git status'.\n\n"]
},
{"name": "apt_tabcomplete",
"package": "xonsh-apt-tabcomplete",
"url": "https://github.com/DangerOnTheRanger/xonsh-apt-tabcomplete",
"description": ["Adds tabcomplete functionality to apt-get/apt-cache inside of xonsh."]
},
{"name": "argcomplete",
"package": "xontrib-argcomplete",
"url": "https://github.com/anki-code/xontrib-argcomplete",
"description": ["Argcomplete support to tab completion of python and xonsh scripts in xonsh."]
},
{"name": "autojump",
"package": "xontrib-autojump",
"url": "https://github.com/sagartewari01/autojump-xonsh",
"description": ["autojump support for xonsh"]
},
{"name": "autovox",
"package": "xonsh",
"url": "http://xon.sh",
"description": ["Manages automatic activation of virtual environments."]
},
{"name": "autoxsh",
"package": "xonsh-autoxsh",
"url": "https://github.com/Granitas/xonsh-autoxsh",
"description": ["Adds automatic execution of xonsh script files called ",
"``.autoxsh`` when enterting a directory with ``cd`` function"]
},
{"name": "avox",
"package": "xontrib-avox",
"url": "https://github.com/AstraLuma/xontrib-avox",
"description": ["Automatic (de)activation of virtual environments as you cd around"]
},
{"name": "back2dir",
"package": "xontrib-back2dir",
"url": "https://github.com/anki-code/xontrib-back2dir",
"description": [
"Return to the most recently used directory when starting the xonsh shell. ",
"For example, if you were in the '/work' directory when you last exited xonsh, ",
"then your next xonsh session will start in the '/work' directory, instead of your home directory."]
},
{"name": "bashisms",
"package": "xonsh",
"url": "http://xon.sh",
"description": [
"Enables additional Bash-like syntax while at the command prompt. For ",
"example, the ``!!`` syntax for running the previous command is now usable. ",
"Note that these features are implemented as precommand events and these ",
"additions do not affect the xonsh language when run as script. That said, ",
"you might find them useful if you have strong muscle memory.\n\n",
"**Warning:** This xontrib may modify user command line input to implement ",
"its behavior. To see the modifications as they are applied (in unified diff",
"format), please set ``$XONSH_DEBUG`` to ``2`` or higher.\n\n",
"The xontrib also adds commands: ``alias``, ``export``, ``unset``, ``set``, ``shopt``, ``complete``."]
},
{"name": "base16_shell",
"package": "xontrib-base16-shell",
"url": "https://github.com/ErickTucto/xontrib-base16-shell",
"description": ["Change base16 shell themes"]
},
{"name": "coreutils",
"package": "xonsh",
"url": "http://xon.sh",
"description": [
"Additional core utilities that are implemented in xonsh. The current list ",
"includes:\n",
"\n",
"* cat\n",
"* echo\n",
"* pwd\n",
"* tee\n",
"* tty\n",
"* yes\n",
"\n",
"In many cases, these may have a lower performance overhead than the ",
"posix command line utility with the same name. This is because these ",
"tools avoid the need for a full subprocess call. Additionally, these ",
"tools are cross-platform."
]
},
{
"name": "cmd_done",
"package": "xontrib-cmd-durations",
"url": "https://github.com/jnoortheen/xontrib-cmd-durations",
"description": [
"send notification once long-running command is finished.",
" Adds `long_cmd_duration` field to $PROMPT_FIELDS.",
" Note: It needs `xdotool` installed to detect current window."
]
},
{
"name": "direnv",
"package": "xonsh-direnv",
"url": "https://github.com/74th/xonsh-direnv",
"description": [
"Supports direnv."
]
},
{
"name": "hist_navigator",
"package": "xontrib-hist-navigator",
"url": "https://github.com/jnoortheen/xontrib-hist-navigator",
"description": [
"Move through directory history with nextd and prevd also with keybindings."
]
},
{
"name": "distributed",
"package": "xonsh",
"url": "http://xon.sh",
"description": [
"The distributed parallel computing library hooks for xonsh. ",
"Importantly this provides a substitute 'dworker' command which enables ",
"distributed workers to have access to xonsh builtins.\n\n",
"Furthermore, this xontrib adds a 'DSubmitter' context manager for ",
"executing a block remotely. Moreover, this also adds a convenience ",
"function 'dsubmit()' for creating DSubmitter and Executor instances ",
"at the same time. Thus users may submit distributed jobs with::\n\n",
" with dsubmit('127.0.0.1:8786', rtn='x') as dsub:\n",
" x = $(echo I am elsewhere)\n\n",
" res = dsub.future.result()\n",
" print(res)\n\n",
"This is useful for long running or non-blocking jobs."
]
},
{"name": "docker_tabcomplete",
"package": "xonsh-docker-tabcomplete",
"url": "https://github.com/xsteadfastx/xonsh-docker-tabcomplete",
"description": ["Adds tabcomplete functionality to docker inside of xonsh."]
},
{"name": "free_cwd",
"package": "xonsh",
"url": "http://xon.sh",
"description": [
"Windows only xontrib, to release the lock on the current directory ",
"whenever the prompt is shown. Enabling this will allow the other ",
"programs or Windows Explorer to delete or rename the current or parent ",
"directories. Internally, it is accomplished by temporarily resetting ",
"CWD to the root drive folder while waiting at the prompt. This only ",
"works with the prompt_toolkit backend and can cause cause issues ",
"if any extensions are enabled that hook the prompt and relies on ",
"``os.getcwd()``"]
},
{"name": "fzf-widgets",
"package": "xontrib-fzf-widgets",
"url": "https://github.com/laloch/xontrib-fzf-widgets",
"description": ["Adds some fzf widgets to your xonsh shell."]
},
{"name": "gitinfo",
"package": "xontrib-gitinfo",
"url": "https://github.com/dyuri/xontrib-gitinfo",
"description": ["Displays git information on entering a repository folder. Uses ``onefetch`` if available."]
},
{"name": "histcpy",
"package": "xontrib-histcpy",
"url": "https://github.com/con-f-use/xontrib-histcpy",
"description": [
"Useful aliases and shortcuts for extracting links and text",
"from command output history and putting them into the",
" clipboard."]
},
{"name": "jedi",
"package": "xonsh",
"url": "http://xon.sh",
"description": ["Use Jedi as xonsh's python completer."]
},
{"name": "kitty",
"package": "xontrib-kitty",
"url": "https://github.com/scopatz/xontrib-kitty",
"description": ["Xonsh hooks for the Kitty terminal emulator."]
},
{"name": "mpl",
"package": "xonsh",
"url": "http://xon.sh",
"description": ["Matplotlib hooks for xonsh, including the new 'mpl' alias ",
"that displays the current figure on the screen."]
},
{"name": "output_search",
"package": "xontrib-output-search",
"url": "https://github.com/anki-code/xontrib-output-search",
"description": ["Get identifiers, names, paths, URLs and words from the previous command output ",
"and use them for the next command."]
},
{"name": "onepath",
"package": "xontrib-onepath",
"url": "https://github.com/anki-code/xontrib-onepath",
"description": ["When you click to a file or folder in graphical OS they will be opened in associated app.",
"The xontrib-onepath brings the same logic for the xonsh shell. Type the filename or path",
"without preceding command and an associated action will be executed. The actions are customizable."]
},
{"name": "pdb",
"package": "xonsh",
"url": "http://xon.sh",
"description": ["Simple built-in debugger. Runs pdb on reception of SIGUSR1 signal."]
},
{"name": "pipeliner",
"package": "xontrib-pipeliner",
"url": "https://github.com/anki-code/xontrib-pipeliner",
"description": ["Let your pipe lines flow thru the Python code in xonsh."]
},
{"name": "powerline",
"package": "xontrib-powerline",
"url": "https://github.com/santagada/xontrib-powerline",
"description": ["Powerline for Xonsh shell"]
},
{"name": "powerline2",
"package": "xontrib-powerline2",
"url": "https://github.com/vaaaaanquish/xontrib-powerline2",
"description": ["Powerline for Xonsh shell forked from santagada/xontrib-powerline"]
},
{"name": "prompt_bar",
"package": "xontrib-prompt-bar",
"url": "https://github.com/anki-code/xontrib-prompt-bar",
"description": ["An elegance bar style for prompt."]
},
{"name": "powerline_binding",
"package": "xontrib-powerline-binding",
"url": "https://github.com/dyuri/xontrib-powerline-binding",
"description": ["Uses powerline to render the xonsh prompt"]
},
{"name": "prompt_ret_code",
"package": "xonsh",
"url": "http://xon.sh",
"description": ["Adds return code info to the prompt"]
},
{"name": "prompt_vi_mode",
"package": "xontrib-prompt-vi-mode",
"url": "https://github.com/t184256/xontrib-prompt-vi-mode",
"description": ["vi-mode status formatter for xonsh prompt"]
},
{"name": "pyenv",
"package": "xontrib-pyenv",
"url": "https://github.com/dyuri/xontrib-pyenv",
"description": ["pyenv integration for xonsh."]
},
{"name": "readable-traceback",
"package": "xontrib-readable-traceback",
"url": "https://github.com/6syun9/xontrib-readable-traceback",
"description": ["Make traceback easier to see for xonsh."]
},
{"name": "sh",
"package": "xontrib-sh",
"url": "https://github.com/anki-code/xontrib-sh",
"description": ["Paste and run commands from bash, zsh, fish in xonsh shell."]
},
{"name": "schedule",
"package": "xontrib-schedule",
"url": "https://github.com/AstraLuma/xontrib-schedule",
"description": ["Xonsh Task Scheduling"]
},
{"name": "scrapy_tabcomplete",
"package": "xonsh-scrapy-tabcomplete",
"url": "https://github.com/Granitas/xonsh-scrapy-tabcomplete",
"description": ["Adds tabcomplete functionality to scrapy inside of xonsh."]
},
{"name": "ssh_agent",
"package": "xontrib-ssh-agent",
"url": "https://github.com/dyuri/xontrib-ssh-agent",
"description": ["ssh-agent integration"]
},
{"name": "vox",
"package": "xonsh",
"url": "http://xon.sh",
"description": ["Python virtual environment manager for xonsh."]
},
{"name": "vox_tabcomplete",
"package": "xonsh-vox-tabcomplete",
"url": "https://github.com/Granitosaurus/xonsh-vox-tabcomplete",
"description": ["Adds tabcomplete functionality to vox inside of xonsh."]
},
{"name": "whole_word_jumping",
"package": "xonsh",
"url": "http://xon.sh",
"description": [
"Jumping across whole words (non-whitespace) with Ctrl+Left/Right. ",
"Alt+Left/Right remains unmodified to jump over smaller word segments. ",
"Shift+Delete removes the whole word."]
},
{"name": "xo",
"package": "exofrills",
"url": "https://github.com/scopatz/xo",
"description": ["Adds an 'xo' alias to run the exofrills text editor in the ",
"current Python interpreter session. This shaves off a ",
"bit of the startup time when running your favorite, minimal ",
"text editor."]
},
{"name": "xog",
"package": "xonsh",
"url": "http://xon.sh",
"description": ["Adds a simple command to establish and print temporary traceback log file."]
},
{"name": "xpg",
"package": "xontrib-xpg",
"url": "https://github.com/fengttt/xsh/tree/master/py",
"description": ["Run/plot/explain sql query for PostgreSQL."]
},
{"name": "z",
"package": "xontrib-z",
"url": "https://github.com/AstraLuma/xontrib-z",
"description": ["Tracks your most used directories, based on 'frecency'."]
},
{"name": "zoxide",
"package": "xontrib-zoxide",
"url": "https://github.com/dyuri/xontrib-zoxide",
"description": ["Zoxide integration for xonsh."]
}
],
"packages": {
"exofrills": {
"license": "WTFPL",
"url": "http://exofrills.org",
"install": {
"conda": "conda install -c conda-forge xo",
"pip": "xpip install exofrills"}
},
"xonsh": {
"license": "BSD 3-clause",
"url": "http://xon.sh",
"install": {
"conda": "conda install -c conda-forge xonsh",
"pip": "xpip install xonsh",
"aura": "sudo aura -A xonsh",
"yaourt": "yaourt -Sa xonsh"}
},
"xontrib-argcomplete": {
"license": "BSD",
"url": "https://github.com/anki-code/xontrib-argcomplete",
"install": {
"pip": "xpip install xontrib-argcomplete"
}
},
"xontrib-back2dir": {
"license": "BSD",
"url": "https://github.com/anki-code/xontrib-back2dir",
"install": {
"pip": "xpip install xontrib-back2dir"
}
},
"xonsh-autoxsh": {
"license": "GPLv3",
"url": "https://github.com/Granitas/xonsh-autoxsh",
"install": {
"pip": "xpip install xonsh-autoxsh"
}
},
"xonsh-apt-tabcomplete": {
"license": "BSD 2-clause",
"url": "https://github.com/DangerOnTheRanger/xonsh-apt-tabcomplete",
"install": {
"pip": "xpip install xonsh-apt-tabcomplete"
}
},
"xonsh-click-tabcomplete": {
"license": "GPLv3",
"url": "https://github.com/Granitosaurus/xonsh-click-tabcomplete",
"install": {
"pip": "xpip install xonsh-click-tabcomplete"
}
},
"xonsh-direnv": {
"license": "MIT",
"url": "https://github.com/74th/xonsh-direnv",
"install": {
"pip": "xpip install xonsh-direnv"
}
},
"xonsh-docker-tabcomplete": {
"license": "MIT",
"url": "https://github.com/xsteadfastx/xonsh-docker-tabcomplete",
"install": {
"pip": "xpip install xonsh-docker-tabcomplete"
}
},
"xontrib-hist-navigator": {
"license": "MIT",
"url": "https://github.com/jnoortheen/xontrib-hist-navigator",
"install": {
"pip": "xpip install xontrib-hist-navigator"
}
},
"xonsh-scrapy-tabcomplete": {
"license": "GPLv3",
"url": "https://github.com/Granitas/xonsh-scrapy-tabcomplete",
"install": {
"pip": "xpip install xonsh-scrapy-tabcomplete"
}
},
"xonsh-vox-tabcomplete": {
"license": "GPLv3",
"url": "https://github.com/Granitosaurus/xonsh-vox-tabcomplete",
"install": {
"pip": "xpip install xonsh-vox-tabcomplete"
}
},
"xonda": {
"license": "MIT",
"url": "https://github.com/gforsyth/xonda",
"install": {
"pip": "xpip install xonda"
}
},
"xontrib-avox": {
"license": "GPLv3",
"url": "https://github.com/AstraLuma/xontrib-avox",
"install": {
"pip": "xpip install xontrib-avox"
}
},
"xontrib-cmd-durations": {
"license": "MIT",
"url": "https://github.com/jnoortheen/xontrib-cmd-durations",
"install": {
"pip": "xpip install xontrib-cmd-durations"
}
},
"xontrib-fzf-widgets": {
"license": "GPLv3",
"url": "https://github.com/laloch/xontrib-fzf-widgets",
"install": {
"pip": "xpip install xontrib-fzf-widgets"
}
},
"xontrib-gitinfo": {
"license": "MIT",
"url": "https://github.com/dyuri/xontrib-gitinfo",
"install": {
"pip": "xpip install xontrib-gitinfo"
}
},
"xontrib-histcpy": {
"license": "GPLv3",
"url": "https://github.com/con-f-use/xontrib-histcpy",
"install": {
"pip": "xpip install xontrib-histcpy"
}
},
"xontrib-kitty": {
"license": "BSD-3-Clause",
"url": "https://github.com/scopatz/xontrib-kitty",
"install": {
"conda": "conda install -c conda-forge xontrib-kitty",
"pip": "xpip install xontrib-kitty"
}
},
"xontrib-output-search": {
"license": "BSD",
"url": "https://github.com/tokenizer/xontrib-output-search",
"install": {
"pip": "xpip install xontrib-output-search"
}
},
"xontrib-onepath": {
"license": "BSD",
"url": "https://github.com/anki-code/xontrib-onepath",
"install": {
"pip": "xpip install xontrib-onepath"
}
},
"xontrib-pipeliner": {
"license": "MIT",
"url": "https://github.com/anki-code/xontrib-pipeliner",
"install": {
"pip": "xpip install xontrib-pipeliner"
}
},
"xontrib-powerline": {
"license": "MIT",
"url": "https://github.com/santagada/xontrib-powerline",
"install": {
"pip": "xpip install xontrib-powerline"
}
},
"xontrib-powerline2": {
"license": "MIT",
"url": "https://github.com/vaaaaanquish/xontrib-powerline2",
"install": {
"pip": "xpip install xontrib-powerline2"
}
},
"xontrib-powerline-binding": {
"license": "MIT",
"url": "https://github.com/dyuri/xontrib-powerline-binding",
"install": {
"pip": "xpip install xontrib-powerline-binding"
}
},
"xontrib-prompt-bar": {
"license": "MIT",
"url": "https://github.com/anki-code/xontrib-prompt-bar",
"install": {
"pip": "xpip install xontrib-prompt-bar"
}
},
"xontrib-prompt-ret-code": {
"license": "MIT",
"url": "https://github.com/Siecje/xontrib-prompt-ret-code",
"install": {
"pip": "xpip install xontrib-prompt-ret-code"
}
},
"xontrib-prompt-vi-mode": {
"license": "MIT",
"url": "https://github.com/t184256/xontrib-prompt-vi-mode",
"install": {
"pip": "xpip install xontrib-prompt-vi-mode"
}
},
"xontrib-pyenv": {
"license": "MIT",
"url": "https://github.com/dyuri/xontrib-pyenv",
"install": {
"pip": "xpip install xontrib-pyenv"
}
},
"xontrib-readable-traceback": {
"license": "MIT",
"url": "https://github.com/6syun9/xontrib-readable-traceback",
"install": {
"pip": "xpip install xontrib-readable-traceback"
}
},
"xontrib-sh": {
"license": "MIT",
"url": "https://github.com/anki-code/xontrib-sh",
"install": {
"pip": "xpip install xontrib-sh"
}
},
"xontrib-schedule": {
"license": "MIT",
"url": "https://github.com/AstraLuma/xontrib-schedule",
"install": {
"pip": "xpip install xontrib-schedule"
}
},
"xontrib-ssh-agent": {
"license": "MIT",
"url": "https://github.com/dyuri/xontrib-ssh-agent",
"install": {
"pip": "xpip install xontrib-ssh-agent"
}
},
"xontrib-thefuck": {
"license": "MIT",
"url": "https://github.com/meatballs/xontrib-thefuck",
"install": {
"pip": "xpip install xontrib-thefuck"
}
},
"xontrib-xpg": {
"license": "Apache",
"url": "https://github.com/fengttt/xsh/py",
"install": {
"pip": "xpip install xontrib-xpg"
}
},
"xontrib-z": {
"license": "GPLv3",
"url": "https://github.com/AstraLuma/xontrib-z",
"install": {
"pip": "xpip install xontrib-z"
}
},
"xontrib-zoxide": {
"license": "MIT",
"url": "https://github.com/dyuri/xontrib-zoxide",
"install": {
"pip": "xpip install xontrib-zoxide"
}
}
}
}

View file

@ -1,17 +1,18 @@
"""Tools for helping manage xontributions.""" """Tools for helping manage xontributions."""
import os
import sys
import json
import builtins
import argparse import argparse
import builtins
import functools import functools
import importlib import importlib
import importlib.util import importlib.util
import json
import sys
import typing as tp
from enum import IntEnum from enum import IntEnum
from xonsh.tools import print_color, print_exception, unthreadable
from pathlib import Path from pathlib import Path
from xonsh.xontribs_meta import get_xontribs
from xonsh.tools import print_color, print_exception, unthreadable
class ExitCode(IntEnum): class ExitCode(IntEnum):
OK = 0 OK = 0
@ -42,14 +43,15 @@ def xontrib_context(name):
return ctx return ctx
def prompt_xontrib_install(names): def prompt_xontrib_install(names: tp.List[str]):
"""Returns a formatted string with name of xontrib package to prompt user""" """Returns a formatted string with name of xontrib package to prompt user"""
md = xontrib_metadata() xontribs = get_xontribs()
packages = [] packages = []
for name in names: for name in names:
for xontrib in md["xontribs"]: if name in xontribs:
if xontrib["name"] == name: xontrib = xontribs[name]
packages.append(xontrib["package"]) if xontrib.package:
packages.append(xontrib.package.name)
print( print(
"The following xontribs are enabled but not installed: \n" "The following xontribs are enabled but not installed: \n"
@ -76,44 +78,6 @@ def update_context(name, ctx=None):
return ctx.update(modctx) return ctx.update(modctx)
@functools.lru_cache()
def xontrib_metadata():
"""Loads and returns the xontribs.json file."""
impres = None
pkg_resources = None
# NOTE: Reduce all of these alternate implementations when the minimum Python
# is >=3.7
try:
# Python 3.7
import importlib.resources as impres
except ImportError:
try:
# Optional backport for <3.7
import importlib_resources as impres
except ImportError:
try:
# Try the slower and clunkier pkg_resources
# This is only available if setuptools is part of the environment
import pkg_resources
except ImportError:
pass
if impres:
with impres.open_text("xonsh", "xontribs.json") as f:
md = json.load(f)
elif pkg_resources:
# Despite the name, this is a bytes
bytesdata = pkg_resources.resource_string("xonsh", "xontribs.json")
md = json.loads(bytesdata.decode("utf-8"))
else:
path = os.path.join(os.path.dirname(__file__), "xontribs.json")
with open(path, "r") as f:
md = json.load(f)
return md
def xontribs_load(names, verbose=False): def xontribs_load(names, verbose=False):
"""Load xontribs from a list of names""" """Load xontribs from a list of names"""
ctx = builtins.__xonsh__.ctx ctx = builtins.__xonsh__.ctx
@ -138,39 +102,39 @@ def _load(ns):
return xontribs_load(ns.names, verbose=ns.verbose) return xontribs_load(ns.names, verbose=ns.verbose)
def xontrib_installed(ns=None): def xontrib_installed(names: tp.Set[str]):
"""Returns list of installed xontribs.""" """Returns list of installed xontribs."""
installed_xontribs = set() installed_xontribs = set()
xontrib_locations = importlib.util.find_spec("xontrib").submodule_search_locations spec = importlib.util.find_spec("xontrib")
names = None if not ns or len(ns.names) == 0 else set(ns.names) if spec:
if xontrib_locations: xontrib_locations = spec.submodule_search_locations
for xl in xontrib_locations: if xontrib_locations:
for x in Path(xl).glob("*"): for xl in xontrib_locations:
name = x.name.split(".")[0] for x in Path(xl).glob("*"):
if name[0] == "_" or (names and name not in names): name = x.name.split(".")[0]
continue if name[0] == "_" or (names and name not in names):
installed_xontribs.add(name) continue
installed_xontribs.add(name)
return installed_xontribs return installed_xontribs
def xontrib_data(ns): def xontrib_data(ns):
"""Collects and returns the data about xontribs.""" """Collects and returns the data about xontribs."""
meta = xontrib_metadata() meta = get_xontribs()
data = {} data = {}
names = None if not ns or len(ns.names) == 0 else set(ns.names) names: tp.Set[str] = set() if not ns else set(ns.names)
for md in meta["xontribs"]: for xo_name in meta:
name = md["name"] if xo_name not in names:
if names is not None and md["name"] not in names:
continue continue
spec = find_xontrib(name) spec = find_xontrib(xo_name)
if spec is None: if spec is None:
installed = loaded = False installed = loaded = False
else: else:
installed = True installed = True
loaded = spec.name in sys.modules loaded = spec.name in sys.modules
data[name] = {"name": name, "installed": installed, "loaded": loaded} data[xo_name] = {"name": xo_name, "installed": installed, "loaded": loaded}
installed_xontribs = xontrib_installed(ns) installed_xontribs = xontrib_installed(names)
for name in installed_xontribs: for name in installed_xontribs:
if name not in data: if name not in data:
loaded = f"xontrib.{name}" in sys.modules loaded = f"xontrib.{name}" in sys.modules

583
xonsh/xontribs_meta.py Normal file
View file

@ -0,0 +1,583 @@
"""
This modules is the place where one would define the xontribs.
"""
import functools
import typing as tp
class _XontribPkg(tp.NamedTuple):
"""Class to define package information of a xontrib.
Attributes
----------
install
a mapping of tools with respective install commands. e.g. {"pip": "pip install xontrib"}
license
license type of the xontrib package
name
full name of the package. e.g. "xontrib-argcomplete"
url
URL to the homepage of the xontrib package.
"""
install: tp.Dict[str, str]
license: str = ""
name: str = ""
url: tp.Optional[str] = None
class Xontrib(tp.NamedTuple):
"""Meta class that is used to describe xontribs.
Attributes
----------
url
url to the home page of the xontrib.
description
short description about the xontrib.
package
pkg information for installing the xontrib
tags
category.
"""
url: str = ""
description: str = ""
package: tp.Optional[_XontribPkg] = None
tags: tp.Tuple[str, ...] = ()
@functools.lru_cache()
def get_xontribs() -> tp.Dict[str, Xontrib]:
"""Return xontrib definitions lazily."""
return define_xontribs()
def define_xontribs():
"""Xontrib registry."""
core_pkg = _XontribPkg(
name="xonsh",
license="BSD 3-clause",
install={
"conda": "conda install -c conda-forge xonsh",
"pip": "xpip install xonsh",
"aura": "sudo aura -A xonsh",
"yaourt": "yaourt -Sa xonsh",
},
url="http://xon.sh",
)
return {
"abbrevs": Xontrib(
url="http://xon.sh",
description="Adds ``abbrevs`` dictionary to hold user-defined "
"command abbreviations. The dictionary is searched "
"as you type and the matching words are replaced "
"at the command line by the corresponding "
"dictionary contents once you hit 'Space' or "
"'Return' key. For instance a frequently used "
"command such as ``git status`` can be abbreviated "
"to ``gst`` as follows::\n"
"\n"
" $ xontrib load abbrevs\n"
" $ abbrevs['gst'] = 'git status'\n"
" $ gst # Once you hit <space> or <return>, "
"'gst' gets expanded to 'git status'.\n"
"\n",
package=core_pkg,
),
"apt_tabcomplete": Xontrib(
url="https://github.com/DangerOnTheRanger/xonsh-apt-tabcomplete",
description="Adds tabcomplete functionality to "
"apt-get/apt-cache inside of xonsh.",
package=_XontribPkg(
name="xonsh-apt-tabcomplete",
license="BSD 2-clause",
install={"pip": "xpip install xonsh-apt-tabcomplete"},
url="https://github.com/DangerOnTheRanger/xonsh-apt-tabcomplete",
),
),
"argcomplete": Xontrib(
url="https://github.com/anki-code/xontrib-argcomplete",
description="Argcomplete support to tab completion of "
"python and xonsh scripts in xonsh.",
package=_XontribPkg(
name="xontrib-argcomplete",
license="BSD",
install={"pip": "xpip install xontrib-argcomplete"},
url="https://github.com/anki-code/xontrib-argcomplete",
),
),
"autojump": Xontrib(
url="https://github.com/sagartewari01/autojump-xonsh",
description="autojump support for xonsh",
),
"autovox": Xontrib(
url="http://xon.sh",
description="Manages automatic activation of virtual " "environments.",
package=core_pkg,
),
"autoxsh": Xontrib(
url="https://github.com/Granitas/xonsh-autoxsh",
description="Adds automatic execution of xonsh script files "
"called ``.autoxsh`` when enterting a directory "
"with ``cd`` function",
package=_XontribPkg(
name="xonsh-autoxsh",
license="GPLv3",
install={"pip": "xpip install xonsh-autoxsh"},
url="https://github.com/Granitas/xonsh-autoxsh",
),
),
"avox": Xontrib(
url="https://github.com/AstraLuma/xontrib-avox",
description="Automatic (de)activation of virtual environments as "
"you cd around",
package=_XontribPkg(
name="xontrib-avox",
license="GPLv3",
install={"pip": "xpip install xontrib-avox"},
url="https://github.com/AstraLuma/xontrib-avox",
),
),
"back2dir": Xontrib(
url="https://github.com/anki-code/xontrib-back2dir",
description="Return to the most recently used directory when "
"starting the xonsh shell. For example, if you "
"were in the '/work' directory when you last "
"exited xonsh, then your next xonsh session will "
"start in the '/work' directory, instead of your "
"home directory.",
package=_XontribPkg(
name="xontrib-back2dir",
license="BSD",
install={"pip": "xpip install xontrib-back2dir"},
url="https://github.com/anki-code/xontrib-back2dir",
),
),
"base16_shell": Xontrib(
url="https://github.com/ErickTucto/xontrib-base16-shell",
description="Change base16 shell themes",
),
"bashisms": Xontrib(
url="http://xon.sh",
description="Enables additional Bash-like syntax while at the "
"command prompt. For example, the ``!!`` syntax "
"for running the previous command is now usable. "
"Note that these features are implemented as "
"precommand events and these additions do not "
"affect the xonsh language when run as script. "
"That said, you might find them useful if you "
"have strong muscle memory.\n"
"\n"
"**Warning:** This xontrib may modify user "
"command line input to implement its behavior. To "
"see the modifications as they are applied (in "
"unified diffformat), please set ``$XONSH_DEBUG`` "
"to ``2`` or higher.\n"
"\n"
"The xontrib also adds commands: ``alias``, "
"``export``, ``unset``, ``set``, ``shopt``, "
"``complete``.",
package=core_pkg,
),
"cmd_done": Xontrib(
url="https://github.com/jnoortheen/xontrib-cmd-durations",
description="send notification once long-running command is "
"finished. Adds `long_cmd_duration` field to "
"$PROMPT_FIELDS. Note: It needs `xdotool` "
"installed to detect current window.",
package=_XontribPkg(
name="xontrib-cmd-durations",
license="MIT",
install={"pip": "xpip install xontrib-cmd-durations"},
url="https://github.com/jnoortheen/xontrib-cmd-durations",
),
),
"coreutils": Xontrib(
url="http://xon.sh",
description="Additional core utilities that are implemented "
"in xonsh. The current list includes:\n"
"\n"
"* cat\n"
"* echo\n"
"* pwd\n"
"* tee\n"
"* tty\n"
"* yes\n"
"\n"
"In many cases, these may have a lower "
"performance overhead than the posix command "
"line utility with the same name. This is "
"because these tools avoid the need for a full "
"subprocess call. Additionally, these tools are "
"cross-platform.",
package=core_pkg,
),
"direnv": Xontrib(
url="https://github.com/74th/xonsh-direnv",
description="Supports direnv.",
package=_XontribPkg(
name="xonsh-direnv",
license="MIT",
install={"pip": "xpip install xonsh-direnv"},
url="https://github.com/74th/xonsh-direnv",
),
),
"distributed": Xontrib(
url="http://xon.sh",
description="The distributed parallel computing library "
"hooks for xonsh. Importantly this provides a "
"substitute 'dworker' command which enables "
"distributed workers to have access to xonsh "
"builtins.\n"
"\n"
"Furthermore, this xontrib adds a 'DSubmitter' "
"context manager for executing a block "
"remotely. Moreover, this also adds a "
"convenience function 'dsubmit()' for creating "
"DSubmitter and Executor instances at the same "
"time. Thus users may submit distributed jobs "
"with::\n"
"\n"
" with dsubmit('127.0.0.1:8786', rtn='x') "
"as dsub:\n"
" x = $(echo I am elsewhere)\n"
"\n"
" res = dsub.future.result()\n"
" print(res)\n"
"\n"
"This is useful for long running or "
"non-blocking jobs.",
package=core_pkg,
),
"docker_tabcomplete": Xontrib(
url="https://github.com/xsteadfastx/xonsh-docker-tabcomplete",
description="Adds tabcomplete functionality to " "docker inside of xonsh.",
package=_XontribPkg(
name="xonsh-docker-tabcomplete",
license="MIT",
install={"pip": "xpip install xonsh-docker-tabcomplete"},
url="https://github.com/xsteadfastx/xonsh-docker-tabcomplete",
),
),
"free_cwd": Xontrib(
url="http://xon.sh",
description="Windows only xontrib, to release the lock on the "
"current directory whenever the prompt is shown. "
"Enabling this will allow the other programs or "
"Windows Explorer to delete or rename the current "
"or parent directories. Internally, it is "
"accomplished by temporarily resetting CWD to the "
"root drive folder while waiting at the prompt. "
"This only works with the prompt_toolkit backend "
"and can cause cause issues if any extensions are "
"enabled that hook the prompt and relies on "
"``os.getcwd()``",
package=core_pkg,
),
"fzf-widgets": Xontrib(
url="https://github.com/laloch/xontrib-fzf-widgets",
description="Adds some fzf widgets to your xonsh shell.",
package=_XontribPkg(
name="xontrib-fzf-widgets",
license="GPLv3",
install={"pip": "xpip install xontrib-fzf-widgets"},
url="https://github.com/laloch/xontrib-fzf-widgets",
),
),
"gitinfo": Xontrib(
url="https://github.com/dyuri/xontrib-gitinfo",
description="Displays git information on entering a repository "
"folder. Uses ``onefetch`` if available.",
package=_XontribPkg(
name="xontrib-gitinfo",
license="MIT",
install={"pip": "xpip install xontrib-gitinfo"},
url="https://github.com/dyuri/xontrib-gitinfo",
),
),
"hist_navigator": Xontrib(
url="https://github.com/jnoortheen/xontrib-hist-navigator",
description="Move through directory history with nextd "
"and prevd also with keybindings.",
package=_XontribPkg(
name="xontrib-hist-navigator",
license="MIT",
install={"pip": "xpip install xontrib-hist-navigator"},
url="https://github.com/jnoortheen/xontrib-hist-navigator",
),
),
"histcpy": Xontrib(
url="https://github.com/con-f-use/xontrib-histcpy",
description="Useful aliases and shortcuts for extracting links "
"and textfrom command output history and putting "
"them into the clipboard.",
package=_XontribPkg(
name="xontrib-histcpy",
license="GPLv3",
install={"pip": "xpip install xontrib-histcpy"},
url="https://github.com/con-f-use/xontrib-histcpy",
),
),
"jedi": Xontrib(
url="http://xon.sh",
description="Use Jedi as xonsh's python completer.",
package=core_pkg,
),
"kitty": Xontrib(
url="https://github.com/scopatz/xontrib-kitty",
description="Xonsh hooks for the Kitty terminal emulator.",
package=_XontribPkg(
name="xontrib-kitty",
license="BSD-3-Clause",
install={
"conda": "conda install -c conda-forge " "xontrib-kitty",
"pip": "xpip install xontrib-kitty",
},
url="https://github.com/scopatz/xontrib-kitty",
),
),
"mpl": Xontrib(
url="http://xon.sh",
description="Matplotlib hooks for xonsh, including the new 'mpl' "
"alias that displays the current figure on the screen.",
package=core_pkg,
),
"onepath": Xontrib(
url="https://github.com/anki-code/xontrib-onepath",
description="When you click to a file or folder in graphical "
"OS they will be opened in associated app.The "
"xontrib-onepath brings the same logic for the "
"xonsh shell. Type the filename or pathwithout "
"preceding command and an associated action will "
"be executed. The actions are customizable.",
package=_XontribPkg(
name="xontrib-onepath",
license="BSD",
install={"pip": "xpip install xontrib-onepath"},
url="https://github.com/anki-code/xontrib-onepath",
),
),
"output_search": Xontrib(
url="https://github.com/anki-code/xontrib-output-search",
description="Get identifiers, names, paths, URLs and "
"words from the previous command output and "
"use them for the next command.",
package=_XontribPkg(
name="xontrib-output-search",
license="BSD",
install={"pip": "xpip install xontrib-output-search"},
url="https://github.com/tokenizer/xontrib-output-search",
),
),
"pdb": Xontrib(
url="http://xon.sh",
description="Simple built-in debugger. Runs pdb on reception of "
"SIGUSR1 signal.",
package=core_pkg,
),
"pipeliner": Xontrib(
url="https://github.com/anki-code/xontrib-pipeliner",
description="Let your pipe lines flow thru the Python code " "in xonsh.",
package=_XontribPkg(
name="xontrib-pipeliner",
license="MIT",
install={"pip": "xpip install xontrib-pipeliner"},
url="https://github.com/anki-code/xontrib-pipeliner",
),
),
"powerline": Xontrib(
url="https://github.com/santagada/xontrib-powerline",
description="Powerline for Xonsh shell",
package=_XontribPkg(
name="xontrib-powerline",
license="MIT",
install={"pip": "xpip install xontrib-powerline"},
url="https://github.com/santagada/xontrib-powerline",
),
),
"powerline2": Xontrib(
url="https://github.com/vaaaaanquish/xontrib-powerline2",
description="Powerline for Xonsh shell forked from "
"santagada/xontrib-powerline",
package=_XontribPkg(
name="xontrib-powerline2",
license="MIT",
install={"pip": "xpip install xontrib-powerline2"},
url="https://github.com/vaaaaanquish/xontrib-powerline2",
),
),
"powerline_binding": Xontrib(
url="https://github.com/dyuri/xontrib-powerline-binding",
description="Uses powerline to render the xonsh " "prompt",
package=_XontribPkg(
name="xontrib-powerline-binding",
license="MIT",
install={"pip": "xpip install xontrib-powerline-binding"},
url="https://github.com/dyuri/xontrib-powerline-binding",
),
),
"prompt_bar": Xontrib(
url="https://github.com/anki-code/xontrib-prompt-bar",
description="An elegance bar style for prompt.",
package=_XontribPkg(
name="xontrib-prompt-bar",
license="MIT",
install={"pip": "xpip install xontrib-prompt-bar"},
url="https://github.com/anki-code/xontrib-prompt-bar",
),
),
"prompt_ret_code": Xontrib(
url="http://xon.sh",
description="Adds return code info to the prompt",
package=core_pkg,
),
"prompt_vi_mode": Xontrib(
url="https://github.com/t184256/xontrib-prompt-vi-mode",
description="vi-mode status formatter for xonsh prompt",
package=_XontribPkg(
name="xontrib-prompt-vi-mode",
license="MIT",
install={"pip": "xpip install xontrib-prompt-vi-mode"},
url="https://github.com/t184256/xontrib-prompt-vi-mode",
),
),
"pyenv": Xontrib(
url="https://github.com/dyuri/xontrib-pyenv",
description="pyenv integration for xonsh.",
package=_XontribPkg(
name="xontrib-pyenv",
license="MIT",
install={"pip": "xpip install xontrib-pyenv"},
url="https://github.com/dyuri/xontrib-pyenv",
),
),
"readable-traceback": Xontrib(
url="https://github.com/6syun9/xontrib-readable-traceback",
description="Make traceback easier to see for " "xonsh.",
package=_XontribPkg(
name="xontrib-readable-traceback",
license="MIT",
install={"pip": "xpip install xontrib-readable-traceback"},
url="https://github.com/6syun9/xontrib-readable-traceback",
),
),
"schedule": Xontrib(
url="https://github.com/AstraLuma/xontrib-schedule",
description="Xonsh Task Scheduling",
package=_XontribPkg(
name="xontrib-schedule",
license="MIT",
install={"pip": "xpip install xontrib-schedule"},
url="https://github.com/AstraLuma/xontrib-schedule",
),
),
"scrapy_tabcomplete": Xontrib(
url="https://github.com/Granitas/xonsh-scrapy-tabcomplete",
description="Adds tabcomplete functionality to " "scrapy inside of xonsh.",
package=_XontribPkg(
name="xonsh-scrapy-tabcomplete",
license="GPLv3",
install={"pip": "xpip install xonsh-scrapy-tabcomplete"},
url="https://github.com/Granitas/xonsh-scrapy-tabcomplete",
),
),
"sh": Xontrib(
url="https://github.com/anki-code/xontrib-sh",
description="Paste and run commands from bash, zsh, fish in xonsh "
"shell.",
package=_XontribPkg(
name="xontrib-sh",
license="MIT",
install={"pip": "xpip install xontrib-sh"},
url="https://github.com/anki-code/xontrib-sh",
),
),
"ssh_agent": Xontrib(
url="https://github.com/dyuri/xontrib-ssh-agent",
description="ssh-agent integration",
package=_XontribPkg(
name="xontrib-ssh-agent",
license="MIT",
install={"pip": "xpip install xontrib-ssh-agent"},
url="https://github.com/dyuri/xontrib-ssh-agent",
),
),
"vox": Xontrib(
url="http://xon.sh",
description="Python virtual environment manager for xonsh.",
package=core_pkg,
),
"vox_tabcomplete": Xontrib(
url="https://github.com/Granitosaurus/xonsh-vox-tabcomplete",
description="Adds tabcomplete functionality to vox " "inside of xonsh.",
package=_XontribPkg(
name="xonsh-vox-tabcomplete",
license="GPLv3",
install={"pip": "xpip install xonsh-vox-tabcomplete"},
url="https://github.com/Granitosaurus/xonsh-vox-tabcomplete",
),
),
"whole_word_jumping": Xontrib(
url="http://xon.sh",
description="Jumping across whole words "
"(non-whitespace) with Ctrl+Left/Right. "
"Alt+Left/Right remains unmodified to "
"jump over smaller word segments. "
"Shift+Delete removes the whole word.",
package=core_pkg,
),
"xo": Xontrib(
url="https://github.com/scopatz/xo",
description="Adds an 'xo' alias to run the exofrills text editor in "
"the current Python interpreter session. This shaves "
"off a bit of the startup time when running your "
"favorite, minimal text editor.",
package=_XontribPkg(
name="exofrills",
license="WTFPL",
install={
"conda": "conda install -c conda-forge xo",
"pip": "xpip install exofrills",
},
url="http://exofrills.org",
),
),
"xog": Xontrib(
url="http://xon.sh",
description="Adds a simple command to establish and print "
"temporary traceback log file.",
package=core_pkg,
),
"xpg": Xontrib(
url="https://github.com/fengttt/xsh/tree/master/py",
description="Run/plot/explain sql query for PostgreSQL.",
package=_XontribPkg(
name="xontrib-xpg",
license="Apache",
install={"pip": "xpip install xontrib-xpg"},
url="https://github.com/fengttt/xsh/py",
),
),
"z": Xontrib(
url="https://github.com/AstraLuma/xontrib-z",
description="Tracks your most used directories, based on 'frecency'.",
package=_XontribPkg(
name="xontrib-z",
license="GPLv3",
install={"pip": "xpip install xontrib-z"},
url="https://github.com/AstraLuma/xontrib-z",
),
),
"zoxide": Xontrib(
url="https://github.com/dyuri/xontrib-zoxide",
description="Zoxide integration for xonsh.",
package=_XontribPkg(
name="xontrib-zoxide",
license="MIT",
install={"pip": "xpip install xontrib-zoxide"},
url="https://github.com/dyuri/xontrib-zoxide",
),
),
}