mirror of
https://github.com/xonsh/xonsh.git
synced 2025-03-04 08:24:40 +01:00
Pre commit ci (#4863)
This commit is contained in:
parent
8b9a7e2782
commit
cbf23e60fb
30 changed files with 186 additions and 232 deletions
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
|
@ -54,9 +54,7 @@ jobs:
|
||||||
timeout-minutes: 15
|
timeout-minutes: 15
|
||||||
- name: Run QA Checks
|
- name: Run QA Checks
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') && startsWith(matrix.python-version, '3.10') }}
|
if: ${{ startsWith(matrix.os, 'ubuntu') && startsWith(matrix.python-version, '3.10') }}
|
||||||
run: |
|
run: python -m xonsh run-tests.xsh validate-news-items
|
||||||
python -m pip install -e ".[lint]"
|
|
||||||
python -m xonsh run-tests.xsh qa
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
if: ${{ !startsWith(matrix.python-version, '3.10') }}
|
if: ${{ !startsWith(matrix.python-version, '3.10') }}
|
||||||
run: |
|
run: |
|
||||||
|
|
|
@ -1,49 +1,80 @@
|
||||||
|
default_language_version:
|
||||||
|
# force all unspecified python hooks to run python3
|
||||||
|
python: python3.10
|
||||||
|
|
||||||
|
ci:
|
||||||
|
autofix_prs: false
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
- repo: local
|
- repo: https://github.com/psf/black
|
||||||
|
rev: 22.6.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
name: black
|
entry: black xonsh xontrib tests xompletions
|
||||||
# this gets run within development environment.
|
|
||||||
# Otherwise will raise command not found or use system level binary
|
|
||||||
entry: black xonsh/ xontrib/ tests/
|
|
||||||
language: system
|
|
||||||
stages: [ commit ]
|
|
||||||
types:
|
|
||||||
- python
|
|
||||||
- id: isort
|
|
||||||
name: isort
|
|
||||||
# this gets run within development environment.
|
|
||||||
# Otherwise will raise command not found or use system level binary
|
|
||||||
entry: isort xonsh/ xontrib/ tests/
|
|
||||||
language: system
|
|
||||||
stages: [ commit ]
|
|
||||||
types:
|
|
||||||
- python
|
|
||||||
- id: qa
|
|
||||||
name: qa
|
|
||||||
entry: xonsh run-tests.xsh qa
|
|
||||||
language: system
|
|
||||||
stages: [ push ]
|
|
||||||
pass_filenames: false
|
pass_filenames: false
|
||||||
types:
|
- repo: https://github.com/pycqa/isort
|
||||||
- python
|
rev: 5.10.1
|
||||||
|
hooks:
|
||||||
|
- id: isort
|
||||||
|
entry: isort xonsh xontrib tests xompletions
|
||||||
|
pass_filenames: false
|
||||||
|
name: isort (python)
|
||||||
|
- repo: https://github.com/pycqa/flake8
|
||||||
|
rev: '4.0.1' # pick a git hash / tag to point to
|
||||||
|
hooks:
|
||||||
|
- id: flake8
|
||||||
|
additional_dependencies:
|
||||||
|
- flake8-docstrings
|
||||||
|
- flake8-bugbear
|
||||||
|
# Check for debugger imports and py37+ breakpoint() calls in python source.
|
||||||
|
- flake8-debugger
|
||||||
|
exclude: |
|
||||||
|
(?x)^(
|
||||||
|
xonsh/ply/.+|
|
||||||
|
docs/.+
|
||||||
|
)$
|
||||||
|
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||||
|
rev: 'v0.961' # Use the sha / tag you want to point at
|
||||||
|
hooks:
|
||||||
|
- id: mypy
|
||||||
|
name: mypy xonsh
|
||||||
|
pass_filenames: false
|
||||||
|
entry: mypy xonsh
|
||||||
|
additional_dependencies:
|
||||||
|
- types-ujson
|
||||||
|
- id: mypy
|
||||||
|
name: mypy xontrib
|
||||||
|
pass_filenames: false
|
||||||
|
entry: mypy xontrib --namespace-packages --explicit-package-bases
|
||||||
|
additional_dependencies:
|
||||||
|
- types-ujson
|
||||||
|
- id: mypy
|
||||||
|
name: mypy xompletions
|
||||||
|
pass_filenames: false
|
||||||
|
entry: mypy xompletions --namespace-packages --explicit-package-bases
|
||||||
|
additional_dependencies:
|
||||||
|
- types-ujson
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v4.2.0
|
rev: v4.3.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
|
exclude: |
|
||||||
|
(?x)^(
|
||||||
|
docs/_static/.+
|
||||||
|
)$
|
||||||
- id: check-case-conflict
|
- id: check-case-conflict
|
||||||
- id: check-merge-conflict
|
- id: check-merge-conflict
|
||||||
- id: check-yaml
|
- id: check-yaml
|
||||||
- id: check-toml
|
- id: check-toml
|
||||||
|
|
||||||
# Check for debugger imports and py37+ breakpoint() calls in python source.
|
|
||||||
- id: debug-statements
|
|
||||||
|
|
||||||
- id: check-added-large-files
|
- id: check-added-large-files
|
||||||
|
|
||||||
- repo: https://github.com/asottile/pyupgrade
|
- repo: https://github.com/asottile/pyupgrade
|
||||||
rev: v2.32.1
|
rev: v2.34.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: pyupgrade
|
- id: pyupgrade
|
||||||
args: [--py37-plus]
|
args: [--py38-plus]
|
||||||
|
exclude: |
|
||||||
|
(?x)^(
|
||||||
|
xonsh/ply/.+|
|
||||||
|
tests/bin/.+
|
||||||
|
)$
|
||||||
|
|
|
@ -95,18 +95,6 @@ full = [
|
||||||
"setproctitle; platform_system=='Windows'",
|
"setproctitle; platform_system=='Windows'",
|
||||||
"gnureadline; platform_system=='Darwin'",
|
"gnureadline; platform_system=='Darwin'",
|
||||||
]
|
]
|
||||||
format = [
|
|
||||||
"black==22.3.0",
|
|
||||||
"isort>=5.10",
|
|
||||||
]
|
|
||||||
lint = [
|
|
||||||
"xonsh[format]",
|
|
||||||
"flake8",
|
|
||||||
"flake8-docstrings",
|
|
||||||
"flake8-bugbear",
|
|
||||||
"mypy==0.941",
|
|
||||||
"types-ujson",
|
|
||||||
]
|
|
||||||
bestshell = [
|
bestshell = [
|
||||||
"prompt_toolkit>=3.0.29",
|
"prompt_toolkit>=3.0.29",
|
||||||
"pygments>=2.2",
|
"pygments>=2.2",
|
||||||
|
@ -128,10 +116,8 @@ test = [
|
||||||
"amalgamate",
|
"amalgamate",
|
||||||
]
|
]
|
||||||
dev = [
|
dev = [
|
||||||
"xonsh[lint,test,doc]",
|
"xonsh[test,doc]",
|
||||||
"pre-commit",
|
"pre-commit",
|
||||||
"sniffer",
|
|
||||||
"pyinotify; sys_platform == \"linux\"",
|
|
||||||
"re-ver",
|
"re-ver",
|
||||||
"tomli",
|
"tomli",
|
||||||
]
|
]
|
||||||
|
|
|
@ -20,7 +20,7 @@ $VERSION_BUMP_PATTERNS = [
|
||||||
$CHANGELOG_FILENAME = 'CHANGELOG.rst'
|
$CHANGELOG_FILENAME = 'CHANGELOG.rst'
|
||||||
$CHANGELOG_TEMPLATE = 'TEMPLATE.rst'
|
$CHANGELOG_TEMPLATE = 'TEMPLATE.rst'
|
||||||
|
|
||||||
$PYTEST_COMMAND = "./run-tests.xsh -- test"
|
$PYTEST_COMMAND = "./run-tests.xsh test"
|
||||||
|
|
||||||
$TAG_REMOTE = 'git@github.com:xonsh/xonsh.git'
|
$TAG_REMOTE = 'git@github.com:xonsh/xonsh.git'
|
||||||
$TAG_TARGET = 'main'
|
$TAG_TARGET = 'main'
|
||||||
|
|
|
@ -60,28 +60,17 @@ def test(
|
||||||
![pytest @(_replace_args(pytest_args, 0)) --durations=5]
|
![pytest @(_replace_args(pytest_args, 0)) --durations=5]
|
||||||
|
|
||||||
|
|
||||||
def qa():
|
|
||||||
"""QA checks"""
|
|
||||||
$XONSH_NO_AMALGAMATE = True
|
|
||||||
$XONSH_TRACE_SUBPROC_FUNC = colored_tracer
|
|
||||||
$XONSH_TRACE_SUBPROC = True
|
|
||||||
|
|
||||||
black --check xonsh xontrib tests xompletions
|
def validate_news_items(
|
||||||
isort --check xonsh xontrib tests xompletions
|
pytest_args: xcli.Arg(nargs='*') = (),
|
||||||
|
):
|
||||||
python -m flake8
|
![pytest -m news @(pytest_args)]
|
||||||
|
|
||||||
mypy xonsh
|
|
||||||
mypy xontrib --namespace-packages --explicit-package-bases
|
|
||||||
mypy xompletions --namespace-packages --explicit-package-bases
|
|
||||||
|
|
||||||
pytest -m news
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
parser = xcli.make_parser("test commands")
|
parser = xcli.make_parser("test commands")
|
||||||
parser.add_command(test)
|
parser.add_command(test)
|
||||||
parser.add_command(qa)
|
parser.add_command(validate_news_items)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
xcli.dispatch(parser)
|
xcli.dispatch(parser)
|
||||||
|
|
47
scent.py
47
scent.py
|
@ -1,47 +0,0 @@
|
||||||
"""Configuration file for sniffer."""
|
|
||||||
|
|
||||||
import time
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
from sniffer.api import select_runnable, file_validator, runnable
|
|
||||||
|
|
||||||
try:
|
|
||||||
from pync import Notifier
|
|
||||||
except ImportError:
|
|
||||||
notify = None
|
|
||||||
else:
|
|
||||||
notify = Notifier.notify
|
|
||||||
|
|
||||||
watch_paths = ['.']
|
|
||||||
|
|
||||||
|
|
||||||
@select_runnable('python')
|
|
||||||
@file_validator
|
|
||||||
def py_files(filename):
|
|
||||||
return "TemplateDemo" not in filename
|
|
||||||
|
|
||||||
|
|
||||||
@runnable
|
|
||||||
def python(*_):
|
|
||||||
group = int(time.time()) # unique per run
|
|
||||||
|
|
||||||
for count, (command, title) in enumerate((
|
|
||||||
(('dmypy', 'run', "--", "xonsh"), "type-check"),
|
|
||||||
(('flake8', '.'), "Lint"),
|
|
||||||
(('xonsh', 'run-tests.xsh', 'test'), "test"),
|
|
||||||
), start=1):
|
|
||||||
|
|
||||||
print(f"\n$ {' '.join(command)}")
|
|
||||||
failure = subprocess.call(command)
|
|
||||||
|
|
||||||
if failure:
|
|
||||||
if notify and title:
|
|
||||||
mark = "❌" * count
|
|
||||||
notify(mark + " [FAIL] " + mark, title=title, group=group)
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
if notify and title:
|
|
||||||
mark = "✅" * count
|
|
||||||
notify(mark + " [PASS] " + mark, title=title, group=group)
|
|
||||||
|
|
||||||
return True
|
|
|
@ -119,8 +119,9 @@ pretty = True
|
||||||
ignore_errors = True
|
ignore_errors = True
|
||||||
|
|
||||||
# 3rd party libraries that we dont have control over
|
# 3rd party libraries that we dont have control over
|
||||||
[mypy-zmq.*,setproctitle,xonsh.ply.*,jupyter_client.*,winreg.*,pygments.*,prompt_toolkit.*,importlib_resources.*,nt.*,prompt_toolkit.*,distro.*,conda_suggest.*,_winreg.*,*.__amalgam__.*]
|
[mypy-zmq.*,setproctitle,xonsh.ply.*,winreg.*,pygments.*,importlib_resources.*,nt.*,prompt_toolkit.*,distro.*,conda_suggest.*,_winreg.*,*.__amalgam__.*]
|
||||||
ignore_missing_imports = True
|
ignore_missing_imports = True
|
||||||
|
ignore_errors = True
|
||||||
|
|
||||||
[tool:pytest]
|
[tool:pytest]
|
||||||
cache_dir = .cache/pytest
|
cache_dir = .cache/pytest
|
||||||
|
|
|
@ -43,7 +43,7 @@ def _windows_bash_command(env=None):
|
||||||
out = subprocess.check_output(
|
out = subprocess.check_output(
|
||||||
[bash_on_path, "--version"],
|
[bash_on_path, "--version"],
|
||||||
stderr=subprocess.PIPE,
|
stderr=subprocess.PIPE,
|
||||||
universal_newlines=True,
|
text=True,
|
||||||
)
|
)
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
bash_works = False
|
bash_works = False
|
||||||
|
@ -387,7 +387,7 @@ def bash_completions(
|
||||||
try:
|
try:
|
||||||
out = subprocess.check_output(
|
out = subprocess.check_output(
|
||||||
[command, "-c", script],
|
[command, "-c", script],
|
||||||
universal_newlines=True,
|
text=True,
|
||||||
stderr=subprocess.PIPE,
|
stderr=subprocess.PIPE,
|
||||||
env=env,
|
env=env,
|
||||||
)
|
)
|
||||||
|
|
|
@ -109,9 +109,7 @@ def _unc_map_temp_drive(unc_path) -> str:
|
||||||
for dord in range(ord("z"), ord("a"), -1):
|
for dord in range(ord("z"), ord("a"), -1):
|
||||||
d = chr(dord) + ":"
|
d = chr(dord) + ":"
|
||||||
if not os.path.isdir(d): # find unused drive letter starting from z:
|
if not os.path.isdir(d): # find unused drive letter starting from z:
|
||||||
subprocess.check_output(
|
subprocess.check_output(["NET", "USE", d, unc_share], text=True)
|
||||||
["NET", "USE", d, unc_share], universal_newlines=True
|
|
||||||
)
|
|
||||||
_unc_tempDrives[d] = unc_share
|
_unc_tempDrives[d] = unc_share
|
||||||
return os.path.join(d, rem_path)
|
return os.path.join(d, rem_path)
|
||||||
|
|
||||||
|
@ -136,9 +134,7 @@ def _unc_unmap_temp_drive(left_drive, cwd):
|
||||||
return
|
return
|
||||||
|
|
||||||
_unc_tempDrives.pop(left_drive)
|
_unc_tempDrives.pop(left_drive)
|
||||||
subprocess.check_output(
|
subprocess.check_output(["NET", "USE", left_drive, "/delete"], text=True)
|
||||||
["NET", "USE", left_drive, "/delete"], universal_newlines=True
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
events.doc(
|
events.doc(
|
||||||
|
|
|
@ -99,7 +99,7 @@ def DEFAULT_SETERRPOSTCMD():
|
||||||
return {"bash": "", "zsh": "", "cmd": "if errorlevel 1 exit 1"}
|
return {"bash": "", "zsh": "", "cmd": "if errorlevel 1 exit 1"}
|
||||||
|
|
||||||
|
|
||||||
@functools.lru_cache()
|
@functools.lru_cache
|
||||||
def foreign_shell_data(
|
def foreign_shell_data(
|
||||||
shell,
|
shell,
|
||||||
interactive=True,
|
interactive=True,
|
||||||
|
@ -246,7 +246,7 @@ def foreign_shell_data(
|
||||||
# start new session to avoid hangs
|
# start new session to avoid hangs
|
||||||
# (doesn't work on Cygwin though)
|
# (doesn't work on Cygwin though)
|
||||||
start_new_session=((not ON_CYGWIN) and (not ON_MSYS)),
|
start_new_session=((not ON_CYGWIN) and (not ON_MSYS)),
|
||||||
universal_newlines=True,
|
text=True,
|
||||||
)
|
)
|
||||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||||
if not safe:
|
if not safe:
|
||||||
|
|
|
@ -381,7 +381,7 @@ def windows_bash_command():
|
||||||
out = subprocess.check_output(
|
out = subprocess.check_output(
|
||||||
[bash_on_path, "--version"],
|
[bash_on_path, "--version"],
|
||||||
stderr=subprocess.PIPE,
|
stderr=subprocess.PIPE,
|
||||||
universal_newlines=True,
|
text=True,
|
||||||
)
|
)
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
bash_works = False
|
bash_works = False
|
||||||
|
|
|
@ -222,7 +222,7 @@ def hg_dirty_working_directory():
|
||||||
stderr=subprocess.PIPE,
|
stderr=subprocess.PIPE,
|
||||||
cwd=cwd,
|
cwd=cwd,
|
||||||
timeout=vcbt,
|
timeout=vcbt,
|
||||||
universal_newlines=True,
|
text=True,
|
||||||
env=denv,
|
env=denv,
|
||||||
)
|
)
|
||||||
return s.strip(os.linesep).endswith("+")
|
return s.strip(os.linesep).endswith("+")
|
||||||
|
|
|
@ -57,7 +57,7 @@ def skip_if_not_has(exe: str):
|
||||||
|
|
||||||
|
|
||||||
def sp(cmd):
|
def sp(cmd):
|
||||||
return subprocess.check_output(cmd, universal_newlines=True)
|
return subprocess.check_output(cmd, text=True)
|
||||||
|
|
||||||
|
|
||||||
class DummyStyler:
|
class DummyStyler:
|
||||||
|
|
|
@ -867,7 +867,7 @@ def debian_command_not_found(cmd):
|
||||||
c = "{0} {1}; exit 0"
|
c = "{0} {1}; exit 0"
|
||||||
s = subprocess.check_output(
|
s = subprocess.check_output(
|
||||||
c.format(cnf, shlex.quote(cmd)),
|
c.format(cnf, shlex.quote(cmd)),
|
||||||
universal_newlines=True,
|
text=True,
|
||||||
stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
shell=True,
|
shell=True,
|
||||||
)
|
)
|
||||||
|
@ -902,7 +902,7 @@ def command_not_found(cmd, env):
|
||||||
return rtn
|
return rtn
|
||||||
|
|
||||||
|
|
||||||
@functools.lru_cache()
|
@functools.lru_cache
|
||||||
def suggest_commands(cmd, env):
|
def suggest_commands(cmd, env):
|
||||||
"""Suggests alternative commands given an environment and aliases."""
|
"""Suggests alternative commands given an environment and aliases."""
|
||||||
if not env.get("SUGGEST_COMMANDS"):
|
if not env.get("SUGGEST_COMMANDS"):
|
||||||
|
|
|
@ -10,7 +10,7 @@ from xonsh.built_ins import XSH
|
||||||
from xonsh.xoreutils import _which
|
from xonsh.xoreutils import _which
|
||||||
|
|
||||||
|
|
||||||
@functools.lru_cache()
|
@functools.lru_cache
|
||||||
def _which_create_parser():
|
def _which_create_parser():
|
||||||
desc = "Parses arguments to which wrapper"
|
desc = "Parses arguments to which wrapper"
|
||||||
parser = argparse.ArgumentParser("which", description=desc)
|
parser = argparse.ArgumentParser("which", description=desc)
|
||||||
|
|
|
@ -6,9 +6,9 @@ from xonsh.built_ins import XonshSession
|
||||||
|
|
||||||
def handle_sigusr1(sig, frame):
|
def handle_sigusr1(sig, frame):
|
||||||
print("\nSIGUSR1 signal received. Starting interactive debugger...", flush=True)
|
print("\nSIGUSR1 signal received. Starting interactive debugger...", flush=True)
|
||||||
import pdb
|
import pdb # noqa
|
||||||
|
|
||||||
pdb.Pdb().set_trace(frame)
|
pdb.Pdb().set_trace(frame) # noqa
|
||||||
|
|
||||||
|
|
||||||
def _load_xontrib_(xsh: XonshSession, **_):
|
def _load_xontrib_(xsh: XonshSession, **_):
|
||||||
|
|
Loading…
Add table
Reference in a new issue