diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4e19060..318bb70 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,21 +45,6 @@ uv run python -m unittest tests.unit.test_adapters -v timeout 30 uv run python -m unittest discover -s tests/integration -v ``` -### Database Integration Tests - -Requires Docker for running test databases. - -```bash -# Start test databases -docker compose -f docker-compose.test.yml up -d - -# Run database tests -uv run python -m unittest tests.integration.test_database -v - -# Stop databases -docker compose -f docker-compose.test.yml down -``` - ### E2E Tests E2E tests validate full instrumentation workflows using Docker containers. They record real API interactions and verify replay behavior using the Tusk CLI. diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index f330e6f..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,5 +0,0 @@ -include README.md -include LICENSE -include py.typed -recursive-include drift *.py -recursive-include drift *.typed diff --git a/docker-compose.test.yml b/docker-compose.test.yml deleted file mode 100644 index b87cee0..0000000 --- a/docker-compose.test.yml +++ /dev/null @@ -1,56 +0,0 @@ -# Docker Compose configuration for Python SDK integration tests -# Uses different ports than Node.js SDK to avoid conflicts - -services: - postgres: - image: postgres:15 - environment: - POSTGRES_DB: test_db - POSTGRES_USER: test_user - POSTGRES_PASSWORD: test_password - ports: - - "5002:5432" - healthcheck: - test: ["CMD-SHELL", "pg_isready -U test_user -d test_db"] - interval: 5s - timeout: 5s - retries: 5 - - mongodb: - image: mongo:7 - environment: - MONGO_INITDB_ROOT_USERNAME: test_user - MONGO_INITDB_ROOT_PASSWORD: test_password - MONGO_INITDB_DATABASE: test_db - ports: - - "27018:27017" - healthcheck: - test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test_db --quiet - interval: 5s - timeout: 5s - retries: 5 - - redis: - image: redis:7-alpine - ports: - - "6380:6379" - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 5s - timeout: 5s - retries: 5 - - mysql: - image: mysql:8 - environment: - MYSQL_DATABASE: test_db - MYSQL_USER: test_user - MYSQL_PASSWORD: test_password - MYSQL_ROOT_PASSWORD: root_password - ports: - - "3308:3306" - healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "test_user", "-ptest_password"] - interval: 5s - timeout: 5s - retries: 5 diff --git a/tests/test_transform_engine.py b/tests/unit/test_transform_engine.py similarity index 100% rename from tests/test_transform_engine.py rename to tests/unit/test_transform_engine.py diff --git a/uv.lock b/uv.lock index 4e86b76..04b5040 100644 --- a/uv.lock +++ b/uv.lock @@ -151,6 +151,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592 }, ] +[[package]] +name = "asgiref" +version = "3.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", hash = "sha256:13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4", size = 37969 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", hash = "sha256:1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d", size = 24096 }, +] + [[package]] name = "attrs" version = "25.4.0" @@ -309,6 +318,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] +[[package]] +name = "django" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "sqlparse" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/9b/016f7e55e855ee738a352b05139d4f8b278d0b451bd01ebef07456ef3b0e/django-6.0.1.tar.gz", hash = "sha256:ed76a7af4da21551573b3d9dfc1f53e20dd2e6c7d70a3adc93eedb6338130a5f", size = 11069565 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/b5/814ed98bd21235c116fd3436a7ed44d47560329a6d694ec8aac2982dbb93/django-6.0.1-py3-none-any.whl", hash = "sha256:a92a4ff14f664a896f9849009cb8afaca7abe0d6fc53325f3d1895a15253433d", size = 8338791 }, +] + [[package]] name = "fastapi" version = "0.128.0" @@ -1122,6 +1145,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] +[[package]] +name = "sqlparse" +version = "0.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138 }, +] + [[package]] name = "starlette" version = "0.41.3" @@ -1199,7 +1231,7 @@ wheels = [ [[package]] name = "tusk-drift-python-sdk" -version = "0.1.4" +version = "0.1.8" source = { editable = "." } dependencies = [ { name = "aiofiles" }, @@ -1223,6 +1255,9 @@ dev = [ { name = "ty" }, { name = "uvicorn" }, ] +django = [ + { name = "django" }, +] fastapi = [ { name = "fastapi" }, { name = "starlette" }, @@ -1236,6 +1271,7 @@ flask = [ requires-dist = [ { name = "aiofiles", specifier = ">=23.0.0" }, { name = "aiohttp", specifier = ">=3.9.0" }, + { name = "django", marker = "extra == 'django'", specifier = ">=5.0" }, { name = "fastapi", marker = "extra == 'dev'", specifier = ">=0.115.6" }, { name = "fastapi", marker = "extra == 'fastapi'", specifier = ">=0.115.6" }, { name = "flask", marker = "extra == 'dev'", specifier = ">=3.1.2" }, @@ -1314,6 +1350,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611 }, ] +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521 }, +] + [[package]] name = "urllib3" version = "2.6.2"