fix python versions

This commit is contained in:
Caelan Sayler
2025-06-14 15:57:59 +01:00
committed by Caelan
parent 5c952c0710
commit 8cda06cfd7
5 changed files with 23 additions and 162 deletions

View File

@@ -4,6 +4,7 @@ param(
$originalLocation = Get-Location
# setting cargo workspace version
$scriptDir = "$PSScriptRoot/.."
$path = Join-Path $scriptDir "Cargo.toml"
Write-Host "Setting version to $version"
@@ -17,9 +18,28 @@ Write-Host "Setting version to $version"
}
} | Set-Content $path
# setting nodejs version
Set-Location "$scriptDir/src/lib-nodejs"
npm version $version --no-git-tag-version
# setting pyproject.toml version
$pyprojectPath = [IO.Path]::Combine($scriptDir, 'src', 'lib-python', 'pyproject.toml')
$pythonVersion = $version
if ($pythonVersion -match '-g') {
$pythonVersion = $pythonVersion -replace '-g', '.dev+'
}
(Get-Content $pyprojectPath) | ForEach-Object {
if ($_ -match '^version\s*=\s*".*"') {
$_ -replace '^version\s*=\s*".*"', "version = `"$pythonVersion`""
}
else {
$_
}
} | Set-Content $pyprojectPath
# copying README.md
Copy-Item -Path "$scriptDir/README_NUGET.md" -Destination "$scriptDir/src/lib-nodejs/README.md" -Force
Copy-Item -Path "$scriptDir/README_NUGET.md" -Destination "$scriptDir/src/lib-rust/README.md" -Force

2
Cargo.lock generated
View File

@@ -2482,7 +2482,7 @@ dependencies = [
[[package]]
name = "velopack_python"
version = "0.0.0-local"
version = "0.0.0"
dependencies = [
"anyhow",
"pyo3",

View File

@@ -1,6 +1,5 @@
[package]
name = "velopack_python"
version.workspace = true
authors.workspace = true
homepage.workspace = true
repository.workspace = true

View File

@@ -1,162 +1,3 @@
use std::env;
use std::fs;
use std::path::Path;
fn main() {
pyo3_build_config::add_extension_module_link_args();
// Get the workspace version
let version = get_workspace_version().unwrap_or_else(|| env::var("CARGO_PKG_VERSION").unwrap_or_else(|_| "0.1.0".to_string()));
let python_version = convert_to_python_version(&version);
// Set environment variables for PyO3
println!("cargo:rustc-env=PYTHON_VERSION={}", python_version);
// Try setting the package version for PyO3 to pick up
println!("cargo:metadata=version={}", python_version);
// Also set it as a cfg value
println!("cargo:rustc-cfg=version=\"{}\"", python_version);
println!("cargo:rerun-if-changed=../../Cargo.toml");
}
fn get_workspace_version() -> Option<String> {
// Navigate up to workspace root and read Cargo.toml
let manifest_dir = env::var("CARGO_MANIFEST_DIR").ok()?;
let workspace_toml = Path::new(&manifest_dir)
.parent()? // src
.parent()? // velopack root
.join("Cargo.toml");
if !workspace_toml.exists() {
return None;
}
let content = fs::read_to_string(&workspace_toml).ok()?;
// Simple parsing to extract version from [workspace.package] section
let mut in_workspace_package = false;
for (_line_num, line) in content.lines().enumerate() {
let trimmed = line.trim();
if trimmed == "[workspace.package]" {
in_workspace_package = true;
continue;
}
if trimmed.starts_with('[') && trimmed != "[workspace.package]" {
if in_workspace_package {}
in_workspace_package = false;
continue;
}
if in_workspace_package && trimmed.starts_with("version") {
if let Some(equals_pos) = trimmed.find('=') {
let version_part = &trimmed[equals_pos + 1..].trim();
// Remove quotes
let version = version_part.trim_matches('"').trim_matches('\'');
return Some(version.to_string());
}
}
}
None
}
fn convert_to_python_version(rust_version: &str) -> String {
// Handle git-based versions like "0.0.1213-g57cf68d" - drop git ref, keep base
if let Some(git_pos) = rust_version.find("-g") {
let base = &rust_version[..git_pos];
return ensure_xyz_format(base);
}
// Handle local development versions like "0.0.0-local" - drop local suffix
if rust_version.ends_with("-local") {
let base = rust_version.trim_end_matches("-local");
return ensure_xyz_format(base);
}
// Handle Rust pre-release patterns and convert to Python equivalents
if rust_version.contains("-alpha") {
let base = rust_version.split("-alpha").next().unwrap();
let alpha_num = extract_prerelease_number(rust_version, "-alpha");
return format!("{}a{}", ensure_xyz_format(base), alpha_num);
}
if rust_version.contains("-beta") {
let base = rust_version.split("-beta").next().unwrap();
let beta_num = extract_prerelease_number(rust_version, "-beta");
return format!("{}b{}", ensure_xyz_format(base), beta_num);
}
if rust_version.contains("-rc") {
let base = rust_version.split("-rc").next().unwrap();
let rc_num = extract_prerelease_number(rust_version, "-rc");
return format!("{}rc{}", ensure_xyz_format(base), rc_num);
}
// For any other dash-separated version, just take the base
if rust_version.contains('-') {
let base = rust_version.split('-').next().unwrap();
return ensure_xyz_format(base);
}
ensure_xyz_format(rust_version)
}
fn extract_prerelease_number(version: &str, pattern: &str) -> String {
if let Some(pos) = version.find(pattern) {
let after_pattern = &version[pos + pattern.len()..];
if after_pattern.starts_with('.') {
after_pattern.trim_start_matches('.').split('-').next().unwrap_or("0").to_string()
} else if after_pattern.is_empty() {
"0".to_string()
} else {
after_pattern.split('-').next().unwrap_or("0").to_string()
}
} else {
"0".to_string()
}
}
fn ensure_xyz_format(version: &str) -> String {
let parts: Vec<&str> = version.split('.').collect();
let result = match parts.len() {
1 => format!("{}.0.0", parts[0]),
2 => format!("{}.{}.0", parts[0], parts[1]),
_ => format!("{}.{}.{}", parts[0], parts[1], parts[2]),
};
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_version_conversion() {
// Git versions - drop git ref
assert_eq!(convert_to_python_version("0.0.1213-g57cf68d"), "0.0.1213");
assert_eq!(convert_to_python_version("1.2-g57cf68d"), "1.2.0");
// Local versions - drop local suffix
assert_eq!(convert_to_python_version("0.0.0-local"), "0.0.0");
assert_eq!(convert_to_python_version("1.2.3-local"), "1.2.3");
// Pre-release versions - convert to Python format
assert_eq!(convert_to_python_version("1.0.0-alpha.1"), "1.0.0a1");
assert_eq!(convert_to_python_version("1.0.0-alpha"), "1.0.0a0");
assert_eq!(convert_to_python_version("1.0.0-beta.2"), "1.0.0b2");
assert_eq!(convert_to_python_version("1.0.0-rc.1"), "1.0.0rc1");
// Standard versions - ensure x.y.z format
assert_eq!(convert_to_python_version("1.0.0"), "1.0.0");
assert_eq!(convert_to_python_version("1.2"), "1.2.0");
assert_eq!(convert_to_python_version("1"), "1.0.0");
// Other dash-separated versions - take base only
assert_eq!(convert_to_python_version("1.0.0-something-else"), "1.0.0");
}
}

View File

@@ -1,7 +1,8 @@
[project]
dynamic = ["version", "description", "authors", "license"]
dynamic = ["description", "authors", "license"]
name = "velopack"
requires-python = ">=3.8"
version = "0.0.1"
[build-system]
requires = ["maturin>=1.0,<2.0"]