跳至内容

如何贡献

首先,感谢您考虑为 prisma-client-py 做贡献!正是像这样的人让它成为每个人都喜欢的伟大工具。

本文档旨在通过将部落知识和期望编码来使贡献更容易。不要害怕打开半成品的 PR,如果有任何不清楚的地方,请随时提问!

一般先决条件

您必须在系统上安装 Python >= 3.7。

环境变量

要能够运行数据库测试,您必须为要运行测试的每个数据库提供程序定义一个环境变量,所需环境变量的完整列表可以在 databases/example.env 中找到。

SQLITE_URL='file:dev.db'
POSTGRES_URL='postgresql://<...>'

您可以根据需要设置这些环境变量。

本地开发环境

克隆仓库

git clone https://github.com/RobertCraigie/prisma-client-py.git
cd prisma-client-py

根据您的喜好设置虚拟环境,在本例中我们使用 venv

python3 -m venv .venv
source .venv/bin/activate

引导目录,此命令执行以下操作

  • 以可编辑模式安装 prisma-client-py 及其所有依赖项
  • 创建用于测试的本地 SQLite 数据库
  • 安装 pre-commit
make bootstrap

工作流程

代码更改

在进行任何代码更改后,您必须运行 linter 并添加测试以确保您的更改有效。

您可以使用以下命令运行 linter 和测试,并提供覆盖率信息。

注意

这些命令不会运行 mypy 检查,因为完成 mypy 检查需要大量时间。

可以使用 nox -s mypy 运行 mypy 检查

make format
nox -s setup lint
nox -s test -p 3.9
nox -s report

调试客户端生成

将环境变量 PRISMA_PY_DEBUG_GENERATOR 设置为 1,这将把 prisma DMMF 数据写入您本地目录的 src/prisma/generator/debug-data.json 中。

文档

此项目的文档使用 mkdocsmkdocs-material 主题。

在编辑文档时,您可以启动本地服务器并使用以下命令获得实时反馈

make docs-serve

测试

我们使用 nox 运行使用 pytest 编写的测试

我在哪里编写测试?

我们有几个地方可以编写测试

  • 命令行: tests/test_cli/
  • 数据库交互: databases/tests/
  • 客户端生成: tests/test_generation/
  • 集成测试: tests/integrations/
  • 类型测试: typesafety/

数据库测试

Prisma Client Python 使用自定义测试套件针对多个数据库提供程序运行客户端 API 测试。这些测试可以在 databases/testsdatabases/sync_tests 目录中找到。

要运行这些测试,您需要定义某些环境变量,有关设置的详细信息,请参阅 环境变量

您可以使用以下命令运行测试

nox -s databases -- test --inplace

提示

--inplace 标志表示客户端将生成到您的本地 src/prisma/ 目录中,以便更轻松地检查/开发循环。

默认情况下,将运行异步测试,要运行同步数据库测试,您可以传递 --for-async=false 标志。

或者,您可以明确指定要运行测试的数据库

nox -s databases -- test --databases=postgresql

这将为每个给定的数据库生成客户端并执行以下操作

  • 对为给定数据库提供程序启用的所有测试运行 pytest
  • 对生成的客户端代码和所有启用的测试文件运行 Pyright

这些测试通过将特定于数据库的功能拆分为自己的目录/文件,然后根据您运行测试的数据库来排除某些文件来实现。

集成测试

注意

运行数据库集成测试需要存在某些环境变量

集成测试可以在 tests/integrations 目录中找到。每个集成测试的入口点是位于目录顶层的 test.sh 脚本,例如 tests/integrations/custom-generator/test.sh

您可以在此文件中执行任何您需要的操作,但是,每个 test.sh 应该以以下内容开头

#!/bin/bash

set -eux

python3 -m venv .venv

set +x
source .venv/bin/activate
set -x

要在集成测试中安装 prisma 包,您可以添加以下命令,将 <EXTRA> 替换为需要安装的任何其他内容。

pip install -U -r ../../../requirements/<EXTRA>.txt
pip install -U --force-reinstall ../../../.tests_cache/dist/*.whl

您现在可以添加任何您需要的特定于集成的命令。

您可以使用以下命令仅运行集成测试

nox -s test -p 3.9 -- tests/integrations/

或特定测试

nox -s test -p 3.9 -- --confcutdir . tests/integrations/postgresql

警告

如果您在集成测试中运行 pytest,您可能还需要更新根 pytest.ini 文件以将您的集成测试包含在 norecursedirs 选项中

单元测试

单元测试使用 pytest 运行,每个测试用例都必须包含一个文档字符串。

要添加测试用例,请在 tests 目录中找到相应的测试文件(如果找不到匹配的文件,请随意创建一个新文件),您可以像这样测试客户端

import pytest
from prisma import Prisma

@pytest.mark.asyncio
async def test_example(client: Prisma) -> None:
    """Test docstring"""
    ...

如果您编写的测试使用基于模型的访问,则必须像这样标记测试

import pytest

@pytest.mark.prisma
@pytest.mark.asyncio
async def test_example() -> None:
    """Test docstring"""
    ...

然后可以使用 nox 运行测试,例如

nox -s test -p 3.9

您可以像这样直接将参数传递给 pytest

nox -s test -p 3.9 -- -x --ignore=tests/integrations

有关编写良好的测试文档字符串,请参阅 这篇文章

对于更具体的测试用例,请查看测试并找到一个与您需要的类似的测试,不要害怕复制和粘贴测试代码。

快照测试

我们使用 inline-snapshot 用于,您猜对了,内联快照!如果您正在使用这些快照,您可能希望使用 --inline-snapshot=create--inline-snapshot=fix 运行测试,例如

nox -s test -p 3.9 -- --inline-snapshot=fix

我们还使用 syrupy 来管理最好持久保存到独立文件的测试快照。您可以通过使用 --snapshot-update 运行测试来更新生成的快照,例如

nox -s test -p 3.9 -- --snapshot-update tests/test_generation/exhaustive

类型测试

为了确保类型已正确实现,我们使用 pytest-pyrightpytest-mypy-plugins

您可以使用以下命令运行 pyright 和 mypy 测试

make typesafety

添加 Pyright 测试

要添加新的测试,只需在 typesafety/pyright 目录中创建一个 .py 文件并运行

nox -s typesafety-pyright

有关更多信息,请参阅 pytest-pyright 文档

添加 Mypy 测试

Mypy 测试可以在 typesafety 目录中找到。

要添加新的测试,只需在 typesafety 目录中创建一个 test_*.yml 文件并运行

nox -s typesafety-mypy

有关更多信息,请参阅 pytest-mypy-plugins 文档

Docker 测试 + 多平台(CPU 架构)支持

由于 Github Actions (CI) 不允许在多个 CPU 架构上运行代码(并使用 amd64 又名 x86_64 指令集),我们使用一个 docker 构建过程,该过程使用其 QEMU 支持来模拟多个 CPU 平台。make docker 命令可用于在本地执行此类构建。在 CI 中,这是通过测试工作流中的 docker 作业强制执行的。

我们还使用 docker 构建参数 OS_DISTRO,以便我们可以尝试针对多个官方上游 Python docker 镜像版本 进行测试。

注意: docker 设置仅应在内部用于测试,而不应通过远程注册表重新分发。