Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions .coveragerc

This file was deleted.

27 changes: 14 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,19 @@ name: Python CI

on:
push:
branches: [master]
branches:
- master
pull_request:
branches:
- "**"
workflow_call:

jobs:
run_tests:
name: Tests
name: ${{ matrix.toxenv }}
runs-on: ${{ matrix.os }}
permissions:
contents: read
strategy:
fail-fast: false
matrix:
Expand All @@ -20,19 +24,18 @@ jobs:

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: setup python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: ${{ matrix.python-version }}

- name: Install pip
run: pip install -r requirements/pip.txt
- name: Setup uv and Python
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
python-version: "${{ matrix.python-version }}"
enable-cache: true

- name: Set env variable
run: export AWS_CONFIG_FILE=/dev/null

- name: Install Dependencies
run: pip install -r requirements/ci.txt
- name: Install CI dependencies
run: uv sync --group ci

- name: Install GNU gettext
run: sudo apt-get install gettext
Expand All @@ -43,9 +46,7 @@ jobs:
node-version-file: ".nvmrc"

- name: Run Tests
env:
TOXENV: ${{ matrix.toxenv }}
run: tox
run: uv run tox -e ${{ matrix.toxenv }}

- name: Run Coverage
if: matrix.python-version == '3.12' && matrix.toxenv=='django42'
Expand Down
30 changes: 0 additions & 30 deletions .github/workflows/pypi-publish.yml

This file was deleted.

82 changes: 82 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: Semantic Release

on:
push:
branches:
- master

jobs:
run_tests:
uses: ./.github/workflows/ci.yml
secrets: inherit
permissions:
contents: read

release:
needs: run_tests
if: github.ref_name == 'master'
runs-on: ubuntu-latest
concurrency:
group: release
cancel-in-progress: false
permissions:
contents: write

steps:
- name: Checkout repo
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ github.ref_name }}
fetch-depth: 0

- name: Reset to pushed commit
run: git reset --hard ${{ github.sha }}

- name: Run python-semantic-release
id: release
uses: python-semantic-release/python-semantic-release@350c48fcb3ffcdfd2e0a235206bc2ecea6b69df0 # v10.5.3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
git_committer_name: "github-actions[bot]"
git_committer_email: "github-actions[bot]@users.noreply.github.com"
changelog: "false"
vcs_release: "false"

- name: Upload dist artifacts
if: steps.release.outputs.released == 'true'
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: dist
path: dist/

- name: Create GitHub Release with Assets
if: steps.release.outputs.released == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: v${{ steps.release.outputs.version }}
RELEASE_NOTES: ${{ steps.release.outputs.release_notes }}
run: |
printf '%s' "$RELEASE_NOTES" > /tmp/release_notes.md
gh release create "$TAG" --verify-tag --title "$TAG" --notes-file /tmp/release_notes.md dist/*

outputs:
released: ${{ steps.release.outputs.released }}
version: ${{ steps.release.outputs.version }}

publish_to_pypi:
needs: release
if: needs.release.outputs.released == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write

steps:
- name: Download dist artifacts
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: dist
path: dist/

- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
7 changes: 5 additions & 2 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ build:
tools:
python: "3.12"

# Optionally install extra requirements required to build your docs
# Install doc dependencies from uv.lock using the doc dependency group
python:
install:
- requirements: requirements/docs.txt
- method: uv
command: sync
groups:
- doc
5 changes: 3 additions & 2 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
include LICENSE
include AUTHORS
include README.rst
include setup.cfg
include openassessment/xblock/static/dist/manifest.json
include openassessment/xblock/static/dist/*.js
include openassessment/xblock/static/dist/*.css
include openassessment/xblock/static/css/*.css
include openassessment/xblock/static/css/lib/backgrid/*.css
include openassessment/xblock/static/js/openassessment*.js
include openassessment/xblock/static/js/lib/backgrid/*.js
include requirements/*.in
recursive-include openassessment/xblock/static/js/src *.js
recursive-include openassessment/templates *.html *.underscore
recursive-include openassessment/locale *.po
recursive-include openassessment/locale *.mo
prune .github
prune htmlcov
exclude .coverage coverage.xml
59 changes: 14 additions & 45 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
.PHONY: help install-python install-js install-test install \
.PHONY: help install-js install \
update-npm-requirements static \
extract_translations compile_translations generate_dummy_translations validate_translations \
detect_changed_source_translations pull_translations push_translations check_translations_up_to_date \
quality test-python render-templates test-js test-js-debug test test-acceptance test-a11y test-sandbox \
compile-requirements install-osx-requirements
requirements compile-requirements upgrade

.DEFAULT_GOAL := help

Expand All @@ -25,52 +25,21 @@ clean: ## remove generated byte code, coverage reports, and build artifacts
# Install commands
##################

install-python: ## Install python dependencies
pip install -r requirements/base.txt --only-binary=lxml

install-js: ## install JavaScript dependencies
npm install

install-test: ## install requirements for tests
pip install -r requirements/test.txt
python setup.py develop --quiet # XBlock plugin (openassessment) has to be installed via entry_points.

install: install-python install-js install-test static ## install all dependencies

COMMON_CONSTRAINTS_TXT=requirements/common_constraints.txt
.PHONY: $(COMMON_CONSTRAINTS_TXT)
$(COMMON_CONSTRAINTS_TXT):
wget -O "$(@)" https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt || touch "$(@)"
echo "$(COMMON_CONSTRAINTS_TEMP_COMMENT)" | cat - $(@) > temp && mv temp $(@)

compile-requirements: export CUSTOM_COMPILE_COMMAND=make upgrade
compile-requirements: $(COMMON_CONSTRAINTS_TXT) ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in
# global common_constraints has this pin.
sed 's/django-simple-history==3.0.0//g' requirements/common_constraints.txt > requirements/common_constraints.tmp
mv requirements/common_constraints.tmp requirements/common_constraints.txt
pip install -qr requirements/pip-tools.txt
pip-compile ${COMPILE_OPTS} --allow-unsafe -o requirements/pip.txt requirements/pip.in
pip-compile ${COMPILE_OPTS} -o requirements/pip-tools.txt requirements/pip-tools.in
pip install -qr requirements/pip.txt
pip install -qr requirements/pip-tools.txt
pip-compile ${COMPILE_OPTS} --allow-unsafe -o requirements/base.txt requirements/base.in
pip-compile ${COMPILE_OPTS} -o requirements/test.txt requirements/test.in
pip-compile ${COMPILE_OPTS} --allow-unsafe -o requirements/quality.txt requirements/quality.in
pip-compile ${COMPILE_OPTS} -o requirements/test-acceptance.txt requirements/test-acceptance.in
pip-compile ${COMPILE_OPTS} -o requirements/tox.txt requirements/tox.in
pip-compile ${COMPILE_OPTS} --allow-unsafe -o requirements/ci.txt requirements/ci.in
pip-compile ${COMPILE_OPTS} -o requirements/docs.txt requirements/docs.in
# Delete django pin from test requirements to avoid tox version collision
sed -i.tmp '/^[d|D]jango==/d' requirements/test.txt
# Delete extra metadata that causes build to fail
sed -i.tmp '/^--index-url/d' requirements/*.txt
sed -i.tmp '/^--extra-index-url/d' requirements/*.txt
sed -i.tmp '/^--trusted-host/d' requirements/*.txt
# Delete temporary files
rm requirements/*.txt.tmp

upgrade: ## update the pip requirements files to use the latest releases satisfying our constraints
$(MAKE) compile-requirements COMPILE_OPTS="--upgrade"
install: install-js static ## install all dependencies
uv sync --group dev

requirements: ## sync the Python dev environment
uv sync --group dev

compile-requirements: ## regenerate uv.lock from pyproject.toml
uv lock

upgrade: ## upgrade all dependencies to the latest allowed versions
uv run --with edx-lint edx_lint write_uv_constraints pyproject.toml
uv lock --upgrade

##############################
# Generate js/css output files
Expand Down
25 changes: 18 additions & 7 deletions karma.conf.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
// Karma configuration
const path = require('path');
const webpackConfig = require('./webpack.prod.config.js');

// When uv installs ora2 as an editable package, it creates src/openassessment/ and
// symlinks openassessment/ -> src/openassessment/. This means ../../../ traversal from
// openassessment/xblock/static goes to src/ rather than the project root, so karma can't
// find node_modules/. Use process.cwd() (guaranteed to be project root when `npm test` runs)
// to compute absolute paths that bypass the symlink.
const projectRoot = process.cwd();

module.exports = function(config) {
config.set({

Expand Down Expand Up @@ -33,17 +41,20 @@ module.exports = function(config) {
'js/lib/jquery.timepicker.min.js',
'js/lib/jquery-ui-1.10.4.min.js',
'js/lib/underscore-min.js',
'../../../node_modules/@babel/polyfill/dist/polyfill.js',
'../../../node_modules/backbone/backbone.js',
'../../../node_modules/backgrid/lib/backgrid.min.js',
'../../../node_modules/requirejs/require.js',
'../../../require-config.js',
// Use absolute paths from projectRoot for files outside openassessment/ to avoid
// symlink traversal: if openassessment/ -> src/openassessment/, then ../../../ from
// basePath would reach src/ instead of the project root, missing these files.
path.resolve(projectRoot, 'node_modules/@babel/polyfill/dist/polyfill.js'),
path.resolve(projectRoot, 'node_modules/backbone/backbone.js'),
path.resolve(projectRoot, 'node_modules/backgrid/lib/backgrid.min.js'),
path.resolve(projectRoot, 'node_modules/requirejs/require.js'),
path.resolve(projectRoot, 'require-config.js'),
{
pattern: '../../../node_modules/moment-timezone/builds/moment-timezone-with-data.min.js',
pattern: path.resolve(projectRoot, 'node_modules/moment-timezone/builds/moment-timezone-with-data.min.js'),
served: true, included: false
},
{
pattern: '../../../node_modules/moment/min/moment-with-locales.min.js',
pattern: path.resolve(projectRoot, 'node_modules/moment/min/moment-with-locales.min.js'),
served: true, included: false
},
//
Expand Down
7 changes: 6 additions & 1 deletion openassessment/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,9 @@
Initialization Information for Open Assessment Module
"""

__version__ = '7.1.1'
from importlib.metadata import PackageNotFoundError, version

try:
__version__ = version("ora2")
except PackageNotFoundError: # pragma: no cover
__version__ = "unknown"
4 changes: 2 additions & 2 deletions openassessment/xblock/leaderboard_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ def _get_file_download_url(self, file_key):
except FileUploadError as exc:
logger.exception(
'FileUploadError: URL retrieval failed for key %s with error %s',
file_key=file_key,
error=exc
file_key,
exc,
)
file_download_url = ''
return file_download_url
Loading
Loading