diff --git a/.github/workflows/test-data-validation.yml b/.github/workflows/test-data-validation.yml index 6ffde28e..c596506c 100644 --- a/.github/workflows/test-data-validation.yml +++ b/.github/workflows/test-data-validation.yml @@ -16,67 +16,39 @@ on: default: '3.12' jobs: - build-wheels: - strategy: - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v4 - - - name: Set up Python ${{ inputs.python-version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ inputs.python-version }} - - - name: Generate meson files (Linux/macOS) - if: runner.os != 'Windows' - run: | - python3 scripts/generate_meson.py ./src/dbzero/ core - python3 scripts/generate_meson_tests.py tests/ - python3 scripts/generate_meson_dbzero.py dbzero/ - - - name: Generate meson files (Windows) - if: runner.os == 'Windows' - run: | - python scripts/generate_meson.py ./src/dbzero/ core - python scripts/generate_meson_tests.py tests/ - python scripts/generate_meson_dbzero.py dbzero/ - - - name: Configure git (Linux/macOS) - if: runner.os != 'Windows' - run: | - git config --global user.email "ci@example.com" - git config --global user.name "CI Builder" - rm -f .gitignore - git add . && git commit -m "Update meson files" - - - name: Configure git (Windows) - if: runner.os == 'Windows' - run: | - git config --global user.email "ci@example.com" - git config --global user.name "CI Builder" - if (Test-Path .gitignore) { Remove-Item .gitignore } - git add . && git commit -m "Update meson files" - - - name: Install build tools - run: pip install build - - - name: Build wheel - run: python -m build - - - name: Upload wheel - uses: actions/upload-artifact@v4 - with: - name: wheel-${{ runner.os }} - path: dist/*.whl - retention-days: 1 + build-linux-wheel: + uses: ./.github/workflows/build-linux-wheel.yml + with: + python-version: ${{ inputs.python-version }} + timeout-minutes: 60 + + build-macos-wheel: + uses: ./.github/workflows/build-mac-wheel.yml + with: + python-version: ${{ inputs.python-version }} + timeout-minutes: 60 + + build-windows-wheel: + uses: ./.github/workflows/build-windows-wheel.yml + with: + python-version: ${{ inputs.python-version }} + python-tag: ${{ inputs.python-version == '3.9' && '39' || inputs.python-version == '3.10' && '310' || inputs.python-version == '3.11' && '311' || inputs.python-version == '3.12' && '312' || '313' }} + architecture: 'AMD64' create-test-data: - needs: build-wheels + needs: [build-linux-wheel, build-macos-wheel, build-windows-wheel] strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + include: + - os: ubuntu-latest + os-name: Linux + wheel-artifact: wheels-linux-${{ inputs.python-version }} + - os: macos-latest + os-name: macOS + wheel-artifact: wheels-macos-${{ inputs.python-version }} + - os: windows-latest + os-name: Windows + wheel-artifact: wheels-windows-${{ inputs.python-version }} runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 @@ -89,7 +61,7 @@ jobs: - name: Download wheel uses: actions/download-artifact@v4 with: - name: wheel-${{ runner.os }} + name: ${{ matrix.wheel-artifact }} path: dist/ - name: Install wheel (Linux/macOS) @@ -103,30 +75,33 @@ jobs: $wheel = Get-ChildItem -Path dist/*.whl | Select-Object -First 1 pip install $wheel.FullName - - name: Create test data (Linux/macOS) - if: runner.os != 'Windows' - run: | - python python_tests/scripts/create_test_data.py --out_dir ./test-data-${{ runner.os }} - - - name: Create test data (Windows) - if: runner.os == 'Windows' + - name: Create test data run: | - python python_tests/scripts/create_test_data.py --out_dir ./test-data-${{ runner.os }} + python python_tests/scripts/create_test_data.py --out_dir ./test-data-${{ matrix.os-name }} - name: Upload test data uses: actions/upload-artifact@v4 with: - name: test-data-${{ runner.os }} - path: test-data-${{ runner.os }}/ + name: test-data-${{ matrix.os-name }} + path: test-data-${{ matrix.os-name }}/ retention-days: 1 validate-test-data: needs: create-test-data strategy: matrix: - validator-os: [ubuntu-latest, macos-latest, windows-latest] + validator: + - os: ubuntu-latest + os-name: Linux + wheel-artifact: wheels-linux-${{ inputs.python-version }} + - os: macos-latest + os-name: macOS + wheel-artifact: wheels-macos-${{ inputs.python-version }} + - os: windows-latest + os-name: Windows + wheel-artifact: wheels-windows-${{ inputs.python-version }} data-source: [Linux, macOS, Windows] - runs-on: ${{ matrix.validator-os }} + runs-on: ${{ matrix.validator.os }} steps: - uses: actions/checkout@v4 @@ -138,7 +113,7 @@ jobs: - name: Download wheel for validator OS uses: actions/download-artifact@v4 with: - name: wheel-${{ matrix.validator-os }} + name: ${{ matrix.validator.wheel-artifact }} path: dist/ - name: Install wheel (Linux/macOS) @@ -158,16 +133,10 @@ jobs: name: test-data-${{ matrix.data-source }} path: test-data-${{ matrix.data-source }}/ - - name: Validate test data (Linux/macOS) - if: runner.os != 'Windows' + - name: Validate test data run: | - python -m dbzero_ce.python_tests.validate_test_data --input_dir ./test-data-${{ matrix.data-source }} + python python_tests/scripts/validate_test_data.py --input_dir ./test-data-${{ matrix.data-source }} - - name: Validate test data (Windows) - if: runner.os == 'Windows' - run: | - python -m dbzero_ce.python_tests.validate_test_data --input_dir ./test-data-${{ matrix.data-source }} - cleanup: needs: validate-test-data if: always() @@ -177,9 +146,9 @@ jobs: uses: geekyeggo/delete-artifact@v5 with: name: | - wheel-Linux - wheel-macOS - wheel-Windows + wheels-linux-${{ inputs.python-version }} + wheels-macos-${{ inputs.python-version }} + wheels-windows-${{ inputs.python-version }} failOnError: false - name: Delete test data artifacts diff --git a/python_tests/scripts/validate_test_data.py b/python_tests/scripts/validate_test_data.py index c464a9c9..9d21f57a 100644 --- a/python_tests/scripts/validate_test_data.py +++ b/python_tests/scripts/validate_test_data.py @@ -18,7 +18,7 @@ def validate_test_data(test_data): elif len(test_data.list) != 10: errors.append(f"list has {len(test_data.list)} elements, expected 10") else: - print("✓ list: 10 elements") + print("list: 10 elements") # Check for mixed types has_int = any(isinstance(item, int) for item in test_data.list) has_str = any(isinstance(item, str) for item in test_data.list) @@ -32,7 +32,7 @@ def validate_test_data(test_data): elif len(test_data.dict) != 10: errors.append(f"dict has {len(test_data.dict)} elements, expected 10") else: - print("✓ dict: 10 elements") + print("dict: 10 elements") expected_keys = [f"key{i}" for i in range(1, 11)] missing_keys = [k for k in expected_keys if k not in test_data.dict] if missing_keys: @@ -44,7 +44,7 @@ def validate_test_data(test_data): elif len(test_data.set) != 10: errors.append(f"set has {len(test_data.set)} elements, expected 10") else: - print("✓ set: 10 elements") + print("set: 10 elements") # Validate tuple if not hasattr(test_data, 'tuple'): @@ -52,7 +52,7 @@ def validate_test_data(test_data): elif len(test_data.tuple) != 10: errors.append(f"tuple has {len(test_data.tuple)} elements, expected 10") else: - print("✓ tuple: 10 elements") + print("tuple: 10 elements") # Validate byte_array if not hasattr(test_data, 'byte_array'): @@ -60,7 +60,7 @@ def validate_test_data(test_data): elif len(test_data.byte_array) != 10: errors.append(f"byte_array has {len(test_data.byte_array)} bytes, expected 10") else: - print("✓ byte_array: 10 bytes") + print("byte_array: 10 bytes") # Validate large_list if not hasattr(test_data, 'large_list'): @@ -68,7 +68,7 @@ def validate_test_data(test_data): elif len(test_data.large_list) != 10000: errors.append(f"large_list has {len(test_data.large_list)} elements, expected 10000") else: - print("✓ large_list: 10000 elements") + print("large_list: 10000 elements") # Check first few objects in large_list sample_size = min(10, len(test_data.large_list)) @@ -86,7 +86,7 @@ def validate_test_data(test_data): warnings.append(f"large_list[{i}] missing 'timestamp' attribute") if not warnings or len([w for w in warnings if 'large_list' in w]) == 0: - print(f" ✓ Sample validation of first {sample_size} objects passed") + print(f" Sample validation of first {sample_size} objects passed") return errors, warnings @@ -154,16 +154,16 @@ def validate_test_data(test_data): # Report results print("\n" + "="*50) if errors: - print(f"\n❌ VALIDATION FAILED with {len(errors)} error(s):") + print(f"\nVALIDATION FAILED with {len(errors)} error(s):") for error in errors: print(f" - {error}") exit_code = 1 else: - print("\n✓ VALIDATION PASSED - All required data present") + print("\nVALIDATION PASSED - All required data present") exit_code = 0 if warnings: - print(f"\n⚠ {len(warnings)} warning(s):") + print(f"\n{len(warnings)} warning(s):") for warning in warnings: print(f" - {warning}")