diff --git a/ddtrace/appsec/_exploit_prevention/__init__.py b/ddtrace/appsec/_exploit_prevention/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/aiohttp/__init__.py b/ddtrace/contrib/internal/aiohttp/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/asgi/__init__.py b/ddtrace/contrib/internal/asgi/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/botocore/services/__init__.py b/ddtrace/contrib/internal/botocore/services/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/bottle/__init__.py b/ddtrace/contrib/internal/bottle/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/celery/__init__.py b/ddtrace/contrib/internal/celery/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/cherrypy/__init__.py b/ddtrace/contrib/internal/cherrypy/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/falcon/__init__.py b/ddtrace/contrib/internal/falcon/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/flask_cache/__init__.py b/ddtrace/contrib/internal/flask_cache/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/pylibmc/__init__.py b/ddtrace/contrib/internal/pylibmc/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/pyramid/__init__.py b/ddtrace/contrib/internal/pyramid/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/requests/__init__.py b/ddtrace/contrib/internal/requests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/sqlalchemy/__init__.py b/ddtrace/contrib/internal/sqlalchemy/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/tornado/__init__.py b/ddtrace/contrib/internal/tornado/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/valkey/__init__.py b/ddtrace/contrib/internal/valkey/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/internal/wsgi/__init__.py b/ddtrace/contrib/internal/wsgi/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/internal/appsec/__init__.py b/ddtrace/internal/appsec/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/internal/ci_visibility/api/__init__.py b/ddtrace/internal/ci_visibility/api/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/internal/datadog/profiling/ddup/test/__init__.py b/ddtrace/internal/datadog/profiling/ddup/test/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/internal/dist_computing/__init__.py b/ddtrace/internal/dist_computing/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/internal/evp_proxy/__init__.py b/ddtrace/internal/evp_proxy/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/internal/iast/__init__.py b/ddtrace/internal/iast/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/internal/opentelemetry/__init__.py b/ddtrace/internal/opentelemetry/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/internal/test_visibility/__init__.py b/ddtrace/internal/test_visibility/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/llmobs/_evaluators/__init__.py b/ddtrace/llmobs/_evaluators/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/llmobs/_evaluators/ragas/__init__.py b/ddtrace/llmobs/_evaluators/ragas/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/scripts/check-for-namespace-packages.sh b/scripts/check-for-namespace-packages.sh new file mode 100755 index 00000000000..d5293b43811 --- /dev/null +++ b/scripts/check-for-namespace-packages.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -euo pipefail + +# TODO: Can we also check tests/? some folders in there require missing __init__.py +ROOTS=("ddtrace") +FAIL=0 + +echo "Checking for accidental namespace packages..." + +for ROOT in "${ROOTS[@]}"; do + echo "Scanning '$ROOT'..." + + # Only check roots that actually exist (CI safety) + if [[ ! -d "$ROOT" ]]; then + echo " (skipped: directory does not exist)" + continue + fi + + # Walk all directories under the root + while IFS= read -r dir; do + # Skip __pycache__ + [[ "$dir" == *"__pycache__"* ]] && continue + + # Directory contains Python or Cython files? + if compgen -G "$dir/*.py" >/dev/null || compgen -G "$dir/*.pyx" >/dev/null; then + + # And it must contain __init__.py + if [[ ! -f "$dir/__init__.py" ]]; then + echo "❌ Missing __init__.py in: $dir" + FAIL=1 + fi + fi + + done < <(find "$ROOT" -type d) +done + +if [[ "$FAIL" -eq 1 ]]; then + echo + echo "❌ ERROR: Missing __init__.py detected in source or test packages." + echo " Please add empty __init__.py files to the directories listed above." + exit 1 +else + echo "✅ All Python package directories contain __init__.py" +fi diff --git a/scripts/gen_gitlab_config.py b/scripts/gen_gitlab_config.py index 3f018b687e8..c49cf7f5878 100644 --- a/scripts/gen_gitlab_config.py +++ b/scripts/gen_gitlab_config.py @@ -271,6 +271,11 @@ def check(name: str, command: str, paths: t.Set[str]) -> None: command="scripts/check-dependency-bounds", paths={"pyproject.toml"}, ) + check( + name="Check for namespace packages", + command="scripts/check-for-namespace-packages.sh", + paths={"*"}, + ) if not checks: return