Coverage for tests / conftest.py: 96%
55 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-01-06 21:09 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2026-01-06 21:09 +0000
1import shutil 1abcdefghi
2import subprocess 1abcdefghi
3import sys 1abcdefghi
4from collections.abc import Generator 1abcdefghi
5from dataclasses import dataclass, field 1abcdefghi
6from pathlib import Path 1abcdefghi
7from typing import Any, Callable, Union 1abcdefghi
8from unittest.mock import patch 1abcdefghi
10import pytest 1abcdefghi
11from pydantic import BaseModel 1abcdefghi
12from sqlmodel import SQLModel 1abcdefghi
13from sqlmodel.main import default_registry 1abcdefghi
15top_level_path = Path(__file__).resolve().parent.parent 1abcdefghi
16docs_src_path = top_level_path / "docs_src" 1abcdefghi
19@pytest.fixture(autouse=True) 1abcdefghi
20def clear_sqlmodel() -> Any: 1abcdefghi
21 # Clear the tables in the metadata for the default base model
22 SQLModel.metadata.clear() 1abcdefghi
23 # Clear the Models associated with the registry, to avoid warnings
24 default_registry.dispose() 1abcdefghi
25 yield 1abcdefghi
26 SQLModel.metadata.clear() 1abcdefghi
27 default_registry.dispose() 1abcdefghi
30@pytest.fixture() 1abcdefghi
31def cov_tmp_path(tmp_path: Path) -> Generator[Path, None, None]: 1abcdefghi
32 yield tmp_path 1abcdefghi
33 for coverage_path in tmp_path.glob(".coverage*"): 1abcdefghi
34 coverage_destiny_path = top_level_path / "coverage" / coverage_path.name
35 shutil.copy(coverage_path, coverage_destiny_path)
38def coverage_run(*, module: str, cwd: Union[str, Path]) -> subprocess.CompletedProcess: 1abcdefghi
39 result = subprocess.run( 2Zg0g1g2g3g4g5g6g7g
40 [
41 "coverage",
42 "run",
43 "--parallel-mode",
44 "--source=docs_src,tests,sqlmodel",
45 "-m",
46 module,
47 ],
48 cwd=str(cwd),
49 capture_output=True,
50 encoding="utf-8",
51 )
52 return result 2Zg0g1g2g3g4g5g6g7g
55def get_testing_print_function( 1abcdefghi
56 calls: list[list[Union[str, dict[str, Any]]]],
57) -> Callable[..., Any]:
58 def new_print(*args: Any) -> None: 1abcdefghi
59 data: list[Any] = [] 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgf# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo hfif( ) 7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvf* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu wfxf. / fcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKf: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA LfMf@ [ OcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZf] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG 0f1f{ | :c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'f} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM (f)fcbdbvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]febfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ^f_fibjb4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY igjgobpbcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 xgygubvbLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLgwbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! MgNgAbBb-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg
60 for arg in args: 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgf# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo hfif( ) 7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvf* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu wfxf. / fcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKf: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA LfMf@ [ OcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZf] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG 0f1f{ | :c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'f} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM (f)fcbdbvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]febfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ^f_fibjb4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY igjgobpbcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 xgygubvbLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLgwbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! MgNgAbBb-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg
61 if isinstance(arg, BaseModel): 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgf# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo hfif( ) 7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvf* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu wfxf. / fcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKf: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA LfMf@ [ OcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZf] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG 0f1f{ | :c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'f} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM (f)fcbdbvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]febfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ^f_fibjb4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY igjgobpbcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 xgygubvbLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLgwbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! MgNgAbBb-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg
62 data.append(arg.model_dump()) 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgfj k l SbTbUbVbWbXbYbm n Zb0b1b2b3b4b5b6bo hfif7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvfp q r @b[b]b^b_b`b{bs t |b}b~bacbcccdcecu wfxffcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKfv w x zcAcBcCcDcEcFcy z GcHcIcJcKcLcMcNcA LfMfOcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZfB C D 8c9c!c#c$c%c'cE F (c)c*c+c,c-c.c/cG 0f1f:c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'fH I J gdhdidjdkdldmdK L ndodpdqdrdsdtdudM (f)fvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]fN O P PdQdRdSdTdUdVdQ R WdXdYdZd0d1d2d3dS ^f_f4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgT U V ;d=d?d@d[d]d^dW X _d`d{d|d}d~daebeY igjgcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgZ 0 1 wexeyezeAeBeCe2 3 DeEeFeGeHeIeJeKe4 xgygLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLg5 6 7 5e6e7e8e9e!e#e8 9 $e%e'e(e)e*e+e,e! MgNg-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg
63 elif isinstance(arg, list): 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRb# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo ( ) 7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu . / fcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyc: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA @ [ OcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG { | :c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfd} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM cbdbvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdebfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ibjb4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY obpbcedeeefegeheiejekelemeneoepeqereseteueveqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 ubvbLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4ewbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! AbBb-e.e/e:e
64 new_list = [] 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb
65 for item in arg: 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb
66 if isinstance(item, BaseModel): 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb
67 new_list.append(item.model_dump()) 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb
68 data.append(new_list) 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb
69 else:
70 data.append(arg) 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbj k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo 7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bp q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu fcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycv w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA OcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cB C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG :c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM vdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS 4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY cedeeefegeheiejekelemeneoepeqereseteueveZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 LeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! -e.e/e:e
71 calls.append(data) 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgf# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo hfif( ) 7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvf* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu wfxf. / fcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKf: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA LfMf@ [ OcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZf] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG 0f1f{ | :c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'f} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM (f)fcbdbvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]febfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ^f_fibjb4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY igjgobpbcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 xgygubvbLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLgwbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! MgNgAbBb-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg
73 return new_print 1abcdefghi
76@dataclass 1abcdefghi
77class PrintMock: 1abcdefghi
78 calls: list[Any] = field(default_factory=list) 1abcdefghi
81@pytest.fixture(name="print_mock") 1abcdefghi
82def print_mock_fixture() -> Generator[PrintMock, None, None]: 1abcdefghi
83 print_mock = PrintMock() 1abcdefghi
84 new_print = get_testing_print_function(print_mock.calls) 1abcdefghi
85 with patch("builtins.print", new=new_print): 1abcdefghi
86 yield print_mock 1abcdefghi
89needs_py310 = pytest.mark.skipif( 1abcdefghi
90 sys.version_info < (3, 10), reason="requires python3.10+"
91)