Back to Repositories

Testing Version Compatibility Detection in Apache Airflow

This test suite implements version compatibility checks for Apache Airflow, focusing on managing version-dependent functionality across different Airflow releases. It provides essential utilities for handling version-specific code paths and ensuring compatibility across major Airflow versions.

Test Coverage Overview

The test coverage focuses on version compatibility detection and comparison functionality.

  • Tests version tuple extraction from Airflow installation
  • Validates version comparison logic for Airflow 2.10+ and 3.0+
  • Covers edge cases in version parsing and comparison
  • Tests integration with packaging.version library

Implementation Analysis

The testing approach utilizes Python’s packaging library for robust version parsing and comparison. It implements version detection through a dedicated function that extracts major, minor, and micro version components as a tuple, enabling precise version-based conditional logic.

  • Uses packaging.version.Version for standardized version parsing
  • Implements tuple-based version comparison
  • Provides boolean flags for version-specific code paths

Technical Details

  • Python packaging library for version parsing
  • Unit test framework for version compatibility checks
  • Version tuple extraction utilities
  • Boolean flag constants for version detection
  • Future annotations support for Python compatibility

Best Practices Demonstrated

The test implementation showcases several testing best practices for version compatibility management.

  • Clear separation of version detection logic
  • Standardized version comparison approach
  • Explicit version constant definitions
  • Cross-provider compatibility consideration
  • Documentation of copy requirements for provider independence

apache/airflow

tests_common/test_utils/version_compat.py

            
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# NOTE! THIS FILE IS COPIED MANUALLY IN OTHER PROVIDERS DELIBERATELY TO AVOID ADDING UNNECESSARY
# DEPENDENCIES BETWEEN PROVIDERS. IF YOU WANT TO ADD CONDITIONAL CODE IN YOUR PROVIDER THAT DEPENDS
# ON AIRFLOW VERSION, PLEASE COPY THIS FILE TO THE ROOT PACKAGE OF YOUR PROVIDER AND IMPORT
# THOSE CONSTANTS FROM IT RATHER THAN IMPORTING THEM FROM ANOTHER PROVIDER OR TEST CODE
#
from __future__ import annotations


def get_base_airflow_version_tuple() -> tuple[int, int, int]:
    from packaging.version import Version

    from airflow import __version__

    airflow_version = Version(__version__)
    return airflow_version.major, airflow_version.minor, airflow_version.micro


AIRFLOW_V_2_10_PLUS = get_base_airflow_version_tuple() >= (2, 10, 0)
AIRFLOW_V_3_0_PLUS = get_base_airflow_version_tuple() >= (3, 0, 0)