diff --git a/.openapi-generator-ignore b/.openapi-generator-ignore index bbc5673..dd177d7 100644 --- a/.openapi-generator-ignore +++ b/.openapi-generator-ignore @@ -31,3 +31,4 @@ openapi-generator-config.json # application_resources_api.py - No longer needed, new spec fixes the API design # tag_filter.py - STILL NEEDED: New spec uses Dict[str, Any] which doesn't support string/int/bool values instana_client/models/tag_filter.py +instana_client/models/service.py diff --git a/automation/publish_pypi.sh b/automation/publish_pypi.sh new file mode 100755 index 0000000..13bdefa --- /dev/null +++ b/automation/publish_pypi.sh @@ -0,0 +1,280 @@ +#!/bin/bash + +# ============================================================================= +# INSTANA PYTHON SDK PYPI PUBLISHING SCRIPT +# ============================================================================= +# This script handles publishing the SDK to PyPI +# ============================================================================= + +set -e # Exit on any error + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Configuration +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +PYPI_USERNAME="${PYPI_USERNAME:-__token__}" +PYPI_PASSWORD="${PYPI_PASSWORD:-}" +PYPI_REPOSITORY="${PYPI_REPOSITORY:-pypi}" +DRY_RUN="${DRY_RUN:-false}" + +# Function to print colored output +print_header() { + echo -e "\n${CYAN}========================================${NC}" + echo -e "${CYAN}$1${NC}" + echo -e "${CYAN}========================================${NC}\n" +} + +print_status() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Function to show usage +show_usage() { + cat << EOF +Usage: $0 [OPTIONS] + +Publish Instana Python SDK to PyPI + +OPTIONS: + -u, --username USER PyPI username (default: __token__) + -p, --password PASS PyPI password/token (required) + -r, --repository REPO PyPI repository (default: pypi, use testpypi for testing) + -d, --dry-run Check packages without uploading + -h, --help Show this help message + +EXAMPLES: + # Publish to PyPI with token + $0 --password YOUR_PYPI_TOKEN + + # Publish to Test PyPI + $0 --password YOUR_TEST_TOKEN --repository testpypi + + # Dry run to check packages + $0 --dry-run + + # Publish with username/password (legacy) + $0 --username myuser --password mypassword + +ENVIRONMENT VARIABLES: + PYPI_USERNAME PyPI username (default: __token__) + PYPI_PASSWORD PyPI password/token + PYPI_REPOSITORY PyPI repository (default: pypi) + +NOTES: + - For PyPI API tokens, use username: __token__ + - Get tokens at: https://pypi.org/manage/account/token/ + - Test PyPI: https://test.pypi.org/manage/account/token/ + +EOF +} + +# Parse command line arguments +while [[ $# -gt 0 ]]; do + case $1 in + -u|--username) + PYPI_USERNAME="$2" + shift 2 + ;; + -p|--password) + PYPI_PASSWORD="$2" + shift 2 + ;; + -r|--repository) + PYPI_REPOSITORY="$2" + shift 2 + ;; + -d|--dry-run) + DRY_RUN=true + shift + ;; + -h|--help) + show_usage + exit 0 + ;; + *) + print_error "Unknown option: $1" + show_usage + exit 1 + ;; + esac +done + +# Change to project root +cd "$PROJECT_ROOT" + +print_header "Instana Python SDK PyPI Publishing" +print_status "Project root: $PROJECT_ROOT" +print_status "Repository: $PYPI_REPOSITORY" +print_status "Username: $PYPI_USERNAME" +print_status "Dry run: $DRY_RUN" + +# ============================================================================= +# STEP 1: Validate prerequisites +# ============================================================================= +print_header "Step 1: Validating prerequisites" + +# Check if dist directory exists +if [ ! -d "dist" ]; then + print_error "dist/ directory not found" + print_status "Run './automation/update_sdk.sh' first to build packages" + exit 1 +fi + +# Check if packages exist +PACKAGE_COUNT=$(ls -1 dist/*.whl dist/*.tar.gz 2>/dev/null | wc -l) +if [ "$PACKAGE_COUNT" -eq 0 ]; then + print_error "No distribution packages found in dist/" + print_status "Run './automation/update_sdk.sh' first to build packages" + exit 1 +fi + +print_success "Found $PACKAGE_COUNT distribution package(s)" +ls -lh dist/ + +# Get version from package +CURRENT_VERSION=$(grep "^VERSION = " setup.py | sed 's/VERSION = "\(.*\)"/\1/') +print_status "SDK version: $CURRENT_VERSION" + +# ============================================================================= +# STEP 2: Setup publishing environment +# ============================================================================= +print_header "Step 2: Setting up publishing environment" + +if [ "$DRY_RUN" = false ]; then + # Create virtual environment for publishing + print_status "Creating virtual environment..." + python3 -m venv .venv-publish + source .venv-publish/bin/activate + + # Install twine + print_status "Installing twine..." + pip install --upgrade twine + + print_success "Publishing environment ready" +else + print_status "DRY RUN: Would create virtual environment and install twine" +fi + +# ============================================================================= +# STEP 3: Check packages +# ============================================================================= +print_header "Step 3: Checking packages" + +if [ "$DRY_RUN" = false ]; then + source .venv-publish/bin/activate + + print_status "Running twine check..." + if twine check dist/*; then + print_success "Package check passed" + else + print_error "Package check failed" + deactivate + rm -rf .venv-publish + exit 1 + fi +else + print_status "DRY RUN: Would run twine check on packages" +fi + +# ============================================================================= +# STEP 4: Upload to PyPI +# ============================================================================= +if [ "$DRY_RUN" = false ]; then + print_header "Step 4: Uploading to PyPI" + + # Validate credentials + if [ -z "$PYPI_PASSWORD" ]; then + print_error "PyPI password/token is required" + print_status "Use --password option or set PYPI_PASSWORD environment variable" + deactivate + rm -rf .venv-publish + exit 1 + fi + + source .venv-publish/bin/activate + + print_status "Uploading packages to $PYPI_REPOSITORY..." + print_status "This may take a moment..." + + # Upload to PyPI + if [ "$PYPI_REPOSITORY" = "pypi" ]; then + twine upload dist/* -u "$PYPI_USERNAME" -p "$PYPI_PASSWORD" + PACKAGE_URL="https://pypi.org/project/instana-client/$CURRENT_VERSION/" + elif [ "$PYPI_REPOSITORY" = "testpypi" ]; then + twine upload --repository testpypi dist/* -u "$PYPI_USERNAME" -p "$PYPI_PASSWORD" + PACKAGE_URL="https://test.pypi.org/project/instana-client/$CURRENT_VERSION/" + else + twine upload --repository "$PYPI_REPOSITORY" dist/* -u "$PYPI_USERNAME" -p "$PYPI_PASSWORD" + PACKAGE_URL="Custom repository: $PYPI_REPOSITORY" + fi + + print_success "Successfully uploaded to $PYPI_REPOSITORY" + + deactivate +else + print_header "Step 4: Upload Preview (Dry Run)" + print_status "Would upload the following packages:" + ls -1 dist/ + print_status "To repository: $PYPI_REPOSITORY" + print_status "With username: $PYPI_USERNAME" +fi + +# ============================================================================= +# STEP 5: Cleanup +# ============================================================================= +print_header "Step 5: Cleanup" + +if [ "$DRY_RUN" = false ]; then + rm -rf .venv-publish + print_success "Cleanup complete" +else + print_status "DRY RUN: Would cleanup virtual environment" +fi + +# ============================================================================= +# Summary +# ============================================================================= +print_header "Publishing Summary" + +if [ "$DRY_RUN" = false ]; then + echo -e "Publishing Complete!${NC}\n" + echo "Package: instana-client" + echo "Version: $CURRENT_VERSION" + echo "Repository: $PYPI_REPOSITORY" + echo "" + echo "Package URL: $PACKAGE_URL" + echo "" + echo "Next steps:" + echo "1. Verify package on PyPI" + echo "2. Test installation: pip install instana-client==$CURRENT_VERSION" + echo "3. Create git tag: git tag v$CURRENT_VERSION" + echo "4. Push tag: git push origin v$CURRENT_VERSION" + echo "5. Create GitHub release" +else + echo "This was a DRY RUN - no packages were uploaded" + echo "Run without --dry-run to publish to PyPI" + echo "" + echo "Packages ready for upload:" + ls -1 dist/ +fi + +print_success "Publishing process complete!" diff --git a/automation/update_sdk.sh b/automation/update_sdk.sh new file mode 100755 index 0000000..1667a14 --- /dev/null +++ b/automation/update_sdk.sh @@ -0,0 +1,363 @@ +#!/bin/bash + +# ============================================================================= +# INSTANA PYTHON SDK UPDATE SCRIPT +# ============================================================================= +# This script automates the SDK update process including: +# - Regenerating SDK code from OpenAPI spec +# - Running tests +# - Version bumping +# - Building distribution packages +# ============================================================================= + +set -e # Exit on any error + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Configuration +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +OPENAPI_SPEC_PATH="${OPENAPI_SPEC_PATH:-}" +NEW_VERSION="${NEW_VERSION:-}" +SKIP_TESTS="${SKIP_TESTS:-false}" +SKIP_BUILD="${SKIP_BUILD:-false}" +DRY_RUN="${DRY_RUN:-false}" + +# Function to print colored output +print_header() { + echo -e "\n${CYAN}========================================${NC}" + echo -e "${CYAN}$1${NC}" + echo -e "${CYAN}========================================${NC}\n" +} + +print_status() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Function to show usage +show_usage() { + cat << EOF +Usage: $0 [OPTIONS] + +Automate Instana Python SDK updates + +OPTIONS: + -s, --spec-path PATH Path to OpenAPI spec file (required) + -v, --version VERSION New SDK version (e.g., 1.0.5) + -t, --skip-tests Skip running tests + -b, --skip-build Skip building distribution packages + -d, --dry-run Perform dry run (no actual changes) + -h, --help Show this help message + +EXAMPLES: + # Update with new spec and auto-increment version + $0 --spec-path ./openapi.yaml + + # Update with specific version + $0 --spec-path ./openapi-1.316.yaml --version 1.0.5 + + # Dry run to see what would happen + $0 --spec-path ./openapi.yaml --dry-run + + # Update without building packages + $0 --spec-path ./openapi.yaml --skip-build + +ENVIRONMENT VARIABLES: + OPENAPI_SPEC_PATH Default OpenAPI spec path + NEW_VERSION Default new version + +EOF +} + +# Parse command line arguments +while [[ $# -gt 0 ]]; do + case $1 in + -s|--spec-path) + OPENAPI_SPEC_PATH="$2" + shift 2 + ;; + -v|--version) + NEW_VERSION="$2" + shift 2 + ;; + -t|--skip-tests) + SKIP_TESTS=true + shift + ;; + -b|--skip-build) + SKIP_BUILD=true + shift + ;; + -d|--dry-run) + DRY_RUN=true + shift + ;; + -h|--help) + show_usage + exit 0 + ;; + *) + print_error "Unknown option: $1" + show_usage + exit 1 + ;; + esac +done + +# Validate required parameters +if [ -z "$OPENAPI_SPEC_PATH" ]; then + print_error "OpenAPI spec path is required" + show_usage + exit 1 +fi + +# Validate spec file exists +if [ ! -f "$OPENAPI_SPEC_PATH" ]; then + print_error "OpenAPI spec file not found: $OPENAPI_SPEC_PATH" + exit 1 +fi + +# Change to project root +cd "$PROJECT_ROOT" + +print_header "Instana Python SDK Update" +print_status "Project root: $PROJECT_ROOT" +print_status "OpenAPI spec: $OPENAPI_SPEC_PATH" +print_status "Dry run: $DRY_RUN" + +# ============================================================================= +# STEP 1: Backup current state +# ============================================================================= +print_header "Step 1: Backing up current state" + +BACKUP_DIR="$PROJECT_ROOT/.backup_$(date +%Y%m%d_%H%M%S)" +if [ "$DRY_RUN" = false ]; then + mkdir -p "$BACKUP_DIR" + cp -r instana_client "$BACKUP_DIR/" + cp setup.py pyproject.toml "$BACKUP_DIR/" + print_success "Backup created at: $BACKUP_DIR" +else + print_status "DRY RUN: Would create backup at $BACKUP_DIR" +fi + +# ============================================================================= +# STEP 2: Copy OpenAPI spec to project root +# ============================================================================= +print_header "Step 2: Preparing OpenAPI specification" + +print_status "Using spec file: $OPENAPI_SPEC_PATH" +if [ "$DRY_RUN" = false ]; then + # Copy to project root as openapi.yaml + cp "$OPENAPI_SPEC_PATH" openapi.yaml + print_success "Copied OpenAPI spec to project root" +else + print_status "DRY RUN: Would copy from $OPENAPI_SPEC_PATH" +fi + +# Extract version from OpenAPI spec +SPEC_VERSION=$(grep -m 1 "version:" openapi.yaml | sed 's/.*version: *//;s/"//g;s/'\''//g' | tr -d ' ') +print_status "OpenAPI spec version: $SPEC_VERSION" + +# ============================================================================= +# STEP 3: Determine new SDK version +# ============================================================================= +print_header "Step 3: Determining SDK version" + +CURRENT_VERSION=$(grep "^VERSION = " setup.py | sed 's/VERSION = "\(.*\)"/\1/') +print_status "Current SDK version: $CURRENT_VERSION" + +if [ -z "$NEW_VERSION" ]; then + # Auto-increment patch version + IFS='.' read -ra VERSION_PARTS <<< "$CURRENT_VERSION" + MAJOR="${VERSION_PARTS[0]}" + MINOR="${VERSION_PARTS[1]}" + PATCH="${VERSION_PARTS[2]}" + NEW_PATCH=$((PATCH + 1)) + NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" + print_status "Auto-incremented version to: $NEW_VERSION" +else + print_status "Using specified version: $NEW_VERSION" +fi + +# ============================================================================= +# STEP 4: Generate SDK code +# ============================================================================= +print_header "Step 4: Generating SDK code" + +if [ "$DRY_RUN" = false ]; then + print_status "Running OpenAPI generator..." + + # Check if openapi-generator-cli is available + if ! command -v openapi-generator-cli &> /dev/null; then + print_error "openapi-generator-cli not found. Please install it first." + print_status "Install with: npm install -g @openapitools/openapi-generator-cli" + exit 1 + fi + + openapi-generator-cli generate \ + -i openapi.yaml \ + -g python \ + -o . \ + --config openapi-generator-config.json \ + --skip-validate-spec + + print_success "SDK code generated" +else + print_status "DRY RUN: Would generate SDK code" +fi + +# ============================================================================= +# STEP 5: Update version numbers +# ============================================================================= +print_header "Step 5: Updating version numbers" + +if [ "$DRY_RUN" = false ]; then + # Update setup.py + sed -i.bak "s/VERSION = \"$CURRENT_VERSION\"/VERSION = \"$NEW_VERSION\"/" setup.py + + # Update pyproject.toml + sed -i.bak "s/version = \"$CURRENT_VERSION\"/version = \"$NEW_VERSION\"/" pyproject.toml + + # Update __init__.py + sed -i.bak "s/__version__ = \"$CURRENT_VERSION\"/__version__ = \"$NEW_VERSION\"/" instana_client/__init__.py + + # Update api_client.py + sed -i.bak "s/OpenAPI-Generator\/$CURRENT_VERSION/OpenAPI-Generator\/$NEW_VERSION/" instana_client/api_client.py + + # Update configuration.py + sed -i.bak "s/SDK Package Version: $CURRENT_VERSION/SDK Package Version: $NEW_VERSION/" instana_client/configuration.py + + # Clean up backup files + rm -f setup.py.bak pyproject.toml.bak instana_client/__init__.py.bak \ + instana_client/api_client.py.bak instana_client/configuration.py.bak + + print_success "Version updated to $NEW_VERSION" +else + print_status "DRY RUN: Would update version from $CURRENT_VERSION to $NEW_VERSION" +fi + +# ============================================================================= +# STEP 6: Run tests +# ============================================================================= +if [ "$SKIP_TESTS" = false ]; then + print_header "Step 6: Running tests" + + if [ "$DRY_RUN" = false ]; then + # Run sanity tests + print_status "Running sanity tests..." + if ./sanity_test.sh; then + print_success "Sanity tests passed" + else + print_error "Sanity tests failed" + print_warning "Restoring from backup..." + rm -rf instana_client setup.py pyproject.toml + cp -r "$BACKUP_DIR"/* . + exit 1 + fi + + # Run unit tests + print_status "Running unit tests..." + if python3 -m pytest test/ -v --tb=short --maxfail=5; then + print_success "Unit tests passed" + else + print_warning "Some unit tests failed (this is expected for stub tests)" + fi + else + print_status "DRY RUN: Would run sanity and unit tests" + fi +else + print_warning "Skipping tests (--skip-tests flag set)" +fi + +# ============================================================================= +# STEP 7: Build distribution packages +# ============================================================================= +if [ "$SKIP_BUILD" = false ]; then + print_header "Step 7: Building distribution packages" + + if [ "$DRY_RUN" = false ]; then + # Clean previous builds + rm -rf dist/ build/ *.egg-info + + # Create virtual environment for build + python3 -m venv .venv-build + source .venv-build/bin/activate + pip install --upgrade build + + # Build packages + python -m build + + print_success "Distribution packages built" + ls -lh dist/ + + deactivate + rm -rf .venv-build + else + print_status "DRY RUN: Would build distribution packages" + fi +else + print_warning "Skipping build (--skip-build flag set)" +fi + +# ============================================================================= +# STEP 8: Cleanup +# ============================================================================= +print_header "Step 8: Cleanup" + +if [ "$DRY_RUN" = false ]; then + rm -rf build/ *.egg-info + print_success "Cleanup complete" + + # Keep backup for safety + print_status "Backup preserved at: $BACKUP_DIR" + print_status "Remove manually if update is successful" +else + print_status "DRY RUN: Would cleanup build artifacts" +fi + +# ============================================================================= +# Summary +# ============================================================================= +print_header "Update Summary" + +echo -e "SDK Update Complete!${NC}\n" +echo "Previous version: $CURRENT_VERSION" +echo "New version: $NEW_VERSION" +echo "OpenAPI spec version: $SPEC_VERSION" +echo "" + +if [ "$DRY_RUN" = false ]; then + echo "Next steps:" + echo "1. Review the changes: git diff" + echo "2. Test the updated SDK" + if [ "$SKIP_BUILD" = false ]; then + echo "3. Publish to PyPI: ./automation/publish_pypi.sh" + fi + echo "4. Commit changes: git add . && git commit -m 'Update SDK to version $NEW_VERSION'" + echo "5. Push to repository: git push" + echo "" + echo "Backup location: $BACKUP_DIR" +else + echo "This was a DRY RUN - no actual changes were made" + echo "Run without --dry-run to perform the actual update" +fi + +print_success "SDK update complete!" diff --git a/instana_client/__init__.py b/instana_client/__init__.py index a51e911..7b742fa 100644 --- a/instana_client/__init__.py +++ b/instana_client/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "1.0.4" +__version__ = "1.0.6" # Define package exports __all__ = [ diff --git a/instana_client/api_client.py b/instana_client/api_client.py index acb09e5..3a58010 100644 --- a/instana_client/api_client.py +++ b/instana_client/api_client.py @@ -92,7 +92,7 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = 'OpenAPI-Generator/1.0.4/python' + self.user_agent = 'OpenAPI-Generator/1.0.6/python' self.client_side_validation = configuration.client_side_validation def __enter__(self): diff --git a/instana_client/configuration.py b/instana_client/configuration.py index 696fa64..23b7683 100644 --- a/instana_client/configuration.py +++ b/instana_client/configuration.py @@ -536,7 +536,7 @@ def to_debug_report(self) -> str: "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.315.1425\n"\ - "SDK Package Version: 1.0.4".\ + "SDK Package Version: 1.0.6".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self) -> List[HostSetting]: diff --git a/instana_client/models/service.py b/instana_client/models/service.py index b7c45b5..1d81418 100644 --- a/instana_client/models/service.py +++ b/instana_client/models/service.py @@ -32,7 +32,7 @@ class Service(BaseModel): id: Annotated[str, Field(min_length=1, strict=True)] = Field(description="Unique ID of the Service. Eg: `3feb3dcd206c166ef2b41c707e0cd38d7cd325aa`.") label: Annotated[str, Field(min_length=1, strict=True)] = Field(description="Name of the Service. Eg: `payment`.") snapshot_ids: List[StrictStr] = Field(description="A unique identifier the metrics are assigned to.", alias="snapshotIds") - technologies: List[StrictStr] = Field(description="List of technologies: `Eg:[\"springbootApplicationContainer\"]`") + technologies: Optional[List[StrictStr]] = Field(default=None, description="List of technologies: `Eg:[\"springbootApplicationContainer\"]`") types: List[StrictStr] = Field(description="Shows types of Endpoints a Service can consist of. It may be one or more. Eg: `HTTP` `OPENTELEMETRY` can be in 1 Service.") __properties: ClassVar[List[str]] = ["entityType", "id", "label", "snapshotIds", "technologies", "types"] diff --git a/pyproject.toml b/pyproject.toml index db7c146..3b8e371 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "instana_client" -version = "1.0.4" +version = "1.0.6" description = "Instana REST API documentation" authors = [ {name = "© Instana",email = "support@instana.com"}, diff --git a/sanity_test.sh b/sanity_test.sh index 074e4c6..2e87d11 100755 --- a/sanity_test.sh +++ b/sanity_test.sh @@ -283,20 +283,20 @@ echo "------------------------------------" print_status "Running complete integration test..." if python3 -c " import instana_client -print('✅ 1. Basic import: SUCCESS') +print('1. Basic import: SUCCESS') print(f' SDK Version: {instana_client.__version__}') from instana_client.api.ai_management_api import AIManagementApi from instana_client.api.teams_api import TeamsApi -print('✅ 2. New APIs: SUCCESS') +print('2. New APIs: SUCCESS') from instana_client.models.application import Application -print('✅ 3. Models: SUCCESS') +print('3. Models: SUCCESS') from instana_client.configuration import Configuration -print('✅ 4. Configuration: SUCCESS') +print('4. Configuration: SUCCESS') -print('🎉 ALL SYSTEMS GO!') +print(' ALL SYSTEMS GO!') " 2>/dev/null; then print_success "Complete integration test passed" else @@ -345,15 +345,15 @@ print_success "SANITY TESTING COMPLETED SUCCESSFULLY! 🎉" echo "==================================================" echo "" print_success "All tests passed:" -print_success " ✅ Package configuration valid" -print_success " ✅ Package builds successfully" -print_success " ✅ Package installs successfully" -print_success " ✅ All imports work correctly" -print_success " ✅ New APIs functional" -print_success " ✅ Models accessible" -print_success " ✅ Configuration works" -print_success " ✅ File structure valid" -print_success " ✅ Integration test passed" +print_success " Package configuration valid" +print_success " Package builds successfully" +print_success " Package installs successfully" +print_success " All imports work correctly" +print_success " New APIs functional" +print_success " Models accessible" +print_success " Configuration works" +print_success " File structure valid" +print_success " Integration test passed" echo "" print_success "The Instana Python SDK is ready for production! 🚀" echo "" diff --git a/setup.py b/setup.py index f73a51a..6761a07 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "instana-client" -VERSION = "1.0.4" +VERSION = "1.0.6" PYTHON_REQUIRES = ">= 3.9" REQUIRES = [ "urllib3 >= 2.1.0, < 3.0.0",