From 4e3aeb8f882ea056f96a6a0f059e3089eada7c62 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Thu, 27 Mar 2025 14:31:06 -0400 Subject: [PATCH 1/3] Add `.github` for PyPI releases --- .github/dependabot.yml | 16 ++++ .github/workflows/release-python.yml | 99 +++++++++++++++++++++++++ .github/workflows/test-python.yml | 107 +++++++++++++++++++++++++++ .github/workflows/zizmor.yml | 32 ++++++++ 4 files changed, 254 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/release-python.yml create mode 100644 .github/workflows/test-python.yml create mode 100644 .github/workflows/zizmor.yml 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 From 46a387a01ec43de8b7a4315f9e789c4068217eb4 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Fri, 4 Apr 2025 12:35:29 -0400 Subject: [PATCH 2/3] Remove timeline and add query time to panel --- .../debug_toolbar/panels/mql/panel.py | 2 - .../debug_toolbar/panels/mql/tracking.py | 1 + .../templates/debug_toolbar/panels/mql.html | 223 +++++++++--------- 3 files changed, 106 insertions(+), 120 deletions(-) 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 %} - {% if queries %} - - - - - - - - - - - - - - - - - - - - {% for query in queries %} - - - - - - - - - - - - - {% endfor %} - -
{% 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 %} -
- - - {% if query.starts_trans %} - - {% endif %} - {% if query.ends_trans %} - - {% endif %} - - - {{ query.duration|floatformat:"2" }} - - {% if query.params %} - {% if query.is_select %} -
- {{ query.form.as_div }} - - - {% if query.vendor == 'mysql' %} - - {% endif %} -
- {% 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 %} - - {% for line in query.template_info.context %} - - - - - {% endfor %} -
{{ line.num }}{{ line.content }}
-

{{ query.template_info.name|default:_("(unknown)") }}

- {% endif %} -
-
+ + + + + + + + + + + + + + + {% for query in queries %} + + + + + + + + + + + {% endfor %} + +
{% 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 %} + + {% for line in query.template_info.context %} + + + + + {% endfor %} +
{{ line.num }} + {{ line.content }} +
+

+ {{ query.template_info.name|default:_("(unknown)") }} +

+ {% endif %} +
+
{% else %} -

{% trans "No MQL queries were recorded during this request." %}

+

{% trans "No MQL queries were recorded during this request." %}

{% endif %} From c5d6ddd35b892a8d74181c8f37218eb4d6a5b3e6 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Fri, 4 Apr 2025 12:44:16 -0400 Subject: [PATCH 3/3] Remove justfile --- justfile | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 justfile 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!'