diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3075df29da..cb3b69f3bb 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -64,6 +64,10 @@ updates: update-types: ["version-update:semver-patch"] # ignore patch versions for all JavaScript dependencies - dependency-name: react-redux update-types: ["version-update:semver-major"] # ignore major for react-redux + - dependency-name: eslint + update-types: ["version-update:semver-major"] # keep eslint 8.56.0 for now + - dependency-name: jquery + update-types: [ "version-update:semver-major" ] # keep jQuery 3.x until Bootstrap is upgraded groups: react: patterns: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b8b6ebbbb..39cf154d34 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,8 @@ on: push: branches: - main + tags: + - '*' pull_request: # run CI only if files in these whitelisted paths are changed paths: @@ -31,42 +33,42 @@ permissions: {} jobs: - build-wheel: - name: Build python wheel + build: + name: Build python package runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false fetch-depth: 0 # important for setuptools_scm - # build the webpack bundle - - uses: actions/setup-node@v6 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 22.22 - cache: npm - - run: npm ci && npm run build:dist + cache: ${{ startsWith(github.ref, 'refs/tags/') && '' || 'npm' }} # disable cache on tags + - name: build front end + run: npm ci && npm run build:dist - name: Build and inspect package - uses: hynek/build-and-inspect-python-package@efb823f52190ad02594531168b7a2d5790e66516 # v2.14.0 + uses: hynek/build-and-inspect-python-package@d44ca7d91762de7a7d5436ddae667c6da6d1c3df # v2.18.0 test: name: "Test (Python: ${{ matrix.python-version }}, DB: ${{ matrix.db-backend }})" - needs: build-wheel + needs: build runs-on: ubuntu-24.04 strategy: matrix: - python-version: ['3.10', '3.13'] + python-version: ['3.10', '3.14'] db-backend: [mysql, postgres] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v6 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ matrix.python-version }} cache: pip - name: Download wheel - uses: actions/download-artifact@v6 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: Packages path: dist @@ -94,7 +96,7 @@ jobs: - name: Run package status tests first run: | pytest rdmo/core/tests/test_package_status.py --nomigrations --verbose - if: matrix.python-version == '3.13' && matrix.db-backend == 'postgres' + if: matrix.python-version == '3.14' && matrix.db-backend == 'postgres' - name: Run Tests run: | pytest -p randomly -p no:cacheprovider --cov --reuse-db --numprocesses=auto --dist=loadscope @@ -110,23 +112,23 @@ jobs: test-e2e: name: "End-to-end Test (Python: ${{ matrix.python-version }}, DB: ${{ matrix.db-backend }})" - needs: build-wheel + needs: build runs-on: ubuntu-24.04 strategy: matrix: - python-version: ['3.13'] + python-version: ['3.14'] db-backend: [postgres] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v6 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ matrix.python-version }} cache: pip - - name: Download wheel - uses: actions/download-artifact@v6 + - name: Download package + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: Packages path: dist @@ -154,7 +156,7 @@ jobs: env: DJANGO_DEBUG: True GITHUB_DB_BACKEND: ${{ matrix.db-backend }} - - uses: actions/upload-artifact@v5 + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: screenshots path: screenshots/**/*.png @@ -163,7 +165,7 @@ jobs: name: Indicate completion to coveralls needs: test if: ${{ always() }} - runs-on: ubuntu-24.04 + runs-on: ubuntu-slim steps: - name: Run Coveralls finish uses: coverallsapp/github-action@5cbfd81b66ca5d10c19b062c04de0199c215fb6e # v2.3.7 @@ -179,30 +181,30 @@ jobs: matrix: os: [ubuntu-latest, windows-latest, macos-latest] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - - uses: actions/setup-python@v6 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: - python-version: "3.13" + python-version: "3.14" cache: pip - run: python -Im pip install --editable .[dev] - run: python -Ic 'import rdmo; print(rdmo.__version__)' dependencies: name: Test installation of all dependencies - needs: build-wheel + needs: build runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - - uses: actions/setup-python@v6 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: - python-version: "3.13" + python-version: "3.14" cache: pip - - name: Download wheel - uses: actions/download-artifact@v6 + - name: Download package + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: Packages path: dist @@ -213,7 +215,7 @@ jobs: run: python -m pip install --no-compile "$(ls dist/*.whl)[all]" - name: Verify installed packages have compatible dependencies run: python -m pip check - - uses: actions/setup-node@v6 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 22 cache: npm @@ -244,16 +246,38 @@ jobs: echo -e "\`\`\`\n" } >> $GITHUB_STEP_SUMMARY + pypi-release: + name: Publish distribution to PyPI + if: startsWith(github.ref, 'refs/tags/') + needs: + - build + - test + - test-e2e + runs-on: ubuntu-24.04 + environment: + name: pypi + url: https://pypi.org/p/rdmo + permissions: + id-token: write + steps: + - name: Download package + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: Packages + path: dist + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0 + required-checks-pass: if: always() needs: - - build-wheel + - build - test - coveralls - test-e2e - dev-setup - dependencies - runs-on: ubuntu-24.04 + runs-on: ubuntu-slim steps: - uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2 with: diff --git a/.github/zizmor.yml b/.github/zizmor.yml new file mode 100644 index 0000000000..b58972fc33 --- /dev/null +++ b/.github/zizmor.yml @@ -0,0 +1,4 @@ +rules: + cache-poisoning: + ignore: + - ci.yml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index de0884ed08..6a59bb10f5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,8 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks +# Run manual autoupdate with: +# pre-commit autoupdate --freeze +# pre-commit run --all-files # do not touch the migration files at all: these are auto-generated by Django exclude: \/migrations\/ @@ -9,7 +12,7 @@ repos: hooks: - id: check-hooks-apply - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v6.0.0 + rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0 hooks: - id: check-ast - id: check-json @@ -22,12 +25,12 @@ repos: exclude: \.dot$ - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.14.7 + rev: 0671d8ab202c4ac093b78433ae5baf74f3fc7246 # frozen: v0.15.15 hooks: - id: ruff-check args: [--fix, --exit-non-zero-on-fix] - repo: https://github.com/pre-commit/mirrors-eslint - rev: v9.39.1 + rev: 61e8b06e669ce52c94348373faab214beaa8cd4c # frozen: v10.4.1 hooks: - id: eslint args: [--fix, --color] @@ -36,7 +39,7 @@ repos: - eslint-plugin-react@7.37.0 - react@18.3.1 - repo: https://github.com/crate-ci/typos - rev: v1.40.0 + rev: f8a58b6b53f2279f71eb605f03a4ae4d10608f45 # frozen: v1.47.0 hooks: - id: typos exclude: | @@ -50,12 +53,9 @@ repos: testing/.*.xml )$ - repo: https://github.com/zizmorcore/zizmor-pre-commit - rev: v1.18.0 + rev: 9257c6050c0261b8c57e712f632dc4a8010109a9 # frozen: v1.25.2 hooks: - id: zizmor args: [--fix, --offline] ci: - autoupdate_schedule: monthly autofix_prs: false - autoupdate_branch: 'dependency-updates' - autoupdate_commit_msg: 'build(pre-commit): pre-commit autoupdate by ci' diff --git a/CHANGELOG.md b/CHANGELOG.md index e6778018f7..987f15e604 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog 📔 +## [RDMO 2.5.0](https://github.com/rdmorganiser/rdmo/releases/tag/2.5.0) + +**Milestone**: [2.5.0](https://github.com/rdmorganiser/rdmo/milestone/26) + +**Commit history**: [2.4.0...2.5.0](https://github.com/rdmorganiser/rdmo/compare/2.4.0...2.5.0) + ## [RDMO 2.4.4](https://github.com/rdmorganiser/rdmo/releases/tag/2.4.4) (March 26, 2026) ### Bug fixes 🐛 diff --git a/README.md b/README.md index 4084440ed4..a613cb7ee5 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,8 @@ RDMO is a tool to support the systematic planning, organisation and implementati
{keyName}
Text?
-Lorem ipsum dolor sit amet + Lorem ipsum dolor sit amet
Textarea?
-Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet.
Yes or no?
-Yes + Yes
Radio buttons?
-Text: Lorem ipsum + Text: Lorem ipsum
Select drop-down?
-One + One
Select drop-down (free)?
Range slider?
-37 + 37
File?
@@ -45,66 +45,66 @@Date picker?
-Jan. 1, 2018 + Jan. 1, 2018
Text?
Textarea?
Yes or no?
Radio buttons?
Select drop-down?
Range slider?
Date picker?
Checkbox?
Text?
-Lorem ipsum dolor sit amet + Lorem ipsum dolor sit amet
Textarea?
-Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet.
Yes or no?
-Yes + Yes
Radio buttons?
-Text: Lorem ipsum + Text: Lorem ipsum
Select drop-down?
-One + One
Select drop-down (free)?
Range slider?
-37 + 37
Date picker?
-Jan. 1, 2018 + Jan. 1, 2018
File?
@@ -194,80 +194,80 @@
Text?
Textarea?
Yes or no?
Radio buttons?
Select drop-down?
Select drop-down (free)?
Range slider?
Date picker?
File?
@@ -282,96 +282,96 @@Checkbox?
Text?
Set "First": -Lorem ipsum dolor sit amet, consetetur sadipscing elitr + Lorem ipsum dolor sit amet, consetetur sadipscing elitr
Set "Second": -Lorem ipsum dolor sit amet, consetetur sadipscing elitr + Lorem ipsum dolor sit amet, consetetur sadipscing elitr
Textarea?
Set "First": -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet.
Set "Second": -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet.
Yes or no?
Set "First": -Yes + Yes
Set "Second": -No + No
Radio buttons?
Set "First": -One + One
Set "Second": -Two + Two
Select drop-down?
Set "First": -One + One
Set "Second": -Two + Two
Select drop-down (free)?
Range slider?
Set "First": -1 + 1
Set "Second": -2 + 2
Date picker?
Set "First": -Jan. 7, 2018 + Jan. 7, 2018
Set "Second": -Feb. 7, 2018 + Feb. 7, 2018
File?
Text?
Set "First": -Lorem ipsum dolor sit amet, consetetur sadipscing elitr + Lorem ipsum dolor sit amet, consetetur sadipscing elitr
Set "Second": -Lorem ipsum dolor sit amet, consetetur sadipscing elitr + Lorem ipsum dolor sit amet, consetetur sadipscing elitr
Textarea?
Set "First": -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet.
Set "Second": -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet.
Yes or no?
@@ -379,13 +379,13 @@
@@ -393,13 +393,13 @@
Radio buttons?
@@ -408,13 +408,13 @@@@ -422,13 +422,13 @@
Select drop-down?
@@ -437,15 +437,15 @@Set "Second": -Three + Three
Select drop-down (free)?
Range slider?
@@ -454,15 +454,15 @@Set "Second": -86 + 86
Date picker?
@@ -470,10 +470,10 @@
@@ -481,10 +481,10 @@
File?
@@ -494,37 +494,37 @@Set "Second": -One + One
Text
-test + test
Option
-One + One
text_contains?
-test + test
text empty?
text_equal?
-test + test
text_greater_than?
@@ -537,7 +537,7 @@text_not_empty?
-test + test
text_not_equal?
@@ -546,12 +546,12 @@option_equal?
-One + One
option_not_empty?
-One + One
option_not_equal?
@@ -594,20 +594,20 @@A?
Set "First", Block #1: -a0 + a0
Set "First", Block #2: -a1 + a1
B?
Set "First", Block #1: -b1 + b1
Set "First", Block #2: -b1 + b1
C?
@@ -615,10 +615,10 @@
@@ -626,40 +626,40 @@
Y?
Set "First", Block #1, Set #1: -Three + Three
Set "First", Block #2, Set #1: -Three + Three
Set "Second", Block #1, Set #1: -Three + Three
Set "Second", Block #2, Set #1: -Three + Three
Set "Second", Block #3, Set #1: -One + One
Set "Second", Block #3, Set #2: -Two + Two
Set "Second", Block #3, Set #3: -Three + Three
Question