Skip to content

Commit 0aec8cb

Browse files
committed
Add uv support for Python, upgrade Python to 3.13 (closes #48)
> Co-authored-by: Sasha Koss <koss@nocorp.me>:
1 parent 466e6b2 commit 0aec8cb

File tree

17 files changed

+513
-49
lines changed

17 files changed

+513
-49
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
name = "genotype-test-py-managers"
2+
out = "dist/py-latest-poetry"
3+
4+
[py]
5+
enabled = true
6+
version = "latest"
7+
manager = "poetry"
8+
9+
[py.manifest.tool.poetry]
10+
name = "module"
11+
version = "0.1.0"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
name = "genotype-test-py-managers"
2+
out = "dist/py-latest-uv"
3+
4+
[py]
5+
enabled = true
6+
version = "latest"
7+
manager = "uv"
8+
9+
[py.manifest.project]
10+
name = "module"
11+
version = "0.1.0"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
name = "genotype-test-py-managers"
2+
out = "dist/py-legacy-poetry"
3+
4+
[py]
5+
enabled = true
6+
version = "legacy"
7+
manager = "poetry"
8+
9+
[py.manifest.tool.poetry]
10+
name = "module"
11+
version = "0.1.0"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
name = "genotype-test-py-managers"
2+
out = "dist/py-legacy-uv"
3+
4+
[py]
5+
enabled = true
6+
version = "legacy"
7+
manager = "uv"
8+
9+
[py.manifest.project]
10+
name = "module"
11+
version = "0.1.0"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[project]
2+
name = "genotype-test-py-managers"
3+
version = "0.1.0"
4+
requires-python = ">=3.8"
5+
dependencies = ["genotype-runtime"]
6+
7+
[tool.uv.sources]
8+
genotype-runtime = { path = "../../../pkgs/pip-genotype-runtime", editable = true }
9+
10+
[build-system]
11+
requires = ["setuptools>=68"]
12+
build-backend = "setuptools.build_meta"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Profile: {
2+
name: string,
3+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
use ./profile/Profile
2+
3+
Team: {
4+
name: string,
5+
members: [Profile],
6+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import sys
2+
import types
3+
4+
5+
def install_genotype_runtime_stub() -> None:
6+
genotype = types.ModuleType("genotype")
7+
8+
class Model:
9+
pass
10+
11+
genotype.Model = Model
12+
sys.modules["genotype"] = genotype
13+
14+
15+
def main() -> None:
16+
profile = sys.argv[1]
17+
18+
install_genotype_runtime_stub()
19+
from module import Profile, Team
20+
21+
author = Profile()
22+
author.name = "Sasha"
23+
24+
team = Team()
25+
team.name = "Core"
26+
team.members = [author]
27+
28+
assert team.members[0].name == "Sasha"
29+
print(f"🟢 OK: imports and interaction work for {profile}")
30+
31+
32+
if __name__ == "__main__":
33+
main()
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/usr/bin/env bash
2+
3+
set -euo pipefail
4+
5+
LATEST_VERSIONS=(
6+
"3.14"
7+
"3.13"
8+
"3.12"
9+
)
10+
11+
LEGACY_VERSIONS=(
12+
"3.11"
13+
"3.10"
14+
"3.9"
15+
"3.8"
16+
)
17+
18+
build_for() {
19+
profile="$1"
20+
echo -e "🌀 Building for $profile"
21+
if output=$(cargo run -p genotype_cli --bin gt -- build . --config "genotype.${profile}.toml" 2>&1); then
22+
echo "🟢 Build: OK"
23+
else
24+
echo "🔴 Build: FAILED"
25+
echo "--- Output ------------------------------------------"
26+
echo "$output"
27+
echo "-----------------------------------------------------"
28+
exit 1
29+
fi
30+
echo
31+
}
32+
33+
run_tests_for() {
34+
profile="$1"
35+
python_version="$2"
36+
PYTHONPATH="dist/${profile}/py${PYTHONPATH:+:$PYTHONPATH}"
37+
38+
if output=$(PYTHONPATH="$PYTHONPATH" uv run --python $python_version python test.py "$profile" 2>&1); then
39+
echo "🟢 Python $python_version: OK"
40+
else
41+
echo "🔴 Python $python_version: FAILED"
42+
echo "--- Output ------------------------------------------"
43+
echo "$output"
44+
echo "-----------------------------------------------------"
45+
exit 1
46+
fi
47+
}
48+
49+
run_profile() {
50+
profile="$1"
51+
version_family="$2"
52+
53+
build_for "$profile"
54+
55+
if [[ "$version_family" == "latest" ]]; then
56+
for version in "${LATEST_VERSIONS[@]}"; do
57+
run_tests_for "$profile" "$version"
58+
done
59+
else
60+
for version in "${LEGACY_VERSIONS[@]}"; do
61+
run_tests_for "$profile" "$version"
62+
done
63+
fi
64+
65+
echo
66+
}
67+
68+
run_profile "py-latest-uv" "latest"
69+
run_profile "py-legacy-uv" "legacy"
70+
run_profile "py-latest-poetry" "latest"
71+
run_profile "py-legacy-poetry" "legacy"

pkgs/crate-genotype-cli/src/commands/init.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,10 @@ fn configure_py(config: &mut GtConfig, name: &String) -> Result<()> {
162162
.prompt()
163163
.map_err(|_| GtCliError::FailedReadline("Python package name"))?;
164164

165-
let manifest =
166-
toml::map::Map::from_iter(vec![("name".into(), toml::Value::String(name.clone()))]);
165+
py.lang.manager = PyPackageManager::Uv;
166+
167+
let project = toml::map::Map::from_iter(vec![("name".into(), toml::Value::String(name))]);
168+
let manifest = toml::map::Map::from_iter(vec![("project".into(), toml::Value::Table(project))]);
167169

168170
py.common.manifest = manifest;
169171

0 commit comments

Comments
 (0)