diff --git a/src/crewai/telemtry.py b/src/crewai/telemtry.py new file mode 100644 index 0000000000..b67a62deed --- /dev/null +++ b/src/crewai/telemtry.py @@ -0,0 +1,19 @@ +""" +Backward compatibility module for crewai.telemtry to handle typo in import statements. + +This module allows older code that imports from `crewai.telemtry` (misspelled) +to continue working by re-exporting the Telemetry class from the correctly +spelled `crewai.telemetry` module. +""" +import warnings + +from crewai.telemetry import Telemetry + +warnings.warn( + "Importing from 'crewai.telemtry' is deprecated due to spelling issues. " + "Please use 'from crewai.telemetry import Telemetry' instead.", + DeprecationWarning, + stacklevel=2 +) + +__all__ = ["Telemetry"] diff --git a/tests/backward_compatibility_test.py b/tests/backward_compatibility_test.py new file mode 100644 index 0000000000..0b59a3f1b7 --- /dev/null +++ b/tests/backward_compatibility_test.py @@ -0,0 +1,49 @@ +import sys +import unittest +import warnings + + +class BackwardCompatibilityTest(unittest.TestCase): + def setUp(self): + if "crewai.telemtry" in sys.modules: + del sys.modules["crewai.telemtry"] + warnings.resetwarnings() + + def test_deprecation_warning(self): + """Test that importing from the misspelled module raises a deprecation warning.""" + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always", DeprecationWarning) + + import importlib + + import crewai.telemtry + importlib.reload(crewai.telemtry) + + self.assertGreaterEqual(len(w), 1) + warning_messages = [str(warning.message) for warning in w] + warning_categories = [warning.category for warning in w] + + has_deprecation_warning = False + for msg, cat in zip(warning_messages, warning_categories): + if (issubclass(cat, DeprecationWarning) and + "crewai.telemtry" in msg and + "crewai.telemetry" in msg): + has_deprecation_warning = True + break + + self.assertTrue(has_deprecation_warning, + f"No matching deprecation warning found. Warnings: {warning_messages}") + + def test_telemtry_typo_compatibility(self): + """Test that the backward compatibility for the telemtry typo works.""" + from crewai.telemetry import Telemetry + from crewai.telemtry import Telemetry as MisspelledTelemetry + + self.assertIs(MisspelledTelemetry, Telemetry) + + def test_functionality_preservation(self): + """Test that the re-exported Telemetry class preserves all functionality.""" + from crewai.telemetry import Telemetry + from crewai.telemtry import Telemetry as MisspelledTelemetry + + self.assertEqual(dir(MisspelledTelemetry), dir(Telemetry))