diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..5bf500b --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,16 @@ +version: 2 +updates: + # GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + actions: + patterns: + - "*" + # Python + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/release-python.yml b/.github/workflows/release-python.yml new file mode 100644 index 0000000..15086df --- /dev/null +++ b/.github/workflows/release-python.yml @@ -0,0 +1,99 @@ +name: Python Wheels + +on: + push: + branches: ["main"] + tags: + - "**" + pull_request: + workflow_dispatch: + +concurrency: + group: wheels-${{ github.ref }} + cancel-in-progress: true + +defaults: + run: + shell: bash -eux {0} + +jobs: + + build_dist: + name: Build Distribution Files + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: false + + - uses: actions/setup-python@v5 + with: + # Build sdist on lowest supported Python + python-version: '3.9' + + - name: Install build + run: | + python -m pip install build + + - name: build the dist files + run: | + python -m build . + + - name: Upload the dist files + uses: actions/upload-artifact@v4 + with: + name: dist-${{ github.run_id }} + path: ./dist/*.* + + test_dist: + needs: [build_dist] + name: Test Distribution Files + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: false + + - uses: actions/setup-python@v5 + with: + # Build sdist on lowest supported Python + python-version: '3.9' + + - name: Download the dists + uses: actions/download-artifact@v4 + with: + name: dist-${{ github.run_id }} + path: dist/ + + - name: Test the sdist + run: | + cd dist + pip install *.tar.gz + python -c "import django_mongodb_extensions" + pip uninstall -y django-mongodb-extensions + + - name: Test the wheel + run: | + cd dist + pip install *.whl + python -c "import django_mongodb_extensions" + pip uninstall -y django-mongodb-extensions + + publish: + # https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/#publishing-the-distribution-to-pypi + needs: [test_dist] + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + environment: release + permissions: + id-token: write + steps: + - name: Download the dists + uses: actions/download-artifact@v4 + with: + name: dist-${{ github.run_id }} + path: dist/ + - name: Publish distribution 📦 to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml new file mode 100644 index 0000000..583dbca --- /dev/null +++ b/.github/workflows/test-python.yml @@ -0,0 +1,107 @@ +name: Python Tests + +on: + push: + branches: ["main"] + pull_request: + +concurrency: + group: tests-${{ github.ref }} + cancel-in-progress: true + +defaults: + run: + shell: bash -eux {0} + +env: + MIN_PYTHON: "3.9" + MIN_MONGODB: "4.0" + MAX_MONGODB: "8.0" + +jobs: + static: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + fetch-depth: 0 + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + python-version: ${{ matrix.python-version }} + - uses: extractions/setup-just@v3 + - run: just install + - run: just lint + - run: just docs + - run: just doctest + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: ["ubuntu-latest", "macos-latest", "windows-latest"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + fail-fast: false + name: CPython ${{ matrix.python-version }}-${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + fetch-depth: 0 + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + python-version: ${{ matrix.python-version }} + - uses: extractions/setup-just@v3 + - name: Start MongoDB on Linux + if: ${{ startsWith(runner.os, 'Linux') }} + uses: supercharge/mongodb-github-action@1.12.0 + with: + mongodb-version: ${{ env.MAX_MONGODB }} + mongodb-replica-set: test-rs + - name: Start MongoDB on MacOS + if: ${{ startsWith(runner.os, 'macOS') }} + run: | + brew tap mongodb/brew + brew install mongodb/brew/mongodb-community@${MAX_MONGODB} + brew services start mongodb-community@${MAX_MONGODB} + - name: Start MongoDB on Windows + if: ${{ startsWith(runner.os, 'Windows') }} + shell: powershell + run: | + mkdir data + mongod --remove + mongod --install --dbpath=$(pwd)/data --logpath=$PWD/mongo.log + net start MongoDB + - run: just install + - run: just test + + build-min: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + fetch-depth: 0 + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + python-version: ${{ env.MIN_PYTHON }} + - uses: extractions/setup-just@v3 + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + python-version: ${{ env.MIN_PYTHON }} + - uses: extractions/setup-just@v3 + - uses: supercharge/mongodb-github-action@1.12.0 + with: + mongodb-version: ${{ env.MIN_MONGODB }} + mongodb-replica-set: test-rs + - name: Run unit tests with minimum dependency versions + run: | + uv sync --python=${MIN_PYTHON} --resolution=lowest-direct + just test diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml new file mode 100644 index 0000000..0fbdbd6 --- /dev/null +++ b/.github/workflows/zizmor.yml @@ -0,0 +1,32 @@ +name: GitHub Actions Security Analysis with zizmor + +on: + push: + branches: ["main"] + pull_request: + branches: ["**"] + +jobs: + zizmor: + name: zizmor latest via Cargo + runs-on: ubuntu-latest + permissions: + security-events: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Setup Rust + uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: Get zizmor + run: cargo install zizmor + - name: Run zizmor + run: zizmor --format sarif . > results.sarif + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Upload SARIF file + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: results.sarif + category: zizmor diff --git a/django_mongodb_extensions/debug_toolbar/panels/mql/panel.py b/django_mongodb_extensions/debug_toolbar/panels/mql/panel.py index 37ad6ca..a1d8647 100644 --- a/django_mongodb_extensions/debug_toolbar/panels/mql/panel.py +++ b/django_mongodb_extensions/debug_toolbar/panels/mql/panel.py @@ -58,8 +58,6 @@ def disable_instrumentation(self): def generate_stats(self, request, response): self.record_stats( { - "databases": sorted(self._databases.items()), "queries": self._queries, - "sql_time": self._sql_time, } ) diff --git a/django_mongodb_extensions/debug_toolbar/panels/mql/tracking.py b/django_mongodb_extensions/debug_toolbar/panels/mql/tracking.py index 535ce84..31870e9 100644 --- a/django_mongodb_extensions/debug_toolbar/panels/mql/tracking.py +++ b/django_mongodb_extensions/debug_toolbar/panels/mql/tracking.py @@ -34,6 +34,7 @@ def log(self, op, duration, args, kwargs=None): if self.logger: self.logger._queries.append( { + "alias": self.db.alias, "sql": operation, "time": "%.3f" % duration, } diff --git a/django_mongodb_extensions/templates/debug_toolbar/panels/mql.html b/django_mongodb_extensions/templates/debug_toolbar/panels/mql.html index cb896ba..858103c 100644 --- a/django_mongodb_extensions/templates/debug_toolbar/panels/mql.html +++ b/django_mongodb_extensions/templates/debug_toolbar/panels/mql.html @@ -1,124 +1,111 @@ {% load i18n l10n %}
| - | {% trans "Query" %} | -{% trans "Timeline" %} | -{% trans "Time (ms)" %} | -{% trans "Action" %} | -|||
|---|---|---|---|---|---|---|---|
| - | - - | -
- {{ query.sql|safe }}
- {% if query.similar_count %}
-
-
- {% blocktrans with count=query.similar_count %}{{ count }} similar queries.{% endblocktrans %}
-
- {% endif %}
- {% if query.duplicate_count %}
-
-
- {% blocktrans with dupes=query.duplicate_count %}Duplicated {{ dupes }} times.{% endblocktrans %}
-
- {% endif %}
- |
- - - | -- {{ query.duration|floatformat:"2" }} - | -- {% if query.params %} - {% if query.is_select %} - - {% endif %} - {% endif %} - | -||
| - |
-
-
- {% trans "Connection:" %} {{ query.alias }} - {% if query.iso_level %} -{% trans "Isolation level:" %} {{ query.iso_level }} - {% endif %} - {% if query.trans_status %} -{% trans "Transaction status:" %} {{ query.trans_status }} - {% endif %} - {% if query.stacktrace %} -{{ query.stacktrace }}
- {% endif %}
- {% if query.template_info %}
-
{{ query.template_info.name|default:_("(unknown)") }} - {% endif %} - |
- ||||||
| + | {% trans "Query" %} | +{% trans "Time (ms)" %} | +|||||
|---|---|---|---|---|---|---|---|
| + + | ++ + | +
+ {{ query.sql|safe }}
+ {% if query.similar_count %}
+
+
+ {% blocktrans with count=query.similar_count %}{{ count }} similar queries.{% endblocktrans %}
+
+ {% endif %}
+ {% if query.duplicate_count %}
+
+
+ {% blocktrans with dupes=query.duplicate_count %}Duplicated {{ dupes }} times.{% endblocktrans %}
+
+ {% endif %}
+ |
+ {{ query.time|floatformat:"2" }} | +||||
| + |
+
+
+ + {% trans "Connection:" %} {{ query.alias }} + + {% if query.iso_level %} ++ {% trans "Isolation level:" %} {{ query.iso_level }} + + {% endif %} + {% if query.trans_status %} ++ {% trans "Transaction status:" %} {{ query.trans_status }} + + {% endif %} + {% if query.stacktrace %}{{ query.stacktrace }}{% endif %}
+ {% if query.template_info %}
+
+ {{ query.template_info.name|default:_("(unknown)") }} + + {% endif %} + |
+ ||||||
{% trans "No MQL queries were recorded during this request." %}
+{% trans "No MQL queries were recorded during this request." %}
{% endif %} diff --git a/justfile b/justfile deleted file mode 100644 index 789b1ea..0000000 --- a/justfile +++ /dev/null @@ -1,2 +0,0 @@ -default: - echo 'Hello, world!'