mirror of
https://github.com/saltstack/salt.git
synced 2025-04-16 17:50:20 +00:00
Lay the ground for invoke
usage
This commit is contained in:
parent
8d70836c61
commit
a5b9961f78
11 changed files with 253 additions and 2 deletions
|
@ -505,6 +505,48 @@ repos:
|
||||||
- --py-version=3.9
|
- --py-version=3.9
|
||||||
- --platform=linux
|
- --platform=linux
|
||||||
|
|
||||||
|
# ----- Invoke ---------------------------------------------------------------------------------------------------->
|
||||||
|
- id: pip-tools-compile
|
||||||
|
alias: compile-py3.5-invoke-requirements
|
||||||
|
name: Linux Py3.5 Invoke Requirements
|
||||||
|
files: ^requirements/static/invoke\.in$
|
||||||
|
args:
|
||||||
|
- -v
|
||||||
|
- --py-version=3.5
|
||||||
|
|
||||||
|
- id: pip-tools-compile
|
||||||
|
alias: compile-py3.6-invoke-requirements
|
||||||
|
name: Linux Py3.6 Invoke Requirements
|
||||||
|
files: ^requirements/static/invoke\.in$
|
||||||
|
args:
|
||||||
|
- -v
|
||||||
|
- --py-version=3.6
|
||||||
|
|
||||||
|
- id: pip-tools-compile
|
||||||
|
alias: compile-py3.7-invoke-requirements
|
||||||
|
name: Linux Py3.7 Invoke Requirements
|
||||||
|
files: ^requirements/static/invoke\.in$
|
||||||
|
args:
|
||||||
|
- -v
|
||||||
|
- --py-version=3.7
|
||||||
|
|
||||||
|
- id: pip-tools-compile
|
||||||
|
alias: compile-py3.8-invoke-requirements
|
||||||
|
name: Linux Py3.8 Invoke Requirements
|
||||||
|
files: ^requirements/static/invoke\.in$
|
||||||
|
args:
|
||||||
|
- -v
|
||||||
|
- --py-version=3.8
|
||||||
|
|
||||||
|
- id: pip-tools-compile
|
||||||
|
alias: compile-py3.9-invoke-requirements
|
||||||
|
name: Linux Py3.9 Invoke Requirements
|
||||||
|
files: ^requirements/static/invoke\.in$
|
||||||
|
args:
|
||||||
|
- -v
|
||||||
|
- --py-version=3.9
|
||||||
|
# <---- Invoke -----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
- repo: https://github.com/timothycrosley/isort
|
- repo: https://github.com/timothycrosley/isort
|
||||||
rev: "1e78a9acf3110e1f9721feb591f89a451fc9876a"
|
rev: "1e78a9acf3110e1f9721feb591f89a451fc9876a"
|
||||||
hooks:
|
hooks:
|
||||||
|
@ -539,7 +581,7 @@ repos:
|
||||||
- id: nox-py2
|
- id: nox-py2
|
||||||
alias: lint-salt
|
alias: lint-salt
|
||||||
name: Lint Salt
|
name: Lint Salt
|
||||||
files: ^((setup|noxfile)|salt/.*)\.py$
|
files: ^((setup|noxfile)|(salt|tasks)/.*)\.py$
|
||||||
args:
|
args:
|
||||||
- -e
|
- -e
|
||||||
- lint-salt-pre-commit
|
- lint-salt-pre-commit
|
||||||
|
|
71
noxfile.py
71
noxfile.py
|
@ -1031,7 +1031,7 @@ def lint_salt(session):
|
||||||
if session.posargs:
|
if session.posargs:
|
||||||
paths = session.posargs
|
paths = session.posargs
|
||||||
else:
|
else:
|
||||||
paths = ["setup.py", "noxfile.py", "salt/"]
|
paths = ["setup.py", "noxfile.py", "salt/", "tasks/"]
|
||||||
_lint(session, ".pylintrc", flags, paths)
|
_lint(session, ".pylintrc", flags, paths)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1133,3 +1133,72 @@ def docs_man(session, compress, update):
|
||||||
if compress:
|
if compress:
|
||||||
session.run("tar", "-cJvf", "man-archive.tar.xz", "_build/man", external=True)
|
session.run("tar", "-cJvf", "man-archive.tar.xz", "_build/man", external=True)
|
||||||
os.chdir("..")
|
os.chdir("..")
|
||||||
|
|
||||||
|
|
||||||
|
def _invoke(session):
|
||||||
|
"""
|
||||||
|
Run invoke tasks
|
||||||
|
"""
|
||||||
|
requirements_file = "requirements/static/invoke.in"
|
||||||
|
distro_constraints = [
|
||||||
|
"requirements/static/{}/invoke.txt".format(_get_pydir(session))
|
||||||
|
]
|
||||||
|
install_command = ["--progress-bar=off", "-r", requirements_file]
|
||||||
|
for distro_constraint in distro_constraints:
|
||||||
|
install_command.extend(["--constraint", distro_constraint])
|
||||||
|
session.install(*install_command, silent=PIP_INSTALL_SILENT)
|
||||||
|
cmd = ["inv"]
|
||||||
|
files = []
|
||||||
|
|
||||||
|
# Unfortunately, invoke doesn't support the nargs functionality like argpase does.
|
||||||
|
# Let's make it behave properly
|
||||||
|
for idx, posarg in enumerate(session.posargs):
|
||||||
|
if idx == 0:
|
||||||
|
cmd.append(posarg)
|
||||||
|
continue
|
||||||
|
if posarg.startswith("--"):
|
||||||
|
cmd.append(posarg)
|
||||||
|
continue
|
||||||
|
files.append(posarg)
|
||||||
|
if files:
|
||||||
|
cmd.append("--files={}".format(" ".join(files)))
|
||||||
|
session.run(*cmd)
|
||||||
|
|
||||||
|
|
||||||
|
@nox.session(name="invoke", python="3")
|
||||||
|
def invoke(session):
|
||||||
|
_invoke(session)
|
||||||
|
|
||||||
|
|
||||||
|
@nox.session(name="invoke-pre-commit", python="3")
|
||||||
|
def invoke_pre_commit(session):
|
||||||
|
if "VIRTUAL_ENV" not in os.environ:
|
||||||
|
session.error(
|
||||||
|
"This should be running from within a virtualenv and "
|
||||||
|
"'VIRTUAL_ENV' was not found as an environment variable."
|
||||||
|
)
|
||||||
|
if "pre-commit" not in os.environ["VIRTUAL_ENV"]:
|
||||||
|
session.error(
|
||||||
|
"This should be running from within a pre-commit virtualenv and "
|
||||||
|
"'VIRTUAL_ENV'({}) does not appear to be a pre-commit virtualenv.".format(
|
||||||
|
os.environ["VIRTUAL_ENV"]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
from nox.virtualenv import VirtualEnv
|
||||||
|
|
||||||
|
# Let's patch nox to make it run inside the pre-commit virtualenv
|
||||||
|
try:
|
||||||
|
session._runner.venv = VirtualEnv( # pylint: disable=unexpected-keyword-arg
|
||||||
|
os.environ["VIRTUAL_ENV"],
|
||||||
|
interpreter=session._runner.func.python,
|
||||||
|
reuse_existing=True,
|
||||||
|
venv=True,
|
||||||
|
)
|
||||||
|
except TypeError:
|
||||||
|
# This is still nox-py2
|
||||||
|
session._runner.venv = VirtualEnv(
|
||||||
|
os.environ["VIRTUAL_ENV"],
|
||||||
|
interpreter=session._runner.func.python,
|
||||||
|
reuse_existing=True,
|
||||||
|
)
|
||||||
|
_invoke(session)
|
||||||
|
|
2
requirements/static/invoke.in
Normal file
2
requirements/static/invoke.in
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
invoke
|
||||||
|
blessings
|
9
requirements/static/py3.5/invoke.txt
Normal file
9
requirements/static/py3.5/invoke.txt
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#
|
||||||
|
# This file is autogenerated by pip-compile
|
||||||
|
# To update, run:
|
||||||
|
#
|
||||||
|
# pip-compile -o requirements/static/py3.5/invoke.txt -v requirements/static/invoke.in
|
||||||
|
#
|
||||||
|
blessings==1.7
|
||||||
|
invoke==1.4.1
|
||||||
|
six==1.14.0 # via blessings
|
9
requirements/static/py3.6/invoke.txt
Normal file
9
requirements/static/py3.6/invoke.txt
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#
|
||||||
|
# This file is autogenerated by pip-compile
|
||||||
|
# To update, run:
|
||||||
|
#
|
||||||
|
# pip-compile -o requirements/static/py3.6/invoke.txt -v requirements/static/invoke.in
|
||||||
|
#
|
||||||
|
blessings==1.7
|
||||||
|
invoke==1.4.1
|
||||||
|
six==1.14.0 # via blessings
|
9
requirements/static/py3.7/invoke.txt
Normal file
9
requirements/static/py3.7/invoke.txt
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#
|
||||||
|
# This file is autogenerated by pip-compile
|
||||||
|
# To update, run:
|
||||||
|
#
|
||||||
|
# pip-compile -o requirements/static/py3.7/invoke.txt -v requirements/static/invoke.in
|
||||||
|
#
|
||||||
|
blessings==1.7
|
||||||
|
invoke==1.4.1
|
||||||
|
six==1.14.0 # via blessings
|
9
requirements/static/py3.8/invoke.txt
Normal file
9
requirements/static/py3.8/invoke.txt
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#
|
||||||
|
# This file is autogenerated by pip-compile
|
||||||
|
# To update, run:
|
||||||
|
#
|
||||||
|
# pip-compile -o requirements/static/py3.8/invoke.txt -v requirements/static/invoke.in
|
||||||
|
#
|
||||||
|
blessings==1.7
|
||||||
|
invoke==1.4.1
|
||||||
|
six==1.14.0 # via blessings
|
9
requirements/static/py3.9/invoke.txt
Normal file
9
requirements/static/py3.9/invoke.txt
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#
|
||||||
|
# This file is autogenerated by pip-compile
|
||||||
|
# To update, run:
|
||||||
|
#
|
||||||
|
# pip-compile -o requirements/static/py3.9/invoke.txt -v requirements/static/invoke.in
|
||||||
|
#
|
||||||
|
blessings==1.7
|
||||||
|
invoke==1.4.1
|
||||||
|
six==1.14.0 # via blessings
|
28
tasks/README.md
Normal file
28
tasks/README.md
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
# What is this directory?
|
||||||
|
|
||||||
|
This directory contains python scripts which should be called by [invoke](https://pypi.org/project/invoke).
|
||||||
|
|
||||||
|
Instead of having several multi-purpose python scripts scatered through multiple paths in the salt code base,
|
||||||
|
we will now concentrate them under an invoke task.
|
||||||
|
|
||||||
|
## Calling Invoke
|
||||||
|
|
||||||
|
Invoke can be called in the following ways.
|
||||||
|
|
||||||
|
### Installed system-wide
|
||||||
|
|
||||||
|
If invoke is installed system-wide, be sure you also have `blessings` installed if you want coloured output, although
|
||||||
|
it's not a hard requirement.
|
||||||
|
|
||||||
|
```
|
||||||
|
inv docs.check
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using Nox
|
||||||
|
|
||||||
|
Since salt already uses nox, and nox manages virtual environments and respective requirements, calling invoke is as
|
||||||
|
simple as:
|
||||||
|
|
||||||
|
```
|
||||||
|
nox -e invoke -- docs.check
|
||||||
|
```
|
5
tasks/__init__.py
Normal file
5
tasks/__init__.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from invoke import Collection # pylint: disable=3rd-party-module-not-gated
|
||||||
|
|
||||||
|
ns = Collection()
|
60
tasks/utils.py
Normal file
60
tasks/utils.py
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
tasks.utils
|
||||||
|
~~~~~~~~~~~
|
||||||
|
Invoke utilities
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
try:
|
||||||
|
from blessings import Terminal
|
||||||
|
|
||||||
|
terminal = Terminal()
|
||||||
|
HAS_BLESSINGS = True
|
||||||
|
except ImportError:
|
||||||
|
terminal = None
|
||||||
|
HAS_BLESSINGS = False
|
||||||
|
|
||||||
|
|
||||||
|
def exit_invoke(exitcode, message=None, *args, **kwargs):
|
||||||
|
if message is not None:
|
||||||
|
if exitcode > 0:
|
||||||
|
warn(message, *args, **kwargs)
|
||||||
|
else:
|
||||||
|
info(message, *args, **kwargs)
|
||||||
|
sys.exit(exitcode)
|
||||||
|
|
||||||
|
|
||||||
|
def info(message, *args, **kwargs):
|
||||||
|
if not isinstance(message, str):
|
||||||
|
message = str(message)
|
||||||
|
message = message.format(*args, **kwargs)
|
||||||
|
if terminal:
|
||||||
|
message = terminal.bold(terminal.green(message))
|
||||||
|
write_message(message)
|
||||||
|
|
||||||
|
|
||||||
|
def warn(message, *args, **kwargs):
|
||||||
|
if not isinstance(message, str):
|
||||||
|
message = str(message)
|
||||||
|
message = message.format(*args, **kwargs)
|
||||||
|
if terminal:
|
||||||
|
message = terminal.bold(terminal.yellow(message))
|
||||||
|
write_message(message)
|
||||||
|
|
||||||
|
|
||||||
|
def error(message, *args, **kwargs):
|
||||||
|
if not isinstance(message, str):
|
||||||
|
message = str(message)
|
||||||
|
message = message.format(*args, **kwargs)
|
||||||
|
if terminal:
|
||||||
|
message = terminal.bold(terminal.red(message))
|
||||||
|
write_message(message)
|
||||||
|
|
||||||
|
|
||||||
|
def write_message(message):
|
||||||
|
sys.stderr.write(message)
|
||||||
|
if not message.endswith("\n"):
|
||||||
|
sys.stderr.write("\n")
|
||||||
|
sys.stderr.flush()
|
Loading…
Add table
Reference in a new issue