diff --git a/.github/set-nbgv-version.ps1 b/.github/set-nbgv-version.ps1 index c47d64c3..899119ab 100644 --- a/.github/set-nbgv-version.ps1 +++ b/.github/set-nbgv-version.ps1 @@ -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 diff --git a/Cargo.lock b/Cargo.lock index 6ffc8c1d..a5b424a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2482,7 +2482,7 @@ dependencies = [ [[package]] name = "velopack_python" -version = "0.0.0-local" +version = "0.0.0" dependencies = [ "anyhow", "pyo3", diff --git a/src/lib-python/Cargo.toml b/src/lib-python/Cargo.toml index b1a24e15..bf77a0bc 100644 --- a/src/lib-python/Cargo.toml +++ b/src/lib-python/Cargo.toml @@ -1,6 +1,5 @@ [package] name = "velopack_python" -version.workspace = true authors.workspace = true homepage.workspace = true repository.workspace = true diff --git a/src/lib-python/build.rs b/src/lib-python/build.rs index ed23f184..dace4a9b 100644 --- a/src/lib-python/build.rs +++ b/src/lib-python/build.rs @@ -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 { - // 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"); - } } diff --git a/src/lib-python/pyproject.toml b/src/lib-python/pyproject.toml index 4e945ace..83114f90 100644 --- a/src/lib-python/pyproject.toml +++ b/src/lib-python/pyproject.toml @@ -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"]