带选项的Nox会话
项目描述
NoxOpt
Nox会话带选项!
安装
只需pip install noxopt
!
基本用法
使用类型参数定义会话
from noxopt import NoxOpt, Session
group = NoxOpt()
@group.session
def add_numbers(session: Session, x: int, y: int) -> None:
session.log(x + y)
现在您可以通过命令行传递此会话声明的选项
nox -s my-session -- --x 10 -- y 3
您将看到以下输出
nox > Running session my-session
nox > Creating virtual environment (virtualenv) using python in .nox/my-session
nox > 13
nox > Session my-session was successful.
请注意,所有在NoxOpt
组会话中声明的选项都必须一致。也就是说,如果一个会话定义了x: int
,同一组中的另一个会话不能定义为x: bool
。
自定义选项
这次您将使用一些注解
元数据来自定义选项
from typing import Annotated
from noxopt import NoxOpt, Option, Session
group = NoxOpt()
@group.session
def sum_numbers(
session: Session,
nums: Annotated[list[int], Option(nargs="*", type=int)],
) -> None:
session.log(sum(nums))
这次运行时您可以传递几个数字
nox -s sum-numbers -- --nums 10 3 26 4
您将看到以下输出
nox > Running session my-session
nox > Creating virtual environment (virtualenv) using python in .nox/my-session
nox > 43
nox > Session my-session was successful.
请注意,对nums
的注解应理解为以下方式
# declare a type with metadata
Annotated[
# your normal type annotation
list[int],
# configure the option associated with the type annotation above
Option(nargs="*", type=int)
]
您会发现Option
具有与argparse.add_argument
几乎相同的参数。
如果您需要多次使用某个选项,您可以将其定义为变量
from functools import reduce
from typing import Annotated, TypeAlias
from noxopt import NoxOpt, Option, Session
group = NoxOpt()
Integers = Annotated[list[int], Option(nargs="*", type=int)]
@group.session
def sum_numbers(session: Session, nums: Integers) -> None:
session.log(sum(nums))
@group.session
def multiply_numbers(session: Session, nums: Integers) -> None:
session.log(reduce(lambda x, y: x * y, nums, 0))
参数化会话
如果您想使用NoxOpt的@nox.parametrize
装饰器,您需要明确声明哪些参数应被视为命令行选项。这是通过使用Annotated[YourType, Option()]
注解来完成的
from typing import Annotated
from nox import Session, parametrize
from noxopt import NoxOpt, Option
group = NoxOpt()
@group.session
@parametrize("num", [1, 2, 3])
def log_nums(session: Session, num: int, mult: Annotated[int, Option()]) -> None:
session.log(num * mult)
您现在可以运行
nox -s multiply-nums -- --mult 2
并看到以下输出
nox > Running session multiply-nums(num=1)
nox > Creating virtual environment (virtualenv) using python in .nox/multiply-nums-num-1
nox > 2
nox > Session multiply-nums(num=1) was successful.
nox > Running session multiply-nums(num=2)
nox > Creating virtual environment (virtualenv) using python in .nox/multiply-nums-num-2
nox > 4
nox > Session multiply-nums(num=2) was successful.
nox > Running session multiply-nums(num=3)
nox > Creating virtual environment (virtualenv) using python in .nox/multiply-nums-num-3
nox > 6
nox > Session multiply-nums(num=3) was successful.
nox > Ran multiple sessions:
nox > * multiply-nums(num=1): success
nox > * multiply-nums(num=2): success
nox > * multiply-nums(num=3): success
常见设置
NoxOpt允许您在组会话之前添加逻辑。
from noxopt import NoxOpt, Session
group = NoxOpt()
@nox.setup
def setup(session: Session) -> None:
... # your setup logic here
@group.session
def my_session(session: Sesssion) -> None:
... # your session here
在这里,setup
函数将在 NoxOpt
组中的所有会话之前运行。为了在组中的特定会话上运行 setup,您需要指定一个前缀。任何以该前缀开头的会话都将共享相同的 setup 程序。
from noxopt import NoxOpt, Session
group = NoxOpt()
@nox.setup("python")
def setup_python(session: Session) -> None:
... # your setup logic here
@group.session
def python_tests(session: Session) -> None:
...
@group.session
def javascript_tests(session: Session) -> None:
...
在这里,只有当以 python
开头的任何会话执行时,setup_python
才会运行。在这种情况下,这仅适用于 python-tests
会话。
您还可以通过传递 NoxOpt(where=dict(...))
为组内的所有会话声明公共设置。此参数接受一个字典,该字典将在构造每个会话时作为关键字参数传递给 nox.session
装饰器。因此,如果您想要以 Python 3.10 和 3.11 运行组中的所有会话,您将配置
from noxopt import NoxOpt
# run all sessions in this group using Python 3.10 and 3.11
group = NoxOpt(where=dict(python=["3.10", "3.11"]))
自动标签
NoxOpt 的另一个优点是可以使用 NoxOpt(auto_tag=True)
参数根据会话名称自动创建标签。此参数背后的思想是,如果您有一组具有公共命名方案的会话,如下所示:
from noxopt import NoxOpt, Session
group = NoxOpt(auto_tag=True)
@group.session
def check_python_tests(session: Session) -> None:
...
@group.session
def check_python_format(session: Session) -> None:
...
@group.session
def check_javascript_tests(session: Session) -> None:
...
@group.session
def check_javascript_format(session: Session) -> None:
...
NoxOpt 将生成以下标签,如果使用 nox -t <tag>
运行,则执行...
check
- 所有会话check-python
- 仅check-python-tests
和check-python-format
check-javascript
- 仅check-javascript-tests
和check-javascript-format
它是通过在每个 NoxOpt
组中的会话名称上分割 -
字符来完成的,至少有两个或更多具有公共前缀的会话。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。