feat: Update versioning scripts and files for Elytra PIM Client
This commit is contained in:
parent
b8f889f224
commit
6ff3109223
6 changed files with 504 additions and 8 deletions
164
UPDATE_VERSION.md
Normal file
164
UPDATE_VERSION.md
Normal file
|
|
@ -0,0 +1,164 @@
|
||||||
|
# Version Update Scripts
|
||||||
|
|
||||||
|
This directory contains scripts to update the version across the Elytra PIM Client project before building a wheel distribution.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
Update version and build:
|
||||||
|
```bash
|
||||||
|
# Python (cross-platform)
|
||||||
|
python update_version.py 1.0.0
|
||||||
|
python build_wheel.py
|
||||||
|
|
||||||
|
# PowerShell (Windows)
|
||||||
|
.\update_version.ps1 1.0.0
|
||||||
|
.\build_wheel.ps1
|
||||||
|
|
||||||
|
# Bash (Linux/macOS)
|
||||||
|
./update_version.sh 1.0.0
|
||||||
|
./build_wheel.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Files Updated
|
||||||
|
|
||||||
|
The version update scripts modify the following files:
|
||||||
|
- `pyproject.toml` - Project configuration (line 7)
|
||||||
|
- `elytra_client/__init__.py` - Package version (line 3)
|
||||||
|
|
||||||
|
## Available Scripts
|
||||||
|
|
||||||
|
### Python Version
|
||||||
|
```bash
|
||||||
|
python update_version.py 0.2.0
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```bash
|
||||||
|
python update_version.py <version>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```bash
|
||||||
|
python update_version.py 1.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### PowerShell Version
|
||||||
|
```powershell
|
||||||
|
.\update_version.ps1 -Version 0.2.0
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```powershell
|
||||||
|
.\update_version.ps1 -Version <version>
|
||||||
|
# or
|
||||||
|
.\update_version.ps1 <version>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
```powershell
|
||||||
|
.\update_version.ps1 0.2.0
|
||||||
|
.\update_version.ps1 -Version 1.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bash Version
|
||||||
|
```bash
|
||||||
|
./update_version.sh 0.2.0
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```bash
|
||||||
|
./update_version.sh <version>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```bash
|
||||||
|
./update_version.sh 1.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Version Format
|
||||||
|
|
||||||
|
The version must follow semantic versioning format: `major.minor.patch`
|
||||||
|
|
||||||
|
Valid examples:
|
||||||
|
- `0.1.0`
|
||||||
|
- `1.0.0`
|
||||||
|
- `0.2.1`
|
||||||
|
- `1.0.0-beta` (with pre-release identifier)
|
||||||
|
|
||||||
|
Invalid examples:
|
||||||
|
- `1.0` (missing patch version)
|
||||||
|
- `v1.0.0` (invalid prefix)
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
### Before Building a Wheel
|
||||||
|
|
||||||
|
1. **Update the version:**
|
||||||
|
```bash
|
||||||
|
# On Windows
|
||||||
|
.\update_version.ps1 0.2.0
|
||||||
|
|
||||||
|
# On Linux/macOS
|
||||||
|
./update_version.sh 0.2.0
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Build the wheel:**
|
||||||
|
```bash
|
||||||
|
# Using Python
|
||||||
|
python build_wheel.py
|
||||||
|
|
||||||
|
# Or PowerShell
|
||||||
|
.\build_wheel.ps1
|
||||||
|
|
||||||
|
# Or Bash
|
||||||
|
./build_wheel.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Upload (optional):**
|
||||||
|
```bash
|
||||||
|
.\upload_wheel_to_forgejo_pypi.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verification
|
||||||
|
|
||||||
|
After running the update script, verify the changes:
|
||||||
|
|
||||||
|
**Check pyproject.toml:**
|
||||||
|
```bash
|
||||||
|
grep "version = " pyproject.toml
|
||||||
|
```
|
||||||
|
|
||||||
|
**Check __init__.py:**
|
||||||
|
```bash
|
||||||
|
grep "__version__ = " elytra_client/__init__.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Messages
|
||||||
|
|
||||||
|
### Invalid Version Format
|
||||||
|
```
|
||||||
|
✗ Invalid version format: 1.0
|
||||||
|
Version must follow semantic versioning (major.minor.patch)
|
||||||
|
Examples: 1.0.0, 0.2.0, 1.0.0-beta
|
||||||
|
```
|
||||||
|
|
||||||
|
**Solution:** Use the format `major.minor.patch` (e.g., `1.0.0`)
|
||||||
|
|
||||||
|
### File Not Found
|
||||||
|
```
|
||||||
|
✗ /path/to/file not found
|
||||||
|
```
|
||||||
|
|
||||||
|
**Solution:** Ensure you're running the script from the project root directory
|
||||||
|
|
||||||
|
## Return Codes
|
||||||
|
|
||||||
|
- `0` - Success (version updated)
|
||||||
|
- `1` - Error (see error message)
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Run from the project root directory
|
||||||
|
- The scripts will show which files were updated
|
||||||
|
- All scripts support semantic versioning with optional pre-release identifiers
|
||||||
|
- Use consistent versions across all files to avoid build issues
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
"""Elytra PIM Client - A Pythonic client for the Elytra PIM API"""
|
"""Elytra PIM Client - A Pythonic client for the Elytra PIM API"""
|
||||||
|
|
||||||
__version__ = "0.2.0"
|
__version__ = "0.1.0"
|
||||||
__author__ = "Your Name"
|
__author__ = "Your Name"
|
||||||
|
|
||||||
from .client import ElytraClient
|
from .client import ElytraClient
|
||||||
from .exceptions import ElytraAPIError, ElytraAuthenticationError
|
from .exceptions import ElytraAPIError, ElytraAuthenticationError
|
||||||
from .models import (
|
from .models import (
|
||||||
SingleProductResponse,
|
|
||||||
SingleProductGroupResponse,
|
|
||||||
SingleNewProductRequestBody,
|
|
||||||
SingleUpdateProductRequestBody,
|
|
||||||
SingleNewProductGroupRequestBody,
|
|
||||||
SingleUpdateProductGroupRequestBody,
|
|
||||||
ProductAttributeResponse,
|
ProductAttributeResponse,
|
||||||
|
SingleNewProductGroupRequestBody,
|
||||||
|
SingleNewProductRequestBody,
|
||||||
|
SingleProductGroupResponse,
|
||||||
|
SingleProductResponse,
|
||||||
|
SingleUpdateProductGroupRequestBody,
|
||||||
|
SingleUpdateProductRequestBody,
|
||||||
)
|
)
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ profile = "black"
|
||||||
line_length = 100
|
line_length = 100
|
||||||
|
|
||||||
[tool.mypy]
|
[tool.mypy]
|
||||||
python_version = "3.9"
|
python_version = "1.0.0"
|
||||||
warn_return_any = true
|
warn_return_any = true
|
||||||
warn_unused_configs = true
|
warn_unused_configs = true
|
||||||
disallow_untyped_defs = false
|
disallow_untyped_defs = false
|
||||||
|
|
|
||||||
82
update_version.ps1
Normal file
82
update_version.ps1
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true, Position = 0)]
|
||||||
|
[string]$Version
|
||||||
|
)
|
||||||
|
|
||||||
|
function Test-VersionFormat {
|
||||||
|
param([string]$Ver)
|
||||||
|
$pattern = '^\d+\.\d+\.\d+(?:-[a-zA-Z0-9]+)?$'
|
||||||
|
return $Ver -match $pattern
|
||||||
|
}
|
||||||
|
|
||||||
|
function Update-FileVersion {
|
||||||
|
param(
|
||||||
|
[string]$FilePath,
|
||||||
|
[string]$Pattern,
|
||||||
|
[string]$NewVersion
|
||||||
|
)
|
||||||
|
try {
|
||||||
|
$content = Get-Content -Path $FilePath -Raw
|
||||||
|
$newContent = $content -replace $Pattern, $NewVersion
|
||||||
|
if ($content -eq $newContent) {
|
||||||
|
Write-Host "[OK] $(Split-Path -Leaf $FilePath) already up-to-date" -ForegroundColor Green
|
||||||
|
return $true
|
||||||
|
}
|
||||||
|
Set-Content -Path $FilePath -Value $newContent -NoNewline
|
||||||
|
Write-Host "[OK] Updated $(Split-Path -Leaf $FilePath)" -ForegroundColor Green
|
||||||
|
return $true
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host "[ERROR] Error: $_" -ForegroundColor Red
|
||||||
|
return $false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-VersionFormat $Version)) {
|
||||||
|
Write-Host "[ERROR] Invalid version format: $Version" -ForegroundColor Red
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
$projectRoot = Split-Path -Parent $PSCommandPath
|
||||||
|
$pyprojectPath = Join-Path $projectRoot "pyproject.toml"
|
||||||
|
$initPath = Join-Path (Join-Path $projectRoot "elytra_client") "__init__.py"
|
||||||
|
|
||||||
|
Write-Host "======================================================================"
|
||||||
|
Write-Host "Updating Elytra PIM Client to version $Version"
|
||||||
|
Write-Host "======================================================================"
|
||||||
|
|
||||||
|
$success = $true
|
||||||
|
|
||||||
|
if (Test-Path $pyprojectPath) {
|
||||||
|
$pattern = 'version = "[^"]+"'
|
||||||
|
$newVersion = "version = `"$Version`""
|
||||||
|
if (-not (Update-FileVersion $pyprojectPath $pattern $newVersion)) {
|
||||||
|
$success = $false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Host "[ERROR] pyproject.toml not found" -ForegroundColor Red
|
||||||
|
$success = $false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Test-Path $initPath) {
|
||||||
|
$pattern = '__version__ = "[^"]+"'
|
||||||
|
$newVersion = "__version__ = `"$Version`""
|
||||||
|
if (-not (Update-FileVersion $initPath $pattern $newVersion)) {
|
||||||
|
$success = $false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Host "[ERROR] init file not found" -ForegroundColor Red
|
||||||
|
$success = $false
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "======================================================================"
|
||||||
|
if ($success) {
|
||||||
|
Write-Host "[OK] Version successfully updated to $Version" -ForegroundColor Green
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Host "[ERROR] Update completed with errors" -ForegroundColor Red
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
127
update_version.py
Normal file
127
update_version.py
Normal file
|
|
@ -0,0 +1,127 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
"""Update version across Elytra PIM Client project files.
|
||||||
|
|
||||||
|
This script updates the version in:
|
||||||
|
- pyproject.toml
|
||||||
|
- elytra_client/__init__.py
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python update_version.py <version>
|
||||||
|
python update_version.py 0.2.0
|
||||||
|
python update_version.py 1.0.0
|
||||||
|
|
||||||
|
The version must follow semantic versioning (major.minor.patch).
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def validate_version(version: str) -> bool:
|
||||||
|
"""Validate semantic version format.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
version: Version string to validate
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True if valid, False otherwise
|
||||||
|
"""
|
||||||
|
pattern = r'^\d+\.\d+\.\d+(?:-[a-zA-Z0-9]+)?$'
|
||||||
|
return bool(re.match(pattern, version))
|
||||||
|
|
||||||
|
|
||||||
|
def update_file(file_path: Path, old_pattern: str, new_version: str) -> bool:
|
||||||
|
"""Update version in a file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file_path: Path to file to update
|
||||||
|
old_pattern: Regex pattern to find version
|
||||||
|
new_version: New version string
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True if successful, False otherwise
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
content = file_path.read_text()
|
||||||
|
updated_content = re.sub(old_pattern, new_version, content)
|
||||||
|
|
||||||
|
if content == updated_content:
|
||||||
|
print(f"✓ {file_path.name} already up-to-date")
|
||||||
|
return True
|
||||||
|
|
||||||
|
file_path.write_text(updated_content)
|
||||||
|
print(f"✓ Updated {file_path.name}")
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
print(f"✗ Error updating {file_path.name}: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
"""Update version in project files.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Exit code (0 for success, 1 for failure)
|
||||||
|
"""
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print(f"Usage: {sys.argv[0]} <version>")
|
||||||
|
print(f"Example: {sys.argv[0]} 0.2.0")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
new_version = sys.argv[1]
|
||||||
|
|
||||||
|
if not validate_version(new_version):
|
||||||
|
print(f"✗ Invalid version format: {new_version}")
|
||||||
|
print("Version must follow semantic versioning (major.minor.patch)")
|
||||||
|
print("Examples: 1.0.0, 0.2.0, 1.0.0-beta")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
project_root = Path(__file__).parent
|
||||||
|
pyproject_path = project_root / "pyproject.toml"
|
||||||
|
init_path = project_root / "elytra_client" / "__init__.py"
|
||||||
|
|
||||||
|
print("=" * 70)
|
||||||
|
print(f"Updating Elytra PIM Client to version {new_version}")
|
||||||
|
print("=" * 70)
|
||||||
|
|
||||||
|
success = True
|
||||||
|
|
||||||
|
# Update pyproject.toml
|
||||||
|
if pyproject_path.exists():
|
||||||
|
pattern = r'version = "[^"]+"'
|
||||||
|
success &= update_file(
|
||||||
|
pyproject_path,
|
||||||
|
pattern,
|
||||||
|
f'version = "{new_version}"'
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
print(f"✗ {pyproject_path} not found")
|
||||||
|
success = False
|
||||||
|
|
||||||
|
# Update __init__.py
|
||||||
|
if init_path.exists():
|
||||||
|
pattern = r'__version__ = "[^"]+"'
|
||||||
|
success &= update_file(
|
||||||
|
init_path,
|
||||||
|
pattern,
|
||||||
|
f'__version__ = "{new_version}"'
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
print(f"✗ {init_path} not found")
|
||||||
|
success = False
|
||||||
|
|
||||||
|
if success:
|
||||||
|
print("=" * 70)
|
||||||
|
print(f"✓ Version successfully updated to {new_version}")
|
||||||
|
print("=" * 70)
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
print("=" * 70)
|
||||||
|
print("✗ Version update completed with errors")
|
||||||
|
print("=" * 70)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
123
update_version.sh
Normal file
123
update_version.sh
Normal file
|
|
@ -0,0 +1,123 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Update version across Elytra PIM Client project files.
|
||||||
|
#
|
||||||
|
# This script updates the version in:
|
||||||
|
# - pyproject.toml
|
||||||
|
# - elytra_client/__init__.py
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./update_version.sh <version>
|
||||||
|
# ./update_version.sh 0.2.0
|
||||||
|
#
|
||||||
|
# The version must follow semantic versioning (major.minor.patch).
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Color codes
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
validate_version() {
|
||||||
|
local version=$1
|
||||||
|
if [[ ! $version =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?$ ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
update_file() {
|
||||||
|
local file_path=$1
|
||||||
|
local pattern=$2
|
||||||
|
local new_version=$3
|
||||||
|
|
||||||
|
if [[ ! -f "$file_path" ]]; then
|
||||||
|
echo -e "${RED}✗ File not found: $file_path${NC}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if content would change
|
||||||
|
local content
|
||||||
|
content=$(cat "$file_path")
|
||||||
|
|
||||||
|
# Use sed to update the file (handles both macOS and Linux)
|
||||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
# macOS requires -i '' for in-place editing
|
||||||
|
sed -i '' "$pattern" "$file_path"
|
||||||
|
else
|
||||||
|
# Linux
|
||||||
|
sed -i "$pattern" "$file_path"
|
||||||
|
fi
|
||||||
|
|
||||||
|
local new_content
|
||||||
|
new_content=$(cat "$file_path")
|
||||||
|
|
||||||
|
if [[ "$content" == "$new_content" ]]; then
|
||||||
|
echo -e "${GREEN}✓ $(basename "$file_path") already up-to-date${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}✓ Updated $(basename "$file_path")${NC}"
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
if [[ $# -ne 1 ]]; then
|
||||||
|
echo "Usage: $0 <version>"
|
||||||
|
echo "Example: $0 0.2.0"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local new_version=$1
|
||||||
|
|
||||||
|
if ! validate_version "$new_version"; then
|
||||||
|
echo -e "${RED}✗ Invalid version format: $new_version${NC}"
|
||||||
|
echo -e "${YELLOW}Version must follow semantic versioning (major.minor.patch)${NC}"
|
||||||
|
echo -e "${YELLOW}Examples: 1.0.0, 0.2.0, 1.0.0-beta${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local project_root
|
||||||
|
project_root="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
local pyproject_path="$project_root/pyproject.toml"
|
||||||
|
local init_path="$project_root/elytra_client/__init__.py"
|
||||||
|
|
||||||
|
echo "======================================================================"
|
||||||
|
echo "Updating Elytra PIM Client to version $new_version"
|
||||||
|
echo "======================================================================"
|
||||||
|
|
||||||
|
local success=true
|
||||||
|
|
||||||
|
# Update pyproject.toml
|
||||||
|
if [[ -f "$pyproject_path" ]]; then
|
||||||
|
local pattern_pyproject="s|version = \"[^\"]*\"|version = \"$new_version\"|g"
|
||||||
|
if ! update_file "$pyproject_path" "$pattern_pyproject"; then
|
||||||
|
success=false
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ $pyproject_path not found${NC}"
|
||||||
|
success=false
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update __init__.py
|
||||||
|
if [[ -f "$init_path" ]]; then
|
||||||
|
local pattern_init="s|__version__ = \"[^\"]*\"|__version__ = \"$new_version\"|g"
|
||||||
|
if ! update_file "$init_path" "$pattern_init"; then
|
||||||
|
success=false
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ $init_path not found${NC}"
|
||||||
|
success=false
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "======================================================================"
|
||||||
|
if [[ "$success" == true ]]; then
|
||||||
|
echo -e "${GREEN}✓ Version successfully updated to $new_version${NC}"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Version update completed with errors${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue