Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ dependencies = [
"pdfplumber>=0.11.4",
"regex>=2024.9.11",
# Telemetry and Monitoring
"opentelemetry-api>=1.30.0",
"opentelemetry-sdk>=1.30.0",
"opentelemetry-exporter-otlp-proto-http>=1.30.0",
"opentelemetry-api>=1.27.0,<1.28.0",
"opentelemetry-sdk>=1.27.0,<1.28.0",
"opentelemetry-exporter-otlp-proto-http>=1.27.0,<1.28.0",
# Data Handling
"chromadb>=0.5.23",
"tokenizers>=0.20.3",
Expand Down
91 changes: 91 additions & 0 deletions tests/test_dependency_compatibility.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
"""Tests for dependency compatibility, specifically for issue #3413.

This module tests that CrewAI can be installed alongside Google Cloud SDKs
without protobuf dependency conflicts.
"""

import subprocess
import sys
import tempfile
import pytest


class TestDependencyCompatibility:
"""Test dependency compatibility with Google Cloud SDKs."""

def test_opentelemetry_protobuf_compatibility(self):
"""Test that opentelemetry versions work with protobuf<5.0."""
try:
from opentelemetry.sdk.trace import TracerProvider

tracer_provider = TracerProvider()
tracer = tracer_provider.get_tracer("test")

with tracer.start_as_current_span("test_span") as span:
span.set_attribute("test", "value")
assert span is not None

except ImportError as e:
pytest.fail(f"Failed to import opentelemetry modules: {e}")

def test_google_cloud_sdk_compatibility_simulation(self):
"""Simulate Google Cloud SDK protobuf requirements."""
try:
import google.protobuf
version_parts = google.protobuf.__version__.split('.')
major_version = int(version_parts[0])

assert major_version < 5, f"protobuf version {google.protobuf.__version__} should be <5.0 for Google Cloud SDK compatibility"

except ImportError:
pytest.skip("protobuf not installed, skipping compatibility test")

def test_crewai_telemetry_functionality(self):
"""Test that CrewAI telemetry functionality works with downgraded opentelemetry."""
try:
from crewai.telemetry.telemetry import Telemetry
from crewai.utilities.crew.crew_context import get_crew_context

telemetry = Telemetry()
assert telemetry is not None

get_crew_context()

except ImportError as e:
pytest.fail(f"Failed to import CrewAI telemetry modules: {e}")

def test_dry_run_installation_compatibility(self):
"""Test that CrewAI and Google Cloud SDKs can be installed together."""
with tempfile.TemporaryDirectory() as temp_dir:
try:
result = subprocess.run([
sys.executable, "-m", "pip", "install", "--dry-run", "--quiet",
"opentelemetry-api>=1.27.0,<1.30.0",
"opentelemetry-sdk>=1.27.0,<1.30.0",
"opentelemetry-exporter-otlp-proto-http>=1.27.0,<1.30.0",
"google-cloud-storage"
], capture_output=True, text=True, cwd=temp_dir)

assert result.returncode == 0, f"Dry run installation failed: {result.stderr}"

assert "protobuf" in result.stdout.lower(), "protobuf should be in installation plan"

except Exception as e:
pytest.fail(f"Dry run installation test failed: {e}")

def test_protobuf_version_constraint_resolution(self):
"""Test that protobuf version constraints are properly resolved."""
try:
import google.protobuf
version = google.protobuf.__version__

version_parts = [int(x) for x in version.split('.')]
major, minor = version_parts[0], version_parts[1]

assert major >= 3, f"protobuf version {version} should be >=3.19"
if major == 3:
assert minor >= 19, f"protobuf version {version} should be >=3.19"
assert major < 5, f"protobuf version {version} should be <5.0 for Google Cloud SDK compatibility"

except ImportError:
pytest.skip("protobuf not installed, skipping version constraint test")
Loading
Loading