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"""
|
||||
|
||||
__version__ = "0.2.0"
|
||||
__version__ = "0.1.0"
|
||||
__author__ = "Your Name"
|
||||
|
||||
from .client import ElytraClient
|
||||
from .exceptions import ElytraAPIError, ElytraAuthenticationError
|
||||
from .models import (
|
||||
SingleProductResponse,
|
||||
SingleProductGroupResponse,
|
||||
SingleNewProductRequestBody,
|
||||
SingleUpdateProductRequestBody,
|
||||
SingleNewProductGroupRequestBody,
|
||||
SingleUpdateProductGroupRequestBody,
|
||||
ProductAttributeResponse,
|
||||
SingleNewProductGroupRequestBody,
|
||||
SingleNewProductRequestBody,
|
||||
SingleProductGroupResponse,
|
||||
SingleProductResponse,
|
||||
SingleUpdateProductGroupRequestBody,
|
||||
SingleUpdateProductRequestBody,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ profile = "black"
|
|||
line_length = 100
|
||||
|
||||
[tool.mypy]
|
||||
python_version = "3.9"
|
||||
python_version = "1.0.0"
|
||||
warn_return_any = true
|
||||
warn_unused_configs = true
|
||||
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