跳转到主要内容

带选项的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-testscheck-python-format
  • check-javascript- 仅 check-javascript-testscheck-javascript-format

它是通过在每个 NoxOpt 组中的会话名称上分割 - 字符来完成的,至少有两个或更多具有公共前缀的会话。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

noxopt-0.0.9.tar.gz (13.3 kB 查看哈希值)

上传时间

构建分布

noxopt-0.0.9-py3-none-any.whl (9.9 kB 查看哈希值)

上传时间 Python 3

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面