diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index ca64a6a500..0000000000 --- a/.coveragerc +++ /dev/null @@ -1,17 +0,0 @@ -[run] -branch = True -data_file = .coverage -source=enterprise -omit = - enterprise/settings/* - enterprise/conf/* - consent/settings/* - consent/conf/* - */mocks.py - */urls.py - */migrations/* - */admin.py - */static/* - */templates/* - */tests/* - test_* diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ef9e04a890..a9380e329c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,16 +10,9 @@ - It may or may not make a migration depending on exactly what you modified, but it should still be run. - This should be run from either a venv with all the lms/edx-enterprise requirements installed or if you checked out edx-enterprise into the src directory used by lms, you can run this command through an lms shell. - It would be `./manage.py lms makemigrations` in the shell. -- [ ] [Version](https://github.com/openedx/edx-enterprise/blob/master/enterprise/__init__.py) bumped -- [ ] [Changelog](https://github.com/openedx/edx-enterprise/blob/master/CHANGELOG.rst) record added - [ ] Translations updated (see docs/internationalization.rst but also this isn't blocking for merge atm) **Post merge:** -- [ ] Tag pushed and a new [version](https://github.com/openedx/edx-enterprise/releases) released - - *Note*: Assets will be added automatically. You just need to provide a tag (should match your version number) and title and description. -- [ ] After versioned build finishes in [GitHub Actions](https://github.com/openedx/edx-enterprise/actions), verify version has been pushed to [PyPI](https://pypi.org/project/edx-enterprise/) - - Each step in the release build has a condition flag that checks if the rest of the steps are done and if so will deploy to PyPi. - (so basically once your build finishes, after maybe a minute you should see the new version in PyPi automatically (on refresh)) - [ ] PR created in [edx-platform](https://github.com/openedx/edx-platform) to upgrade dependencies (including edx-enterprise) - Trigger the '[Upgrade one Python dependency](https://github.com/openedx/edx-platform/actions/workflows/upgrade-one-python-dependency.yml)' action against master in edx-platform with new version number to generate version bump PR - This **must** be done after the version is visible in PyPi as `make upgrade` in edx-platform will look for the latest version in PyPi. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d34738f15f..8ba37c55f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,7 @@ on: push: branches: [master] pull_request: + workflow_call: concurrency: group: ci-${{ github.event.pull_request.number || github.ref }} @@ -21,19 +22,20 @@ jobs: RUNJSHINT: true steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - name: Setup Nodejs uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 with: node-version-file: '.nvmrc' - - run: pip install -r requirements/ci.txt + - name: Install uv + uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 + with: + enable-cache: true + python-version: ${{ matrix.python-version }} + - run: uv sync --group ci - name: Run tox env: TOXENV: ${{ matrix.toxenv }} - run: tox + run: uv run tox - name: Run code coverage if: matrix.python-version == '3.12' && matrix.toxenv == 'django52' # Only run this once as part of tests uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1 diff --git a/.github/workflows/mysql8-migrations.yml b/.github/workflows/mysql8-migrations.yml index 81466262fe..56472c98ab 100644 --- a/.github/workflows/mysql8-migrations.yml +++ b/.github/workflows/mysql8-migrations.yml @@ -33,17 +33,10 @@ jobs: run: | sudo apt-get update sudo apt-get install -y libxmlsec1-dev - - name: Get pip cache dir - id: pip-cache-dir - run: | - echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT - - name: Cache pip dependencies - id: cache-dependencies - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + - name: Install uv + uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 with: - path: ${{ steps.pip-cache-dir.outputs.dir }} - key: ${{ runner.os }}-pip-${{ hashFiles('requirements/pip_tools.txt') }} - restore-keys: ${{ runner.os }}-pip- + enable-cache: true - name: Ubuntu and sql Versions run: | @@ -51,13 +44,7 @@ jobs: mysql -V - name: Install Python dependencies run: | - pip install -qr requirements/dev.txt --exists-action w - pip-sync requirements/test-master.txt requirements/dev.txt requirements/private.* requirements/test.txt - pip uninstall -y mysqlclient - pip install --no-binary mysqlclient mysqlclient - pip uninstall -y xmlsec - pip install --no-binary xmlsec xmlsec - pip install backports.zoneinfo + uv sync --group dev --no-binary-package mysqlclient --no-binary-package xmlsec - name: Initiate Services run: | sudo /etc/init.d/mysql start @@ -78,5 +65,5 @@ jobs: run: | echo "CREATE DATABASE IF NOT EXISTS enterprise;" | sudo mysql -u root echo "Running the migrations." - python manage.py migrate --settings=enterprise.settings.test + uv run python manage.py migrate --settings=enterprise.settings.test echo "use mysql; select * from user;" | sudo mysql -u root diff --git a/.github/workflows/postgresql-migrations.yml b/.github/workflows/postgresql-migrations.yml index 4af11e7bca..4612d8b2c2 100644 --- a/.github/workflows/postgresql-migrations.yml +++ b/.github/workflows/postgresql-migrations.yml @@ -42,11 +42,15 @@ jobs: run: | sudo apt-get update sudo apt-get install -y libxmlsec1-dev + + - name: Install uv + uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 + with: + enable-cache: true + - name: Install Python dependencies run: | - pip3 install --upgrade pip - pip3 install -r requirements/dev.txt - pip3 install psycopg2-binary + uv sync --group dev --group postgresql - name: Run migrations env: @@ -58,5 +62,5 @@ jobs: DB_PORT: 5432 run: | echo "Running the migrations." - python3 manage.py migrate --settings=enterprise.settings.test + uv run python manage.py migrate --settings=enterprise.settings.test diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index 25d178b372..0000000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Publish edx/edx-enterprise to PyPI - -on: - release: - types: [published] - branches: [master] - -jobs: - build-and-publish: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - name: Setup Nodejs Env - run: echo "NODE_VER=`cat .nvmrc`" >> $GITHUB_ENV - - name: setup python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: 3.12 - - name: Setup Node.js - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 - with: - node-version: ${{ env.NODE_VER }} - - name: Install gettext - run: sudo apt-get update && sudo apt-get install -y gettext - - name: Install requirements - run: make requirements - - name: Pull translations - run: make pull_translations - - name: Build package - run: python setup.py sdist bdist_wheel - - name: Publish to PyPi - uses: pypa/gh-action-pypi-publish@release/v1 - with: - user: __token__ - password: ${{ secrets.PYPI_UPLOAD_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..fc9d62dd4d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,117 @@ +name: Semantic Release + +on: + push: + branches: [master] + +jobs: + # The same aggregate a pull request has to pass, so the release runs exactly + # the checks that were required to merge -- and picks up any package added to + # ci.yml later without needing a change here. + run_ci: + uses: ./.github/workflows/ci.yml + + release: + # Every package this workflow publishes has to build before we tag + # anything. The GitHub release and the PyPI uploads cannot be taken back, + # so a package that only fails to build in its publish job would leave the + # release half-finished. + needs: [run_ci] + runs-on: ubuntu-latest + if: github.ref_name == 'master' + concurrency: + group: ${{ github.workflow }}-release-${{ github.ref_name }} + cancel-in-progress: false + + permissions: + contents: write + + steps: + # Note: We checkout the repository at the branch that triggered the workflow. + # Python Semantic Release will automatically convert shallow clones to full clones + # if needed to ensure proper history evaluation. However, we forcefully reset the + # branch to the workflow sha because it is possible that the branch was updated + # while the workflow was running, which prevents accidentally releasing un-evaluated + # changes. + - name: Setup | Checkout Repository on Release Branch + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + ref: ${{ github.ref_name }} + + - name: Setup | Force release branch to be at workflow sha + run: | + git reset --hard ${{ github.sha }} + + - name: Action | Semantic Version Release + id: release + # Adjust tag with desired version if applicable. + uses: python-semantic-release/python-semantic-release@b700dbeb1f431a0fcc30a79f3f0869407fe07278 # v10.7.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + git_committer_name: "github-actions" + git_committer_email: "actions@users.noreply.github.com" + changelog: "false" + # Commit, tag, push and build, but don't create the GitHub release. + # We create it ourselves in the next step so that the distributions + # are attached before the release is published. See that step for why. + vcs_release: "false" + + # This repo has immutable releases enabled, which freezes a release's + # assets the moment it is published, so assets cannot be attached + # afterwards. Everything we want on the release has to be built by now + # and passed to this one command, which creates the release as a draft, + # uploads the assets, and only then publishes it: + # https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/immutable-releases + - name: Publish | Create GitHub Release with Assets + if: steps.release.outputs.released == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Reuse the release notes python-semantic-release generated for us. + RELEASE_NOTES: ${{ steps.release.outputs.release_notes }} + TAG: ${{ steps.release.outputs.tag }} + run: | + # Output the release notes to a file + printf '%s' "$RELEASE_NOTES" > "$RUNNER_TEMP/release_notes.md" + # Creates the release as a draft, uploads the assets, and then + # publishes it -- all within this one command. + gh release create "$TAG" \ + --verify-tag \ + --title "$TAG" \ + --notes-file "$RUNNER_TEMP/release_notes.md" \ + dist/* + + - name: Upload | Distribution Artifacts + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 + if: steps.release.outputs.released == 'true' + with: + name: distribution-artifacts + path: dist + if-no-files-found: error + + outputs: + released: ${{ steps.release.outputs.released || 'false' }} + version: ${{ steps.release.outputs.version }} + + publish_to_pypi: + # 1. Separate out the publish step from the github release step to run each step at + # the least amount of token privilege + # 2. Also, publishing can fail, and its better to have a separate job if you need to retry + # and it won't require reversing the release. + runs-on: ubuntu-latest + needs: release + if: github.ref_name == 'master' && needs.release.outputs.released == 'true' + + permissions: + contents: read + id-token: write + + steps: + - name: Setup | Download Build Artifacts + uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 + id: artifact-download + with: + name: distribution-artifacts + path: dist + + - name: Publish to PyPi + uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 diff --git a/.gitignore b/.gitignore index 046f4fdcf2..37c352d9bc 100644 --- a/.gitignore +++ b/.gitignore @@ -96,6 +96,7 @@ enterprise/static/enterprise/bundles/*.js # Virtual environments venv/ +.venv/ # pyenv .python-version diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 164caa3419..e50c81f558 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -6,9 +6,9 @@ version: 2 build: - os: "ubuntu-lts-latest" - tools: - python: "3.12" + os: ubuntu-26.04 + tools: + python: "3.12" # Build documentation in the docs/ directory with Sphinx sphinx: @@ -20,7 +20,10 @@ formats: - pdf - epub -# Optionally set the version of Python and requirements required to build your docs +# Install dependencies via uv, using the "doc" dependency group from pyproject.toml python: install: - - requirements: requirements/doc.txt + - method: uv + command: sync + groups: + - doc diff --git a/Dockerfile b/Dockerfile index 84bafbedbf..20bc667706 100644 --- a/Dockerfile +++ b/Dockerfile @@ -63,14 +63,19 @@ WORKDIR /edx/app/edx-enterprise RUN python3.12 -m venv $VIRTUAL_ENV -# Copy the requirements explicitly even though we copy everything below +# uv installs into $UV_PROJECT_ENVIRONMENT instead of its default .venv, so it +# reuses the venv created above (kept on PATH by the ENV lines further up). +ENV UV_PROJECT_ENVIRONMENT="${VIRTUAL_ENV}" + +# Copy the dependency manifests explicitly even though we copy everything below # this prevents the image cache from busting unless the dependencies have changed. -COPY requirements/ /edx/app/edx-enterprise/requirements/ +COPY pyproject.toml uv.lock /edx/app/edx-enterprise/ COPY package.json /edx/app/edx-enterprise/package.json COPY package-lock.json /edx/app/edx-enterprise/package-lock.json # Fetch and install dependencies. -RUN pip install -r requirements/dev.txt +RUN pip install uv +RUN uv sync --group dev --frozen RUN pip install nodeenv # Set up a Node environment and install Node requirements. diff --git a/MANIFEST.in b/MANIFEST.in index 6342537e40..589ab8a79c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,11 +1,9 @@ include AUTHORS -include CHANGELOG.rst include CONTRIBUTING.rst include LICENSE.txt include README.rst -recursive-include enterprise *.html *.png *.gif *js *.css *jpg *jpeg *svg *py *.txt *.po *.mo -recursive-include enterprise_learner_portal *.html *.png *.gif *js *.css *jpg *jpeg *svg *py *.txt -recursive-include integrated_channels *.html *.png *.gif *js *.css *jpg *jpeg *svg *py *.txt -recursive-include consent *.html *.png *.gif *js *.css *jpg *jpeg *svg *py *.txt -recursive-include requirements *.txt *.in -include requirements/constraints.txt +recursive-include src/enterprise *.html *.png *.gif *js *.css *jpg *jpeg *svg *py *.txt *.po *.mo +exclude src/enterprise/locale +recursive-include src/enterprise_learner_portal *.html *.png *.gif *js *.css *jpg *jpeg *svg *py *.txt +recursive-include src/integrated_channels *.html *.png *.gif *js *.css *jpg *jpeg *svg *py *.txt +recursive-include src/consent *.html *.png *.gif *js *.css *jpg *jpeg *svg *py *.txt diff --git a/Makefile b/Makefile index aa8f33ccdd..31a20dd8ea 100644 --- a/Makefile +++ b/Makefile @@ -32,8 +32,8 @@ clean: ## remove generated byte code, coverage reports, and build artifacts rm -fr *.egg-info clean.static: ## remove all ignored generated static files - rm -rf enterprise/assets/ - rm -rf enterprise/static/enterprise/bundles/*.js + rm -rf src/enterprise/assets/ + rm -rf src/enterprise/static/enterprise/bundles/*.js static: ## render all static assets for production $(NODE_BIN)/webpack --config webpack.config.js --display-error-details --progress --optimize-minimize @@ -51,7 +51,7 @@ compile_translations: ## compile translation files, outputting .po files for eac ./manage.py compilemessages dummy_translations: ## generate dummy translation (.po) files - cd enterprise && i18n_tool dummy + cd src/enterprise && i18n_tool dummy extract_translations: ## extract strings to be translated, outputting .mo files rm -rf docs/_build @@ -60,11 +60,11 @@ extract_translations: ## extract strings to be translated, outputting .mo files fake_translations: extract_translations dummy_translations compile_translations ## generate and compile dummy translation files pull_translations: ## Pull translations from openedx-translations via Atlas - rm -rf enterprise/conf/locale consent/conf/locale - mkdir -p enterprise/conf/locale consent/conf/locale + rm -rf src/enterprise/conf/locale src/consent/conf/locale + mkdir -p src/enterprise/conf/locale src/consent/conf/locale atlas pull $(ATLAS_OPTIONS) \ - translations/edx-enterprise/enterprise/conf/locale:enterprise/conf/locale \ - translations/edx-enterprise/consent/conf/locale:consent/conf/locale \ + translations/edx-enterprise/enterprise/conf/locale:src/enterprise/conf/locale \ + translations/edx-enterprise/consent/conf/locale:src/consent/conf/locale \ $(ATLAS_EXTRA_SOURCES) python manage.py compilemessages @@ -79,59 +79,35 @@ docs: ## generate Sphinx HTML documentation, including API docs tox -e docs $(BROWSER) docs/_build/html/index.html -# Define PIP_COMPILE_OPTS=-v to get more information during make upgrade. -PIP_COMPILE = pip-compile --upgrade --rebuild $(PIP_COMPILE_OPTS) - -# Special for edx-enterprise: Treat production package versions from openedx-platform as local constraints for testing. -# This ensures we'll only test with package versions actually used in production. -LOCAL_EDX_PINS = requirements/edx-platform-constraints.txt -PLATFORM_BASE_REQS = https://raw.githubusercontent.com/openedx/openedx-platform/master/requirements/edx/base.txt -.PHONY: $(LOCAL_EDX_PINS) -$(LOCAL_EDX_PINS): ## check that our local copy of edx-platform pins is accurate - echo "### DON'T edit this file, it's copied from edx-platform. See make upgrade" > $(LOCAL_EDX_PINS) - curl -fsSL $(PLATFORM_BASE_REQS) | grep -v '^-e' | grep -v 'via edx-enterprise$$' >> $(LOCAL_EDX_PINS) - python requirements/check_pins.py requirements/test-master.txt $(LOCAL_EDX_PINS) - -upgrade: export CUSTOM_COMPILE_COMMAND=make upgrade -upgrade: $(LOCAL_EDX_PINS) ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in - pip install -qr requirements/pip-tools.txt -c requirements/constraints.txt - # Make sure to compile files after any other files they include! - $(PIP_COMPILE) --allow-unsafe -o requirements/pip.txt requirements/pip.in - $(PIP_COMPILE) -o requirements/pip-tools.txt requirements/pip-tools.in - pip install -qr requirements/pip.txt - pip install -qr requirements/pip-tools.txt - $(PIP_COMPILE) --no-emit-trusted-host --no-emit-index-url -o requirements/test-master.txt requirements/test-master.in - $(PIP_COMPILE) --no-emit-trusted-host --no-emit-index-url -o requirements/doc.txt requirements/doc.in - $(PIP_COMPILE) --no-emit-trusted-host --no-emit-index-url -o requirements/test.txt requirements/test.in - $(PIP_COMPILE) --no-emit-trusted-host --no-emit-index-url -o requirements/dev.txt requirements/dev.in - $(PIP_COMPILE) --no-emit-trusted-host --no-emit-index-url -o requirements/ci.txt requirements/ci.in - $(PIP_COMPILE) --no-emit-trusted-host --no-emit-index-url -o requirements/js_test.txt requirements/js_test.in - # Let tox control the Django version for tests - sed '/^[dD]jango==/d' requirements/test.txt > requirements/test.tmp - mv requirements/test.tmp requirements/test.txt +compile-requirements: ## generate the uv.lock file without upgrading packages + uv lock + +# Special for edx-enterprise: treat production package versions from openedx-platform +# as local constraints for testing, so we only test with versions actually used in +# production. Layered on top of edx_lint's global + repo-specific constraints below. +upgrade: ## upgrade all packages in uv.lock and sync constraints from edx-lint and openedx-platform + uv run --with edx-lint edx_lint write_uv_constraints pyproject.toml + uv run --with tomlkit python requirements/sync_platform_constraints.py + uv lock --upgrade requirements.js: ## install JS requirements for local development npm ci -piptools: ## install pinned version of pip-compile and pip-sync - pip install -r requirements/pip-tools.txt - -dev_requirements: piptools requirements.js ## sync to requirements for local development - # test-master.txt brings constraints from openedx-platform so that we are testing with the same versions. - pip-sync -q requirements/test-master.txt requirements/dev.txt requirements/private.* requirements/test.txt +dev_requirements: requirements.js ## sync to requirements for local development + uv sync --group dev requirements: dev_requirements ## install development environment requirements jshint: ## run Javascript linting @[ -x ./node_modules/jshint/bin/jshint ] || npm install jshint --no-save - ./node_modules/jshint/bin/jshint enterprise + ./node_modules/jshint/bin/jshint src/enterprise ./node_modules/jshint/bin/jshint spec test: clean ## run python tests py.test jasmine: ## run javascript tests - jasmine + tox -e jasmine diff_cover: test diff-cover coverage.xml @@ -142,27 +118,27 @@ quality: pylint pycodestyle isort-check jshint pii_check ## run all quality chec pylint: ## Lint python code touch tests/__init__.py - pylint -j 1 enterprise enterprise_learner_portal --clear-cache-post-run=y - pylint -j 1 consent integrated_channels --clear-cache-post-run=y - pylint -j 1 test_utils requirements/check_pins.py --clear-cache-post-run=y + pylint -j 1 src/enterprise src/enterprise_learner_portal --clear-cache-post-run=y + pylint -j 1 src/consent src/integrated_channels --clear-cache-post-run=y + pylint -j 1 test_utils requirements/sync_platform_constraints.py --clear-cache-post-run=y pylint -j 1 tests -v --clear-cache-post-run=y rm tests/__init__.py pycodestyle: ## Check python code style - pycodestyle enterprise enterprise_learner_portal consent integrated_channels tests test_utils + pycodestyle src/enterprise src/enterprise_learner_portal src/consent src/integrated_channels tests test_utils pii_check: pii_clean - code_annotations django_find_annotations --config_file .pii_annotations.yml --lint --report --coverage + tox -e pii_check pii_clean: rm -rf pii_report mkdir -p pii_report isort: ## call isort on packages/files that are checked in quality tests - isort --skip migrations tests test_utils enterprise enterprise_learner_portal consent integrated_channels manage.py setup.py + tox -e isort isort-check: ## call isort on packages/files that are checked in quality tests - isort --skip migrations --check-only --diff tests test_utils enterprise enterprise_learner_portal consent integrated_channels manage.py setup.py + tox -e isort-check ######################################################################## # Docker shortcuts for managing a local test/quality container. # @@ -233,7 +209,7 @@ dev.provision.keycloak: ## provision Keycloak SAML IdP and LMS TPA records for t @echo "(where VS Code / the browser runs), not inside the codespace." @echo "" -.PHONY: clean clean.static compile_translations coverage docs dummy_translations extract_translations \ +.PHONY: clean clean.static compile-requirements compile_translations coverage docs dummy_translations extract_translations \ fake_translations help pull_translations push_translations requirements dev_requirements test upgrade validate isort \ isort-check static static.dev static.watch quality pylint pycodestyle pii_check pii_clean jasmine \ dev.pull dev.up dev.down dev.stop dev.makemigrations dev.shell dev.logs dev.restart-container dev.attach \ diff --git a/docs/changelog.rst b/docs/changelog.rst deleted file mode 100644 index 565b0521d0..0000000000 --- a/docs/changelog.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../CHANGELOG.rst diff --git a/docs/conf.py b/docs/conf.py index 82d22d7b03..e6932ecbdc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,6 +14,7 @@ import os import sys from datetime import datetime +from importlib.metadata import version as get_version from subprocess import check_call REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -41,8 +42,6 @@ # in the Sphinx-built docs. myst_fence_as_directive = ["mermaid"] -import enterprise - # Configure Django for autodoc usage os.environ["DJANGO_SETTINGS_MODULE"] = "enterprise.settings.test" django.setup() @@ -98,9 +97,9 @@ # built documents. # # The short X.Y version. -version = enterprise.__version__ +version = get_version('edx-enterprise') # The full version, including alpha/beta/rc tags. -release = enterprise.__version__ +release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -517,8 +516,8 @@ def on_init(app): # If we are, assemble the path manually bin_path = os.path.abspath(os.path.join(sys.prefix, 'bin')) apidoc_path = os.path.join(bin_path, apidoc_path) - check_call([apidoc_path, '-o', docs_path, os.path.join(root_path, 'enterprise'), - os.path.join(root_path, 'enterprise/migrations')]) + check_call([apidoc_path, '-o', docs_path, os.path.join(root_path, 'src', 'enterprise'), + os.path.join(root_path, 'src', 'enterprise', 'migrations')]) def setup(app): diff --git a/docs/index.rst b/docs/index.rst index 164b09d0a0..3114ec70ec 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -22,11 +22,6 @@ Contents: segment_events modules -.. toctree:: - :maxdepth: 1 - - changelog - .. toctree:: :glob: :maxdepth: 1 diff --git a/enterprise/__init__.py b/enterprise/__init__.py deleted file mode 100644 index 13f56fe227..0000000000 --- a/enterprise/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -""" -Your project description goes here. -""" - -__version__ = "8.18.0" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000..44b38f45fb --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,573 @@ +[build-system] +requires = ["setuptools", "setuptools-scm>8.1"] +build-backend = "setuptools.build_meta" + +[project] +name = "edx-enterprise" +description = "Enterprise features for the Open edX platform" +requires-python = ">=3.12" +license = "AGPL-3.0-or-later" +authors = [ + {name = "Open edX Project", email = "oscm@openedx.org"}, +] +keywords = [ + "Django", + "edx", +] +classifiers = [ + "Development Status :: 3 - Alpha", + "Framework :: Django", + "Framework :: Django :: 5.2", + "Intended Audience :: Developers", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.12", +] +readme = "README.rst" + +dynamic = ["version"] + +dependencies = [ + "bleach", + "celery", + "code-annotations", + "cryptography", + "django-cache-memoize", + "django-config-models", + "django-countries", + "django-crum", + "django-fernet-fields-v2", + "django-filter", + "django-ipware", + "django-model-utils", + "django-multi-email-field", + "django-object-actions", + "django-simple-history", + "django-waffle", + "Django", + "djangorestframework-xml", + "djangorestframework", + "edx-django-utils>=3.12.0", + "edx-drf-extensions", + "edx-opaque-keys[django]", + "edx-rest-api-client", + "edx-rbac", + "tincan", + "edx-toggles", + "jsondiff", + "jsonfield", + "lxml", + "openedx-atlas", + "openedx-events", + "openedx-filters", + "paramiko", + "path.py", + "pillow", + "python-dateutil", + "python3-saml", + "pytz", + "requests", + "rules", + "slumber", + "social-auth-app-django", + "stevedore", + "testfixtures", + "unicodecsv", + "PGPy", + "django-oauth-toolkit", +] + +[project.optional-dependencies] +braze = [ + "edx-braze-client", +] + +[project.entry-points."lms.djangoapp"] +enterprise = "enterprise.apps:EnterpriseConfig" +consent = "consent.apps:ConsentConfig" + +[project.entry-points."cms.djangoapp"] +enterprise = "enterprise.apps:EnterpriseConfig" +consent = "consent.apps:ConsentConfig" + +[project.urls] +Homepage = "https://github.com/openedx/edx-enterprise" +Repository = "https://github.com/openedx/edx-enterprise" + +[dependency-groups] +test-master = [ + "edx-api-doc-tools", + "edx-braze-client", +] +test = [ + {include-group = "test-master"}, + "ddt<1.4.0", + "django-mock-queries", + "diff-cover", + "django-model-utils", + "factory_boy", + "freezegun", + "mock", + "pytest-cov", + "pytest-django", + "responses", + "testfixtures", +] +doc = [ + {include-group = "test-master"}, + "doc8", + "docutils", + "pytest", + "factory-boy", + "readme_renderer", + "Sphinx", + "sphinx-book-theme", + "sphinxcontrib-mermaid", + "myst-parser", + "build", + "twine", +] +ci = [ + "tox", + "tox-uv", +] +js_test = [ + "jaraco.classes", + "jaraco.collections", + "jaraco.functools", + "jasmine", + "tempora", +] +# Only needed by the postgresql-migrations.yml CI job, which runs the test suite +# against Postgres instead of the default MySQL backend. Not part of `dev` since +# nothing else in this repo needs it. +postgresql = [ + "psycopg2-binary", +] +dev = [ + {include-group = "test-master"}, + {include-group = "doc"}, + {include-group = "test"}, + {include-group = "ci"}, + "edx-lint", + "edx-i18n-tools", + "isort", + "pycodestyle", + "pydocstyle", + "wheel", +] + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.packages.find] +where = ["src"] +include = ["enterprise*", "consent*", "integrated_channels*", "enterprise_learner_portal*"] +exclude = ["*tests*"] + +[tool.setuptools_scm] +version_scheme = "only-version" +local_scheme = "no-local-version" +fallback_version = "0.0.0" + +[tool.semantic_release] +build_command = "pip install build && SETUPTOOLS_SCM_PRETEND_VERSION=$NEW_VERSION python -m build" +# Already past 1.0 (8.x), so major_on_zero is a no-op today -- it only governs +# the 0.x -> 1.0.0 transition, not 1.x -> 2.0.0. Set for consistency across the +# batch and so this repo never auto-jumps to 1.0.0 if it's ever reset to 0.x. +major_on_zero = false +allow_zero_version = true +# The most recent tag (v8.8.0, 2026-08-07) uses the "v" prefix -- older tags +# were inconsistent (some bare, e.g. 8.7.2), but PSR only needs to recognize +# the latest one to compute the next version correctly. This is PSR's actual +# default, kept explicit for clarity. +tag_format = "v{version}" + +[tool.uv] +package = true +# Every `uv sync`/`uv run` invocation in this repo names an explicit --group. +# Without this, uv's implicit default group (named "dev") would be synced *in +# addition* to whatever --group is passed, silently pulling the entire +# dev/test/quality/ci superset into every target, defeating the point of +# having separate groups. +default-groups = [] +# js_test (Jasmine JS-test runner) depends on an old jasmine package that +# hard-pins pyyaml far below what test-master/test/doc/dev need (transitively, +# via edx-api-doc-tools -> drf-yasg). Those requirement sets are mutually +# unsatisfiable in one resolution, so give js_test its own resolution fork. +conflicts = [ + [{group = "js_test"}, {group = "test-master"}], + [{group = "js_test"}, {group = "test"}], + [{group = "js_test"}, {group = "doc"}], + [{group = "js_test"}, {group = "dev"}], +] +# DO NOT EDIT constraint-dependencies DIRECTLY. +# This list is managed by `edx_lint write_uv_constraints` (global + repo-specific) +# and `requirements/sync_platform_constraints.py` (openedx-platform's own pins), +# both run as part of `make upgrade`. +# - GLOBAL constraints: edit edx_lint/files/common_constraints.txt +# - REPO-SPECIFIC constraints: edit [tool.edx_lint].uv_constraints in this file +# - PLATFORM constraints: nothing to edit, refreshed live from openedx-platform; +# fenced below with "begin/end openedx-platform sync" markers so they're +# visibly distinct from the GLOBAL/REPO-SPECIFIC entries above them +constraint-dependencies = [ + "Django<6.0", + "elasticsearch<7.14.0", + "factory-boy<4.0", + "Sphinx>=8.0,<9.0", + "pylint>=3,<4", + "astroid>=3,<4", + "setuptools<82", + "acid-xblock==0.4.1", + "aiohappyeyeballs==2.7.1", + "aiohttp==3.14.1", + "aiosignal==1.4.0", + "amqp==5.3.1", + "analytics-python==1.4.post1", + "aniso8601==10.0.1", + "annotated-types==0.7.0", + "anyio==4.14.1", + "appdirs==1.4.4", + "asgiref==3.11.1", + "asn1crypto==1.5.1", + "attrs==26.1.0", + "babel==2.18.0", + "backoff==1.10.0", + "bcrypt==5.0.0", + "beautifulsoup4==4.15.0", + "billiard==4.2.4", + "bleach==6.4.0", + "boto3==1.43.41", + "botocore==1.43.41", + "bracex==3.0", + "bridgekeeper==0.9", + "cachecontrol==0.14.4", + "cachetools==7.1.4", + "camel-converter==5.1.0", + "casbin-django-orm-adapter==1.7.0", + "celery==5.6.3", + "certifi==2026.6.17", + "cffi==2.1.0", + "chardet==7.4.3", + "charset-normalizer==3.4.8", + "chem==2.0.0", + "click==8.4.2", + "click-didyoumean==0.3.1", + "click-plugins==1.1.1.2", + "click-repl==0.3.0", + "code-annotations==3.0.0", + "codejail-includes==2.0.0", + "crowdsourcehinter-xblock==1.0.1", + "cryptography==49.0.0", + "cssutils==2.15.0", + "defusedxml==0.7.1", + "django-appconf==1.2.0", + "django-autocomplete-light==5.0.0", + "django-cache-memoize==0.2.1", + "django-celery-results==2.6.0", + "django-classy-tags==4.1.0", + "django-config-models==3.0.0", + "django-cors-headers==4.9.0", + "django-countries==9.0.0", + "django-crum==0.7.9", + "django-fernet-fields-v2==0.9", + "django-filter==25.2", + "django-ipware==7.0.1", + "django-js-asset==4.0.1", + "django-method-override==1.0.4", + "django-model-utils==5.0.0", + "django-mptt==0.18.0", + "django-multi-email-field==0.8.0", + "django-mysql==4.19.0", + "django-oauth-toolkit==1.7.1", + "django-object-actions==5.1.2", + "django-pipeline==4.1.0", + "django-push-notifications==3.3.0", + "django-ratelimit==4.1.0", + "django-sekizai==4.1.0", + "django-ses==4.7.2", + "django-simple-history==3.12.0", + "django-statici18n==2.7.1", + "django-storages==1.14.6", + "django-user-tasks==4.0.0", + "django-waffle==5.0.0", + "django-webpack-loader==3.2.4", + "djangorestframework==3.17.1", + "djangorestframework-xml==2.0.0", + "dnspython==2.8.0", + "done-xblock==3.0.0", + "drf-jwt==1.19.2", + "drf-spectacular==0.30.0", + "drf-yasg==1.21.15", + "edx-ace==1.15.0", + "edx-api-doc-tools==3.0.0", + "edx-auth-backends==5.0.0", + "edx-bulk-grades==2.0.0", + "edx-ccx-keys==2.0.2", + "edx-celeryutils==2.0.0", + "edx-codejail==4.1.0", + "edx-completion==5.0.0", + "edx-django-release-util==1.5.0", + "edx-django-sites-extensions==6.0.0", + "edx-django-utils==8.0.1", + "edx-drf-extensions==10.6.0", + "edx-event-bus-kafka==6.1.0", + "edx-event-bus-redis==1.0.0", + "edx-i18n-tools==2.0.0", + "edx-milestones==2.0.0", + "edx-opaque-keys==4.0.0", + "edx-organizations==8.0.0", + "edx-proctoring==5.2.0", + "edx-rbac==3.0.0", + "edx-rest-api-client==7.0.0", + "edx-search==5.0.2", + "edx-sga==0.29.0", + "edx-submissions==4.0.0", + "edx-tincan-py35==2.0.0", + "edx-toggles==6.0.0", + "edx-when==4.0.0", + "edxval==5.0.1", + "encutils==1.0.0", + "enmerkar==0.7.1", + "enmerkar-underscore==2.4.0", + "enterprise-integrated-channels==0.1.62", + "event-tracking==4.0.2", + "fastavro==1.12.2", + "filelock==3.29.6", + "firebase-admin==7.5.0", + "frozenlist==1.8.0", + "fs==2.4.16", + "fs-s3fs==1.1.1", + "geoip2==5.2.0", + "glob2==0.7", + "google-api-core==2.31.0", + "google-auth==2.55.1", + "google-cloud-core==2.6.0", + "google-cloud-firestore==2.28.0", + "google-cloud-storage==3.12.0", + "google-crc32c==1.8.0", + "google-resumable-media==2.10.0", + "googleapis-common-protos==1.75.0", + "grpcio==1.82.0", + "grpcio-status==1.82.0", + "gunicorn==26.0.0", + "h11==0.16.0", + "h2==4.3.0", + "help-tokens==4.0.0", + "hpack==4.2.0", + "html5lib==1.1", + "httpcore==1.0.9", + "httpx==0.28.1", + "hyperframe==6.1.0", + "icalendar==7.2.0", + "idna==3.18", + "importlib-metadata==9.0.0", + "inflection==0.5.1", + "invoke==3.0.3", + "ipaddress==1.0.23", + "isodate==0.7.2", + "jinja2==3.1.6", + "jmespath==1.1.0", + "joblib==1.5.3", + "jsondiff==2.2.1", + "jsonfield==3.2.0", + "jsonschema==4.26.0", + "jsonschema-specifications==2025.9.1", + "jwcrypto==1.5.8", + "kombu==5.6.2", + "laboratory==1.0.2", + "lazy==2.0", + "lti-consumer-xblock==11.3.1", + "lxml==5.3.2", + "lxml-html-clean==0.4.4", + "mailsnake==1.6.4", + "mako==1.3.12", + "markdown==3.10.2", + "markupsafe==3.0.3", + "maxminddb==3.1.1", + "meilisearch==0.42.0", + "mongoengine==0.29.3", + "monotonic==1.6", + "more-itertools==11.1.0", + "mpmath==1.3.0", + "msgpack==1.2.1", + "multidict==6.7.1", + "mysqlclient==2.2.8", + "nh3==0.3.6", + "nltk==3.9.4", + "nodeenv==1.10.0", + "numpy==1.26.4", + "oauthlib==3.3.1", + "olxcleaner==0.3.0", + "openedx-atlas==0.7.0", + "openedx-authz==1.20.1", + "openedx-calc==5.0.0", + "openedx-core==1.1.0", + "openedx-django-pyfs==4.0.0", + "openedx-django-require==3.0.0", + "openedx-django-wiki==3.1.2", + "openedx-events==11.2.0", + "openedx-filters==3.9.0", + "openedx-forum==0.4.3", + "optimizely-sdk==5.5.0", + "ora2==7.1.0", + "packaging==26.2", + "paramiko==5.0.0", + "path==16.11.0", + "path-py==12.5.0", + "pgpy==0.6.0", + "piexif==1.1.3", + "pillow==12.3.0", + "platformdirs==4.10.0", + "polib==1.2.0", + "prompt-toolkit==3.0.52", + "propcache==0.5.2", + "proto-plus==1.28.0", + "protobuf==7.35.1", + "psutil==7.2.2", + "psycopg2-binary==2.9.12", + "pyasn1==0.6.3", + "pyasn1-modules==0.4.2", + "pycasbin==2.8.0", + "pycountry==26.2.16", + "pycparser==3.0", + "pycryptodomex==3.23.0", + "pydantic==2.13.4", + "pydantic-core==2.46.4", + "pyjwt==2.13.0", + "pylatexenc==2.10", + "pylti1p3==2.0.0", + "pymemcache==4.0.0", + "pymongo==4.4.0", + "pynacl==1.6.2", + "pynliner==0.8.0", + "pyopenssl==26.3.0", + "pyparsing==3.3.2", + "pyrsistent==0.20.0", + "pysrt==1.1.2", + "python-dateutil==2.9.0.post0", + "python-ipware==3.0.0", + "python-slugify==8.0.4", + "python-swiftclient==4.10.0", + "python3-openid==3.2.0", + "python3-saml==1.16.0", + "pytz==2026.2", + "pyuca==1.2", + "random2==1.0.2", + "recommender-xblock==5.0.0", + "redis==8.0.1", + "referencing==0.37.0", + "regex==2026.6.28", + "requests==2.34.2", + "requests-oauthlib==2.0.0", + "rpds-py==2026.6.3", + "rules==3.5", + "s3transfer==0.19.0", + "sailthru-client==2.2.3", + "scipy==1.17.1", + "semantic-version==2.10.0", + "shapely==2.1.2", + "simpleeval==1.0.7", + "simplejson==4.1.1", + "six==1.17.0", + "slumber==0.7.1", + "snowflake-connector-python==4.6.0", + "social-auth-app-django==5.4.1", + "social-auth-core==5.0.2", + "sorl-thumbnail==13.0.0", + "sortedcontainers==2.4.0", + "soupsieve==2.8.4", + "sqlparse==0.5.5", + "staff-graded-xblock==4.0.1", + "stevedore==5.9.0", + "super-csv==5.0.0", + "sympy==1.14.0", + "testfixtures==12.2.0", + "text-unidecode==1.3", + "tincan==1.0.0", + "tinycss2==1.5.1", + "tomlkit==0.15.0", + "tqdm==4.68.3", + "typesense==2.0.0", + "typing-extensions==4.16.0", + "typing-inspection==0.4.2", + "tzdata==2026.2", + "tzlocal==5.4.4", + "unicodecsv==0.14.1", + "unicodeit==0.7.5", + "uritemplate==4.2.0", + "urllib3==2.7.0", + "vine==5.1.0", + "voluptuous==0.16.0", + "walrus==0.9.8", + "wcmatch==10.2.1", + "wcwidth==0.8.2", + "web-fragments==4.0.0", + "webencodings==0.5.1", + "webob==1.8.10", + "wheel==0.47.0", + "wrapt==2.2.2", + "xblock==6.3.0", + "xblock-drag-and-drop-v2==5.0.6", + "xblock-google-drive==0.8.2", + "xblock-poll==1.16.1", + "xblocks-contrib==0.17.0", + "xmlsec==1.3.14", + "xss-utils==1.0.0", + "yarl==1.24.2", + "zipp==4.1.0", +] + +[tool.edx_lint] +uv_constraints = [ + "factory-boy<4.0", + # pinning Sphinx 8.x version + # Sphinx 9.x introduces significant changes and removals compared to Sphinx 8.x, + # particularly in internal APIs and default behaviors, including a substantial rewrite of the autodoc extension. + # https://github.com/openedx/edx-enterprise/issues/2494 + "Sphinx>=8.0,<9.0", + # pylint 4 throws all sorts of errors and warnings at us + "pylint>=3,<4", + "astroid>=3,<4", + # setuptools 82.0.0 removed pkg_resources from its distribution, but twine + # still imports it -- breaks `twine check` in the docs quality gate. + "setuptools<82", +] + +[tool.isort] +line_length = 120 +known_edx = [] +known_django = ["django"] +known_djangoapp = ["model_utils"] +known_first_party = ["consent", "enterprise", "enterprise_learner_portal", "integrated_channels"] +include_trailing_comma = true +multi_line_output = 3 +sections = ["FUTURE", "STDLIB", "THIRDPARTY", "DJANGO", "DJANGOAPP", "EDX", "FIRSTPARTY", "LOCALFOLDER"] + +[tool.pytest.ini_options] +DJANGO_SETTINGS_MODULE = "enterprise.settings.test" +addopts = "--cov enterprise --cov enterprise_learner_portal --cov consent --cov integrated_channels --cov-report term-missing --cov-report xml" +norecursedirs = [".*", "docs", "requirements", "site-packages", "scripts", "node_modules"] +testpaths = ["tests"] + +[tool.coverage.run] +branch = true +source = ["enterprise", "consent", "integrated_channels", "enterprise_learner_portal"] +omit = [ + "*/settings/*", + "*/conf/*", + "*/mocks.py", + "*/urls.py", + "*/migrations/*", + "*/admin.py", + "*/static/*", + "*/templates/*", + "*/tests/*", + "test_*", +] + +[tool.coverage.html] +directory = "build/coverage/html" + +[tool.coverage.xml] +output = "build/coverage/coverage.xml" diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 494bbf7960..0000000000 --- a/pytest.ini +++ /dev/null @@ -1,13 +0,0 @@ -# Standard settings used by CI and Makefile targets. -# -# Designed to run all tests and produce comprehensive coverage reporting. -# -# Example usage: -# ``` -# pytest -# ``` -[pytest] -DJANGO_SETTINGS_MODULE = enterprise.settings.test -addopts = --cov enterprise --cov enterprise_learner_portal --cov consent --cov integrated_channels --cov-report term-missing --cov-report xml -norecursedirs = .* docs requirements site-packages scripts node_modules -testpaths = tests diff --git a/requirements/base.in b/requirements/base.in deleted file mode 100644 index f874c71f51..0000000000 --- a/requirements/base.in +++ /dev/null @@ -1,53 +0,0 @@ -# -# This file contains the dependencies explicitly needed for this library. -# -# Packages directly used by this library that we do not need pinned to a specific version. -bleach -celery -code-annotations -cryptography -django-cache-memoize -django-config-models -django-countries -django-crum -django-fernet-fields-v2 -django-filter -django-ipware -django-model-utils -django-multi-email-field -django-object-actions -django-simple-history -django-waffle -django -djangorestframework-xml -djangorestframework -edx-django-utils>=3.12.0 -edx-drf-extensions -edx-opaque-keys[django] -edx-rest-api-client -edx-rbac -tincan -edx-toggles -jsondiff -jsonfield -lxml -openedx-atlas -openedx-events -openedx-filters -paramiko -path.py -pillow -python-dateutil -python3-saml -pytz -requests -rules -slumber -social-auth-app-django -stevedore -testfixtures -unicodecsv -PGPy -django-oauth-toolkit - -# Explicitly pinned packages. Anything pinned here must match edx-platform's pinned packages. diff --git a/requirements/check_pins.py b/requirements/check_pins.py deleted file mode 100644 index 4f64232eee..0000000000 --- a/requirements/check_pins.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -""" -Compare two pip requirements files. Everything in the first one should match -one in the second one. -""" - -import re -import sys - -def pins(lines): - """Parse lines from a requirements file. - - Yields (pkg, content), where `pkg` is the name of the package, and - `content` is the specification of what to install. - """ - for line in lines: - line = line.strip() - content = re.sub(r"(^|\s+)#.*$", "", line) - if not content: - continue - pin = content.split("==") - if len(pin) == 2: - pkg, _ = pin - if pkg.startswith("git+https:"): - pkg = pkg.partition("#egg=")[-1] - elif "[" in pkg: - pkg = pkg.partition("[")[0] - yield pkg, content - - -def read_pin_dict(filename): - """Read a requirements file, and return a dict mapping package name to spec.""" - with open(filename) as f: - return dict(pins(f)) - - -def check_pins(our_file, their_file): - """Check that all the pins in `our_file` match the corresponding line in `their_file`.""" - ours = read_pin_dict(our_file) - theirs = read_pin_dict(their_file) - for pkg in ours: - our_pkg = ours[pkg] - try: - their_pkg = theirs[pkg] - except KeyError: - print(f"*** Pinned, but not in {their_file}:") - print(our_pkg) - print("") - else: - if our_pkg != their_pkg: - print("*** Pins disagree:") - print(our_pkg) - print(their_pkg) - print("") - -check_pins(*sys.argv[1:]) diff --git a/requirements/ci.in b/requirements/ci.in deleted file mode 100644 index ffbaa2043b..0000000000 --- a/requirements/ci.in +++ /dev/null @@ -1,5 +0,0 @@ -# Requirements for running tests in GitHub Actions - --c constraints.txt - -tox # Virtualenv management for tests diff --git a/requirements/ci.txt b/requirements/ci.txt deleted file mode 100644 index 2dc2c0b9e6..0000000000 --- a/requirements/ci.txt +++ /dev/null @@ -1,42 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -cachetools==7.2.2 - # via tox -colorama==0.4.6 - # via tox -distlib==0.4.3 - # via virtualenv -filelock==4.2.0 - # via - # python-discovery - # tox - # virtualenv -packaging==26.3 - # via - # pyproject-api - # tox - # virtualenv -platformdirs==4.13.3 - # via - # tox - # virtualenv -pluggy==1.7.0 - # via tox -pyproject-api==1.11.7 - # via tox -python-discovery==1.6.2 - # via - # tox - # virtualenv -tomli-w==1.2.0 - # via tox -tox==4.65.6 - # via -r requirements/ci.in -typing-extensions==4.16.0 - # via tox -virtualenv==21.14.8 - # via tox diff --git a/requirements/constraints.txt b/requirements/constraints.txt deleted file mode 100644 index 8b4bef368e..0000000000 --- a/requirements/constraints.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Version constraints for pip-installation. -# -# This file doesn't install any packages. It specifies version constraints -# that will be applied if a package is needed. -# -# When pinning something here, please provide an explanation of why. Ideally, -# link to other information that will help people in the future to remove the -# pin when possible. Writing an issue against the offending project and -# linking to it here is good. - -# NOTE: We intentionally do NOT include the org-wide common_constraints.txt -# from edx-lint. This repo tests against the exact package versions used in -# production by openedx-platform (see edx-platform-constraints.txt). - -# Pin factory-boy major version for stability purposes. -factory-boy<4.0 - -# pinning Sphinx 8.x version -# Sphinx 9.x introduces significant changes and removals compared to Sphinx 8.x, -# particularly in internal APIs and default behaviors, including a substantial rewrite of the autodoc extension. -# https://github.com/openedx/edx-enterprise/issues/2494 -Sphinx>=8.0,<9.0 - -# pylint 4 throws all sorts of errors and warnings at us -pylint<4 - -# pip 26.2+ is incompatible with pip-tools 7.6.0 (latest pip-tools release only -# supports pip up to 26.1), which breaks `make upgrade`. Remove this once a -# newer pip-tools release restores pip 26.2+ compatibility. -pip<26.2 diff --git a/requirements/dev.in b/requirements/dev.in deleted file mode 100644 index da673a7c16..0000000000 --- a/requirements/dev.in +++ /dev/null @@ -1,18 +0,0 @@ -# Additional requirements for development of this application - --c constraints.txt --r test-master.txt --r doc.txt --r test.txt - -edx-lint # edX pylint rules and plugins -edx-i18n-tools # For i18n_tool dummy -isort # to standardize order of imports -pip-tools # Requirements file management -pycodestyle # PEP 8 compliance validation -pydocstyle # PEP 257 compliance validation -testfixtures # Mock objects for unit tests and doc tests -tox # virtualenv management for tests -twine==1.11.0 # Utility for PyPI package uploads -wheel # For generation of wheels for PyPI -edx-braze-client # Production requirement absent in upstream openedx-platform diff --git a/requirements/dev.txt b/requirements/dev.txt deleted file mode 100644 index cbeb01e2f6..0000000000 --- a/requirements/dev.txt +++ /dev/null @@ -1,1205 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -accessible-pygments==0.0.5 - # via - # -r requirements/doc.txt - # pydata-sphinx-theme -alabaster==1.0.0 - # via - # -r requirements/doc.txt - # sphinx -amqp==5.4.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # kombu -aniso8601==10.0.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # tincan -anyio==4.15.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # httpx -asgiref==3.12.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # django - # django-countries -astroid==3.3.11 - # via - # pylint - # pylint-celery -attrs==26.1.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-ace - # openedx-events -babel==2.18.0 - # via - # -r requirements/doc.txt - # pydata-sphinx-theme - # sphinx -bcrypt==5.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # paramiko -beautifulsoup4==4.15.0 - # via - # -r requirements/doc.txt - # pydata-sphinx-theme -billiard==4.3.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # celery -bleach==6.4.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -build==1.6.1 - # via pip-tools -cachecontrol==0.14.4 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # firebase-admin -cachetools==7.2.2 - # via tox -celery==5.6.3 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -certifi==2026.7.22 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # httpcore - # httpx - # requests -cffi==2.1.1 ; platform_python_implementation != "PyPy" - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # cryptography - # pynacl -chardet==7.6.0 - # via - # -r requirements/test.txt - # diff-cover -charset-normalizer==3.5.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # requests -click==8.5.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # celery - # click-didyoumean - # click-log - # click-plugins - # click-repl - # code-annotations - # edx-django-utils - # edx-lint - # pip-tools -click-didyoumean==0.3.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # celery -click-log==0.4.0 - # via edx-lint -click-plugins==1.1.1.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # celery -click-repl==0.4.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # celery -code-annotations==3.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-lint - # edx-toggles -colorama==0.4.6 - # via tox -coverage[toml]==7.16.2 - # via - # -r requirements/test.txt - # pytest-cov -cryptography==50.0.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # django-fernet-fields-v2 - # google-auth - # jwcrypto - # paramiko - # pgpy - # pyjwt - # social-auth-core -ddt==1.3.1 - # via -r requirements/test.txt -defusedxml==0.7.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # djangorestframework-xml - # python3-openid - # social-auth-core -diff-cover==10.6.0 - # via -r requirements/test.txt -dill==0.4.1 - # via pylint -distlib==0.4.3 - # via virtualenv -django==5.2.17 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # django-config-models - # django-crum - # django-fernet-fields-v2 - # django-filter - # django-ipware - # django-mock-queries - # django-model-utils - # django-multi-email-field - # django-oauth-toolkit - # django-push-notifications - # django-simple-history - # django-waffle - # djangorestframework - # drf-jwt - # drf-yasg - # edx-ace - # edx-api-doc-tools - # edx-braze-client - # edx-django-utils - # edx-drf-extensions - # edx-i18n-tools - # edx-rbac - # edx-toggles - # jsonfield - # model-bakery - # openedx-events - # openedx-filters - # social-auth-app-django -django-cache-memoize==0.2.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-config-models==3.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-countries==9.1.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-crum==0.7.9 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-django-utils - # edx-rbac - # edx-toggles -django-fernet-fields-v2==0.9 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-filter==26.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-ipware==8.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-mock-queries==2.4.0 - # via -r requirements/test.txt -django-model-utils==5.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-rbac -django-multi-email-field==0.8.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-oauth-toolkit==1.7.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-object-actions==5.1.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-push-notifications==3.3.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-ace -django-simple-history==3.12.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -django-waffle==5.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-django-utils - # edx-drf-extensions - # edx-toggles -djangorestframework==3.17.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # django-config-models - # django-mock-queries - # drf-jwt - # drf-yasg - # edx-api-doc-tools - # edx-drf-extensions -djangorestframework-xml==2.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -dnspython==2.8.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # pymongo -doc8==2.0.0 - # via -r requirements/doc.txt -docutils==0.21.2 - # via - # -r requirements/doc.txt - # doc8 - # myst-parser - # pydata-sphinx-theme - # readme-renderer - # restructuredtext-lint - # sphinx -drf-jwt==1.19.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-drf-extensions -drf-yasg==1.21.15 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-api-doc-tools -edx-ace==1.15.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-braze-client -edx-api-doc-tools==3.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -edx-braze-client==1.1.4 - # via - # -r requirements/dev.in - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -edx-ccx-keys==2.0.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # openedx-events -edx-django-utils==8.0.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # django-config-models - # edx-ace - # edx-braze-client - # edx-drf-extensions - # edx-rest-api-client - # edx-toggles - # openedx-events -edx-drf-extensions==10.9.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-rbac -edx-i18n-tools==2.1.0 - # via -r requirements/dev.in -edx-lint==6.2.0 - # via -r requirements/dev.in -edx-opaque-keys[django]==4.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-ccx-keys - # edx-drf-extensions - # openedx-events - # openedx-filters -edx-rbac==3.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -edx-rest-api-client==7.1.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -edx-toggles==6.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -factory-boy==3.3.3 - # via - # -c requirements/constraints.txt - # -r requirements/doc.txt - # -r requirements/test.txt -faker==40.43.0 - # via - # -r requirements/doc.txt - # -r requirements/test.txt - # factory-boy -fastavro==1.12.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # openedx-events -filelock==4.2.0 - # via - # python-discovery - # tox - # virtualenv -firebase-admin==7.7.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-ace -freezegun==1.5.5 - # via -r requirements/test.txt -google-api-core[grpc]==2.39.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # firebase-admin - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-auth==2.59.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-api-core - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-cloud-core==2.7.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-cloud-firestore - # google-cloud-storage -google-cloud-firestore==2.32.0 ; platform_python_implementation != "PyPy" - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # firebase-admin -google-cloud-storage==3.15.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # firebase-admin -google-crc32c==1.9.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-cloud-storage - # google-resumable-media -google-resumable-media==2.10.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-cloud-storage -googleapis-common-protos==1.75.4 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-api-core - # grpcio-status -grpcio==1.84.0 ; platform_python_implementation != "PyPy" - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-api-core - # google-cloud-firestore - # grpcio-status -grpcio-status==1.84.0 ; platform_python_implementation != "PyPy" - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-api-core -h11==0.16.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # httpcore -h2==4.4.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # httpx -hpack==4.2.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # h2 -httpcore==1.0.9 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # httpx -httpx[http2]==0.28.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # firebase-admin -hyperframe==6.1.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # h2 -idna==3.20 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # anyio - # httpx - # requests -imagesize==2.0.1 - # via - # -r requirements/doc.txt - # sphinx -inflection==0.5.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # drf-yasg -iniconfig==2.3.1 - # via - # -r requirements/doc.txt - # -r requirements/test.txt - # pytest -invoke==3.0.3 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # paramiko -isodate==0.7.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # python3-saml -isort==6.1.0 - # via - # -r requirements/dev.in - # pylint -jinja2==3.1.6 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # code-annotations - # diff-cover - # myst-parser - # pydata-sphinx-theme - # sphinx - # sphinxcontrib-mermaid -jsondiff==2.2.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -jsonfield==3.2.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -jwcrypto==1.6.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # django-oauth-toolkit -kombu==5.6.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # celery -lxml[html-clean]==5.3.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-i18n-tools - # lxml-html-clean - # python3-saml - # xmlsec -lxml-html-clean==0.4.4 - # via lxml -markdown-it-py==4.2.0 - # via - # -r requirements/doc.txt - # mdit-py-plugins - # myst-parser -markupsafe==3.0.3 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # jinja2 -mccabe==0.7.0 - # via pylint -mdit-py-plugins==0.6.1 - # via - # -r requirements/doc.txt - # myst-parser -mdurl==0.1.2 - # via - # -r requirements/doc.txt - # markdown-it-py -mock==5.2.0 - # via -r requirements/test.txt -model-bakery==1.24.2 - # via - # -r requirements/test.txt - # django-mock-queries -msgpack==1.2.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # cachecontrol -myst-parser==5.1.0 - # via -r requirements/doc.txt -nh3==0.3.7 - # via - # -r requirements/doc.txt - # readme-renderer -oauthlib==4.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # django-oauth-toolkit - # requests-oauthlib - # social-auth-core -openedx-atlas==0.7.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -openedx-events==11.2.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -openedx-filters==3.14.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -opentelemetry-api==1.45.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-api-core -packaging==26.3 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # build - # drf-yasg - # kombu - # pyproject-api - # pytest - # sphinx - # tox - # virtualenv - # wheel -paramiko==5.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -path==16.11.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-i18n-tools - # path-py -path-py==12.5.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -pgpy==0.6.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -pillow==12.3.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -pip-tools==7.6.2 - # via -r requirements/dev.in -pkginfo==1.13 - # via twine -platformdirs==4.13.3 - # via - # pylint - # tox - # virtualenv -pluggy==1.7.0 - # via - # -r requirements/doc.txt - # -r requirements/test.txt - # diff-cover - # pytest - # pytest-cov - # tox -polib==1.2.0 - # via edx-i18n-tools -prompt-toolkit==3.0.53 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # click-repl -proto-plus==1.28.4 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-api-core - # google-cloud-firestore -protobuf==7.36.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-api-core - # google-cloud-firestore - # googleapis-common-protos - # grpcio-status - # proto-plus -psutil==7.2.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-django-utils -pyasn1==0.6.4 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # pgpy - # pyasn1-modules -pyasn1-modules==0.4.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # google-auth -pycodestyle==2.15.0 - # via -r requirements/dev.in -pycparser==3.0 ; implementation_name != "PyPy" and platform_python_implementation != "PyPy" - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # cffi -pydata-sphinx-theme==0.20.0 - # via - # -r requirements/doc.txt - # sphinx-book-theme -pydocstyle==6.3.0 - # via -r requirements/dev.in -pygments==2.21.0 - # via - # -r requirements/doc.txt - # -r requirements/test.txt - # accessible-pygments - # diff-cover - # doc8 - # pydata-sphinx-theme - # pytest - # readme-renderer - # sphinx -pyjwt[crypto]==2.15.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # drf-jwt - # edx-drf-extensions - # edx-rest-api-client - # firebase-admin - # social-auth-core -pylint==3.3.9 - # via - # -c requirements/constraints.txt - # edx-lint - # pylint-celery - # pylint-django - # pylint-plugin-utils -pylint-celery==0.3 - # via edx-lint -pylint-django==2.8.0 - # via edx-lint -pylint-plugin-utils==0.9.0 - # via - # pylint-celery - # pylint-django -pymongo==4.4.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-opaque-keys -pynacl==1.6.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-django-utils - # paramiko -pyproject-api==1.11.7 - # via tox -pyproject-hooks==1.3.3 - # via - # build - # pip-tools -pytest==9.1.1 - # via - # -r requirements/doc.txt - # -r requirements/test.txt - # pytest-cov - # pytest-django -pytest-cov==7.1.0 - # via -r requirements/test.txt -pytest-django==4.14.0 - # via -r requirements/test.txt -python-dateutil==2.9.0.post0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # celery - # edx-ace - # freezegun -python-discovery==1.6.2 - # via - # tox - # virtualenv -python-ipware==4.1.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # django-ipware -python-slugify==9.1.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # code-annotations -python3-openid==3.2.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # social-auth-core -python3-saml==1.16.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -pytz==2026.4 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # drf-yasg - # tincan -pyyaml==6.0.3 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # code-annotations - # drf-yasg - # edx-i18n-tools - # jsondiff - # myst-parser - # responses - # sphinxcontrib-mermaid -readme-renderer==46.0 - # via -r requirements/doc.txt -requests==2.34.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # cachecontrol - # django-oauth-toolkit - # edx-braze-client - # edx-drf-extensions - # edx-rest-api-client - # google-api-core - # google-cloud-storage - # pydata-sphinx-theme - # requests-oauthlib - # requests-toolbelt - # responses - # sailthru-client - # slumber - # social-auth-core - # sphinx - # twine -requests-oauthlib==2.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # social-auth-core -requests-toolbelt==1.0.0 - # via twine -responses==0.26.3 - # via -r requirements/test.txt -restructuredtext-lint==2.0.2 - # via - # -r requirements/doc.txt - # doc8 -roman-numerals==4.1.0 - # via - # -r requirements/doc.txt - # roman-numerals-py -roman-numerals-py==4.1.0 - # via - # -r requirements/doc.txt - # sphinx -rules==3.5 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -sailthru-client==2.2.3 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-ace -semantic-version==2.10.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-drf-extensions -simplejson==4.1.2 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # sailthru-client -six==1.17.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # edx-ace - # edx-ccx-keys - # edx-lint - # edx-rbac - # python-dateutil -slumber==0.7.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -snowballstemmer==3.1.1 - # via - # -r requirements/doc.txt - # pydocstyle - # sphinx -social-auth-app-django==5.4.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -social-auth-core==4.9.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # social-auth-app-django -soupsieve==3.0.3 - # via - # -r requirements/doc.txt - # beautifulsoup4 -sphinx==8.2.3 - # via - # -c requirements/constraints.txt - # -r requirements/doc.txt - # myst-parser - # pydata-sphinx-theme - # sphinx-book-theme - # sphinxcontrib-mermaid -sphinx-book-theme==1.4.0 - # via -r requirements/doc.txt -sphinxcontrib-applehelp==2.0.0 - # via - # -r requirements/doc.txt - # sphinx -sphinxcontrib-devhelp==2.0.0 - # via - # -r requirements/doc.txt - # sphinx -sphinxcontrib-htmlhelp==2.1.0 - # via - # -r requirements/doc.txt - # sphinx -sphinxcontrib-jsmath==1.0.1 - # via - # -r requirements/doc.txt - # sphinx -sphinxcontrib-mermaid==2.1.1 - # via -r requirements/doc.txt -sphinxcontrib-qthelp==2.0.0 - # via - # -r requirements/doc.txt - # sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via - # -r requirements/doc.txt - # sphinx -sqlparse==0.6.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # django -stevedore==5.9.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # code-annotations - # doc8 - # edx-ace - # edx-django-utils - # edx-opaque-keys -testfixtures==12.3.0 - # via - # -r requirements/dev.in - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -text-unidecode==1.3 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # python-slugify -tincan==1.0.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -tomli-w==1.2.0 - # via tox -tomlkit==0.15.1 - # via - # edx-lint - # pylint -tox==4.65.6 - # via -r requirements/dev.in -tqdm==4.70.1 - # via twine -twine==1.11.0 - # via -r requirements/dev.in -typing-extensions==4.16.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # anyio - # beautifulsoup4 - # click-repl - # django-countries - # edx-opaque-keys - # grpcio - # jwcrypto - # opentelemetry-api - # testfixtures - # tox -tzdata==2026.4 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # kombu -tzlocal==5.4.4 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # celery -unicodecsv==0.14.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt -uritemplate==4.2.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # drf-yasg -urllib3==2.8.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # requests - # responses -vine==5.1.0 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # amqp - # celery - # kombu -virtualenv==21.14.8 - # via tox -wcwidth==0.9.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # prompt-toolkit -webencodings==0.6.1 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # bleach -wheel==0.48.0 - # via - # -r requirements/dev.in - # pip-tools -xmlsec==1.3.14 - # via - # -r requirements/doc.txt - # -r requirements/test-master.txt - # -r requirements/test.txt - # python3-saml - -# The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools diff --git a/requirements/doc.in b/requirements/doc.in deleted file mode 100644 index 72fcc4f2ea..0000000000 --- a/requirements/doc.in +++ /dev/null @@ -1,15 +0,0 @@ -# Requirements for documentation validation - --c constraints.txt --r test-master.txt - -doc8 # reStructuredText style checker -docutils -edx-braze-client -pytest -factory-boy -readme_renderer # Validates README.rst for usage on PyPI -Sphinx # Documentation builder -sphinx-book-theme # Common theme for all Open edX projects -sphinxcontrib-mermaid # Renders mermaid diagrams in docs -myst-parser # Markdown (MyST) support for Sphinx docs diff --git a/requirements/doc.txt b/requirements/doc.txt deleted file mode 100644 index b5b02c18ee..0000000000 --- a/requirements/doc.txt +++ /dev/null @@ -1,696 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -accessible-pygments==0.0.5 - # via pydata-sphinx-theme -alabaster==1.0.0 - # via sphinx -amqp==5.4.0 - # via - # -r requirements/test-master.txt - # kombu -aniso8601==10.0.1 - # via - # -r requirements/test-master.txt - # tincan -anyio==4.15.1 - # via - # -r requirements/test-master.txt - # httpx -asgiref==3.12.1 - # via - # -r requirements/test-master.txt - # django - # django-countries -attrs==26.1.0 - # via - # -r requirements/test-master.txt - # edx-ace - # openedx-events -babel==2.18.0 - # via - # pydata-sphinx-theme - # sphinx -bcrypt==5.0.0 - # via - # -r requirements/test-master.txt - # paramiko -beautifulsoup4==4.15.0 - # via pydata-sphinx-theme -billiard==4.3.0 - # via - # -r requirements/test-master.txt - # celery -bleach==6.4.0 - # via -r requirements/test-master.txt -cachecontrol==0.14.4 - # via - # -r requirements/test-master.txt - # firebase-admin -celery==5.6.3 - # via -r requirements/test-master.txt -certifi==2026.7.22 - # via - # -r requirements/test-master.txt - # httpcore - # httpx - # requests -cffi==2.1.1 ; platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # cryptography - # pynacl -charset-normalizer==3.5.1 - # via - # -r requirements/test-master.txt - # requests -click==8.5.0 - # via - # -r requirements/test-master.txt - # celery - # click-didyoumean - # click-plugins - # click-repl - # code-annotations - # edx-django-utils -click-didyoumean==0.3.1 - # via - # -r requirements/test-master.txt - # celery -click-plugins==1.1.1.2 - # via - # -r requirements/test-master.txt - # celery -click-repl==0.4.0 - # via - # -r requirements/test-master.txt - # celery -code-annotations==3.0.0 - # via - # -r requirements/test-master.txt - # edx-toggles -cryptography==50.0.1 - # via - # -r requirements/test-master.txt - # django-fernet-fields-v2 - # google-auth - # jwcrypto - # paramiko - # pgpy - # pyjwt - # social-auth-core -defusedxml==0.7.1 - # via - # -r requirements/test-master.txt - # djangorestframework-xml - # python3-openid - # social-auth-core -django==5.2.17 - # via - # -r requirements/test-master.txt - # django-config-models - # django-crum - # django-fernet-fields-v2 - # django-filter - # django-ipware - # django-model-utils - # django-multi-email-field - # django-oauth-toolkit - # django-push-notifications - # django-simple-history - # django-waffle - # djangorestframework - # drf-jwt - # drf-yasg - # edx-ace - # edx-api-doc-tools - # edx-braze-client - # edx-django-utils - # edx-drf-extensions - # edx-rbac - # edx-toggles - # jsonfield - # openedx-events - # openedx-filters - # social-auth-app-django -django-cache-memoize==0.2.1 - # via -r requirements/test-master.txt -django-config-models==3.0.0 - # via -r requirements/test-master.txt -django-countries==9.1.0 - # via -r requirements/test-master.txt -django-crum==0.7.9 - # via - # -r requirements/test-master.txt - # edx-django-utils - # edx-rbac - # edx-toggles -django-fernet-fields-v2==0.9 - # via -r requirements/test-master.txt -django-filter==26.1 - # via -r requirements/test-master.txt -django-ipware==8.0.0 - # via -r requirements/test-master.txt -django-model-utils==5.0.0 - # via - # -r requirements/test-master.txt - # edx-rbac -django-multi-email-field==0.8.0 - # via -r requirements/test-master.txt -django-oauth-toolkit==1.7.1 - # via -r requirements/test-master.txt -django-object-actions==5.1.2 - # via -r requirements/test-master.txt -django-push-notifications==3.3.0 - # via - # -r requirements/test-master.txt - # edx-ace -django-simple-history==3.12.0 - # via -r requirements/test-master.txt -django-waffle==5.0.0 - # via - # -r requirements/test-master.txt - # edx-django-utils - # edx-drf-extensions - # edx-toggles -djangorestframework==3.17.2 - # via - # -r requirements/test-master.txt - # django-config-models - # drf-jwt - # drf-yasg - # edx-api-doc-tools - # edx-drf-extensions -djangorestframework-xml==2.0.0 - # via -r requirements/test-master.txt -dnspython==2.8.0 - # via - # -r requirements/test-master.txt - # pymongo -doc8==2.0.0 - # via -r requirements/doc.in -docutils==0.21.2 - # via - # -r requirements/doc.in - # doc8 - # myst-parser - # pydata-sphinx-theme - # readme-renderer - # restructuredtext-lint - # sphinx -drf-jwt==1.19.2 - # via - # -r requirements/test-master.txt - # edx-drf-extensions -drf-yasg==1.21.15 - # via - # -r requirements/test-master.txt - # edx-api-doc-tools -edx-ace==1.15.0 - # via - # -r requirements/test-master.txt - # edx-braze-client -edx-api-doc-tools==3.0.0 - # via -r requirements/test-master.txt -edx-braze-client==1.1.4 - # via - # -r requirements/doc.in - # -r requirements/test-master.txt -edx-ccx-keys==2.0.2 - # via - # -r requirements/test-master.txt - # openedx-events -edx-django-utils==8.0.2 - # via - # -r requirements/test-master.txt - # django-config-models - # edx-ace - # edx-braze-client - # edx-drf-extensions - # edx-rest-api-client - # edx-toggles - # openedx-events -edx-drf-extensions==10.9.0 - # via - # -r requirements/test-master.txt - # edx-rbac -edx-opaque-keys[django]==4.0.0 - # via - # -r requirements/test-master.txt - # edx-ccx-keys - # edx-drf-extensions - # openedx-events - # openedx-filters -edx-rbac==3.0.0 - # via -r requirements/test-master.txt -edx-rest-api-client==7.1.0 - # via -r requirements/test-master.txt -edx-toggles==6.0.0 - # via -r requirements/test-master.txt -factory-boy==3.3.3 - # via - # -c requirements/constraints.txt - # -r requirements/doc.in -faker==40.43.0 - # via factory-boy -fastavro==1.12.2 - # via - # -r requirements/test-master.txt - # openedx-events -firebase-admin==7.7.0 - # via - # -r requirements/test-master.txt - # edx-ace -google-api-core[grpc]==2.39.0 - # via - # -r requirements/test-master.txt - # firebase-admin - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-auth==2.59.0 - # via - # -r requirements/test-master.txt - # google-api-core - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-cloud-core==2.7.0 - # via - # -r requirements/test-master.txt - # google-cloud-firestore - # google-cloud-storage -google-cloud-firestore==2.32.0 ; platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # firebase-admin -google-cloud-storage==3.15.0 - # via - # -r requirements/test-master.txt - # firebase-admin -google-crc32c==1.9.0 - # via - # -r requirements/test-master.txt - # google-cloud-storage - # google-resumable-media -google-resumable-media==2.10.2 - # via - # -r requirements/test-master.txt - # google-cloud-storage -googleapis-common-protos==1.75.4 - # via - # -r requirements/test-master.txt - # google-api-core - # grpcio-status -grpcio==1.84.0 ; platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # google-api-core - # google-cloud-firestore - # grpcio-status -grpcio-status==1.84.0 ; platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # google-api-core -h11==0.16.0 - # via - # -r requirements/test-master.txt - # httpcore -h2==4.4.1 - # via - # -r requirements/test-master.txt - # httpx -hpack==4.2.0 - # via - # -r requirements/test-master.txt - # h2 -httpcore==1.0.9 - # via - # -r requirements/test-master.txt - # httpx -httpx[http2]==0.28.1 - # via - # -r requirements/test-master.txt - # firebase-admin -hyperframe==6.1.0 - # via - # -r requirements/test-master.txt - # h2 -idna==3.20 - # via - # -r requirements/test-master.txt - # anyio - # httpx - # requests -imagesize==2.0.1 - # via sphinx -inflection==0.5.1 - # via - # -r requirements/test-master.txt - # drf-yasg -iniconfig==2.3.1 - # via pytest -invoke==3.0.3 - # via - # -r requirements/test-master.txt - # paramiko -isodate==0.7.2 - # via - # -r requirements/test-master.txt - # python3-saml -jinja2==3.1.6 - # via - # -r requirements/test-master.txt - # code-annotations - # myst-parser - # pydata-sphinx-theme - # sphinx - # sphinxcontrib-mermaid -jsondiff==2.2.1 - # via -r requirements/test-master.txt -jsonfield==3.2.0 - # via -r requirements/test-master.txt -jwcrypto==1.6.1 - # via - # -r requirements/test-master.txt - # django-oauth-toolkit -kombu==5.6.2 - # via - # -r requirements/test-master.txt - # celery -lxml==5.3.2 - # via - # -r requirements/test-master.txt - # python3-saml - # xmlsec -markdown-it-py==4.2.0 - # via - # mdit-py-plugins - # myst-parser -markupsafe==3.0.3 - # via - # -r requirements/test-master.txt - # jinja2 -mdit-py-plugins==0.6.1 - # via myst-parser -mdurl==0.1.2 - # via markdown-it-py -msgpack==1.2.2 - # via - # -r requirements/test-master.txt - # cachecontrol -myst-parser==5.1.0 - # via -r requirements/doc.in -nh3==0.3.7 - # via readme-renderer -oauthlib==4.0.0 - # via - # -r requirements/test-master.txt - # django-oauth-toolkit - # requests-oauthlib - # social-auth-core -openedx-atlas==0.7.1 - # via -r requirements/test-master.txt -openedx-events==11.2.0 - # via -r requirements/test-master.txt -openedx-filters==3.14.0 - # via -r requirements/test-master.txt -opentelemetry-api==1.45.0 - # via - # -r requirements/test-master.txt - # google-api-core -packaging==26.3 - # via - # -r requirements/test-master.txt - # drf-yasg - # kombu - # pytest - # sphinx -paramiko==5.0.0 - # via -r requirements/test-master.txt -path==16.11.0 - # via - # -r requirements/test-master.txt - # path-py -path-py==12.5.0 - # via -r requirements/test-master.txt -pgpy==0.6.0 - # via -r requirements/test-master.txt -pillow==12.3.0 - # via -r requirements/test-master.txt -pluggy==1.7.0 - # via pytest -prompt-toolkit==3.0.53 - # via - # -r requirements/test-master.txt - # click-repl -proto-plus==1.28.4 - # via - # -r requirements/test-master.txt - # google-api-core - # google-cloud-firestore -protobuf==7.36.2 - # via - # -r requirements/test-master.txt - # google-api-core - # google-cloud-firestore - # googleapis-common-protos - # grpcio-status - # proto-plus -psutil==7.2.2 - # via - # -r requirements/test-master.txt - # edx-django-utils -pyasn1==0.6.4 - # via - # -r requirements/test-master.txt - # pgpy - # pyasn1-modules -pyasn1-modules==0.4.2 - # via - # -r requirements/test-master.txt - # google-auth -pycparser==3.0 ; implementation_name != "PyPy" and platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # cffi -pydata-sphinx-theme==0.20.0 - # via sphinx-book-theme -pygments==2.21.0 - # via - # accessible-pygments - # doc8 - # pydata-sphinx-theme - # pytest - # readme-renderer - # sphinx -pyjwt[crypto]==2.15.1 - # via - # -r requirements/test-master.txt - # drf-jwt - # edx-drf-extensions - # edx-rest-api-client - # firebase-admin - # social-auth-core -pymongo==4.4.0 - # via - # -r requirements/test-master.txt - # edx-opaque-keys -pynacl==1.6.2 - # via - # -r requirements/test-master.txt - # edx-django-utils - # paramiko -pytest==9.1.1 - # via -r requirements/doc.in -python-dateutil==2.9.0.post0 - # via - # -r requirements/test-master.txt - # celery - # edx-ace -python-ipware==4.1.0 - # via - # -r requirements/test-master.txt - # django-ipware -python-slugify==9.1.2 - # via - # -r requirements/test-master.txt - # code-annotations -python3-openid==3.2.0 - # via - # -r requirements/test-master.txt - # social-auth-core -python3-saml==1.16.0 - # via -r requirements/test-master.txt -pytz==2026.4 - # via - # -r requirements/test-master.txt - # drf-yasg - # tincan -pyyaml==6.0.3 - # via - # -r requirements/test-master.txt - # code-annotations - # drf-yasg - # jsondiff - # myst-parser - # sphinxcontrib-mermaid -readme-renderer==46.0 - # via -r requirements/doc.in -requests==2.34.2 - # via - # -r requirements/test-master.txt - # cachecontrol - # django-oauth-toolkit - # edx-braze-client - # edx-drf-extensions - # edx-rest-api-client - # google-api-core - # google-cloud-storage - # pydata-sphinx-theme - # requests-oauthlib - # sailthru-client - # slumber - # social-auth-core - # sphinx -requests-oauthlib==2.0.0 - # via - # -r requirements/test-master.txt - # social-auth-core -restructuredtext-lint==2.0.2 - # via doc8 -roman-numerals==4.1.0 - # via roman-numerals-py -roman-numerals-py==4.1.0 - # via sphinx -rules==3.5 - # via -r requirements/test-master.txt -sailthru-client==2.2.3 - # via - # -r requirements/test-master.txt - # edx-ace -semantic-version==2.10.0 - # via - # -r requirements/test-master.txt - # edx-drf-extensions -simplejson==4.1.2 - # via - # -r requirements/test-master.txt - # sailthru-client -six==1.17.0 - # via - # -r requirements/test-master.txt - # edx-ace - # edx-ccx-keys - # edx-rbac - # python-dateutil -slumber==0.7.1 - # via -r requirements/test-master.txt -snowballstemmer==3.1.1 - # via sphinx -social-auth-app-django==5.4.1 - # via -r requirements/test-master.txt -social-auth-core==4.9.1 - # via - # -r requirements/test-master.txt - # social-auth-app-django -soupsieve==3.0.3 - # via beautifulsoup4 -sphinx==8.2.3 - # via - # -c requirements/constraints.txt - # -r requirements/doc.in - # myst-parser - # pydata-sphinx-theme - # sphinx-book-theme - # sphinxcontrib-mermaid -sphinx-book-theme==1.4.0 - # via -r requirements/doc.in -sphinxcontrib-applehelp==2.0.0 - # via sphinx -sphinxcontrib-devhelp==2.0.0 - # via sphinx -sphinxcontrib-htmlhelp==2.1.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-mermaid==2.1.1 - # via -r requirements/doc.in -sphinxcontrib-qthelp==2.0.0 - # via sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via sphinx -sqlparse==0.6.0 - # via - # -r requirements/test-master.txt - # django -stevedore==5.9.1 - # via - # -r requirements/test-master.txt - # code-annotations - # doc8 - # edx-ace - # edx-django-utils - # edx-opaque-keys -testfixtures==12.3.0 - # via -r requirements/test-master.txt -text-unidecode==1.3 - # via - # -r requirements/test-master.txt - # python-slugify -tincan==1.0.0 - # via -r requirements/test-master.txt -typing-extensions==4.16.0 - # via - # -r requirements/test-master.txt - # anyio - # beautifulsoup4 - # click-repl - # django-countries - # edx-opaque-keys - # grpcio - # jwcrypto - # opentelemetry-api - # testfixtures -tzdata==2026.4 - # via - # -r requirements/test-master.txt - # kombu -tzlocal==5.4.4 - # via - # -r requirements/test-master.txt - # celery -unicodecsv==0.14.1 - # via -r requirements/test-master.txt -uritemplate==4.2.0 - # via - # -r requirements/test-master.txt - # drf-yasg -urllib3==2.8.0 - # via - # -r requirements/test-master.txt - # requests -vine==5.1.0 - # via - # -r requirements/test-master.txt - # amqp - # celery - # kombu -wcwidth==0.9.1 - # via - # -r requirements/test-master.txt - # prompt-toolkit -webencodings==0.6.1 - # via - # -r requirements/test-master.txt - # bleach -xmlsec==1.3.14 - # via - # -r requirements/test-master.txt - # python3-saml - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/requirements/edx-platform-constraints.txt b/requirements/edx-platform-constraints.txt deleted file mode 100644 index e764fc3302..0000000000 --- a/requirements/edx-platform-constraints.txt +++ /dev/null @@ -1,1307 +0,0 @@ -### DON'T edit this file, it's copied from edx-platform. See make upgrade -# GENERATED FILE, DO NOT EDIT DIRECTLY. -# Compatibility export of [project.dependencies] plus the 'bundled' group -# (optional third-party add-ons installed by default) for tools that still -# 'pip install -r requirements/edx/base.txt' directly instead of using uv. -# Source of truth: [project.dependencies] / [dependency-groups].bundled in pyproject.toml / uv.lock. -# This file was autogenerated by uv via the following command: -# uv export --frozen --no-hashes --no-default-groups --group bundled --no-emit-project -acid-xblock==0.4.1 - # via openedx-platform -aiohappyeyeballs==2.7.1 - # via aiohttp -aiohttp==3.14.3 - # via geoip2 -aiosignal==1.4.0 - # via aiohttp -amqp==5.4.0 - # via kombu -analytics-python==1.4.post1 - # via openedx-platform -aniso8601==10.0.1 - # via - # edx-tincan-py35 - # tincan -annotated-types==0.8.0 - # via pydantic -anyio==4.15.1 - # via httpx -appdirs==1.4.4 - # via fs -asgiref==3.12.1 - # via - # django - # django-cors-headers - # django-countries -asn1crypto==1.5.1 - # via snowflake-connector-python -attrs==26.1.0 - # via - # aiohttp - # edx-ace - # jsonschema - # lti-consumer-xblock - # openedx-authz - # openedx-core - # openedx-events - # openedx-platform - # referencing -babel==2.18.0 - # via - # enmerkar-underscore - # openedx-platform -backoff==1.10.0 - # via analytics-python -bcrypt==5.0.0 - # via paramiko -beautifulsoup4==4.15.0 - # via - # openedx-forum - # pynliner - # xblocks-contrib -billiard==4.3.0 - # via celery -bleach==6.4.0 - # via - # edx-enterprise - # lti-consumer-xblock - # openedx-django-wiki - # ora2 - # xblock-drag-and-drop-v2 - # xblock-poll -boto3==1.43.104 - # via - # django-ses - # fs-s3fs - # openedx-platform - # ora2 - # snowflake-connector-python -botocore==1.43.104 - # via - # boto3 - # openedx-platform - # s3transfer - # snowflake-connector-python -bracex==3.0.1 - # via wcmatch -bridgekeeper==0.9 - # via openedx-platform -cachecontrol==0.14.4 - # via firebase-admin -cachetools==7.2.0 - # via edxval -camel-converter==5.1.1 - # via meilisearch -casbin-django-orm-adapter==1.7.0 - # via openedx-authz -celery==5.6.3 - # via - # django-celery-results - # django-user-tasks - # edx-celeryutils - # edx-enterprise - # enterprise-integrated-channels - # event-tracking - # openedx-core - # openedx-platform -certifi==2026.7.22 - # via - # elasticsearch - # httpcore - # httpx - # requests - # snowflake-connector-python -cffi==2.1.1 ; platform_python_implementation != 'PyPy' - # via - # cryptography - # pynacl -chardet==7.6.0 - # via - # encutils - # pysrt -charset-normalizer==3.5.1 - # via - # requests - # snowflake-connector-python -chem==2.0.0 - # via - # openedx-platform - # xblocks-contrib -click==8.5.0 - # via - # celery - # click-didyoumean - # click-plugins - # click-repl - # code-annotations - # edx-django-utils - # nltk -click-didyoumean==0.3.1 - # via celery -click-plugins==1.1.1.2 - # via celery -click-repl==0.4.0 - # via celery -cloudpickle==3.1.2 - # via joblib -code-annotations==3.0.0 - # via - # edx-enterprise - # edx-toggles -codejail-includes==2.0.0 - # via openedx-platform -colorama==0.4.6 ; sys_platform == 'win32' - # via tqdm -crowdsourcehinter-xblock==1.0.2 -cryptography==50.0.1 - # via - # django-fernet-fields-v2 - # edx-enterprise - # google-auth - # jwcrypto - # openedx-platform - # paramiko - # pgpy - # pyjwt - # pyopenssl - # snowflake-connector-python - # social-auth-core -cssutils==2.15.0 - # via pynliner -defusedxml==0.7.1 - # via - # djangorestframework-xml - # nltk - # openedx-platform - # ora2 - # python3-openid - # social-auth-core - # xblocks-contrib -django==5.2.17 - # via - # casbin-django-orm-adapter - # django-appconf - # django-autocomplete-light - # django-celery-results - # django-classy-tags - # django-config-models - # django-cors-headers - # django-crum - # django-fernet-fields-v2 - # django-filter - # django-ipware - # django-js-asset - # django-method-override - # django-model-utils - # django-multi-email-field - # django-mysql - # django-oauth-toolkit - # django-push-notifications - # django-sekizai - # django-ses - # django-simple-history - # django-statici18n - # django-storages - # django-user-tasks - # django-waffle - # djangorestframework - # done-xblock - # drf-jwt - # drf-spectacular - # drf-spectacular-sidecar - # drf-yasg - # edx-ace - # edx-api-doc-tools - # edx-auth-backends - # edx-bulk-grades - # edx-celeryutils - # edx-completion - # edx-django-release-util - # edx-django-sites-extensions - # edx-django-utils - # edx-drf-extensions - # edx-enterprise - # edx-event-bus-kafka - # edx-event-bus-redis - # edx-i18n-tools - # edx-milestones - # edx-organizations - # edx-proctoring - # edx-rbac - # edx-search - # edx-submissions - # edx-toggles - # edx-when - # edxval - # enmerkar-underscore - # enterprise-integrated-channels - # event-tracking - # help-tokens - # jsonfield - # lti-consumer-xblock - # openedx-authz - # openedx-core - # openedx-django-pyfs - # openedx-django-wiki - # openedx-events - # openedx-filters - # openedx-forum - # openedx-platform - # ora2 - # social-auth-app-django - # super-csv - # xblock-google-drive - # xblocks-contrib - # xss-utils -django-appconf==1.2.0 - # via django-statici18n -django-autocomplete-light==5.0.0 - # via openedx-platform -django-cache-memoize==0.2.1 -django-celery-results==2.6.0 - # via openedx-platform -django-classy-tags==4.1.0 - # via django-sekizai -django-config-models==3.0.0 - # via - # edx-enterprise - # enterprise-integrated-channels - # lti-consumer-xblock - # openedx-platform -django-cors-headers==4.9.0 - # via openedx-platform -django-countries==9.1.0 - # via - # edx-enterprise - # openedx-platform -django-crum==0.7.9 - # via - # edx-django-utils - # edx-enterprise - # edx-proctoring - # edx-rbac - # edx-toggles - # openedx-authz - # openedx-platform - # super-csv -django-fernet-fields-v2==0.9 - # via - # edx-enterprise - # enterprise-integrated-channels -django-filter==26.1 - # via - # edx-enterprise - # lti-consumer-xblock - # openedx-platform -django-ipware==8.0.0 - # via - # edx-enterprise - # edx-proctoring - # openedx-platform -django-js-asset==4.2.0 - # via django-mptt -django-method-override==1.0.4 - # via openedx-platform -django-model-utils==5.0.0 - # via - # django-user-tasks - # edx-bulk-grades - # edx-celeryutils - # edx-completion - # edx-enterprise - # edx-milestones - # edx-organizations - # edx-proctoring - # edx-rbac - # edx-submissions - # edx-when - # edxval - # enterprise-integrated-channels - # openedx-platform - # ora2 - # super-csv -django-mptt==0.18.0 - # via - # openedx-django-wiki - # openedx-platform -django-multi-email-field==0.8.0 -django-mysql==4.19.0 - # via openedx-platform -django-oauth-toolkit==1.7.1 - # via - # edx-enterprise - # enterprise-integrated-channels - # openedx-platform -django-object-actions==5.1.2 - # via - # edx-enterprise - # enterprise-integrated-channels -django-pipeline==4.1.0 - # via openedx-platform -django-push-notifications==3.3.0 - # via edx-ace -django-ratelimit==4.1.0 - # via openedx-platform -django-sekizai==4.1.0 - # via - # openedx-django-wiki - # openedx-platform -django-ses==4.8.0 -django-simple-history==3.12.0 - # via - # edx-enterprise - # edx-organizations - # edx-proctoring - # enterprise-integrated-channels - # openedx-core - # openedx-platform - # ora2 -django-statici18n==2.8.0 - # via - # lti-consumer-xblock - # openedx-platform - # xblock-drag-and-drop-v2 - # xblock-poll -django-storages==1.14.6 - # via - # edxval - # openedx-platform -django-user-tasks==4.0.0 - # via openedx-platform -django-waffle==5.0.0 - # via - # edx-django-utils - # edx-drf-extensions - # edx-enterprise - # edx-proctoring - # edx-toggles - # openedx-authz - # openedx-platform -django-webpack-loader==3.2.4 - # via - # edx-proctoring - # openedx-platform -djangorestframework==3.17.2 - # via - # django-config-models - # django-user-tasks - # drf-jwt - # drf-spectacular - # drf-yasg - # edx-api-doc-tools - # edx-completion - # edx-drf-extensions - # edx-enterprise - # edx-organizations - # edx-proctoring - # edx-submissions - # openedx-authz - # openedx-core - # openedx-forum - # openedx-platform - # ora2 - # super-csv -djangorestframework-xml==2.0.0 -dnspython==2.8.0 - # via pymongo -done-xblock==3.0.1 -drf-jwt==1.19.2 - # via edx-drf-extensions -drf-spectacular==0.30.0 - # via openedx-platform -drf-spectacular-sidecar==2026.9.1 - # via openedx-platform -drf-yasg==1.21.15 - # via - # django-user-tasks - # edx-api-doc-tools -edx-ace==1.15.0 - # via openedx-platform -edx-api-doc-tools==3.0.0 - # via openedx-authz -edx-auth-backends==5.0.0 - # via openedx-platform -edx-bulk-grades==2.0.0 - # via - # openedx-platform - # staff-graded-xblock -edx-ccx-keys==2.0.2 - # via - # lti-consumer-xblock - # openedx-authz - # openedx-events - # openedx-platform -edx-celeryutils==2.0.0 - # via - # openedx-platform - # super-csv -edx-codejail==4.1.1 - # via - # openedx-platform - # xblocks-contrib -edx-completion==5.0.0 - # via openedx-platform -edx-django-release-util==1.5.0 - # via - # edx-submissions - # edxval - # openedx-platform -edx-django-sites-extensions==6.0.0 - # via openedx-platform -edx-django-utils==8.0.2 - # via - # django-config-models - # edx-ace - # edx-auth-backends - # edx-drf-extensions - # edx-enterprise - # edx-event-bus-kafka - # edx-event-bus-redis - # edx-rest-api-client - # edx-toggles - # edx-when - # enterprise-integrated-channels - # event-tracking - # openedx-authz - # openedx-events - # openedx-platform - # ora2 - # super-csv - # xblocks-contrib -edx-drf-extensions==10.9.0 - # via - # edx-completion - # edx-enterprise - # edx-organizations - # edx-proctoring - # edx-rbac - # edx-when - # edxval - # enterprise-integrated-channels - # openedx-authz - # openedx-core - # openedx-platform -edx-enterprise==8.17.0 - # via openedx-platform -edx-event-bus-kafka==6.1.0 - # via openedx-platform -edx-event-bus-redis==1.1.2 - # via openedx-platform -edx-i18n-tools==2.0.0 - # via ora2 -edx-milestones==2.0.0 - # via openedx-platform -edx-opaque-keys==4.0.0 - # via - # edx-bulk-grades - # edx-ccx-keys - # edx-completion - # edx-drf-extensions - # edx-enterprise - # edx-milestones - # edx-organizations - # edx-proctoring - # edx-when - # enterprise-integrated-channels - # lti-consumer-xblock - # openedx-authz - # openedx-events - # openedx-filters - # openedx-platform - # ora2 - # xblock - # xblocks-contrib -edx-organizations==9.0.0 - # via - # openedx-authz - # openedx-core - # openedx-platform -edx-proctoring==5.2.0 - # via openedx-platform -edx-rbac==3.0.0 - # via - # edx-enterprise - # enterprise-integrated-channels -edx-rest-api-client==7.1.0 - # via - # edx-enterprise - # edx-proctoring - # enterprise-integrated-channels - # openedx-platform -edx-search==5.0.3 - # via - # openedx-forum - # openedx-platform -edx-sga==0.29.0 -edx-submissions==4.0.2 - # via - # openedx-platform - # ora2 - # xblocks-contrib -edx-tincan-py35==2.0.0 - # via enterprise-integrated-channels -edx-toggles==6.0.0 - # via - # edx-auth-backends - # edx-completion - # edx-enterprise - # edx-event-bus-kafka - # edx-event-bus-redis - # edx-search - # edxval - # event-tracking - # openedx-platform - # ora2 - # xblocks-contrib -edx-when==4.1.0 - # via - # edx-proctoring - # openedx-platform -edxval==5.0.1 - # via - # openedx-platform - # xblocks-contrib -elasticsearch==7.9.1 - # via - # edx-search - # openedx-forum -encutils==1.0.0 - # via cssutils -enmerkar-underscore==2.4.1 - # via openedx-platform -enterprise-integrated-channels==0.1.70 -event-tracking==4.1.5 - # via - # edx-completion - # edx-proctoring - # edx-search - # openedx-platform -fastavro==1.12.2 - # via openedx-events -filelock==3.32.7 - # via snowflake-connector-python -firebase-admin==7.7.0 - # via edx-ace -frozenlist==1.8.0 - # via - # aiohttp - # aiosignal -fs==2.4.16 - # via - # fs-s3fs - # openedx-django-pyfs - # openedx-platform - # xblock - # xblocks-contrib -fs-s3fs==1.1.1 - # via - # openedx-django-pyfs - # openedx-platform -geoip2==5.3.0 - # via openedx-platform -glob2==0.7 - # via openedx-platform -google-api-core==2.39.0 - # via - # firebase-admin - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-auth==2.59.0 - # via - # google-api-core - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-cloud-core==2.7.0 - # via - # google-cloud-firestore - # google-cloud-storage -google-cloud-firestore==2.32.0 ; platform_python_implementation != 'PyPy' - # via firebase-admin -google-cloud-storage==3.15.0 - # via firebase-admin -google-crc32c==1.9.0 - # via - # google-cloud-storage - # google-resumable-media -google-resumable-media==2.10.2 - # via google-cloud-storage -googleapis-common-protos==1.75.4 - # via - # google-api-core - # grpcio-status -grpcio==1.84.0 ; platform_python_implementation != 'PyPy' - # via - # google-api-core - # google-cloud-firestore - # grpcio-status -grpcio-status==1.84.0 ; platform_python_implementation != 'PyPy' - # via google-api-core -gunicorn==26.2.0 - # via openedx-platform -h11==0.16.0 - # via httpcore -h2==4.4.1 - # via httpx -help-tokens==4.0.0 - # via openedx-platform -hpack==4.2.0 - # via h2 -html5lib==1.1 - # via - # openedx-platform - # ora2 - # xblocks-contrib -httpcore==1.0.9 - # via httpx -httpx==0.28.1 - # via - # firebase-admin - # typesense -hyperframe==6.1.0 - # via h2 -icalendar==7.3.0 - # via openedx-platform -idna==3.20 - # via - # anyio - # httpx - # optimizely-sdk - # requests - # snowflake-connector-python - # yarl -importlib-metadata==9.0.1 - # via openedx-platform -inflection==0.5.1 - # via - # drf-spectacular - # drf-yasg -invoke==3.0.3 - # via paramiko -ipaddress==1.0.23 - # via openedx-platform -isodate==0.7.2 - # via python3-saml -jinja2==3.1.6 - # via code-annotations -jmespath==1.1.0 - # via - # boto3 - # botocore -joblib==1.6.0 - # via nltk -jsondiff==2.2.1 -jsonfield==3.2.0 - # via - # edx-celeryutils - # edx-enterprise - # edx-proctoring - # edx-submissions - # enterprise-integrated-channels - # lti-consumer-xblock - # openedx-platform - # ora2 -jsonschema==4.26.0 - # via - # drf-spectacular - # optimizely-sdk -jsonschema-specifications==2025.9.1 - # via jsonschema -jwcrypto==1.6.1 - # via - # django-oauth-toolkit - # pylti1p3 -kombu==5.6.2 - # via celery -laboratory==1.0.2 - # via openedx-platform -lazy==2.0 - # via - # acid-xblock - # lti-consumer-xblock - # ora2 - # xblock -legacy-cgi==2.6.4 ; python_full_version >= '3.13' - # via webob -lti-consumer-xblock==11.4.1 - # via openedx-platform -lxml==5.3.2 - # via - # edx-enterprise - # edx-i18n-tools - # edxval - # lti-consumer-xblock - # lxml-html-clean - # olxcleaner - # openedx-calc - # openedx-platform - # ora2 - # python3-saml - # xblock - # xblocks-contrib - # xmlsec -lxml-html-clean==0.4.4 - # via lxml -mailsnake==1.6.4 -mako==1.4.3 - # via - # acid-xblock - # lti-consumer-xblock - # openedx-platform - # xblock -markdown==3.11 - # via - # openedx-django-wiki - # openedx-platform - # staff-graded-xblock - # xblock-poll -markupsafe==3.0.3 - # via - # chem - # jinja2 - # mako - # openedx-calc - # xblock - # xblocks-contrib -maxminddb==3.2.0 - # via geoip2 -meilisearch==0.43.0 - # via - # edx-search - # openedx-platform -mongoengine==0.29.3 - # via openedx-platform -monotonic==1.6 - # via analytics-python -more-itertools==11.1.0 - # via cssutils -mpmath==1.3.0 - # via sympy -msgpack==1.2.2 - # via cachecontrol -multidict==6.9.1 - # via - # aiohttp - # yarl -mysqlclient==2.3.0 - # via - # openedx-forum - # openedx-platform -nh3==0.3.7 - # via - # openedx-platform - # xblocks-contrib -nltk==3.10.3 - # via chem -nodeenv==1.11.0 - # via openedx-platform -numpy==1.26.4 - # via - # chem - # openedx-calc - # scipy - # shapely - # xblocks-contrib -oauthlib==4.0.0 - # via - # django-oauth-toolkit - # lti-consumer-xblock - # openedx-platform - # requests-oauthlib - # social-auth-core - # xblocks-contrib -olxcleaner==0.3.0 - # via openedx-platform -openedx-atlas==0.7.1 - # via - # edx-enterprise - # enterprise-integrated-channels - # openedx-authz - # openedx-forum - # openedx-platform -openedx-authz==1.24.0 - # via openedx-platform -openedx-calc==5.0.0 - # via - # openedx-platform - # xblocks-contrib -openedx-core==1.11.0 - # via openedx-platform -openedx-django-pyfs==4.0.0 - # via xblock -openedx-django-require==3.0.0 - # via openedx-platform -openedx-django-wiki==3.1.2 - # via openedx-platform -openedx-events==11.2.0 - # via - # edx-enterprise - # edx-event-bus-kafka - # edx-event-bus-redis - # event-tracking - # lti-consumer-xblock - # openedx-authz - # openedx-core - # openedx-platform - # ora2 -openedx-filters==3.14.0 - # via - # edx-enterprise - # lti-consumer-xblock - # openedx-platform - # ora2 -openedx-forum==0.5.0 - # via openedx-platform -opentelemetry-api==1.45.0 - # via google-api-core -optimizely-sdk==5.7.0 -ora2==7.1.1 -packaging==26.3 - # via - # drf-yasg - # kombu - # snowflake-connector-python - # wheel -paramiko==5.0.0 -path==16.11.0 - # via - # edx-i18n-tools - # openedx-platform - # path-py - # xblocks-contrib -path-py==12.5.0 - # via - # edx-enterprise - # ora2 - # staff-graded-xblock -pgpy==0.6.0 -piexif==1.1.3 - # via openedx-platform -pillow==12.3.0 - # via - # edx-enterprise - # edx-organizations - # edxval - # openedx-platform -platformdirs==4.12.1 - # via snowflake-connector-python -polib==1.2.0 - # via edx-i18n-tools -prompt-toolkit==3.0.53 - # via click-repl -propcache==0.5.4 - # via - # aiohttp - # yarl -proto-plus==1.28.4 - # via - # google-api-core - # google-cloud-firestore -protobuf==7.36.2 - # via - # google-api-core - # google-cloud-firestore - # googleapis-common-protos - # grpcio-status - # proto-plus -psutil==7.2.2 - # via - # edx-django-utils - # openedx-platform -psycopg2-binary==2.9.13 - # via openedx-platform -pyasn1==0.6.4 - # via - # pgpy - # pyasn1-modules -pyasn1-modules==0.4.2 - # via google-auth -pycasbin==2.8.0 - # via - # casbin-django-orm-adapter - # openedx-authz -pycountry==26.2.16 - # via openedx-platform -pycparser==3.0 ; implementation_name != 'PyPy' and platform_python_implementation != 'PyPy' - # via cffi -pycryptodomex==3.23.0 - # via - # edx-proctoring - # lti-consumer-xblock - # openedx-platform -pydantic==2.13.5 - # via camel-converter -pydantic-core==2.46.5 - # via pydantic -pyjwt==2.15.1 - # via - # drf-jwt - # edx-auth-backends - # edx-drf-extensions - # edx-proctoring - # edx-rest-api-client - # firebase-admin - # lti-consumer-xblock - # openedx-platform - # pylti1p3 - # snowflake-connector-python - # social-auth-core -pylatexenc==2.11 - # via olxcleaner -pylti1p3==2.0.0 - # via openedx-platform -pymemcache==4.0.0 - # via openedx-platform -pymongo==4.4.0 - # via - # edx-opaque-keys - # event-tracking - # mongoengine - # openedx-forum - # openedx-platform -pynacl==1.6.2 - # via - # edx-django-utils - # paramiko -pynliner==0.8.0 - # via openedx-platform -pyopenssl==26.4.0 - # via snowflake-connector-python -pyparsing==3.3.3 - # via - # chem - # openedx-calc - # xblocks-contrib -pyrsistent==0.20.0 - # via optimizely-sdk -pysrt==1.1.2 - # via - # edxval - # openedx-platform -python-dateutil==2.9.0.post0 - # via - # analytics-python - # botocore - # celery - # edx-ace - # edx-enterprise - # edx-proctoring - # icalendar - # olxcleaner - # openedx-platform - # ora2 - # xblock -python-ipware==4.1.0 - # via django-ipware -python-slugify==9.1.2 - # via code-annotations -python-swiftclient==4.11.0 - # via ora2 -python3-openid==3.2.0 - # via - # openedx-platform - # social-auth-core -python3-saml==1.16.0 - # via - # edx-enterprise - # openedx-platform -pytz==2026.4 - # via - # drf-yasg - # edx-completion - # edx-enterprise - # edx-proctoring - # edx-submissions - # edx-tincan-py35 - # enterprise-integrated-channels - # event-tracking - # olxcleaner - # openedx-platform - # ora2 - # snowflake-connector-python - # tincan - # xblock - # xblocks-contrib -pyuca==1.2 - # via openedx-platform -pyyaml==6.0.3 - # via - # code-annotations - # drf-spectacular - # drf-yasg - # edx-django-release-util - # edx-i18n-tools - # jsondiff - # openedx-platform - # xblock -random2==1.0.2 - # via - # openedx-platform - # xblocks-contrib -recommender-xblock==5.1.0 -redis==8.1.0 - # via - # openedx-platform - # walrus -referencing==0.37.0 - # via - # jsonschema - # jsonschema-specifications -regex==2026.9.29 - # via nltk -requests==2.34.2 - # via - # analytics-python - # cachecontrol - # django-oauth-toolkit - # edx-bulk-grades - # edx-drf-extensions - # edx-enterprise - # edx-rest-api-client - # enterprise-integrated-channels - # geoip2 - # google-api-core - # google-cloud-storage - # mailsnake - # meilisearch - # openedx-forum - # optimizely-sdk - # pylti1p3 - # python-swiftclient - # requests-oauthlib - # sailthru-client - # slumber - # snowflake-connector-python - # social-auth-core - # xblock-google-drive - # xblocks-contrib -requests-oauthlib==2.0.0 - # via - # openedx-platform - # social-auth-core -rpds-py==2026.6.3 - # via - # jsonschema - # referencing -rules==3.5 - # via - # edx-enterprise - # edx-proctoring - # openedx-core - # openedx-platform -s3transfer==0.19.2 - # via boto3 -sailthru-client==2.2.3 - # via edx-ace -scipy==1.17.1 - # via chem -semantic-version==2.10.0 - # via edx-drf-extensions -setuptools==81.0.0 - # via - # django-pipeline - # edx-api-doc-tools - # edx-completion - # edx-milestones - # edx-organizations - # edx-rbac - # fs - # openedx-events - # openedx-filters -shapely==2.1.2 - # via - # openedx-platform - # xblocks-contrib -simpleeval==1.0.8 - # via pycasbin -simplejson==4.1.2 - # via - # openedx-platform - # sailthru-client - # super-csv - # xblock - # xblocks-contrib -six==1.17.0 - # via - # analytics-python - # crowdsourcehinter-xblock - # edx-ace - # edx-auth-backends - # edx-ccx-keys - # edx-codejail - # edx-django-release-util - # edx-milestones - # edx-rbac - # event-tracking - # fs - # fs-s3fs - # html5lib - # openedx-platform - # python-dateutil -slumber==0.7.1 - # via - # edx-bulk-grades - # edx-enterprise - # enterprise-integrated-channels - # openedx-platform -snowflake-connector-python==4.7.5 - # via enterprise-integrated-channels -social-auth-app-django==5.4.1 - # via - # edx-auth-backends - # edx-enterprise - # openedx-platform -social-auth-core==4.9.1 - # via - # edx-auth-backends - # openedx-platform - # social-auth-app-django -sorl-thumbnail==13.1.0 - # via - # openedx-django-wiki - # openedx-platform -sortedcontainers==2.4.0 - # via - # openedx-platform - # snowflake-connector-python -soupsieve==2.10 - # via beautifulsoup4 -sqlparse==0.6.0 - # via django -staff-graded-xblock==4.0.1 -stevedore==5.9.1 - # via - # code-annotations - # edx-ace - # edx-django-utils - # edx-enterprise - # edx-opaque-keys - # openedx-platform -super-csv==5.0.0 - # via edx-bulk-grades -sympy==1.14.0 - # via openedx-calc -testfixtures==12.3.0 -text-unidecode==1.3 - # via python-slugify -tincan==1.0.0 -tinycss2==1.5.1 - # via bleach -tomlkit==0.15.1 - # via - # openedx-core - # snowflake-connector-python -tqdm==4.70.1 - # via nltk -typesense==2.0.0 - # via - # edx-search - # openedx-forum -typing-extensions==4.16.0 - # via - # aiohttp - # aiosignal - # anyio - # beautifulsoup4 - # click-repl - # django-countries - # edx-opaque-keys - # grpcio - # icalendar - # jwcrypto - # opentelemetry-api - # pydantic - # pydantic-core - # pylti1p3 - # pyopenssl - # referencing - # snowflake-connector-python - # testfixtures - # typesense - # typing-inspection -typing-inspection==0.4.4 - # via pydantic -tzdata==2026.4 - # via - # django - # icalendar - # kombu - # tzlocal -tzlocal==5.4.4 - # via celery -unicodecsv==0.14.1 - # via - # edx-enterprise - # enterprise-integrated-channels - # openedx-platform -unicodeit==0.7.5 - # via openedx-platform -uritemplate==4.2.0 - # via - # drf-spectacular - # drf-yasg -urllib3==2.8.0 - # via - # botocore - # elasticsearch - # requests -vine==5.1.0 - # via - # amqp - # celery - # kombu -voluptuous==0.16.0 - # via ora2 -walrus==0.9.8 - # via edx-event-bus-redis -wcmatch==11.0.1 - # via pycasbin -wcwidth==0.9.1 - # via prompt-toolkit -web-fragments==4.0.0 - # via openedx-platform -webencodings==0.6.1 - # via - # bleach - # html5lib - # tinycss2 -webob==1.8.11 - # via - # openedx-platform - # xblock - # xblocks-contrib -wheel==0.48.0 - # via django-pipeline -wrapt==2.5.0 - # via - # openedx-platform - # xblocks-contrib -xblock==6.3.3 - # via - # acid-xblock - # crowdsourcehinter-xblock - # done-xblock - # edx-completion - # edx-sga - # edx-when - # lti-consumer-xblock - # openedx-platform - # ora2 - # staff-graded-xblock - # xblock-drag-and-drop-v2 - # xblock-google-drive - # xblock-poll - # xblocks-contrib -xblock-drag-and-drop-v2==5.1.1 -xblock-google-drive==0.8.2 -xblock-poll==1.16.1 -xblocks-contrib==1.0.6 -xmlsec==1.3.14 - # via python3-saml -xss-utils==1.0.0 - # via openedx-platform -yarl==1.25.1 - # via aiohttp -zipp==4.1.0 - # via importlib-metadata diff --git a/requirements/js_test.in b/requirements/js_test.in deleted file mode 100644 index fcf734eddf..0000000000 --- a/requirements/js_test.in +++ /dev/null @@ -1,10 +0,0 @@ -# Requirements for Jasmine javascript testing framework - --c constraints.txt - -jaraco.classes -jaraco.collections -jaraco.functools -jasmine -tempora - diff --git a/requirements/js_test.txt b/requirements/js_test.txt deleted file mode 100644 index b1593f669a..0000000000 --- a/requirements/js_test.txt +++ /dev/null @@ -1,119 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -annotated-doc==0.0.5 - # via typer -attrs==26.1.0 - # via - # outcome - # trio -certifi==2026.7.22 - # via selenium -cheroot==11.1.2 - # via cherrypy -cherrypy==18.10.0 - # via jasmine -glob2==0.7 - # via jasmine-core -h11==0.16.0 - # via wsproto -idna==3.20 - # via trio -jaraco-classes==3.4.0 - # via -r requirements/js_test.in -jaraco-collections==5.2.1 - # via - # -r requirements/js_test.in - # cherrypy - # tempora -jaraco-context==6.1.2 - # via - # jaraco-text - # tempora -jaraco-functools==4.6.0 - # via - # -r requirements/js_test.in - # cheroot - # jaraco-text - # tempora -jaraco-text==4.3.0 - # via jaraco-collections -jasmine==3.99.0 - # via -r requirements/js_test.in -jasmine-core==3.99.0 - # via jasmine -jinja2==2.11.3 - # via jasmine -markdown-it-py==4.2.0 - # via rich -markupsafe==3.0.4 - # via jinja2 -mdurl==0.1.2 - # via markdown-it-py -more-itertools==11.2.1 - # via - # cheroot - # cherrypy - # jaraco-classes - # jaraco-functools - # jaraco-text -ordereddict==1.1 - # via jasmine-core -outcome==1.3.0.post0 - # via - # trio - # trio-websocket -portend==3.2.1 - # via cherrypy -pygments==2.21.0 - # via rich -pysocks==1.7.1 - # via urllib3 -python-dateutil==2.9.0.post0 - # via tempora -pyyaml==6.0.3 - # via jasmine -rich==15.0.0 - # via typer -selenium==4.51.0 - # via jasmine -shellingham==1.5.4 - # via typer -six==1.17.0 - # via python-dateutil -sniffio==1.3.1 - # via trio -sortedcontainers==2.4.0 - # via trio -tempora==5.13.0 - # via - # -r requirements/js_test.in - # portend -trio==0.34.0 - # via - # selenium - # trio-websocket -trio-websocket==0.12.2 - # via selenium -typer==0.27.3 - # via typer-slim -typer-slim==0.24.0 - # via jaraco-text -typing-extensions==4.16.0 - # via - # selenium - # tempora -urllib3[socks]==2.8.0 - # via selenium -websocket-client==1.9.2 - # via selenium -wsproto==1.3.2 - # via trio-websocket -zc-lockfile==4.0 - # via cherrypy - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/requirements/pip-tools.in b/requirements/pip-tools.in deleted file mode 100644 index 0295d2c8e9..0000000000 --- a/requirements/pip-tools.in +++ /dev/null @@ -1,5 +0,0 @@ -# Just the dependencies to run pip-tools, mainly for the "upgrade" make target - --c constraints.txt - -pip-tools # Contains pip-compile, used to generate pip requirements files diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt deleted file mode 100644 index 4fb32ea1be..0000000000 --- a/requirements/pip-tools.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -build==1.6.1 - # via pip-tools -click==8.5.0 - # via pip-tools -packaging==26.3 - # via - # build - # wheel -pip-tools==7.6.2 - # via -r requirements/pip-tools.in -pyproject-hooks==1.3.3 - # via - # build - # pip-tools -wheel==0.48.0 - # via pip-tools - -# The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools diff --git a/requirements/pip.in b/requirements/pip.in deleted file mode 100644 index 716c6f2837..0000000000 --- a/requirements/pip.in +++ /dev/null @@ -1,6 +0,0 @@ -# Core dependencies for installing other packages --c constraints.txt - -pip -setuptools -wheel diff --git a/requirements/pip.txt b/requirements/pip.txt deleted file mode 100644 index 360bb36f2f..0000000000 --- a/requirements/pip.txt +++ /dev/null @@ -1,18 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -packaging==26.3 - # via wheel -wheel==0.48.0 - # via -r requirements/pip.in - -# The following packages are considered to be unsafe in a requirements file: -pip==26.1.2 - # via - # -c requirements/constraints.txt - # -r requirements/pip.in -setuptools==84.0.0 - # via -r requirements/pip.in diff --git a/requirements/private.readme b/requirements/private.readme deleted file mode 100644 index 5600a1075b..0000000000 --- a/requirements/private.readme +++ /dev/null @@ -1,15 +0,0 @@ -# If there are any Python packages you want to keep in your virtualenv beyond -# those listed in the official requirements files, create a "private.in" file -# and list them there. Generate the corresponding "private.txt" file pinning -# all of their indirect dependencies to specific versions as follows: - -# pip-compile private.in - -# This allows you to use "pip-sync" without removing these packages: - -# pip-sync requirements/*.txt - -# "private.in" and "private.txt" aren't checked into git to avoid merge -# conflicts, and the presence of this file allows "private.*" to be -# included in scripted pip-sync usage without requiring that those files be -# created first. diff --git a/requirements/sync_platform_constraints.py b/requirements/sync_platform_constraints.py new file mode 100644 index 0000000000..94eb96fd08 --- /dev/null +++ b/requirements/sync_platform_constraints.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +""" +Merge openedx-platform's pinned package versions into [tool.uv].constraint-dependencies. + +edx-enterprise runs as a plugin inside edx-platform, so its tests should only +run against package versions that edx-platform actually deploys in production. +This fetches edx-platform's own compiled requirements, extracts the pins, and +merges them into pyproject.toml's [tool.uv].constraint-dependencies -- run this +*after* `edx_lint write_uv_constraints` (which owns/overwrites that same list) +so the platform pins layer on top of it, and before `uv lock --upgrade`. + +Repo-specific overrides in [tool.edx_lint].uv_constraints always win over a +platform pin for the same package -- see the precedence comment on +[tool.uv].constraint-dependencies in pyproject.toml. +""" +import re +import sys +import urllib.request + +import tomlkit + +PLATFORM_BASE_REQS = "https://raw.githubusercontent.com/openedx/openedx-platform/master/requirements/edx/base.txt" +PYPROJECT_PATH = "pyproject.toml" +SELF_PACKAGE = "edx-enterprise" + +# Packages where a platform pin is a *global* uv constraint (applies to every +# dependency-group, unlike a plain pip -c file which only constrains packages +# actually pulled in per-environment) but genuinely conflicts with a package +# only edx-enterprise's own tooling needs -- so we deliberately don't import +# the platform's pin for these. Add a package here (with why) if `uv lock` +# reports it as unsatisfiable after a `make upgrade`. +SKIP_PACKAGES = { + # jasmine (js_test dependency-group) hard-pins pyyaml==3.10; the platform's + # newer pin would make the whole lock unsatisfiable. + "pyyaml", +} + + +def fetch_platform_pins(): + """Download edx-platform's base.txt and yield (pkg, pin) for each pinned package.""" + with urllib.request.urlopen(PLATFORM_BASE_REQS) as response: # noqa: S310 + lines = response.read().decode("utf-8").splitlines() + + for line in lines: + if line.startswith("-e"): + continue + # Package name, optional extras (e.g. "lxml[html-clean]"), then the pin. + match = re.match(r"^([A-Za-z0-9][A-Za-z0-9_.-]*)(?:\[[^\]]*\])?==([^\s;]+)", line) + if not match: + continue + pkg = match.group(1) + if pkg.lower() == SELF_PACKAGE: + # edx-platform pins edx-enterprise itself -- pinning ourselves is circular + # and uv rejects a self-constraint outright. + continue + if pkg.lower() in SKIP_PACKAGES: + continue + yield pkg, match.group(2) + + +def build_constraint_array(existing, added): + """Render constraint-dependencies with the platform-synced pins visibly fenced off. + + Once appended as plain strings, a platform pin is indistinguishable from an + edx_lint-managed one -- a reviewer scanning the 300+ line array has no way to + tell them apart. Wrapping the platform block in comment markers makes that + provenance visible directly in pyproject.toml, not just in the header comment + above the array. + """ + lines = ["constraint-dependencies = ["] + lines += [f' "{item}",' for item in existing] + if added: + lines.append(" # --- begin openedx-platform sync (auto-generated by") + lines.append(" # requirements/sync_platform_constraints.py -- do not hand-edit,") + lines.append(" # re-run `make upgrade` to refresh) ---") + lines += [f' "{item}",' for item in added] + lines.append(" # --- end openedx-platform sync ---") + lines.append("]") + return tomlkit.parse("\n".join(lines))["constraint-dependencies"] + + +def main(): + """Merge openedx-platform's pins into pyproject.toml's constraint-dependencies.""" + with open(PYPROJECT_PATH, encoding="utf-8") as f: + doc = tomlkit.load(f) + + existing = list(doc["tool"]["uv"]["constraint-dependencies"]) + pinned_packages = {re.match(r"^[A-Za-z0-9_.-]+", c).group(0).lower() for c in existing} + + added = [] + for pkg, version in fetch_platform_pins(): + if pkg.lower() in pinned_packages: + continue + pinned_packages.add(pkg.lower()) + added.append(f"{pkg}=={version}") + + doc["tool"]["uv"]["constraint-dependencies"] = build_constraint_array(existing, added) + + with open(PYPROJECT_PATH, "w", encoding="utf-8") as f: + tomlkit.dump(doc, f) + + print(f"Merged {len(added)} openedx-platform pins into [tool.uv].constraint-dependencies.") + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/requirements/test-master.in b/requirements/test-master.in deleted file mode 100644 index db4931c41e..0000000000 --- a/requirements/test-master.in +++ /dev/null @@ -1,10 +0,0 @@ -# -# Requirements installation for various testing purposes. -# - --c edx-platform-constraints.txt --c constraints.txt --r base.in - -edx-api-doc-tools # for installing an api-docs page for enterprise -edx-braze-client \ No newline at end of file diff --git a/requirements/test-master.txt b/requirements/test-master.txt deleted file mode 100644 index c4cc501dda..0000000000 --- a/requirements/test-master.txt +++ /dev/null @@ -1,670 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -amqp==5.4.0 - # via - # -c requirements/edx-platform-constraints.txt - # kombu -aniso8601==10.0.1 - # via - # -c requirements/edx-platform-constraints.txt - # tincan -anyio==4.15.1 - # via - # -c requirements/edx-platform-constraints.txt - # httpx -asgiref==3.12.1 - # via - # -c requirements/edx-platform-constraints.txt - # django - # django-countries -attrs==26.1.0 - # via - # -c requirements/edx-platform-constraints.txt - # edx-ace - # openedx-events -bcrypt==5.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # paramiko -billiard==4.3.0 - # via - # -c requirements/edx-platform-constraints.txt - # celery -bleach==6.4.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -cachecontrol==0.14.4 - # via - # -c requirements/edx-platform-constraints.txt - # firebase-admin -celery==5.6.3 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -certifi==2026.7.22 - # via - # -c requirements/edx-platform-constraints.txt - # httpcore - # httpx - # requests -cffi==2.1.1 ; platform_python_implementation != "PyPy" - # via - # -c requirements/edx-platform-constraints.txt - # cryptography - # pynacl -charset-normalizer==3.5.1 - # via - # -c requirements/edx-platform-constraints.txt - # requests -click==8.5.0 - # via - # -c requirements/edx-platform-constraints.txt - # celery - # click-didyoumean - # click-plugins - # click-repl - # code-annotations - # edx-django-utils -click-didyoumean==0.3.1 - # via - # -c requirements/edx-platform-constraints.txt - # celery -click-plugins==1.1.1.2 - # via - # -c requirements/edx-platform-constraints.txt - # celery -click-repl==0.4.0 - # via - # -c requirements/edx-platform-constraints.txt - # celery -code-annotations==3.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # edx-toggles -cryptography==50.0.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # django-fernet-fields-v2 - # google-auth - # jwcrypto - # paramiko - # pgpy - # pyjwt - # social-auth-core -defusedxml==0.7.1 - # via - # -c requirements/edx-platform-constraints.txt - # djangorestframework-xml - # python3-openid - # social-auth-core -django==5.2.17 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # django-config-models - # django-crum - # django-fernet-fields-v2 - # django-filter - # django-ipware - # django-model-utils - # django-multi-email-field - # django-oauth-toolkit - # django-push-notifications - # django-simple-history - # django-waffle - # djangorestframework - # drf-jwt - # drf-yasg - # edx-ace - # edx-api-doc-tools - # edx-braze-client - # edx-django-utils - # edx-drf-extensions - # edx-rbac - # edx-toggles - # jsonfield - # openedx-events - # openedx-filters - # social-auth-app-django -django-cache-memoize==0.2.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-config-models==3.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-countries==9.1.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-crum==0.7.9 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # edx-django-utils - # edx-rbac - # edx-toggles -django-fernet-fields-v2==0.9 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-filter==26.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-ipware==8.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-model-utils==5.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # edx-rbac -django-multi-email-field==0.8.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-oauth-toolkit==1.7.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-object-actions==5.1.2 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-push-notifications==3.3.0 - # via - # -c requirements/edx-platform-constraints.txt - # edx-ace -django-simple-history==3.12.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -django-waffle==5.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # edx-django-utils - # edx-drf-extensions - # edx-toggles -djangorestframework==3.17.2 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # django-config-models - # drf-jwt - # drf-yasg - # edx-api-doc-tools - # edx-drf-extensions -djangorestframework-xml==2.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -dnspython==2.8.0 - # via - # -c requirements/edx-platform-constraints.txt - # pymongo -drf-jwt==1.19.2 - # via - # -c requirements/edx-platform-constraints.txt - # edx-drf-extensions -drf-yasg==1.21.15 - # via - # -c requirements/edx-platform-constraints.txt - # edx-api-doc-tools -edx-ace==1.15.0 - # via - # -c requirements/edx-platform-constraints.txt - # edx-braze-client -edx-api-doc-tools==3.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/test-master.in -edx-braze-client==1.1.4 - # via -r requirements/test-master.in -edx-ccx-keys==2.0.2 - # via - # -c requirements/edx-platform-constraints.txt - # openedx-events -edx-django-utils==8.0.2 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # django-config-models - # edx-ace - # edx-braze-client - # edx-drf-extensions - # edx-rest-api-client - # edx-toggles - # openedx-events -edx-drf-extensions==10.9.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # edx-rbac -edx-opaque-keys[django]==4.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # edx-ccx-keys - # edx-drf-extensions - # openedx-events - # openedx-filters -edx-rbac==3.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -edx-rest-api-client==7.1.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -edx-toggles==6.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -fastavro==1.12.2 - # via - # -c requirements/edx-platform-constraints.txt - # openedx-events -firebase-admin==7.7.0 - # via - # -c requirements/edx-platform-constraints.txt - # edx-ace -google-api-core[grpc]==2.39.0 - # via - # -c requirements/edx-platform-constraints.txt - # firebase-admin - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-auth==2.59.0 - # via - # -c requirements/edx-platform-constraints.txt - # google-api-core - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-cloud-core==2.7.0 - # via - # -c requirements/edx-platform-constraints.txt - # google-cloud-firestore - # google-cloud-storage -google-cloud-firestore==2.32.0 ; platform_python_implementation != "PyPy" - # via - # -c requirements/edx-platform-constraints.txt - # firebase-admin -google-cloud-storage==3.15.0 - # via - # -c requirements/edx-platform-constraints.txt - # firebase-admin -google-crc32c==1.9.0 - # via - # -c requirements/edx-platform-constraints.txt - # google-cloud-storage - # google-resumable-media -google-resumable-media==2.10.2 - # via - # -c requirements/edx-platform-constraints.txt - # google-cloud-storage -googleapis-common-protos==1.75.4 - # via - # -c requirements/edx-platform-constraints.txt - # google-api-core - # grpcio-status -grpcio==1.84.0 ; platform_python_implementation != "PyPy" - # via - # -c requirements/edx-platform-constraints.txt - # google-api-core - # google-cloud-firestore - # grpcio-status -grpcio-status==1.84.0 ; platform_python_implementation != "PyPy" - # via - # -c requirements/edx-platform-constraints.txt - # google-api-core -h11==0.16.0 - # via - # -c requirements/edx-platform-constraints.txt - # httpcore -h2==4.4.1 - # via - # -c requirements/edx-platform-constraints.txt - # httpx -hpack==4.2.0 - # via - # -c requirements/edx-platform-constraints.txt - # h2 -httpcore==1.0.9 - # via - # -c requirements/edx-platform-constraints.txt - # httpx -httpx[http2]==0.28.1 - # via - # -c requirements/edx-platform-constraints.txt - # firebase-admin -hyperframe==6.1.0 - # via - # -c requirements/edx-platform-constraints.txt - # h2 -idna==3.20 - # via - # -c requirements/edx-platform-constraints.txt - # anyio - # httpx - # requests -inflection==0.5.1 - # via - # -c requirements/edx-platform-constraints.txt - # drf-yasg -invoke==3.0.3 - # via - # -c requirements/edx-platform-constraints.txt - # paramiko -isodate==0.7.2 - # via - # -c requirements/edx-platform-constraints.txt - # python3-saml -jinja2==3.1.6 - # via - # -c requirements/edx-platform-constraints.txt - # code-annotations -jsondiff==2.2.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -jsonfield==3.2.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -jwcrypto==1.6.1 - # via - # -c requirements/edx-platform-constraints.txt - # django-oauth-toolkit -kombu==5.6.2 - # via - # -c requirements/edx-platform-constraints.txt - # celery -lxml==5.3.2 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # python3-saml - # xmlsec -markupsafe==3.0.3 - # via - # -c requirements/edx-platform-constraints.txt - # jinja2 -msgpack==1.2.2 - # via - # -c requirements/edx-platform-constraints.txt - # cachecontrol -oauthlib==4.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # django-oauth-toolkit - # requests-oauthlib - # social-auth-core -openedx-atlas==0.7.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -openedx-events==11.2.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -openedx-filters==3.14.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -opentelemetry-api==1.45.0 - # via - # -c requirements/edx-platform-constraints.txt - # google-api-core -packaging==26.3 - # via - # -c requirements/edx-platform-constraints.txt - # drf-yasg - # kombu -paramiko==5.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -path==16.11.0 - # via - # -c requirements/edx-platform-constraints.txt - # path-py -path-py==12.5.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -pgpy==0.6.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -pillow==12.3.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -prompt-toolkit==3.0.53 - # via - # -c requirements/edx-platform-constraints.txt - # click-repl -proto-plus==1.28.4 - # via - # -c requirements/edx-platform-constraints.txt - # google-api-core - # google-cloud-firestore -protobuf==7.36.2 - # via - # -c requirements/edx-platform-constraints.txt - # google-api-core - # google-cloud-firestore - # googleapis-common-protos - # grpcio-status - # proto-plus -psutil==7.2.2 - # via - # -c requirements/edx-platform-constraints.txt - # edx-django-utils -pyasn1==0.6.4 - # via - # -c requirements/edx-platform-constraints.txt - # pgpy - # pyasn1-modules -pyasn1-modules==0.4.2 - # via - # -c requirements/edx-platform-constraints.txt - # google-auth -pycparser==3.0 ; implementation_name != "PyPy" and platform_python_implementation != "PyPy" - # via - # -c requirements/edx-platform-constraints.txt - # cffi -pyjwt[crypto]==2.15.1 - # via - # -c requirements/edx-platform-constraints.txt - # drf-jwt - # edx-drf-extensions - # edx-rest-api-client - # firebase-admin - # social-auth-core -pymongo==4.4.0 - # via - # -c requirements/edx-platform-constraints.txt - # edx-opaque-keys -pynacl==1.6.2 - # via - # -c requirements/edx-platform-constraints.txt - # edx-django-utils - # paramiko -python-dateutil==2.9.0.post0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # celery - # edx-ace -python-ipware==4.1.0 - # via - # -c requirements/edx-platform-constraints.txt - # django-ipware -python-slugify==9.1.2 - # via - # -c requirements/edx-platform-constraints.txt - # code-annotations -python3-openid==3.2.0 - # via - # -c requirements/edx-platform-constraints.txt - # social-auth-core -python3-saml==1.16.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -pytz==2026.4 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # drf-yasg - # tincan -pyyaml==6.0.3 - # via - # -c requirements/edx-platform-constraints.txt - # code-annotations - # drf-yasg - # jsondiff -requests==2.34.2 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # cachecontrol - # django-oauth-toolkit - # edx-braze-client - # edx-drf-extensions - # edx-rest-api-client - # google-api-core - # google-cloud-storage - # requests-oauthlib - # sailthru-client - # slumber - # social-auth-core -requests-oauthlib==2.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # social-auth-core -rules==3.5 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -sailthru-client==2.2.3 - # via - # -c requirements/edx-platform-constraints.txt - # edx-ace -semantic-version==2.10.0 - # via - # -c requirements/edx-platform-constraints.txt - # edx-drf-extensions -simplejson==4.1.2 - # via - # -c requirements/edx-platform-constraints.txt - # sailthru-client -six==1.17.0 - # via - # -c requirements/edx-platform-constraints.txt - # edx-ace - # edx-ccx-keys - # edx-rbac - # python-dateutil -slumber==0.7.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -social-auth-app-django==5.4.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -social-auth-core==4.9.1 - # via - # -c requirements/edx-platform-constraints.txt - # social-auth-app-django -sqlparse==0.6.0 - # via - # -c requirements/edx-platform-constraints.txt - # django -stevedore==5.9.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in - # code-annotations - # edx-ace - # edx-django-utils - # edx-opaque-keys -testfixtures==12.3.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -text-unidecode==1.3 - # via - # -c requirements/edx-platform-constraints.txt - # python-slugify -tincan==1.0.0 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -typing-extensions==4.16.0 - # via - # -c requirements/edx-platform-constraints.txt - # anyio - # click-repl - # django-countries - # edx-opaque-keys - # grpcio - # jwcrypto - # opentelemetry-api - # testfixtures -tzdata==2026.4 - # via - # -c requirements/edx-platform-constraints.txt - # kombu -tzlocal==5.4.4 - # via - # -c requirements/edx-platform-constraints.txt - # celery -unicodecsv==0.14.1 - # via - # -c requirements/edx-platform-constraints.txt - # -r requirements/base.in -uritemplate==4.2.0 - # via - # -c requirements/edx-platform-constraints.txt - # drf-yasg -urllib3==2.8.0 - # via - # -c requirements/edx-platform-constraints.txt - # requests -vine==5.1.0 - # via - # -c requirements/edx-platform-constraints.txt - # amqp - # celery - # kombu -wcwidth==0.9.1 - # via - # -c requirements/edx-platform-constraints.txt - # prompt-toolkit -webencodings==0.6.1 - # via - # -c requirements/edx-platform-constraints.txt - # bleach -xmlsec==1.3.14 - # via - # -c requirements/edx-platform-constraints.txt - # python3-saml - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/requirements/test.in b/requirements/test.in deleted file mode 100644 index f6e54c95fc..0000000000 --- a/requirements/test.in +++ /dev/null @@ -1,16 +0,0 @@ -# Requirements for test runs. - --c constraints.txt --r test-master.txt - -ddt<1.4.0 # data-driven tests -django-mock-queries # Queryset mocking for DRF viewset tests -diff-cover -django-model-utils # Provides TimeStampedModel abstract base class -factory_boy # Test factory framework -freezegun # Time freezing library -mock # mocking library -pytest-cov # pytest extension for code coverage statistics -pytest-django # pytest extension for better Django support -responses # utility library for mocking out the requests library -testfixtures # Mock objects for unit tests and doc tests diff --git a/requirements/test.txt b/requirements/test.txt deleted file mode 100644 index ff94d7a1b2..0000000000 --- a/requirements/test.txt +++ /dev/null @@ -1,643 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -amqp==5.4.0 - # via - # -r requirements/test-master.txt - # kombu -aniso8601==10.0.1 - # via - # -r requirements/test-master.txt - # tincan -anyio==4.15.1 - # via - # -r requirements/test-master.txt - # httpx -asgiref==3.12.1 - # via - # -r requirements/test-master.txt - # django - # django-countries -attrs==26.1.0 - # via - # -r requirements/test-master.txt - # edx-ace - # openedx-events -bcrypt==5.0.0 - # via - # -r requirements/test-master.txt - # paramiko -billiard==4.3.0 - # via - # -r requirements/test-master.txt - # celery -bleach==6.4.0 - # via -r requirements/test-master.txt -cachecontrol==0.14.4 - # via - # -r requirements/test-master.txt - # firebase-admin -celery==5.6.3 - # via -r requirements/test-master.txt -certifi==2026.7.22 - # via - # -r requirements/test-master.txt - # httpcore - # httpx - # requests -cffi==2.1.1 ; platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # cryptography - # pynacl -chardet==7.6.0 - # via diff-cover -charset-normalizer==3.5.1 - # via - # -r requirements/test-master.txt - # requests -click==8.5.0 - # via - # -r requirements/test-master.txt - # celery - # click-didyoumean - # click-plugins - # click-repl - # code-annotations - # edx-django-utils -click-didyoumean==0.3.1 - # via - # -r requirements/test-master.txt - # celery -click-plugins==1.1.1.2 - # via - # -r requirements/test-master.txt - # celery -click-repl==0.4.0 - # via - # -r requirements/test-master.txt - # celery -code-annotations==3.0.0 - # via - # -r requirements/test-master.txt - # edx-toggles -coverage[toml]==7.16.2 - # via pytest-cov -cryptography==50.0.1 - # via - # -r requirements/test-master.txt - # django-fernet-fields-v2 - # google-auth - # jwcrypto - # paramiko - # pgpy - # pyjwt - # social-auth-core -ddt==1.3.1 - # via -r requirements/test.in -defusedxml==0.7.1 - # via - # -r requirements/test-master.txt - # djangorestframework-xml - # python3-openid - # social-auth-core -diff-cover==10.6.0 - # via -r requirements/test.in - # via - # -r requirements/test-master.txt - # django-config-models - # django-crum - # django-fernet-fields-v2 - # django-filter - # django-ipware - # django-mock-queries - # django-model-utils - # django-multi-email-field - # django-oauth-toolkit - # django-push-notifications - # django-simple-history - # django-waffle - # djangorestframework - # drf-jwt - # drf-yasg - # edx-ace - # edx-api-doc-tools - # edx-braze-client - # edx-django-utils - # edx-drf-extensions - # edx-rbac - # edx-toggles - # jsonfield - # model-bakery - # openedx-events - # openedx-filters - # social-auth-app-django -django-cache-memoize==0.2.1 - # via -r requirements/test-master.txt -django-config-models==3.0.0 - # via -r requirements/test-master.txt -django-countries==9.1.0 - # via -r requirements/test-master.txt -django-crum==0.7.9 - # via - # -r requirements/test-master.txt - # edx-django-utils - # edx-rbac - # edx-toggles -django-fernet-fields-v2==0.9 - # via -r requirements/test-master.txt -django-filter==26.1 - # via -r requirements/test-master.txt -django-ipware==8.0.0 - # via -r requirements/test-master.txt -django-mock-queries==2.4.0 - # via -r requirements/test.in -django-model-utils==5.0.0 - # via - # -r requirements/test-master.txt - # -r requirements/test.in - # edx-rbac -django-multi-email-field==0.8.0 - # via -r requirements/test-master.txt -django-oauth-toolkit==1.7.1 - # via -r requirements/test-master.txt -django-object-actions==5.1.2 - # via -r requirements/test-master.txt -django-push-notifications==3.3.0 - # via - # -r requirements/test-master.txt - # edx-ace -django-simple-history==3.12.0 - # via -r requirements/test-master.txt -django-waffle==5.0.0 - # via - # -r requirements/test-master.txt - # edx-django-utils - # edx-drf-extensions - # edx-toggles -djangorestframework==3.17.2 - # via - # -r requirements/test-master.txt - # django-config-models - # django-mock-queries - # drf-jwt - # drf-yasg - # edx-api-doc-tools - # edx-drf-extensions -djangorestframework-xml==2.0.0 - # via -r requirements/test-master.txt -dnspython==2.8.0 - # via - # -r requirements/test-master.txt - # pymongo -drf-jwt==1.19.2 - # via - # -r requirements/test-master.txt - # edx-drf-extensions -drf-yasg==1.21.15 - # via - # -r requirements/test-master.txt - # edx-api-doc-tools -edx-ace==1.15.0 - # via - # -r requirements/test-master.txt - # edx-braze-client -edx-api-doc-tools==3.0.0 - # via -r requirements/test-master.txt -edx-braze-client==1.1.4 - # via -r requirements/test-master.txt -edx-ccx-keys==2.0.2 - # via - # -r requirements/test-master.txt - # openedx-events -edx-django-utils==8.0.2 - # via - # -r requirements/test-master.txt - # django-config-models - # edx-ace - # edx-braze-client - # edx-drf-extensions - # edx-rest-api-client - # edx-toggles - # openedx-events -edx-drf-extensions==10.9.0 - # via - # -r requirements/test-master.txt - # edx-rbac -edx-opaque-keys[django]==4.0.0 - # via - # -r requirements/test-master.txt - # edx-ccx-keys - # edx-drf-extensions - # openedx-events - # openedx-filters -edx-rbac==3.0.0 - # via -r requirements/test-master.txt -edx-rest-api-client==7.1.0 - # via -r requirements/test-master.txt -edx-toggles==6.0.0 - # via -r requirements/test-master.txt -factory-boy==3.3.3 - # via - # -c requirements/constraints.txt - # -r requirements/test.in -faker==40.43.0 - # via factory-boy -fastavro==1.12.2 - # via - # -r requirements/test-master.txt - # openedx-events -firebase-admin==7.7.0 - # via - # -r requirements/test-master.txt - # edx-ace -freezegun==1.5.5 - # via -r requirements/test.in -google-api-core[grpc]==2.39.0 - # via - # -r requirements/test-master.txt - # firebase-admin - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-auth==2.59.0 - # via - # -r requirements/test-master.txt - # google-api-core - # google-cloud-core - # google-cloud-firestore - # google-cloud-storage -google-cloud-core==2.7.0 - # via - # -r requirements/test-master.txt - # google-cloud-firestore - # google-cloud-storage -google-cloud-firestore==2.32.0 ; platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # firebase-admin -google-cloud-storage==3.15.0 - # via - # -r requirements/test-master.txt - # firebase-admin -google-crc32c==1.9.0 - # via - # -r requirements/test-master.txt - # google-cloud-storage - # google-resumable-media -google-resumable-media==2.10.2 - # via - # -r requirements/test-master.txt - # google-cloud-storage -googleapis-common-protos==1.75.4 - # via - # -r requirements/test-master.txt - # google-api-core - # grpcio-status -grpcio==1.84.0 ; platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # google-api-core - # google-cloud-firestore - # grpcio-status -grpcio-status==1.84.0 ; platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # google-api-core -h11==0.16.0 - # via - # -r requirements/test-master.txt - # httpcore -h2==4.4.1 - # via - # -r requirements/test-master.txt - # httpx -hpack==4.2.0 - # via - # -r requirements/test-master.txt - # h2 -httpcore==1.0.9 - # via - # -r requirements/test-master.txt - # httpx -httpx[http2]==0.28.1 - # via - # -r requirements/test-master.txt - # firebase-admin -hyperframe==6.1.0 - # via - # -r requirements/test-master.txt - # h2 -idna==3.20 - # via - # -r requirements/test-master.txt - # anyio - # httpx - # requests -inflection==0.5.1 - # via - # -r requirements/test-master.txt - # drf-yasg -iniconfig==2.3.1 - # via pytest -invoke==3.0.3 - # via - # -r requirements/test-master.txt - # paramiko -isodate==0.7.2 - # via - # -r requirements/test-master.txt - # python3-saml -jinja2==3.1.6 - # via - # -r requirements/test-master.txt - # code-annotations - # diff-cover -jsondiff==2.2.1 - # via -r requirements/test-master.txt -jsonfield==3.2.0 - # via -r requirements/test-master.txt -jwcrypto==1.6.1 - # via - # -r requirements/test-master.txt - # django-oauth-toolkit -kombu==5.6.2 - # via - # -r requirements/test-master.txt - # celery -lxml==5.3.2 - # via - # -r requirements/test-master.txt - # python3-saml - # xmlsec -markupsafe==3.0.3 - # via - # -r requirements/test-master.txt - # jinja2 -mock==5.2.0 - # via -r requirements/test.in -model-bakery==1.24.2 - # via django-mock-queries -msgpack==1.2.2 - # via - # -r requirements/test-master.txt - # cachecontrol -oauthlib==4.0.0 - # via - # -r requirements/test-master.txt - # django-oauth-toolkit - # requests-oauthlib - # social-auth-core -openedx-atlas==0.7.1 - # via -r requirements/test-master.txt -openedx-events==11.2.0 - # via -r requirements/test-master.txt -openedx-filters==3.14.0 - # via -r requirements/test-master.txt -opentelemetry-api==1.45.0 - # via - # -r requirements/test-master.txt - # google-api-core -packaging==26.3 - # via - # -r requirements/test-master.txt - # drf-yasg - # kombu - # pytest -paramiko==5.0.0 - # via -r requirements/test-master.txt -path==16.11.0 - # via - # -r requirements/test-master.txt - # path-py -path-py==12.5.0 - # via -r requirements/test-master.txt -pgpy==0.6.0 - # via -r requirements/test-master.txt -pillow==12.3.0 - # via -r requirements/test-master.txt -pluggy==1.7.0 - # via - # diff-cover - # pytest - # pytest-cov -prompt-toolkit==3.0.53 - # via - # -r requirements/test-master.txt - # click-repl -proto-plus==1.28.4 - # via - # -r requirements/test-master.txt - # google-api-core - # google-cloud-firestore -protobuf==7.36.2 - # via - # -r requirements/test-master.txt - # google-api-core - # google-cloud-firestore - # googleapis-common-protos - # grpcio-status - # proto-plus -psutil==7.2.2 - # via - # -r requirements/test-master.txt - # edx-django-utils -pyasn1==0.6.4 - # via - # -r requirements/test-master.txt - # pgpy - # pyasn1-modules -pyasn1-modules==0.4.2 - # via - # -r requirements/test-master.txt - # google-auth -pycparser==3.0 ; implementation_name != "PyPy" and platform_python_implementation != "PyPy" - # via - # -r requirements/test-master.txt - # cffi -pygments==2.21.0 - # via - # diff-cover - # pytest -pyjwt[crypto]==2.15.1 - # via - # -r requirements/test-master.txt - # drf-jwt - # edx-drf-extensions - # edx-rest-api-client - # firebase-admin - # social-auth-core -pymongo==4.4.0 - # via - # -r requirements/test-master.txt - # edx-opaque-keys -pynacl==1.6.2 - # via - # -r requirements/test-master.txt - # edx-django-utils - # paramiko -pytest==9.1.1 - # via - # pytest-cov - # pytest-django -pytest-cov==7.1.0 - # via -r requirements/test.in -pytest-django==4.14.0 - # via -r requirements/test.in -python-dateutil==2.9.0.post0 - # via - # -r requirements/test-master.txt - # celery - # edx-ace - # freezegun -python-ipware==4.1.0 - # via - # -r requirements/test-master.txt - # django-ipware -python-slugify==9.1.2 - # via - # -r requirements/test-master.txt - # code-annotations -python3-openid==3.2.0 - # via - # -r requirements/test-master.txt - # social-auth-core -python3-saml==1.16.0 - # via -r requirements/test-master.txt -pytz==2026.4 - # via - # -r requirements/test-master.txt - # drf-yasg - # tincan -pyyaml==6.0.3 - # via - # -r requirements/test-master.txt - # code-annotations - # drf-yasg - # jsondiff - # responses -requests==2.34.2 - # via - # -r requirements/test-master.txt - # cachecontrol - # django-oauth-toolkit - # edx-braze-client - # edx-drf-extensions - # edx-rest-api-client - # google-api-core - # google-cloud-storage - # requests-oauthlib - # responses - # sailthru-client - # slumber - # social-auth-core -requests-oauthlib==2.0.0 - # via - # -r requirements/test-master.txt - # social-auth-core -responses==0.26.3 - # via -r requirements/test.in -rules==3.5 - # via -r requirements/test-master.txt -sailthru-client==2.2.3 - # via - # -r requirements/test-master.txt - # edx-ace -semantic-version==2.10.0 - # via - # -r requirements/test-master.txt - # edx-drf-extensions -simplejson==4.1.2 - # via - # -r requirements/test-master.txt - # sailthru-client -six==1.17.0 - # via - # -r requirements/test-master.txt - # edx-ace - # edx-ccx-keys - # edx-rbac - # python-dateutil -slumber==0.7.1 - # via -r requirements/test-master.txt -social-auth-app-django==5.4.1 - # via -r requirements/test-master.txt -social-auth-core==4.9.1 - # via - # -r requirements/test-master.txt - # social-auth-app-django -sqlparse==0.6.0 - # via - # -r requirements/test-master.txt - # django -stevedore==5.9.1 - # via - # -r requirements/test-master.txt - # code-annotations - # edx-ace - # edx-django-utils - # edx-opaque-keys -testfixtures==12.3.0 - # via - # -r requirements/test-master.txt - # -r requirements/test.in -text-unidecode==1.3 - # via - # -r requirements/test-master.txt - # python-slugify -tincan==1.0.0 - # via -r requirements/test-master.txt -typing-extensions==4.16.0 - # via - # -r requirements/test-master.txt - # anyio - # click-repl - # django-countries - # edx-opaque-keys - # grpcio - # jwcrypto - # opentelemetry-api - # testfixtures -tzdata==2026.4 - # via - # -r requirements/test-master.txt - # kombu -tzlocal==5.4.4 - # via - # -r requirements/test-master.txt - # celery -unicodecsv==0.14.1 - # via -r requirements/test-master.txt -uritemplate==4.2.0 - # via - # -r requirements/test-master.txt - # drf-yasg -urllib3==2.8.0 - # via - # -r requirements/test-master.txt - # requests - # responses -vine==5.1.0 - # via - # -r requirements/test-master.txt - # amqp - # celery - # kombu -wcwidth==0.9.1 - # via - # -r requirements/test-master.txt - # prompt-toolkit -webencodings==0.6.1 - # via - # -r requirements/test-master.txt - # bleach -xmlsec==1.3.14 - # via - # -r requirements/test-master.txt - # python3-saml - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index f5452e73dd..0000000000 --- a/setup.cfg +++ /dev/null @@ -1,9 +0,0 @@ -[pycodestyle] -# error codes: https://pycodestyle.readthedocs.io/en/latest/intro.html#error-codes -# E501: line too long -# W503,W504: warnings added since pep8/pycodestyle 1.5.7 that we haven't cleaned up yet -ignore=E501,W503,W504 -exclude=.git,.tox,enterprise/settings,enterprise/migrations,enterprise/static - -[flake8] -max-line-length = 120 diff --git a/setup.py b/setup.py deleted file mode 100755 index fc44991ce0..0000000000 --- a/setup.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python -# pylint: disable=C0111,W6005,W6100 - - -import os -import re -import sys - -from setuptools import setup - -VCS_PREFIXES = ('git+', 'hg+', 'bzr+', 'svn+', '-e git+') - - -def get_version(*file_paths): - """ - Extract the version string from the file at the given relative path fragments. - """ - filename = os.path.join(os.path.dirname(__file__), *file_paths) - version_file = open(filename).read() - version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", - version_file, re.M) - if version_match: - return version_match.group(1) - raise RuntimeError("Unable to find version string.") - - -def get_requirements(requirements_file): - """ - Get the contents of a file listing the requirements - """ - lines = open(requirements_file).readlines() - dependencies = [] - dependency_links = [] - - for line in lines: - package = line.strip() - if package.startswith('#'): - # Skip pure comment lines - continue - - package, __, __ = package.partition(' #') - package = package.strip() - - if any(package.startswith(prefix) for prefix in VCS_PREFIXES): - # VCS reference for dev purposes, expect a trailing comment - # with the normal requirement - package_link, __, package = package.rpartition('#') - - # Remove -e string - package_link = re.sub(r'(.*)(?Phttps?.*$)', r'\g', package_link) - package = re.sub(r'(egg=)?(?P.*)==.*$', r'\g', package) - package_version = re.sub(r'.*[^=]==', '', line.strip()) - - if package: - dependency_links.append( - f'{package_link}#egg={package}-{package_version}' - ) - else: - # Ignore any trailing comment - package, __, __ = package.partition('#') - # Remove any whitespace and assume non-empty results are dependencies - package = package.strip() - - if package: - dependencies.append(package) - return dependencies, dependency_links - - -VERSION = get_version("enterprise", "__init__.py") - -if sys.argv[-1] == "tag": - print("Tagging the version on github:") - os.system(f"git tag -a {VERSION} -m 'version {VERSION}'") - os.system("git push --tags") - sys.exit() - -base_path = os.path.dirname(__file__) - -README = open(os.path.join(base_path, "README.rst")).read() -CHANGELOG = open(os.path.join(base_path, "CHANGELOG.rst")).read() -REQUIREMENTS, DEPENDENCY_LINKS = get_requirements(os.path.join(base_path, 'requirements', 'base.in')) - -setup( - name="edx-enterprise", - version=VERSION, - entry_points={ - "lms.djangoapp": [ - "enterprise = enterprise.apps:EnterpriseConfig", - "consent = consent.apps:ConsentConfig", - ], - "cms.djangoapp": [ - "enterprise = enterprise.apps:EnterpriseConfig", - "consent = consent.apps:ConsentConfig", - ], - }, - description="""Your project description goes here""", - long_description=f"{README}\n\n{CHANGELOG}", - author="edX", - author_email="oscm@edx.org", - url="https://github.com/openedx/edx-enterprise", - packages=[ - "enterprise", - "consent", - "integrated_channels", - "integrated_channels.integrated_channel", - "integrated_channels.degreed", - "integrated_channels.degreed2", - "integrated_channels.canvas", - "integrated_channels.blackboard", - "integrated_channels.cornerstone", - "integrated_channels.moodle", - "integrated_channels.sap_success_factors", - "integrated_channels.xapi", - "enterprise_learner_portal", - ], - include_package_data=True, - install_requires=REQUIREMENTS, - dependency_links=DEPENDENCY_LINKS, - extras_require={ - "braze": ["edx-braze-client"], - }, - license="AGPL-3.0-or-later", - zip_safe=False, - keywords="Django edx", - classifiers=[ - "Development Status :: 3 - Alpha", - "Framework :: Django", - "Framework :: Django :: 5.2", - "Intended Audience :: Developers", - "Natural Language :: English", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.12", - ], -) diff --git a/spec/javascripts/support/jasmine.yml b/spec/javascripts/support/jasmine.yml index 8ae052807e..60a08068b9 100644 --- a/spec/javascripts/support/jasmine.yml +++ b/spec/javascripts/support/jasmine.yml @@ -17,7 +17,7 @@ src_files: - node_modules/jasmine-ajax/lib/mock-ajax.js - node_modules/bootstrap/dist/js/bootstrap.min.js - spec/vendor/analytics-mock.js - - enterprise/static/enterprise/js/*.js + - src/enterprise/static/enterprise/js/*.js # stylesheets # diff --git a/consent/__init__.py b/src/consent/__init__.py similarity index 100% rename from consent/__init__.py rename to src/consent/__init__.py diff --git a/consent/admin/__init__.py b/src/consent/admin/__init__.py similarity index 100% rename from consent/admin/__init__.py rename to src/consent/admin/__init__.py diff --git a/consent/api/__init__.py b/src/consent/api/__init__.py similarity index 100% rename from consent/api/__init__.py rename to src/consent/api/__init__.py diff --git a/consent/api/permissions.py b/src/consent/api/permissions.py similarity index 100% rename from consent/api/permissions.py rename to src/consent/api/permissions.py diff --git a/consent/api/urls.py b/src/consent/api/urls.py similarity index 100% rename from consent/api/urls.py rename to src/consent/api/urls.py diff --git a/consent/api/v1/__init__.py b/src/consent/api/v1/__init__.py similarity index 100% rename from consent/api/v1/__init__.py rename to src/consent/api/v1/__init__.py diff --git a/consent/api/v1/urls.py b/src/consent/api/v1/urls.py similarity index 100% rename from consent/api/v1/urls.py rename to src/consent/api/v1/urls.py diff --git a/consent/api/v1/views.py b/src/consent/api/v1/views.py similarity index 100% rename from consent/api/v1/views.py rename to src/consent/api/v1/views.py diff --git a/consent/apps.py b/src/consent/apps.py similarity index 100% rename from consent/apps.py rename to src/consent/apps.py diff --git a/consent/errors.py b/src/consent/errors.py similarity index 100% rename from consent/errors.py rename to src/consent/errors.py diff --git a/consent/filters/__init__.py b/src/consent/filters/__init__.py similarity index 100% rename from consent/filters/__init__.py rename to src/consent/filters/__init__.py diff --git a/consent/filters/courseware.py b/src/consent/filters/courseware.py similarity index 100% rename from consent/filters/courseware.py rename to src/consent/filters/courseware.py diff --git a/consent/helpers.py b/src/consent/helpers.py similarity index 100% rename from consent/helpers.py rename to src/consent/helpers.py diff --git a/consent/migrations/0001_initial.py b/src/consent/migrations/0001_initial.py similarity index 100% rename from consent/migrations/0001_initial.py rename to src/consent/migrations/0001_initial.py diff --git a/consent/migrations/0002_migrate_to_new_data_sharing_consent.py b/src/consent/migrations/0002_migrate_to_new_data_sharing_consent.py similarity index 100% rename from consent/migrations/0002_migrate_to_new_data_sharing_consent.py rename to src/consent/migrations/0002_migrate_to_new_data_sharing_consent.py diff --git a/consent/migrations/0003_historicaldatasharingconsent_history_change_reason.py b/src/consent/migrations/0003_historicaldatasharingconsent_history_change_reason.py similarity index 100% rename from consent/migrations/0003_historicaldatasharingconsent_history_change_reason.py rename to src/consent/migrations/0003_historicaldatasharingconsent_history_change_reason.py diff --git a/consent/migrations/0004_datasharingconsenttextoverrides.py b/src/consent/migrations/0004_datasharingconsenttextoverrides.py similarity index 100% rename from consent/migrations/0004_datasharingconsenttextoverrides.py rename to src/consent/migrations/0004_datasharingconsenttextoverrides.py diff --git a/consent/migrations/0005_auto_20230707_0755.py b/src/consent/migrations/0005_auto_20230707_0755.py similarity index 100% rename from consent/migrations/0005_auto_20230707_0755.py rename to src/consent/migrations/0005_auto_20230707_0755.py diff --git a/consent/migrations/0006_alter_historicaldatasharingconsent_options.py b/src/consent/migrations/0006_alter_historicaldatasharingconsent_options.py similarity index 100% rename from consent/migrations/0006_alter_historicaldatasharingconsent_options.py rename to src/consent/migrations/0006_alter_historicaldatasharingconsent_options.py diff --git a/consent/migrations/0007_datasharingconsent_consent_add_username_index.py b/src/consent/migrations/0007_datasharingconsent_consent_add_username_index.py similarity index 100% rename from consent/migrations/0007_datasharingconsent_consent_add_username_index.py rename to src/consent/migrations/0007_datasharingconsent_consent_add_username_index.py diff --git a/consent/migrations/__init__.py b/src/consent/migrations/__init__.py similarity index 100% rename from consent/migrations/__init__.py rename to src/consent/migrations/__init__.py diff --git a/consent/mixins.py b/src/consent/mixins.py similarity index 100% rename from consent/mixins.py rename to src/consent/mixins.py diff --git a/consent/models.py b/src/consent/models.py similarity index 100% rename from consent/models.py rename to src/consent/models.py diff --git a/consent/settings/__init__.py b/src/consent/settings/__init__.py similarity index 100% rename from consent/settings/__init__.py rename to src/consent/settings/__init__.py diff --git a/consent/settings/common.py b/src/consent/settings/common.py similarity index 100% rename from consent/settings/common.py rename to src/consent/settings/common.py diff --git a/consent/settings/production.py b/src/consent/settings/production.py similarity index 100% rename from consent/settings/production.py rename to src/consent/settings/production.py diff --git a/consent/signals.py b/src/consent/signals.py similarity index 100% rename from consent/signals.py rename to src/consent/signals.py diff --git a/consent/urls.py b/src/consent/urls.py similarity index 100% rename from consent/urls.py rename to src/consent/urls.py diff --git a/src/enterprise/__init__.py b/src/enterprise/__init__.py new file mode 100644 index 0000000000..b2ccdc72db --- /dev/null +++ b/src/enterprise/__init__.py @@ -0,0 +1,6 @@ +""" +Your project description goes here. +""" +from importlib.metadata import version as get_version + +__version__ = get_version("edx-enterprise") diff --git a/enterprise/admin/__init__.py b/src/enterprise/admin/__init__.py similarity index 100% rename from enterprise/admin/__init__.py rename to src/enterprise/admin/__init__.py diff --git a/enterprise/admin/actions.py b/src/enterprise/admin/actions.py similarity index 100% rename from enterprise/admin/actions.py rename to src/enterprise/admin/actions.py diff --git a/enterprise/admin/forms.py b/src/enterprise/admin/forms.py similarity index 100% rename from enterprise/admin/forms.py rename to src/enterprise/admin/forms.py diff --git a/enterprise/admin/paginator.py b/src/enterprise/admin/paginator.py similarity index 100% rename from enterprise/admin/paginator.py rename to src/enterprise/admin/paginator.py diff --git a/enterprise/admin/utils.py b/src/enterprise/admin/utils.py similarity index 100% rename from enterprise/admin/utils.py rename to src/enterprise/admin/utils.py diff --git a/enterprise/admin/views.py b/src/enterprise/admin/views.py similarity index 100% rename from enterprise/admin/views.py rename to src/enterprise/admin/views.py diff --git a/enterprise/admin/widgets.py b/src/enterprise/admin/widgets.py similarity index 100% rename from enterprise/admin/widgets.py rename to src/enterprise/admin/widgets.py diff --git a/enterprise/api/__init__.py b/src/enterprise/api/__init__.py similarity index 100% rename from enterprise/api/__init__.py rename to src/enterprise/api/__init__.py diff --git a/enterprise/api/filters.py b/src/enterprise/api/filters.py similarity index 100% rename from enterprise/api/filters.py rename to src/enterprise/api/filters.py diff --git a/enterprise/api/pagination.py b/src/enterprise/api/pagination.py similarity index 100% rename from enterprise/api/pagination.py rename to src/enterprise/api/pagination.py diff --git a/enterprise/api/throttles.py b/src/enterprise/api/throttles.py similarity index 100% rename from enterprise/api/throttles.py rename to src/enterprise/api/throttles.py diff --git a/enterprise/api/urls.py b/src/enterprise/api/urls.py similarity index 100% rename from enterprise/api/urls.py rename to src/enterprise/api/urls.py diff --git a/enterprise/api/utils.py b/src/enterprise/api/utils.py similarity index 100% rename from enterprise/api/utils.py rename to src/enterprise/api/utils.py diff --git a/enterprise/api/v1/__init__.py b/src/enterprise/api/v1/__init__.py similarity index 100% rename from enterprise/api/v1/__init__.py rename to src/enterprise/api/v1/__init__.py diff --git a/enterprise/api/v1/decorators.py b/src/enterprise/api/v1/decorators.py similarity index 100% rename from enterprise/api/v1/decorators.py rename to src/enterprise/api/v1/decorators.py diff --git a/enterprise/api/v1/fields.py b/src/enterprise/api/v1/fields.py similarity index 100% rename from enterprise/api/v1/fields.py rename to src/enterprise/api/v1/fields.py diff --git a/enterprise/api/v1/permissions.py b/src/enterprise/api/v1/permissions.py similarity index 100% rename from enterprise/api/v1/permissions.py rename to src/enterprise/api/v1/permissions.py diff --git a/enterprise/api/v1/serializers.py b/src/enterprise/api/v1/serializers.py similarity index 100% rename from enterprise/api/v1/serializers.py rename to src/enterprise/api/v1/serializers.py diff --git a/enterprise/api/v1/urls.py b/src/enterprise/api/v1/urls.py similarity index 100% rename from enterprise/api/v1/urls.py rename to src/enterprise/api/v1/urls.py diff --git a/enterprise/api/v1/views/__init__.py b/src/enterprise/api/v1/views/__init__.py similarity index 100% rename from enterprise/api/v1/views/__init__.py rename to src/enterprise/api/v1/views/__init__.py diff --git a/enterprise/api/v1/views/analytics_summary.py b/src/enterprise/api/v1/views/analytics_summary.py similarity index 100% rename from enterprise/api/v1/views/analytics_summary.py rename to src/enterprise/api/v1/views/analytics_summary.py diff --git a/enterprise/api/v1/views/base_views.py b/src/enterprise/api/v1/views/base_views.py similarity index 100% rename from enterprise/api/v1/views/base_views.py rename to src/enterprise/api/v1/views/base_views.py diff --git a/enterprise/api/v1/views/coupon_codes.py b/src/enterprise/api/v1/views/coupon_codes.py similarity index 100% rename from enterprise/api/v1/views/coupon_codes.py rename to src/enterprise/api/v1/views/coupon_codes.py diff --git a/enterprise/api/v1/views/default_enterprise_enrollments.py b/src/enterprise/api/v1/views/default_enterprise_enrollments.py similarity index 100% rename from enterprise/api/v1/views/default_enterprise_enrollments.py rename to src/enterprise/api/v1/views/default_enterprise_enrollments.py diff --git a/enterprise/api/v1/views/enterprise_admin_members.py b/src/enterprise/api/v1/views/enterprise_admin_members.py similarity index 100% rename from enterprise/api/v1/views/enterprise_admin_members.py rename to src/enterprise/api/v1/views/enterprise_admin_members.py diff --git a/enterprise/api/v1/views/enterprise_catalog_query.py b/src/enterprise/api/v1/views/enterprise_catalog_query.py similarity index 100% rename from enterprise/api/v1/views/enterprise_catalog_query.py rename to src/enterprise/api/v1/views/enterprise_catalog_query.py diff --git a/enterprise/api/v1/views/enterprise_course_enrollment.py b/src/enterprise/api/v1/views/enterprise_course_enrollment.py similarity index 100% rename from enterprise/api/v1/views/enterprise_course_enrollment.py rename to src/enterprise/api/v1/views/enterprise_course_enrollment.py diff --git a/enterprise/api/v1/views/enterprise_customer.py b/src/enterprise/api/v1/views/enterprise_customer.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer.py rename to src/enterprise/api/v1/views/enterprise_customer.py diff --git a/enterprise/api/v1/views/enterprise_customer_admin.py b/src/enterprise/api/v1/views/enterprise_customer_admin.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_admin.py rename to src/enterprise/api/v1/views/enterprise_customer_admin.py diff --git a/enterprise/api/v1/views/enterprise_customer_api_credentials.py b/src/enterprise/api/v1/views/enterprise_customer_api_credentials.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_api_credentials.py rename to src/enterprise/api/v1/views/enterprise_customer_api_credentials.py diff --git a/enterprise/api/v1/views/enterprise_customer_branding_configuration.py b/src/enterprise/api/v1/views/enterprise_customer_branding_configuration.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_branding_configuration.py rename to src/enterprise/api/v1/views/enterprise_customer_branding_configuration.py diff --git a/enterprise/api/v1/views/enterprise_customer_catalog.py b/src/enterprise/api/v1/views/enterprise_customer_catalog.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_catalog.py rename to src/enterprise/api/v1/views/enterprise_customer_catalog.py diff --git a/enterprise/api/v1/views/enterprise_customer_invite_key.py b/src/enterprise/api/v1/views/enterprise_customer_invite_key.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_invite_key.py rename to src/enterprise/api/v1/views/enterprise_customer_invite_key.py diff --git a/enterprise/api/v1/views/enterprise_customer_members.py b/src/enterprise/api/v1/views/enterprise_customer_members.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_members.py rename to src/enterprise/api/v1/views/enterprise_customer_members.py diff --git a/enterprise/api/v1/views/enterprise_customer_reporting.py b/src/enterprise/api/v1/views/enterprise_customer_reporting.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_reporting.py rename to src/enterprise/api/v1/views/enterprise_customer_reporting.py diff --git a/enterprise/api/v1/views/enterprise_customer_sso_configuration.py b/src/enterprise/api/v1/views/enterprise_customer_sso_configuration.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_sso_configuration.py rename to src/enterprise/api/v1/views/enterprise_customer_sso_configuration.py diff --git a/enterprise/api/v1/views/enterprise_customer_support.py b/src/enterprise/api/v1/views/enterprise_customer_support.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_support.py rename to src/enterprise/api/v1/views/enterprise_customer_support.py diff --git a/enterprise/api/v1/views/enterprise_customer_user.py b/src/enterprise/api/v1/views/enterprise_customer_user.py similarity index 100% rename from enterprise/api/v1/views/enterprise_customer_user.py rename to src/enterprise/api/v1/views/enterprise_customer_user.py diff --git a/enterprise/api/v1/views/enterprise_group.py b/src/enterprise/api/v1/views/enterprise_group.py similarity index 100% rename from enterprise/api/v1/views/enterprise_group.py rename to src/enterprise/api/v1/views/enterprise_group.py diff --git a/enterprise/api/v1/views/enterprise_group_membership.py b/src/enterprise/api/v1/views/enterprise_group_membership.py similarity index 100% rename from enterprise/api/v1/views/enterprise_group_membership.py rename to src/enterprise/api/v1/views/enterprise_group_membership.py diff --git a/enterprise/api/v1/views/enterprise_sso_users.py b/src/enterprise/api/v1/views/enterprise_sso_users.py similarity index 100% rename from enterprise/api/v1/views/enterprise_sso_users.py rename to src/enterprise/api/v1/views/enterprise_sso_users.py diff --git a/enterprise/api/v1/views/enterprise_subsidy_fulfillment.py b/src/enterprise/api/v1/views/enterprise_subsidy_fulfillment.py similarity index 100% rename from enterprise/api/v1/views/enterprise_subsidy_fulfillment.py rename to src/enterprise/api/v1/views/enterprise_subsidy_fulfillment.py diff --git a/enterprise/api/v1/views/notifications.py b/src/enterprise/api/v1/views/notifications.py similarity index 100% rename from enterprise/api/v1/views/notifications.py rename to src/enterprise/api/v1/views/notifications.py diff --git a/enterprise/api/v1/views/pending_enterprise_customer_admin_user.py b/src/enterprise/api/v1/views/pending_enterprise_customer_admin_user.py similarity index 100% rename from enterprise/api/v1/views/pending_enterprise_customer_admin_user.py rename to src/enterprise/api/v1/views/pending_enterprise_customer_admin_user.py diff --git a/enterprise/api/v1/views/pending_enterprise_customer_user.py b/src/enterprise/api/v1/views/pending_enterprise_customer_user.py similarity index 100% rename from enterprise/api/v1/views/pending_enterprise_customer_user.py rename to src/enterprise/api/v1/views/pending_enterprise_customer_user.py diff --git a/enterprise/api/v1/views/saml_provider_config.py b/src/enterprise/api/v1/views/saml_provider_config.py similarity index 100% rename from enterprise/api/v1/views/saml_provider_config.py rename to src/enterprise/api/v1/views/saml_provider_config.py diff --git a/enterprise/api/v1/views/saml_provider_data.py b/src/enterprise/api/v1/views/saml_provider_data.py similarity index 100% rename from enterprise/api/v1/views/saml_provider_data.py rename to src/enterprise/api/v1/views/saml_provider_data.py diff --git a/enterprise/api/v1/views/saml_utils.py b/src/enterprise/api/v1/views/saml_utils.py similarity index 100% rename from enterprise/api/v1/views/saml_utils.py rename to src/enterprise/api/v1/views/saml_utils.py diff --git a/enterprise/api_client/__init__.py b/src/enterprise/api_client/__init__.py similarity index 100% rename from enterprise/api_client/__init__.py rename to src/enterprise/api_client/__init__.py diff --git a/enterprise/api_client/braze.py b/src/enterprise/api_client/braze.py similarity index 100% rename from enterprise/api_client/braze.py rename to src/enterprise/api_client/braze.py diff --git a/enterprise/api_client/client.py b/src/enterprise/api_client/client.py similarity index 100% rename from enterprise/api_client/client.py rename to src/enterprise/api_client/client.py diff --git a/enterprise/api_client/discovery.py b/src/enterprise/api_client/discovery.py similarity index 100% rename from enterprise/api_client/discovery.py rename to src/enterprise/api_client/discovery.py diff --git a/enterprise/api_client/ecommerce.py b/src/enterprise/api_client/ecommerce.py similarity index 100% rename from enterprise/api_client/ecommerce.py rename to src/enterprise/api_client/ecommerce.py diff --git a/enterprise/api_client/enterprise.py b/src/enterprise/api_client/enterprise.py similarity index 100% rename from enterprise/api_client/enterprise.py rename to src/enterprise/api_client/enterprise.py diff --git a/enterprise/api_client/enterprise_catalog.py b/src/enterprise/api_client/enterprise_catalog.py similarity index 100% rename from enterprise/api_client/enterprise_catalog.py rename to src/enterprise/api_client/enterprise_catalog.py diff --git a/enterprise/api_client/lms.py b/src/enterprise/api_client/lms.py similarity index 100% rename from enterprise/api_client/lms.py rename to src/enterprise/api_client/lms.py diff --git a/enterprise/api_client/sso_orchestrator.py b/src/enterprise/api_client/sso_orchestrator.py similarity index 100% rename from enterprise/api_client/sso_orchestrator.py rename to src/enterprise/api_client/sso_orchestrator.py diff --git a/enterprise/api_client/xpert_ai.py b/src/enterprise/api_client/xpert_ai.py similarity index 100% rename from enterprise/api_client/xpert_ai.py rename to src/enterprise/api_client/xpert_ai.py diff --git a/enterprise/apps.py b/src/enterprise/apps.py similarity index 100% rename from enterprise/apps.py rename to src/enterprise/apps.py diff --git a/enterprise/cache_utils.py b/src/enterprise/cache_utils.py similarity index 100% rename from enterprise/cache_utils.py rename to src/enterprise/cache_utils.py diff --git a/enterprise/conf/locale/config.yaml b/src/enterprise/conf/locale/config.yaml similarity index 100% rename from enterprise/conf/locale/config.yaml rename to src/enterprise/conf/locale/config.yaml diff --git a/enterprise/conf/locale/en/LC_MESSAGES/django.po b/src/enterprise/conf/locale/en/LC_MESSAGES/django.po similarity index 100% rename from enterprise/conf/locale/en/LC_MESSAGES/django.po rename to src/enterprise/conf/locale/en/LC_MESSAGES/django.po diff --git a/enterprise/conf/locale/en/LC_MESSAGES/djangojs.po b/src/enterprise/conf/locale/en/LC_MESSAGES/djangojs.po similarity index 100% rename from enterprise/conf/locale/en/LC_MESSAGES/djangojs.po rename to src/enterprise/conf/locale/en/LC_MESSAGES/djangojs.po diff --git a/enterprise/conf/locale/eo/LC_MESSAGES/django.po b/src/enterprise/conf/locale/eo/LC_MESSAGES/django.po similarity index 100% rename from enterprise/conf/locale/eo/LC_MESSAGES/django.po rename to src/enterprise/conf/locale/eo/LC_MESSAGES/django.po diff --git a/enterprise/conf/locale/eo/LC_MESSAGES/djangojs.po b/src/enterprise/conf/locale/eo/LC_MESSAGES/djangojs.po similarity index 100% rename from enterprise/conf/locale/eo/LC_MESSAGES/djangojs.po rename to src/enterprise/conf/locale/eo/LC_MESSAGES/djangojs.po diff --git a/enterprise/conf/locale/es_419/LC_MESSAGES/django.po b/src/enterprise/conf/locale/es_419/LC_MESSAGES/django.po similarity index 100% rename from enterprise/conf/locale/es_419/LC_MESSAGES/django.po rename to src/enterprise/conf/locale/es_419/LC_MESSAGES/django.po diff --git a/enterprise/config/__init__.py b/src/enterprise/config/__init__.py similarity index 100% rename from enterprise/config/__init__.py rename to src/enterprise/config/__init__.py diff --git a/enterprise/config/models.py b/src/enterprise/config/models.py similarity index 100% rename from enterprise/config/models.py rename to src/enterprise/config/models.py diff --git a/enterprise/constants.py b/src/enterprise/constants.py similarity index 100% rename from enterprise/constants.py rename to src/enterprise/constants.py diff --git a/enterprise/content_metadata/api.py b/src/enterprise/content_metadata/api.py similarity index 100% rename from enterprise/content_metadata/api.py rename to src/enterprise/content_metadata/api.py diff --git a/enterprise/core_api.py b/src/enterprise/core_api.py similarity index 100% rename from enterprise/core_api.py rename to src/enterprise/core_api.py diff --git a/enterprise/decorators.py b/src/enterprise/decorators.py similarity index 100% rename from enterprise/decorators.py rename to src/enterprise/decorators.py diff --git a/enterprise/devstack_api.py b/src/enterprise/devstack_api.py similarity index 100% rename from enterprise/devstack_api.py rename to src/enterprise/devstack_api.py diff --git a/enterprise/errors.py b/src/enterprise/errors.py similarity index 100% rename from enterprise/errors.py rename to src/enterprise/errors.py diff --git a/enterprise/event_bus.py b/src/enterprise/event_bus.py similarity index 100% rename from enterprise/event_bus.py rename to src/enterprise/event_bus.py diff --git a/enterprise/filters/__init__.py b/src/enterprise/filters/__init__.py similarity index 100% rename from enterprise/filters/__init__.py rename to src/enterprise/filters/__init__.py diff --git a/enterprise/filters/accounts.py b/src/enterprise/filters/accounts.py similarity index 100% rename from enterprise/filters/accounts.py rename to src/enterprise/filters/accounts.py diff --git a/enterprise/filters/course_modes.py b/src/enterprise/filters/course_modes.py similarity index 100% rename from enterprise/filters/course_modes.py rename to src/enterprise/filters/course_modes.py diff --git a/enterprise/filters/courseware.py b/src/enterprise/filters/courseware.py similarity index 100% rename from enterprise/filters/courseware.py rename to src/enterprise/filters/courseware.py diff --git a/enterprise/filters/dashboard.py b/src/enterprise/filters/dashboard.py similarity index 100% rename from enterprise/filters/dashboard.py rename to src/enterprise/filters/dashboard.py diff --git a/enterprise/filters/discounts.py b/src/enterprise/filters/discounts.py similarity index 100% rename from enterprise/filters/discounts.py rename to src/enterprise/filters/discounts.py diff --git a/enterprise/filters/grades.py b/src/enterprise/filters/grades.py similarity index 100% rename from enterprise/filters/grades.py rename to src/enterprise/filters/grades.py diff --git a/enterprise/filters/logistration.py b/src/enterprise/filters/logistration.py similarity index 100% rename from enterprise/filters/logistration.py rename to src/enterprise/filters/logistration.py diff --git a/enterprise/filters/support.py b/src/enterprise/filters/support.py similarity index 100% rename from enterprise/filters/support.py rename to src/enterprise/filters/support.py diff --git a/enterprise/forms.py b/src/enterprise/forms.py similarity index 100% rename from enterprise/forms.py rename to src/enterprise/forms.py diff --git a/enterprise/heartbeat/__init__.py b/src/enterprise/heartbeat/__init__.py similarity index 100% rename from enterprise/heartbeat/__init__.py rename to src/enterprise/heartbeat/__init__.py diff --git a/enterprise/heartbeat/checks.py b/src/enterprise/heartbeat/checks.py similarity index 100% rename from enterprise/heartbeat/checks.py rename to src/enterprise/heartbeat/checks.py diff --git a/enterprise/heartbeat/exceptions.py b/src/enterprise/heartbeat/exceptions.py similarity index 100% rename from enterprise/heartbeat/exceptions.py rename to src/enterprise/heartbeat/exceptions.py diff --git a/enterprise/heartbeat/throttles.py b/src/enterprise/heartbeat/throttles.py similarity index 100% rename from enterprise/heartbeat/throttles.py rename to src/enterprise/heartbeat/throttles.py diff --git a/enterprise/heartbeat/utils.py b/src/enterprise/heartbeat/utils.py similarity index 100% rename from enterprise/heartbeat/utils.py rename to src/enterprise/heartbeat/utils.py diff --git a/enterprise/heartbeat/views.py b/src/enterprise/heartbeat/views.py similarity index 100% rename from enterprise/heartbeat/views.py rename to src/enterprise/heartbeat/views.py diff --git a/enterprise/locale b/src/enterprise/locale similarity index 100% rename from enterprise/locale rename to src/enterprise/locale diff --git a/enterprise/logging.py b/src/enterprise/logging.py similarity index 100% rename from enterprise/logging.py rename to src/enterprise/logging.py diff --git a/enterprise/management/__init__.py b/src/enterprise/management/__init__.py similarity index 100% rename from enterprise/management/__init__.py rename to src/enterprise/management/__init__.py diff --git a/enterprise/management/commands/__init__.py b/src/enterprise/management/commands/__init__.py similarity index 100% rename from enterprise/management/commands/__init__.py rename to src/enterprise/management/commands/__init__.py diff --git a/enterprise/management/commands/add_exec_ed_exclusion_to_catalogs.py b/src/enterprise/management/commands/add_exec_ed_exclusion_to_catalogs.py similarity index 100% rename from enterprise/management/commands/add_exec_ed_exclusion_to_catalogs.py rename to src/enterprise/management/commands/add_exec_ed_exclusion_to_catalogs.py diff --git a/enterprise/management/commands/assign_system_wide_enterprise_role.py b/src/enterprise/management/commands/assign_system_wide_enterprise_role.py similarity index 100% rename from enterprise/management/commands/assign_system_wide_enterprise_role.py rename to src/enterprise/management/commands/assign_system_wide_enterprise_role.py diff --git a/enterprise/management/commands/backfill_ecu_table_user_foreign_key.py b/src/enterprise/management/commands/backfill_ecu_table_user_foreign_key.py similarity index 100% rename from enterprise/management/commands/backfill_ecu_table_user_foreign_key.py rename to src/enterprise/management/commands/backfill_ecu_table_user_foreign_key.py diff --git a/enterprise/management/commands/backfill_implied_dsc_records.py b/src/enterprise/management/commands/backfill_implied_dsc_records.py similarity index 100% rename from enterprise/management/commands/backfill_implied_dsc_records.py rename to src/enterprise/management/commands/backfill_implied_dsc_records.py diff --git a/enterprise/management/commands/backfill_learner_role_assignments.py b/src/enterprise/management/commands/backfill_learner_role_assignments.py similarity index 100% rename from enterprise/management/commands/backfill_learner_role_assignments.py rename to src/enterprise/management/commands/backfill_learner_role_assignments.py diff --git a/enterprise/management/commands/bulk_update_catalog_query_id.py b/src/enterprise/management/commands/bulk_update_catalog_query_id.py similarity index 100% rename from enterprise/management/commands/bulk_update_catalog_query_id.py rename to src/enterprise/management/commands/bulk_update_catalog_query_id.py diff --git a/enterprise/management/commands/compare_discovery_and_enterprise_catalogs.py b/src/enterprise/management/commands/compare_discovery_and_enterprise_catalogs.py similarity index 100% rename from enterprise/management/commands/compare_discovery_and_enterprise_catalogs.py rename to src/enterprise/management/commands/compare_discovery_and_enterprise_catalogs.py diff --git a/enterprise/management/commands/create_enterprise_course_enrollments.py b/src/enterprise/management/commands/create_enterprise_course_enrollments.py similarity index 100% rename from enterprise/management/commands/create_enterprise_course_enrollments.py rename to src/enterprise/management/commands/create_enterprise_course_enrollments.py diff --git a/enterprise/management/commands/create_enterprise_customer_admins.py b/src/enterprise/management/commands/create_enterprise_customer_admins.py similarity index 100% rename from enterprise/management/commands/create_enterprise_customer_admins.py rename to src/enterprise/management/commands/create_enterprise_customer_admins.py diff --git a/enterprise/management/commands/create_enterprise_linked_learner.py b/src/enterprise/management/commands/create_enterprise_linked_learner.py similarity index 100% rename from enterprise/management/commands/create_enterprise_linked_learner.py rename to src/enterprise/management/commands/create_enterprise_linked_learner.py diff --git a/enterprise/management/commands/create_missing_dsc_records.py b/src/enterprise/management/commands/create_missing_dsc_records.py similarity index 100% rename from enterprise/management/commands/create_missing_dsc_records.py rename to src/enterprise/management/commands/create_missing_dsc_records.py diff --git a/enterprise/management/commands/email_drip_for_missing_dsc_records.py b/src/enterprise/management/commands/email_drip_for_missing_dsc_records.py similarity index 100% rename from enterprise/management/commands/email_drip_for_missing_dsc_records.py rename to src/enterprise/management/commands/email_drip_for_missing_dsc_records.py diff --git a/enterprise/management/commands/enroll_enterprise_learner.py b/src/enterprise/management/commands/enroll_enterprise_learner.py similarity index 100% rename from enterprise/management/commands/enroll_enterprise_learner.py rename to src/enterprise/management/commands/enroll_enterprise_learner.py diff --git a/enterprise/management/commands/ensure_singular_active_enterprise_customer_user.py b/src/enterprise/management/commands/ensure_singular_active_enterprise_customer_user.py similarity index 100% rename from enterprise/management/commands/ensure_singular_active_enterprise_customer_user.py rename to src/enterprise/management/commands/ensure_singular_active_enterprise_customer_user.py diff --git a/enterprise/management/commands/fix_dsc_records.py b/src/enterprise/management/commands/fix_dsc_records.py similarity index 100% rename from enterprise/management/commands/fix_dsc_records.py rename to src/enterprise/management/commands/fix_dsc_records.py diff --git a/enterprise/management/commands/manufacture_data.py b/src/enterprise/management/commands/manufacture_data.py similarity index 100% rename from enterprise/management/commands/manufacture_data.py rename to src/enterprise/management/commands/manufacture_data.py diff --git a/enterprise/management/commands/migrate_enterprise_catalogs.py b/src/enterprise/management/commands/migrate_enterprise_catalogs.py similarity index 100% rename from enterprise/management/commands/migrate_enterprise_catalogs.py rename to src/enterprise/management/commands/migrate_enterprise_catalogs.py diff --git a/enterprise/management/commands/reencrypt_enterprise_customer_reporting_config_passwords.py b/src/enterprise/management/commands/reencrypt_enterprise_customer_reporting_config_passwords.py similarity index 100% rename from enterprise/management/commands/reencrypt_enterprise_customer_reporting_config_passwords.py rename to src/enterprise/management/commands/reencrypt_enterprise_customer_reporting_config_passwords.py diff --git a/enterprise/management/commands/remove_expired_pending_group_memberships.py b/src/enterprise/management/commands/remove_expired_pending_group_memberships.py similarity index 100% rename from enterprise/management/commands/remove_expired_pending_group_memberships.py rename to src/enterprise/management/commands/remove_expired_pending_group_memberships.py diff --git a/enterprise/management/commands/revert_enrollment_objects.py b/src/enterprise/management/commands/revert_enrollment_objects.py similarity index 100% rename from enterprise/management/commands/revert_enrollment_objects.py rename to src/enterprise/management/commands/revert_enrollment_objects.py diff --git a/enterprise/management/commands/save_enterprise_customer_users.py b/src/enterprise/management/commands/save_enterprise_customer_users.py similarity index 100% rename from enterprise/management/commands/save_enterprise_customer_users.py rename to src/enterprise/management/commands/save_enterprise_customer_users.py diff --git a/enterprise/management/commands/seed_enterprise_devstack_data.py b/src/enterprise/management/commands/seed_enterprise_devstack_data.py similarity index 100% rename from enterprise/management/commands/seed_enterprise_devstack_data.py rename to src/enterprise/management/commands/seed_enterprise_devstack_data.py diff --git a/enterprise/management/commands/send_pending_admin_reminders.py b/src/enterprise/management/commands/send_pending_admin_reminders.py similarity index 100% rename from enterprise/management/commands/send_pending_admin_reminders.py rename to src/enterprise/management/commands/send_pending_admin_reminders.py diff --git a/enterprise/management/commands/unlink_enterprise_customer_learners.py b/src/enterprise/management/commands/unlink_enterprise_customer_learners.py similarity index 100% rename from enterprise/management/commands/unlink_enterprise_customer_learners.py rename to src/enterprise/management/commands/unlink_enterprise_customer_learners.py diff --git a/enterprise/management/commands/update_config_last_errored_at.py b/src/enterprise/management/commands/update_config_last_errored_at.py similarity index 100% rename from enterprise/management/commands/update_config_last_errored_at.py rename to src/enterprise/management/commands/update_config_last_errored_at.py diff --git a/enterprise/management/commands/update_enterprise_social_auth_uids.py b/src/enterprise/management/commands/update_enterprise_social_auth_uids.py similarity index 100% rename from enterprise/management/commands/update_enterprise_social_auth_uids.py rename to src/enterprise/management/commands/update_enterprise_social_auth_uids.py diff --git a/enterprise/management/commands/update_role_assignments_with_customers.py b/src/enterprise/management/commands/update_role_assignments_with_customers.py similarity index 100% rename from enterprise/management/commands/update_role_assignments_with_customers.py rename to src/enterprise/management/commands/update_role_assignments_with_customers.py diff --git a/enterprise/management/commands/validate_default_enrollment_intentions.py b/src/enterprise/management/commands/validate_default_enrollment_intentions.py similarity index 100% rename from enterprise/management/commands/validate_default_enrollment_intentions.py rename to src/enterprise/management/commands/validate_default_enrollment_intentions.py diff --git a/enterprise/messages.py b/src/enterprise/messages.py similarity index 100% rename from enterprise/messages.py rename to src/enterprise/messages.py diff --git a/enterprise/middleware.py b/src/enterprise/middleware.py similarity index 100% rename from enterprise/middleware.py rename to src/enterprise/middleware.py diff --git a/enterprise/migrations/0001_auto_20210111_1253.py b/src/enterprise/migrations/0001_auto_20210111_1253.py similarity index 100% rename from enterprise/migrations/0001_auto_20210111_1253.py rename to src/enterprise/migrations/0001_auto_20210111_1253.py diff --git a/enterprise/migrations/0001_squashed_0092_auto_20200312_1650.py b/src/enterprise/migrations/0001_squashed_0092_auto_20200312_1650.py similarity index 100% rename from enterprise/migrations/0001_squashed_0092_auto_20200312_1650.py rename to src/enterprise/migrations/0001_squashed_0092_auto_20200312_1650.py diff --git a/enterprise/migrations/0093_add_use_enterprise_catalog_flag.py b/src/enterprise/migrations/0093_add_use_enterprise_catalog_flag.py similarity index 100% rename from enterprise/migrations/0093_add_use_enterprise_catalog_flag.py rename to src/enterprise/migrations/0093_add_use_enterprise_catalog_flag.py diff --git a/enterprise/migrations/0094_add_use_enterprise_catalog_sample.py b/src/enterprise/migrations/0094_add_use_enterprise_catalog_sample.py similarity index 100% rename from enterprise/migrations/0094_add_use_enterprise_catalog_sample.py rename to src/enterprise/migrations/0094_add_use_enterprise_catalog_sample.py diff --git a/enterprise/migrations/0095_auto_20200507_1138.py b/src/enterprise/migrations/0095_auto_20200507_1138.py similarity index 100% rename from enterprise/migrations/0095_auto_20200507_1138.py rename to src/enterprise/migrations/0095_auto_20200507_1138.py diff --git a/enterprise/migrations/0096_enterprise_catalog_admin_role.py b/src/enterprise/migrations/0096_enterprise_catalog_admin_role.py similarity index 100% rename from enterprise/migrations/0096_enterprise_catalog_admin_role.py rename to src/enterprise/migrations/0096_enterprise_catalog_admin_role.py diff --git a/enterprise/migrations/0097_auto_20200619_1130.py b/src/enterprise/migrations/0097_auto_20200619_1130.py similarity index 100% rename from enterprise/migrations/0097_auto_20200619_1130.py rename to src/enterprise/migrations/0097_auto_20200619_1130.py diff --git a/enterprise/migrations/0098_auto_20200629_1756.py b/src/enterprise/migrations/0098_auto_20200629_1756.py similarity index 100% rename from enterprise/migrations/0098_auto_20200629_1756.py rename to src/enterprise/migrations/0098_auto_20200629_1756.py diff --git a/enterprise/migrations/0099_auto_20200702_1537.py b/src/enterprise/migrations/0099_auto_20200702_1537.py similarity index 100% rename from enterprise/migrations/0099_auto_20200702_1537.py rename to src/enterprise/migrations/0099_auto_20200702_1537.py diff --git a/enterprise/migrations/0100_add_licensed_enterprise_course_enrollment.py b/src/enterprise/migrations/0100_add_licensed_enterprise_course_enrollment.py similarity index 100% rename from enterprise/migrations/0100_add_licensed_enterprise_course_enrollment.py rename to src/enterprise/migrations/0100_add_licensed_enterprise_course_enrollment.py diff --git a/enterprise/migrations/0101_move_data_to_saved_for_later.py b/src/enterprise/migrations/0101_move_data_to_saved_for_later.py similarity index 100% rename from enterprise/migrations/0101_move_data_to_saved_for_later.py rename to src/enterprise/migrations/0101_move_data_to_saved_for_later.py diff --git a/enterprise/migrations/0102_auto_20200708_1615.py b/src/enterprise/migrations/0102_auto_20200708_1615.py similarity index 100% rename from enterprise/migrations/0102_auto_20200708_1615.py rename to src/enterprise/migrations/0102_auto_20200708_1615.py diff --git a/enterprise/migrations/0103_remove_marked_done.py b/src/enterprise/migrations/0103_remove_marked_done.py similarity index 100% rename from enterprise/migrations/0103_remove_marked_done.py rename to src/enterprise/migrations/0103_remove_marked_done.py diff --git a/enterprise/migrations/0104_sync_query_field.py b/src/enterprise/migrations/0104_sync_query_field.py similarity index 100% rename from enterprise/migrations/0104_sync_query_field.py rename to src/enterprise/migrations/0104_sync_query_field.py diff --git a/enterprise/migrations/0105_add_branding_config_color_fields.py b/src/enterprise/migrations/0105_add_branding_config_color_fields.py similarity index 100% rename from enterprise/migrations/0105_add_branding_config_color_fields.py rename to src/enterprise/migrations/0105_add_branding_config_color_fields.py diff --git a/enterprise/migrations/0106_move_branding_config_colors.py b/src/enterprise/migrations/0106_move_branding_config_colors.py similarity index 100% rename from enterprise/migrations/0106_move_branding_config_colors.py rename to src/enterprise/migrations/0106_move_branding_config_colors.py diff --git a/enterprise/migrations/0107_remove_branding_config_banner_fields.py b/src/enterprise/migrations/0107_remove_branding_config_banner_fields.py similarity index 100% rename from enterprise/migrations/0107_remove_branding_config_banner_fields.py rename to src/enterprise/migrations/0107_remove_branding_config_banner_fields.py diff --git a/enterprise/migrations/0108_add_licensed_enrollment_is_revoked.py b/src/enterprise/migrations/0108_add_licensed_enrollment_is_revoked.py similarity index 100% rename from enterprise/migrations/0108_add_licensed_enrollment_is_revoked.py rename to src/enterprise/migrations/0108_add_licensed_enrollment_is_revoked.py diff --git a/enterprise/migrations/0109_remove_use_enterprise_catalog_sample.py b/src/enterprise/migrations/0109_remove_use_enterprise_catalog_sample.py similarity index 100% rename from enterprise/migrations/0109_remove_use_enterprise_catalog_sample.py rename to src/enterprise/migrations/0109_remove_use_enterprise_catalog_sample.py diff --git a/enterprise/migrations/0110_add_default_contract_discount.py b/src/enterprise/migrations/0110_add_default_contract_discount.py similarity index 100% rename from enterprise/migrations/0110_add_default_contract_discount.py rename to src/enterprise/migrations/0110_add_default_contract_discount.py diff --git a/enterprise/migrations/0111_pendingenterprisecustomeradminuser.py b/src/enterprise/migrations/0111_pendingenterprisecustomeradminuser.py similarity index 100% rename from enterprise/migrations/0111_pendingenterprisecustomeradminuser.py rename to src/enterprise/migrations/0111_pendingenterprisecustomeradminuser.py diff --git a/enterprise/migrations/0112_auto_20200914_0926.py b/src/enterprise/migrations/0112_auto_20200914_0926.py similarity index 100% rename from enterprise/migrations/0112_auto_20200914_0926.py rename to src/enterprise/migrations/0112_auto_20200914_0926.py diff --git a/enterprise/migrations/0113_auto_20200914_2054.py b/src/enterprise/migrations/0113_auto_20200914_2054.py similarity index 100% rename from enterprise/migrations/0113_auto_20200914_2054.py rename to src/enterprise/migrations/0113_auto_20200914_2054.py diff --git a/enterprise/migrations/0114_auto_20201020_0142.py b/src/enterprise/migrations/0114_auto_20201020_0142.py similarity index 100% rename from enterprise/migrations/0114_auto_20201020_0142.py rename to src/enterprise/migrations/0114_auto_20201020_0142.py diff --git a/enterprise/migrations/0115_enterpriseanalyticsuser_historicalenterpriseanalyticsuser.py b/src/enterprise/migrations/0115_enterpriseanalyticsuser_historicalenterpriseanalyticsuser.py similarity index 100% rename from enterprise/migrations/0115_enterpriseanalyticsuser_historicalenterpriseanalyticsuser.py rename to src/enterprise/migrations/0115_enterpriseanalyticsuser_historicalenterpriseanalyticsuser.py diff --git a/enterprise/migrations/0116_auto_20201116_0400.py b/src/enterprise/migrations/0116_auto_20201116_0400.py similarity index 100% rename from enterprise/migrations/0116_auto_20201116_0400.py rename to src/enterprise/migrations/0116_auto_20201116_0400.py diff --git a/enterprise/migrations/0116_auto_20201208_1759.py b/src/enterprise/migrations/0116_auto_20201208_1759.py similarity index 100% rename from enterprise/migrations/0116_auto_20201208_1759.py rename to src/enterprise/migrations/0116_auto_20201208_1759.py diff --git a/enterprise/migrations/0117_auto_20201215_0258.py b/src/enterprise/migrations/0117_auto_20201215_0258.py similarity index 100% rename from enterprise/migrations/0117_auto_20201215_0258.py rename to src/enterprise/migrations/0117_auto_20201215_0258.py diff --git a/enterprise/migrations/0120_systemwiderole_applies_to_all_contexts.py b/src/enterprise/migrations/0120_systemwiderole_applies_to_all_contexts.py similarity index 100% rename from enterprise/migrations/0120_systemwiderole_applies_to_all_contexts.py rename to src/enterprise/migrations/0120_systemwiderole_applies_to_all_contexts.py diff --git a/enterprise/migrations/0121_systemwiderole_add_ent_cust_field.py b/src/enterprise/migrations/0121_systemwiderole_add_ent_cust_field.py similarity index 100% rename from enterprise/migrations/0121_systemwiderole_add_ent_cust_field.py rename to src/enterprise/migrations/0121_systemwiderole_add_ent_cust_field.py diff --git a/enterprise/migrations/0122_remove_field_sync_enterprise_catalog_query.py b/src/enterprise/migrations/0122_remove_field_sync_enterprise_catalog_query.py similarity index 100% rename from enterprise/migrations/0122_remove_field_sync_enterprise_catalog_query.py rename to src/enterprise/migrations/0122_remove_field_sync_enterprise_catalog_query.py diff --git a/enterprise/migrations/0123_enterprisecustomeridentityprovider_default_provider.py b/src/enterprise/migrations/0123_enterprisecustomeridentityprovider_default_provider.py similarity index 100% rename from enterprise/migrations/0123_enterprisecustomeridentityprovider_default_provider.py rename to src/enterprise/migrations/0123_enterprisecustomeridentityprovider_default_provider.py diff --git a/enterprise/migrations/0124_auto_20210301_1309.py b/src/enterprise/migrations/0124_auto_20210301_1309.py similarity index 100% rename from enterprise/migrations/0124_auto_20210301_1309.py rename to src/enterprise/migrations/0124_auto_20210301_1309.py diff --git a/enterprise/migrations/0125_add_config_for_role_assign_backfill.py b/src/enterprise/migrations/0125_add_config_for_role_assign_backfill.py similarity index 100% rename from enterprise/migrations/0125_add_config_for_role_assign_backfill.py rename to src/enterprise/migrations/0125_add_config_for_role_assign_backfill.py diff --git a/enterprise/migrations/0126_auto_20210308_1522.py b/src/enterprise/migrations/0126_auto_20210308_1522.py similarity index 100% rename from enterprise/migrations/0126_auto_20210308_1522.py rename to src/enterprise/migrations/0126_auto_20210308_1522.py diff --git a/enterprise/migrations/0127_enterprisecatalogquery_uuid.py b/src/enterprise/migrations/0127_enterprisecatalogquery_uuid.py similarity index 100% rename from enterprise/migrations/0127_enterprisecatalogquery_uuid.py rename to src/enterprise/migrations/0127_enterprisecatalogquery_uuid.py diff --git a/enterprise/migrations/0128_enterprisecatalogquery_generate_uuids.py b/src/enterprise/migrations/0128_enterprisecatalogquery_generate_uuids.py similarity index 100% rename from enterprise/migrations/0128_enterprisecatalogquery_generate_uuids.py rename to src/enterprise/migrations/0128_enterprisecatalogquery_generate_uuids.py diff --git a/enterprise/migrations/0129_enterprisecatalogquery_uuid_unique.py b/src/enterprise/migrations/0129_enterprisecatalogquery_uuid_unique.py similarity index 100% rename from enterprise/migrations/0129_enterprisecatalogquery_uuid_unique.py rename to src/enterprise/migrations/0129_enterprisecatalogquery_uuid_unique.py diff --git a/enterprise/migrations/0130_lms_customer_lp_search_help_text.py b/src/enterprise/migrations/0130_lms_customer_lp_search_help_text.py similarity index 100% rename from enterprise/migrations/0130_lms_customer_lp_search_help_text.py rename to src/enterprise/migrations/0130_lms_customer_lp_search_help_text.py diff --git a/enterprise/migrations/0131_auto_20210517_0924.py b/src/enterprise/migrations/0131_auto_20210517_0924.py similarity index 100% rename from enterprise/migrations/0131_auto_20210517_0924.py rename to src/enterprise/migrations/0131_auto_20210517_0924.py diff --git a/enterprise/migrations/0132_auto_20210608_1921.py b/src/enterprise/migrations/0132_auto_20210608_1921.py similarity index 100% rename from enterprise/migrations/0132_auto_20210608_1921.py rename to src/enterprise/migrations/0132_auto_20210608_1921.py diff --git a/enterprise/migrations/0133_auto_20210608_1931.py b/src/enterprise/migrations/0133_auto_20210608_1931.py similarity index 100% rename from enterprise/migrations/0133_auto_20210608_1931.py rename to src/enterprise/migrations/0133_auto_20210608_1931.py diff --git a/enterprise/migrations/0134_enterprisecustomerreportingconfiguration_enable_compression.py b/src/enterprise/migrations/0134_enterprisecustomerreportingconfiguration_enable_compression.py similarity index 100% rename from enterprise/migrations/0134_enterprisecustomerreportingconfiguration_enable_compression.py rename to src/enterprise/migrations/0134_enterprisecustomerreportingconfiguration_enable_compression.py diff --git a/enterprise/migrations/0135_adminnotification_adminnotificationfilter_adminnotificationread.py b/src/enterprise/migrations/0135_adminnotification_adminnotificationfilter_adminnotificationread.py similarity index 100% rename from enterprise/migrations/0135_adminnotification_adminnotificationfilter_adminnotificationread.py rename to src/enterprise/migrations/0135_adminnotification_adminnotificationfilter_adminnotificationread.py diff --git a/enterprise/migrations/0136_auto_20210629_2129.py b/src/enterprise/migrations/0136_auto_20210629_2129.py similarity index 100% rename from enterprise/migrations/0136_auto_20210629_2129.py rename to src/enterprise/migrations/0136_auto_20210629_2129.py diff --git a/enterprise/migrations/0137_enrollment_email_update.py b/src/enterprise/migrations/0137_enrollment_email_update.py similarity index 100% rename from enterprise/migrations/0137_enrollment_email_update.py rename to src/enterprise/migrations/0137_enrollment_email_update.py diff --git a/enterprise/migrations/0138_bulkcatalogqueryupdatecommandconfiguration.py b/src/enterprise/migrations/0138_bulkcatalogqueryupdatecommandconfiguration.py similarity index 100% rename from enterprise/migrations/0138_bulkcatalogqueryupdatecommandconfiguration.py rename to src/enterprise/migrations/0138_bulkcatalogqueryupdatecommandconfiguration.py diff --git a/enterprise/migrations/0139_auto_20210803_1854.py b/src/enterprise/migrations/0139_auto_20210803_1854.py similarity index 100% rename from enterprise/migrations/0139_auto_20210803_1854.py rename to src/enterprise/migrations/0139_auto_20210803_1854.py diff --git a/enterprise/migrations/0140_update_enrollment_sources.py b/src/enterprise/migrations/0140_update_enrollment_sources.py similarity index 100% rename from enterprise/migrations/0140_update_enrollment_sources.py rename to src/enterprise/migrations/0140_update_enrollment_sources.py diff --git a/enterprise/migrations/0141_make_enterprisecatalogquery_title_unique.py b/src/enterprise/migrations/0141_make_enterprisecatalogquery_title_unique.py similarity index 100% rename from enterprise/migrations/0141_make_enterprisecatalogquery_title_unique.py rename to src/enterprise/migrations/0141_make_enterprisecatalogquery_title_unique.py diff --git a/enterprise/migrations/0142_auto_20210907_2059.py b/src/enterprise/migrations/0142_auto_20210907_2059.py similarity index 100% rename from enterprise/migrations/0142_auto_20210907_2059.py rename to src/enterprise/migrations/0142_auto_20210907_2059.py diff --git a/enterprise/migrations/0143_auto_20210908_0559.py b/src/enterprise/migrations/0143_auto_20210908_0559.py similarity index 100% rename from enterprise/migrations/0143_auto_20210908_0559.py rename to src/enterprise/migrations/0143_auto_20210908_0559.py diff --git a/enterprise/migrations/0144_auto_20211011_1030.py b/src/enterprise/migrations/0144_auto_20211011_1030.py similarity index 100% rename from enterprise/migrations/0144_auto_20211011_1030.py rename to src/enterprise/migrations/0144_auto_20211011_1030.py diff --git a/enterprise/migrations/0145_auto_20211013_1018.py b/src/enterprise/migrations/0145_auto_20211013_1018.py similarity index 100% rename from enterprise/migrations/0145_auto_20211013_1018.py rename to src/enterprise/migrations/0145_auto_20211013_1018.py diff --git a/enterprise/migrations/0146_enterprise_customer_invite_key.py b/src/enterprise/migrations/0146_enterprise_customer_invite_key.py similarity index 100% rename from enterprise/migrations/0146_enterprise_customer_invite_key.py rename to src/enterprise/migrations/0146_enterprise_customer_invite_key.py diff --git a/enterprise/migrations/0147_auto_20211129_1949.py b/src/enterprise/migrations/0147_auto_20211129_1949.py similarity index 100% rename from enterprise/migrations/0147_auto_20211129_1949.py rename to src/enterprise/migrations/0147_auto_20211129_1949.py diff --git a/enterprise/migrations/0148_auto_20211129_2114.py b/src/enterprise/migrations/0148_auto_20211129_2114.py similarity index 100% rename from enterprise/migrations/0148_auto_20211129_2114.py rename to src/enterprise/migrations/0148_auto_20211129_2114.py diff --git a/enterprise/migrations/0149_invite_key_required_default_expiry_backfill.py b/src/enterprise/migrations/0149_invite_key_required_default_expiry_backfill.py similarity index 100% rename from enterprise/migrations/0149_invite_key_required_default_expiry_backfill.py rename to src/enterprise/migrations/0149_invite_key_required_default_expiry_backfill.py diff --git a/enterprise/migrations/0150_invite_key_expiry_required.py b/src/enterprise/migrations/0150_invite_key_expiry_required.py similarity index 100% rename from enterprise/migrations/0150_invite_key_expiry_required.py rename to src/enterprise/migrations/0150_invite_key_expiry_required.py diff --git a/enterprise/migrations/0151_add_is_active_to_invite_key.py b/src/enterprise/migrations/0151_add_is_active_to_invite_key.py similarity index 100% rename from enterprise/migrations/0151_add_is_active_to_invite_key.py rename to src/enterprise/migrations/0151_add_is_active_to_invite_key.py diff --git a/enterprise/migrations/0152_add_should_inactivate_other_customers.py b/src/enterprise/migrations/0152_add_should_inactivate_other_customers.py similarity index 100% rename from enterprise/migrations/0152_add_should_inactivate_other_customers.py rename to src/enterprise/migrations/0152_add_should_inactivate_other_customers.py diff --git a/enterprise/migrations/0153_add_enable_browse_and_request.py b/src/enterprise/migrations/0153_add_enable_browse_and_request.py similarity index 100% rename from enterprise/migrations/0153_add_enable_browse_and_request.py rename to src/enterprise/migrations/0153_add_enable_browse_and_request.py diff --git a/enterprise/migrations/0154_alter_systemwideenterpriseuserroleassignment_unique_together.py b/src/enterprise/migrations/0154_alter_systemwideenterpriseuserroleassignment_unique_together.py similarity index 100% rename from enterprise/migrations/0154_alter_systemwideenterpriseuserroleassignment_unique_together.py rename to src/enterprise/migrations/0154_alter_systemwideenterpriseuserroleassignment_unique_together.py diff --git a/enterprise/migrations/0155_add_is_relinkable_to_enterprise_customer_user.py b/src/enterprise/migrations/0155_add_is_relinkable_to_enterprise_customer_user.py similarity index 100% rename from enterprise/migrations/0155_add_is_relinkable_to_enterprise_customer_user.py rename to src/enterprise/migrations/0155_add_is_relinkable_to_enterprise_customer_user.py diff --git a/enterprise/migrations/0156_add_is_active_role_assignment.py b/src/enterprise/migrations/0156_add_is_active_role_assignment.py similarity index 100% rename from enterprise/migrations/0156_add_is_active_role_assignment.py rename to src/enterprise/migrations/0156_add_is_active_role_assignment.py diff --git a/enterprise/migrations/0157_make_field_nullable_before_removal.py b/src/enterprise/migrations/0157_make_field_nullable_before_removal.py similarity index 100% rename from enterprise/migrations/0157_make_field_nullable_before_removal.py rename to src/enterprise/migrations/0157_make_field_nullable_before_removal.py diff --git a/enterprise/migrations/0158_remove_is_active_from_role_assignment.py b/src/enterprise/migrations/0158_remove_is_active_from_role_assignment.py similarity index 100% rename from enterprise/migrations/0158_remove_is_active_from_role_assignment.py rename to src/enterprise/migrations/0158_remove_is_active_from_role_assignment.py diff --git a/enterprise/migrations/0159_add_enable_learner_portal_offers.py b/src/enterprise/migrations/0159_add_enable_learner_portal_offers.py similarity index 100% rename from enterprise/migrations/0159_add_enable_learner_portal_offers.py rename to src/enterprise/migrations/0159_add_enable_learner_portal_offers.py diff --git a/enterprise/migrations/0160_add_enable_portal_learner_credit_management_screen.py b/src/enterprise/migrations/0160_add_enable_portal_learner_credit_management_screen.py similarity index 100% rename from enterprise/migrations/0160_add_enable_portal_learner_credit_management_screen.py rename to src/enterprise/migrations/0160_add_enable_portal_learner_credit_management_screen.py diff --git a/enterprise/migrations/0161_alter_enterprisecustomerreportingconfiguration_data_type.py b/src/enterprise/migrations/0161_alter_enterprisecustomerreportingconfiguration_data_type.py similarity index 100% rename from enterprise/migrations/0161_alter_enterprisecustomerreportingconfiguration_data_type.py rename to src/enterprise/migrations/0161_alter_enterprisecustomerreportingconfiguration_data_type.py diff --git a/enterprise/migrations/0162_add_enable_executive_education_2U_fulfillment.py b/src/enterprise/migrations/0162_add_enable_executive_education_2U_fulfillment.py similarity index 100% rename from enterprise/migrations/0162_add_enable_executive_education_2U_fulfillment.py rename to src/enterprise/migrations/0162_add_enable_executive_education_2U_fulfillment.py diff --git a/enterprise/migrations/0163_auto_20220928_1611.py b/src/enterprise/migrations/0163_auto_20220928_1611.py similarity index 100% rename from enterprise/migrations/0163_auto_20220928_1611.py rename to src/enterprise/migrations/0163_auto_20220928_1611.py diff --git a/enterprise/migrations/0164_enterprisecatalogquery_include_exec_ed_2u_courses.py b/src/enterprise/migrations/0164_enterprisecatalogquery_include_exec_ed_2u_courses.py similarity index 100% rename from enterprise/migrations/0164_enterprisecatalogquery_include_exec_ed_2u_courses.py rename to src/enterprise/migrations/0164_enterprisecatalogquery_include_exec_ed_2u_courses.py diff --git a/enterprise/migrations/0165_alter_enterprisecustomerreportingconfiguration_pgp_encryption_key.py b/src/enterprise/migrations/0165_alter_enterprisecustomerreportingconfiguration_pgp_encryption_key.py similarity index 100% rename from enterprise/migrations/0165_alter_enterprisecustomerreportingconfiguration_pgp_encryption_key.py rename to src/enterprise/migrations/0165_alter_enterprisecustomerreportingconfiguration_pgp_encryption_key.py diff --git a/enterprise/migrations/0166_auto_20221209_0819.py b/src/enterprise/migrations/0166_auto_20221209_0819.py similarity index 100% rename from enterprise/migrations/0166_auto_20221209_0819.py rename to src/enterprise/migrations/0166_auto_20221209_0819.py diff --git a/enterprise/migrations/0167_auto_20230209_2108.py b/src/enterprise/migrations/0167_auto_20230209_2108.py similarity index 100% rename from enterprise/migrations/0167_auto_20230209_2108.py rename to src/enterprise/migrations/0167_auto_20230209_2108.py diff --git a/enterprise/migrations/0168_auto_20230222_1621.py b/src/enterprise/migrations/0168_auto_20230222_1621.py similarity index 100% rename from enterprise/migrations/0168_auto_20230222_1621.py rename to src/enterprise/migrations/0168_auto_20230222_1621.py diff --git a/enterprise/migrations/0169_auto_20230222_1621.py b/src/enterprise/migrations/0169_auto_20230222_1621.py similarity index 100% rename from enterprise/migrations/0169_auto_20230222_1621.py rename to src/enterprise/migrations/0169_auto_20230222_1621.py diff --git a/enterprise/migrations/0170_auto_20230301_1627.py b/src/enterprise/migrations/0170_auto_20230301_1627.py similarity index 100% rename from enterprise/migrations/0170_auto_20230301_1627.py rename to src/enterprise/migrations/0170_auto_20230301_1627.py diff --git a/enterprise/migrations/0171_auto_20230503_1413.py b/src/enterprise/migrations/0171_auto_20230503_1413.py similarity index 100% rename from enterprise/migrations/0171_auto_20230503_1413.py rename to src/enterprise/migrations/0171_auto_20230503_1413.py diff --git a/enterprise/migrations/0172_auto_20230517_1550.py b/src/enterprise/migrations/0172_auto_20230517_1550.py similarity index 100% rename from enterprise/migrations/0172_auto_20230517_1550.py rename to src/enterprise/migrations/0172_auto_20230517_1550.py diff --git a/enterprise/migrations/0173_auto_20230531_1459.py b/src/enterprise/migrations/0173_auto_20230531_1459.py similarity index 100% rename from enterprise/migrations/0173_auto_20230531_1459.py rename to src/enterprise/migrations/0173_auto_20230531_1459.py diff --git a/enterprise/migrations/0174_auto_20230608_2041.py b/src/enterprise/migrations/0174_auto_20230608_2041.py similarity index 100% rename from enterprise/migrations/0174_auto_20230608_2041.py rename to src/enterprise/migrations/0174_auto_20230608_2041.py diff --git a/enterprise/migrations/0175_auto_20230629_2330.py b/src/enterprise/migrations/0175_auto_20230629_2330.py similarity index 100% rename from enterprise/migrations/0175_auto_20230629_2330.py rename to src/enterprise/migrations/0175_auto_20230629_2330.py diff --git a/enterprise/migrations/0176_auto_20230712_1751.py b/src/enterprise/migrations/0176_auto_20230712_1751.py similarity index 100% rename from enterprise/migrations/0176_auto_20230712_1751.py rename to src/enterprise/migrations/0176_auto_20230712_1751.py diff --git a/enterprise/migrations/0177_auto_20230712_1925.py b/src/enterprise/migrations/0177_auto_20230712_1925.py similarity index 100% rename from enterprise/migrations/0177_auto_20230712_1925.py rename to src/enterprise/migrations/0177_auto_20230712_1925.py diff --git a/enterprise/migrations/0178_auto_20230808_0923.py b/src/enterprise/migrations/0178_auto_20230808_0923.py similarity index 100% rename from enterprise/migrations/0178_auto_20230808_0923.py rename to src/enterprise/migrations/0178_auto_20230808_0923.py diff --git a/enterprise/migrations/0179_restore_historical_table.py b/src/enterprise/migrations/0179_restore_historical_table.py similarity index 100% rename from enterprise/migrations/0179_restore_historical_table.py rename to src/enterprise/migrations/0179_restore_historical_table.py diff --git a/enterprise/migrations/0180_chatgptresponse.py b/src/enterprise/migrations/0180_chatgptresponse.py similarity index 100% rename from enterprise/migrations/0180_chatgptresponse.py rename to src/enterprise/migrations/0180_chatgptresponse.py diff --git a/enterprise/migrations/0181_enterprisecustomerssoconfiguration_historicalenterprisecustomerssoconfiguration.py b/src/enterprise/migrations/0181_enterprisecustomerssoconfiguration_historicalenterprisecustomerssoconfiguration.py similarity index 100% rename from enterprise/migrations/0181_enterprisecustomerssoconfiguration_historicalenterprisecustomerssoconfiguration.py rename to src/enterprise/migrations/0181_enterprisecustomerssoconfiguration_historicalenterprisecustomerssoconfiguration.py diff --git a/enterprise/migrations/0182_auto_20230829_1741.py b/src/enterprise/migrations/0182_auto_20230829_1741.py similarity index 100% rename from enterprise/migrations/0182_auto_20230829_1741.py rename to src/enterprise/migrations/0182_auto_20230829_1741.py diff --git a/enterprise/migrations/0183_auto_20230906_1435.py b/src/enterprise/migrations/0183_auto_20230906_1435.py similarity index 100% rename from enterprise/migrations/0183_auto_20230906_1435.py rename to src/enterprise/migrations/0183_auto_20230906_1435.py diff --git a/enterprise/migrations/0184_auto_20230914_2057.py b/src/enterprise/migrations/0184_auto_20230914_2057.py similarity index 100% rename from enterprise/migrations/0184_auto_20230914_2057.py rename to src/enterprise/migrations/0184_auto_20230914_2057.py diff --git a/enterprise/migrations/0185_auto_20230921_1007.py b/src/enterprise/migrations/0185_auto_20230921_1007.py similarity index 100% rename from enterprise/migrations/0185_auto_20230921_1007.py rename to src/enterprise/migrations/0185_auto_20230921_1007.py diff --git a/enterprise/migrations/0186_auto_20230921_1828.py b/src/enterprise/migrations/0186_auto_20230921_1828.py similarity index 100% rename from enterprise/migrations/0186_auto_20230921_1828.py rename to src/enterprise/migrations/0186_auto_20230921_1828.py diff --git a/enterprise/migrations/0187_auto_20230926_1627.py b/src/enterprise/migrations/0187_auto_20230926_1627.py similarity index 100% rename from enterprise/migrations/0187_auto_20230926_1627.py rename to src/enterprise/migrations/0187_auto_20230926_1627.py diff --git a/enterprise/migrations/0188_alter_learnercreditenterprisecourseenrollment_enterprise_course_enrollment_and_more.py b/src/enterprise/migrations/0188_alter_learnercreditenterprisecourseenrollment_enterprise_course_enrollment_and_more.py similarity index 100% rename from enterprise/migrations/0188_alter_learnercreditenterprisecourseenrollment_enterprise_course_enrollment_and_more.py rename to src/enterprise/migrations/0188_alter_learnercreditenterprisecourseenrollment_enterprise_course_enrollment_and_more.py diff --git a/enterprise/migrations/0189_auto_20231002_0902.py b/src/enterprise/migrations/0189_auto_20231002_0902.py similarity index 100% rename from enterprise/migrations/0189_auto_20231002_0902.py rename to src/enterprise/migrations/0189_auto_20231002_0902.py diff --git a/enterprise/migrations/0190_auto_20231003_0719.py b/src/enterprise/migrations/0190_auto_20231003_0719.py similarity index 100% rename from enterprise/migrations/0190_auto_20231003_0719.py rename to src/enterprise/migrations/0190_auto_20231003_0719.py diff --git a/enterprise/migrations/0191_auto_20231006_0948.py b/src/enterprise/migrations/0191_auto_20231006_0948.py similarity index 100% rename from enterprise/migrations/0191_auto_20231006_0948.py rename to src/enterprise/migrations/0191_auto_20231006_0948.py diff --git a/enterprise/migrations/0192_auto_20231009_1302.py b/src/enterprise/migrations/0192_auto_20231009_1302.py similarity index 100% rename from enterprise/migrations/0192_auto_20231009_1302.py rename to src/enterprise/migrations/0192_auto_20231009_1302.py diff --git a/enterprise/migrations/0193_auto_20231005_1708.py b/src/enterprise/migrations/0193_auto_20231005_1708.py similarity index 100% rename from enterprise/migrations/0193_auto_20231005_1708.py rename to src/enterprise/migrations/0193_auto_20231005_1708.py diff --git a/enterprise/migrations/0194_auto_20231013_1359.py b/src/enterprise/migrations/0194_auto_20231013_1359.py similarity index 100% rename from enterprise/migrations/0194_auto_20231013_1359.py rename to src/enterprise/migrations/0194_auto_20231013_1359.py diff --git a/enterprise/migrations/0195_auto_20231130_1837.py b/src/enterprise/migrations/0195_auto_20231130_1837.py similarity index 100% rename from enterprise/migrations/0195_auto_20231130_1837.py rename to src/enterprise/migrations/0195_auto_20231130_1837.py diff --git a/enterprise/migrations/0196_backfill_sso_marked_authorized.py b/src/enterprise/migrations/0196_backfill_sso_marked_authorized.py similarity index 100% rename from enterprise/migrations/0196_backfill_sso_marked_authorized.py rename to src/enterprise/migrations/0196_backfill_sso_marked_authorized.py diff --git a/enterprise/migrations/0197_auto_20231130_2239.py b/src/enterprise/migrations/0197_auto_20231130_2239.py similarity index 100% rename from enterprise/migrations/0197_auto_20231130_2239.py rename to src/enterprise/migrations/0197_auto_20231130_2239.py diff --git a/enterprise/migrations/0198_alter_enterprisecourseenrollment_options.py b/src/enterprise/migrations/0198_alter_enterprisecourseenrollment_options.py similarity index 100% rename from enterprise/migrations/0198_alter_enterprisecourseenrollment_options.py rename to src/enterprise/migrations/0198_alter_enterprisecourseenrollment_options.py diff --git a/enterprise/migrations/0199_auto_20240130_0628.py b/src/enterprise/migrations/0199_auto_20240130_0628.py similarity index 100% rename from enterprise/migrations/0199_auto_20240130_0628.py rename to src/enterprise/migrations/0199_auto_20240130_0628.py diff --git a/enterprise/migrations/0200_enterprisegroup_enterprisegroupmembership_historicalenterprisegroup_historicalenterprisegroupmembers.py b/src/enterprise/migrations/0200_enterprisegroup_enterprisegroupmembership_historicalenterprisegroup_historicalenterprisegroupmembers.py similarity index 100% rename from enterprise/migrations/0200_enterprisegroup_enterprisegroupmembership_historicalenterprisegroup_historicalenterprisegroupmembers.py rename to src/enterprise/migrations/0200_enterprisegroup_enterprisegroupmembership_historicalenterprisegroup_historicalenterprisegroupmembers.py diff --git a/enterprise/migrations/0201_auto_20240227_2227.py b/src/enterprise/migrations/0201_auto_20240227_2227.py similarity index 100% rename from enterprise/migrations/0201_auto_20240227_2227.py rename to src/enterprise/migrations/0201_auto_20240227_2227.py diff --git a/enterprise/migrations/0202_enterprisegroup_applies_to_all_contexts_and_more.py b/src/enterprise/migrations/0202_enterprisegroup_applies_to_all_contexts_and_more.py similarity index 100% rename from enterprise/migrations/0202_enterprisegroup_applies_to_all_contexts_and_more.py rename to src/enterprise/migrations/0202_enterprisegroup_applies_to_all_contexts_and_more.py diff --git a/enterprise/migrations/0203_auto_20240312_1527.py b/src/enterprise/migrations/0203_auto_20240312_1527.py similarity index 100% rename from enterprise/migrations/0203_auto_20240312_1527.py rename to src/enterprise/migrations/0203_auto_20240312_1527.py diff --git a/enterprise/migrations/0204_auto_20240408_0723.py b/src/enterprise/migrations/0204_auto_20240408_0723.py similarity index 100% rename from enterprise/migrations/0204_auto_20240408_0723.py rename to src/enterprise/migrations/0204_auto_20240408_0723.py diff --git a/enterprise/migrations/0205_auto_20240408_1117.py b/src/enterprise/migrations/0205_auto_20240408_1117.py similarity index 100% rename from enterprise/migrations/0205_auto_20240408_1117.py rename to src/enterprise/migrations/0205_auto_20240408_1117.py diff --git a/enterprise/migrations/0206_auto_20240408_1344.py b/src/enterprise/migrations/0206_auto_20240408_1344.py similarity index 100% rename from enterprise/migrations/0206_auto_20240408_1344.py rename to src/enterprise/migrations/0206_auto_20240408_1344.py diff --git a/enterprise/migrations/0207_alter_enterprisegroupmembership_enterprise_customer_user_and_more.py b/src/enterprise/migrations/0207_alter_enterprisegroupmembership_enterprise_customer_user_and_more.py similarity index 100% rename from enterprise/migrations/0207_alter_enterprisegroupmembership_enterprise_customer_user_and_more.py rename to src/enterprise/migrations/0207_alter_enterprisegroupmembership_enterprise_customer_user_and_more.py diff --git a/enterprise/migrations/0208_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py b/src/enterprise/migrations/0208_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py similarity index 100% rename from enterprise/migrations/0208_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py rename to src/enterprise/migrations/0208_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py diff --git a/enterprise/migrations/0209_alter_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py b/src/enterprise/migrations/0209_alter_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py similarity index 100% rename from enterprise/migrations/0209_alter_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py rename to src/enterprise/migrations/0209_alter_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py diff --git a/enterprise/migrations/0210_enterprisecustomer_enable_learner_portal_sidebar_message_and_more.py b/src/enterprise/migrations/0210_enterprisecustomer_enable_learner_portal_sidebar_message_and_more.py similarity index 100% rename from enterprise/migrations/0210_enterprisecustomer_enable_learner_portal_sidebar_message_and_more.py rename to src/enterprise/migrations/0210_enterprisecustomer_enable_learner_portal_sidebar_message_and_more.py diff --git a/enterprise/migrations/0211_enterprisecustomer_show_videos_in_learner_portal_search_results_and_more.py b/src/enterprise/migrations/0211_enterprisecustomer_show_videos_in_learner_portal_search_results_and_more.py similarity index 100% rename from enterprise/migrations/0211_enterprisecustomer_show_videos_in_learner_portal_search_results_and_more.py rename to src/enterprise/migrations/0211_enterprisecustomer_show_videos_in_learner_portal_search_results_and_more.py diff --git a/enterprise/migrations/0212_alter_enterprisecustomer_career_engagement_network_message_and_more.py b/src/enterprise/migrations/0212_alter_enterprisecustomer_career_engagement_network_message_and_more.py similarity index 100% rename from enterprise/migrations/0212_alter_enterprisecustomer_career_engagement_network_message_and_more.py rename to src/enterprise/migrations/0212_alter_enterprisecustomer_career_engagement_network_message_and_more.py diff --git a/enterprise/migrations/0213_populate_learner_portal_sidebar_content_and_more.py b/src/enterprise/migrations/0213_populate_learner_portal_sidebar_content_and_more.py similarity index 100% rename from enterprise/migrations/0213_populate_learner_portal_sidebar_content_and_more.py rename to src/enterprise/migrations/0213_populate_learner_portal_sidebar_content_and_more.py diff --git a/enterprise/migrations/0214_alter_enterprisecustomer_learner_portal_sidebar_content_and_more.py b/src/enterprise/migrations/0214_alter_enterprisecustomer_learner_portal_sidebar_content_and_more.py similarity index 100% rename from enterprise/migrations/0214_alter_enterprisecustomer_learner_portal_sidebar_content_and_more.py rename to src/enterprise/migrations/0214_alter_enterprisecustomer_learner_portal_sidebar_content_and_more.py diff --git a/enterprise/migrations/0215_remove_enterprisecustomer_career_engagement_network_message_and_more.py b/src/enterprise/migrations/0215_remove_enterprisecustomer_career_engagement_network_message_and_more.py similarity index 100% rename from enterprise/migrations/0215_remove_enterprisecustomer_career_engagement_network_message_and_more.py rename to src/enterprise/migrations/0215_remove_enterprisecustomer_career_engagement_network_message_and_more.py diff --git a/enterprise/migrations/0216_enterprisegroupmembership_errored_at_and_more.py b/src/enterprise/migrations/0216_enterprisegroupmembership_errored_at_and_more.py similarity index 100% rename from enterprise/migrations/0216_enterprisegroupmembership_errored_at_and_more.py rename to src/enterprise/migrations/0216_enterprisegroupmembership_errored_at_and_more.py diff --git a/enterprise/migrations/0217_alter_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py b/src/enterprise/migrations/0217_alter_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py similarity index 100% rename from enterprise/migrations/0217_alter_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py rename to src/enterprise/migrations/0217_alter_enterprisecustomer_disable_expiry_messaging_for_learner_credit_and_more.py diff --git a/enterprise/migrations/0218_add_provisioning_admin_role.py b/src/enterprise/migrations/0218_add_provisioning_admin_role.py similarity index 100% rename from enterprise/migrations/0218_add_provisioning_admin_role.py rename to src/enterprise/migrations/0218_add_provisioning_admin_role.py diff --git a/enterprise/migrations/0219_alter_enterprisecatalogquery_content_filter.py b/src/enterprise/migrations/0219_alter_enterprisecatalogquery_content_filter.py similarity index 100% rename from enterprise/migrations/0219_alter_enterprisecatalogquery_content_filter.py rename to src/enterprise/migrations/0219_alter_enterprisecatalogquery_content_filter.py diff --git a/enterprise/migrations/0220_alter_updateroleassignmentswithcustomersconfig_role.py b/src/enterprise/migrations/0220_alter_updateroleassignmentswithcustomersconfig_role.py similarity index 100% rename from enterprise/migrations/0220_alter_updateroleassignmentswithcustomersconfig_role.py rename to src/enterprise/migrations/0220_alter_updateroleassignmentswithcustomersconfig_role.py diff --git a/enterprise/migrations/0221_enterprisegroup_group_type_and_more.py b/src/enterprise/migrations/0221_enterprisegroup_group_type_and_more.py similarity index 100% rename from enterprise/migrations/0221_enterprisegroup_group_type_and_more.py rename to src/enterprise/migrations/0221_enterprisegroup_group_type_and_more.py diff --git a/enterprise/migrations/0222_alter_enterprisegroup_group_type_and_more.py b/src/enterprise/migrations/0222_alter_enterprisegroup_group_type_and_more.py similarity index 100% rename from enterprise/migrations/0222_alter_enterprisegroup_group_type_and_more.py rename to src/enterprise/migrations/0222_alter_enterprisegroup_group_type_and_more.py diff --git a/enterprise/migrations/0223_default_enrollments.py b/src/enterprise/migrations/0223_default_enrollments.py similarity index 100% rename from enterprise/migrations/0223_default_enrollments.py rename to src/enterprise/migrations/0223_default_enrollments.py diff --git a/enterprise/migrations/0224_alter_enterprisegroup_applies_to_all_contexts_and_more.py b/src/enterprise/migrations/0224_alter_enterprisegroup_applies_to_all_contexts_and_more.py similarity index 100% rename from enterprise/migrations/0224_alter_enterprisegroup_applies_to_all_contexts_and_more.py rename to src/enterprise/migrations/0224_alter_enterprisegroup_applies_to_all_contexts_and_more.py diff --git a/enterprise/migrations/0225_remove_enterprisegroup_applies_to_all_contexts_and_more.py b/src/enterprise/migrations/0225_remove_enterprisegroup_applies_to_all_contexts_and_more.py similarity index 100% rename from enterprise/migrations/0225_remove_enterprisegroup_applies_to_all_contexts_and_more.py rename to src/enterprise/migrations/0225_remove_enterprisegroup_applies_to_all_contexts_and_more.py diff --git a/enterprise/migrations/0226_alter_enterprisegroup_name_and_more.py b/src/enterprise/migrations/0226_alter_enterprisegroup_name_and_more.py similarity index 100% rename from enterprise/migrations/0226_alter_enterprisegroup_name_and_more.py rename to src/enterprise/migrations/0226_alter_enterprisegroup_name_and_more.py diff --git a/enterprise/migrations/0227_alter_defaultenterpriseenrollmentintention_content_type_and_more.py b/src/enterprise/migrations/0227_alter_defaultenterpriseenrollmentintention_content_type_and_more.py similarity index 100% rename from enterprise/migrations/0227_alter_defaultenterpriseenrollmentintention_content_type_and_more.py rename to src/enterprise/migrations/0227_alter_defaultenterpriseenrollmentintention_content_type_and_more.py diff --git a/enterprise/migrations/0228_alter_defaultenterpriseenrollmentrealization_realized_enrollment.py b/src/enterprise/migrations/0228_alter_defaultenterpriseenrollmentrealization_realized_enrollment.py similarity index 100% rename from enterprise/migrations/0228_alter_defaultenterpriseenrollmentrealization_realized_enrollment.py rename to src/enterprise/migrations/0228_alter_defaultenterpriseenrollmentrealization_realized_enrollment.py diff --git a/enterprise/migrations/0229_enterprisecustomeruser_user_fk_and_more.py b/src/enterprise/migrations/0229_enterprisecustomeruser_user_fk_and_more.py similarity index 100% rename from enterprise/migrations/0229_enterprisecustomeruser_user_fk_and_more.py rename to src/enterprise/migrations/0229_enterprisecustomeruser_user_fk_and_more.py diff --git a/enterprise/migrations/0230_alter_enterprisecustomeruser_user_fk_and_more.py b/src/enterprise/migrations/0230_alter_enterprisecustomeruser_user_fk_and_more.py similarity index 100% rename from enterprise/migrations/0230_alter_enterprisecustomeruser_user_fk_and_more.py rename to src/enterprise/migrations/0230_alter_enterprisecustomeruser_user_fk_and_more.py diff --git a/enterprise/migrations/0231_alter_enterprisecustomeruser_user_fk_and_more.py b/src/enterprise/migrations/0231_alter_enterprisecustomeruser_user_fk_and_more.py similarity index 100% rename from enterprise/migrations/0231_alter_enterprisecustomeruser_user_fk_and_more.py rename to src/enterprise/migrations/0231_alter_enterprisecustomeruser_user_fk_and_more.py diff --git a/enterprise/migrations/0232_backfill_ecu_table_user_fk_data_migration.py b/src/enterprise/migrations/0232_backfill_ecu_table_user_fk_data_migration.py similarity index 100% rename from enterprise/migrations/0232_backfill_ecu_table_user_fk_data_migration.py rename to src/enterprise/migrations/0232_backfill_ecu_table_user_fk_data_migration.py diff --git a/enterprise/migrations/0233_onboardingflow.py b/src/enterprise/migrations/0233_onboardingflow.py similarity index 100% rename from enterprise/migrations/0233_onboardingflow.py rename to src/enterprise/migrations/0233_onboardingflow.py diff --git a/enterprise/migrations/0234_fake_enterprisecustomeruser_user_fk_state.py b/src/enterprise/migrations/0234_fake_enterprisecustomeruser_user_fk_state.py similarity index 100% rename from enterprise/migrations/0234_fake_enterprisecustomeruser_user_fk_state.py rename to src/enterprise/migrations/0234_fake_enterprisecustomeruser_user_fk_state.py diff --git a/enterprise/migrations/0235_enterprisecustomeradmin.py b/src/enterprise/migrations/0235_enterprisecustomeradmin.py similarity index 100% rename from enterprise/migrations/0235_enterprisecustomeradmin.py rename to src/enterprise/migrations/0235_enterprisecustomeradmin.py diff --git a/enterprise/migrations/0236_create_vw_enterprise_customer_ecus_pecus.py b/src/enterprise/migrations/0236_create_vw_enterprise_customer_ecus_pecus.py similarity index 100% rename from enterprise/migrations/0236_create_vw_enterprise_customer_ecus_pecus.py rename to src/enterprise/migrations/0236_create_vw_enterprise_customer_ecus_pecus.py diff --git a/enterprise/migrations/0237_enterprisecustomersupportusersview.py b/src/enterprise/migrations/0237_enterprisecustomersupportusersview.py similarity index 100% rename from enterprise/migrations/0237_enterprisecustomersupportusersview.py rename to src/enterprise/migrations/0237_enterprisecustomersupportusersview.py diff --git a/enterprise/migrations/0238_enterprisecustomer_enable_learner_credit_message_box_and_more.py b/src/enterprise/migrations/0238_enterprisecustomer_enable_learner_credit_message_box_and_more.py similarity index 100% rename from enterprise/migrations/0238_enterprisecustomer_enable_learner_credit_message_box_and_more.py rename to src/enterprise/migrations/0238_enterprisecustomer_enable_learner_credit_message_box_and_more.py diff --git a/enterprise/migrations/0239_backfill_enable_learner_credit_message_box.py b/src/enterprise/migrations/0239_backfill_enable_learner_credit_message_box.py similarity index 100% rename from enterprise/migrations/0239_backfill_enable_learner_credit_message_box.py rename to src/enterprise/migrations/0239_backfill_enable_learner_credit_message_box.py diff --git a/enterprise/migrations/0240_alter_enterprisecustomer_enable_data_sharing_consent_and_more.py b/src/enterprise/migrations/0240_alter_enterprisecustomer_enable_data_sharing_consent_and_more.py similarity index 100% rename from enterprise/migrations/0240_alter_enterprisecustomer_enable_data_sharing_consent_and_more.py rename to src/enterprise/migrations/0240_alter_enterprisecustomer_enable_data_sharing_consent_and_more.py diff --git a/enterprise/migrations/0241_alter_defaultenterpriseenrollmentintention_realized_enrollments.py b/src/enterprise/migrations/0241_alter_defaultenterpriseenrollmentintention_realized_enrollments.py similarity index 100% rename from enterprise/migrations/0241_alter_defaultenterpriseenrollmentintention_realized_enrollments.py rename to src/enterprise/migrations/0241_alter_defaultenterpriseenrollmentintention_realized_enrollments.py diff --git a/enterprise/migrations/0242_mariadb_uuid_conversion.py b/src/enterprise/migrations/0242_mariadb_uuid_conversion.py similarity index 100% rename from enterprise/migrations/0242_mariadb_uuid_conversion.py rename to src/enterprise/migrations/0242_mariadb_uuid_conversion.py diff --git a/enterprise/migrations/0243_add_reminder_sent_at_to_pending_admin.py b/src/enterprise/migrations/0243_add_reminder_sent_at_to_pending_admin.py similarity index 100% rename from enterprise/migrations/0243_add_reminder_sent_at_to_pending_admin.py rename to src/enterprise/migrations/0243_add_reminder_sent_at_to_pending_admin.py diff --git a/enterprise/migrations/0244_enable_academies_for_existing_customers.py b/src/enterprise/migrations/0244_enable_academies_for_existing_customers.py similarity index 100% rename from enterprise/migrations/0244_enable_academies_for_existing_customers.py rename to src/enterprise/migrations/0244_enable_academies_for_existing_customers.py diff --git a/enterprise/migrations/0245_alter_enterprisecustomer_enable_academies_and_more.py b/src/enterprise/migrations/0245_alter_enterprisecustomer_enable_academies_and_more.py similarity index 100% rename from enterprise/migrations/0245_alter_enterprisecustomer_enable_academies_and_more.py rename to src/enterprise/migrations/0245_alter_enterprisecustomer_enable_academies_and_more.py diff --git a/enterprise/migrations/0246_enrollment_email_update_02.py b/src/enterprise/migrations/0246_enrollment_email_update_02.py similarity index 100% rename from enterprise/migrations/0246_enrollment_email_update_02.py rename to src/enterprise/migrations/0246_enrollment_email_update_02.py diff --git a/enterprise/migrations/0247_enterprisecustomer_enable_credit_and_industry_pathways_and_more.py b/src/enterprise/migrations/0247_enterprisecustomer_enable_credit_and_industry_pathways_and_more.py similarity index 100% rename from enterprise/migrations/0247_enterprisecustomer_enable_credit_and_industry_pathways_and_more.py rename to src/enterprise/migrations/0247_enterprisecustomer_enable_credit_and_industry_pathways_and_more.py diff --git a/enterprise/migrations/0248_alter_enterprisecustomer_enable_credit_and_industry_pathways_and_more.py b/src/enterprise/migrations/0248_alter_enterprisecustomer_enable_credit_and_industry_pathways_and_more.py similarity index 100% rename from enterprise/migrations/0248_alter_enterprisecustomer_enable_credit_and_industry_pathways_and_more.py rename to src/enterprise/migrations/0248_alter_enterprisecustomer_enable_credit_and_industry_pathways_and_more.py diff --git a/enterprise/migrations/0249_enterprisecustomer_enable_people_management_and_more.py b/src/enterprise/migrations/0249_enterprisecustomer_enable_people_management_and_more.py similarity index 100% rename from enterprise/migrations/0249_enterprisecustomer_enable_people_management_and_more.py rename to src/enterprise/migrations/0249_enterprisecustomer_enable_people_management_and_more.py diff --git a/enterprise/migrations/0250_alter_enterprisecustomer_customer_type_and_more.py b/src/enterprise/migrations/0250_alter_enterprisecustomer_customer_type_and_more.py similarity index 100% rename from enterprise/migrations/0250_alter_enterprisecustomer_customer_type_and_more.py rename to src/enterprise/migrations/0250_alter_enterprisecustomer_customer_type_and_more.py diff --git a/enterprise/migrations/0251_add_non_production_customer_type.py b/src/enterprise/migrations/0251_add_non_production_customer_type.py similarity index 100% rename from enterprise/migrations/0251_add_non_production_customer_type.py rename to src/enterprise/migrations/0251_add_non_production_customer_type.py diff --git a/enterprise/migrations/0252_alter_enterprisecustomer_enable_demo_data_for_analytics_and_lpr_and_more.py b/src/enterprise/migrations/0252_alter_enterprisecustomer_enable_demo_data_for_analytics_and_lpr_and_more.py similarity index 100% rename from enterprise/migrations/0252_alter_enterprisecustomer_enable_demo_data_for_analytics_and_lpr_and_more.py rename to src/enterprise/migrations/0252_alter_enterprisecustomer_enable_demo_data_for_analytics_and_lpr_and_more.py diff --git a/enterprise/migrations/__init__.py b/src/enterprise/migrations/__init__.py similarity index 100% rename from enterprise/migrations/__init__.py rename to src/enterprise/migrations/__init__.py diff --git a/enterprise/migrations/unique_constraints_pending_users.py b/src/enterprise/migrations/unique_constraints_pending_users.py similarity index 100% rename from enterprise/migrations/unique_constraints_pending_users.py rename to src/enterprise/migrations/unique_constraints_pending_users.py diff --git a/enterprise/models.py b/src/enterprise/models.py similarity index 100% rename from enterprise/models.py rename to src/enterprise/models.py diff --git a/enterprise/overrides/__init__.py b/src/enterprise/overrides/__init__.py similarity index 100% rename from enterprise/overrides/__init__.py rename to src/enterprise/overrides/__init__.py diff --git a/enterprise/overrides/branding.py b/src/enterprise/overrides/branding.py similarity index 100% rename from enterprise/overrides/branding.py rename to src/enterprise/overrides/branding.py diff --git a/enterprise/overrides/course_home_progress.py b/src/enterprise/overrides/course_home_progress.py similarity index 100% rename from enterprise/overrides/course_home_progress.py rename to src/enterprise/overrides/course_home_progress.py diff --git a/enterprise/overrides/learner_home.py b/src/enterprise/overrides/learner_home.py similarity index 100% rename from enterprise/overrides/learner_home.py rename to src/enterprise/overrides/learner_home.py diff --git a/enterprise/overrides/program_nudge_email.py b/src/enterprise/overrides/program_nudge_email.py similarity index 100% rename from enterprise/overrides/program_nudge_email.py rename to src/enterprise/overrides/program_nudge_email.py diff --git a/enterprise/overrides/programs.py b/src/enterprise/overrides/programs.py similarity index 100% rename from enterprise/overrides/programs.py rename to src/enterprise/overrides/programs.py diff --git a/enterprise/roles_api.py b/src/enterprise/roles_api.py similarity index 100% rename from enterprise/roles_api.py rename to src/enterprise/roles_api.py diff --git a/enterprise/rules.py b/src/enterprise/rules.py similarity index 100% rename from enterprise/rules.py rename to src/enterprise/rules.py diff --git a/enterprise/settings/__init__.py b/src/enterprise/settings/__init__.py similarity index 100% rename from enterprise/settings/__init__.py rename to src/enterprise/settings/__init__.py diff --git a/enterprise/settings/common.py b/src/enterprise/settings/common.py similarity index 100% rename from enterprise/settings/common.py rename to src/enterprise/settings/common.py diff --git a/enterprise/settings/production.py b/src/enterprise/settings/production.py similarity index 100% rename from enterprise/settings/production.py rename to src/enterprise/settings/production.py diff --git a/enterprise/settings/test.py b/src/enterprise/settings/test.py similarity index 98% rename from enterprise/settings/test.py rename to src/enterprise/settings/test.py index 368cc8b4dd..2777eb7717 100644 --- a/enterprise/settings/test.py +++ b/src/enterprise/settings/test.py @@ -40,7 +40,7 @@ def root(*args): """ Return the absolute path to some file from the project's root. """ - return abspath(join(abspath(here('../..')), *args)) + return abspath(join(abspath(here('../../..')), *args)) DATABASES = { @@ -104,7 +104,7 @@ def root(*args): SESSION_ENGINE = "django.contrib.sessions.backends.file" LOCALE_PATHS = [ - root("enterprise", "conf", "locale"), + root("src", "enterprise", "conf", "locale"), ] MAKO_TEMPLATES = { @@ -124,9 +124,9 @@ def root(*args): }, ] -REPO_ROOT = root('enterprise') +REPO_ROOT = root('src', 'enterprise') -STATIC_ROOT = root('enterprise/assets') +STATIC_ROOT = root('src', 'enterprise/assets') STATIC_URL = '/enterprise/static/' diff --git a/enterprise/signals.py b/src/enterprise/signals.py similarity index 100% rename from enterprise/signals.py rename to src/enterprise/signals.py diff --git a/enterprise/static/enterprise/admin/enterprise_customer_catalog.js b/src/enterprise/static/enterprise/admin/enterprise_customer_catalog.js similarity index 100% rename from enterprise/static/enterprise/admin/enterprise_customer_catalog.js rename to src/enterprise/static/enterprise/admin/enterprise_customer_catalog.js diff --git a/enterprise/static/enterprise/bundles/main-admin.style.css b/src/enterprise/static/enterprise/bundles/main-admin.style.css similarity index 100% rename from enterprise/static/enterprise/bundles/main-admin.style.css rename to src/enterprise/static/enterprise/bundles/main-admin.style.css diff --git a/enterprise/static/enterprise/bundles/main.style.css b/src/enterprise/static/enterprise/bundles/main.style.css similarity index 100% rename from enterprise/static/enterprise/bundles/main.style.css rename to src/enterprise/static/enterprise/bundles/main.style.css diff --git a/enterprise/static/enterprise/js/course_modal.js b/src/enterprise/static/enterprise/js/course_modal.js similarity index 100% rename from enterprise/static/enterprise/js/course_modal.js rename to src/enterprise/static/enterprise/js/course_modal.js diff --git a/enterprise/static/enterprise/js/enterprise_customer.js b/src/enterprise/static/enterprise/js/enterprise_customer.js similarity index 100% rename from enterprise/static/enterprise/js/enterprise_customer.js rename to src/enterprise/static/enterprise/js/enterprise_customer.js diff --git a/enterprise/static/enterprise/js/enterprise_login_page.js b/src/enterprise/static/enterprise/js/enterprise_login_page.js similarity index 100% rename from enterprise/static/enterprise/js/enterprise_login_page.js rename to src/enterprise/static/enterprise/js/enterprise_login_page.js diff --git a/enterprise/static/enterprise/js/enterprise_selection_page.js b/src/enterprise/static/enterprise/js/enterprise_selection_page.js similarity index 100% rename from enterprise/static/enterprise/js/enterprise_selection_page.js rename to src/enterprise/static/enterprise/js/enterprise_selection_page.js diff --git a/enterprise/static/enterprise/js/grant_data_sharing_permissions.js b/src/enterprise/static/enterprise/js/grant_data_sharing_permissions.js similarity index 100% rename from enterprise/static/enterprise/js/grant_data_sharing_permissions.js rename to src/enterprise/static/enterprise/js/grant_data_sharing_permissions.js diff --git a/enterprise/static/enterprise/js/manage_learners.js b/src/enterprise/static/enterprise/js/manage_learners.js similarity index 100% rename from enterprise/static/enterprise/js/manage_learners.js rename to src/enterprise/static/enterprise/js/manage_learners.js diff --git a/enterprise/static/enterprise/js/program_enrollment_landing_page.js b/src/enterprise/static/enterprise/js/program_enrollment_landing_page.js similarity index 100% rename from enterprise/static/enterprise/js/program_enrollment_landing_page.js rename to src/enterprise/static/enterprise/js/program_enrollment_landing_page.js diff --git a/enterprise/static/enterprise/sass/_base.scss b/src/enterprise/static/enterprise/sass/_base.scss similarity index 100% rename from enterprise/static/enterprise/sass/_base.scss rename to src/enterprise/static/enterprise/sass/_base.scss diff --git a/enterprise/static/enterprise/sass/main-admin.scss b/src/enterprise/static/enterprise/sass/main-admin.scss similarity index 100% rename from enterprise/static/enterprise/sass/main-admin.scss rename to src/enterprise/static/enterprise/sass/main-admin.scss diff --git a/enterprise/static/enterprise/sass/main.scss b/src/enterprise/static/enterprise/sass/main.scss similarity index 100% rename from enterprise/static/enterprise/sass/main.scss rename to src/enterprise/static/enterprise/sass/main.scss diff --git a/enterprise/static/enterprise/sass/partials/admin/_manage_learners.scss b/src/enterprise/static/enterprise/sass/partials/admin/_manage_learners.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/admin/_manage_learners.scss rename to src/enterprise/static/enterprise/sass/partials/admin/_manage_learners.scss diff --git a/enterprise/static/enterprise/sass/partials/admin/_transmit_courses_metadata.scss b/src/enterprise/static/enterprise/sass/partials/admin/_transmit_courses_metadata.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/admin/_transmit_courses_metadata.scss rename to src/enterprise/static/enterprise/sass/partials/admin/_transmit_courses_metadata.scss diff --git a/enterprise/static/enterprise/sass/partials/components/_course_modal.scss b/src/enterprise/static/enterprise/sass/partials/components/_course_modal.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/components/_course_modal.scss rename to src/enterprise/static/enterprise/sass/partials/components/_course_modal.scss diff --git a/enterprise/static/enterprise/sass/partials/components/_modal.scss b/src/enterprise/static/enterprise/sass/partials/components/_modal.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/components/_modal.scss rename to src/enterprise/static/enterprise/sass/partials/components/_modal.scss diff --git a/enterprise/static/enterprise/sass/partials/utilities/_mixins.scss b/src/enterprise/static/enterprise/sass/partials/utilities/_mixins.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/utilities/_mixins.scss rename to src/enterprise/static/enterprise/sass/partials/utilities/_mixins.scss diff --git a/enterprise/static/enterprise/sass/partials/utilities/_variables.scss b/src/enterprise/static/enterprise/sass/partials/utilities/_variables.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/utilities/_variables.scss rename to src/enterprise/static/enterprise/sass/partials/utilities/_variables.scss diff --git a/enterprise/static/enterprise/sass/partials/views/_course_landing_page.scss b/src/enterprise/static/enterprise/sass/partials/views/_course_landing_page.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/views/_course_landing_page.scss rename to src/enterprise/static/enterprise/sass/partials/views/_course_landing_page.scss diff --git a/enterprise/static/enterprise/sass/partials/views/_data_sharing_consent.scss b/src/enterprise/static/enterprise/sass/partials/views/_data_sharing_consent.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/views/_data_sharing_consent.scss rename to src/enterprise/static/enterprise/sass/partials/views/_data_sharing_consent.scss diff --git a/enterprise/static/enterprise/sass/partials/views/_enterprise_login_page.scss b/src/enterprise/static/enterprise/sass/partials/views/_enterprise_login_page.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/views/_enterprise_login_page.scss rename to src/enterprise/static/enterprise/sass/partials/views/_enterprise_login_page.scss diff --git a/enterprise/static/enterprise/sass/partials/views/_enterprise_select_page.scss b/src/enterprise/static/enterprise/sass/partials/views/_enterprise_select_page.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/views/_enterprise_select_page.scss rename to src/enterprise/static/enterprise/sass/partials/views/_enterprise_select_page.scss diff --git a/enterprise/static/enterprise/sass/partials/views/_program_landing_page.scss b/src/enterprise/static/enterprise/sass/partials/views/_program_landing_page.scss similarity index 100% rename from enterprise/static/enterprise/sass/partials/views/_program_landing_page.scss rename to src/enterprise/static/enterprise/sass/partials/views/_program_landing_page.scss diff --git a/enterprise/tasks.py b/src/enterprise/tasks.py similarity index 100% rename from enterprise/tasks.py rename to src/enterprise/tasks.py diff --git a/enterprise/templates/enterprise/_data_sharing_decline_modal.html b/src/enterprise/templates/enterprise/_data_sharing_decline_modal.html similarity index 100% rename from enterprise/templates/enterprise/_data_sharing_decline_modal.html rename to src/enterprise/templates/enterprise/_data_sharing_decline_modal.html diff --git a/enterprise/templates/enterprise/_data_sharing_policy.html b/src/enterprise/templates/enterprise/_data_sharing_policy.html similarity index 100% rename from enterprise/templates/enterprise/_data_sharing_policy.html rename to src/enterprise/templates/enterprise/_data_sharing_policy.html diff --git a/enterprise/templates/enterprise/_data_sharing_policy_paragraph.html b/src/enterprise/templates/enterprise/_data_sharing_policy_paragraph.html similarity index 100% rename from enterprise/templates/enterprise/_data_sharing_policy_paragraph.html rename to src/enterprise/templates/enterprise/_data_sharing_policy_paragraph.html diff --git a/enterprise/templates/enterprise/_data_sharing_top_paragraph.html b/src/enterprise/templates/enterprise/_data_sharing_top_paragraph.html similarity index 100% rename from enterprise/templates/enterprise/_data_sharing_top_paragraph.html rename to src/enterprise/templates/enterprise/_data_sharing_top_paragraph.html diff --git a/enterprise/templates/enterprise/_data_sharing_user_input.html b/src/enterprise/templates/enterprise/_data_sharing_user_input.html similarity index 100% rename from enterprise/templates/enterprise/_data_sharing_user_input.html rename to src/enterprise/templates/enterprise/_data_sharing_user_input.html diff --git a/enterprise/templates/enterprise/_enterprise_customer_sidebar.html b/src/enterprise/templates/enterprise/_enterprise_customer_sidebar.html similarity index 100% rename from enterprise/templates/enterprise/_enterprise_customer_sidebar.html rename to src/enterprise/templates/enterprise/_enterprise_customer_sidebar.html diff --git a/enterprise/templates/enterprise/admin/clear_learners_data_sharing_consent.html b/src/enterprise/templates/enterprise/admin/clear_learners_data_sharing_consent.html similarity index 100% rename from enterprise/templates/enterprise/admin/clear_learners_data_sharing_consent.html rename to src/enterprise/templates/enterprise/admin/clear_learners_data_sharing_consent.html diff --git a/enterprise/templates/enterprise/admin/enterprise_course_enrollments_list.html b/src/enterprise/templates/enterprise/admin/enterprise_course_enrollments_list.html similarity index 100% rename from enterprise/templates/enterprise/admin/enterprise_course_enrollments_list.html rename to src/enterprise/templates/enterprise/admin/enterprise_course_enrollments_list.html diff --git a/enterprise/templates/enterprise/admin/manage_learners.html b/src/enterprise/templates/enterprise/admin/manage_learners.html similarity index 100% rename from enterprise/templates/enterprise/admin/manage_learners.html rename to src/enterprise/templates/enterprise/admin/manage_learners.html diff --git a/enterprise/templates/enterprise/admin/oauth_authorization_failed.html b/src/enterprise/templates/enterprise/admin/oauth_authorization_failed.html similarity index 100% rename from enterprise/templates/enterprise/admin/oauth_authorization_failed.html rename to src/enterprise/templates/enterprise/admin/oauth_authorization_failed.html diff --git a/enterprise/templates/enterprise/admin/oauth_authorization_successful.html b/src/enterprise/templates/enterprise/admin/oauth_authorization_successful.html similarity index 100% rename from enterprise/templates/enterprise/admin/oauth_authorization_successful.html rename to src/enterprise/templates/enterprise/admin/oauth_authorization_successful.html diff --git a/enterprise/templates/enterprise/admin/setup_auth_org_id.html b/src/enterprise/templates/enterprise/admin/setup_auth_org_id.html similarity index 100% rename from enterprise/templates/enterprise/admin/setup_auth_org_id.html rename to src/enterprise/templates/enterprise/admin/setup_auth_org_id.html diff --git a/enterprise/templates/enterprise/admin/transmit_courses_metadata.html b/src/enterprise/templates/enterprise/admin/transmit_courses_metadata.html similarity index 100% rename from enterprise/templates/enterprise/admin/transmit_courses_metadata.html rename to src/enterprise/templates/enterprise/admin/transmit_courses_metadata.html diff --git a/enterprise/templates/enterprise/base.html b/src/enterprise/templates/enterprise/base.html similarity index 100% rename from enterprise/templates/enterprise/base.html rename to src/enterprise/templates/enterprise/base.html diff --git a/enterprise/templates/enterprise/enterprise_course_enrollment_page.html b/src/enterprise/templates/enterprise/enterprise_course_enrollment_page.html similarity index 100% rename from enterprise/templates/enterprise/enterprise_course_enrollment_page.html rename to src/enterprise/templates/enterprise/enterprise_course_enrollment_page.html diff --git a/enterprise/templates/enterprise/enterprise_customer_login_page.html b/src/enterprise/templates/enterprise/enterprise_customer_login_page.html similarity index 100% rename from enterprise/templates/enterprise/enterprise_customer_login_page.html rename to src/enterprise/templates/enterprise/enterprise_customer_login_page.html diff --git a/enterprise/templates/enterprise/enterprise_customer_select_form.html b/src/enterprise/templates/enterprise/enterprise_customer_select_form.html similarity index 100% rename from enterprise/templates/enterprise/enterprise_customer_select_form.html rename to src/enterprise/templates/enterprise/enterprise_customer_select_form.html diff --git a/enterprise/templates/enterprise/enterprise_error_page_with_messages.html b/src/enterprise/templates/enterprise/enterprise_error_page_with_messages.html similarity index 100% rename from enterprise/templates/enterprise/enterprise_error_page_with_messages.html rename to src/enterprise/templates/enterprise/enterprise_error_page_with_messages.html diff --git a/enterprise/templates/enterprise/enterprise_program_enrollment_page.html b/src/enterprise/templates/enterprise/enterprise_program_enrollment_page.html similarity index 100% rename from enterprise/templates/enterprise/enterprise_program_enrollment_page.html rename to src/enterprise/templates/enterprise/enterprise_program_enrollment_page.html diff --git a/enterprise/templates/enterprise/grant_data_sharing_permissions.html b/src/enterprise/templates/enterprise/grant_data_sharing_permissions.html similarity index 100% rename from enterprise/templates/enterprise/grant_data_sharing_permissions.html rename to src/enterprise/templates/enterprise/grant_data_sharing_permissions.html diff --git a/enterprise/templates/enterprise/templatetags/alert_messages.html b/src/enterprise/templates/enterprise/templatetags/alert_messages.html similarity index 100% rename from enterprise/templates/enterprise/templatetags/alert_messages.html rename to src/enterprise/templates/enterprise/templatetags/alert_messages.html diff --git a/enterprise/templates/enterprise/templatetags/course_modal.html b/src/enterprise/templates/enterprise/templatetags/course_modal.html similarity index 100% rename from enterprise/templates/enterprise/templatetags/course_modal.html rename to src/enterprise/templates/enterprise/templatetags/course_modal.html diff --git a/enterprise/templates/enterprise/templatetags/expand_button.html b/src/enterprise/templates/enterprise/templatetags/expand_button.html similarity index 100% rename from enterprise/templates/enterprise/templatetags/expand_button.html rename to src/enterprise/templates/enterprise/templatetags/expand_button.html diff --git a/enterprise/templates/enterprise/templatetags/fa_icon.html b/src/enterprise/templates/enterprise/templatetags/fa_icon.html similarity index 100% rename from enterprise/templates/enterprise/templatetags/fa_icon.html rename to src/enterprise/templates/enterprise/templatetags/fa_icon.html diff --git a/enterprise/templates/enterprise/widgets/segment-io-django.html b/src/enterprise/templates/enterprise/widgets/segment-io-django.html similarity index 100% rename from enterprise/templates/enterprise/widgets/segment-io-django.html rename to src/enterprise/templates/enterprise/widgets/segment-io-django.html diff --git a/enterprise/templatetags/__init__.py b/src/enterprise/templatetags/__init__.py similarity index 100% rename from enterprise/templatetags/__init__.py rename to src/enterprise/templatetags/__init__.py diff --git a/enterprise/templatetags/enterprise.py b/src/enterprise/templatetags/enterprise.py similarity index 100% rename from enterprise/templatetags/enterprise.py rename to src/enterprise/templatetags/enterprise.py diff --git a/enterprise/toggles.py b/src/enterprise/toggles.py similarity index 100% rename from enterprise/toggles.py rename to src/enterprise/toggles.py diff --git a/enterprise/tpa_pipeline.py b/src/enterprise/tpa_pipeline.py similarity index 100% rename from enterprise/tpa_pipeline.py rename to src/enterprise/tpa_pipeline.py diff --git a/enterprise/urls.py b/src/enterprise/urls.py similarity index 100% rename from enterprise/urls.py rename to src/enterprise/urls.py diff --git a/enterprise/utils.py b/src/enterprise/utils.py similarity index 100% rename from enterprise/utils.py rename to src/enterprise/utils.py diff --git a/enterprise/validators.py b/src/enterprise/validators.py similarity index 100% rename from enterprise/validators.py rename to src/enterprise/validators.py diff --git a/enterprise/views.py b/src/enterprise/views.py similarity index 100% rename from enterprise/views.py rename to src/enterprise/views.py diff --git a/enterprise/views_error_codes.txt b/src/enterprise/views_error_codes.txt similarity index 100% rename from enterprise/views_error_codes.txt rename to src/enterprise/views_error_codes.txt diff --git a/enterprise_learner_portal/__init__.py b/src/enterprise_learner_portal/__init__.py similarity index 100% rename from enterprise_learner_portal/__init__.py rename to src/enterprise_learner_portal/__init__.py diff --git a/enterprise_learner_portal/api/__init__.py b/src/enterprise_learner_portal/api/__init__.py similarity index 100% rename from enterprise_learner_portal/api/__init__.py rename to src/enterprise_learner_portal/api/__init__.py diff --git a/enterprise_learner_portal/api/urls.py b/src/enterprise_learner_portal/api/urls.py similarity index 100% rename from enterprise_learner_portal/api/urls.py rename to src/enterprise_learner_portal/api/urls.py diff --git a/enterprise_learner_portal/api/v1/__init__.py b/src/enterprise_learner_portal/api/v1/__init__.py similarity index 100% rename from enterprise_learner_portal/api/v1/__init__.py rename to src/enterprise_learner_portal/api/v1/__init__.py diff --git a/enterprise_learner_portal/api/v1/serializers.py b/src/enterprise_learner_portal/api/v1/serializers.py similarity index 100% rename from enterprise_learner_portal/api/v1/serializers.py rename to src/enterprise_learner_portal/api/v1/serializers.py diff --git a/enterprise_learner_portal/api/v1/urls.py b/src/enterprise_learner_portal/api/v1/urls.py similarity index 100% rename from enterprise_learner_portal/api/v1/urls.py rename to src/enterprise_learner_portal/api/v1/urls.py diff --git a/enterprise_learner_portal/api/v1/views.py b/src/enterprise_learner_portal/api/v1/views.py similarity index 100% rename from enterprise_learner_portal/api/v1/views.py rename to src/enterprise_learner_portal/api/v1/views.py diff --git a/enterprise_learner_portal/apps.py b/src/enterprise_learner_portal/apps.py similarity index 100% rename from enterprise_learner_portal/apps.py rename to src/enterprise_learner_portal/apps.py diff --git a/enterprise_learner_portal/migrations/__init__.py b/src/enterprise_learner_portal/migrations/__init__.py similarity index 100% rename from enterprise_learner_portal/migrations/__init__.py rename to src/enterprise_learner_portal/migrations/__init__.py diff --git a/enterprise_learner_portal/urls.py b/src/enterprise_learner_portal/urls.py similarity index 100% rename from enterprise_learner_portal/urls.py rename to src/enterprise_learner_portal/urls.py diff --git a/enterprise_learner_portal/utils.py b/src/enterprise_learner_portal/utils.py similarity index 100% rename from enterprise_learner_portal/utils.py rename to src/enterprise_learner_portal/utils.py diff --git a/integrated_channels/README.md b/src/integrated_channels/README.md similarity index 100% rename from integrated_channels/README.md rename to src/integrated_channels/README.md diff --git a/integrated_channels/__init__.py b/src/integrated_channels/__init__.py similarity index 100% rename from integrated_channels/__init__.py rename to src/integrated_channels/__init__.py diff --git a/integrated_channels/api/__init__.py b/src/integrated_channels/api/__init__.py similarity index 100% rename from integrated_channels/api/__init__.py rename to src/integrated_channels/api/__init__.py diff --git a/integrated_channels/api/serializers.py b/src/integrated_channels/api/serializers.py similarity index 100% rename from integrated_channels/api/serializers.py rename to src/integrated_channels/api/serializers.py diff --git a/integrated_channels/api/urls.py b/src/integrated_channels/api/urls.py similarity index 100% rename from integrated_channels/api/urls.py rename to src/integrated_channels/api/urls.py diff --git a/integrated_channels/api/v1/blackboard/__init__.py b/src/integrated_channels/api/v1/blackboard/__init__.py similarity index 100% rename from integrated_channels/api/v1/blackboard/__init__.py rename to src/integrated_channels/api/v1/blackboard/__init__.py diff --git a/integrated_channels/api/v1/blackboard/serializers.py b/src/integrated_channels/api/v1/blackboard/serializers.py similarity index 100% rename from integrated_channels/api/v1/blackboard/serializers.py rename to src/integrated_channels/api/v1/blackboard/serializers.py diff --git a/integrated_channels/api/v1/blackboard/urls.py b/src/integrated_channels/api/v1/blackboard/urls.py similarity index 100% rename from integrated_channels/api/v1/blackboard/urls.py rename to src/integrated_channels/api/v1/blackboard/urls.py diff --git a/integrated_channels/api/v1/blackboard/views.py b/src/integrated_channels/api/v1/blackboard/views.py similarity index 100% rename from integrated_channels/api/v1/blackboard/views.py rename to src/integrated_channels/api/v1/blackboard/views.py diff --git a/integrated_channels/api/v1/canvas/__init__.py b/src/integrated_channels/api/v1/canvas/__init__.py similarity index 100% rename from integrated_channels/api/v1/canvas/__init__.py rename to src/integrated_channels/api/v1/canvas/__init__.py diff --git a/integrated_channels/api/v1/canvas/serializers.py b/src/integrated_channels/api/v1/canvas/serializers.py similarity index 100% rename from integrated_channels/api/v1/canvas/serializers.py rename to src/integrated_channels/api/v1/canvas/serializers.py diff --git a/integrated_channels/api/v1/canvas/urls.py b/src/integrated_channels/api/v1/canvas/urls.py similarity index 100% rename from integrated_channels/api/v1/canvas/urls.py rename to src/integrated_channels/api/v1/canvas/urls.py diff --git a/integrated_channels/api/v1/canvas/views.py b/src/integrated_channels/api/v1/canvas/views.py similarity index 100% rename from integrated_channels/api/v1/canvas/views.py rename to src/integrated_channels/api/v1/canvas/views.py diff --git a/integrated_channels/api/v1/cornerstone/__init__.py b/src/integrated_channels/api/v1/cornerstone/__init__.py similarity index 100% rename from integrated_channels/api/v1/cornerstone/__init__.py rename to src/integrated_channels/api/v1/cornerstone/__init__.py diff --git a/integrated_channels/api/v1/cornerstone/serializers.py b/src/integrated_channels/api/v1/cornerstone/serializers.py similarity index 100% rename from integrated_channels/api/v1/cornerstone/serializers.py rename to src/integrated_channels/api/v1/cornerstone/serializers.py diff --git a/integrated_channels/api/v1/cornerstone/urls.py b/src/integrated_channels/api/v1/cornerstone/urls.py similarity index 100% rename from integrated_channels/api/v1/cornerstone/urls.py rename to src/integrated_channels/api/v1/cornerstone/urls.py diff --git a/integrated_channels/api/v1/cornerstone/views.py b/src/integrated_channels/api/v1/cornerstone/views.py similarity index 100% rename from integrated_channels/api/v1/cornerstone/views.py rename to src/integrated_channels/api/v1/cornerstone/views.py diff --git a/integrated_channels/api/v1/degreed/__init__.py b/src/integrated_channels/api/v1/degreed/__init__.py similarity index 100% rename from integrated_channels/api/v1/degreed/__init__.py rename to src/integrated_channels/api/v1/degreed/__init__.py diff --git a/integrated_channels/api/v1/degreed/serializers.py b/src/integrated_channels/api/v1/degreed/serializers.py similarity index 100% rename from integrated_channels/api/v1/degreed/serializers.py rename to src/integrated_channels/api/v1/degreed/serializers.py diff --git a/integrated_channels/api/v1/degreed/urls.py b/src/integrated_channels/api/v1/degreed/urls.py similarity index 100% rename from integrated_channels/api/v1/degreed/urls.py rename to src/integrated_channels/api/v1/degreed/urls.py diff --git a/integrated_channels/api/v1/degreed/views.py b/src/integrated_channels/api/v1/degreed/views.py similarity index 100% rename from integrated_channels/api/v1/degreed/views.py rename to src/integrated_channels/api/v1/degreed/views.py diff --git a/integrated_channels/api/v1/degreed2/__init__.py b/src/integrated_channels/api/v1/degreed2/__init__.py similarity index 100% rename from integrated_channels/api/v1/degreed2/__init__.py rename to src/integrated_channels/api/v1/degreed2/__init__.py diff --git a/integrated_channels/api/v1/degreed2/serializers.py b/src/integrated_channels/api/v1/degreed2/serializers.py similarity index 100% rename from integrated_channels/api/v1/degreed2/serializers.py rename to src/integrated_channels/api/v1/degreed2/serializers.py diff --git a/integrated_channels/api/v1/degreed2/urls.py b/src/integrated_channels/api/v1/degreed2/urls.py similarity index 100% rename from integrated_channels/api/v1/degreed2/urls.py rename to src/integrated_channels/api/v1/degreed2/urls.py diff --git a/integrated_channels/api/v1/degreed2/views.py b/src/integrated_channels/api/v1/degreed2/views.py similarity index 100% rename from integrated_channels/api/v1/degreed2/views.py rename to src/integrated_channels/api/v1/degreed2/views.py diff --git a/integrated_channels/api/v1/logs/__init__.py b/src/integrated_channels/api/v1/logs/__init__.py similarity index 100% rename from integrated_channels/api/v1/logs/__init__.py rename to src/integrated_channels/api/v1/logs/__init__.py diff --git a/integrated_channels/api/v1/logs/serializers.py b/src/integrated_channels/api/v1/logs/serializers.py similarity index 100% rename from integrated_channels/api/v1/logs/serializers.py rename to src/integrated_channels/api/v1/logs/serializers.py diff --git a/integrated_channels/api/v1/logs/urls.py b/src/integrated_channels/api/v1/logs/urls.py similarity index 100% rename from integrated_channels/api/v1/logs/urls.py rename to src/integrated_channels/api/v1/logs/urls.py diff --git a/integrated_channels/api/v1/logs/views.py b/src/integrated_channels/api/v1/logs/views.py similarity index 100% rename from integrated_channels/api/v1/logs/views.py rename to src/integrated_channels/api/v1/logs/views.py diff --git a/integrated_channels/api/v1/mixins.py b/src/integrated_channels/api/v1/mixins.py similarity index 100% rename from integrated_channels/api/v1/mixins.py rename to src/integrated_channels/api/v1/mixins.py diff --git a/integrated_channels/api/v1/moodle/__init__.py b/src/integrated_channels/api/v1/moodle/__init__.py similarity index 100% rename from integrated_channels/api/v1/moodle/__init__.py rename to src/integrated_channels/api/v1/moodle/__init__.py diff --git a/integrated_channels/api/v1/moodle/serializers.py b/src/integrated_channels/api/v1/moodle/serializers.py similarity index 100% rename from integrated_channels/api/v1/moodle/serializers.py rename to src/integrated_channels/api/v1/moodle/serializers.py diff --git a/integrated_channels/api/v1/moodle/urls.py b/src/integrated_channels/api/v1/moodle/urls.py similarity index 100% rename from integrated_channels/api/v1/moodle/urls.py rename to src/integrated_channels/api/v1/moodle/urls.py diff --git a/integrated_channels/api/v1/moodle/views.py b/src/integrated_channels/api/v1/moodle/views.py similarity index 100% rename from integrated_channels/api/v1/moodle/views.py rename to src/integrated_channels/api/v1/moodle/views.py diff --git a/integrated_channels/api/v1/sap_success_factors/__init__.py b/src/integrated_channels/api/v1/sap_success_factors/__init__.py similarity index 100% rename from integrated_channels/api/v1/sap_success_factors/__init__.py rename to src/integrated_channels/api/v1/sap_success_factors/__init__.py diff --git a/integrated_channels/api/v1/sap_success_factors/serializers.py b/src/integrated_channels/api/v1/sap_success_factors/serializers.py similarity index 100% rename from integrated_channels/api/v1/sap_success_factors/serializers.py rename to src/integrated_channels/api/v1/sap_success_factors/serializers.py diff --git a/integrated_channels/api/v1/sap_success_factors/urls.py b/src/integrated_channels/api/v1/sap_success_factors/urls.py similarity index 100% rename from integrated_channels/api/v1/sap_success_factors/urls.py rename to src/integrated_channels/api/v1/sap_success_factors/urls.py diff --git a/integrated_channels/api/v1/sap_success_factors/views.py b/src/integrated_channels/api/v1/sap_success_factors/views.py similarity index 100% rename from integrated_channels/api/v1/sap_success_factors/views.py rename to src/integrated_channels/api/v1/sap_success_factors/views.py diff --git a/integrated_channels/api/v1/urls.py b/src/integrated_channels/api/v1/urls.py similarity index 100% rename from integrated_channels/api/v1/urls.py rename to src/integrated_channels/api/v1/urls.py diff --git a/integrated_channels/api/v1/views.py b/src/integrated_channels/api/v1/views.py similarity index 100% rename from integrated_channels/api/v1/views.py rename to src/integrated_channels/api/v1/views.py diff --git a/integrated_channels/blackboard/__init__.py b/src/integrated_channels/blackboard/__init__.py similarity index 100% rename from integrated_channels/blackboard/__init__.py rename to src/integrated_channels/blackboard/__init__.py diff --git a/integrated_channels/blackboard/admin/__init__.py b/src/integrated_channels/blackboard/admin/__init__.py similarity index 100% rename from integrated_channels/blackboard/admin/__init__.py rename to src/integrated_channels/blackboard/admin/__init__.py diff --git a/integrated_channels/blackboard/apps.py b/src/integrated_channels/blackboard/apps.py similarity index 100% rename from integrated_channels/blackboard/apps.py rename to src/integrated_channels/blackboard/apps.py diff --git a/integrated_channels/blackboard/client.py b/src/integrated_channels/blackboard/client.py similarity index 100% rename from integrated_channels/blackboard/client.py rename to src/integrated_channels/blackboard/client.py diff --git a/integrated_channels/blackboard/exporters/__init__.py b/src/integrated_channels/blackboard/exporters/__init__.py similarity index 100% rename from integrated_channels/blackboard/exporters/__init__.py rename to src/integrated_channels/blackboard/exporters/__init__.py diff --git a/integrated_channels/blackboard/exporters/content_metadata.py b/src/integrated_channels/blackboard/exporters/content_metadata.py similarity index 100% rename from integrated_channels/blackboard/exporters/content_metadata.py rename to src/integrated_channels/blackboard/exporters/content_metadata.py diff --git a/integrated_channels/blackboard/exporters/learner_data.py b/src/integrated_channels/blackboard/exporters/learner_data.py similarity index 100% rename from integrated_channels/blackboard/exporters/learner_data.py rename to src/integrated_channels/blackboard/exporters/learner_data.py diff --git a/integrated_channels/blackboard/migrations/0001_initial_squashed_0014_alter_blackboardlearnerassessmentdatatransmissionaudit_enterprise_course_enrollment_id.py b/src/integrated_channels/blackboard/migrations/0001_initial_squashed_0014_alter_blackboardlearnerassessmentdatatransmissionaudit_enterprise_course_enrollment_id.py similarity index 100% rename from integrated_channels/blackboard/migrations/0001_initial_squashed_0014_alter_blackboardlearnerassessmentdatatransmissionaudit_enterprise_course_enrollment_id.py rename to src/integrated_channels/blackboard/migrations/0001_initial_squashed_0014_alter_blackboardlearnerassessmentdatatransmissionaudit_enterprise_course_enrollment_id.py diff --git a/integrated_channels/blackboard/migrations/0002_auto_20220302_2231.py b/src/integrated_channels/blackboard/migrations/0002_auto_20220302_2231.py similarity index 100% rename from integrated_channels/blackboard/migrations/0002_auto_20220302_2231.py rename to src/integrated_channels/blackboard/migrations/0002_auto_20220302_2231.py diff --git a/integrated_channels/blackboard/migrations/0003_alter_blackboardlearnerdatatransmissionaudit_completed_timestamp.py b/src/integrated_channels/blackboard/migrations/0003_alter_blackboardlearnerdatatransmissionaudit_completed_timestamp.py similarity index 100% rename from integrated_channels/blackboard/migrations/0003_alter_blackboardlearnerdatatransmissionaudit_completed_timestamp.py rename to src/integrated_channels/blackboard/migrations/0003_alter_blackboardlearnerdatatransmissionaudit_completed_timestamp.py diff --git a/integrated_channels/blackboard/migrations/0004_auto_20220324_1550.py b/src/integrated_channels/blackboard/migrations/0004_auto_20220324_1550.py similarity index 100% rename from integrated_channels/blackboard/migrations/0004_auto_20220324_1550.py rename to src/integrated_channels/blackboard/migrations/0004_auto_20220324_1550.py diff --git a/integrated_channels/blackboard/migrations/0005_auto_20220325_1757.py b/src/integrated_channels/blackboard/migrations/0005_auto_20220325_1757.py similarity index 100% rename from integrated_channels/blackboard/migrations/0005_auto_20220325_1757.py rename to src/integrated_channels/blackboard/migrations/0005_auto_20220325_1757.py diff --git a/integrated_channels/blackboard/migrations/0006_auto_20220405_2311.py b/src/integrated_channels/blackboard/migrations/0006_auto_20220405_2311.py similarity index 100% rename from integrated_channels/blackboard/migrations/0006_auto_20220405_2311.py rename to src/integrated_channels/blackboard/migrations/0006_auto_20220405_2311.py diff --git a/integrated_channels/blackboard/migrations/0007_auto_20220523_1625.py b/src/integrated_channels/blackboard/migrations/0007_auto_20220523_1625.py similarity index 100% rename from integrated_channels/blackboard/migrations/0007_auto_20220523_1625.py rename to src/integrated_channels/blackboard/migrations/0007_auto_20220523_1625.py diff --git a/integrated_channels/blackboard/migrations/0008_auto_20220913_2018.py b/src/integrated_channels/blackboard/migrations/0008_auto_20220913_2018.py similarity index 100% rename from integrated_channels/blackboard/migrations/0008_auto_20220913_2018.py rename to src/integrated_channels/blackboard/migrations/0008_auto_20220913_2018.py diff --git a/integrated_channels/blackboard/migrations/0009_auto_20220929_1720.py b/src/integrated_channels/blackboard/migrations/0009_auto_20220929_1720.py similarity index 100% rename from integrated_channels/blackboard/migrations/0009_auto_20220929_1720.py rename to src/integrated_channels/blackboard/migrations/0009_auto_20220929_1720.py diff --git a/integrated_channels/blackboard/migrations/0010_auto_20221021_0159.py b/src/integrated_channels/blackboard/migrations/0010_auto_20221021_0159.py similarity index 100% rename from integrated_channels/blackboard/migrations/0010_auto_20221021_0159.py rename to src/integrated_channels/blackboard/migrations/0010_auto_20221021_0159.py diff --git a/integrated_channels/blackboard/migrations/0011_auto_20221031_1855.py b/src/integrated_channels/blackboard/migrations/0011_auto_20221031_1855.py similarity index 100% rename from integrated_channels/blackboard/migrations/0011_auto_20221031_1855.py rename to src/integrated_channels/blackboard/migrations/0011_auto_20221031_1855.py diff --git a/integrated_channels/blackboard/migrations/0012_move_and_recrete_completed_timestamp.py b/src/integrated_channels/blackboard/migrations/0012_move_and_recrete_completed_timestamp.py similarity index 100% rename from integrated_channels/blackboard/migrations/0012_move_and_recrete_completed_timestamp.py rename to src/integrated_channels/blackboard/migrations/0012_move_and_recrete_completed_timestamp.py diff --git a/integrated_channels/blackboard/migrations/0013_alter_blackboardlearnerdatatransmissionaudit_index_together.py b/src/integrated_channels/blackboard/migrations/0013_alter_blackboardlearnerdatatransmissionaudit_index_together.py similarity index 100% rename from integrated_channels/blackboard/migrations/0013_alter_blackboardlearnerdatatransmissionaudit_index_together.py rename to src/integrated_channels/blackboard/migrations/0013_alter_blackboardlearnerdatatransmissionaudit_index_together.py diff --git a/integrated_channels/blackboard/migrations/0014_auto_20230105_2122.py b/src/integrated_channels/blackboard/migrations/0014_auto_20230105_2122.py similarity index 100% rename from integrated_channels/blackboard/migrations/0014_auto_20230105_2122.py rename to src/integrated_channels/blackboard/migrations/0014_auto_20230105_2122.py diff --git a/integrated_channels/blackboard/migrations/0015_auto_20230112_2002.py b/src/integrated_channels/blackboard/migrations/0015_auto_20230112_2002.py similarity index 100% rename from integrated_channels/blackboard/migrations/0015_auto_20230112_2002.py rename to src/integrated_channels/blackboard/migrations/0015_auto_20230112_2002.py diff --git a/integrated_channels/blackboard/migrations/0016_auto_20230719_1621.py b/src/integrated_channels/blackboard/migrations/0016_auto_20230719_1621.py similarity index 100% rename from integrated_channels/blackboard/migrations/0016_auto_20230719_1621.py rename to src/integrated_channels/blackboard/migrations/0016_auto_20230719_1621.py diff --git a/integrated_channels/blackboard/migrations/0017_alter_historicalblackboardenterprisecustomerconfiguration_options.py b/src/integrated_channels/blackboard/migrations/0017_alter_historicalblackboardenterprisecustomerconfiguration_options.py similarity index 100% rename from integrated_channels/blackboard/migrations/0017_alter_historicalblackboardenterprisecustomerconfiguration_options.py rename to src/integrated_channels/blackboard/migrations/0017_alter_historicalblackboardenterprisecustomerconfiguration_options.py diff --git a/integrated_channels/blackboard/migrations/0018_blackboardlearnerdatatransmissionaudit_blackboard_unique_enrollment_course_id.py b/src/integrated_channels/blackboard/migrations/0018_blackboardlearnerdatatransmissionaudit_blackboard_unique_enrollment_course_id.py similarity index 100% rename from integrated_channels/blackboard/migrations/0018_blackboardlearnerdatatransmissionaudit_blackboard_unique_enrollment_course_id.py rename to src/integrated_channels/blackboard/migrations/0018_blackboardlearnerdatatransmissionaudit_blackboard_unique_enrollment_course_id.py diff --git a/integrated_channels/blackboard/migrations/0019_delete_historicalblackboardenterprisecustomerconfiguration.py b/src/integrated_channels/blackboard/migrations/0019_delete_historicalblackboardenterprisecustomerconfiguration.py similarity index 100% rename from integrated_channels/blackboard/migrations/0019_delete_historicalblackboardenterprisecustomerconfiguration.py rename to src/integrated_channels/blackboard/migrations/0019_delete_historicalblackboardenterprisecustomerconfiguration.py diff --git a/integrated_channels/blackboard/migrations/0020_auto_20240422_1709.py b/src/integrated_channels/blackboard/migrations/0020_auto_20240422_1709.py similarity index 100% rename from integrated_channels/blackboard/migrations/0020_auto_20240422_1709.py rename to src/integrated_channels/blackboard/migrations/0020_auto_20240422_1709.py diff --git a/integrated_channels/blackboard/migrations/0021_auto_20240423_1057.py b/src/integrated_channels/blackboard/migrations/0021_auto_20240423_1057.py similarity index 100% rename from integrated_channels/blackboard/migrations/0021_auto_20240423_1057.py rename to src/integrated_channels/blackboard/migrations/0021_auto_20240423_1057.py diff --git a/integrated_channels/blackboard/migrations/0022_blackboardlearnerassessmentdatatransmissionaudit_is_transmitted_and_more.py b/src/integrated_channels/blackboard/migrations/0022_blackboardlearnerassessmentdatatransmissionaudit_is_transmitted_and_more.py similarity index 100% rename from integrated_channels/blackboard/migrations/0022_blackboardlearnerassessmentdatatransmissionaudit_is_transmitted_and_more.py rename to src/integrated_channels/blackboard/migrations/0022_blackboardlearnerassessmentdatatransmissionaudit_is_transmitted_and_more.py diff --git a/integrated_channels/blackboard/migrations/0023_auto_20240604_1046.py b/src/integrated_channels/blackboard/migrations/0023_auto_20240604_1046.py similarity index 100% rename from integrated_channels/blackboard/migrations/0023_auto_20240604_1046.py rename to src/integrated_channels/blackboard/migrations/0023_auto_20240604_1046.py diff --git a/integrated_channels/blackboard/migrations/0024_rename_blackboardlearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_black.py b/src/integrated_channels/blackboard/migrations/0024_rename_blackboardlearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_black.py similarity index 100% rename from integrated_channels/blackboard/migrations/0024_rename_blackboardlearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_black.py rename to src/integrated_channels/blackboard/migrations/0024_rename_blackboardlearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_black.py diff --git a/integrated_channels/blackboard/migrations/0025_mariadb_uuid_conversion.py b/src/integrated_channels/blackboard/migrations/0025_mariadb_uuid_conversion.py similarity index 100% rename from integrated_channels/blackboard/migrations/0025_mariadb_uuid_conversion.py rename to src/integrated_channels/blackboard/migrations/0025_mariadb_uuid_conversion.py diff --git a/integrated_channels/blackboard/migrations/__init__.py b/src/integrated_channels/blackboard/migrations/__init__.py similarity index 100% rename from integrated_channels/blackboard/migrations/__init__.py rename to src/integrated_channels/blackboard/migrations/__init__.py diff --git a/integrated_channels/blackboard/models.py b/src/integrated_channels/blackboard/models.py similarity index 100% rename from integrated_channels/blackboard/models.py rename to src/integrated_channels/blackboard/models.py diff --git a/integrated_channels/blackboard/transmitters/__init__.py b/src/integrated_channels/blackboard/transmitters/__init__.py similarity index 100% rename from integrated_channels/blackboard/transmitters/__init__.py rename to src/integrated_channels/blackboard/transmitters/__init__.py diff --git a/integrated_channels/blackboard/transmitters/content_metadata.py b/src/integrated_channels/blackboard/transmitters/content_metadata.py similarity index 100% rename from integrated_channels/blackboard/transmitters/content_metadata.py rename to src/integrated_channels/blackboard/transmitters/content_metadata.py diff --git a/integrated_channels/blackboard/transmitters/learner_data.py b/src/integrated_channels/blackboard/transmitters/learner_data.py similarity index 100% rename from integrated_channels/blackboard/transmitters/learner_data.py rename to src/integrated_channels/blackboard/transmitters/learner_data.py diff --git a/integrated_channels/blackboard/urls.py b/src/integrated_channels/blackboard/urls.py similarity index 100% rename from integrated_channels/blackboard/urls.py rename to src/integrated_channels/blackboard/urls.py diff --git a/integrated_channels/blackboard/utils.py b/src/integrated_channels/blackboard/utils.py similarity index 100% rename from integrated_channels/blackboard/utils.py rename to src/integrated_channels/blackboard/utils.py diff --git a/integrated_channels/blackboard/views.py b/src/integrated_channels/blackboard/views.py similarity index 100% rename from integrated_channels/blackboard/views.py rename to src/integrated_channels/blackboard/views.py diff --git a/integrated_channels/canvas/__init__.py b/src/integrated_channels/canvas/__init__.py similarity index 100% rename from integrated_channels/canvas/__init__.py rename to src/integrated_channels/canvas/__init__.py diff --git a/integrated_channels/canvas/admin/__init__.py b/src/integrated_channels/canvas/admin/__init__.py similarity index 100% rename from integrated_channels/canvas/admin/__init__.py rename to src/integrated_channels/canvas/admin/__init__.py diff --git a/integrated_channels/canvas/apps.py b/src/integrated_channels/canvas/apps.py similarity index 100% rename from integrated_channels/canvas/apps.py rename to src/integrated_channels/canvas/apps.py diff --git a/integrated_channels/canvas/client.py b/src/integrated_channels/canvas/client.py similarity index 100% rename from integrated_channels/canvas/client.py rename to src/integrated_channels/canvas/client.py diff --git a/integrated_channels/canvas/dev_docs/README.md b/src/integrated_channels/canvas/dev_docs/README.md similarity index 100% rename from integrated_channels/canvas/dev_docs/README.md rename to src/integrated_channels/canvas/dev_docs/README.md diff --git a/integrated_channels/canvas/exporters/__init__.py b/src/integrated_channels/canvas/exporters/__init__.py similarity index 100% rename from integrated_channels/canvas/exporters/__init__.py rename to src/integrated_channels/canvas/exporters/__init__.py diff --git a/integrated_channels/canvas/exporters/content_metadata.py b/src/integrated_channels/canvas/exporters/content_metadata.py similarity index 100% rename from integrated_channels/canvas/exporters/content_metadata.py rename to src/integrated_channels/canvas/exporters/content_metadata.py diff --git a/integrated_channels/canvas/exporters/learner_data.py b/src/integrated_channels/canvas/exporters/learner_data.py similarity index 100% rename from integrated_channels/canvas/exporters/learner_data.py rename to src/integrated_channels/canvas/exporters/learner_data.py diff --git a/integrated_channels/canvas/migrations/0001_initial.py b/src/integrated_channels/canvas/migrations/0001_initial.py similarity index 100% rename from integrated_channels/canvas/migrations/0001_initial.py rename to src/integrated_channels/canvas/migrations/0001_initial.py diff --git a/integrated_channels/canvas/migrations/0002_auto_20200806_1632.py b/src/integrated_channels/canvas/migrations/0002_auto_20200806_1632.py similarity index 100% rename from integrated_channels/canvas/migrations/0002_auto_20200806_1632.py rename to src/integrated_channels/canvas/migrations/0002_auto_20200806_1632.py diff --git a/integrated_channels/canvas/migrations/0003_delete_canvasglobalconfiguration.py b/src/integrated_channels/canvas/migrations/0003_delete_canvasglobalconfiguration.py similarity index 100% rename from integrated_channels/canvas/migrations/0003_delete_canvasglobalconfiguration.py rename to src/integrated_channels/canvas/migrations/0003_delete_canvasglobalconfiguration.py diff --git a/integrated_channels/canvas/migrations/0004_adding_learner_data_to_canvas.py b/src/integrated_channels/canvas/migrations/0004_adding_learner_data_to_canvas.py similarity index 100% rename from integrated_channels/canvas/migrations/0004_adding_learner_data_to_canvas.py rename to src/integrated_channels/canvas/migrations/0004_adding_learner_data_to_canvas.py diff --git a/integrated_channels/canvas/migrations/0005_auto_20200909_1534.py b/src/integrated_channels/canvas/migrations/0005_auto_20200909_1534.py similarity index 100% rename from integrated_channels/canvas/migrations/0005_auto_20200909_1534.py rename to src/integrated_channels/canvas/migrations/0005_auto_20200909_1534.py diff --git a/integrated_channels/canvas/migrations/0006_canvaslearnerassessmentdatatransmissionaudit.py b/src/integrated_channels/canvas/migrations/0006_canvaslearnerassessmentdatatransmissionaudit.py similarity index 100% rename from integrated_channels/canvas/migrations/0006_canvaslearnerassessmentdatatransmissionaudit.py rename to src/integrated_channels/canvas/migrations/0006_canvaslearnerassessmentdatatransmissionaudit.py diff --git a/integrated_channels/canvas/migrations/0007_auto_20210222_2225.py b/src/integrated_channels/canvas/migrations/0007_auto_20210222_2225.py similarity index 100% rename from integrated_channels/canvas/migrations/0007_auto_20210222_2225.py rename to src/integrated_channels/canvas/migrations/0007_auto_20210222_2225.py diff --git a/integrated_channels/canvas/migrations/0008_auto_20210707_0815.py b/src/integrated_channels/canvas/migrations/0008_auto_20210707_0815.py similarity index 100% rename from integrated_channels/canvas/migrations/0008_auto_20210707_0815.py rename to src/integrated_channels/canvas/migrations/0008_auto_20210707_0815.py diff --git a/integrated_channels/canvas/migrations/0009_auto_20210708_1639.py b/src/integrated_channels/canvas/migrations/0009_auto_20210708_1639.py similarity index 100% rename from integrated_channels/canvas/migrations/0009_auto_20210708_1639.py rename to src/integrated_channels/canvas/migrations/0009_auto_20210708_1639.py diff --git a/integrated_channels/canvas/migrations/0010_auto_20210909_1536.py b/src/integrated_channels/canvas/migrations/0010_auto_20210909_1536.py similarity index 100% rename from integrated_channels/canvas/migrations/0010_auto_20210909_1536.py rename to src/integrated_channels/canvas/migrations/0010_auto_20210909_1536.py diff --git a/integrated_channels/canvas/migrations/0011_auto_20210923_1727.py b/src/integrated_channels/canvas/migrations/0011_auto_20210923_1727.py similarity index 100% rename from integrated_channels/canvas/migrations/0011_auto_20210923_1727.py rename to src/integrated_channels/canvas/migrations/0011_auto_20210923_1727.py diff --git a/integrated_channels/canvas/migrations/0012_alter_canvasenterprisecustomerconfiguration_enterprise_customer.py b/src/integrated_channels/canvas/migrations/0012_alter_canvasenterprisecustomerconfiguration_enterprise_customer.py similarity index 100% rename from integrated_channels/canvas/migrations/0012_alter_canvasenterprisecustomerconfiguration_enterprise_customer.py rename to src/integrated_channels/canvas/migrations/0012_alter_canvasenterprisecustomerconfiguration_enterprise_customer.py diff --git a/integrated_channels/canvas/migrations/0013_auto_20211221_1535.py b/src/integrated_channels/canvas/migrations/0013_auto_20211221_1535.py similarity index 100% rename from integrated_channels/canvas/migrations/0013_auto_20211221_1535.py rename to src/integrated_channels/canvas/migrations/0013_auto_20211221_1535.py diff --git a/integrated_channels/canvas/migrations/0014_auto_20220126_1837.py b/src/integrated_channels/canvas/migrations/0014_auto_20220126_1837.py similarity index 100% rename from integrated_channels/canvas/migrations/0014_auto_20220126_1837.py rename to src/integrated_channels/canvas/migrations/0014_auto_20220126_1837.py diff --git a/integrated_channels/canvas/migrations/0015_auto_20220127_1605.py b/src/integrated_channels/canvas/migrations/0015_auto_20220127_1605.py similarity index 100% rename from integrated_channels/canvas/migrations/0015_auto_20220127_1605.py rename to src/integrated_channels/canvas/migrations/0015_auto_20220127_1605.py diff --git a/integrated_channels/canvas/migrations/0016_auto_20220131_1539.py b/src/integrated_channels/canvas/migrations/0016_auto_20220131_1539.py similarity index 100% rename from integrated_channels/canvas/migrations/0016_auto_20220131_1539.py rename to src/integrated_channels/canvas/migrations/0016_auto_20220131_1539.py diff --git a/integrated_channels/canvas/migrations/0017_auto_20220302_2231.py b/src/integrated_channels/canvas/migrations/0017_auto_20220302_2231.py similarity index 100% rename from integrated_channels/canvas/migrations/0017_auto_20220302_2231.py rename to src/integrated_channels/canvas/migrations/0017_auto_20220302_2231.py diff --git a/integrated_channels/canvas/migrations/0018_alter_canvaslearnerdatatransmissionaudit_completed_timestamp.py b/src/integrated_channels/canvas/migrations/0018_alter_canvaslearnerdatatransmissionaudit_completed_timestamp.py similarity index 100% rename from integrated_channels/canvas/migrations/0018_alter_canvaslearnerdatatransmissionaudit_completed_timestamp.py rename to src/integrated_channels/canvas/migrations/0018_alter_canvaslearnerdatatransmissionaudit_completed_timestamp.py diff --git a/integrated_channels/canvas/migrations/0019_auto_20220324_1550.py b/src/integrated_channels/canvas/migrations/0019_auto_20220324_1550.py similarity index 100% rename from integrated_channels/canvas/migrations/0019_auto_20220324_1550.py rename to src/integrated_channels/canvas/migrations/0019_auto_20220324_1550.py diff --git a/integrated_channels/canvas/migrations/0020_auto_20220325_1757.py b/src/integrated_channels/canvas/migrations/0020_auto_20220325_1757.py similarity index 100% rename from integrated_channels/canvas/migrations/0020_auto_20220325_1757.py rename to src/integrated_channels/canvas/migrations/0020_auto_20220325_1757.py diff --git a/integrated_channels/canvas/migrations/0021_auto_20220405_2311.py b/src/integrated_channels/canvas/migrations/0021_auto_20220405_2311.py similarity index 100% rename from integrated_channels/canvas/migrations/0021_auto_20220405_2311.py rename to src/integrated_channels/canvas/migrations/0021_auto_20220405_2311.py diff --git a/integrated_channels/canvas/migrations/0022_auto_20220523_1625.py b/src/integrated_channels/canvas/migrations/0022_auto_20220523_1625.py similarity index 100% rename from integrated_channels/canvas/migrations/0022_auto_20220523_1625.py rename to src/integrated_channels/canvas/migrations/0022_auto_20220523_1625.py diff --git a/integrated_channels/canvas/migrations/0023_auto_20220913_2018.py b/src/integrated_channels/canvas/migrations/0023_auto_20220913_2018.py similarity index 100% rename from integrated_channels/canvas/migrations/0023_auto_20220913_2018.py rename to src/integrated_channels/canvas/migrations/0023_auto_20220913_2018.py diff --git a/integrated_channels/canvas/migrations/0024_auto_20220929_1720.py b/src/integrated_channels/canvas/migrations/0024_auto_20220929_1720.py similarity index 100% rename from integrated_channels/canvas/migrations/0024_auto_20220929_1720.py rename to src/integrated_channels/canvas/migrations/0024_auto_20220929_1720.py diff --git a/integrated_channels/canvas/migrations/0025_auto_20221021_0159.py b/src/integrated_channels/canvas/migrations/0025_auto_20221021_0159.py similarity index 100% rename from integrated_channels/canvas/migrations/0025_auto_20221021_0159.py rename to src/integrated_channels/canvas/migrations/0025_auto_20221021_0159.py diff --git a/integrated_channels/canvas/migrations/0026_auto_20221031_1855.py b/src/integrated_channels/canvas/migrations/0026_auto_20221031_1855.py similarity index 100% rename from integrated_channels/canvas/migrations/0026_auto_20221031_1855.py rename to src/integrated_channels/canvas/migrations/0026_auto_20221031_1855.py diff --git a/integrated_channels/canvas/migrations/0027_move_and_recrete_completed_timestamp.py b/src/integrated_channels/canvas/migrations/0027_move_and_recrete_completed_timestamp.py similarity index 100% rename from integrated_channels/canvas/migrations/0027_move_and_recrete_completed_timestamp.py rename to src/integrated_channels/canvas/migrations/0027_move_and_recrete_completed_timestamp.py diff --git a/integrated_channels/canvas/migrations/0028_alter_canvaslearnerdatatransmissionaudit_index_together.py b/src/integrated_channels/canvas/migrations/0028_alter_canvaslearnerdatatransmissionaudit_index_together.py similarity index 100% rename from integrated_channels/canvas/migrations/0028_alter_canvaslearnerdatatransmissionaudit_index_together.py rename to src/integrated_channels/canvas/migrations/0028_alter_canvaslearnerdatatransmissionaudit_index_together.py diff --git a/integrated_channels/canvas/migrations/0029_auto_20230105_2122.py b/src/integrated_channels/canvas/migrations/0029_auto_20230105_2122.py similarity index 100% rename from integrated_channels/canvas/migrations/0029_auto_20230105_2122.py rename to src/integrated_channels/canvas/migrations/0029_auto_20230105_2122.py diff --git a/integrated_channels/canvas/migrations/0030_auto_20230112_2002.py b/src/integrated_channels/canvas/migrations/0030_auto_20230112_2002.py similarity index 100% rename from integrated_channels/canvas/migrations/0030_auto_20230112_2002.py rename to src/integrated_channels/canvas/migrations/0030_auto_20230112_2002.py diff --git a/integrated_channels/canvas/migrations/0031_auto_20230719_1621.py b/src/integrated_channels/canvas/migrations/0031_auto_20230719_1621.py similarity index 100% rename from integrated_channels/canvas/migrations/0031_auto_20230719_1621.py rename to src/integrated_channels/canvas/migrations/0031_auto_20230719_1621.py diff --git a/integrated_channels/canvas/migrations/0032_alter_historicalcanvasenterprisecustomerconfiguration_options.py b/src/integrated_channels/canvas/migrations/0032_alter_historicalcanvasenterprisecustomerconfiguration_options.py similarity index 100% rename from integrated_channels/canvas/migrations/0032_alter_historicalcanvasenterprisecustomerconfiguration_options.py rename to src/integrated_channels/canvas/migrations/0032_alter_historicalcanvasenterprisecustomerconfiguration_options.py diff --git a/integrated_channels/canvas/migrations/0033_canvaslearnerdatatransmissionaudit_canvas_unique_enrollment_course_id.py b/src/integrated_channels/canvas/migrations/0033_canvaslearnerdatatransmissionaudit_canvas_unique_enrollment_course_id.py similarity index 100% rename from integrated_channels/canvas/migrations/0033_canvaslearnerdatatransmissionaudit_canvas_unique_enrollment_course_id.py rename to src/integrated_channels/canvas/migrations/0033_canvaslearnerdatatransmissionaudit_canvas_unique_enrollment_course_id.py diff --git a/integrated_channels/canvas/migrations/0034_delete_historicalcanvasenterprisecustomerconfiguration.py b/src/integrated_channels/canvas/migrations/0034_delete_historicalcanvasenterprisecustomerconfiguration.py similarity index 100% rename from integrated_channels/canvas/migrations/0034_delete_historicalcanvasenterprisecustomerconfiguration.py rename to src/integrated_channels/canvas/migrations/0034_delete_historicalcanvasenterprisecustomerconfiguration.py diff --git a/integrated_channels/canvas/migrations/0035_canvaslearnerassessmentdatatransmissionaudit_is_transmitted_and_more.py b/src/integrated_channels/canvas/migrations/0035_canvaslearnerassessmentdatatransmissionaudit_is_transmitted_and_more.py similarity index 100% rename from integrated_channels/canvas/migrations/0035_canvaslearnerassessmentdatatransmissionaudit_is_transmitted_and_more.py rename to src/integrated_channels/canvas/migrations/0035_canvaslearnerassessmentdatatransmissionaudit_is_transmitted_and_more.py diff --git a/integrated_channels/canvas/migrations/0036_canvasenterprisecustomerconfiguration_decrypted_client_id_and_more.py b/src/integrated_channels/canvas/migrations/0036_canvasenterprisecustomerconfiguration_decrypted_client_id_and_more.py similarity index 100% rename from integrated_channels/canvas/migrations/0036_canvasenterprisecustomerconfiguration_decrypted_client_id_and_more.py rename to src/integrated_channels/canvas/migrations/0036_canvasenterprisecustomerconfiguration_decrypted_client_id_and_more.py diff --git a/integrated_channels/canvas/migrations/0037_canvasenterprisecustomerconfiguration_copy_id_and_secret_and_more.py b/src/integrated_channels/canvas/migrations/0037_canvasenterprisecustomerconfiguration_copy_id_and_secret_and_more.py similarity index 100% rename from integrated_channels/canvas/migrations/0037_canvasenterprisecustomerconfiguration_copy_id_and_secret_and_more.py rename to src/integrated_channels/canvas/migrations/0037_canvasenterprisecustomerconfiguration_copy_id_and_secret_and_more.py diff --git a/integrated_channels/canvas/migrations/0038_alter_canvasenterprisecustomerconfiguration_client_id_and_more.py b/src/integrated_channels/canvas/migrations/0038_alter_canvasenterprisecustomerconfiguration_client_id_and_more.py similarity index 100% rename from integrated_channels/canvas/migrations/0038_alter_canvasenterprisecustomerconfiguration_client_id_and_more.py rename to src/integrated_channels/canvas/migrations/0038_alter_canvasenterprisecustomerconfiguration_client_id_and_more.py diff --git a/integrated_channels/canvas/migrations/0039_remove_canvasenterprisecustomerconfiguration_client_id_and_more.py b/src/integrated_channels/canvas/migrations/0039_remove_canvasenterprisecustomerconfiguration_client_id_and_more.py similarity index 100% rename from integrated_channels/canvas/migrations/0039_remove_canvasenterprisecustomerconfiguration_client_id_and_more.py rename to src/integrated_channels/canvas/migrations/0039_remove_canvasenterprisecustomerconfiguration_client_id_and_more.py diff --git a/integrated_channels/canvas/migrations/0040_rename_canvaslearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_canvas_cu.py b/src/integrated_channels/canvas/migrations/0040_rename_canvaslearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_canvas_cu.py similarity index 100% rename from integrated_channels/canvas/migrations/0040_rename_canvaslearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_canvas_cu.py rename to src/integrated_channels/canvas/migrations/0040_rename_canvaslearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_canvas_cu.py diff --git a/integrated_channels/canvas/migrations/0041_mariadb_uuid_conversion.py b/src/integrated_channels/canvas/migrations/0041_mariadb_uuid_conversion.py similarity index 100% rename from integrated_channels/canvas/migrations/0041_mariadb_uuid_conversion.py rename to src/integrated_channels/canvas/migrations/0041_mariadb_uuid_conversion.py diff --git a/integrated_channels/canvas/migrations/__init__.py b/src/integrated_channels/canvas/migrations/__init__.py similarity index 100% rename from integrated_channels/canvas/migrations/__init__.py rename to src/integrated_channels/canvas/migrations/__init__.py diff --git a/integrated_channels/canvas/models.py b/src/integrated_channels/canvas/models.py similarity index 100% rename from integrated_channels/canvas/models.py rename to src/integrated_channels/canvas/models.py diff --git a/integrated_channels/canvas/transmitters/__init__.py b/src/integrated_channels/canvas/transmitters/__init__.py similarity index 100% rename from integrated_channels/canvas/transmitters/__init__.py rename to src/integrated_channels/canvas/transmitters/__init__.py diff --git a/integrated_channels/canvas/transmitters/content_metadata.py b/src/integrated_channels/canvas/transmitters/content_metadata.py similarity index 100% rename from integrated_channels/canvas/transmitters/content_metadata.py rename to src/integrated_channels/canvas/transmitters/content_metadata.py diff --git a/integrated_channels/canvas/transmitters/learner_data.py b/src/integrated_channels/canvas/transmitters/learner_data.py similarity index 100% rename from integrated_channels/canvas/transmitters/learner_data.py rename to src/integrated_channels/canvas/transmitters/learner_data.py diff --git a/integrated_channels/canvas/urls.py b/src/integrated_channels/canvas/urls.py similarity index 100% rename from integrated_channels/canvas/urls.py rename to src/integrated_channels/canvas/urls.py diff --git a/integrated_channels/canvas/utils.py b/src/integrated_channels/canvas/utils.py similarity index 100% rename from integrated_channels/canvas/utils.py rename to src/integrated_channels/canvas/utils.py diff --git a/integrated_channels/canvas/views.py b/src/integrated_channels/canvas/views.py similarity index 100% rename from integrated_channels/canvas/views.py rename to src/integrated_channels/canvas/views.py diff --git a/integrated_channels/catalog_service_utils.py b/src/integrated_channels/catalog_service_utils.py similarity index 100% rename from integrated_channels/catalog_service_utils.py rename to src/integrated_channels/catalog_service_utils.py diff --git a/integrated_channels/cornerstone/__init__.py b/src/integrated_channels/cornerstone/__init__.py similarity index 100% rename from integrated_channels/cornerstone/__init__.py rename to src/integrated_channels/cornerstone/__init__.py diff --git a/integrated_channels/cornerstone/admin/__init__.py b/src/integrated_channels/cornerstone/admin/__init__.py similarity index 100% rename from integrated_channels/cornerstone/admin/__init__.py rename to src/integrated_channels/cornerstone/admin/__init__.py diff --git a/integrated_channels/cornerstone/apps.py b/src/integrated_channels/cornerstone/apps.py similarity index 100% rename from integrated_channels/cornerstone/apps.py rename to src/integrated_channels/cornerstone/apps.py diff --git a/integrated_channels/cornerstone/client.py b/src/integrated_channels/cornerstone/client.py similarity index 100% rename from integrated_channels/cornerstone/client.py rename to src/integrated_channels/cornerstone/client.py diff --git a/integrated_channels/cornerstone/exporters/__init__.py b/src/integrated_channels/cornerstone/exporters/__init__.py similarity index 100% rename from integrated_channels/cornerstone/exporters/__init__.py rename to src/integrated_channels/cornerstone/exporters/__init__.py diff --git a/integrated_channels/cornerstone/exporters/content_metadata.py b/src/integrated_channels/cornerstone/exporters/content_metadata.py similarity index 100% rename from integrated_channels/cornerstone/exporters/content_metadata.py rename to src/integrated_channels/cornerstone/exporters/content_metadata.py diff --git a/integrated_channels/cornerstone/exporters/learner_data.py b/src/integrated_channels/cornerstone/exporters/learner_data.py similarity index 100% rename from integrated_channels/cornerstone/exporters/learner_data.py rename to src/integrated_channels/cornerstone/exporters/learner_data.py diff --git a/integrated_channels/cornerstone/migrations/0001_initial.py b/src/integrated_channels/cornerstone/migrations/0001_initial.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0001_initial.py rename to src/integrated_channels/cornerstone/migrations/0001_initial.py diff --git a/integrated_channels/cornerstone/migrations/0002_cornerstoneglobalconfiguration_subject_mapping.py b/src/integrated_channels/cornerstone/migrations/0002_cornerstoneglobalconfiguration_subject_mapping.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0002_cornerstoneglobalconfiguration_subject_mapping.py rename to src/integrated_channels/cornerstone/migrations/0002_cornerstoneglobalconfiguration_subject_mapping.py diff --git a/integrated_channels/cornerstone/migrations/0003_auto_20190621_1000.py b/src/integrated_channels/cornerstone/migrations/0003_auto_20190621_1000.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0003_auto_20190621_1000.py rename to src/integrated_channels/cornerstone/migrations/0003_auto_20190621_1000.py diff --git a/integrated_channels/cornerstone/migrations/0004_cornerstoneglobalconfiguration_languages.py b/src/integrated_channels/cornerstone/migrations/0004_cornerstoneglobalconfiguration_languages.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0004_cornerstoneglobalconfiguration_languages.py rename to src/integrated_channels/cornerstone/migrations/0004_cornerstoneglobalconfiguration_languages.py diff --git a/integrated_channels/cornerstone/migrations/0005_auto_20190925_0730.py b/src/integrated_channels/cornerstone/migrations/0005_auto_20190925_0730.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0005_auto_20190925_0730.py rename to src/integrated_channels/cornerstone/migrations/0005_auto_20190925_0730.py diff --git a/integrated_channels/cornerstone/migrations/0006_auto_20191001_0742.py b/src/integrated_channels/cornerstone/migrations/0006_auto_20191001_0742.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0006_auto_20191001_0742.py rename to src/integrated_channels/cornerstone/migrations/0006_auto_20191001_0742.py diff --git a/integrated_channels/cornerstone/migrations/0007_auto_20210708_1446.py b/src/integrated_channels/cornerstone/migrations/0007_auto_20210708_1446.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0007_auto_20210708_1446.py rename to src/integrated_channels/cornerstone/migrations/0007_auto_20210708_1446.py diff --git a/integrated_channels/cornerstone/migrations/0008_auto_20210909_1536.py b/src/integrated_channels/cornerstone/migrations/0008_auto_20210909_1536.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0008_auto_20210909_1536.py rename to src/integrated_channels/cornerstone/migrations/0008_auto_20210909_1536.py diff --git a/integrated_channels/cornerstone/migrations/0009_auto_20210923_1727.py b/src/integrated_channels/cornerstone/migrations/0009_auto_20210923_1727.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0009_auto_20210923_1727.py rename to src/integrated_channels/cornerstone/migrations/0009_auto_20210923_1727.py diff --git a/integrated_channels/cornerstone/migrations/0010_cornerstonecoursekey.py b/src/integrated_channels/cornerstone/migrations/0010_cornerstonecoursekey.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0010_cornerstonecoursekey.py rename to src/integrated_channels/cornerstone/migrations/0010_cornerstonecoursekey.py diff --git a/integrated_channels/cornerstone/migrations/0011_auto_20211103_1855.py b/src/integrated_channels/cornerstone/migrations/0011_auto_20211103_1855.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0011_auto_20211103_1855.py rename to src/integrated_channels/cornerstone/migrations/0011_auto_20211103_1855.py diff --git a/integrated_channels/cornerstone/migrations/0012_alter_cornerstoneenterprisecustomerconfiguration_enterprise_customer.py b/src/integrated_channels/cornerstone/migrations/0012_alter_cornerstoneenterprisecustomerconfiguration_enterprise_customer.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0012_alter_cornerstoneenterprisecustomerconfiguration_enterprise_customer.py rename to src/integrated_channels/cornerstone/migrations/0012_alter_cornerstoneenterprisecustomerconfiguration_enterprise_customer.py diff --git a/integrated_channels/cornerstone/migrations/0013_auto_20220126_1837.py b/src/integrated_channels/cornerstone/migrations/0013_auto_20220126_1837.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0013_auto_20220126_1837.py rename to src/integrated_channels/cornerstone/migrations/0013_auto_20220126_1837.py diff --git a/integrated_channels/cornerstone/migrations/0014_auto_20220131_1539.py b/src/integrated_channels/cornerstone/migrations/0014_auto_20220131_1539.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0014_auto_20220131_1539.py rename to src/integrated_channels/cornerstone/migrations/0014_auto_20220131_1539.py diff --git a/integrated_channels/cornerstone/migrations/0015_auto_20220302_2231.py b/src/integrated_channels/cornerstone/migrations/0015_auto_20220302_2231.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0015_auto_20220302_2231.py rename to src/integrated_channels/cornerstone/migrations/0015_auto_20220302_2231.py diff --git a/integrated_channels/cornerstone/migrations/0016_auto_20220324_1550.py b/src/integrated_channels/cornerstone/migrations/0016_auto_20220324_1550.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0016_auto_20220324_1550.py rename to src/integrated_channels/cornerstone/migrations/0016_auto_20220324_1550.py diff --git a/integrated_channels/cornerstone/migrations/0017_alter_cornerstonelearnerdatatransmissionaudit_course_completed.py b/src/integrated_channels/cornerstone/migrations/0017_alter_cornerstonelearnerdatatransmissionaudit_course_completed.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0017_alter_cornerstonelearnerdatatransmissionaudit_course_completed.py rename to src/integrated_channels/cornerstone/migrations/0017_alter_cornerstonelearnerdatatransmissionaudit_course_completed.py diff --git a/integrated_channels/cornerstone/migrations/0018_auto_20220325_1757.py b/src/integrated_channels/cornerstone/migrations/0018_auto_20220325_1757.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0018_auto_20220325_1757.py rename to src/integrated_channels/cornerstone/migrations/0018_auto_20220325_1757.py diff --git a/integrated_channels/cornerstone/migrations/0019_auto_20220405_2311.py b/src/integrated_channels/cornerstone/migrations/0019_auto_20220405_2311.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0019_auto_20220405_2311.py rename to src/integrated_channels/cornerstone/migrations/0019_auto_20220405_2311.py diff --git a/integrated_channels/cornerstone/migrations/0020_auto_20220523_1625.py b/src/integrated_channels/cornerstone/migrations/0020_auto_20220523_1625.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0020_auto_20220523_1625.py rename to src/integrated_channels/cornerstone/migrations/0020_auto_20220523_1625.py diff --git a/integrated_channels/cornerstone/migrations/0021_cornerstonelearnerdatatransmissionaudit_friendly_status_message.py b/src/integrated_channels/cornerstone/migrations/0021_cornerstonelearnerdatatransmissionaudit_friendly_status_message.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0021_cornerstonelearnerdatatransmissionaudit_friendly_status_message.py rename to src/integrated_channels/cornerstone/migrations/0021_cornerstonelearnerdatatransmissionaudit_friendly_status_message.py diff --git a/integrated_channels/cornerstone/migrations/0022_cornerstonelearnerdatatransmissionaudit_api_record.py b/src/integrated_channels/cornerstone/migrations/0022_cornerstonelearnerdatatransmissionaudit_api_record.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0022_cornerstonelearnerdatatransmissionaudit_api_record.py rename to src/integrated_channels/cornerstone/migrations/0022_cornerstonelearnerdatatransmissionaudit_api_record.py diff --git a/integrated_channels/cornerstone/migrations/0023_auto_20221021_0159.py b/src/integrated_channels/cornerstone/migrations/0023_auto_20221021_0159.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0023_auto_20221021_0159.py rename to src/integrated_channels/cornerstone/migrations/0023_auto_20221021_0159.py diff --git a/integrated_channels/cornerstone/migrations/0024_auto_20221031_1855.py b/src/integrated_channels/cornerstone/migrations/0024_auto_20221031_1855.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0024_auto_20221031_1855.py rename to src/integrated_channels/cornerstone/migrations/0024_auto_20221031_1855.py diff --git a/integrated_channels/cornerstone/migrations/0025_alter_cornerstonelearnerdatatransmissionaudit_index_together.py b/src/integrated_channels/cornerstone/migrations/0025_alter_cornerstonelearnerdatatransmissionaudit_index_together.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0025_alter_cornerstonelearnerdatatransmissionaudit_index_together.py rename to src/integrated_channels/cornerstone/migrations/0025_alter_cornerstonelearnerdatatransmissionaudit_index_together.py diff --git a/integrated_channels/cornerstone/migrations/0026_auto_20230105_2122.py b/src/integrated_channels/cornerstone/migrations/0026_auto_20230105_2122.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0026_auto_20230105_2122.py rename to src/integrated_channels/cornerstone/migrations/0026_auto_20230105_2122.py diff --git a/integrated_channels/cornerstone/migrations/0027_auto_20230112_2002.py b/src/integrated_channels/cornerstone/migrations/0027_auto_20230112_2002.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0027_auto_20230112_2002.py rename to src/integrated_channels/cornerstone/migrations/0027_auto_20230112_2002.py diff --git a/integrated_channels/cornerstone/migrations/0028_auto_20230719_1621.py b/src/integrated_channels/cornerstone/migrations/0028_auto_20230719_1621.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0028_auto_20230719_1621.py rename to src/integrated_channels/cornerstone/migrations/0028_auto_20230719_1621.py diff --git a/integrated_channels/cornerstone/migrations/0029_alter_historicalcornerstoneenterprisecustomerconfiguration_options.py b/src/integrated_channels/cornerstone/migrations/0029_alter_historicalcornerstoneenterprisecustomerconfiguration_options.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0029_alter_historicalcornerstoneenterprisecustomerconfiguration_options.py rename to src/integrated_channels/cornerstone/migrations/0029_alter_historicalcornerstoneenterprisecustomerconfiguration_options.py diff --git a/integrated_channels/cornerstone/migrations/0030_auto_20231010_1654.py b/src/integrated_channels/cornerstone/migrations/0030_auto_20231010_1654.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0030_auto_20231010_1654.py rename to src/integrated_channels/cornerstone/migrations/0030_auto_20231010_1654.py diff --git a/integrated_channels/cornerstone/migrations/0031_cornerstoneapirequestlogs.py b/src/integrated_channels/cornerstone/migrations/0031_cornerstoneapirequestlogs.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0031_cornerstoneapirequestlogs.py rename to src/integrated_channels/cornerstone/migrations/0031_cornerstoneapirequestlogs.py diff --git a/integrated_channels/cornerstone/migrations/0032_delete_cornerstoneapirequestlogs.py b/src/integrated_channels/cornerstone/migrations/0032_delete_cornerstoneapirequestlogs.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0032_delete_cornerstoneapirequestlogs.py rename to src/integrated_channels/cornerstone/migrations/0032_delete_cornerstoneapirequestlogs.py diff --git a/integrated_channels/cornerstone/migrations/0033_delete_historicalcornerstoneenterprisecustomerconfiguration.py b/src/integrated_channels/cornerstone/migrations/0033_delete_historicalcornerstoneenterprisecustomerconfiguration.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0033_delete_historicalcornerstoneenterprisecustomerconfiguration.py rename to src/integrated_channels/cornerstone/migrations/0033_delete_historicalcornerstoneenterprisecustomerconfiguration.py diff --git a/integrated_channels/cornerstone/migrations/0034_cornerstonelearnerdatatransmissionaudit_is_transmitted.py b/src/integrated_channels/cornerstone/migrations/0034_cornerstonelearnerdatatransmissionaudit_is_transmitted.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0034_cornerstonelearnerdatatransmissionaudit_is_transmitted.py rename to src/integrated_channels/cornerstone/migrations/0034_cornerstonelearnerdatatransmissionaudit_is_transmitted.py diff --git a/integrated_channels/cornerstone/migrations/0035_rename_cornerstonelearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_corn.py b/src/integrated_channels/cornerstone/migrations/0035_rename_cornerstonelearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_corn.py similarity index 100% rename from integrated_channels/cornerstone/migrations/0035_rename_cornerstonelearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_corn.py rename to src/integrated_channels/cornerstone/migrations/0035_rename_cornerstonelearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_corn.py diff --git a/integrated_channels/cornerstone/migrations/__init__.py b/src/integrated_channels/cornerstone/migrations/__init__.py similarity index 100% rename from integrated_channels/cornerstone/migrations/__init__.py rename to src/integrated_channels/cornerstone/migrations/__init__.py diff --git a/integrated_channels/cornerstone/models.py b/src/integrated_channels/cornerstone/models.py similarity index 100% rename from integrated_channels/cornerstone/models.py rename to src/integrated_channels/cornerstone/models.py diff --git a/integrated_channels/cornerstone/transmitters/__init__.py b/src/integrated_channels/cornerstone/transmitters/__init__.py similarity index 100% rename from integrated_channels/cornerstone/transmitters/__init__.py rename to src/integrated_channels/cornerstone/transmitters/__init__.py diff --git a/integrated_channels/cornerstone/transmitters/content_metadata.py b/src/integrated_channels/cornerstone/transmitters/content_metadata.py similarity index 100% rename from integrated_channels/cornerstone/transmitters/content_metadata.py rename to src/integrated_channels/cornerstone/transmitters/content_metadata.py diff --git a/integrated_channels/cornerstone/transmitters/learner_data.py b/src/integrated_channels/cornerstone/transmitters/learner_data.py similarity index 100% rename from integrated_channels/cornerstone/transmitters/learner_data.py rename to src/integrated_channels/cornerstone/transmitters/learner_data.py diff --git a/integrated_channels/cornerstone/urls.py b/src/integrated_channels/cornerstone/urls.py similarity index 100% rename from integrated_channels/cornerstone/urls.py rename to src/integrated_channels/cornerstone/urls.py diff --git a/integrated_channels/cornerstone/utils.py b/src/integrated_channels/cornerstone/utils.py similarity index 100% rename from integrated_channels/cornerstone/utils.py rename to src/integrated_channels/cornerstone/utils.py diff --git a/integrated_channels/cornerstone/views.py b/src/integrated_channels/cornerstone/views.py similarity index 100% rename from integrated_channels/cornerstone/views.py rename to src/integrated_channels/cornerstone/views.py diff --git a/integrated_channels/degreed/__init__.py b/src/integrated_channels/degreed/__init__.py similarity index 100% rename from integrated_channels/degreed/__init__.py rename to src/integrated_channels/degreed/__init__.py diff --git a/integrated_channels/degreed/admin/__init__.py b/src/integrated_channels/degreed/admin/__init__.py similarity index 100% rename from integrated_channels/degreed/admin/__init__.py rename to src/integrated_channels/degreed/admin/__init__.py diff --git a/integrated_channels/degreed/apps.py b/src/integrated_channels/degreed/apps.py similarity index 100% rename from integrated_channels/degreed/apps.py rename to src/integrated_channels/degreed/apps.py diff --git a/integrated_channels/degreed/client.py b/src/integrated_channels/degreed/client.py similarity index 100% rename from integrated_channels/degreed/client.py rename to src/integrated_channels/degreed/client.py diff --git a/integrated_channels/degreed/exporters/__init__.py b/src/integrated_channels/degreed/exporters/__init__.py similarity index 100% rename from integrated_channels/degreed/exporters/__init__.py rename to src/integrated_channels/degreed/exporters/__init__.py diff --git a/integrated_channels/degreed/exporters/content_metadata.py b/src/integrated_channels/degreed/exporters/content_metadata.py similarity index 100% rename from integrated_channels/degreed/exporters/content_metadata.py rename to src/integrated_channels/degreed/exporters/content_metadata.py diff --git a/integrated_channels/degreed/exporters/learner_data.py b/src/integrated_channels/degreed/exporters/learner_data.py similarity index 100% rename from integrated_channels/degreed/exporters/learner_data.py rename to src/integrated_channels/degreed/exporters/learner_data.py diff --git a/integrated_channels/degreed/migrations/0001_initial.py b/src/integrated_channels/degreed/migrations/0001_initial.py similarity index 100% rename from integrated_channels/degreed/migrations/0001_initial.py rename to src/integrated_channels/degreed/migrations/0001_initial.py diff --git a/integrated_channels/degreed/migrations/0002_auto_20180104_0103.py b/src/integrated_channels/degreed/migrations/0002_auto_20180104_0103.py similarity index 100% rename from integrated_channels/degreed/migrations/0002_auto_20180104_0103.py rename to src/integrated_channels/degreed/migrations/0002_auto_20180104_0103.py diff --git a/integrated_channels/degreed/migrations/0003_auto_20180109_0712.py b/src/integrated_channels/degreed/migrations/0003_auto_20180109_0712.py similarity index 100% rename from integrated_channels/degreed/migrations/0003_auto_20180109_0712.py rename to src/integrated_channels/degreed/migrations/0003_auto_20180109_0712.py diff --git a/integrated_channels/degreed/migrations/0004_auto_20180306_1251.py b/src/integrated_channels/degreed/migrations/0004_auto_20180306_1251.py similarity index 100% rename from integrated_channels/degreed/migrations/0004_auto_20180306_1251.py rename to src/integrated_channels/degreed/migrations/0004_auto_20180306_1251.py diff --git a/integrated_channels/degreed/migrations/0005_auto_20180807_1302.py b/src/integrated_channels/degreed/migrations/0005_auto_20180807_1302.py similarity index 100% rename from integrated_channels/degreed/migrations/0005_auto_20180807_1302.py rename to src/integrated_channels/degreed/migrations/0005_auto_20180807_1302.py diff --git a/integrated_channels/degreed/migrations/0006_upgrade_django_simple_history.py b/src/integrated_channels/degreed/migrations/0006_upgrade_django_simple_history.py similarity index 100% rename from integrated_channels/degreed/migrations/0006_upgrade_django_simple_history.py rename to src/integrated_channels/degreed/migrations/0006_upgrade_django_simple_history.py diff --git a/integrated_channels/degreed/migrations/0007_auto_20190925_0730.py b/src/integrated_channels/degreed/migrations/0007_auto_20190925_0730.py similarity index 100% rename from integrated_channels/degreed/migrations/0007_auto_20190925_0730.py rename to src/integrated_channels/degreed/migrations/0007_auto_20190925_0730.py diff --git a/integrated_channels/degreed/migrations/0008_auto_20191001_0742.py b/src/integrated_channels/degreed/migrations/0008_auto_20191001_0742.py similarity index 100% rename from integrated_channels/degreed/migrations/0008_auto_20191001_0742.py rename to src/integrated_channels/degreed/migrations/0008_auto_20191001_0742.py diff --git a/integrated_channels/degreed/migrations/0009_auto_20210119_1546.py b/src/integrated_channels/degreed/migrations/0009_auto_20210119_1546.py similarity index 100% rename from integrated_channels/degreed/migrations/0009_auto_20210119_1546.py rename to src/integrated_channels/degreed/migrations/0009_auto_20210119_1546.py diff --git a/integrated_channels/degreed/migrations/0010_auto_20210708_1446.py b/src/integrated_channels/degreed/migrations/0010_auto_20210708_1446.py similarity index 100% rename from integrated_channels/degreed/migrations/0010_auto_20210708_1446.py rename to src/integrated_channels/degreed/migrations/0010_auto_20210708_1446.py diff --git a/integrated_channels/degreed/migrations/0011_auto_20210909_1536.py b/src/integrated_channels/degreed/migrations/0011_auto_20210909_1536.py similarity index 100% rename from integrated_channels/degreed/migrations/0011_auto_20210909_1536.py rename to src/integrated_channels/degreed/migrations/0011_auto_20210909_1536.py diff --git a/integrated_channels/degreed/migrations/0012_auto_20210923_1727.py b/src/integrated_channels/degreed/migrations/0012_auto_20210923_1727.py similarity index 100% rename from integrated_channels/degreed/migrations/0012_auto_20210923_1727.py rename to src/integrated_channels/degreed/migrations/0012_auto_20210923_1727.py diff --git a/integrated_channels/degreed/migrations/0013_alter_degreedenterprisecustomerconfiguration_enterprise_customer.py b/src/integrated_channels/degreed/migrations/0013_alter_degreedenterprisecustomerconfiguration_enterprise_customer.py similarity index 100% rename from integrated_channels/degreed/migrations/0013_alter_degreedenterprisecustomerconfiguration_enterprise_customer.py rename to src/integrated_channels/degreed/migrations/0013_alter_degreedenterprisecustomerconfiguration_enterprise_customer.py diff --git a/integrated_channels/degreed/migrations/0014_auto_20220126_1837.py b/src/integrated_channels/degreed/migrations/0014_auto_20220126_1837.py similarity index 100% rename from integrated_channels/degreed/migrations/0014_auto_20220126_1837.py rename to src/integrated_channels/degreed/migrations/0014_auto_20220126_1837.py diff --git a/integrated_channels/degreed/migrations/0015_auto_20220131_1539.py b/src/integrated_channels/degreed/migrations/0015_auto_20220131_1539.py similarity index 100% rename from integrated_channels/degreed/migrations/0015_auto_20220131_1539.py rename to src/integrated_channels/degreed/migrations/0015_auto_20220131_1539.py diff --git a/integrated_channels/degreed/migrations/0016_auto_20220302_2231.py b/src/integrated_channels/degreed/migrations/0016_auto_20220302_2231.py similarity index 100% rename from integrated_channels/degreed/migrations/0016_auto_20220302_2231.py rename to src/integrated_channels/degreed/migrations/0016_auto_20220302_2231.py diff --git a/integrated_channels/degreed/migrations/0017_alter_degreedlearnerdatatransmissionaudit_completed_timestamp.py b/src/integrated_channels/degreed/migrations/0017_alter_degreedlearnerdatatransmissionaudit_completed_timestamp.py similarity index 100% rename from integrated_channels/degreed/migrations/0017_alter_degreedlearnerdatatransmissionaudit_completed_timestamp.py rename to src/integrated_channels/degreed/migrations/0017_alter_degreedlearnerdatatransmissionaudit_completed_timestamp.py diff --git a/integrated_channels/degreed/migrations/0018_auto_20220324_1550.py b/src/integrated_channels/degreed/migrations/0018_auto_20220324_1550.py similarity index 100% rename from integrated_channels/degreed/migrations/0018_auto_20220324_1550.py rename to src/integrated_channels/degreed/migrations/0018_auto_20220324_1550.py diff --git a/integrated_channels/degreed/migrations/0019_auto_20220325_1757.py b/src/integrated_channels/degreed/migrations/0019_auto_20220325_1757.py similarity index 100% rename from integrated_channels/degreed/migrations/0019_auto_20220325_1757.py rename to src/integrated_channels/degreed/migrations/0019_auto_20220325_1757.py diff --git a/integrated_channels/degreed/migrations/0020_auto_20220405_2311.py b/src/integrated_channels/degreed/migrations/0020_auto_20220405_2311.py similarity index 100% rename from integrated_channels/degreed/migrations/0020_auto_20220405_2311.py rename to src/integrated_channels/degreed/migrations/0020_auto_20220405_2311.py diff --git a/integrated_channels/degreed/migrations/0021_auto_20220523_1625.py b/src/integrated_channels/degreed/migrations/0021_auto_20220523_1625.py similarity index 100% rename from integrated_channels/degreed/migrations/0021_auto_20220523_1625.py rename to src/integrated_channels/degreed/migrations/0021_auto_20220523_1625.py diff --git a/integrated_channels/degreed/migrations/0022_degreedlearnerdatatransmissionaudit_friendly_status_message.py b/src/integrated_channels/degreed/migrations/0022_degreedlearnerdatatransmissionaudit_friendly_status_message.py similarity index 100% rename from integrated_channels/degreed/migrations/0022_degreedlearnerdatatransmissionaudit_friendly_status_message.py rename to src/integrated_channels/degreed/migrations/0022_degreedlearnerdatatransmissionaudit_friendly_status_message.py diff --git a/integrated_channels/degreed/migrations/0023_degreedlearnerdatatransmissionaudit_api_record.py b/src/integrated_channels/degreed/migrations/0023_degreedlearnerdatatransmissionaudit_api_record.py similarity index 100% rename from integrated_channels/degreed/migrations/0023_degreedlearnerdatatransmissionaudit_api_record.py rename to src/integrated_channels/degreed/migrations/0023_degreedlearnerdatatransmissionaudit_api_record.py diff --git a/integrated_channels/degreed/migrations/0024_auto_20221021_0159.py b/src/integrated_channels/degreed/migrations/0024_auto_20221021_0159.py similarity index 100% rename from integrated_channels/degreed/migrations/0024_auto_20221021_0159.py rename to src/integrated_channels/degreed/migrations/0024_auto_20221021_0159.py diff --git a/integrated_channels/degreed/migrations/0025_auto_20221031_1855.py b/src/integrated_channels/degreed/migrations/0025_auto_20221031_1855.py similarity index 100% rename from integrated_channels/degreed/migrations/0025_auto_20221031_1855.py rename to src/integrated_channels/degreed/migrations/0025_auto_20221031_1855.py diff --git a/integrated_channels/degreed/migrations/0026_move_and_recrete_completed_timestamp.py b/src/integrated_channels/degreed/migrations/0026_move_and_recrete_completed_timestamp.py similarity index 100% rename from integrated_channels/degreed/migrations/0026_move_and_recrete_completed_timestamp.py rename to src/integrated_channels/degreed/migrations/0026_move_and_recrete_completed_timestamp.py diff --git a/integrated_channels/degreed/migrations/0027_alter_degreedlearnerdatatransmissionaudit_index_together.py b/src/integrated_channels/degreed/migrations/0027_alter_degreedlearnerdatatransmissionaudit_index_together.py similarity index 100% rename from integrated_channels/degreed/migrations/0027_alter_degreedlearnerdatatransmissionaudit_index_together.py rename to src/integrated_channels/degreed/migrations/0027_alter_degreedlearnerdatatransmissionaudit_index_together.py diff --git a/integrated_channels/degreed/migrations/0028_auto_20230105_2122.py b/src/integrated_channels/degreed/migrations/0028_auto_20230105_2122.py similarity index 100% rename from integrated_channels/degreed/migrations/0028_auto_20230105_2122.py rename to src/integrated_channels/degreed/migrations/0028_auto_20230105_2122.py diff --git a/integrated_channels/degreed/migrations/0029_auto_20230112_2002.py b/src/integrated_channels/degreed/migrations/0029_auto_20230112_2002.py similarity index 100% rename from integrated_channels/degreed/migrations/0029_auto_20230112_2002.py rename to src/integrated_channels/degreed/migrations/0029_auto_20230112_2002.py diff --git a/integrated_channels/degreed/migrations/0030_auto_20230719_1621.py b/src/integrated_channels/degreed/migrations/0030_auto_20230719_1621.py similarity index 100% rename from integrated_channels/degreed/migrations/0030_auto_20230719_1621.py rename to src/integrated_channels/degreed/migrations/0030_auto_20230719_1621.py diff --git a/integrated_channels/degreed/migrations/0031_alter_historicaldegreedenterprisecustomerconfiguration_options.py b/src/integrated_channels/degreed/migrations/0031_alter_historicaldegreedenterprisecustomerconfiguration_options.py similarity index 100% rename from integrated_channels/degreed/migrations/0031_alter_historicaldegreedenterprisecustomerconfiguration_options.py rename to src/integrated_channels/degreed/migrations/0031_alter_historicaldegreedenterprisecustomerconfiguration_options.py diff --git a/integrated_channels/degreed/migrations/0032_delete_historicaldegreedenterprisecustomerconfiguration.py b/src/integrated_channels/degreed/migrations/0032_delete_historicaldegreedenterprisecustomerconfiguration.py similarity index 100% rename from integrated_channels/degreed/migrations/0032_delete_historicaldegreedenterprisecustomerconfiguration.py rename to src/integrated_channels/degreed/migrations/0032_delete_historicaldegreedenterprisecustomerconfiguration.py diff --git a/integrated_channels/degreed/migrations/0033_degreedlearnerdatatransmissionaudit_is_transmitted.py b/src/integrated_channels/degreed/migrations/0033_degreedlearnerdatatransmissionaudit_is_transmitted.py similarity index 100% rename from integrated_channels/degreed/migrations/0033_degreedlearnerdatatransmissionaudit_is_transmitted.py rename to src/integrated_channels/degreed/migrations/0033_degreedlearnerdatatransmissionaudit_is_transmitted.py diff --git a/integrated_channels/degreed/migrations/0034_rename_degreedlearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_degreed_.py b/src/integrated_channels/degreed/migrations/0034_rename_degreedlearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_degreed_.py similarity index 100% rename from integrated_channels/degreed/migrations/0034_rename_degreedlearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_degreed_.py rename to src/integrated_channels/degreed/migrations/0034_rename_degreedlearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_degreed_.py diff --git a/integrated_channels/degreed/migrations/__init__.py b/src/integrated_channels/degreed/migrations/__init__.py similarity index 100% rename from integrated_channels/degreed/migrations/__init__.py rename to src/integrated_channels/degreed/migrations/__init__.py diff --git a/integrated_channels/degreed/models.py b/src/integrated_channels/degreed/models.py similarity index 100% rename from integrated_channels/degreed/models.py rename to src/integrated_channels/degreed/models.py diff --git a/integrated_channels/degreed/transmitters/__init__.py b/src/integrated_channels/degreed/transmitters/__init__.py similarity index 100% rename from integrated_channels/degreed/transmitters/__init__.py rename to src/integrated_channels/degreed/transmitters/__init__.py diff --git a/integrated_channels/degreed/transmitters/content_metadata.py b/src/integrated_channels/degreed/transmitters/content_metadata.py similarity index 100% rename from integrated_channels/degreed/transmitters/content_metadata.py rename to src/integrated_channels/degreed/transmitters/content_metadata.py diff --git a/integrated_channels/degreed/transmitters/learner_data.py b/src/integrated_channels/degreed/transmitters/learner_data.py similarity index 100% rename from integrated_channels/degreed/transmitters/learner_data.py rename to src/integrated_channels/degreed/transmitters/learner_data.py diff --git a/integrated_channels/degreed2/README.rst b/src/integrated_channels/degreed2/README.rst similarity index 100% rename from integrated_channels/degreed2/README.rst rename to src/integrated_channels/degreed2/README.rst diff --git a/integrated_channels/degreed2/__init__.py b/src/integrated_channels/degreed2/__init__.py similarity index 100% rename from integrated_channels/degreed2/__init__.py rename to src/integrated_channels/degreed2/__init__.py diff --git a/integrated_channels/degreed2/admin/__init__.py b/src/integrated_channels/degreed2/admin/__init__.py similarity index 100% rename from integrated_channels/degreed2/admin/__init__.py rename to src/integrated_channels/degreed2/admin/__init__.py diff --git a/integrated_channels/degreed2/apps.py b/src/integrated_channels/degreed2/apps.py similarity index 100% rename from integrated_channels/degreed2/apps.py rename to src/integrated_channels/degreed2/apps.py diff --git a/integrated_channels/degreed2/client.py b/src/integrated_channels/degreed2/client.py similarity index 100% rename from integrated_channels/degreed2/client.py rename to src/integrated_channels/degreed2/client.py diff --git a/integrated_channels/degreed2/exporters/__init__.py b/src/integrated_channels/degreed2/exporters/__init__.py similarity index 100% rename from integrated_channels/degreed2/exporters/__init__.py rename to src/integrated_channels/degreed2/exporters/__init__.py diff --git a/integrated_channels/degreed2/exporters/content_metadata.py b/src/integrated_channels/degreed2/exporters/content_metadata.py similarity index 100% rename from integrated_channels/degreed2/exporters/content_metadata.py rename to src/integrated_channels/degreed2/exporters/content_metadata.py diff --git a/integrated_channels/degreed2/exporters/learner_data.py b/src/integrated_channels/degreed2/exporters/learner_data.py similarity index 100% rename from integrated_channels/degreed2/exporters/learner_data.py rename to src/integrated_channels/degreed2/exporters/learner_data.py diff --git a/integrated_channels/degreed2/migrations/0001_initial.py b/src/integrated_channels/degreed2/migrations/0001_initial.py similarity index 100% rename from integrated_channels/degreed2/migrations/0001_initial.py rename to src/integrated_channels/degreed2/migrations/0001_initial.py diff --git a/integrated_channels/degreed2/migrations/0002_auto_20211101_2021.py b/src/integrated_channels/degreed2/migrations/0002_auto_20211101_2021.py similarity index 100% rename from integrated_channels/degreed2/migrations/0002_auto_20211101_2021.py rename to src/integrated_channels/degreed2/migrations/0002_auto_20211101_2021.py diff --git a/integrated_channels/degreed2/migrations/0003_alter_degreed2enterprisecustomerconfiguration_enterprise_customer.py b/src/integrated_channels/degreed2/migrations/0003_alter_degreed2enterprisecustomerconfiguration_enterprise_customer.py similarity index 100% rename from integrated_channels/degreed2/migrations/0003_alter_degreed2enterprisecustomerconfiguration_enterprise_customer.py rename to src/integrated_channels/degreed2/migrations/0003_alter_degreed2enterprisecustomerconfiguration_enterprise_customer.py diff --git a/integrated_channels/degreed2/migrations/0004_auto_20220126_1837.py b/src/integrated_channels/degreed2/migrations/0004_auto_20220126_1837.py similarity index 100% rename from integrated_channels/degreed2/migrations/0004_auto_20220126_1837.py rename to src/integrated_channels/degreed2/migrations/0004_auto_20220126_1837.py diff --git a/integrated_channels/degreed2/migrations/0005_auto_20220131_1539.py b/src/integrated_channels/degreed2/migrations/0005_auto_20220131_1539.py similarity index 100% rename from integrated_channels/degreed2/migrations/0005_auto_20220131_1539.py rename to src/integrated_channels/degreed2/migrations/0005_auto_20220131_1539.py diff --git a/integrated_channels/degreed2/migrations/0006_auto_20220214_1627.py b/src/integrated_channels/degreed2/migrations/0006_auto_20220214_1627.py similarity index 100% rename from integrated_channels/degreed2/migrations/0006_auto_20220214_1627.py rename to src/integrated_channels/degreed2/migrations/0006_auto_20220214_1627.py diff --git a/integrated_channels/degreed2/migrations/0007_auto_20220302_2231.py b/src/integrated_channels/degreed2/migrations/0007_auto_20220302_2231.py similarity index 100% rename from integrated_channels/degreed2/migrations/0007_auto_20220302_2231.py rename to src/integrated_channels/degreed2/migrations/0007_auto_20220302_2231.py diff --git a/integrated_channels/degreed2/migrations/0008_degreed2learnerdatatransmissionaudit_course_completed.py b/src/integrated_channels/degreed2/migrations/0008_degreed2learnerdatatransmissionaudit_course_completed.py similarity index 100% rename from integrated_channels/degreed2/migrations/0008_degreed2learnerdatatransmissionaudit_course_completed.py rename to src/integrated_channels/degreed2/migrations/0008_degreed2learnerdatatransmissionaudit_course_completed.py diff --git a/integrated_channels/degreed2/migrations/0009_alter_degreed2learnerdatatransmissionaudit_completed_timestamp.py b/src/integrated_channels/degreed2/migrations/0009_alter_degreed2learnerdatatransmissionaudit_completed_timestamp.py similarity index 100% rename from integrated_channels/degreed2/migrations/0009_alter_degreed2learnerdatatransmissionaudit_completed_timestamp.py rename to src/integrated_channels/degreed2/migrations/0009_alter_degreed2learnerdatatransmissionaudit_completed_timestamp.py diff --git a/integrated_channels/degreed2/migrations/0010_auto_20220324_1550.py b/src/integrated_channels/degreed2/migrations/0010_auto_20220324_1550.py similarity index 100% rename from integrated_channels/degreed2/migrations/0010_auto_20220324_1550.py rename to src/integrated_channels/degreed2/migrations/0010_auto_20220324_1550.py diff --git a/integrated_channels/degreed2/migrations/0011_auto_20220325_1757.py b/src/integrated_channels/degreed2/migrations/0011_auto_20220325_1757.py similarity index 100% rename from integrated_channels/degreed2/migrations/0011_auto_20220325_1757.py rename to src/integrated_channels/degreed2/migrations/0011_auto_20220325_1757.py diff --git a/integrated_channels/degreed2/migrations/0012_auto_20220405_2311.py b/src/integrated_channels/degreed2/migrations/0012_auto_20220405_2311.py similarity index 100% rename from integrated_channels/degreed2/migrations/0012_auto_20220405_2311.py rename to src/integrated_channels/degreed2/migrations/0012_auto_20220405_2311.py diff --git a/integrated_channels/degreed2/migrations/0013_auto_20220523_1625.py b/src/integrated_channels/degreed2/migrations/0013_auto_20220523_1625.py similarity index 100% rename from integrated_channels/degreed2/migrations/0013_auto_20220523_1625.py rename to src/integrated_channels/degreed2/migrations/0013_auto_20220523_1625.py diff --git a/integrated_channels/degreed2/migrations/0014_degreed2learnerdatatransmissionaudit_friendly_status_message.py b/src/integrated_channels/degreed2/migrations/0014_degreed2learnerdatatransmissionaudit_friendly_status_message.py similarity index 100% rename from integrated_channels/degreed2/migrations/0014_degreed2learnerdatatransmissionaudit_friendly_status_message.py rename to src/integrated_channels/degreed2/migrations/0014_degreed2learnerdatatransmissionaudit_friendly_status_message.py diff --git a/integrated_channels/degreed2/migrations/0015_degreed2learnerdatatransmissionaudit_api_record.py b/src/integrated_channels/degreed2/migrations/0015_degreed2learnerdatatransmissionaudit_api_record.py similarity index 100% rename from integrated_channels/degreed2/migrations/0015_degreed2learnerdatatransmissionaudit_api_record.py rename to src/integrated_channels/degreed2/migrations/0015_degreed2learnerdatatransmissionaudit_api_record.py diff --git a/integrated_channels/degreed2/migrations/0016_auto_20221021_0159.py b/src/integrated_channels/degreed2/migrations/0016_auto_20221021_0159.py similarity index 100% rename from integrated_channels/degreed2/migrations/0016_auto_20221021_0159.py rename to src/integrated_channels/degreed2/migrations/0016_auto_20221021_0159.py diff --git a/integrated_channels/degreed2/migrations/0017_auto_20221031_1855.py b/src/integrated_channels/degreed2/migrations/0017_auto_20221031_1855.py similarity index 100% rename from integrated_channels/degreed2/migrations/0017_auto_20221031_1855.py rename to src/integrated_channels/degreed2/migrations/0017_auto_20221031_1855.py diff --git a/integrated_channels/degreed2/migrations/0018_move_and_recrete_completed_timestamp.py b/src/integrated_channels/degreed2/migrations/0018_move_and_recrete_completed_timestamp.py similarity index 100% rename from integrated_channels/degreed2/migrations/0018_move_and_recrete_completed_timestamp.py rename to src/integrated_channels/degreed2/migrations/0018_move_and_recrete_completed_timestamp.py diff --git a/integrated_channels/degreed2/migrations/0019_alter_degreed2learnerdatatransmissionaudit_index_together.py b/src/integrated_channels/degreed2/migrations/0019_alter_degreed2learnerdatatransmissionaudit_index_together.py similarity index 100% rename from integrated_channels/degreed2/migrations/0019_alter_degreed2learnerdatatransmissionaudit_index_together.py rename to src/integrated_channels/degreed2/migrations/0019_alter_degreed2learnerdatatransmissionaudit_index_together.py diff --git a/integrated_channels/degreed2/migrations/0020_auto_20230105_2122.py b/src/integrated_channels/degreed2/migrations/0020_auto_20230105_2122.py similarity index 100% rename from integrated_channels/degreed2/migrations/0020_auto_20230105_2122.py rename to src/integrated_channels/degreed2/migrations/0020_auto_20230105_2122.py diff --git a/integrated_channels/degreed2/migrations/0021_auto_20230112_2002.py b/src/integrated_channels/degreed2/migrations/0021_auto_20230112_2002.py similarity index 100% rename from integrated_channels/degreed2/migrations/0021_auto_20230112_2002.py rename to src/integrated_channels/degreed2/migrations/0021_auto_20230112_2002.py diff --git a/integrated_channels/degreed2/migrations/0022_auto_20230719_1621.py b/src/integrated_channels/degreed2/migrations/0022_auto_20230719_1621.py similarity index 100% rename from integrated_channels/degreed2/migrations/0022_auto_20230719_1621.py rename to src/integrated_channels/degreed2/migrations/0022_auto_20230719_1621.py diff --git a/integrated_channels/degreed2/migrations/0023_alter_historicaldegreed2enterprisecustomerconfiguration_options.py b/src/integrated_channels/degreed2/migrations/0023_alter_historicaldegreed2enterprisecustomerconfiguration_options.py similarity index 100% rename from integrated_channels/degreed2/migrations/0023_alter_historicaldegreed2enterprisecustomerconfiguration_options.py rename to src/integrated_channels/degreed2/migrations/0023_alter_historicaldegreed2enterprisecustomerconfiguration_options.py diff --git a/integrated_channels/degreed2/migrations/0024_degreed2learnerdatatransmissionaudit_degreed2_unique_enrollment_course_id.py b/src/integrated_channels/degreed2/migrations/0024_degreed2learnerdatatransmissionaudit_degreed2_unique_enrollment_course_id.py similarity index 100% rename from integrated_channels/degreed2/migrations/0024_degreed2learnerdatatransmissionaudit_degreed2_unique_enrollment_course_id.py rename to src/integrated_channels/degreed2/migrations/0024_degreed2learnerdatatransmissionaudit_degreed2_unique_enrollment_course_id.py diff --git a/integrated_channels/degreed2/migrations/0025_delete_historicaldegreed2enterprisecustomerconfiguration.py b/src/integrated_channels/degreed2/migrations/0025_delete_historicaldegreed2enterprisecustomerconfiguration.py similarity index 100% rename from integrated_channels/degreed2/migrations/0025_delete_historicaldegreed2enterprisecustomerconfiguration.py rename to src/integrated_channels/degreed2/migrations/0025_delete_historicaldegreed2enterprisecustomerconfiguration.py diff --git a/integrated_channels/degreed2/migrations/0026_auto_20240329_1537.py b/src/integrated_channels/degreed2/migrations/0026_auto_20240329_1537.py similarity index 100% rename from integrated_channels/degreed2/migrations/0026_auto_20240329_1537.py rename to src/integrated_channels/degreed2/migrations/0026_auto_20240329_1537.py diff --git a/integrated_channels/degreed2/migrations/0027_auto_20240329_1537.py b/src/integrated_channels/degreed2/migrations/0027_auto_20240329_1537.py similarity index 100% rename from integrated_channels/degreed2/migrations/0027_auto_20240329_1537.py rename to src/integrated_channels/degreed2/migrations/0027_auto_20240329_1537.py diff --git a/integrated_channels/degreed2/migrations/0028_auto_20240409_1147.py b/src/integrated_channels/degreed2/migrations/0028_auto_20240409_1147.py similarity index 100% rename from integrated_channels/degreed2/migrations/0028_auto_20240409_1147.py rename to src/integrated_channels/degreed2/migrations/0028_auto_20240409_1147.py diff --git a/integrated_channels/degreed2/migrations/0029_degreed2learnerdatatransmissionaudit_is_transmitted.py b/src/integrated_channels/degreed2/migrations/0029_degreed2learnerdatatransmissionaudit_is_transmitted.py similarity index 100% rename from integrated_channels/degreed2/migrations/0029_degreed2learnerdatatransmissionaudit_is_transmitted.py rename to src/integrated_channels/degreed2/migrations/0029_degreed2learnerdatatransmissionaudit_is_transmitted.py diff --git a/integrated_channels/degreed2/migrations/0030_rename_degreed2learnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_degreed.py b/src/integrated_channels/degreed2/migrations/0030_rename_degreed2learnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_degreed.py similarity index 100% rename from integrated_channels/degreed2/migrations/0030_rename_degreed2learnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_degreed.py rename to src/integrated_channels/degreed2/migrations/0030_rename_degreed2learnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_degreed.py diff --git a/integrated_channels/degreed2/migrations/__init__.py b/src/integrated_channels/degreed2/migrations/__init__.py similarity index 100% rename from integrated_channels/degreed2/migrations/__init__.py rename to src/integrated_channels/degreed2/migrations/__init__.py diff --git a/integrated_channels/degreed2/models.py b/src/integrated_channels/degreed2/models.py similarity index 100% rename from integrated_channels/degreed2/models.py rename to src/integrated_channels/degreed2/models.py diff --git a/integrated_channels/degreed2/transmitters/__init__.py b/src/integrated_channels/degreed2/transmitters/__init__.py similarity index 100% rename from integrated_channels/degreed2/transmitters/__init__.py rename to src/integrated_channels/degreed2/transmitters/__init__.py diff --git a/integrated_channels/degreed2/transmitters/content_metadata.py b/src/integrated_channels/degreed2/transmitters/content_metadata.py similarity index 100% rename from integrated_channels/degreed2/transmitters/content_metadata.py rename to src/integrated_channels/degreed2/transmitters/content_metadata.py diff --git a/integrated_channels/degreed2/transmitters/learner_data.py b/src/integrated_channels/degreed2/transmitters/learner_data.py similarity index 100% rename from integrated_channels/degreed2/transmitters/learner_data.py rename to src/integrated_channels/degreed2/transmitters/learner_data.py diff --git a/integrated_channels/exceptions.py b/src/integrated_channels/exceptions.py similarity index 100% rename from integrated_channels/exceptions.py rename to src/integrated_channels/exceptions.py diff --git a/integrated_channels/integrated_channel/__init__.py b/src/integrated_channels/integrated_channel/__init__.py similarity index 100% rename from integrated_channels/integrated_channel/__init__.py rename to src/integrated_channels/integrated_channel/__init__.py diff --git a/integrated_channels/integrated_channel/admin/__init__.py b/src/integrated_channels/integrated_channel/admin/__init__.py similarity index 100% rename from integrated_channels/integrated_channel/admin/__init__.py rename to src/integrated_channels/integrated_channel/admin/__init__.py diff --git a/integrated_channels/integrated_channel/apps.py b/src/integrated_channels/integrated_channel/apps.py similarity index 100% rename from integrated_channels/integrated_channel/apps.py rename to src/integrated_channels/integrated_channel/apps.py diff --git a/integrated_channels/integrated_channel/channel_settings.py b/src/integrated_channels/integrated_channel/channel_settings.py similarity index 100% rename from integrated_channels/integrated_channel/channel_settings.py rename to src/integrated_channels/integrated_channel/channel_settings.py diff --git a/integrated_channels/integrated_channel/client.py b/src/integrated_channels/integrated_channel/client.py similarity index 100% rename from integrated_channels/integrated_channel/client.py rename to src/integrated_channels/integrated_channel/client.py diff --git a/integrated_channels/integrated_channel/constants.py b/src/integrated_channels/integrated_channel/constants.py similarity index 100% rename from integrated_channels/integrated_channel/constants.py rename to src/integrated_channels/integrated_channel/constants.py diff --git a/integrated_channels/integrated_channel/exporters/__init__.py b/src/integrated_channels/integrated_channel/exporters/__init__.py similarity index 100% rename from integrated_channels/integrated_channel/exporters/__init__.py rename to src/integrated_channels/integrated_channel/exporters/__init__.py diff --git a/integrated_channels/integrated_channel/exporters/content_metadata.py b/src/integrated_channels/integrated_channel/exporters/content_metadata.py similarity index 100% rename from integrated_channels/integrated_channel/exporters/content_metadata.py rename to src/integrated_channels/integrated_channel/exporters/content_metadata.py diff --git a/integrated_channels/integrated_channel/exporters/learner_data.py b/src/integrated_channels/integrated_channel/exporters/learner_data.py similarity index 100% rename from integrated_channels/integrated_channel/exporters/learner_data.py rename to src/integrated_channels/integrated_channel/exporters/learner_data.py diff --git a/integrated_channels/integrated_channel/management/__init__.py b/src/integrated_channels/integrated_channel/management/__init__.py similarity index 100% rename from integrated_channels/integrated_channel/management/__init__.py rename to src/integrated_channels/integrated_channel/management/__init__.py diff --git a/integrated_channels/integrated_channel/management/commands/__init__.py b/src/integrated_channels/integrated_channel/management/commands/__init__.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/__init__.py rename to src/integrated_channels/integrated_channel/management/commands/__init__.py diff --git a/integrated_channels/integrated_channel/management/commands/assign_skills_to_degreed_courses.py b/src/integrated_channels/integrated_channel/management/commands/assign_skills_to_degreed_courses.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/assign_skills_to_degreed_courses.py rename to src/integrated_channels/integrated_channel/management/commands/assign_skills_to_degreed_courses.py diff --git a/integrated_channels/integrated_channel/management/commands/backfill_course_end_dates.py b/src/integrated_channels/integrated_channel/management/commands/backfill_course_end_dates.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/backfill_course_end_dates.py rename to src/integrated_channels/integrated_channel/management/commands/backfill_course_end_dates.py diff --git a/integrated_channels/integrated_channel/management/commands/backfill_missing_csod_foreign_keys.py b/src/integrated_channels/integrated_channel/management/commands/backfill_missing_csod_foreign_keys.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/backfill_missing_csod_foreign_keys.py rename to src/integrated_channels/integrated_channel/management/commands/backfill_missing_csod_foreign_keys.py diff --git a/integrated_channels/integrated_channel/management/commands/backfill_missing_foreign_keys.py b/src/integrated_channels/integrated_channel/management/commands/backfill_missing_foreign_keys.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/backfill_missing_foreign_keys.py rename to src/integrated_channels/integrated_channel/management/commands/backfill_missing_foreign_keys.py diff --git a/integrated_channels/integrated_channel/management/commands/backfill_remote_action_timestamps.py b/src/integrated_channels/integrated_channel/management/commands/backfill_remote_action_timestamps.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/backfill_remote_action_timestamps.py rename to src/integrated_channels/integrated_channel/management/commands/backfill_remote_action_timestamps.py diff --git a/integrated_channels/integrated_channel/management/commands/cleanup_duplicate_assignment_records.py b/src/integrated_channels/integrated_channel/management/commands/cleanup_duplicate_assignment_records.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/cleanup_duplicate_assignment_records.py rename to src/integrated_channels/integrated_channel/management/commands/cleanup_duplicate_assignment_records.py diff --git a/integrated_channels/integrated_channel/management/commands/mark_learner_transmissions_transmitted_true.py b/src/integrated_channels/integrated_channel/management/commands/mark_learner_transmissions_transmitted_true.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/mark_learner_transmissions_transmitted_true.py rename to src/integrated_channels/integrated_channel/management/commands/mark_learner_transmissions_transmitted_true.py diff --git a/integrated_channels/integrated_channel/management/commands/mark_orphaned_content_metadata_audits.py b/src/integrated_channels/integrated_channel/management/commands/mark_orphaned_content_metadata_audits.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/mark_orphaned_content_metadata_audits.py rename to src/integrated_channels/integrated_channel/management/commands/mark_orphaned_content_metadata_audits.py diff --git a/integrated_channels/integrated_channel/management/commands/remove_duplicate_learner_transmission_audit_records.py b/src/integrated_channels/integrated_channel/management/commands/remove_duplicate_learner_transmission_audit_records.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/remove_duplicate_learner_transmission_audit_records.py rename to src/integrated_channels/integrated_channel/management/commands/remove_duplicate_learner_transmission_audit_records.py diff --git a/integrated_channels/integrated_channel/management/commands/remove_null_catalog_transmission_audits.py b/src/integrated_channels/integrated_channel/management/commands/remove_null_catalog_transmission_audits.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/remove_null_catalog_transmission_audits.py rename to src/integrated_channels/integrated_channel/management/commands/remove_null_catalog_transmission_audits.py diff --git a/integrated_channels/integrated_channel/management/commands/remove_stale_integrated_channel_api_logs.py b/src/integrated_channels/integrated_channel/management/commands/remove_stale_integrated_channel_api_logs.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/remove_stale_integrated_channel_api_logs.py rename to src/integrated_channels/integrated_channel/management/commands/remove_stale_integrated_channel_api_logs.py diff --git a/integrated_channels/integrated_channel/management/commands/reset_csod_remote_deleted_at.py b/src/integrated_channels/integrated_channel/management/commands/reset_csod_remote_deleted_at.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/reset_csod_remote_deleted_at.py rename to src/integrated_channels/integrated_channel/management/commands/reset_csod_remote_deleted_at.py diff --git a/integrated_channels/integrated_channel/management/commands/reset_sapsf_learner_transmissions.py b/src/integrated_channels/integrated_channel/management/commands/reset_sapsf_learner_transmissions.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/reset_sapsf_learner_transmissions.py rename to src/integrated_channels/integrated_channel/management/commands/reset_sapsf_learner_transmissions.py diff --git a/integrated_channels/integrated_channel/management/commands/transmit_content_metadata.py b/src/integrated_channels/integrated_channel/management/commands/transmit_content_metadata.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/transmit_content_metadata.py rename to src/integrated_channels/integrated_channel/management/commands/transmit_content_metadata.py diff --git a/integrated_channels/integrated_channel/management/commands/transmit_learner_data.py b/src/integrated_channels/integrated_channel/management/commands/transmit_learner_data.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/transmit_learner_data.py rename to src/integrated_channels/integrated_channel/management/commands/transmit_learner_data.py diff --git a/integrated_channels/integrated_channel/management/commands/transmit_subsection_learner_data.py b/src/integrated_channels/integrated_channel/management/commands/transmit_subsection_learner_data.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/transmit_subsection_learner_data.py rename to src/integrated_channels/integrated_channel/management/commands/transmit_subsection_learner_data.py diff --git a/integrated_channels/integrated_channel/management/commands/unlink_inactive_sap_learners.py b/src/integrated_channels/integrated_channel/management/commands/unlink_inactive_sap_learners.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/unlink_inactive_sap_learners.py rename to src/integrated_channels/integrated_channel/management/commands/unlink_inactive_sap_learners.py diff --git a/integrated_channels/integrated_channel/management/commands/update_content_transmission_catalogs.py b/src/integrated_channels/integrated_channel/management/commands/update_content_transmission_catalogs.py similarity index 100% rename from integrated_channels/integrated_channel/management/commands/update_content_transmission_catalogs.py rename to src/integrated_channels/integrated_channel/management/commands/update_content_transmission_catalogs.py diff --git a/integrated_channels/integrated_channel/migrations/0001_squashed_0007_auto_20190925_0730.py b/src/integrated_channels/integrated_channel/migrations/0001_squashed_0007_auto_20190925_0730.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0001_squashed_0007_auto_20190925_0730.py rename to src/integrated_channels/integrated_channel/migrations/0001_squashed_0007_auto_20190925_0730.py diff --git a/integrated_channels/integrated_channel/migrations/0002_learnerdatatransmissionaudit_subsection_id.py b/src/integrated_channels/integrated_channel/migrations/0002_learnerdatatransmissionaudit_subsection_id.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0002_learnerdatatransmissionaudit_subsection_id.py rename to src/integrated_channels/integrated_channel/migrations/0002_learnerdatatransmissionaudit_subsection_id.py diff --git a/integrated_channels/integrated_channel/migrations/0003_contentmetadataitemtransmission_content_last_changed.py b/src/integrated_channels/integrated_channel/migrations/0003_contentmetadataitemtransmission_content_last_changed.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0003_contentmetadataitemtransmission_content_last_changed.py rename to src/integrated_channels/integrated_channel/migrations/0003_contentmetadataitemtransmission_content_last_changed.py diff --git a/integrated_channels/integrated_channel/migrations/0004_contentmetadataitemtransmission_enterprise_customer_catalog_uuid.py b/src/integrated_channels/integrated_channel/migrations/0004_contentmetadataitemtransmission_enterprise_customer_catalog_uuid.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0004_contentmetadataitemtransmission_enterprise_customer_catalog_uuid.py rename to src/integrated_channels/integrated_channel/migrations/0004_contentmetadataitemtransmission_enterprise_customer_catalog_uuid.py diff --git a/integrated_channels/integrated_channel/migrations/0005_auto_20211005_1052.py b/src/integrated_channels/integrated_channel/migrations/0005_auto_20211005_1052.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0005_auto_20211005_1052.py rename to src/integrated_channels/integrated_channel/migrations/0005_auto_20211005_1052.py diff --git a/integrated_channels/integrated_channel/migrations/0006_contentmetadataitemtransmission_deleted_at.py b/src/integrated_channels/integrated_channel/migrations/0006_contentmetadataitemtransmission_deleted_at.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0006_contentmetadataitemtransmission_deleted_at.py rename to src/integrated_channels/integrated_channel/migrations/0006_contentmetadataitemtransmission_deleted_at.py diff --git a/integrated_channels/integrated_channel/migrations/0007_delete_learnerdatatransmissionaudit.py b/src/integrated_channels/integrated_channel/migrations/0007_delete_learnerdatatransmissionaudit.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0007_delete_learnerdatatransmissionaudit.py rename to src/integrated_channels/integrated_channel/migrations/0007_delete_learnerdatatransmissionaudit.py diff --git a/integrated_channels/integrated_channel/migrations/0008_genericlearnerdatatransmissionaudit.py b/src/integrated_channels/integrated_channel/migrations/0008_genericlearnerdatatransmissionaudit.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0008_genericlearnerdatatransmissionaudit.py rename to src/integrated_channels/integrated_channel/migrations/0008_genericlearnerdatatransmissionaudit.py diff --git a/integrated_channels/integrated_channel/migrations/0009_auto_20220325_1757.py b/src/integrated_channels/integrated_channel/migrations/0009_auto_20220325_1757.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0009_auto_20220325_1757.py rename to src/integrated_channels/integrated_channel/migrations/0009_auto_20220325_1757.py diff --git a/integrated_channels/integrated_channel/migrations/0010_genericenterprisecustomerpluginconfiguration.py b/src/integrated_channels/integrated_channel/migrations/0010_genericenterprisecustomerpluginconfiguration.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0010_genericenterprisecustomerpluginconfiguration.py rename to src/integrated_channels/integrated_channel/migrations/0010_genericenterprisecustomerpluginconfiguration.py diff --git a/integrated_channels/integrated_channel/migrations/0011_contentmetadataitemtransmission_plugin_configuration_id.py b/src/integrated_channels/integrated_channel/migrations/0011_contentmetadataitemtransmission_plugin_configuration_id.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0011_contentmetadataitemtransmission_plugin_configuration_id.py rename to src/integrated_channels/integrated_channel/migrations/0011_contentmetadataitemtransmission_plugin_configuration_id.py diff --git a/integrated_channels/integrated_channel/migrations/0012_alter_contentmetadataitemtransmission_unique_together.py b/src/integrated_channels/integrated_channel/migrations/0012_alter_contentmetadataitemtransmission_unique_together.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0012_alter_contentmetadataitemtransmission_unique_together.py rename to src/integrated_channels/integrated_channel/migrations/0012_alter_contentmetadataitemtransmission_unique_together.py diff --git a/integrated_channels/integrated_channel/migrations/0013_auto_20220405_2311.py b/src/integrated_channels/integrated_channel/migrations/0013_auto_20220405_2311.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0013_auto_20220405_2311.py rename to src/integrated_channels/integrated_channel/migrations/0013_auto_20220405_2311.py diff --git a/integrated_channels/integrated_channel/migrations/0014_genericenterprisecustomerpluginconfiguration_dry_run_mode_enabled.py b/src/integrated_channels/integrated_channel/migrations/0014_genericenterprisecustomerpluginconfiguration_dry_run_mode_enabled.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0014_genericenterprisecustomerpluginconfiguration_dry_run_mode_enabled.py rename to src/integrated_channels/integrated_channel/migrations/0014_genericenterprisecustomerpluginconfiguration_dry_run_mode_enabled.py diff --git a/integrated_channels/integrated_channel/migrations/0015_auto_20220718_2113.py b/src/integrated_channels/integrated_channel/migrations/0015_auto_20220718_2113.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0015_auto_20220718_2113.py rename to src/integrated_channels/integrated_channel/migrations/0015_auto_20220718_2113.py diff --git a/integrated_channels/integrated_channel/migrations/0016_contentmetadataitemtransmission_content_title.py b/src/integrated_channels/integrated_channel/migrations/0016_contentmetadataitemtransmission_content_title.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0016_contentmetadataitemtransmission_content_title.py rename to src/integrated_channels/integrated_channel/migrations/0016_contentmetadataitemtransmission_content_title.py diff --git a/integrated_channels/integrated_channel/migrations/0016_contentmetadataitemtransmission_marked_for.py b/src/integrated_channels/integrated_channel/migrations/0016_contentmetadataitemtransmission_marked_for.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0016_contentmetadataitemtransmission_marked_for.py rename to src/integrated_channels/integrated_channel/migrations/0016_contentmetadataitemtransmission_marked_for.py diff --git a/integrated_channels/integrated_channel/migrations/0017_contentmetadataitemtransmission_friendly_status_message.py b/src/integrated_channels/integrated_channel/migrations/0017_contentmetadataitemtransmission_friendly_status_message.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0017_contentmetadataitemtransmission_friendly_status_message.py rename to src/integrated_channels/integrated_channel/migrations/0017_contentmetadataitemtransmission_friendly_status_message.py diff --git a/integrated_channels/integrated_channel/migrations/0018_genericlearnerdatatransmissionaudit_friendly_status_message.py b/src/integrated_channels/integrated_channel/migrations/0018_genericlearnerdatatransmissionaudit_friendly_status_message.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0018_genericlearnerdatatransmissionaudit_friendly_status_message.py rename to src/integrated_channels/integrated_channel/migrations/0018_genericlearnerdatatransmissionaudit_friendly_status_message.py diff --git a/integrated_channels/integrated_channel/migrations/0019_merge_20220928_1842.py b/src/integrated_channels/integrated_channel/migrations/0019_merge_20220928_1842.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0019_merge_20220928_1842.py rename to src/integrated_channels/integrated_channel/migrations/0019_merge_20220928_1842.py diff --git a/integrated_channels/integrated_channel/migrations/0020_auto_20220929_1712.py b/src/integrated_channels/integrated_channel/migrations/0020_auto_20220929_1712.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0020_auto_20220929_1712.py rename to src/integrated_channels/integrated_channel/migrations/0020_auto_20220929_1712.py diff --git a/integrated_channels/integrated_channel/migrations/0021_remove_contentmetadataitemtransmission_api_response_body.py b/src/integrated_channels/integrated_channel/migrations/0021_remove_contentmetadataitemtransmission_api_response_body.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0021_remove_contentmetadataitemtransmission_api_response_body.py rename to src/integrated_channels/integrated_channel/migrations/0021_remove_contentmetadataitemtransmission_api_response_body.py diff --git a/integrated_channels/integrated_channel/migrations/0022_alter_contentmetadataitemtransmission_index_together.py b/src/integrated_channels/integrated_channel/migrations/0022_alter_contentmetadataitemtransmission_index_together.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0022_alter_contentmetadataitemtransmission_index_together.py rename to src/integrated_channels/integrated_channel/migrations/0022_alter_contentmetadataitemtransmission_index_together.py diff --git a/integrated_channels/integrated_channel/migrations/0023_auto_20221021_0159.py b/src/integrated_channels/integrated_channel/migrations/0023_auto_20221021_0159.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0023_auto_20221021_0159.py rename to src/integrated_channels/integrated_channel/migrations/0023_auto_20221021_0159.py diff --git a/integrated_channels/integrated_channel/migrations/0024_genericenterprisecustomerpluginconfiguration_deleted_at.py b/src/integrated_channels/integrated_channel/migrations/0024_genericenterprisecustomerpluginconfiguration_deleted_at.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0024_genericenterprisecustomerpluginconfiguration_deleted_at.py rename to src/integrated_channels/integrated_channel/migrations/0024_genericenterprisecustomerpluginconfiguration_deleted_at.py diff --git a/integrated_channels/integrated_channel/migrations/0025_auto_20230105_2122.py b/src/integrated_channels/integrated_channel/migrations/0025_auto_20230105_2122.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0025_auto_20230105_2122.py rename to src/integrated_channels/integrated_channel/migrations/0025_auto_20230105_2122.py diff --git a/integrated_channels/integrated_channel/migrations/0026_genericenterprisecustomerpluginconfiguration_last_modified_at.py b/src/integrated_channels/integrated_channel/migrations/0026_genericenterprisecustomerpluginconfiguration_last_modified_at.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0026_genericenterprisecustomerpluginconfiguration_last_modified_at.py rename to src/integrated_channels/integrated_channel/migrations/0026_genericenterprisecustomerpluginconfiguration_last_modified_at.py diff --git a/integrated_channels/integrated_channel/migrations/0027_orphanedcontenttransmissions.py b/src/integrated_channels/integrated_channel/migrations/0027_orphanedcontenttransmissions.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0027_orphanedcontenttransmissions.py rename to src/integrated_channels/integrated_channel/migrations/0027_orphanedcontenttransmissions.py diff --git a/integrated_channels/integrated_channel/migrations/0028_alter_contentmetadataitemtransmission_unique_together.py b/src/integrated_channels/integrated_channel/migrations/0028_alter_contentmetadataitemtransmission_unique_together.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0028_alter_contentmetadataitemtransmission_unique_together.py rename to src/integrated_channels/integrated_channel/migrations/0028_alter_contentmetadataitemtransmission_unique_together.py diff --git a/integrated_channels/integrated_channel/migrations/0029_genericenterprisecustomerpluginconfiguration_show_course_price.py b/src/integrated_channels/integrated_channel/migrations/0029_genericenterprisecustomerpluginconfiguration_show_course_price.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0029_genericenterprisecustomerpluginconfiguration_show_course_price.py rename to src/integrated_channels/integrated_channel/migrations/0029_genericenterprisecustomerpluginconfiguration_show_course_price.py diff --git a/integrated_channels/integrated_channel/migrations/0030_integratedchannelapirequestlogs.py b/src/integrated_channels/integrated_channel/migrations/0030_integratedchannelapirequestlogs.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0030_integratedchannelapirequestlogs.py rename to src/integrated_channels/integrated_channel/migrations/0030_integratedchannelapirequestlogs.py diff --git a/integrated_channels/integrated_channel/migrations/0031_alter_integratedchannelapirequestlogs_options.py b/src/integrated_channels/integrated_channel/migrations/0031_alter_integratedchannelapirequestlogs_options.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0031_alter_integratedchannelapirequestlogs_options.py rename to src/integrated_channels/integrated_channel/migrations/0031_alter_integratedchannelapirequestlogs_options.py diff --git a/integrated_channels/integrated_channel/migrations/0032_alter_integratedchannelapirequestlogs_endpoint.py b/src/integrated_channels/integrated_channel/migrations/0032_alter_integratedchannelapirequestlogs_endpoint.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0032_alter_integratedchannelapirequestlogs_endpoint.py rename to src/integrated_channels/integrated_channel/migrations/0032_alter_integratedchannelapirequestlogs_endpoint.py diff --git a/integrated_channels/integrated_channel/migrations/0033_integratedchannelapirequestlogs_channel_name.py b/src/integrated_channels/integrated_channel/migrations/0033_integratedchannelapirequestlogs_channel_name.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0033_integratedchannelapirequestlogs_channel_name.py rename to src/integrated_channels/integrated_channel/migrations/0033_integratedchannelapirequestlogs_channel_name.py diff --git a/integrated_channels/integrated_channel/migrations/0034_contentmetadataitemtransmission_remote_errored_at.py b/src/integrated_channels/integrated_channel/migrations/0034_contentmetadataitemtransmission_remote_errored_at.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0034_contentmetadataitemtransmission_remote_errored_at.py rename to src/integrated_channels/integrated_channel/migrations/0034_contentmetadataitemtransmission_remote_errored_at.py diff --git a/integrated_channels/integrated_channel/migrations/0035_genericlearnerdatatransmissionaudit_is_transmitted.py b/src/integrated_channels/integrated_channel/migrations/0035_genericlearnerdatatransmissionaudit_is_transmitted.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0035_genericlearnerdatatransmissionaudit_is_transmitted.py rename to src/integrated_channels/integrated_channel/migrations/0035_genericlearnerdatatransmissionaudit_is_transmitted.py diff --git a/integrated_channels/integrated_channel/migrations/0036_rename_contentmetadataitemtransmission_enterprise_customer_integrated_channel_code_plugin_configurat.py b/src/integrated_channels/integrated_channel/migrations/0036_rename_contentmetadataitemtransmission_enterprise_customer_integrated_channel_code_plugin_configurat.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0036_rename_contentmetadataitemtransmission_enterprise_customer_integrated_channel_code_plugin_configurat.py rename to src/integrated_channels/integrated_channel/migrations/0036_rename_contentmetadataitemtransmission_enterprise_customer_integrated_channel_code_plugin_configurat.py diff --git a/integrated_channels/integrated_channel/migrations/0037_mariadb_uuid_conversion.py b/src/integrated_channels/integrated_channel/migrations/0037_mariadb_uuid_conversion.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/0037_mariadb_uuid_conversion.py rename to src/integrated_channels/integrated_channel/migrations/0037_mariadb_uuid_conversion.py diff --git a/integrated_channels/integrated_channel/migrations/__init__.py b/src/integrated_channels/integrated_channel/migrations/__init__.py similarity index 100% rename from integrated_channels/integrated_channel/migrations/__init__.py rename to src/integrated_channels/integrated_channel/migrations/__init__.py diff --git a/integrated_channels/integrated_channel/models.py b/src/integrated_channels/integrated_channel/models.py similarity index 100% rename from integrated_channels/integrated_channel/models.py rename to src/integrated_channels/integrated_channel/models.py diff --git a/integrated_channels/integrated_channel/signals.py b/src/integrated_channels/integrated_channel/signals.py similarity index 100% rename from integrated_channels/integrated_channel/signals.py rename to src/integrated_channels/integrated_channel/signals.py diff --git a/integrated_channels/integrated_channel/tasks.py b/src/integrated_channels/integrated_channel/tasks.py similarity index 100% rename from integrated_channels/integrated_channel/tasks.py rename to src/integrated_channels/integrated_channel/tasks.py diff --git a/integrated_channels/integrated_channel/transmitters/__init__.py b/src/integrated_channels/integrated_channel/transmitters/__init__.py similarity index 100% rename from integrated_channels/integrated_channel/transmitters/__init__.py rename to src/integrated_channels/integrated_channel/transmitters/__init__.py diff --git a/integrated_channels/integrated_channel/transmitters/content_metadata.py b/src/integrated_channels/integrated_channel/transmitters/content_metadata.py similarity index 100% rename from integrated_channels/integrated_channel/transmitters/content_metadata.py rename to src/integrated_channels/integrated_channel/transmitters/content_metadata.py diff --git a/integrated_channels/integrated_channel/transmitters/learner_data.py b/src/integrated_channels/integrated_channel/transmitters/learner_data.py similarity index 100% rename from integrated_channels/integrated_channel/transmitters/learner_data.py rename to src/integrated_channels/integrated_channel/transmitters/learner_data.py diff --git a/integrated_channels/lms_utils.py b/src/integrated_channels/lms_utils.py similarity index 100% rename from integrated_channels/lms_utils.py rename to src/integrated_channels/lms_utils.py diff --git a/integrated_channels/moodle/__init__.py b/src/integrated_channels/moodle/__init__.py similarity index 100% rename from integrated_channels/moodle/__init__.py rename to src/integrated_channels/moodle/__init__.py diff --git a/integrated_channels/moodle/admin/__init__.py b/src/integrated_channels/moodle/admin/__init__.py similarity index 100% rename from integrated_channels/moodle/admin/__init__.py rename to src/integrated_channels/moodle/admin/__init__.py diff --git a/integrated_channels/moodle/apps.py b/src/integrated_channels/moodle/apps.py similarity index 100% rename from integrated_channels/moodle/apps.py rename to src/integrated_channels/moodle/apps.py diff --git a/integrated_channels/moodle/client.py b/src/integrated_channels/moodle/client.py similarity index 100% rename from integrated_channels/moodle/client.py rename to src/integrated_channels/moodle/client.py diff --git a/integrated_channels/moodle/exporters/__init__.py b/src/integrated_channels/moodle/exporters/__init__.py similarity index 100% rename from integrated_channels/moodle/exporters/__init__.py rename to src/integrated_channels/moodle/exporters/__init__.py diff --git a/integrated_channels/moodle/exporters/content_metadata.py b/src/integrated_channels/moodle/exporters/content_metadata.py similarity index 100% rename from integrated_channels/moodle/exporters/content_metadata.py rename to src/integrated_channels/moodle/exporters/content_metadata.py diff --git a/integrated_channels/moodle/exporters/learner_data.py b/src/integrated_channels/moodle/exporters/learner_data.py similarity index 100% rename from integrated_channels/moodle/exporters/learner_data.py rename to src/integrated_channels/moodle/exporters/learner_data.py diff --git a/integrated_channels/moodle/migrations/0001_initial.py b/src/integrated_channels/moodle/migrations/0001_initial.py similarity index 100% rename from integrated_channels/moodle/migrations/0001_initial.py rename to src/integrated_channels/moodle/migrations/0001_initial.py diff --git a/integrated_channels/moodle/migrations/0002_moodlelearnerdatatransmissionaudit.py b/src/integrated_channels/moodle/migrations/0002_moodlelearnerdatatransmissionaudit.py similarity index 100% rename from integrated_channels/moodle/migrations/0002_moodlelearnerdatatransmissionaudit.py rename to src/integrated_channels/moodle/migrations/0002_moodlelearnerdatatransmissionaudit.py diff --git a/integrated_channels/moodle/migrations/0003_auto_20201006_1706.py b/src/integrated_channels/moodle/migrations/0003_auto_20201006_1706.py similarity index 100% rename from integrated_channels/moodle/migrations/0003_auto_20201006_1706.py rename to src/integrated_channels/moodle/migrations/0003_auto_20201006_1706.py diff --git a/integrated_channels/moodle/migrations/0004_auto_20201105_1921.py b/src/integrated_channels/moodle/migrations/0004_auto_20201105_1921.py similarity index 100% rename from integrated_channels/moodle/migrations/0004_auto_20201105_1921.py rename to src/integrated_channels/moodle/migrations/0004_auto_20201105_1921.py diff --git a/integrated_channels/moodle/migrations/0005_auto_20210708_1446.py b/src/integrated_channels/moodle/migrations/0005_auto_20210708_1446.py similarity index 100% rename from integrated_channels/moodle/migrations/0005_auto_20210708_1446.py rename to src/integrated_channels/moodle/migrations/0005_auto_20210708_1446.py diff --git a/integrated_channels/moodle/migrations/0006_auto_20210909_1536.py b/src/integrated_channels/moodle/migrations/0006_auto_20210909_1536.py similarity index 100% rename from integrated_channels/moodle/migrations/0006_auto_20210909_1536.py rename to src/integrated_channels/moodle/migrations/0006_auto_20210909_1536.py diff --git a/integrated_channels/moodle/migrations/0007_auto_20210923_1727.py b/src/integrated_channels/moodle/migrations/0007_auto_20210923_1727.py similarity index 100% rename from integrated_channels/moodle/migrations/0007_auto_20210923_1727.py rename to src/integrated_channels/moodle/migrations/0007_auto_20210923_1727.py diff --git a/integrated_channels/moodle/migrations/0008_alter_moodleenterprisecustomerconfiguration_enterprise_customer.py b/src/integrated_channels/moodle/migrations/0008_alter_moodleenterprisecustomerconfiguration_enterprise_customer.py similarity index 100% rename from integrated_channels/moodle/migrations/0008_alter_moodleenterprisecustomerconfiguration_enterprise_customer.py rename to src/integrated_channels/moodle/migrations/0008_alter_moodleenterprisecustomerconfiguration_enterprise_customer.py diff --git a/integrated_channels/moodle/migrations/0009_auto_20220126_1837.py b/src/integrated_channels/moodle/migrations/0009_auto_20220126_1837.py similarity index 100% rename from integrated_channels/moodle/migrations/0009_auto_20220126_1837.py rename to src/integrated_channels/moodle/migrations/0009_auto_20220126_1837.py diff --git a/integrated_channels/moodle/migrations/0010_auto_20220131_1539.py b/src/integrated_channels/moodle/migrations/0010_auto_20220131_1539.py similarity index 100% rename from integrated_channels/moodle/migrations/0010_auto_20220131_1539.py rename to src/integrated_channels/moodle/migrations/0010_auto_20220131_1539.py diff --git a/integrated_channels/moodle/migrations/0011_auto_20220302_2231.py b/src/integrated_channels/moodle/migrations/0011_auto_20220302_2231.py similarity index 100% rename from integrated_channels/moodle/migrations/0011_auto_20220302_2231.py rename to src/integrated_channels/moodle/migrations/0011_auto_20220302_2231.py diff --git a/integrated_channels/moodle/migrations/0012_alter_moodlelearnerdatatransmissionaudit_completed_timestamp.py b/src/integrated_channels/moodle/migrations/0012_alter_moodlelearnerdatatransmissionaudit_completed_timestamp.py similarity index 100% rename from integrated_channels/moodle/migrations/0012_alter_moodlelearnerdatatransmissionaudit_completed_timestamp.py rename to src/integrated_channels/moodle/migrations/0012_alter_moodlelearnerdatatransmissionaudit_completed_timestamp.py diff --git a/integrated_channels/moodle/migrations/0013_auto_20220324_1550.py b/src/integrated_channels/moodle/migrations/0013_auto_20220324_1550.py similarity index 100% rename from integrated_channels/moodle/migrations/0013_auto_20220324_1550.py rename to src/integrated_channels/moodle/migrations/0013_auto_20220324_1550.py diff --git a/integrated_channels/moodle/migrations/0014_auto_20220325_1757.py b/src/integrated_channels/moodle/migrations/0014_auto_20220325_1757.py similarity index 100% rename from integrated_channels/moodle/migrations/0014_auto_20220325_1757.py rename to src/integrated_channels/moodle/migrations/0014_auto_20220325_1757.py diff --git a/integrated_channels/moodle/migrations/0015_auto_20220405_2311.py b/src/integrated_channels/moodle/migrations/0015_auto_20220405_2311.py similarity index 100% rename from integrated_channels/moodle/migrations/0015_auto_20220405_2311.py rename to src/integrated_channels/moodle/migrations/0015_auto_20220405_2311.py diff --git a/integrated_channels/moodle/migrations/0016_auto_20220523_1625.py b/src/integrated_channels/moodle/migrations/0016_auto_20220523_1625.py similarity index 100% rename from integrated_channels/moodle/migrations/0016_auto_20220523_1625.py rename to src/integrated_channels/moodle/migrations/0016_auto_20220523_1625.py diff --git a/integrated_channels/moodle/migrations/0017_moodlelearnerdatatransmissionaudit_friendly_status_message.py b/src/integrated_channels/moodle/migrations/0017_moodlelearnerdatatransmissionaudit_friendly_status_message.py similarity index 100% rename from integrated_channels/moodle/migrations/0017_moodlelearnerdatatransmissionaudit_friendly_status_message.py rename to src/integrated_channels/moodle/migrations/0017_moodlelearnerdatatransmissionaudit_friendly_status_message.py diff --git a/integrated_channels/moodle/migrations/0018_moodlelearnerdatatransmissionaudit_api_record.py b/src/integrated_channels/moodle/migrations/0018_moodlelearnerdatatransmissionaudit_api_record.py similarity index 100% rename from integrated_channels/moodle/migrations/0018_moodlelearnerdatatransmissionaudit_api_record.py rename to src/integrated_channels/moodle/migrations/0018_moodlelearnerdatatransmissionaudit_api_record.py diff --git a/integrated_channels/moodle/migrations/0019_auto_20221021_0159.py b/src/integrated_channels/moodle/migrations/0019_auto_20221021_0159.py similarity index 100% rename from integrated_channels/moodle/migrations/0019_auto_20221021_0159.py rename to src/integrated_channels/moodle/migrations/0019_auto_20221021_0159.py diff --git a/integrated_channels/moodle/migrations/0020_auto_20221031_1855.py b/src/integrated_channels/moodle/migrations/0020_auto_20221031_1855.py similarity index 100% rename from integrated_channels/moodle/migrations/0020_auto_20221031_1855.py rename to src/integrated_channels/moodle/migrations/0020_auto_20221031_1855.py diff --git a/integrated_channels/moodle/migrations/0021_move_and_recrete_completed_timestamp.py b/src/integrated_channels/moodle/migrations/0021_move_and_recrete_completed_timestamp.py similarity index 100% rename from integrated_channels/moodle/migrations/0021_move_and_recrete_completed_timestamp.py rename to src/integrated_channels/moodle/migrations/0021_move_and_recrete_completed_timestamp.py diff --git a/integrated_channels/moodle/migrations/0022_auto_20221220_1527.py b/src/integrated_channels/moodle/migrations/0022_auto_20221220_1527.py similarity index 100% rename from integrated_channels/moodle/migrations/0022_auto_20221220_1527.py rename to src/integrated_channels/moodle/migrations/0022_auto_20221220_1527.py diff --git a/integrated_channels/moodle/migrations/0023_alter_moodlelearnerdatatransmissionaudit_index_together.py b/src/integrated_channels/moodle/migrations/0023_alter_moodlelearnerdatatransmissionaudit_index_together.py similarity index 100% rename from integrated_channels/moodle/migrations/0023_alter_moodlelearnerdatatransmissionaudit_index_together.py rename to src/integrated_channels/moodle/migrations/0023_alter_moodlelearnerdatatransmissionaudit_index_together.py diff --git a/integrated_channels/moodle/migrations/0024_auto_20230105_2122.py b/src/integrated_channels/moodle/migrations/0024_auto_20230105_2122.py similarity index 100% rename from integrated_channels/moodle/migrations/0024_auto_20230105_2122.py rename to src/integrated_channels/moodle/migrations/0024_auto_20230105_2122.py diff --git a/integrated_channels/moodle/migrations/0025_auto_20230112_2002.py b/src/integrated_channels/moodle/migrations/0025_auto_20230112_2002.py similarity index 100% rename from integrated_channels/moodle/migrations/0025_auto_20230112_2002.py rename to src/integrated_channels/moodle/migrations/0025_auto_20230112_2002.py diff --git a/integrated_channels/moodle/migrations/0026_auto_20230719_1621.py b/src/integrated_channels/moodle/migrations/0026_auto_20230719_1621.py similarity index 100% rename from integrated_channels/moodle/migrations/0026_auto_20230719_1621.py rename to src/integrated_channels/moodle/migrations/0026_auto_20230719_1621.py diff --git a/integrated_channels/moodle/migrations/0027_alter_historicalmoodleenterprisecustomerconfiguration_options.py b/src/integrated_channels/moodle/migrations/0027_alter_historicalmoodleenterprisecustomerconfiguration_options.py similarity index 100% rename from integrated_channels/moodle/migrations/0027_alter_historicalmoodleenterprisecustomerconfiguration_options.py rename to src/integrated_channels/moodle/migrations/0027_alter_historicalmoodleenterprisecustomerconfiguration_options.py diff --git a/integrated_channels/moodle/migrations/0028_auto_20230928_1530.py b/src/integrated_channels/moodle/migrations/0028_auto_20230928_1530.py similarity index 100% rename from integrated_channels/moodle/migrations/0028_auto_20230928_1530.py rename to src/integrated_channels/moodle/migrations/0028_auto_20230928_1530.py diff --git a/integrated_channels/moodle/migrations/0028_auto_20231116_1826.py b/src/integrated_channels/moodle/migrations/0028_auto_20231116_1826.py similarity index 100% rename from integrated_channels/moodle/migrations/0028_auto_20231116_1826.py rename to src/integrated_channels/moodle/migrations/0028_auto_20231116_1826.py diff --git a/integrated_channels/moodle/migrations/0029_auto_20231106_1233.py b/src/integrated_channels/moodle/migrations/0029_auto_20231106_1233.py similarity index 100% rename from integrated_channels/moodle/migrations/0029_auto_20231106_1233.py rename to src/integrated_channels/moodle/migrations/0029_auto_20231106_1233.py diff --git a/integrated_channels/moodle/migrations/0030_merge_0028_auto_20231116_1826_0029_auto_20231106_1233.py b/src/integrated_channels/moodle/migrations/0030_merge_0028_auto_20231116_1826_0029_auto_20231106_1233.py similarity index 100% rename from integrated_channels/moodle/migrations/0030_merge_0028_auto_20231116_1826_0029_auto_20231106_1233.py rename to src/integrated_channels/moodle/migrations/0030_merge_0028_auto_20231116_1826_0029_auto_20231106_1233.py diff --git a/integrated_channels/moodle/migrations/0031_auto_20240117_1202.py b/src/integrated_channels/moodle/migrations/0031_auto_20240117_1202.py similarity index 100% rename from integrated_channels/moodle/migrations/0031_auto_20240117_1202.py rename to src/integrated_channels/moodle/migrations/0031_auto_20240117_1202.py diff --git a/integrated_channels/moodle/migrations/0032_moodlelearnerdatatransmissionaudit_moodle_unique_enrollment_course_id.py b/src/integrated_channels/moodle/migrations/0032_moodlelearnerdatatransmissionaudit_moodle_unique_enrollment_course_id.py similarity index 100% rename from integrated_channels/moodle/migrations/0032_moodlelearnerdatatransmissionaudit_moodle_unique_enrollment_course_id.py rename to src/integrated_channels/moodle/migrations/0032_moodlelearnerdatatransmissionaudit_moodle_unique_enrollment_course_id.py diff --git a/integrated_channels/moodle/migrations/0033_delete_historicalmoodleenterprisecustomerconfiguration.py b/src/integrated_channels/moodle/migrations/0033_delete_historicalmoodleenterprisecustomerconfiguration.py similarity index 100% rename from integrated_channels/moodle/migrations/0033_delete_historicalmoodleenterprisecustomerconfiguration.py rename to src/integrated_channels/moodle/migrations/0033_delete_historicalmoodleenterprisecustomerconfiguration.py diff --git a/integrated_channels/moodle/migrations/0034_moodlelearnerdatatransmissionaudit_is_transmitted.py b/src/integrated_channels/moodle/migrations/0034_moodlelearnerdatatransmissionaudit_is_transmitted.py similarity index 100% rename from integrated_channels/moodle/migrations/0034_moodlelearnerdatatransmissionaudit_is_transmitted.py rename to src/integrated_channels/moodle/migrations/0034_moodlelearnerdatatransmissionaudit_is_transmitted.py diff --git a/integrated_channels/moodle/migrations/0035_rename_moodlelearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_moodle_cu.py b/src/integrated_channels/moodle/migrations/0035_rename_moodlelearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_moodle_cu.py similarity index 100% rename from integrated_channels/moodle/migrations/0035_rename_moodlelearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_moodle_cu.py rename to src/integrated_channels/moodle/migrations/0035_rename_moodlelearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_moodle_cu.py diff --git a/integrated_channels/moodle/migrations/__init__.py b/src/integrated_channels/moodle/migrations/__init__.py similarity index 100% rename from integrated_channels/moodle/migrations/__init__.py rename to src/integrated_channels/moodle/migrations/__init__.py diff --git a/integrated_channels/moodle/models.py b/src/integrated_channels/moodle/models.py similarity index 100% rename from integrated_channels/moodle/models.py rename to src/integrated_channels/moodle/models.py diff --git a/integrated_channels/moodle/transmitters/__init__.py b/src/integrated_channels/moodle/transmitters/__init__.py similarity index 100% rename from integrated_channels/moodle/transmitters/__init__.py rename to src/integrated_channels/moodle/transmitters/__init__.py diff --git a/integrated_channels/moodle/transmitters/content_metadata.py b/src/integrated_channels/moodle/transmitters/content_metadata.py similarity index 100% rename from integrated_channels/moodle/transmitters/content_metadata.py rename to src/integrated_channels/moodle/transmitters/content_metadata.py diff --git a/integrated_channels/moodle/transmitters/learner_data.py b/src/integrated_channels/moodle/transmitters/learner_data.py similarity index 100% rename from integrated_channels/moodle/transmitters/learner_data.py rename to src/integrated_channels/moodle/transmitters/learner_data.py diff --git a/integrated_channels/sap_success_factors/__init__.py b/src/integrated_channels/sap_success_factors/__init__.py similarity index 100% rename from integrated_channels/sap_success_factors/__init__.py rename to src/integrated_channels/sap_success_factors/__init__.py diff --git a/integrated_channels/sap_success_factors/admin/__init__.py b/src/integrated_channels/sap_success_factors/admin/__init__.py similarity index 100% rename from integrated_channels/sap_success_factors/admin/__init__.py rename to src/integrated_channels/sap_success_factors/admin/__init__.py diff --git a/integrated_channels/sap_success_factors/apps.py b/src/integrated_channels/sap_success_factors/apps.py similarity index 100% rename from integrated_channels/sap_success_factors/apps.py rename to src/integrated_channels/sap_success_factors/apps.py diff --git a/integrated_channels/sap_success_factors/client.py b/src/integrated_channels/sap_success_factors/client.py similarity index 100% rename from integrated_channels/sap_success_factors/client.py rename to src/integrated_channels/sap_success_factors/client.py diff --git a/integrated_channels/sap_success_factors/constants.py b/src/integrated_channels/sap_success_factors/constants.py similarity index 100% rename from integrated_channels/sap_success_factors/constants.py rename to src/integrated_channels/sap_success_factors/constants.py diff --git a/integrated_channels/sap_success_factors/exporters/__init__.py b/src/integrated_channels/sap_success_factors/exporters/__init__.py similarity index 100% rename from integrated_channels/sap_success_factors/exporters/__init__.py rename to src/integrated_channels/sap_success_factors/exporters/__init__.py diff --git a/integrated_channels/sap_success_factors/exporters/content_metadata.py b/src/integrated_channels/sap_success_factors/exporters/content_metadata.py similarity index 100% rename from integrated_channels/sap_success_factors/exporters/content_metadata.py rename to src/integrated_channels/sap_success_factors/exporters/content_metadata.py diff --git a/integrated_channels/sap_success_factors/exporters/learner_data.py b/src/integrated_channels/sap_success_factors/exporters/learner_data.py similarity index 100% rename from integrated_channels/sap_success_factors/exporters/learner_data.py rename to src/integrated_channels/sap_success_factors/exporters/learner_data.py diff --git a/integrated_channels/sap_success_factors/exporters/utils.py b/src/integrated_channels/sap_success_factors/exporters/utils.py similarity index 100% rename from integrated_channels/sap_success_factors/exporters/utils.py rename to src/integrated_channels/sap_success_factors/exporters/utils.py diff --git a/integrated_channels/sap_success_factors/migrations/0001_squashed_0022_auto_20200206_1046_squashed_0011_alter_sapsuccessfactorslearnerdatatransmissionaudit_enterprise_course_enrollment_id.py b/src/integrated_channels/sap_success_factors/migrations/0001_squashed_0022_auto_20200206_1046_squashed_0011_alter_sapsuccessfactorslearnerdatatransmissionaudit_enterprise_course_enrollment_id.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0001_squashed_0022_auto_20200206_1046_squashed_0011_alter_sapsuccessfactorslearnerdatatransmissionaudit_enterprise_course_enrollment_id.py rename to src/integrated_channels/sap_success_factors/migrations/0001_squashed_0022_auto_20200206_1046_squashed_0011_alter_sapsuccessfactorslearnerdatatransmissionaudit_enterprise_course_enrollment_id.py diff --git a/integrated_channels/sap_success_factors/migrations/0002_alter_sapsuccessfactorsenterprisecustomerconfiguration_display_name.py b/src/integrated_channels/sap_success_factors/migrations/0002_alter_sapsuccessfactorsenterprisecustomerconfiguration_display_name.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0002_alter_sapsuccessfactorsenterprisecustomerconfiguration_display_name.py rename to src/integrated_channels/sap_success_factors/migrations/0002_alter_sapsuccessfactorsenterprisecustomerconfiguration_display_name.py diff --git a/integrated_channels/sap_success_factors/migrations/0003_alter_sapsuccessfactorslearnerdatatransmissionaudit_completed_timestamp.py b/src/integrated_channels/sap_success_factors/migrations/0003_alter_sapsuccessfactorslearnerdatatransmissionaudit_completed_timestamp.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0003_alter_sapsuccessfactorslearnerdatatransmissionaudit_completed_timestamp.py rename to src/integrated_channels/sap_success_factors/migrations/0003_alter_sapsuccessfactorslearnerdatatransmissionaudit_completed_timestamp.py diff --git a/integrated_channels/sap_success_factors/migrations/0004_auto_20220324_1550_squashed_0006_auto_20220330_1157.py b/src/integrated_channels/sap_success_factors/migrations/0004_auto_20220324_1550_squashed_0006_auto_20220330_1157.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0004_auto_20220324_1550_squashed_0006_auto_20220330_1157.py rename to src/integrated_channels/sap_success_factors/migrations/0004_auto_20220324_1550_squashed_0006_auto_20220330_1157.py diff --git a/integrated_channels/sap_success_factors/migrations/0005_sapsuccessfactorsenterprisecustomerconfiguration_dry_run_mode_enabled.py b/src/integrated_channels/sap_success_factors/migrations/0005_sapsuccessfactorsenterprisecustomerconfiguration_dry_run_mode_enabled.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0005_sapsuccessfactorsenterprisecustomerconfiguration_dry_run_mode_enabled.py rename to src/integrated_channels/sap_success_factors/migrations/0005_sapsuccessfactorsenterprisecustomerconfiguration_dry_run_mode_enabled.py diff --git a/integrated_channels/sap_success_factors/migrations/0006_sapsuccessfactorslearnerdatatransmissionaudit_friendly_status_message.py b/src/integrated_channels/sap_success_factors/migrations/0006_sapsuccessfactorslearnerdatatransmissionaudit_friendly_status_message.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0006_sapsuccessfactorslearnerdatatransmissionaudit_friendly_status_message.py rename to src/integrated_channels/sap_success_factors/migrations/0006_sapsuccessfactorslearnerdatatransmissionaudit_friendly_status_message.py diff --git a/integrated_channels/sap_success_factors/migrations/0007_sapsuccessfactorslearnerdatatransmissionaudit_api_record.py b/src/integrated_channels/sap_success_factors/migrations/0007_sapsuccessfactorslearnerdatatransmissionaudit_api_record.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0007_sapsuccessfactorslearnerdatatransmissionaudit_api_record.py rename to src/integrated_channels/sap_success_factors/migrations/0007_sapsuccessfactorslearnerdatatransmissionaudit_api_record.py diff --git a/integrated_channels/sap_success_factors/migrations/0008_auto_20221021_0159.py b/src/integrated_channels/sap_success_factors/migrations/0008_auto_20221021_0159.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0008_auto_20221021_0159.py rename to src/integrated_channels/sap_success_factors/migrations/0008_auto_20221021_0159.py diff --git a/integrated_channels/sap_success_factors/migrations/0009_sapsuccessfactorsenterprisecustomerconfiguration_deleted_at.py b/src/integrated_channels/sap_success_factors/migrations/0009_sapsuccessfactorsenterprisecustomerconfiguration_deleted_at.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0009_sapsuccessfactorsenterprisecustomerconfiguration_deleted_at.py rename to src/integrated_channels/sap_success_factors/migrations/0009_sapsuccessfactorsenterprisecustomerconfiguration_deleted_at.py diff --git a/integrated_channels/sap_success_factors/migrations/0010_move_and_recrete_completed_timestamp.py b/src/integrated_channels/sap_success_factors/migrations/0010_move_and_recrete_completed_timestamp.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0010_move_and_recrete_completed_timestamp.py rename to src/integrated_channels/sap_success_factors/migrations/0010_move_and_recrete_completed_timestamp.py diff --git a/integrated_channels/sap_success_factors/migrations/0011_alter_sapsuccessfactorslearnerdatatransmissionaudit_index_together.py b/src/integrated_channels/sap_success_factors/migrations/0011_alter_sapsuccessfactorslearnerdatatransmissionaudit_index_together.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0011_alter_sapsuccessfactorslearnerdatatransmissionaudit_index_together.py rename to src/integrated_channels/sap_success_factors/migrations/0011_alter_sapsuccessfactorslearnerdatatransmissionaudit_index_together.py diff --git a/integrated_channels/sap_success_factors/migrations/0012_auto_20230105_2122.py b/src/integrated_channels/sap_success_factors/migrations/0012_auto_20230105_2122.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0012_auto_20230105_2122.py rename to src/integrated_channels/sap_success_factors/migrations/0012_auto_20230105_2122.py diff --git a/integrated_channels/sap_success_factors/migrations/0013_sapsuccessfactorsenterprisecustomerconfiguration_last_modified_at.py b/src/integrated_channels/sap_success_factors/migrations/0013_sapsuccessfactorsenterprisecustomerconfiguration_last_modified_at.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0013_sapsuccessfactorsenterprisecustomerconfiguration_last_modified_at.py rename to src/integrated_channels/sap_success_factors/migrations/0013_sapsuccessfactorsenterprisecustomerconfiguration_last_modified_at.py diff --git a/integrated_channels/sap_success_factors/migrations/0014_alter_sapsuccessfactorsenterprisecustomerconfiguration_show_course_price.py b/src/integrated_channels/sap_success_factors/migrations/0014_alter_sapsuccessfactorsenterprisecustomerconfiguration_show_course_price.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0014_alter_sapsuccessfactorsenterprisecustomerconfiguration_show_course_price.py rename to src/integrated_channels/sap_success_factors/migrations/0014_alter_sapsuccessfactorsenterprisecustomerconfiguration_show_course_price.py diff --git a/integrated_channels/sap_success_factors/migrations/0015_sapsuccessfactorslearnerdatatransmissionaudit_sap_unique_enrollment_course_id.py b/src/integrated_channels/sap_success_factors/migrations/0015_sapsuccessfactorslearnerdatatransmissionaudit_sap_unique_enrollment_course_id.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0015_sapsuccessfactorslearnerdatatransmissionaudit_sap_unique_enrollment_course_id.py rename to src/integrated_channels/sap_success_factors/migrations/0015_sapsuccessfactorslearnerdatatransmissionaudit_sap_unique_enrollment_course_id.py diff --git a/integrated_channels/sap_success_factors/migrations/0016_sapsuccessfactorslearnerdatatransmissionaudit_is_transmitted.py b/src/integrated_channels/sap_success_factors/migrations/0016_sapsuccessfactorslearnerdatatransmissionaudit_is_transmitted.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0016_sapsuccessfactorslearnerdatatransmissionaudit_is_transmitted.py rename to src/integrated_channels/sap_success_factors/migrations/0016_sapsuccessfactorslearnerdatatransmissionaudit_is_transmitted.py diff --git a/integrated_channels/sap_success_factors/migrations/0017_auto_20240823_0936.py b/src/integrated_channels/sap_success_factors/migrations/0017_auto_20240823_0936.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0017_auto_20240823_0936.py rename to src/integrated_channels/sap_success_factors/migrations/0017_auto_20240823_0936.py diff --git a/integrated_channels/sap_success_factors/migrations/0018_auto_20240829_0910.py b/src/integrated_channels/sap_success_factors/migrations/0018_auto_20240829_0910.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0018_auto_20240829_0910.py rename to src/integrated_channels/sap_success_factors/migrations/0018_auto_20240829_0910.py diff --git a/integrated_channels/sap_success_factors/migrations/0019_auto_20240902_1418.py b/src/integrated_channels/sap_success_factors/migrations/0019_auto_20240902_1418.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0019_auto_20240902_1418.py rename to src/integrated_channels/sap_success_factors/migrations/0019_auto_20240902_1418.py diff --git a/integrated_channels/sap_success_factors/migrations/0020_remove_sapsuccessfactorsenterprisecustomerconfiguration_decrypted_secret.py b/src/integrated_channels/sap_success_factors/migrations/0020_remove_sapsuccessfactorsenterprisecustomerconfiguration_decrypted_secret.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0020_remove_sapsuccessfactorsenterprisecustomerconfiguration_decrypted_secret.py rename to src/integrated_channels/sap_success_factors/migrations/0020_remove_sapsuccessfactorsenterprisecustomerconfiguration_decrypted_secret.py diff --git a/integrated_channels/sap_success_factors/migrations/0021_sapsuccessfactorsenterprisecustomerconfiguration_decrypted_secret.py b/src/integrated_channels/sap_success_factors/migrations/0021_sapsuccessfactorsenterprisecustomerconfiguration_decrypted_secret.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0021_sapsuccessfactorsenterprisecustomerconfiguration_decrypted_secret.py rename to src/integrated_channels/sap_success_factors/migrations/0021_sapsuccessfactorsenterprisecustomerconfiguration_decrypted_secret.py diff --git a/integrated_channels/sap_success_factors/migrations/0022_auto_20240906_1349.py b/src/integrated_channels/sap_success_factors/migrations/0022_auto_20240906_1349.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0022_auto_20240906_1349.py rename to src/integrated_channels/sap_success_factors/migrations/0022_auto_20240906_1349.py diff --git a/integrated_channels/sap_success_factors/migrations/0023_auto_20240909_1556.py b/src/integrated_channels/sap_success_factors/migrations/0023_auto_20240909_1556.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0023_auto_20240909_1556.py rename to src/integrated_channels/sap_success_factors/migrations/0023_auto_20240909_1556.py diff --git a/integrated_channels/sap_success_factors/migrations/0024_auto_20240909_1614.py b/src/integrated_channels/sap_success_factors/migrations/0024_auto_20240909_1614.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0024_auto_20240909_1614.py rename to src/integrated_channels/sap_success_factors/migrations/0024_auto_20240909_1614.py diff --git a/integrated_channels/sap_success_factors/migrations/0025_rename_sapsuccessfactorslearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_i.py b/src/integrated_channels/sap_success_factors/migrations/0025_rename_sapsuccessfactorslearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_i.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/0025_rename_sapsuccessfactorslearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_i.py rename to src/integrated_channels/sap_success_factors/migrations/0025_rename_sapsuccessfactorslearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_i.py diff --git a/integrated_channels/sap_success_factors/migrations/__init__.py b/src/integrated_channels/sap_success_factors/migrations/__init__.py similarity index 100% rename from integrated_channels/sap_success_factors/migrations/__init__.py rename to src/integrated_channels/sap_success_factors/migrations/__init__.py diff --git a/integrated_channels/sap_success_factors/models.py b/src/integrated_channels/sap_success_factors/models.py similarity index 100% rename from integrated_channels/sap_success_factors/models.py rename to src/integrated_channels/sap_success_factors/models.py diff --git a/integrated_channels/sap_success_factors/transmitters/__init__.py b/src/integrated_channels/sap_success_factors/transmitters/__init__.py similarity index 100% rename from integrated_channels/sap_success_factors/transmitters/__init__.py rename to src/integrated_channels/sap_success_factors/transmitters/__init__.py diff --git a/integrated_channels/sap_success_factors/transmitters/content_metadata.py b/src/integrated_channels/sap_success_factors/transmitters/content_metadata.py similarity index 100% rename from integrated_channels/sap_success_factors/transmitters/content_metadata.py rename to src/integrated_channels/sap_success_factors/transmitters/content_metadata.py diff --git a/integrated_channels/sap_success_factors/transmitters/learner_data.py b/src/integrated_channels/sap_success_factors/transmitters/learner_data.py similarity index 100% rename from integrated_channels/sap_success_factors/transmitters/learner_data.py rename to src/integrated_channels/sap_success_factors/transmitters/learner_data.py diff --git a/integrated_channels/sap_success_factors/utils.py b/src/integrated_channels/sap_success_factors/utils.py similarity index 100% rename from integrated_channels/sap_success_factors/utils.py rename to src/integrated_channels/sap_success_factors/utils.py diff --git a/integrated_channels/utils.py b/src/integrated_channels/utils.py similarity index 100% rename from integrated_channels/utils.py rename to src/integrated_channels/utils.py diff --git a/integrated_channels/xapi/__init__.py b/src/integrated_channels/xapi/__init__.py similarity index 100% rename from integrated_channels/xapi/__init__.py rename to src/integrated_channels/xapi/__init__.py diff --git a/integrated_channels/xapi/admin/__init__.py b/src/integrated_channels/xapi/admin/__init__.py similarity index 100% rename from integrated_channels/xapi/admin/__init__.py rename to src/integrated_channels/xapi/admin/__init__.py diff --git a/integrated_channels/xapi/apps.py b/src/integrated_channels/xapi/apps.py similarity index 100% rename from integrated_channels/xapi/apps.py rename to src/integrated_channels/xapi/apps.py diff --git a/integrated_channels/xapi/client.py b/src/integrated_channels/xapi/client.py similarity index 100% rename from integrated_channels/xapi/client.py rename to src/integrated_channels/xapi/client.py diff --git a/integrated_channels/xapi/constants.py b/src/integrated_channels/xapi/constants.py similarity index 100% rename from integrated_channels/xapi/constants.py rename to src/integrated_channels/xapi/constants.py diff --git a/integrated_channels/xapi/management/__init__.py b/src/integrated_channels/xapi/management/__init__.py similarity index 100% rename from integrated_channels/xapi/management/__init__.py rename to src/integrated_channels/xapi/management/__init__.py diff --git a/integrated_channels/xapi/management/commands/__init__.py b/src/integrated_channels/xapi/management/commands/__init__.py similarity index 100% rename from integrated_channels/xapi/management/commands/__init__.py rename to src/integrated_channels/xapi/management/commands/__init__.py diff --git a/integrated_channels/xapi/management/commands/send_course_completions.py b/src/integrated_channels/xapi/management/commands/send_course_completions.py similarity index 100% rename from integrated_channels/xapi/management/commands/send_course_completions.py rename to src/integrated_channels/xapi/management/commands/send_course_completions.py diff --git a/integrated_channels/xapi/management/commands/send_course_enrollments.py b/src/integrated_channels/xapi/management/commands/send_course_enrollments.py similarity index 100% rename from integrated_channels/xapi/management/commands/send_course_enrollments.py rename to src/integrated_channels/xapi/management/commands/send_course_enrollments.py diff --git a/integrated_channels/xapi/migrations/0001_initial.py b/src/integrated_channels/xapi/migrations/0001_initial.py similarity index 100% rename from integrated_channels/xapi/migrations/0001_initial.py rename to src/integrated_channels/xapi/migrations/0001_initial.py diff --git a/integrated_channels/xapi/migrations/0002_auto_20180726_0142.py b/src/integrated_channels/xapi/migrations/0002_auto_20180726_0142.py similarity index 100% rename from integrated_channels/xapi/migrations/0002_auto_20180726_0142.py rename to src/integrated_channels/xapi/migrations/0002_auto_20180726_0142.py diff --git a/integrated_channels/xapi/migrations/0003_auto_20190807_1006.py b/src/integrated_channels/xapi/migrations/0003_auto_20190807_1006.py similarity index 100% rename from integrated_channels/xapi/migrations/0003_auto_20190807_1006.py rename to src/integrated_channels/xapi/migrations/0003_auto_20190807_1006.py diff --git a/integrated_channels/xapi/migrations/0004_auto_20190830_0710.py b/src/integrated_channels/xapi/migrations/0004_auto_20190830_0710.py similarity index 100% rename from integrated_channels/xapi/migrations/0004_auto_20190830_0710.py rename to src/integrated_channels/xapi/migrations/0004_auto_20190830_0710.py diff --git a/integrated_channels/xapi/migrations/0005_auto_20220324_1550.py b/src/integrated_channels/xapi/migrations/0005_auto_20220324_1550.py similarity index 100% rename from integrated_channels/xapi/migrations/0005_auto_20220324_1550.py rename to src/integrated_channels/xapi/migrations/0005_auto_20220324_1550.py diff --git a/integrated_channels/xapi/migrations/0006_auto_20220325_1757.py b/src/integrated_channels/xapi/migrations/0006_auto_20220325_1757.py similarity index 100% rename from integrated_channels/xapi/migrations/0006_auto_20220325_1757.py rename to src/integrated_channels/xapi/migrations/0006_auto_20220325_1757.py diff --git a/integrated_channels/xapi/migrations/0007_auto_20220405_2311.py b/src/integrated_channels/xapi/migrations/0007_auto_20220405_2311.py similarity index 100% rename from integrated_channels/xapi/migrations/0007_auto_20220405_2311.py rename to src/integrated_channels/xapi/migrations/0007_auto_20220405_2311.py diff --git a/integrated_channels/xapi/migrations/0008_xapilearnerdatatransmissionaudit_friendly_status_message.py b/src/integrated_channels/xapi/migrations/0008_xapilearnerdatatransmissionaudit_friendly_status_message.py similarity index 100% rename from integrated_channels/xapi/migrations/0008_xapilearnerdatatransmissionaudit_friendly_status_message.py rename to src/integrated_channels/xapi/migrations/0008_xapilearnerdatatransmissionaudit_friendly_status_message.py diff --git a/integrated_channels/xapi/migrations/0009_xapilearnerdatatransmissionaudit_api_record.py b/src/integrated_channels/xapi/migrations/0009_xapilearnerdatatransmissionaudit_api_record.py similarity index 100% rename from integrated_channels/xapi/migrations/0009_xapilearnerdatatransmissionaudit_api_record.py rename to src/integrated_channels/xapi/migrations/0009_xapilearnerdatatransmissionaudit_api_record.py diff --git a/integrated_channels/xapi/migrations/0010_auto_20221021_0159.py b/src/integrated_channels/xapi/migrations/0010_auto_20221021_0159.py similarity index 100% rename from integrated_channels/xapi/migrations/0010_auto_20221021_0159.py rename to src/integrated_channels/xapi/migrations/0010_auto_20221021_0159.py diff --git a/integrated_channels/xapi/migrations/0011_alter_xapilearnerdatatransmissionaudit_index_together.py b/src/integrated_channels/xapi/migrations/0011_alter_xapilearnerdatatransmissionaudit_index_together.py similarity index 100% rename from integrated_channels/xapi/migrations/0011_alter_xapilearnerdatatransmissionaudit_index_together.py rename to src/integrated_channels/xapi/migrations/0011_alter_xapilearnerdatatransmissionaudit_index_together.py diff --git a/integrated_channels/xapi/migrations/0012_xapilearnerdatatransmissionaudit_is_transmitted.py b/src/integrated_channels/xapi/migrations/0012_xapilearnerdatatransmissionaudit_is_transmitted.py similarity index 100% rename from integrated_channels/xapi/migrations/0012_xapilearnerdatatransmissionaudit_is_transmitted.py rename to src/integrated_channels/xapi/migrations/0012_xapilearnerdatatransmissionaudit_is_transmitted.py diff --git a/integrated_channels/xapi/migrations/0013_rename_xapilearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_xapi_custom.py b/src/integrated_channels/xapi/migrations/0013_rename_xapilearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_xapi_custom.py similarity index 100% rename from integrated_channels/xapi/migrations/0013_rename_xapilearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_xapi_custom.py rename to src/integrated_channels/xapi/migrations/0013_rename_xapilearnerdatatransmissionaudit_enterprise_customer_uuid_plugin_configuration_id_xapi_custom.py diff --git a/integrated_channels/xapi/migrations/__init__.py b/src/integrated_channels/xapi/migrations/__init__.py similarity index 100% rename from integrated_channels/xapi/migrations/__init__.py rename to src/integrated_channels/xapi/migrations/__init__.py diff --git a/integrated_channels/xapi/models.py b/src/integrated_channels/xapi/models.py similarity index 100% rename from integrated_channels/xapi/models.py rename to src/integrated_channels/xapi/models.py diff --git a/integrated_channels/xapi/statements/__init__.py b/src/integrated_channels/xapi/statements/__init__.py similarity index 100% rename from integrated_channels/xapi/statements/__init__.py rename to src/integrated_channels/xapi/statements/__init__.py diff --git a/integrated_channels/xapi/statements/base.py b/src/integrated_channels/xapi/statements/base.py similarity index 100% rename from integrated_channels/xapi/statements/base.py rename to src/integrated_channels/xapi/statements/base.py diff --git a/integrated_channels/xapi/statements/learner_course_completion.py b/src/integrated_channels/xapi/statements/learner_course_completion.py similarity index 100% rename from integrated_channels/xapi/statements/learner_course_completion.py rename to src/integrated_channels/xapi/statements/learner_course_completion.py diff --git a/integrated_channels/xapi/statements/learner_course_enrollment.py b/src/integrated_channels/xapi/statements/learner_course_enrollment.py similarity index 100% rename from integrated_channels/xapi/statements/learner_course_enrollment.py rename to src/integrated_channels/xapi/statements/learner_course_enrollment.py diff --git a/integrated_channels/xapi/utils.py b/src/integrated_channels/xapi/utils.py similarity index 100% rename from integrated_channels/xapi/utils.py rename to src/integrated_channels/xapi/utils.py diff --git a/tox.ini b/tox.ini index 8ee7f26731..a9109a671b 100644 --- a/tox.ini +++ b/tox.ini @@ -1,98 +1,97 @@ [tox] envlist = py{312}-django{52} +requires = + tox-uv>=1 [doc8] max-line-length = 120 -[isort] -line_length = 120 -known_edx = -known_django = django -known_djangoapp = model_utils -known_first_party = consent,enterprise,enterprise_learner_portal,integrated_channels -include_trailing_comma = true -multi_line_output = 3 -sections = FUTURE,STDLIB,THIRDPARTY,DJANGO,DJANGOAPP,EDX,FIRSTPARTY,LOCALFOLDER +[pycodestyle] +# error codes: https://pycodestyle.readthedocs.io/en/latest/intro.html#error-codes +# E501: line too long +# W503,W504: warnings added since pep8/pycodestyle 1.5.7 that we haven't cleaned up yet +ignore=E501,W503,W504 +exclude=.git,.tox,src/enterprise/settings,src/enterprise/migrations,src/enterprise/static [wheel] universal = 1 [testenv] +runner = uv-venv-lock-runner +dependency_groups = + test setenv = TOXENV={envname} deps = - setuptools django52: Django>=5.2,<5.3 - -r{toxinidir}/requirements/test.txt commands = py.test -Wd {posargs} [testenv:docs] +runner = uv-venv-lock-runner +dependency_groups = + doc setenv = DJANGO_SETTINGS_MODULE = enterprise.settings.test PYTHONPATH = {toxinidir} allowlist_externals = make rm -deps = - setuptools - -r{toxinidir}/requirements/doc.txt commands = doc8 --ignore-path docs/_build --ignore-path docs/decisions README.rst docs rm -f docs/enterprise.rst rm -f docs/modules.rst make -C docs clean make -C docs html - python setup.py check --restructuredtext + python -m build --wheel + twine check dist/* [testenv:isort] -deps = - setuptools - -r{toxinidir}/requirements/dev.txt +runner = uv-venv-lock-runner +dependency_groups = + dev commands = - isort --skip migrations tests test_utils enterprise enterprise_learner_portal consent integrated_channels manage.py setup.py + isort --skip migrations tests test_utils src/enterprise src/enterprise_learner_portal src/consent src/integrated_channels manage.py [testenv:isort-check] -deps = - setuptools - -r{toxinidir}/requirements/dev.txt +runner = uv-venv-lock-runner +dependency_groups = + dev commands = - isort --skip migrations --check-only --diff tests test_utils enterprise enterprise_learner_portal consent integrated_channels manage.py setup.py + isort --skip migrations --check-only --diff tests test_utils src/enterprise src/enterprise_learner_portal src/consent src/integrated_channels manage.py [testenv:quality] +runner = uv-venv-lock-runner +dependency_groups = + dev setenv = DJANGO_SETTINGS_MODULE = enterprise.settings.test allowlist_externals = rm touch -deps = - setuptools - -r{toxinidir}/requirements/dev.txt commands = touch tests/__init__.py - pylint -j 1 enterprise enterprise_learner_portal --clear-cache-post-run=y - pylint -j 1 consent integrated_channels --clear-cache-post-run=y - pylint -j 1 test_utils requirements/check_pins.py --clear-cache-post-run=y + pylint -j 1 src/enterprise src/enterprise_learner_portal --clear-cache-post-run=y + pylint -j 1 src/consent src/integrated_channels --clear-cache-post-run=y + pylint -j 1 test_utils requirements/sync_platform_constraints.py --clear-cache-post-run=y pylint -j 1 tests -v --clear-cache-post-run=y rm tests/__init__.py - pycodestyle enterprise enterprise_learner_portal consent integrated_channels tests test_utils - isort --skip migrations --check-only --diff tests test_utils enterprise enterprise_learner_portal consent integrated_channels manage.py setup.py + pycodestyle src/enterprise src/enterprise_learner_portal src/consent src/integrated_channels tests test_utils + isort --skip migrations --check-only --diff tests test_utils src/enterprise src/enterprise_learner_portal src/consent src/integrated_channels manage.py [testenv:jasmine] +runner = uv-venv-lock-runner +dependency_groups = + js_test passenv = JASMINE_BROWSER DISPLAY -deps = - setuptools - -r{toxinidir}/requirements/js_test.txt commands = jasmine [testenv:pii_check] +runner = uv-venv-lock-runner +dependency_groups = + test setenv = DJANGO_SETTINGS_MODULE = enterprise.settings.test -deps = - setuptools - Django>=5.2,<5.3 - -r{toxinidir}/requirements/test.txt commands = code_annotations django_find_annotations --config_file .pii_annotations.yml --lint --report --coverage - diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000000..405e78d2f4 --- /dev/null +++ b/uv.lock @@ -0,0 +1,4467 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version == '3.13.*'", + "python_full_version < '3.13'", +] +conflicts = [[ + { package = "edx-enterprise", group = "js-test" }, + { package = "edx-enterprise", group = "test-master" }, +], [ + { package = "edx-enterprise", group = "js-test" }, + { package = "edx-enterprise", group = "test" }, +], [ + { package = "edx-enterprise", group = "doc" }, + { package = "edx-enterprise", group = "js-test" }, +], [ + { package = "edx-enterprise", group = "dev" }, + { package = "edx-enterprise", group = "js-test" }, +]] + +[manifest] +constraints = [ + { name = "acid-xblock", specifier = "==0.4.1" }, + { name = "aiohappyeyeballs", specifier = "==2.7.1" }, + { name = "aiohttp", specifier = "==3.14.1" }, + { name = "aiosignal", specifier = "==1.4.0" }, + { name = "amqp", specifier = "==5.3.1" }, + { name = "analytics-python", specifier = "==1.4.post1" }, + { name = "aniso8601", specifier = "==10.0.1" }, + { name = "annotated-types", specifier = "==0.7.0" }, + { name = "anyio", specifier = "==4.14.1" }, + { name = "appdirs", specifier = "==1.4.4" }, + { name = "asgiref", specifier = "==3.11.1" }, + { name = "asn1crypto", specifier = "==1.5.1" }, + { name = "astroid", specifier = ">=3,<4" }, + { name = "attrs", specifier = "==26.1.0" }, + { name = "babel", specifier = "==2.18.0" }, + { name = "backoff", specifier = "==1.10.0" }, + { name = "bcrypt", specifier = "==5.0.0" }, + { name = "beautifulsoup4", specifier = "==4.15.0" }, + { name = "billiard", specifier = "==4.2.4" }, + { name = "bleach", specifier = "==6.4.0" }, + { name = "boto3", specifier = "==1.43.41" }, + { name = "botocore", specifier = "==1.43.41" }, + { name = "bracex", specifier = "==3.0" }, + { name = "bridgekeeper", specifier = "==0.9" }, + { name = "cachecontrol", specifier = "==0.14.4" }, + { name = "cachetools", specifier = "==7.1.4" }, + { name = "camel-converter", specifier = "==5.1.0" }, + { name = "casbin-django-orm-adapter", specifier = "==1.7.0" }, + { name = "celery", specifier = "==5.6.3" }, + { name = "certifi", specifier = "==2026.6.17" }, + { name = "cffi", specifier = "==2.1.0" }, + { name = "chardet", specifier = "==7.4.3" }, + { name = "charset-normalizer", specifier = "==3.4.8" }, + { name = "chem", specifier = "==2.0.0" }, + { name = "click", specifier = "==8.4.2" }, + { name = "click-didyoumean", specifier = "==0.3.1" }, + { name = "click-plugins", specifier = "==1.1.1.2" }, + { name = "click-repl", specifier = "==0.3.0" }, + { name = "code-annotations", specifier = "==3.0.0" }, + { name = "codejail-includes", specifier = "==2.0.0" }, + { name = "crowdsourcehinter-xblock", specifier = "==1.0.1" }, + { name = "cryptography", specifier = "==49.0.0" }, + { name = "cssutils", specifier = "==2.15.0" }, + { name = "defusedxml", specifier = "==0.7.1" }, + { name = "django", specifier = "<6.0" }, + { name = "django-appconf", specifier = "==1.2.0" }, + { name = "django-autocomplete-light", specifier = "==5.0.0" }, + { name = "django-cache-memoize", specifier = "==0.2.1" }, + { name = "django-celery-results", specifier = "==2.6.0" }, + { name = "django-classy-tags", specifier = "==4.1.0" }, + { name = "django-config-models", specifier = "==3.0.0" }, + { name = "django-cors-headers", specifier = "==4.9.0" }, + { name = "django-countries", specifier = "==9.0.0" }, + { name = "django-crum", specifier = "==0.7.9" }, + { name = "django-fernet-fields-v2", specifier = "==0.9" }, + { name = "django-filter", specifier = "==25.2" }, + { name = "django-ipware", specifier = "==7.0.1" }, + { name = "django-js-asset", specifier = "==4.0.1" }, + { name = "django-method-override", specifier = "==1.0.4" }, + { name = "django-model-utils", specifier = "==5.0.0" }, + { name = "django-mptt", specifier = "==0.18.0" }, + { name = "django-multi-email-field", specifier = "==0.8.0" }, + { name = "django-mysql", specifier = "==4.19.0" }, + { name = "django-oauth-toolkit", specifier = "==1.7.1" }, + { name = "django-object-actions", specifier = "==5.1.2" }, + { name = "django-pipeline", specifier = "==4.1.0" }, + { name = "django-push-notifications", specifier = "==3.3.0" }, + { name = "django-ratelimit", specifier = "==4.1.0" }, + { name = "django-sekizai", specifier = "==4.1.0" }, + { name = "django-ses", specifier = "==4.7.2" }, + { name = "django-simple-history", specifier = "==3.12.0" }, + { name = "django-statici18n", specifier = "==2.7.1" }, + { name = "django-storages", specifier = "==1.14.6" }, + { name = "django-user-tasks", specifier = "==4.0.0" }, + { name = "django-waffle", specifier = "==5.0.0" }, + { name = "django-webpack-loader", specifier = "==3.2.4" }, + { name = "djangorestframework", specifier = "==3.17.1" }, + { name = "djangorestframework-xml", specifier = "==2.0.0" }, + { name = "dnspython", specifier = "==2.8.0" }, + { name = "done-xblock", specifier = "==3.0.0" }, + { name = "drf-jwt", specifier = "==1.19.2" }, + { name = "drf-spectacular", specifier = "==0.30.0" }, + { name = "drf-yasg", specifier = "==1.21.15" }, + { name = "edx-ace", specifier = "==1.15.0" }, + { name = "edx-api-doc-tools", specifier = "==3.0.0" }, + { name = "edx-auth-backends", specifier = "==5.0.0" }, + { name = "edx-bulk-grades", specifier = "==2.0.0" }, + { name = "edx-ccx-keys", specifier = "==2.0.2" }, + { name = "edx-celeryutils", specifier = "==2.0.0" }, + { name = "edx-codejail", specifier = "==4.1.0" }, + { name = "edx-completion", specifier = "==5.0.0" }, + { name = "edx-django-release-util", specifier = "==1.5.0" }, + { name = "edx-django-sites-extensions", specifier = "==6.0.0" }, + { name = "edx-django-utils", specifier = "==8.0.1" }, + { name = "edx-drf-extensions", specifier = "==10.6.0" }, + { name = "edx-event-bus-kafka", specifier = "==6.1.0" }, + { name = "edx-event-bus-redis", specifier = "==1.0.0" }, + { name = "edx-i18n-tools", specifier = "==2.0.0" }, + { name = "edx-milestones", specifier = "==2.0.0" }, + { name = "edx-opaque-keys", specifier = "==4.0.0" }, + { name = "edx-organizations", specifier = "==8.0.0" }, + { name = "edx-proctoring", specifier = "==5.2.0" }, + { name = "edx-rbac", specifier = "==3.0.0" }, + { name = "edx-rest-api-client", specifier = "==7.0.0" }, + { name = "edx-search", specifier = "==5.0.2" }, + { name = "edx-sga", specifier = "==0.29.0" }, + { name = "edx-submissions", specifier = "==4.0.0" }, + { name = "edx-tincan-py35", specifier = "==2.0.0" }, + { name = "edx-toggles", specifier = "==6.0.0" }, + { name = "edx-when", specifier = "==4.0.0" }, + { name = "edxval", specifier = "==5.0.1" }, + { name = "elasticsearch", specifier = "<7.14.0" }, + { name = "encutils", specifier = "==1.0.0" }, + { name = "enmerkar", specifier = "==0.7.1" }, + { name = "enmerkar-underscore", specifier = "==2.4.0" }, + { name = "enterprise-integrated-channels", specifier = "==0.1.62" }, + { name = "event-tracking", specifier = "==4.0.2" }, + { name = "factory-boy", specifier = "<4.0" }, + { name = "fastavro", specifier = "==1.12.2" }, + { name = "filelock", specifier = "==3.29.6" }, + { name = "firebase-admin", specifier = "==7.5.0" }, + { name = "frozenlist", specifier = "==1.8.0" }, + { name = "fs", specifier = "==2.4.16" }, + { name = "fs-s3fs", specifier = "==1.1.1" }, + { name = "geoip2", specifier = "==5.2.0" }, + { name = "glob2", specifier = "==0.7" }, + { name = "google-api-core", specifier = "==2.31.0" }, + { name = "google-auth", specifier = "==2.55.1" }, + { name = "google-cloud-core", specifier = "==2.6.0" }, + { name = "google-cloud-firestore", specifier = "==2.28.0" }, + { name = "google-cloud-storage", specifier = "==3.12.0" }, + { name = "google-crc32c", specifier = "==1.8.0" }, + { name = "google-resumable-media", specifier = "==2.10.0" }, + { name = "googleapis-common-protos", specifier = "==1.75.0" }, + { name = "grpcio", specifier = "==1.82.0" }, + { name = "grpcio-status", specifier = "==1.82.0" }, + { name = "gunicorn", specifier = "==26.0.0" }, + { name = "h11", specifier = "==0.16.0" }, + { name = "h2", specifier = "==4.3.0" }, + { name = "help-tokens", specifier = "==4.0.0" }, + { name = "hpack", specifier = "==4.2.0" }, + { name = "html5lib", specifier = "==1.1" }, + { name = "httpcore", specifier = "==1.0.9" }, + { name = "httpx", specifier = "==0.28.1" }, + { name = "hyperframe", specifier = "==6.1.0" }, + { name = "icalendar", specifier = "==7.2.0" }, + { name = "idna", specifier = "==3.18" }, + { name = "importlib-metadata", specifier = "==9.0.0" }, + { name = "inflection", specifier = "==0.5.1" }, + { name = "invoke", specifier = "==3.0.3" }, + { name = "ipaddress", specifier = "==1.0.23" }, + { name = "isodate", specifier = "==0.7.2" }, + { name = "jinja2", specifier = "==3.1.6" }, + { name = "jmespath", specifier = "==1.1.0" }, + { name = "joblib", specifier = "==1.5.3" }, + { name = "jsondiff", specifier = "==2.2.1" }, + { name = "jsonfield", specifier = "==3.2.0" }, + { name = "jsonschema", specifier = "==4.26.0" }, + { name = "jsonschema-specifications", specifier = "==2025.9.1" }, + { name = "jwcrypto", specifier = "==1.5.8" }, + { name = "kombu", specifier = "==5.6.2" }, + { name = "laboratory", specifier = "==1.0.2" }, + { name = "lazy", specifier = "==2.0" }, + { name = "lti-consumer-xblock", specifier = "==11.3.1" }, + { name = "lxml", specifier = "==5.3.2" }, + { name = "lxml-html-clean", specifier = "==0.4.4" }, + { name = "mailsnake", specifier = "==1.6.4" }, + { name = "mako", specifier = "==1.3.12" }, + { name = "markdown", specifier = "==3.10.2" }, + { name = "markupsafe", specifier = "==3.0.3" }, + { name = "maxminddb", specifier = "==3.1.1" }, + { name = "meilisearch", specifier = "==0.42.0" }, + { name = "mongoengine", specifier = "==0.29.3" }, + { name = "monotonic", specifier = "==1.6" }, + { name = "more-itertools", specifier = "==11.1.0" }, + { name = "mpmath", specifier = "==1.3.0" }, + { name = "msgpack", specifier = "==1.2.1" }, + { name = "multidict", specifier = "==6.7.1" }, + { name = "mysqlclient", specifier = "==2.2.8" }, + { name = "nh3", specifier = "==0.3.6" }, + { name = "nltk", specifier = "==3.9.4" }, + { name = "nodeenv", specifier = "==1.10.0" }, + { name = "numpy", specifier = "==1.26.4" }, + { name = "oauthlib", specifier = "==3.3.1" }, + { name = "olxcleaner", specifier = "==0.3.0" }, + { name = "openedx-atlas", specifier = "==0.7.0" }, + { name = "openedx-authz", specifier = "==1.20.1" }, + { name = "openedx-calc", specifier = "==5.0.0" }, + { name = "openedx-core", specifier = "==1.1.0" }, + { name = "openedx-django-pyfs", specifier = "==4.0.0" }, + { name = "openedx-django-require", specifier = "==3.0.0" }, + { name = "openedx-django-wiki", specifier = "==3.1.2" }, + { name = "openedx-events", specifier = "==11.2.0" }, + { name = "openedx-filters", specifier = "==3.9.0" }, + { name = "openedx-forum", specifier = "==0.4.3" }, + { name = "optimizely-sdk", specifier = "==5.5.0" }, + { name = "ora2", specifier = "==7.1.0" }, + { name = "packaging", specifier = "==26.2" }, + { name = "paramiko", specifier = "==5.0.0" }, + { name = "path", specifier = "==16.11.0" }, + { name = "path-py", specifier = "==12.5.0" }, + { name = "pgpy", specifier = "==0.6.0" }, + { name = "piexif", specifier = "==1.1.3" }, + { name = "pillow", specifier = "==12.3.0" }, + { name = "platformdirs", specifier = "==4.10.0" }, + { name = "polib", specifier = "==1.2.0" }, + { name = "prompt-toolkit", specifier = "==3.0.52" }, + { name = "propcache", specifier = "==0.5.2" }, + { name = "proto-plus", specifier = "==1.28.0" }, + { name = "protobuf", specifier = "==7.35.1" }, + { name = "psutil", specifier = "==7.2.2" }, + { name = "psycopg2-binary", specifier = "==2.9.12" }, + { name = "pyasn1", specifier = "==0.6.3" }, + { name = "pyasn1-modules", specifier = "==0.4.2" }, + { name = "pycasbin", specifier = "==2.8.0" }, + { name = "pycountry", specifier = "==26.2.16" }, + { name = "pycparser", specifier = "==3.0" }, + { name = "pycryptodomex", specifier = "==3.23.0" }, + { name = "pydantic", specifier = "==2.13.4" }, + { name = "pydantic-core", specifier = "==2.46.4" }, + { name = "pyjwt", specifier = "==2.13.0" }, + { name = "pylatexenc", specifier = "==2.10" }, + { name = "pylint", specifier = ">=3,<4" }, + { name = "pylti1p3", specifier = "==2.0.0" }, + { name = "pymemcache", specifier = "==4.0.0" }, + { name = "pymongo", specifier = "==4.4.0" }, + { name = "pynacl", specifier = "==1.6.2" }, + { name = "pynliner", specifier = "==0.8.0" }, + { name = "pyopenssl", specifier = "==26.3.0" }, + { name = "pyparsing", specifier = "==3.3.2" }, + { name = "pyrsistent", specifier = "==0.20.0" }, + { name = "pysrt", specifier = "==1.1.2" }, + { name = "python-dateutil", specifier = "==2.9.0.post0" }, + { name = "python-ipware", specifier = "==3.0.0" }, + { name = "python-slugify", specifier = "==8.0.4" }, + { name = "python-swiftclient", specifier = "==4.10.0" }, + { name = "python3-openid", specifier = "==3.2.0" }, + { name = "python3-saml", specifier = "==1.16.0" }, + { name = "pytz", specifier = "==2026.2" }, + { name = "pyuca", specifier = "==1.2" }, + { name = "random2", specifier = "==1.0.2" }, + { name = "recommender-xblock", specifier = "==5.0.0" }, + { name = "redis", specifier = "==8.0.1" }, + { name = "referencing", specifier = "==0.37.0" }, + { name = "regex", specifier = "==2026.6.28" }, + { name = "requests", specifier = "==2.34.2" }, + { name = "requests-oauthlib", specifier = "==2.0.0" }, + { name = "rpds-py", specifier = "==2026.6.3" }, + { name = "rules", specifier = "==3.5" }, + { name = "s3transfer", specifier = "==0.19.0" }, + { name = "sailthru-client", specifier = "==2.2.3" }, + { name = "scipy", specifier = "==1.17.1" }, + { name = "semantic-version", specifier = "==2.10.0" }, + { name = "setuptools", specifier = "<82" }, + { name = "shapely", specifier = "==2.1.2" }, + { name = "simpleeval", specifier = "==1.0.7" }, + { name = "simplejson", specifier = "==4.1.1" }, + { name = "six", specifier = "==1.17.0" }, + { name = "slumber", specifier = "==0.7.1" }, + { name = "snowflake-connector-python", specifier = "==4.6.0" }, + { name = "social-auth-app-django", specifier = "==5.4.1" }, + { name = "social-auth-core", specifier = "==5.0.2" }, + { name = "sorl-thumbnail", specifier = "==13.0.0" }, + { name = "sortedcontainers", specifier = "==2.4.0" }, + { name = "soupsieve", specifier = "==2.8.4" }, + { name = "sphinx", specifier = ">=8.0,<9.0" }, + { name = "sqlparse", specifier = "==0.5.5" }, + { name = "staff-graded-xblock", specifier = "==4.0.1" }, + { name = "stevedore", specifier = "==5.9.0" }, + { name = "super-csv", specifier = "==5.0.0" }, + { name = "sympy", specifier = "==1.14.0" }, + { name = "testfixtures", specifier = "==12.2.0" }, + { name = "text-unidecode", specifier = "==1.3" }, + { name = "tincan", specifier = "==1.0.0" }, + { name = "tinycss2", specifier = "==1.5.1" }, + { name = "tomlkit", specifier = "==0.15.0" }, + { name = "tqdm", specifier = "==4.68.3" }, + { name = "typesense", specifier = "==2.0.0" }, + { name = "typing-extensions", specifier = "==4.16.0" }, + { name = "typing-inspection", specifier = "==0.4.2" }, + { name = "tzdata", specifier = "==2026.2" }, + { name = "tzlocal", specifier = "==5.4.4" }, + { name = "unicodecsv", specifier = "==0.14.1" }, + { name = "unicodeit", specifier = "==0.7.5" }, + { name = "uritemplate", specifier = "==4.2.0" }, + { name = "urllib3", specifier = "==2.7.0" }, + { name = "vine", specifier = "==5.1.0" }, + { name = "voluptuous", specifier = "==0.16.0" }, + { name = "walrus", specifier = "==0.9.8" }, + { name = "wcmatch", specifier = "==10.2.1" }, + { name = "wcwidth", specifier = "==0.8.2" }, + { name = "web-fragments", specifier = "==4.0.0" }, + { name = "webencodings", specifier = "==0.5.1" }, + { name = "webob", specifier = "==1.8.10" }, + { name = "wheel", specifier = "==0.47.0" }, + { name = "wrapt", specifier = "==2.2.2" }, + { name = "xblock", specifier = "==6.3.0" }, + { name = "xblock-drag-and-drop-v2", specifier = "==5.0.6" }, + { name = "xblock-google-drive", specifier = "==0.8.2" }, + { name = "xblock-poll", specifier = "==1.16.1" }, + { name = "xblocks-contrib", specifier = "==0.17.0" }, + { name = "xmlsec", specifier = "==1.3.14" }, + { name = "xss-utils", specifier = "==1.0.0" }, + { name = "yarl", specifier = "==1.24.2" }, + { name = "zipp", specifier = "==4.1.0" }, +] + +[[package]] +name = "accessible-pygments" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899, upload-time = "2024-05-10T11:23:10.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903, upload-time = "2024-05-10T11:23:08.421Z" }, +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, +] + +[[package]] +name = "amqp" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "vine" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/fc/ec94a357dfc6683d8c86f8b4cfa5416a4c36b28052ec8260c77aca96a443/amqp-5.3.1.tar.gz", hash = "sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432", size = 129013, upload-time = "2024-11-12T19:55:44.051Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/99/fc813cd978842c26c82534010ea849eee9ab3a13ea2b74e95cb9c99e747b/amqp-5.3.1-py3-none-any.whl", hash = "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2", size = 50944, upload-time = "2024-11-12T19:55:41.782Z" }, +] + +[[package]] +name = "aniso8601" +version = "10.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/8d/52179c4e3f1978d3d9a285f98c706642522750ef343e9738286130423730/aniso8601-10.0.1.tar.gz", hash = "sha256:25488f8663dd1528ae1f54f94ac1ea51ae25b4d531539b8bc707fed184d16845", size = 47190, upload-time = "2025-04-18T17:29:42.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/75/e0e10dc7ed1408c28e03a6cb2d7a407f99320eb953f229d008a7a6d05546/aniso8601-10.0.1-py2.py3-none-any.whl", hash = "sha256:eb19717fd4e0db6de1aab06f12450ab92144246b257423fe020af5748c0cb89e", size = 52848, upload-time = "2025-04-18T17:29:41.492Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/72/5562aabb8dd7181e8e860622a38bea08d17842b99ecd4c91f84ac95251b0/anyio-4.14.1.tar.gz", hash = "sha256:8d648a3544c1a700e3ff78615cd679e4c5c3f149904287e73687b2596963629e", size = 254831, upload-time = "2026-06-24T20:56:06.017Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/7b/90df4a0a816d98d6ea26f559d87836d494a2cf1fcf063be67df50a7bcc30/anyio-4.14.1-py3-none-any.whl", hash = "sha256:4e5533c5b8ff0a24f5d7a176cbe6877129cd183893f66b537f8f227d10527d72", size = 124875, upload-time = "2026-06-24T20:56:04.413Z" }, +] + +[[package]] +name = "argparse" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/dd/e617cfc3f6210ae183374cd9f6a26b20514bbb5a792af97949c5aacddf0f/argparse-1.4.0.tar.gz", hash = "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4", size = 70508, upload-time = "2015-09-12T20:22:16.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/94/3af39d34be01a24a6e65433d19e107099374224905f1e0cc6bbe1fd22a2f/argparse-1.4.0-py2.py3-none-any.whl", hash = "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314", size = 23000, upload-time = "2015-09-14T16:03:16.137Z" }, +] + +[[package]] +name = "asgiref" +version = "3.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/40/f03da1264ae8f7cfdbf9146542e5e7e8100a4c66ab48e791df9a03d3f6c0/asgiref-3.11.1.tar.gz", hash = "sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce", size = 38550, upload-time = "2026-02-03T13:30:14.33Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/0a/a72d10ed65068e115044937873362e6e32fab1b7dce0046aeb224682c989/asgiref-3.11.1-py3-none-any.whl", hash = "sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133", size = 24345, upload-time = "2026-02-03T13:30:13.039Z" }, +] + +[[package]] +name = "astroid" +version = "3.3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/74/dfb75f9ccd592bbedb175d4a32fc643cf569d7c218508bfbd6ea7ef9c091/astroid-3.3.11.tar.gz", hash = "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce", size = 400439, upload-time = "2025-07-13T18:04:23.177Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/0f/3b8fdc946b4d9cc8cc1e8af42c4e409468c84441b933d037e101b3d72d86/astroid-3.3.11-py3-none-any.whl", hash = "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec", size = 275612, upload-time = "2025-07-13T18:04:21.07Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "bcrypt" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/36/3329e2518d70ad8e2e5817d5a4cac6bba05a47767ec416c7d020a965f408/bcrypt-5.0.0.tar.gz", hash = "sha256:f748f7c2d6fd375cc93d3fba7ef4a9e3a092421b8dbf34d8d4dc06be9492dfdd", size = 25386, upload-time = "2025-09-25T19:50:47.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/85/3e65e01985fddf25b64ca67275bb5bdb4040bd1a53b66d355c6c37c8a680/bcrypt-5.0.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f3c08197f3039bec79cee59a606d62b96b16669cff3949f21e74796b6e3cd2be", size = 481806, upload-time = "2025-09-25T19:49:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/44/dc/01eb79f12b177017a726cbf78330eb0eb442fae0e7b3dfd84ea2849552f3/bcrypt-5.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:200af71bc25f22006f4069060c88ed36f8aa4ff7f53e67ff04d2ab3f1e79a5b2", size = 268626, upload-time = "2025-09-25T19:49:06.723Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cf/e82388ad5959c40d6afd94fb4743cc077129d45b952d46bdc3180310e2df/bcrypt-5.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:baade0a5657654c2984468efb7d6c110db87ea63ef5a4b54732e7e337253e44f", size = 271853, upload-time = "2025-09-25T19:49:08.028Z" }, + { url = "https://files.pythonhosted.org/packages/ec/86/7134b9dae7cf0efa85671651341f6afa695857fae172615e960fb6a466fa/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c58b56cdfb03202b3bcc9fd8daee8e8e9b6d7e3163aa97c631dfcfcc24d36c86", size = 269793, upload-time = "2025-09-25T19:49:09.727Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/6296688ac1b9e503d034e7d0614d56e80c5d1a08402ff856a4549cb59207/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bfd2a34de661f34d0bda43c3e4e79df586e4716ef401fe31ea39d69d581ef23", size = 289930, upload-time = "2025-09-25T19:49:11.204Z" }, + { url = "https://files.pythonhosted.org/packages/d1/18/884a44aa47f2a3b88dd09bc05a1e40b57878ecd111d17e5bba6f09f8bb77/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ed2e1365e31fc73f1825fa830f1c8f8917ca1b3ca6185773b349c20fd606cec2", size = 272194, upload-time = "2025-09-25T19:49:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/0e/8f/371a3ab33c6982070b674f1788e05b656cfbf5685894acbfef0c65483a59/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:83e787d7a84dbbfba6f250dd7a5efd689e935f03dd83b0f919d39349e1f23f83", size = 269381, upload-time = "2025-09-25T19:49:14.308Z" }, + { url = "https://files.pythonhosted.org/packages/b1/34/7e4e6abb7a8778db6422e88b1f06eb07c47682313997ee8a8f9352e5a6f1/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:137c5156524328a24b9fac1cb5db0ba618bc97d11970b39184c1d87dc4bf1746", size = 271750, upload-time = "2025-09-25T19:49:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1b/54f416be2499bd72123c70d98d36c6cd61a4e33d9b89562c22481c81bb30/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:38cac74101777a6a7d3b3e3cfefa57089b5ada650dce2baf0cbdd9d65db22a9e", size = 303757, upload-time = "2025-09-25T19:49:17.244Z" }, + { url = "https://files.pythonhosted.org/packages/13/62/062c24c7bcf9d2826a1a843d0d605c65a755bc98002923d01fd61270705a/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d8d65b564ec849643d9f7ea05c6d9f0cd7ca23bdd4ac0c2dbef1104ab504543d", size = 306740, upload-time = "2025-09-25T19:49:18.693Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/1fdbfc8c0f20875b6b4020f3c7dc447b8de60aa0be5faaf009d24242aec9/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:741449132f64b3524e95cd30e5cd3343006ce146088f074f31ab26b94e6c75ba", size = 334197, upload-time = "2025-09-25T19:49:20.523Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c1/8b84545382d75bef226fbc6588af0f7b7d095f7cd6a670b42a86243183cd/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:212139484ab3207b1f0c00633d3be92fef3c5f0af17cad155679d03ff2ee1e41", size = 352974, upload-time = "2025-09-25T19:49:22.254Z" }, + { url = "https://files.pythonhosted.org/packages/10/a6/ffb49d4254ed085e62e3e5dd05982b4393e32fe1e49bb1130186617c29cd/bcrypt-5.0.0-cp313-cp313t-win32.whl", hash = "sha256:9d52ed507c2488eddd6a95bccee4e808d3234fa78dd370e24bac65a21212b861", size = 148498, upload-time = "2025-09-25T19:49:24.134Z" }, + { url = "https://files.pythonhosted.org/packages/48/a9/259559edc85258b6d5fc5471a62a3299a6aa37a6611a169756bf4689323c/bcrypt-5.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f6984a24db30548fd39a44360532898c33528b74aedf81c26cf29c51ee47057e", size = 145853, upload-time = "2025-09-25T19:49:25.702Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/9714173403c7e8b245acf8e4be8876aac64a209d1b392af457c79e60492e/bcrypt-5.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9fffdb387abe6aa775af36ef16f55e318dcda4194ddbf82007a6f21da29de8f5", size = 139626, upload-time = "2025-09-25T19:49:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/f8/14/c18006f91816606a4abe294ccc5d1e6f0e42304df5a33710e9e8e95416e1/bcrypt-5.0.0-cp314-cp314t-macosx_10_12_universal2.whl", hash = "sha256:4870a52610537037adb382444fefd3706d96d663ac44cbb2f37e3919dca3d7ef", size = 481862, upload-time = "2025-09-25T19:49:28.365Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/dd074d831f00e589537e07a0725cf0e220d1f0d5d8e85ad5bbff251c45aa/bcrypt-5.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48f753100931605686f74e27a7b49238122aa761a9aefe9373265b8b7aa43ea4", size = 268544, upload-time = "2025-09-25T19:49:30.39Z" }, + { url = "https://files.pythonhosted.org/packages/f5/91/50ccba088b8c474545b034a1424d05195d9fcbaaf802ab8bfe2be5a4e0d7/bcrypt-5.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f70aadb7a809305226daedf75d90379c397b094755a710d7014b8b117df1ebbf", size = 271787, upload-time = "2025-09-25T19:49:32.144Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e7/d7dba133e02abcda3b52087a7eea8c0d4f64d3e593b4fffc10c31b7061f3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:744d3c6b164caa658adcb72cb8cc9ad9b4b75c7db507ab4bc2480474a51989da", size = 269753, upload-time = "2025-09-25T19:49:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/33/fc/5b145673c4b8d01018307b5c2c1fc87a6f5a436f0ad56607aee389de8ee3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a28bc05039bdf3289d757f49d616ab3efe8cf40d8e8001ccdd621cd4f98f4fc9", size = 289587, upload-time = "2025-09-25T19:49:35.144Z" }, + { url = "https://files.pythonhosted.org/packages/27/d7/1ff22703ec6d4f90e62f1a5654b8867ef96bafb8e8102c2288333e1a6ca6/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7f277a4b3390ab4bebe597800a90da0edae882c6196d3038a73adf446c4f969f", size = 272178, upload-time = "2025-09-25T19:49:36.793Z" }, + { url = "https://files.pythonhosted.org/packages/c8/88/815b6d558a1e4d40ece04a2f84865b0fef233513bd85fd0e40c294272d62/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:79cfa161eda8d2ddf29acad370356b47f02387153b11d46042e93a0a95127493", size = 269295, upload-time = "2025-09-25T19:49:38.164Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/e0db387c79ab4931fc89827d37608c31cc57b6edc08ccd2386139028dc0d/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a5393eae5722bcef046a990b84dff02b954904c36a194f6cfc817d7dca6c6f0b", size = 271700, upload-time = "2025-09-25T19:49:39.917Z" }, + { url = "https://files.pythonhosted.org/packages/06/83/1570edddd150f572dbe9fc00f6203a89fc7d4226821f67328a85c330f239/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f4c94dec1b5ab5d522750cb059bb9409ea8872d4494fd152b53cca99f1ddd8c", size = 334034, upload-time = "2025-09-25T19:49:41.227Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/ea64e51a65e56ae7a8a4ec236c2bfbdd4b23008abd50ac33fbb2d1d15424/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0cae4cb350934dfd74c020525eeae0a5f79257e8a201c0c176f4b84fdbf2a4b4", size = 352766, upload-time = "2025-09-25T19:49:43.08Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d4/1a388d21ee66876f27d1a1f41287897d0c0f1712ef97d395d708ba93004c/bcrypt-5.0.0-cp314-cp314t-win32.whl", hash = "sha256:b17366316c654e1ad0306a6858e189fc835eca39f7eb2cafd6aaca8ce0c40a2e", size = 152449, upload-time = "2025-09-25T19:49:44.971Z" }, + { url = "https://files.pythonhosted.org/packages/3f/61/3291c2243ae0229e5bca5d19f4032cecad5dfb05a2557169d3a69dc0ba91/bcrypt-5.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:92864f54fb48b4c718fc92a32825d0e42265a627f956bc0361fe869f1adc3e7d", size = 149310, upload-time = "2025-09-25T19:49:46.162Z" }, + { url = "https://files.pythonhosted.org/packages/3e/89/4b01c52ae0c1a681d4021e5dd3e45b111a8fb47254a274fa9a378d8d834b/bcrypt-5.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dd19cf5184a90c873009244586396a6a884d591a5323f0e8a5922560718d4993", size = 143761, upload-time = "2025-09-25T19:49:47.345Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/6237f151fbfe295fe3e074ecc6d44228faa1e842a81f6d34a02937ee1736/bcrypt-5.0.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b", size = 494553, upload-time = "2025-09-25T19:49:49.006Z" }, + { url = "https://files.pythonhosted.org/packages/45/b6/4c1205dde5e464ea3bd88e8742e19f899c16fa8916fb8510a851fae985b5/bcrypt-5.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c2388ca94ffee269b6038d48747f4ce8df0ffbea43f31abfa18ac72f0218effb", size = 275009, upload-time = "2025-09-25T19:49:50.581Z" }, + { url = "https://files.pythonhosted.org/packages/3b/71/427945e6ead72ccffe77894b2655b695ccf14ae1866cd977e185d606dd2f/bcrypt-5.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:560ddb6ec730386e7b3b26b8b4c88197aaed924430e7b74666a586ac997249ef", size = 278029, upload-time = "2025-09-25T19:49:52.533Z" }, + { url = "https://files.pythonhosted.org/packages/17/72/c344825e3b83c5389a369c8a8e58ffe1480b8a699f46c127c34580c4666b/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d79e5c65dcc9af213594d6f7f1fa2c98ad3fc10431e7aa53c176b441943efbdd", size = 275907, upload-time = "2025-09-25T19:49:54.709Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7e/d4e47d2df1641a36d1212e5c0514f5291e1a956a7749f1e595c07a972038/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2b732e7d388fa22d48920baa267ba5d97cca38070b69c0e2d37087b381c681fd", size = 296500, upload-time = "2025-09-25T19:49:56.013Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c3/0ae57a68be2039287ec28bc463b82e4b8dc23f9d12c0be331f4782e19108/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0c8e093ea2532601a6f686edbc2c6b2ec24131ff5c52f7610dd64fa4553b5464", size = 278412, upload-time = "2025-09-25T19:49:57.356Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/77424511adb11e6a99e3a00dcc7745034bee89036ad7d7e255a7e47be7d8/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5b1589f4839a0899c146e8892efe320c0fa096568abd9b95593efac50a87cb75", size = 275486, upload-time = "2025-09-25T19:49:59.116Z" }, + { url = "https://files.pythonhosted.org/packages/43/0a/405c753f6158e0f3f14b00b462d8bca31296f7ecfc8fc8bc7919c0c7d73a/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:89042e61b5e808b67daf24a434d89bab164d4de1746b37a8d173b6b14f3db9ff", size = 277940, upload-time = "2025-09-25T19:50:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/62/83/b3efc285d4aadc1fa83db385ec64dcfa1707e890eb42f03b127d66ac1b7b/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e3cf5b2560c7b5a142286f69bde914494b6d8f901aaa71e453078388a50881c4", size = 310776, upload-time = "2025-09-25T19:50:02.393Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/47ee337dacecde6d234890fe929936cb03ebc4c3a7460854bbd9c97780b8/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f632fd56fc4e61564f78b46a2269153122db34988e78b6be8b32d28507b7eaeb", size = 312922, upload-time = "2025-09-25T19:50:04.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/3a/43d494dfb728f55f4e1cf8fd435d50c16a2d75493225b54c8d06122523c6/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:801cad5ccb6b87d1b430f183269b94c24f248dddbbc5c1f78b6ed231743e001c", size = 341367, upload-time = "2025-09-25T19:50:05.559Z" }, + { url = "https://files.pythonhosted.org/packages/55/ab/a0727a4547e383e2e22a630e0f908113db37904f58719dc48d4622139b5c/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3cf67a804fc66fc217e6914a5635000259fbbbb12e78a99488e4d5ba445a71eb", size = 359187, upload-time = "2025-09-25T19:50:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bb/461f352fdca663524b4643d8b09e8435b4990f17fbf4fea6bc2a90aa0cc7/bcrypt-5.0.0-cp38-abi3-win32.whl", hash = "sha256:3abeb543874b2c0524ff40c57a4e14e5d3a66ff33fb423529c88f180fd756538", size = 153752, upload-time = "2025-09-25T19:50:08.515Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/4190e60921927b7056820291f56fc57d00d04757c8b316b2d3c0d1d6da2c/bcrypt-5.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:35a77ec55b541e5e583eb3436ffbbf53b0ffa1fa16ca6782279daf95d146dcd9", size = 150881, upload-time = "2025-09-25T19:50:09.742Z" }, + { url = "https://files.pythonhosted.org/packages/54/12/cd77221719d0b39ac0b55dbd39358db1cd1246e0282e104366ebbfb8266a/bcrypt-5.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:cde08734f12c6a4e28dc6755cd11d3bdfea608d93d958fffbe95a7026ebe4980", size = 144931, upload-time = "2025-09-25T19:50:11.016Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/2af136406e1c3839aea9ecadc2f6be2bcd1eff255bd451dd39bcf302c47a/bcrypt-5.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0c418ca99fd47e9c59a301744d63328f17798b5947b0f791e9af3c1c499c2d0a", size = 495313, upload-time = "2025-09-25T19:50:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ee/2f4985dbad090ace5ad1f7dd8ff94477fe089b5fab2040bd784a3d5f187b/bcrypt-5.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddb4e1500f6efdd402218ffe34d040a1196c072e07929b9820f363a1fd1f4191", size = 275290, upload-time = "2025-09-25T19:50:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/b77ade812672d15cf50842e167eead80ac3514f3beacac8902915417f8b7/bcrypt-5.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7aeef54b60ceddb6f30ee3db090351ecf0d40ec6e2abf41430997407a46d2254", size = 278253, upload-time = "2025-09-25T19:50:15.089Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/ed00ed32f1040f7990dac7115f82273e3c03da1e1a1587a778d8cea496d8/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f0ce778135f60799d89c9693b9b398819d15f1921ba15fe719acb3178215a7db", size = 276084, upload-time = "2025-09-25T19:50:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fa6e16145e145e87f1fa351bbd54b429354fd72145cd3d4e0c5157cf4c70/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a71f70ee269671460b37a449f5ff26982a6f2ba493b3eabdd687b4bf35f875ac", size = 297185, upload-time = "2025-09-25T19:50:18.525Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/11f8a31d8b67cca3371e046db49baa7c0594d71eb40ac8121e2fc0888db0/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822", size = 278656, upload-time = "2025-09-25T19:50:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/ac/31/79f11865f8078e192847d2cb526e3fa27c200933c982c5b2869720fa5fce/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:edfcdcedd0d0f05850c52ba3127b1fce70b9f89e0fe5ff16517df7e81fa3cbb8", size = 275662, upload-time = "2025-09-25T19:50:21.567Z" }, + { url = "https://files.pythonhosted.org/packages/d4/8d/5e43d9584b3b3591a6f9b68f755a4da879a59712981ef5ad2a0ac1379f7a/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:611f0a17aa4a25a69362dcc299fda5c8a3d4f160e2abb3831041feb77393a14a", size = 278240, upload-time = "2025-09-25T19:50:23.305Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/44590e3fc158620f680a978aafe8f87a4c4320da81ed11552f0323aa9a57/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:db99dca3b1fdc3db87d7c57eac0c82281242d1eabf19dcb8a6b10eb29a2e72d1", size = 311152, upload-time = "2025-09-25T19:50:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/e4fbfc46f14f47b0d20493669a625da5827d07e8a88ee460af6cd9768b44/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5feebf85a9cefda32966d8171f5db7e3ba964b77fdfe31919622256f80f9cf42", size = 313284, upload-time = "2025-09-25T19:50:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/25/ae/479f81d3f4594456a01ea2f05b132a519eff9ab5768a70430fa1132384b1/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3ca8a166b1140436e058298a34d88032ab62f15aae1c598580333dc21d27ef10", size = 341643, upload-time = "2025-09-25T19:50:28.02Z" }, + { url = "https://files.pythonhosted.org/packages/df/d2/36a086dee1473b14276cd6ea7f61aef3b2648710b5d7f1c9e032c29b859f/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:61afc381250c3182d9078551e3ac3a41da14154fbff647ddf52a769f588c4172", size = 359698, upload-time = "2025-09-25T19:50:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f6/688d2cd64bfd0b14d805ddb8a565e11ca1fb0fd6817175d58b10052b6d88/bcrypt-5.0.0-cp39-abi3-win32.whl", hash = "sha256:64d7ce196203e468c457c37ec22390f1a61c85c6f0b8160fd752940ccfb3a683", size = 153725, upload-time = "2025-09-25T19:50:34.384Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/9d9a641194a730bda138b3dfe53f584d61c58cd5230e37566e83ec2ffa0d/bcrypt-5.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:64ee8434b0da054d830fa8e89e1c8bf30061d539044a39524ff7dec90481e5c2", size = 150912, upload-time = "2025-09-25T19:50:35.69Z" }, + { url = "https://files.pythonhosted.org/packages/27/44/d2ef5e87509158ad2187f4dd0852df80695bb1ee0cfe0a684727b01a69e0/bcrypt-5.0.0-cp39-abi3-win_arm64.whl", hash = "sha256:f2347d3534e76bf50bca5500989d6c1d05ed64b440408057a37673282c654927", size = 144953, upload-time = "2025-09-25T19:50:37.32Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924, upload-time = "2026-06-07T16:44:21.566Z" }, +] + +[[package]] +name = "billiard" +version = "4.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/23/b12ac0bcdfb7360d664f40a00b1bda139cbbbced012c34e375506dbd0143/billiard-4.2.4.tar.gz", hash = "sha256:55f542c371209e03cd5862299b74e52e4fbcba8250ba611ad94276b369b6a85f", size = 156537, upload-time = "2025-11-30T13:28:48.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/87/8bab77b323f16d67be364031220069f79159117dd5e43eeb4be2fef1ac9b/billiard-4.2.4-py3-none-any.whl", hash = "sha256:525b42bdec68d2b983347ac312f892db930858495db601b5836ac24e6477cde5", size = 87070, upload-time = "2025-11-30T13:28:47.016Z" }, +] + +[[package]] +name = "bleach" +version = "6.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/3c/e12ac860709702bd5ebeb9b56a4fe334f1001246ee1b8f2b7ee28912df7d/bleach-6.4.0.tar.gz", hash = "sha256:4202482733d85cedd04e59fcb2f89f4e4c7c385a78d3c3c23c30446843a37452", size = 204857, upload-time = "2026-06-05T13:01:13.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/9d/40b6267367182187139a4000b82a3b287d84d745bccd808e75d916920e9d/bleach-6.4.0-py3-none-any.whl", hash = "sha256:4b6b6a54fff2e69a3dde9d21cc6301220bee3c3cb792187d11403fd795031081", size = 165109, upload-time = "2026-06-05T13:01:12.504Z" }, +] + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, +] + +[[package]] +name = "build" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/21/6ec54248b4d0d51f12f3ca4aa77a128077d747a5db86cb5a2fcd9aedecbd/build-1.5.1.tar.gz", hash = "sha256:94e17f1db803ab22f46049376c44c8437c52090f0dfdf1adc43df56542d644fb", size = 112439, upload-time = "2026-07-09T06:21:59.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/f7/2c3f99ff9282f1c1ec9f6298f2c03034658a0901eeacb3b3501cb488574c/build-1.5.1-py3-none-any.whl", hash = "sha256:f1a58fe2e5af5b0238a07b9e70207492c79ddebbdb1ad954fc86d62a56be3e0d", size = 31195, upload-time = "2026-07-09T06:21:58.551Z" }, +] + +[[package]] +name = "cachecontrol" +version = "0.14.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "msgpack" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/f6/c972b32d80760fb79d6b9eeb0b3010a46b89c0b23cf6329417ff7886cd22/cachecontrol-0.14.4.tar.gz", hash = "sha256:e6220afafa4c22a47dd0badb319f84475d79108100d04e26e8542ef7d3ab05a1", size = 16150, upload-time = "2025-11-14T04:32:13.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/79/c45f2d53efe6ada1110cf6f9fca095e4ff47a0454444aefdde6ac4789179/cachecontrol-0.14.4-py3-none-any.whl", hash = "sha256:b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b", size = 22247, upload-time = "2025-11-14T04:32:11.733Z" }, +] + +[[package]] +name = "cachetools" +version = "7.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/8b/0d3945a13955303b81272f759a0331e54c5c793da455e6f5706b89d2639c/cachetools-7.1.4.tar.gz", hash = "sha256:437f55a4e0c1b01a4f3077cc470e6991d47430970e36fbcb77e2be0df4fc1cd6", size = 40085, upload-time = "2026-05-21T22:40:43.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/7b/1fc1c09cc0756cf25861a3be10565915953876da48bb228fb9a672b20a42/cachetools-7.1.4-py3-none-any.whl", hash = "sha256:323dc4127934744db5b54eb4924482d7edafbf9554e820d1531c2e08c0e4ef54", size = 16761, upload-time = "2026-05-21T22:40:41.845Z" }, +] + +[[package]] +name = "celery" +version = "5.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "billiard" }, + { name = "click" }, + { name = "click-didyoumean" }, + { name = "click-plugins" }, + { name = "click-repl" }, + { name = "kombu" }, + { name = "python-dateutil" }, + { name = "tzlocal" }, + { name = "vine" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/b4/a1233943ab5c8ea05fb877a88a0a0622bf47444b99e4991a8045ac37ea1d/celery-5.6.3.tar.gz", hash = "sha256:177006bd2054b882e9f01be59abd8529e88879ef50d7918a7050c5a9f4e12912", size = 1742243, upload-time = "2026-03-26T12:14:51.76Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/c9/6eccdda96e098f7ae843162db2d3c149c6931a24fda69fe4ab84d0027eb5/celery-5.6.3-py3-none-any.whl", hash = "sha256:0808f42f80909c4d5833202360ffafb2a4f83f4d8e23e1285d926610e9a7afa6", size = 451235, upload-time = "2026-03-26T12:14:49.491Z" }, +] + +[[package]] +name = "certifi" +version = "2026.6.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/85/990925db5df586ec90beb97529c853497e7f85ba0234830447faf41c3057/cffi-2.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f", size = 184829, upload-time = "2026-07-06T21:32:44.324Z" }, + { url = "https://files.pythonhosted.org/packages/4b/92/e7bb136ad6b5352603732cf907ef862ca103f20f2031c1735a46300c20c9/cffi-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde", size = 184728, upload-time = "2026-07-06T21:32:45.683Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c0/d1ec30ffb370f748f2fb54425972bfef9871e0132e82fb589c46b6676049/cffi-2.1.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d", size = 214815, upload-time = "2026-07-06T21:32:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/1b/dc/5620cf930688be01f2d673804291de757a934c90b946dbdc3d84130c2ea4/cffi-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7", size = 222429, upload-time = "2026-07-06T21:32:49.848Z" }, + { url = "https://files.pythonhosted.org/packages/4b/a4/77b53abbf7a1e0beb9637edbef2a94d15f9c822f591e85d439ffd91519a6/cffi-2.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b", size = 210315, upload-time = "2026-07-06T21:32:51.221Z" }, + { url = "https://files.pythonhosted.org/packages/58/0c/f528df19cc94b675087324d4760d9e6d5bfae97d6217aa4fac43de4f5fcc/cffi-2.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7", size = 208859, upload-time = "2026-07-06T21:32:52.512Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/c9522a81c32132799a1972c39f5c5f8b4c8b9f00488a23feaa6c06f07741/cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66", size = 221844, upload-time = "2026-07-06T21:32:53.704Z" }, + { url = "https://files.pythonhosted.org/packages/6e/28/bd53988b9833e8f8ad539d26f4c07a6b3f6bcb1e9e02e7ca038250b3428d/cffi-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe", size = 225287, upload-time = "2026-07-06T21:32:54.907Z" }, + { url = "https://files.pythonhosted.org/packages/79/99/0d0fd37f055224085f42bbb2c022d002e17dde4a97972822327b07d84101/cffi-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b", size = 223681, upload-time = "2026-07-06T21:32:56.329Z" }, + { url = "https://files.pythonhosted.org/packages/b0/80/c138990aa2a70b1a269f6e06348729836d733d6f970867943f61d367f8cc/cffi-2.1.0-cp312-cp312-win32.whl", hash = "sha256:9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a", size = 175269, upload-time = "2026-07-06T21:32:57.777Z" }, + { url = "https://files.pythonhosted.org/packages/a8/eb/f636456ff21a83fc13c032b58cc5dde061691546ac79efa284b2989b7982/cffi-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384", size = 185881, upload-time = "2026-07-06T21:32:59.253Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/400ea43e721727dca8a65c4521390e9196757caba4a45643acb2b63271b8/cffi-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6", size = 180088, upload-time = "2026-07-06T21:33:02.278Z" }, + { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331, upload-time = "2026-07-06T21:33:03.697Z" }, + { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966, upload-time = "2026-07-06T21:33:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a", size = 184795, upload-time = "2026-07-06T21:33:06.699Z" }, + { url = "https://files.pythonhosted.org/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea", size = 184746, upload-time = "2026-07-06T21:33:08.071Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747, upload-time = "2026-07-06T21:33:09.671Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392, upload-time = "2026-07-06T21:33:10.896Z" }, + { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285, upload-time = "2026-07-06T21:33:12.251Z" }, + { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801, upload-time = "2026-07-06T21:33:13.617Z" }, + { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808, upload-time = "2026-07-06T21:33:15.466Z" }, + { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241, upload-time = "2026-07-06T21:33:16.869Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588, upload-time = "2026-07-06T21:33:18.239Z" }, + { url = "https://files.pythonhosted.org/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", hash = "sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2", size = 175248, upload-time = "2026-07-06T21:33:19.799Z" }, + { url = "https://files.pythonhosted.org/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512", size = 185717, upload-time = "2026-07-06T21:33:21.47Z" }, + { url = "https://files.pythonhosted.org/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f", size = 180114, upload-time = "2026-07-06T21:33:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f0/81478e482afa03f6d18dc8f2afb5edc45b3080853b634b5ed91961be0998/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a", size = 194142, upload-time = "2026-07-06T21:33:23.657Z" }, + { url = "https://files.pythonhosted.org/packages/7d/95/8de304305cd9204974b0ca051b86d307cafca13aa575a0ef1b44d92c0d8c/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3", size = 196819, upload-time = "2026-07-06T21:33:25.007Z" }, + { url = "https://files.pythonhosted.org/packages/20/71/7c8372d30e42415602ed9f268f7cfd66f1b855fed881ecd168bcb45dbc0b/cffi-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d", size = 184965, upload-time = "2026-07-06T21:33:26.605Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5c/584e626835f0375c928176c04137c96927165cb8733cdb3150ec04e5ee5e/cffi-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac", size = 184952, upload-time = "2026-07-06T21:33:27.823Z" }, + { url = "https://files.pythonhosted.org/packages/2e/d2/065fcae1c73979fac8e054462478d0ff8a29c40cdc2ed7ea5676a061df53/cffi-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6", size = 222353, upload-time = "2026-07-06T21:33:29.178Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a5/e8bbb1ce5b3ac2f53ad6a10bde44318a5a8d99d4f4a000d44a6e39aeb3e4/cffi-2.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913", size = 210051, upload-time = "2026-07-06T21:33:30.534Z" }, + { url = "https://files.pythonhosted.org/packages/28/ed/c127d3ac36e899c965e3361357c3befacd6578c03f40125183e41c3b219e/cffi-2.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d", size = 208630, upload-time = "2026-07-06T21:33:31.753Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d7/97d3136f81db489ec8d1d67748c110d6c994268fd7528014aa9f2b085e4e/cffi-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5", size = 221593, upload-time = "2026-07-06T21:33:33.044Z" }, + { url = "https://files.pythonhosted.org/packages/d3/27/93195977168ee63aed233a1a0993a2178798654d1f4bddcdd321d6fd3b21/cffi-2.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce", size = 225146, upload-time = "2026-07-06T21:33:34.224Z" }, + { url = "https://files.pythonhosted.org/packages/b3/c1/6dbd291ee2ae5a50a034aa057207081f545923bbf15dad4511e985aafff5/cffi-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326", size = 223240, upload-time = "2026-07-06T21:33:35.57Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/ade5ce9863a57992a6ea3d0d10d7e29b8749fc127204b3d493d667b2815f/cffi-2.1.0-cp314-cp314-win32.whl", hash = "sha256:1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd", size = 177723, upload-time = "2026-07-06T21:33:51.626Z" }, + { url = "https://files.pythonhosted.org/packages/41/de/92b9eeed4ae4a21d6fd9b2a2c8505cbed573299902ea73981cc13f7ff62c/cffi-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb", size = 187937, upload-time = "2026-07-06T21:33:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1a/cc6ae6c2913a03aab8898eee57963cf1035b8df5872ed8b9115fcc7e2be8/cffi-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804", size = 183001, upload-time = "2026-07-06T21:33:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/14/f0/134c00ce0779ec86dea2aa1aac69339c2741a8045072676763512363a2ea/cffi-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714", size = 188538, upload-time = "2026-07-06T21:33:36.792Z" }, + { url = "https://files.pythonhosted.org/packages/50/d8/3b86aba791cb610d24e8a3e1b2cd529e71fa15096b04e4d4e360049d4a4c/cffi-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376", size = 188230, upload-time = "2026-07-06T21:33:38.011Z" }, + { url = "https://files.pythonhosted.org/packages/14/d0/117dcd9209255ad8571fbc8c92ef32593a1d294dcec91ddc4e4db50606f2/cffi-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98", size = 223899, upload-time = "2026-07-06T21:33:39.514Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3d/f20f8b886b254e3ad10e15cd4186d3aed49f3e6a35ab37aab9f8f25f7c03/cffi-2.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13", size = 211652, upload-time = "2026-07-06T21:33:40.851Z" }, + { url = "https://files.pythonhosted.org/packages/28/3b/fad54de07260b93ddeef4b96d0131d57ea900675df1d410ae1deee52d7a6/cffi-2.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d", size = 210755, upload-time = "2026-07-06T21:33:42.183Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/3d5c705acb7abbba9bbd7d79b8e62e0f25b6120eb7ae6ac49f1b721722fe/cffi-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056", size = 223933, upload-time = "2026-07-06T21:33:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d0/47e338384ab6b1004241002fa616301020cea4fc95f283506565d252f276/cffi-2.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4", size = 226749, upload-time = "2026-07-06T21:33:45.046Z" }, + { url = "https://files.pythonhosted.org/packages/70/25/65bd5b58ea4bfdfc15cde02cb5365f89ef8ab8b2adfb8fe5c4bd4233382f/cffi-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94", size = 225703, upload-time = "2026-07-06T21:33:46.374Z" }, + { url = "https://files.pythonhosted.org/packages/dc/78/aa01ac599a8a4322533d45a1f9bc93b338276d2d59dabbe7c6d92a775c81/cffi-2.1.0-cp314-cp314t-win32.whl", hash = "sha256:7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76", size = 182857, upload-time = "2026-07-06T21:33:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/b9/26/d00496b22de4d4228f32dde94ad996f350c8aad676d63bcca0743c8dea4d/cffi-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5", size = 194065, upload-time = "2026-07-06T21:33:48.953Z" }, + { url = "https://files.pythonhosted.org/packages/d5/dd/0c7dbf815a579ff005008a2d815a55d6bb047c349eef536d9dc53d3f0a8d/cffi-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8", size = 186404, upload-time = "2026-07-06T21:33:50.309Z" }, + { url = "https://files.pythonhosted.org/packages/55/c7/8c8c50cb11c6750051daf12164098a9a6f027ac4356967fd4d800a07f242/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c", size = 194121, upload-time = "2026-07-06T21:33:56.109Z" }, + { url = "https://files.pythonhosted.org/packages/99/e2/67680bf19a6b60d2bb7ff83baefa2a4c3d2d7dc0f3277034b802e1fc504c/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001", size = 196820, upload-time = "2026-07-06T21:33:57.288Z" }, + { url = "https://files.pythonhosted.org/packages/ed/da/4bbe583a3b3a5c8c60892124fe17f3fa3656523faf0d3484eae90f091853/cffi-2.1.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3", size = 184936, upload-time = "2026-07-06T21:33:58.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4b/1f4c36ab273980d7aa75bb126ea4f8971f24a96108acad3a0a084028c57b/cffi-2.1.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc", size = 185045, upload-time = "2026-07-06T21:34:00.085Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c3/ad299dc38f3583f8d916b299f028af418a9ec98bc695fcbebeae7420691c/cffi-2.1.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699", size = 222342, upload-time = "2026-07-06T21:34:01.814Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d8/df4543cc087245044ed02ef3ad8e0a26619d0075ac7a77a12dc81177851b/cffi-2.1.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022", size = 210073, upload-time = "2026-07-06T21:34:03.255Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/fac738d73728c6cea2a88a2883dca54892496cbba88a1dc1f2909cb8a6f5/cffi-2.1.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0", size = 208551, upload-time = "2026-07-06T21:34:04.433Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/0b04a700dd64f465c93020253a793a82c9b4dff9961f48facd0df945d9b8/cffi-2.1.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1", size = 221649, upload-time = "2026-07-06T21:34:06.157Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/b7379a5704c79eda57ce075869ba70a0368d1c850f803b3c0d078d39dcaf/cffi-2.1.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28", size = 225203, upload-time = "2026-07-06T21:34:07.489Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/d5e6c43ea85c41bda2a184a3418f195fe7cf602967a8d2b94e085b83deef/cffi-2.1.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629", size = 223263, upload-time = "2026-07-06T21:34:08.712Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d8/772b8259bf75749adffb1c546828978381fb516f60cf701f6c83daf60c85/cffi-2.1.0-cp315-cp315-win32.whl", hash = "sha256:0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6", size = 177696, upload-time = "2026-07-06T21:34:26.355Z" }, + { url = "https://files.pythonhosted.org/packages/2f/dd/afa2191fc6d57fedd26e5844a2fe2fcc0bbfa00961bbaa5a41e4921e7cca/cffi-2.1.0-cp315-cp315-win_amd64.whl", hash = "sha256:bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853", size = 187914, upload-time = "2026-07-06T21:34:27.58Z" }, + { url = "https://files.pythonhosted.org/packages/05/ef/6cd4f8c671517162379dc79cfae5aea9106bc38abb89628d5c16adf6a838/cffi-2.1.0-cp315-cp315-win_arm64.whl", hash = "sha256:8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda", size = 183004, upload-time = "2026-07-06T21:34:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/11/b6/12fc55092817a5faa26fb8c40c7f9d662e11a46ee248c137aafc42517d92/cffi-2.1.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc", size = 188378, upload-time = "2026-07-06T21:34:09.926Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2e/cdac88979f295fde5daa69622c7d2111e56e7ceb94f211357fbe452339e4/cffi-2.1.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca", size = 188319, upload-time = "2026-07-06T21:34:11.101Z" }, + { url = "https://files.pythonhosted.org/packages/e0/27/1d0b408497e41a74795af122d7b603c418c5fed0171450f899afd04e594f/cffi-2.1.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d", size = 223904, upload-time = "2026-07-06T21:34:12.606Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/e115c985105dd7ffb32444505f18ceb874bb42d992af05d5dced7ecf1980/cffi-2.1.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8", size = 211554, upload-time = "2026-07-06T21:34:13.987Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/9e6e09409336d9e515c58367e7cfcf4f89df06ad25252675595a58eb59d5/cffi-2.1.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd", size = 210795, upload-time = "2026-07-06T21:34:15.972Z" }, + { url = "https://files.pythonhosted.org/packages/19/e5/d3cc82a4a0be7902af279c04181ad038449c096734464a5ae1de3e1401bd/cffi-2.1.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f", size = 223843, upload-time = "2026-07-06T21:34:17.509Z" }, + { url = "https://files.pythonhosted.org/packages/b9/65/b434abc97ce7cecc2c640fde160507c0ecc7e21544b483ba3325d2e2ea17/cffi-2.1.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc", size = 226773, upload-time = "2026-07-06T21:34:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/b5/9f/d4dc66ca651eb1145a133314cda721abf13cfac3d28c4a0402263ae6ad75/cffi-2.1.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9", size = 225719, upload-time = "2026-07-06T21:34:20.576Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/e536c528bc8057496c360c0978559a2dc45653f89dd6151078aa7d8fca1a/cffi-2.1.0-cp315-cp315t-win32.whl", hash = "sha256:cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b", size = 182760, upload-time = "2026-07-06T21:34:22.059Z" }, + { url = "https://files.pythonhosted.org/packages/d3/0b/0ffe8b82d3875bced5fa1e7986a7a46b748262a40ab7f60b475eb9fb1bb3/cffi-2.1.0-cp315-cp315t-win_amd64.whl", hash = "sha256:f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5", size = 193769, upload-time = "2026-07-06T21:34:23.589Z" }, + { url = "https://files.pythonhosted.org/packages/a0/17/1073b53b68c9b5ca6914adf5f8bf55aacc2d3be102418c90700160ea8605/cffi-2.1.0-cp315-cp315t-win_arm64.whl", hash = "sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210", size = 186405, upload-time = "2026-07-06T21:34:24.857Z" }, +] + +[[package]] +name = "chardet" +version = "7.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/b6/9df434a8eeba2e6628c465a1dfa31034228ef79b26f76f46278f4ef7e49d/chardet-7.4.3.tar.gz", hash = "sha256:cc1d4eb92a4ec1c2df3b490836ffa46922e599d34ce0bb75cf41fd2bf6303d56", size = 784800, upload-time = "2026-04-13T21:33:39.803Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/33/29de185079e6675c3f375546e30a559b7ddc75ce972f18d6e566cd9ea4eb/chardet-7.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:75d3c65cc16bddf40b8da1fd25ba84fca5f8070f2b14e86083653c1c85aee971", size = 874870, upload-time = "2026-04-13T21:33:05.977Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2f/4c5af01fd1a7506a1d5375403d68925eac70289229492db5aa68b58103d8/chardet-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:29af5999f654e8729d251f1724a62b538b1262d9292cccaefddf8a02aae1ef6a", size = 854859, upload-time = "2026-04-13T21:33:07.381Z" }, + { url = "https://files.pythonhosted.org/packages/36/21/edb36ad5dfa48d7f8eed97ab43931ecdaa8c15166c21b1d614967e49d681/chardet-7.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:626f00299ad62dfe937058a09572beed442ccc7b58f87aa667949b20fd3db235", size = 875032, upload-time = "2026-04-13T21:33:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/e5/59/a32a241d861cf180853a11c8e5a67641cb1b2af13c3a5ccce83ec07e2c9f/chardet-7.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a4904dd5f071b7a7d7f50b4a67a86db3c902d243bf31708f1d5cde2f68239cb", size = 888283, upload-time = "2026-04-13T21:33:10.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/2e/e1ee6a77abf3782c00e05b89c4d4328c8353bf9500661c4348df1dd68614/chardet-7.4.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5d2879598bc220689e8ce509fe9c3f37ad2fca53a36be9c9bd91abdd91dd364f", size = 879974, upload-time = "2026-04-13T21:33:11.448Z" }, + { url = "https://files.pythonhosted.org/packages/32/60/fca69c534602a7ced04280c952a246ad1edde2a6ca3a164f65d32ac41fe7/chardet-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:4b2799bd58e7245cfa8d4ab2e8ad1d76a5c3a5b1f32318eb6acca4c69a3e7101", size = 943973, upload-time = "2026-04-13T21:33:12.756Z" }, + { url = "https://files.pythonhosted.org/packages/7c/43/79ac9b4db5bc87020c9dbc419125371d80882d1d197e9c4765ba8682b605/chardet-7.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a9e4486df251b8962e86ea9f139ca235aa6e0542a00f7844c9a04160afb99aa9", size = 873769, upload-time = "2026-04-13T21:33:14.002Z" }, + { url = "https://files.pythonhosted.org/packages/55/5f/25bdec773905bff0ff6cf35ca73b17bd05593b4f87bd8c5fa43705f7167d/chardet-7.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4fbff1907925b0c5a1064cffb5e040cd5e338585c9c552625f30de6bc2f3107a", size = 853991, upload-time = "2026-04-13T21:33:15.564Z" }, + { url = "https://files.pythonhosted.org/packages/b4/07/a29380ee0b215d23d77733b5ad60c5c0c7969650e080c667acdf9462040d/chardet-7.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:365135eaf37ba65a828f8e668eb0a8c38c479dcbec724dc25f4dfd781049c357", size = 874024, upload-time = "2026-04-13T21:33:16.915Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b1/3338e121cbd4c8a126b8ccb1061170c2ce51a53f678c502793ea49c6fd6d/chardet-7.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfc134b70c846c21ead8e43ada3ae1a805fff732f6922f8abcf2ff27b8f6493d", size = 887410, upload-time = "2026-04-13T21:33:18.368Z" }, + { url = "https://files.pythonhosted.org/packages/63/1c/44a9a9e0c59c185a5d307ceaeee8768afa1558f0a24f7a4b5fa11b67586b/chardet-7.4.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9acd9988a93e09390f3cd231201ea7166c415eb8da1b735928990ffc05cb9fbb", size = 879269, upload-time = "2026-04-13T21:33:20.377Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b3/5d0e77ea774bd3224321c248880ea0c0379000ac5c2bb6d77609549de247/chardet-7.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:e1b98790c284ff813f18f7cf7de5f05ea2435a080030c7f1a8318f3a4f80b131", size = 944155, upload-time = "2026-04-13T21:33:21.694Z" }, + { url = "https://files.pythonhosted.org/packages/70/a8/bf0811d859e13801279a2ae64f37a408027b282f2047bc0001c75dd356ad/chardet-7.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d892d3dcd652fdef53e3d6327d39b17c0df40a899dfc919abaeb64c974497531", size = 872887, upload-time = "2026-04-13T21:33:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/51/ac/b9d68ebddfe1b02c77af5bf81120e12b036b4432dc6af7a303d90e2bc38b/chardet-7.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:acc46d1b8b7d5783216afe15db56d1c179b9a40e5a1558bc13164c4fd20674c4", size = 853964, upload-time = "2026-04-13T21:33:24.724Z" }, + { url = "https://files.pythonhosted.org/packages/2a/81/17fa103ea9caf5d325a5e4051ab2ba65996fd66baa60b81ee41af1f54e10/chardet-7.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ac3bf11c645734a1701a3804e43eabd98851838192267d08c353a834ab79fea", size = 876006, upload-time = "2026-04-13T21:33:26.098Z" }, + { url = "https://files.pythonhosted.org/packages/c2/20/193faab46a68ea550587331a698c3dca8099f8901d10937c4443135c7ed9/chardet-7.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e3bd9f936e04bae89c254262af08d9e5b98f805175ba1e29d454e6cba3107b7", size = 887680, upload-time = "2026-04-13T21:33:27.49Z" }, + { url = "https://files.pythonhosted.org/packages/40/c6/94a3c673327392652ee8bdea9a45bc8a5f5365197a7387d68f0eed007115/chardet-7.4.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:27cc23da03630cdecc9aa81a895aa86629c211f995cd57651f0fbc280717bf93", size = 879865, upload-time = "2026-04-13T21:33:29.052Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2c/cad8b5e3623a987f3c930b68e2bdd06cfc388cd91cd42ed05f1227701b73/chardet-7.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:b95c934b9ad59e2ba8abb9be49df70d3ad1b0d95d864b9fdb7588d4fa8bd921c", size = 939594, upload-time = "2026-04-13T21:33:31.391Z" }, + { url = "https://files.pythonhosted.org/packages/33/e0/d06e42fd6f02a58e5e227e5106587751cb38adcff0aaf949add744b78b6e/chardet-7.4.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c77867f0c1cb8bd819502249fcdc500364aedb07881e11b743726fa2148e7b6e", size = 889714, upload-time = "2026-04-13T21:33:32.772Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ed/40d091954d48abea037baae6be8fb79905e5f78d34d12ea955132c7d8011/chardet-7.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cf1efeaf65a6ef2f5b9cc3a1df6f08ba2831b369ccaa4c7018eaf90aa757bb11", size = 872319, upload-time = "2026-04-13T21:33:34.427Z" }, + { url = "https://files.pythonhosted.org/packages/bb/77/82a46821dbfbdfe062710d2bf2ede13426304e3567a23c57d919c0c31630/chardet-7.4.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f3504c139a2ad544077dd2d9e412cd08b01786843d76997cd43bb6de311723c", size = 892021, upload-time = "2026-04-13T21:33:35.766Z" }, + { url = "https://files.pythonhosted.org/packages/49/57/42d30c562bda5b4a839766c1aad8d5856b798ad2a1c3247b72a679afec94/chardet-7.4.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457f619882ba66327d4d8d14c6c342269bdb1e4e1c38e8117df941d14d351b04", size = 902509, upload-time = "2026-04-13T21:33:37.096Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6c/0a40afdb50a0fe041ab95553b835a8160b6cf0e81edf2ae2fe9f5224cbf9/chardet-7.4.3-py3-none-any.whl", hash = "sha256:1173b74051570cf08099d7429d92e4882d375ad4217f92a6e5240ccfb26f231e", size = 626562, upload-time = "2026-04-13T21:33:38.559Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/56/10a88e00039537d74bd420f0457c52ab8f58a1af56126e3b9f1b1c8c4724/charset_normalizer-3.4.8.tar.gz", hash = "sha256:d9bf144d6faf12c70d58e47f7512992ae2882b820031d6cef68152deb645bf2d", size = 151790, upload-time = "2026-07-06T15:27:58.477Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/c2/39de60ef5687662f467bed3d1e6944c67a4f0d057141d0404002b8f405ae/charset_normalizer-3.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:faac37c4904598daa00cb4c9b32f3b4cc814fb5f145d7a531ceb4a70f2114132", size = 319040, upload-time = "2026-07-06T15:26:15.854Z" }, + { url = "https://files.pythonhosted.org/packages/a7/57/a9474c3aeaa337c8a330c0dc5df266527d56da3b189c029529f6b08af2a4/charset_normalizer-3.4.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f191c19a32dc6cec0fb8079789d786254653a9ce906fcab04ccd2eed07bba233", size = 215541, upload-time = "2026-07-06T15:26:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/13/a9/be1ff7e81f6e086dced2a7a7a28b789be351d9796084ccaf6136a4ffafb3/charset_normalizer-3.4.8-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05811b76943d477bb90822dedb5c4565cef70148847a59d574e2b35043aeb563", size = 236913, upload-time = "2026-07-06T15:26:18.482Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/d8c5eae93da26d463f9ebe46a4937ca44434dc2937a565b92437befb3d94/charset_normalizer-3.4.8-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3868a3e4ec1e40b419e060d063f93eac6f046fa21426c4816421223ae7dc8ab8", size = 232815, upload-time = "2026-07-06T15:26:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/98e301ca944bcca5e6bc312406b579c8a6d81546c1b494afb3a9478495d6/charset_normalizer-3.4.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25f93d194eb6264c64416cabff46a91f6d99b97e7525a1b4f35c77a99e75cc68", size = 223995, upload-time = "2026-07-06T15:26:20.931Z" }, + { url = "https://files.pythonhosted.org/packages/fa/df/f5222366b76dcb31453a9bd922610c893540d0e729fd390439b0d3e972ee/charset_normalizer-3.4.8-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:ee6a62492f18d432cca031fabd158f400a8c25bf7b9458f50953393a2a23d97a", size = 208522, upload-time = "2026-07-06T15:26:22.214Z" }, + { url = "https://files.pythonhosted.org/packages/74/52/293220d59d8ddfb8aa56836b33bd6df58e70795d8a102a858c2984480f00/charset_normalizer-3.4.8-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c16cb4fc35e4b064f5ee78d849f15a550ada1729c3372916672e38f1f01d1d4", size = 219660, upload-time = "2026-07-06T15:26:23.493Z" }, + { url = "https://files.pythonhosted.org/packages/c3/2c/81a298e66f3d01e61bfc6f7064bbb553b067a9f1d979e5962bf00733069b/charset_normalizer-3.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2fbd0edb0426ab28e70fac9d1d4ef549eb5a64a2521f0428c441d75e4387e6c2", size = 218230, upload-time = "2026-07-06T15:26:24.629Z" }, + { url = "https://files.pythonhosted.org/packages/0d/45/f1dd2328cbc3340705f82072c09bd4c68d6e079191cde05810c1eac77eee/charset_normalizer-3.4.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccb9052771216170015f810b88065fd9e13b1e0b391f92abb9b47e0919a42aad", size = 210006, upload-time = "2026-07-06T15:26:25.837Z" }, + { url = "https://files.pythonhosted.org/packages/38/63/28697000620e117eb413424caaf60b6f98ddb1b09b2c11f7c0038d9936a7/charset_normalizer-3.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3809ba5d3cd02aca0894597f2669a825bdfe2229061515c128b0f4e5533b4ab5", size = 225771, upload-time = "2026-07-06T15:26:27.079Z" }, + { url = "https://files.pythonhosted.org/packages/12/a7/d5844e315f5f35e7938c415f07a1df144eed1cf993f1b43cc16c980c5b46/charset_normalizer-3.4.8-cp312-cp312-win32.whl", hash = "sha256:de63c31666a049f653ada24e800192e3c019e96bc7d70fb449a000bccf26a36f", size = 150922, upload-time = "2026-07-06T15:26:28.514Z" }, + { url = "https://files.pythonhosted.org/packages/9b/82/eb8b72f184b1e4986dd9daec15d7f6d9285a6728d2b07b7f04656829f473/charset_normalizer-3.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:14a4bbe066f3fb05c6ba70e9cf9d34614b57a2fd70ea8c27cc30f34155e16a58", size = 162294, upload-time = "2026-07-06T15:26:29.745Z" }, + { url = "https://files.pythonhosted.org/packages/09/5a/ab810134aa41034a08ffe94c058102016e6ad9bce62f3cdba547b4723385/charset_normalizer-3.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:2b5b0c0dca0a02c3f816f89abf18af3d20416dedbc3d3aa5f3981045f88ae7b0", size = 152409, upload-time = "2026-07-06T15:26:31.034Z" }, + { url = "https://files.pythonhosted.org/packages/11/49/fe5a8572a70cd9cba79f80af9388ac8c5c914ed4459b956f940244e499a5/charset_normalizer-3.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:057f8609f7341618c98e5aa9a6109fa116acff2a658497d47ab3325b5e8f2b08", size = 317424, upload-time = "2026-07-06T15:26:32.23Z" }, + { url = "https://files.pythonhosted.org/packages/e5/59/d71c96616b6825425a876f79f38fa440db30b32cc1166179a839f6259150/charset_normalizer-3.4.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c591f9a82adc5b89a039b90df74e43de2b9177fb46771172bed7b80722a70db0", size = 214723, upload-time = "2026-07-06T15:26:33.635Z" }, + { url = "https://files.pythonhosted.org/packages/c6/35/dc9eeb297f19b7b6ada39709ccb74937e6c51f0947958ae601a977cedd5d/charset_normalizer-3.4.8-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5b56f449132d9adefe55b87635d05177a914ed5d070438a74725e1d77a280002", size = 236200, upload-time = "2026-07-06T15:26:34.99Z" }, + { url = "https://files.pythonhosted.org/packages/0a/37/6775fe852b4acad8bf7e0575fbe8aa9f41b546e33251acbded3c04a6b0d9/charset_normalizer-3.4.8-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1004c3b5831a301dadfb9e916f38e78e2ff3e08db24a1ad7c354db8ee3dea9c3", size = 231740, upload-time = "2026-07-06T15:26:36.498Z" }, + { url = "https://files.pythonhosted.org/packages/e4/28/1bcc3f5f3bac81532384adcfcdd9362c7f46a188a19deacc1ddaf7bdaa00/charset_normalizer-3.4.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60883e22821d17c9e5b4f3ca1ef8074f766e3db28791f851b665929c515635c0", size = 222888, upload-time = "2026-07-06T15:26:38.161Z" }, + { url = "https://files.pythonhosted.org/packages/47/81/9f3993ca62ef090c58059da641e49e3129e74700a6a3beb58436cdb8d4b9/charset_normalizer-3.4.8-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:21e4dbb942c8a6342e2685f232dd2a7bc73465697bd26ead4f118271d28be383", size = 207649, upload-time = "2026-07-06T15:26:39.628Z" }, + { url = "https://files.pythonhosted.org/packages/11/f4/679f636bcbdc2d53d06b1f4039be310450dca95a9f76bbf22f09985556e8/charset_normalizer-3.4.8-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:84bcae14c65e645ca66b661339183d32b8c846a17c96e3e81ab3d346e1c498d4", size = 218908, upload-time = "2026-07-06T15:26:40.911Z" }, + { url = "https://files.pythonhosted.org/packages/7e/44/96e8c81867ba8a45ff893c8e7474c2d6b9633f7aa663da7901d040214d3e/charset_normalizer-3.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b4e4d44b8287aa13a25e16e29393d494b0643b24894f7c8266c6f6788dd36337", size = 217096, upload-time = "2026-07-06T15:26:42.148Z" }, + { url = "https://files.pythonhosted.org/packages/a5/bf/4d53f04f29bdb22601701f4f9f4d038edfb27976c296fcb7400c02736a6e/charset_normalizer-3.4.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f68545d1b267dbfafd5d253b6d1cb161562c4e61ab25b5c4cdb7d9e5923e441e", size = 209355, upload-time = "2026-07-06T15:26:43.557Z" }, + { url = "https://files.pythonhosted.org/packages/ad/60/92b3f630798d777fa880ad289a3f9f2fc663e4b4beb24783c53318820254/charset_normalizer-3.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1936e48214adea74922a20c8ab41b1393ae27cc9e329eb1f0b937d3416824f36", size = 224732, upload-time = "2026-07-06T15:26:44.892Z" }, + { url = "https://files.pythonhosted.org/packages/bd/85/eafa0a3c7bb6fe9f02f4c7901f02071933cac85ee634197e17280818c6de/charset_normalizer-3.4.8-cp313-cp313-win32.whl", hash = "sha256:1f8e3521860187d597f3867d8466da225b9179ea2833bb26de1bb026144d07c3", size = 150358, upload-time = "2026-07-06T15:26:46.153Z" }, + { url = "https://files.pythonhosted.org/packages/f5/8c/879fafff7b47bb1166d289f2d2472cb31b9922f9f4ca1f392edf85ec16be/charset_normalizer-3.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:8b654b6f52a0a9a6be38e88f3e1dc68f1093ebeb2abbadafc7c82da0786a34be", size = 161685, upload-time = "2026-07-06T15:26:47.423Z" }, + { url = "https://files.pythonhosted.org/packages/c3/46/b57c7e778a7b578f28d35fd38544687d4f8d9c019585eebc5ad936073fad/charset_normalizer-3.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:d2d5a250ee26e29468b7607d97479221b069fa8aaf6f929ac84ec0e962e15154", size = 152333, upload-time = "2026-07-06T15:26:48.689Z" }, + { url = "https://files.pythonhosted.org/packages/1c/bc/0a8540b8cd494951cca1428606373942803f5ffcec40fe798f819c5a8adb/charset_normalizer-3.4.8-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:77e993ecf65f21ab1f82266ff5e84a7de2c879e7d9b8bc006009df83f22a1d5e", size = 316993, upload-time = "2026-07-06T15:26:49.962Z" }, + { url = "https://files.pythonhosted.org/packages/0e/99/a0868f0a1f0a045fd374d1f2cf7042d8ad5d7fb4dd1f4ac7365e319f7e32/charset_normalizer-3.4.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:524939917f17f6de502dfda30b472550965740d7f126659d4c4f8dd1569cce22", size = 215638, upload-time = "2026-07-06T15:26:51.338Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e9/43c4d09a09b5557cc5fe1d87c9d96f86a3942aec0517d2b5408cef87ca75/charset_normalizer-3.4.8-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a4508989ba8e2ce43ef989453d18188b261546e8188cbdd4ef451fb9e4c3b467", size = 236456, upload-time = "2026-07-06T15:26:52.531Z" }, + { url = "https://files.pythonhosted.org/packages/e2/67/492ca98b3ab785b736b5da10c1bc233e1c8fec6c0cdb29b482c38bfc52a2/charset_normalizer-3.4.8-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9e44127f7d11eee4548ad2cdf1f4e1b6eaaddd5cb92d15ad65f6ecc9bcf403ab", size = 232253, upload-time = "2026-07-06T15:26:53.838Z" }, + { url = "https://files.pythonhosted.org/packages/2d/fd/1e6eff58c14f1aace1e26d80defbeaea2d35e075dbe4b611111ee4b47fa8/charset_normalizer-3.4.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb90317359f7e67bb6df615999a95e0980877468e617ddce8b6c2f8e7fe60d95", size = 222886, upload-time = "2026-07-06T15:26:55.009Z" }, + { url = "https://files.pythonhosted.org/packages/40/7a/90056a5326b0c4b9a3f924d337729c344c11542e5bc7191e50410db61587/charset_normalizer-3.4.8-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:35d9e7a9c960520ae89d1f4e305d1c047a74dea2e0f73a0e84f879356c2e8776", size = 206482, upload-time = "2026-07-06T15:26:56.306Z" }, + { url = "https://files.pythonhosted.org/packages/18/ff/94761d31a33878dbb5008ddbd918615061fcf5c0a612aa3075450e60f628/charset_normalizer-3.4.8-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:92e322b054c7ff886f78feab7360736bb45de2e18cf4a0ee84e8fc5a08d53a19", size = 218929, upload-time = "2026-07-06T15:26:57.422Z" }, + { url = "https://files.pythonhosted.org/packages/2b/dc/00b9675acd7c4b926b9102ee3f0d1a570ce943901be73b87485001393fe1/charset_normalizer-3.4.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3c0086d97094363556206dc3bcf43f7edcfc043ea7a568a46f45efea74858bd1", size = 218069, upload-time = "2026-07-06T15:26:58.719Z" }, + { url = "https://files.pythonhosted.org/packages/04/11/94ada5a0482ee4bf688d04be4c7d6fd945d37370d04a95671040dfe2b416/charset_normalizer-3.4.8-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:0752c849b51198267df2aba013c4de3a2955bd014a4fd70828809946c1acbc0c", size = 207146, upload-time = "2026-07-06T15:27:00.058Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f7/246bd36762207ab4752cd436b64e5d81a1668b15ddea7b5b2d0e8545e727/charset_normalizer-3.4.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2a4707e09eca11e81ece4fced600c5a0a801f568b962244f6f517bc274745fc9", size = 224896, upload-time = "2026-07-06T15:27:01.599Z" }, + { url = "https://files.pythonhosted.org/packages/6f/f7/3510622d1fbe13b0ebf827c475e40a27e2be427140d792878b63ab6425cc/charset_normalizer-3.4.8-cp314-cp314-win32.whl", hash = "sha256:8ea67f427c073ae3da0923aa55f3715131fa613a61a7f2f8d762bde75eaf00ae", size = 150851, upload-time = "2026-07-06T15:27:02.964Z" }, + { url = "https://files.pythonhosted.org/packages/32/2b/9ce65dd21672b55cf800cca5f4433afa1586fda1d78731067ec9ec544c62/charset_normalizer-3.4.8-cp314-cp314-win_amd64.whl", hash = "sha256:ff71018850863362e5c7533769d0a9f77715c31af1502d523630ce822922f5c9", size = 162549, upload-time = "2026-07-06T15:27:04.249Z" }, + { url = "https://files.pythonhosted.org/packages/2f/34/9a5967eed666a88f31a0866884606d9ec3c2cd6091e2ccd7e0b4c4176c35/charset_normalizer-3.4.8-cp314-cp314-win_arm64.whl", hash = "sha256:44464e66f4da2f21dea7145c7693f9f60717ca4794a954dea5bf8c2c932678bd", size = 153079, upload-time = "2026-07-06T15:27:05.608Z" }, + { url = "https://files.pythonhosted.org/packages/02/4f/aa44cc81d8987f105352c74c0bf919007f8b80e9880d28bcf0393c1a816e/charset_normalizer-3.4.8-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:50a0c2e58ad2c203adb616fef28941b7e13716adbc25e0dfaeec29f5afe6382f", size = 338586, upload-time = "2026-07-06T15:27:06.86Z" }, + { url = "https://files.pythonhosted.org/packages/1d/2b/b0392e2b235c08ff0623d905c2ee8ac820620544043c1ce92ce0b3d64c55/charset_normalizer-3.4.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1e589fdb95c76f08288bbb346230cdd8994db74903db6637b380f7b5fc9336", size = 222764, upload-time = "2026-07-06T15:27:08.23Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a1/7d466879190731f5559662c22232646f2ae2dace2323c3e5aefcf78d458a/charset_normalizer-3.4.8-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3d7c887444c5a7ef0d68d358d81e758a850bc626f8e639e2ca5667153272b20", size = 241331, upload-time = "2026-07-06T15:27:09.512Z" }, + { url = "https://files.pythonhosted.org/packages/70/17/8b89e797137aa28c8fb0bafbafc243246a7afe21620a13b00e37624ece1d/charset_normalizer-3.4.8-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:65c389b96c0cfff3a3f0458fa1c7ce554a30e23101a88a49f03997afce6a929f", size = 239323, upload-time = "2026-07-06T15:27:10.86Z" }, + { url = "https://files.pythonhosted.org/packages/d7/98/1c1940730ed22d50983be4e243c722c89d5136d6f073bd840d1128bfddcb/charset_normalizer-3.4.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:593403fc47dcdf55e2987b2e3cc2e064127e2b908929f1f18b2e4a4652cbd780", size = 229964, upload-time = "2026-07-06T15:27:12.113Z" }, + { url = "https://files.pythonhosted.org/packages/53/2d/bb8e81b7ff603d3f77e9a8a5d1ad34fcabbf3c54d300c29d99fba581fa23/charset_normalizer-3.4.8-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:606088e9fa2b7469ab9c42d4da8e05a415622a07714edd2fcd8fed48dda4c853", size = 212405, upload-time = "2026-07-06T15:27:13.447Z" }, + { url = "https://files.pythonhosted.org/packages/ce/1f/e52a3a53b13da591bb8f21d29e63877268eadf20686b7762351d4b89062c/charset_normalizer-3.4.8-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0317406326fed512f42a1632ad91a96228a7616c06547666a6dd79967f1bd6ca", size = 226918, upload-time = "2026-07-06T15:27:14.89Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f9/32996d79c57189af9722fe618f46d8a86b7be035ca98887b8d0c3821f141/charset_normalizer-3.4.8-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b67d50ee47e5c57a0064a9cb575b963a7125819dfd1fd094d44d378fff94659b", size = 225113, upload-time = "2026-07-06T15:27:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d2/9248c18e695696513774523a794cfb8b677521ce9ad7554d301cb10a9b20/charset_normalizer-3.4.8-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79e402b869f270140afa5e2b0e2ac100585358d812fe3dd093d424f7a72964e0", size = 214966, upload-time = "2026-07-06T15:27:17.418Z" }, + { url = "https://files.pythonhosted.org/packages/1e/9d/4b19432d406179a40f924691906ee5b15ac664b408971c973295192444ea/charset_normalizer-3.4.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2970b9f7ab69ec3a0423ec6b6ac718e79fbf4a282c0bc103ef88c1ef50dfa15a", size = 231699, upload-time = "2026-07-06T15:27:19.131Z" }, + { url = "https://files.pythonhosted.org/packages/be/41/bdbdf71e8c3ccff10ef3cc2bb9467a7fdb3dc94b9a406d1a3c44afd39632/charset_normalizer-3.4.8-cp314-cp314t-win32.whl", hash = "sha256:458c2972a78043b7261c9726670029f15f722e70669bcbe961153a01968f589f", size = 155333, upload-time = "2026-07-06T15:27:20.681Z" }, + { url = "https://files.pythonhosted.org/packages/bd/f8/e05c69323bd50091ec39f5f885385b884624b0131a6885a0c83a6217ba7a/charset_normalizer-3.4.8-cp314-cp314t-win_amd64.whl", hash = "sha256:0c926329a1df7cd56d7d8349fe354460d20aefd2e394c9e159e479d018b2b359", size = 167378, upload-time = "2026-07-06T15:27:22.042Z" }, + { url = "https://files.pythonhosted.org/packages/c2/04/cbaf1a2f5e2bbf70760e774380cbf052b10849fc35e770905df31af5cf00/charset_normalizer-3.4.8-cp314-cp314t-win_arm64.whl", hash = "sha256:2232baea80a2b01783679fed4e625ccdb19a974f44c9cf0fba21a777a4c8179c", size = 157782, upload-time = "2026-07-06T15:27:23.312Z" }, + { url = "https://files.pythonhosted.org/packages/23/52/d5bee5b6ea81882d549b566d2545b044bbcbc33fe5fbe001008a7e745a21/charset_normalizer-3.4.8-py3-none-any.whl", hash = "sha256:b7c1fb310df524e01fbe84d43b7f95aa4f808f8eaa0dafc185f64ba395e37d54", size = 64279, upload-time = "2026-07-06T15:27:57.043Z" }, +] + +[[package]] +name = "cheroot" +version = "11.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaraco-functools" }, + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/e4/5c2020b60a55aca8d79ed55b62ad1cd7fc47ea44ad6b584e83f5f1bf58b0/cheroot-11.1.2.tar.gz", hash = "sha256:bfb70c49663f63b0440f2b54dbc6b0d1650e56dfe4e2641f59b2c6f727b44aca", size = 185716, upload-time = "2025-11-07T17:26:54.818Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/99/af65511a10c4212438ac52bc5e45e486e7a04d292201ad84dfd9208fe9a8/cheroot-11.1.2-py3-none-any.whl", hash = "sha256:0f6c0ba05c00fbc869fb46b1de4ec2384e1d85418ae963d3bc10ae83b688dbfa", size = 109248, upload-time = "2025-11-07T17:26:53.393Z" }, +] + +[[package]] +name = "cherrypy" +version = "18.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cheroot" }, + { name = "jaraco-collections" }, + { name = "more-itertools" }, + { name = "portend" }, + { name = "zc-lockfile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/e8/2f7ef142d1962d08a8885c4c9942212abecad6a80ccdd1620fd1f5c993fd/cherrypy-18.10.0.tar.gz", hash = "sha256:6c70e78ee11300e8b21c0767c542ae6b102a49cac5cfd4e3e313d7bb907c5891", size = 633708, upload-time = "2024-06-14T15:25:37.192Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/61/4aba4860c91e66adbc44a62a437ad845abab21cc3dcb0b8e320000d091dd/CherryPy-18.10.0-py3-none-any.whl", hash = "sha256:129e444b9a63cea4e765481b156376f1cfe319e64caaaec2485636532373b298", size = 349804, upload-time = "2024-06-14T15:25:34.812Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[package]] +name = "click-didyoumean" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/ce/217289b77c590ea1e7c24242d9ddd6e249e52c795ff10fac2c50062c48cb/click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463", size = 3089, upload-time = "2024-03-24T08:22:07.499Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/5b/974430b5ffdb7a4f1941d13d83c64a0395114503cc357c6b9ae4ce5047ed/click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c", size = 3631, upload-time = "2024-03-24T08:22:06.356Z" }, +] + +[[package]] +name = "click-log" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/32/228be4f971e4bd556c33d52a22682bfe318ffe57a1ddb7a546f347a90260/click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975", size = 9985, upload-time = "2022-03-13T11:10:15.262Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756", size = 4273, upload-time = "2022-03-13T11:10:17.594Z" }, +] + +[[package]] +name = "click-plugins" +version = "1.1.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/a4/34847b59150da33690a36da3681d6bbc2ec14ee9a846bc30a6746e5984e4/click_plugins-1.1.1.2.tar.gz", hash = "sha256:d7af3984a99d243c131aa1a828331e7630f4a88a9741fd05c927b204bcf92261", size = 8343, upload-time = "2025-06-25T00:47:37.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/9a/2abecb28ae875e39c8cad711eb1186d8d14eab564705325e77e4e6ab9ae5/click_plugins-1.1.1.2-py2.py3-none-any.whl", hash = "sha256:008d65743833ffc1f5417bf0e78e8d2c23aab04d9745ba817bd3e71b0feb6aa6", size = 11051, upload-time = "2025-06-25T00:47:36.731Z" }, +] + +[[package]] +name = "click-repl" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "prompt-toolkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/a2/57f4ac79838cfae6912f997b4d1a64a858fb0c86d7fcaae6f7b58d267fca/click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9", size = 10449, upload-time = "2023-06-15T12:43:51.141Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/40/9d857001228658f0d59e97ebd4c346fe73e138c6de1bce61dc568a57c7f8/click_repl-0.3.0-py3-none-any.whl", hash = "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812", size = 10289, upload-time = "2023-06-15T12:43:48.626Z" }, +] + +[[package]] +name = "code-annotations" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "jinja2" }, + { name = "python-slugify" }, + { name = "pyyaml", version = "3.10", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-14-edx-enterprise-js-test'" }, + { name = "pyyaml", version = "6.0.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-14-edx-enterprise-dev' or extra == 'group-14-edx-enterprise-doc' or extra != 'group-14-edx-enterprise-js-test' or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, + { name = "stevedore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/cd/73b009a7790d67d218c7caf5f1030f37f6f4863383c3dee47f44eac7a568/code_annotations-3.0.0.tar.gz", hash = "sha256:7ce2e883ab5c62b27fd3e490658f9ccbd632910422b80280d659b851483b0200", size = 44676, upload-time = "2026-03-13T16:36:41.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/4e/fc55066be96e4efbd73b52434d438dffb62ed57b6b2125abae41b7d624bc/code_annotations-3.0.0-py2.py3-none-any.whl", hash = "sha256:5470320f207bc71023989484fe60c9b45e5122c7c6d3666d7dd3a98aa7434864", size = 45424, upload-time = "2026-03-13T16:36:40.427Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/8b/adeb62ea8951f13c4c7fef2e7a85e1a06b499c8d8237ea589d496029e53f/coverage-7.15.0.tar.gz", hash = "sha256:9ac3fe7a1435986463eaa8ee253ae2f2a268709ba4ae5c7dd1f52a05391ad78f", size = 925362, upload-time = "2026-07-02T13:10:50.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/74/fd4c0901137c4f8d81a76ada99e43c65163b4c94a02ece107a4ec0c6b615/coverage-7.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b75ee5e8cb7575636ac598719b4307ac529ec8fcd79608a35c3cd4d4dada812d", size = 220838, upload-time = "2026-07-02T13:09:02.084Z" }, + { url = "https://files.pythonhosted.org/packages/0f/2e/2347583467bd7f0402635101a916961915cc68fce652cd0db5f173ea04fc/coverage-7.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffb31267816b93b075302248cc1737506081b4f163df4401e9df1a6424aafabe", size = 221197, upload-time = "2026-07-02T13:09:03.617Z" }, + { url = "https://files.pythonhosted.org/packages/f0/17/99fa688541ae1d6e84543a0e544f83de0c944815b63e9e7b1ed411d15036/coverage-7.15.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e4d0bb73455bf97ab243a8f12c37c686ccf1c13bb614b7b85f1d062f06f42b2c", size = 252705, upload-time = "2026-07-02T13:09:05.059Z" }, + { url = "https://files.pythonhosted.org/packages/fb/02/6a95a5cd83b74839017ef9cf48d2d8c9ae60af919e17a3f336e6f9f1b7bd/coverage-7.15.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:20d9ccc4ebd0edc434d86dfd2a1dd2a8efa6b6b3073d0485a394fee86459ebb4", size = 255441, upload-time = "2026-07-02T13:09:06.559Z" }, + { url = "https://files.pythonhosted.org/packages/67/f2/406f6c57d600f68185942422c4c00f1a3255d60aee6e5fd961425cd9987e/coverage-7.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20c8a976c365c8cb12f0cbd099508772ea41fb5fa80657a8506df0e11bd278c5", size = 256556, upload-time = "2026-07-02T13:09:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/74/8e/d3fa48489c15ecdec1ba48fd61f68798555dddd2f6716f9ad42adeb1a2a9/coverage-7.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f948fd5ba1b9cbca91f0ae08b4c1ce2b139509149a435e2585d056d57d70bf01", size = 258815, upload-time = "2026-07-02T13:09:09.691Z" }, + { url = "https://files.pythonhosted.org/packages/47/2e/2d40ddd110462c6a2769677cf7f1c119a52b45f568978fc6c98e4cc0dd0f/coverage-7.15.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f58185f06edf6ad68ec9fb155d63ef650c82f3fbd7e1770e2867751fb13158f4", size = 253117, upload-time = "2026-07-02T13:09:11.212Z" }, + { url = "https://files.pythonhosted.org/packages/51/c0/310782f0d7c3cb2b5ac05ba8d205fe91f24a36f6bf3256098f1782181c38/coverage-7.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02adc79a920c73c647c5d117f55747df7f2de94571884758ce8bc58e04f0a796", size = 254475, upload-time = "2026-07-02T13:09:13.029Z" }, + { url = "https://files.pythonhosted.org/packages/86/f7/702da6c275f8ae6ade423d2877243122932c9b27f5403003b9ef8c927d12/coverage-7.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6eb7c300fbed667fd6e3588eba71c1904cdb06110ca6fdf908c26bdd88b8e382", size = 252619, upload-time = "2026-07-02T13:09:14.699Z" }, + { url = "https://files.pythonhosted.org/packages/fb/84/c5b15a7e5ecba4e56218d772d99fe80a63e63f8d11f12783723a6005ab45/coverage-7.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b5fb23fa2de9dce1f5c36c09066d8fcda16cd96e8e26686caa2d7cb9b567d65c", size = 256689, upload-time = "2026-07-02T13:09:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/95/2f/c8b07559b57701230c61b23a953858c052890c12ef568d81780c6c46e92e/coverage-7.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cec79341dbe6281484024979976d0c7f22beae08b4a254655decd25d42cbe766", size = 252189, upload-time = "2026-07-02T13:09:17.828Z" }, + { url = "https://files.pythonhosted.org/packages/6b/80/6d2f049dd3fd3dbfd60b62ba6b2162a04009e2c002ce70b24cf3878dec7a/coverage-7.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c664c5444b1d970b1b2a450e21fb19ee5c9cfdf151ded2dda37260031cca0da", size = 254059, upload-time = "2026-07-02T13:09:19.304Z" }, + { url = "https://files.pythonhosted.org/packages/ce/92/b0287a2c42031d25c628f815f89a3cd9f8268ee78bb1252c9356cda1c689/coverage-7.15.0-cp312-cp312-win32.whl", hash = "sha256:5f764a3fa339bde6b3aa97657f5a6a3a9451e4a5b4ea98a2892c773a43525f77", size = 222893, upload-time = "2026-07-02T13:09:20.812Z" }, + { url = "https://files.pythonhosted.org/packages/a9/69/e34c481915fecb499b3146975061dac528752e37706edc1804f32c822469/coverage-7.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:52f9a4d2c4c56c8848bc2f524916698354b0211488b38c49ad9ae54f6cafbff6", size = 223429, upload-time = "2026-07-02T13:09:22.315Z" }, + { url = "https://files.pythonhosted.org/packages/fe/98/6e878f0b571d32684ef3f38d7c03db241ca5b82a5da8a5391596a8f209c4/coverage-7.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:31e5c3e70c85307ea35a12964e2e40f56ca2ee4b1c8c721ccf4609d17071080b", size = 222810, upload-time = "2026-07-02T13:09:23.812Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/145a3748098bcc86b631a85408d2c3dc5c104e0bd86d605468239b25b6c4/coverage-7.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5be4caf3b28836f078abe700f8944dac4a65d78f16d6c600c89cb624e5535782", size = 220863, upload-time = "2026-07-02T13:09:25.371Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5c/4ed55708fed2c64b63c9bc5715daef670872202101938869b7fe5d5fbb8f/coverage-7.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dd58ad1404704303ca8d4f4b8a1095e7cbc7040ef17a66df1e6619aa10176430", size = 221230, upload-time = "2026-07-02T13:09:26.897Z" }, + { url = "https://files.pythonhosted.org/packages/7b/19/3a80b97d3b2a5c77a01ae359c6bed20c13738fe3d9380f08616d4fec0281/coverage-7.15.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bbcbb317c2e5ded5b21104af81c29f391be2af98d065693ffbe8d23949b948e5", size = 252227, upload-time = "2026-07-02T13:09:28.543Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/b70062750686bd7da454da27927622f48bbac6990ac7a4c4a4653e7b0036/coverage-7.15.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:27f31ecb458da3f859aab3f15ada871eb7a7768807d88df4a9f186bb17737970", size = 254823, upload-time = "2026-07-02T13:09:30.177Z" }, + { url = "https://files.pythonhosted.org/packages/a9/09/dad6a75a2e561b9dc5086a8c5257a7591d584246f67e23e70d2995b89ab6/coverage-7.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fb759be317fdc62e0f56bffdf61cfcb45c7761ad6b71e3e583e71a67ae753c", size = 256059, upload-time = "2026-07-02T13:09:31.979Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e7/b5d2941fa9564573d44b693a871ff3156f0c42cbefe977a09fa7fdc59971/coverage-7.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5cf007add5ab4bb8fa9f4c77e3732127c9e6cad501d7db43355fbfafca0be84", size = 258190, upload-time = "2026-07-02T13:09:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/7c/1d/8e895bcde3c57ccd46d896dda5f2b3d5df761a1b0c6c9d450d175dedc632/coverage-7.15.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc78d9843bd576fbe2118248258d485e968dc535f95ed504a7b0867ba9b51389", size = 252456, upload-time = "2026-07-02T13:09:35.765Z" }, + { url = "https://files.pythonhosted.org/packages/14/4c/f6997da343ddeb959be82c3b05322793f92c071ad45f7cb8a96336e2dd5f/coverage-7.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a263060f1de0b4b74b4e089c2a70b8003b3781c733329a9c8fd54995328f9950", size = 254192, upload-time = "2026-07-02T13:09:37.445Z" }, + { url = "https://files.pythonhosted.org/packages/17/27/a0bc09d032267b9da89d95a2d874cfbef2a5aebbf0e87cf7aba221d79a99/coverage-7.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c48decf16e0dfd5b049c7d5e82200c23c08126719142998d4f172444e3d0529e", size = 252153, upload-time = "2026-07-02T13:09:39.422Z" }, + { url = "https://files.pythonhosted.org/packages/54/c0/77fc233d9fba07b244c40948c53fe27308b8f21732fb3417f87fbd6fd992/coverage-7.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:08fb028000ed0aaa0a4cbdfbb98be7cb42f370db973fbbb469733505ab20e13e", size = 256310, upload-time = "2026-07-02T13:09:41.006Z" }, + { url = "https://files.pythonhosted.org/packages/d5/24/601cecfb5825becacb8d45219a018a3b55b9dbaec624efdb0ea249d08be2/coverage-7.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb7dc0c3b7d8a1077abea0b8546ebc5e26d6ef6ecefc2f0f5ad2b8a53bdad837", size = 251974, upload-time = "2026-07-02T13:09:42.733Z" }, + { url = "https://files.pythonhosted.org/packages/47/1e/6f45e5a5b3d5484318d368702af6716b5ab8913b0428bec981a562fcf296/coverage-7.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cb3602054ccbe9f0d8c2dc04bbeba90d5719236e2cd06e042ddd6d3fc7b6e37", size = 253745, upload-time = "2026-07-02T13:09:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/8e/db/4df027a77bd11d0e527f44c53557c76e54ad027413d0304252ea3a78d67e/coverage-7.15.0-cp313-cp313-win32.whl", hash = "sha256:0bf781da64326b677be344df505171435b6f58716108606621d5d27d964fff8b", size = 222902, upload-time = "2026-07-02T13:09:46.122Z" }, + { url = "https://files.pythonhosted.org/packages/a0/10/0355894d34e231f2c5449e71287e81a50793a325df2e2b027b7bcd9dfd19/coverage-7.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:2c57a275078ee3fa185f83e400f765bc764a549de66d99b47881645cbd4ea629", size = 223444, upload-time = "2026-07-02T13:09:47.687Z" }, + { url = "https://files.pythonhosted.org/packages/06/ef/bb725f263befaaff851203ab338e68af15e195d7f7b5f323162532d9b6a8/coverage-7.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:3812c61afc6685c7999b39320779ab8f43b7a3081fdb0def39976e56fbdb9a21", size = 222839, upload-time = "2026-07-02T13:09:49.717Z" }, + { url = "https://files.pythonhosted.org/packages/4f/9c/1e3ca54f72a3185ece06c58d871099898c48f0ed6430d17b6ab75f0d180a/coverage-7.15.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:41cb79af843222e11da87127ad0ecbfa878abadd0f770a4a99391a27d3887324", size = 220906, upload-time = "2026-07-02T13:09:51.339Z" }, + { url = "https://files.pythonhosted.org/packages/09/37/f718613d83b274880382f6b67e78f3802549ae39b0b3e65ae5b5974df56e/coverage-7.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7d2008989ef8fe54188d3f3bfa2e3099b025af11e90a6a1b9e7dc433d04263d8", size = 221239, upload-time = "2026-07-02T13:09:53.138Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ce/22bae91e0b75445f68d365c7643ed0aa4880bbf77450ee74ca65bdae53a7/coverage-7.15.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:769e8ece11a596315ebf5aa7ec383aeeed016c091d2bf6363ffb996d41529092", size = 252286, upload-time = "2026-07-02T13:09:54.996Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1e/bec5e32aa508615d9d7a2790effb25fb4dc28606e995816afe400b25ece3/coverage-7.15.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:65a6b6164ee5c39e2f3803f314292d6c61a607ba7fee253d1e03c42dc3903502", size = 254789, upload-time = "2026-07-02T13:09:56.678Z" }, + { url = "https://files.pythonhosted.org/packages/17/29/0e865435b4354e4a7c03b1b7920046d31d0a273d55decefea27e011cb9bf/coverage-7.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75128817f95a5c45bb01d65fd2d8b9cb54bbe03d81608fb70e3e14b437ad56c2", size = 256135, upload-time = "2026-07-02T13:09:58.343Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/33a870b58a13325d62fc0a6c8f01fa0ff667cef60c7498e2382a147dfa18/coverage-7.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9887bb428fe2d4cd4bee89bac1a6c9932f484afd5b36fbd4ff6ea5f825bb1f5e", size = 258449, upload-time = "2026-07-02T13:10:00.057Z" }, + { url = "https://files.pythonhosted.org/packages/18/7b/6fffe596bf3ddba8462758d02c5dad730fd91055a6634aa2e4226229181a/coverage-7.15.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0bfc0be1f702042207a93a00523b1065ee1fe951e96edf311581c0bbc2e34888", size = 252313, upload-time = "2026-07-02T13:10:01.946Z" }, + { url = "https://files.pythonhosted.org/packages/58/1b/11468dd6c1676ab831a70cb9a8d4e198e8607fa0b7220ab918b73fe9bfbd/coverage-7.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f64627d55def5a43282d70e08396672692f77e4da610a5bb8bb4060b432b6859", size = 254142, upload-time = "2026-07-02T13:10:04.065Z" }, + { url = "https://files.pythonhosted.org/packages/79/41/29328e21d16b1b95092c30dd700e08cf915bd3734f836df8f3bdb0e8fa9f/coverage-7.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2c6f0fa473003905c6d5bac328ee4eba9fbea654f15bc24b8a3274b23363fa99", size = 252108, upload-time = "2026-07-02T13:10:06.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/de/05ccfb990439655b35afbfd8e0d13fe66677565a7d4eb38c3f5ef2635e1c/coverage-7.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2bcf9afaf064172c6ec3c58a325a9957ad1178c05dd934e25f253321776e0676", size = 256385, upload-time = "2026-07-02T13:10:08.141Z" }, + { url = "https://files.pythonhosted.org/packages/51/0e/486828a3d2695ea7a2609f17ff572f6b01905e608379440a11da4b8dffbe/coverage-7.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:baf06bc987115d6fb938d403f7eab684a057766c490367999a2b71a6883110c6", size = 251923, upload-time = "2026-07-02T13:10:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/18/c7/03582b6715f078e5e558354c87616d945b9894cda2dace8e4009b17035e4/coverage-7.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f0405f2ff97b1c4c0e782cb32e02f32369bcf2e6b618b591d67e1ea754575dfe", size = 253580, upload-time = "2026-07-02T13:10:12.052Z" }, + { url = "https://files.pythonhosted.org/packages/db/dc/9e578bbaf2ecb4959a81b7e7601ad8cca772cba2892e8d144cb749b4a71a/coverage-7.15.0-cp314-cp314-win32.whl", hash = "sha256:ab282853ed5fbd64bbb162f19cb8fcb7087187508a6374b4f9c34ec1577c4e8f", size = 223107, upload-time = "2026-07-02T13:10:13.994Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3e/c8c3b75d8dbe0e35f7b0cc3ff5e949fc59500f70b21d0398813f66740664/coverage-7.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:3bb3040e9f4bbe26fcb0cd7cc85ac63e630d3f3a9c74f027abf4caa27e706663", size = 223597, upload-time = "2026-07-02T13:10:15.906Z" }, + { url = "https://files.pythonhosted.org/packages/cd/bc/3cbc9fb036eb388519bccd521f783499c39b64256013fbc362782f196fe1/coverage-7.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:346771144d34f7fa84ec28386f78e0f31653f33cf35e19d253d5b35f9e8201da", size = 223020, upload-time = "2026-07-02T13:10:17.844Z" }, + { url = "https://files.pythonhosted.org/packages/28/00/199c4a8d656dff63102577a056c0fce2ff6a79e40adac092fc986c49cbf1/coverage-7.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d34a010905fb6401324ba016b5da03d574967f7b21ce48ea41e66f0f1f95f641", size = 221638, upload-time = "2026-07-02T13:10:19.703Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8e/9d0092c96a3d3a26951ecc7020826aa57bcb1b119ca81acbba996884ab13/coverage-7.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bb25d825d885ca8036795dacfc3924d33091fc76d71ebc99420c6b79e77d96fa", size = 221903, upload-time = "2026-07-02T13:10:21.514Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b4/c0ca3028f42c9a08e51feb4561ef1192e5de99797cd1db5b04590c215bda/coverage-7.15.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:94c9686bfe8a9a6810297aecbd99beaa3445f9e8dc2f80b1382cca0d86b64461", size = 263267, upload-time = "2026-07-02T13:10:23.261Z" }, + { url = "https://files.pythonhosted.org/packages/5f/aa/a375e3846e5d3c013dc600b2a3231089055c73d77f5393dd2192a8d64da6/coverage-7.15.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9bd671c25f9d85f09d7ec481d0e43d5139f486c06a37139847a7ce569788af72", size = 265390, upload-time = "2026-07-02T13:10:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/92/e1/5783cdabb797305e1c9e4809fea496d31834c51fa772514f73dc148bcfc9/coverage-7.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:110cbdf8d2e216577312cf06ccf85539c0e5a5420ef747e4a4719b5e483c88cd", size = 267811, upload-time = "2026-07-02T13:10:27.249Z" }, + { url = "https://files.pythonhosted.org/packages/85/31/96d8bbf58b8e9193bc8389574a91a0db48355ee98feb66aa6bf8d1b32eea/coverage-7.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c5d4619214f1d9993e7b00a8600d14614b7e9d84e89507460b126aa5e6559e5", size = 268928, upload-time = "2026-07-02T13:10:29.242Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7a/5294567e811a1cb7eda93140c628fa050d66189da28da320f93d1d815c73/coverage-7.15.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:781a704516e2d8346fbbd5be6c6f3412dd824785146528b3a01816f26c081007", size = 262378, upload-time = "2026-07-02T13:10:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/69/3f/3f48538421f899f28946f90a3d272136a4686e1abf461cc9249a783ee0f3/coverage-7.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd4a1b44bcb65ee29e947ac92bbee04956df3a6bfc6143641bb6cae7ede00fc9", size = 265263, upload-time = "2026-07-02T13:10:32.942Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d3/092df15efcab8a9c1467ee960eb8019bbad3f9300d115d89ea6195f369ff/coverage-7.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0e4950c9d6d3e39c64c991814ff315e2d0b9cb8152363594212c9e55208c0a8f", size = 262866, upload-time = "2026-07-02T13:10:35.104Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ab/0254d2b88665efb2c57ad368cc77ab5de3435bd8d5add4729c1b0e79431e/coverage-7.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:fe9c87ff42e5472d80d21704972e1f96e104a0a599d77c5e35db5a3c562e2571", size = 266599, upload-time = "2026-07-02T13:10:37.05Z" }, + { url = "https://files.pythonhosted.org/packages/a8/79/1cfa4023e489ce6fbc7be4a5d442dbc375edb4f4fda39a352cedb53263c2/coverage-7.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f00d5ae1dd2fe13fb8186e3e7d37bcbd8b25c0d764ff7d1b32cef9be058510a8", size = 261714, upload-time = "2026-07-02T13:10:38.966Z" }, + { url = "https://files.pythonhosted.org/packages/b7/eb/fee5c8665656be63f497418d410484637c438172568688e8ac92e06574e7/coverage-7.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:363ab38cc78b615f11c9cac3cf1d7eef950c18b9fdedfb9066f59461dcf84d68", size = 264025, upload-time = "2026-07-02T13:10:40.789Z" }, + { url = "https://files.pythonhosted.org/packages/ab/99/63005db722f91edc81abc16302f9cc2f6228c1679e46e15be9ae144b14d0/coverage-7.15.0-cp314-cp314t-win32.whl", hash = "sha256:54fd9c53a5fafff509195f1b6a3f9be615d8e8362a3629ff1de23d270c03c86b", size = 223413, upload-time = "2026-07-02T13:10:42.597Z" }, + { url = "https://files.pythonhosted.org/packages/c1/e8/2bc6181c4fb06f1a6b981eb85330cc57bfad7e3f710fc9c9d350013ba228/coverage-7.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:87b47553097ba185ed964866078e7e63adea9f5f51b5f39691c34f30afd21080", size = 224245, upload-time = "2026-07-02T13:10:44.47Z" }, + { url = "https://files.pythonhosted.org/packages/79/b8/4d959bf9cc45d0cfed2f4d35cafcab978cdb6ea02eb5100009cd740632a3/coverage-7.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aeefb2dd178fe7eee79f0ad25d75855cb35ee9ed472db2c5ea06f5b4fd00cec5", size = 223558, upload-time = "2026-07-02T13:10:46.368Z" }, + { url = "https://files.pythonhosted.org/packages/52/30/21b2ad45959cd50e909e02ebac1e30b4ceb7162e91c11d4c570223a458b7/coverage-7.15.0-py3-none-any.whl", hash = "sha256:56da6a4cbe8f7e9e80bd072ca9cefe67d7106a440a7ec06519ec6507ac94ad19", size = 212632, upload-time = "2026-07-02T13:10:48.641Z" }, +] + +[[package]] +name = "cryptography" +version = "49.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100, upload-time = "2026-06-12T20:02:32.143Z" }, + { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" }, + { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" }, + { url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" }, + { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" }, + { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" }, + { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" }, + { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" }, + { url = "https://files.pythonhosted.org/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026, upload-time = "2026-06-12T20:02:39.262Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9e/db72b3ae7fc9cfad53e630e56c6ae83b9b6ff0bf3718ffb8012d20b3aabf/cryptography-49.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:73a205dce83953d131a4aa1e0fd917a2fd1c5b1eef251e9d7152efefcbf5caf7", size = 4013892, upload-time = "2026-06-12T20:02:10.735Z" }, + { url = "https://files.pythonhosted.org/packages/86/12/c48a424f38db03027be9f7ed5c7dc5de9933dbee992865f98b13727a009d/cryptography-49.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d", size = 4678835, upload-time = "2026-06-12T20:02:48.743Z" }, + { url = "https://files.pythonhosted.org/packages/68/28/8a3ad4653662c93fc44dc4e5d8fd374c25c42e07b34bbfbadf49cf57a5a8/cryptography-49.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa", size = 4697239, upload-time = "2026-06-12T20:02:56.03Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b2/2193fc74f81aee4f9b62733133b73b5176718932ed8f2e4b03fa040480a6/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb", size = 4685593, upload-time = "2026-06-12T20:02:50.666Z" }, + { url = "https://files.pythonhosted.org/packages/47/f1/1d3eaa243bfc5de4a187b22aa8c048b3e4980bfbe830ac46e6bac2e66947/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:f37d847238971164fdbc68ade6f6574aecc9c0af714190e2083429ff68f4ce9d", size = 5289961, upload-time = "2026-06-12T20:01:46.468Z" }, + { url = "https://files.pythonhosted.org/packages/58/39/2d51306721330c486495853eda1c567880ff036de15a14c4b74f399934af/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561", size = 4731145, upload-time = "2026-06-12T20:02:16.832Z" }, + { url = "https://files.pythonhosted.org/packages/17/50/983e838c7fd0d87fd8c969bcdd328edaf5f756e38df5281637424c155873/cryptography-49.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122", size = 4321719, upload-time = "2026-06-12T20:02:52.611Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f5/8f571d7e27c55bce9f76f026143bcb1e040a4233149ecca0bea5fa5dd5f7/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505", size = 4685209, upload-time = "2026-06-12T20:02:07.282Z" }, + { url = "https://files.pythonhosted.org/packages/e7/84/0e27016a6fc5a0886f797018b26aa42f40c09a82332bff77822a451deaaa/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b970c6da94d5bb18629db453d14f2a1300f6bf59b61e9b82377931ef95504866", size = 5246285, upload-time = "2026-06-12T20:01:32.439Z" }, + { url = "https://files.pythonhosted.org/packages/11/2d/5e1fb307cb5931881516b464c98774b3f2c36b5d4bb9a2830253cf553cad/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8", size = 4730441, upload-time = "2026-06-12T20:02:01.469Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c0/bff5a02ee731d207d6a1ed51732549d8c53d2bc8da1d10ec6f2844201d68/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3", size = 4815869, upload-time = "2026-06-12T20:01:36.574Z" }, + { url = "https://files.pythonhosted.org/packages/b9/26/814681d14248d95d73d5c3eea0c39a94eb8302df966f670a2c60de90974b/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27", size = 4960948, upload-time = "2026-06-12T20:02:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fe/93ecac273d3738939d023612ad12cca9a3740a5345d69fda04134c43fd96/cryptography-49.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:33cd0565932807baddb67b96dbee92f2c374b5c89dee09fd74079aeb8c8dba61", size = 3799153, upload-time = "2026-06-12T20:01:39.059Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947, upload-time = "2026-06-12T20:01:25.745Z" }, + { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" }, + { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" }, + { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" }, + { url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" }, + { url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" }, + { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" }, + { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547, upload-time = "2026-06-12T20:02:26.847Z" }, +] + +[[package]] +name = "ddt" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/55/ac51824e03637bd037707a47d63aa4d55bc5044eb8c7f928435b3e9a4928/ddt-1.3.1.tar.gz", hash = "sha256:ef9e554b03241f8f8a1bbde5f749a199871d227335fe4bb320feb0abe6fbab00", size = 10659, upload-time = "2020-03-18T03:00:31.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/a1/66a73f683d323122e0fb01996dd5abfd9ff7cc56d3c68d741ecbb1cd0047/ddt-1.3.1-py2.py3-none-any.whl", hash = "sha256:d577b57b213fa3f4a0d202aefa50c59c630f24f0c03ecbecad46a8031b046768", size = 5592, upload-time = "2020-03-18T03:00:14.506Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "diff-cover" +version = "10.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "chardet" }, + { name = "jinja2" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/21/057e816125c162662d2a2cc2ebcd72dd333e78e51678298d07dd3146011a/diff_cover-10.3.0.tar.gz", hash = "sha256:474dbc63e815fbb7567d7b7ca5b104123e96129f25426ebdbc9a1bdbb935b2c6", size = 106546, upload-time = "2026-05-30T14:17:14.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/0a/a96e57a7a3fca419cd5ceff0d13dee2166520fa67103fb82624ad64700fb/diff_cover-10.3.0-py3-none-any.whl", hash = "sha256:2e47d5ab3868d1e92131c11f364f3f4a8583c97123d3bbc6b6cc8ce0a4cc2202", size = 58989, upload-time = "2026-05-30T14:17:12.858Z" }, +] + +[[package]] +name = "dill" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" }, +] + +[[package]] +name = "django" +version = "5.2.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "sqlparse" }, + { name = "tzdata", marker = "sys_platform == 'win32' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/26/889449d521ae508b26de715954faecd8bcf3f740affb81b2d146a83b42a5/django-5.2.16.tar.gz", hash = "sha256:59ea02020c3136fce14bef0bbece21a10a4febef5eed1c51c22ae468efa22200", size = 10890894, upload-time = "2026-07-07T13:52:17.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/13/1e5e3e4c15dcecb04281b3cb2a46a4670e1cef131068e202f6040df19224/django-5.2.16-py3-none-any.whl", hash = "sha256:04f354bf9d807a86ad1a8392fe3808d362358a8eafc322848e0e43e59b24371d", size = 8311943, upload-time = "2026-07-07T13:52:11.223Z" }, +] + +[[package]] +name = "django-cache-memoize" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/81/8e07e815118a5afbb9a10e766d9338751cc11ca462dea7f8a509a8fa22c5/django_cache_memoize-0.2.1.tar.gz", hash = "sha256:025ff5d941420247b83452bb183bde172dde7def95501fca829adf8ea01b2b7b", size = 21865, upload-time = "2024-12-18T18:08:52.929Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/b4/81550fd4e8ae9e2dd017b761d73fa4aa22dccab13076622ea5a3ec76e7d4/django_cache_memoize-0.2.1-py3-none-any.whl", hash = "sha256:07929d063a03557013875d453a13edc8e3359d3ba8a568b64ac3288578ed8be3", size = 14797, upload-time = "2024-12-18T18:08:51.199Z" }, +] + +[[package]] +name = "django-config-models" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "djangorestframework" }, + { name = "edx-django-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/4e/57ce6d3f3dda278f684b9a13b69304119782dd6ff70d934417dd7d3196f6/django_config_models-3.0.0.tar.gz", hash = "sha256:abc0d9f8967c574570239a9c0dbe7d96ecf2e5326bb6bce420d812c787638a85", size = 40671, upload-time = "2026-03-24T10:40:46.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/be/47dcdbbd24717b5fd27afaa42c9772ce50ddeb00982af7500be7a276b34f/django_config_models-3.0.0-py2.py3-none-any.whl", hash = "sha256:8c3ec9e6a01fa04ab00981bf676c92ac899f7dbc6d22f61bce3bbea32b870e36", size = 30400, upload-time = "2026-03-24T10:40:45.945Z" }, +] + +[[package]] +name = "django-countries" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/1e8feb818164c3f23465c08cc3bc1cd7da7101506268a138a1b92ea40339/django_countries-9.0.0.tar.gz", hash = "sha256:a993416af08a8a4e6e866d56b71c7ce92351c81a2543da213cd7899917567a42", size = 614144, upload-time = "2026-06-10T00:39:28.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/bb/5a17b339852f6486d02b4dd0033132082976c71f049ee909ccb42917be52/django_countries-9.0.0-py3-none-any.whl", hash = "sha256:21fce461733c856355c487d1f24b71338599482505004a0c2e521fd574a59fb1", size = 931759, upload-time = "2026-06-10T00:39:26.851Z" }, +] + +[[package]] +name = "django-crum" +version = "0.7.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/1d/c56588f67130aeef8828e47535e8551337d2ae02f91f1414da61bc5e49fb/django-crum-0.7.9.tar.gz", hash = "sha256:65e9bc0f070a663fafc4d9e357f45fd4e6f01838b20a9e2fb7670f5706754288", size = 5168, upload-time = "2020-11-10T17:15:35.124Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/f9/8fad70a3bd011a6be7c5c6067278f006a25341eb39d901fbda307e26804c/django_crum-0.7.9-py2.py3-none-any.whl", hash = "sha256:037cc8b822975bb1d41cd24269b59a512cc77448fadc3f34ab9a17b229b4b471", size = 4714, upload-time = "2020-11-10T17:15:33.781Z" }, +] + +[[package]] +name = "django-fernet-fields-v2" +version = "0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/e5/aeb7c9f763d879006d33814b457677fa141ad6def17e57d8273df527ab4b/django_fernet_fields_v2-0.9.tar.gz", hash = "sha256:998476968be1ded3eabb4fa51b27ceddcae295c8227c304f117a3348ece8cbda", size = 7525, upload-time = "2023-08-15T13:44:17.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/b3/cc3298dc38563df9a176f370cbb56da5d4ab27558655efc8cf521a74811d/django_fernet_fields_v2-0.9-py3-none-any.whl", hash = "sha256:86b891344c16395d5db3b59deb555dd96d75a06f406734bb75f8f3ed987c0977", size = 8684, upload-time = "2023-08-15T13:44:15.836Z" }, +] + +[[package]] +name = "django-filter" +version = "25.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/e4/465d2699cd388c0005fb8d6ae6709f239917c6d8790ac35719676fffdcf3/django_filter-25.2.tar.gz", hash = "sha256:760e984a931f4468d096f5541787efb8998c61217b73006163bf2f9523fe8f23", size = 143818, upload-time = "2025-10-05T09:51:31.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/40/6a02495c5658beb1f31eb09952d8aa12ef3c2a66342331ce3a35f7132439/django_filter-25.2-py3-none-any.whl", hash = "sha256:9c0f8609057309bba611062fe1b720b4a873652541192d232dd28970383633e3", size = 94145, upload-time = "2025-10-05T09:51:29.728Z" }, +] + +[[package]] +name = "django-ipware" +version = "7.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-ipware" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/64/c7e4791edf01ba483cce444770b3e6a930ba12195ba1eeb37b5bf6dce8a8/django-ipware-7.0.1.tar.gz", hash = "sha256:d9ec43d2bf7cdf216fed8d494a084deb5761a54860a53b2e74346a4f384cff47", size = 6827, upload-time = "2024-04-19T20:02:49.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/33/bf539925b102d68200da5b1d3eacb8aa5d5d9a065972e8b8724d0d53bb0d/django_ipware-7.0.1-py2.py3-none-any.whl", hash = "sha256:db16bbee920f661ae7f678e4270460c85850f03c6761a4eaeb489bdc91f64709", size = 6425, upload-time = "2024-04-19T20:02:47.469Z" }, +] + +[[package]] +name = "django-mock-queries" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "djangorestframework" }, + { name = "model-bakery" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/9e/c8cb870abc00d8bc92c719f699ce988c4105501be7c67232af742eeb2085/django_mock_queries-2.3.0.tar.gz", hash = "sha256:3cc9c3922a1438ea7c318d61269ff9239b696d1d7c2ce4ebfa8cec3d1cf9b970", size = 20496, upload-time = "2024-09-26T15:29:06.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/06/4f413dcd1f914f8c569704eee26cdabd12f3bc8eadfb77fde197848ab40b/django_mock_queries-2.3.0-py2.py3-none-any.whl", hash = "sha256:71c538e0f41d10942ccdcabc450a25234875086ff91134b6bad62e08e1d21db1", size = 20385, upload-time = "2024-09-27T08:58:39.302Z" }, +] + +[[package]] +name = "django-model-utils" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/60/5e232c32a2c977cc1af8c70a38ef436598bc649ad89c2c4568454edde2c9/django_model_utils-5.0.0.tar.gz", hash = "sha256:041cdd6230d2fbf6cd943e1969318bce762272077f4ecd333ab2263924b4e5eb", size = 80559, upload-time = "2024-09-04T11:35:22.858Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/13/87a42048700c54bfce35900a34e2031245132775fb24363fc0e33664aa9c/django_model_utils-5.0.0-py3-none-any.whl", hash = "sha256:fec78e6c323d565a221f7c4edc703f4567d7bb1caeafe1acd16a80c5ff82056b", size = 42630, upload-time = "2024-09-04T11:36:23.166Z" }, +] + +[[package]] +name = "django-multi-email-field" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/95/78b24271e2465a468cedf5393144d010edade9b04d7e87b9a86fa1c3b403/django_multi_email_field-0.8.0.tar.gz", hash = "sha256:b63743ef9027e5522cee5094e8fb972b3be274705080a32bbede2e50b744f777", size = 8346, upload-time = "2025-05-16T13:01:32.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/48/98d6ae06bc31b51809eb4b18861c2ace1f96b17c98c39df817a26a7a3686/django_multi_email_field-0.8.0-py3-none-any.whl", hash = "sha256:d9da57226ea7e239b462bffdb121abe830931bd5cc702828b4e757784740b7fd", size = 9290, upload-time = "2025-05-16T13:01:31.571Z" }, +] + +[[package]] +name = "django-oauth-toolkit" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "jwcrypto" }, + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/11/7841f88b6e200e49533307425271c356399319b35738aedb3fcb487afc3b/django-oauth-toolkit-1.7.1.tar.gz", hash = "sha256:37b690fa53f340c7391bdbc0fdbb32fd9ef8a7c012e72ee8754c331a2d7b4adb", size = 46685, upload-time = "2022-03-19T22:35:09.076Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/1a/3a8332b8c507ae41491f6b049ff4521225eabca83032d2e67372d63d973b/django_oauth_toolkit-1.7.1-py3-none-any.whl", hash = "sha256:756e44421d0993f27705736b6c33a3d89018393859a31ac926296950f76e4433", size = 63199, upload-time = "2022-03-19T22:35:36.988Z" }, +] + +[[package]] +name = "django-object-actions" +version = "5.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/2f/99e8fa3d117becebfbe46d54d0b85d81475b6375b85507907a7aaf1d5d2b/django_object_actions-5.1.2.tar.gz", hash = "sha256:a11ac544e5beb6b309a50e184a2086e1e18f6469704d9609bbe083a8972a2245", size = 19048, upload-time = "2026-05-28T05:48:29.88Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/23/c5743780fc68433f244fba86cd64b513b9d6a9491714ac700a4654b5e00f/django_object_actions-5.1.2-py3-none-any.whl", hash = "sha256:366dcd5ccfb3ef6a16ce4c147be8df2a35b52d637eb36fb9c558e28419ae4038", size = 16900, upload-time = "2026-05-28T05:48:28.56Z" }, +] + +[[package]] +name = "django-push-notifications" +version = "3.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/85/7fb804fcab89f0b00d816d2359516f444fbb9117dadb7b7d242d205aede4/django_push_notifications-3.3.0.tar.gz", hash = "sha256:fed8b48be2f956c72567e8713a1865b4a1b1d56d22193328b1f04fbcf169b9f5", size = 64488, upload-time = "2025-11-16T06:45:51.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/44/ff628b53a2a024b2b7488472932eaf9c68414c19ede4223729ed2365e813/django_push_notifications-3.3.0-py3-none-any.whl", hash = "sha256:b930051a923ee26ef24c7a5fee87a8a38c5997d73485034ce8393456f51b9c22", size = 47926, upload-time = "2025-11-16T06:45:50.495Z" }, +] + +[[package]] +name = "django-simple-history" +version = "3.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/75/658d2e0ba3f51c0774cc7c71d2879e3260880d441406bba4bab64d70a4de/django_simple_history-3.12.0.tar.gz", hash = "sha256:4cc363c6c806834f32c9d19c9db2d97165f379f41e581c39fb7dbac9e4c20c11", size = 235106, upload-time = "2026-06-22T13:16:23.766Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/8e/af1d95934a9bec0f9127a9ca9599ea33aee7f57afb4ea56018e13ae70018/django_simple_history-3.12.0-py3-none-any.whl", hash = "sha256:371878332fb3c00556c69d61e563daf042c34aef6cee6839123b391e2d0efa40", size = 81883, upload-time = "2026-06-22T13:16:22.391Z" }, +] + +[[package]] +name = "django-waffle" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/e1/6f533da0d4ac89f427dfd9410e39bfc14ae3a23335ecd549d76be4b2a834/django_waffle-5.0.0.tar.gz", hash = "sha256:62f9d00eedf68dafb82657beab56e601bddedc1ea1ccfef91d83df8658708509", size = 37761, upload-time = "2025-06-12T07:38:54.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/d2/6f0d664bd35a3fdd0403655c7c32ec290704923f11541ef356b180cd8fbf/django_waffle-5.0.0-py3-none-any.whl", hash = "sha256:3312851d9d926b76b9e90712355781700a383b82b5bf2b61e1f1be97532c0f3d", size = 48137, upload-time = "2025-06-12T07:38:53.698Z" }, +] + +[[package]] +name = "djangorestframework" +version = "3.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/d7/c016e69fac19ff8afdc89db9d31d9ae43ae031e4d1993b20aca179b8301a/djangorestframework-3.17.1.tar.gz", hash = "sha256:a6def5f447fe78ff853bff1d47a3c59bf38f5434b031780b351b0c73a62db1a5", size = 905742, upload-time = "2026-03-24T16:58:33.705Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/e1/2c516bdc83652b1a60c6119366ac2c0607b479ed05cd6093f916ca8928f8/djangorestframework-3.17.1-py3-none-any.whl", hash = "sha256:c3c74dd3e83a5a3efc37b3c18d92bd6f86a6791c7b7d4dff62bb068500e76457", size = 898844, upload-time = "2026-03-24T16:58:31.845Z" }, +] + +[[package]] +name = "djangorestframework-xml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "defusedxml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/74/b75939a779fddef1d3e108991f7edb199e6240f23b6aef64f3a222e1b4dd/djangorestframework-xml-2.0.0.tar.gz", hash = "sha256:35f6c811d0ab8c8466b26db234e16a2ed32d76381715257aebf4c7be2c202ca1", size = 5412, upload-time = "2020-04-12T22:38:43.862Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/74/65485e0ceae183b9348cd080cc69126e498a95bcd5d37df84a598bf94bbd/djangorestframework_xml-2.0.0-py2.py3-none-any.whl", hash = "sha256:975955fbb0d49ac44a90bdeb33b7923d95b79884d283f983e116c80a936ef4d0", size = 6046, upload-time = "2020-04-12T22:38:43.087Z" }, +] + +[[package]] +name = "dnspython" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, +] + +[[package]] +name = "doc8" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "pygments" }, + { name = "restructuredtext-lint" }, + { name = "stevedore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/92/91/88bb55225046a2ee9c2243d47346c78d2ed861c769168f451568625ad670/doc8-2.0.0.tar.gz", hash = "sha256:1267ad32758971fbcf991442417a3935c7bc9e52550e73622e0e56ba55ea1d40", size = 28436, upload-time = "2025-06-13T13:08:53.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl", hash = "sha256:9862710027f793c25f9b1899150660e4bf1d4c9a6738742e71f32011e2e3f590", size = 25861, upload-time = "2025-06-13T13:08:51.839Z" }, +] + +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, +] + +[[package]] +name = "drf-jwt" +version = "1.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "djangorestframework" }, + { name = "pyjwt", extra = ["crypto"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/8e/3c60992bafd0ac51bcfa136ff9f5e1cff65ef45ebbcb393477672e699e82/drf-jwt-1.19.2.tar.gz", hash = "sha256:660bc66f992065cef59832adcbbdf871847e9738671c19e5121971e773768235", size = 38208, upload-time = "2022-01-09T09:23:38.903Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/48/d72115d8c0d27c5d806fdd6cd61197cef6a7e34df2b8cb63b218ffa674b8/drf_jwt-1.19.2-py2.py3-none-any.whl", hash = "sha256:63c3d4ed61a1013958cd63416e2d5c84467d8ae3e6e1be44b1fb58743dbd1582", size = 21926, upload-time = "2022-01-09T09:23:37.257Z" }, +] + +[[package]] +name = "drf-yasg" +version = "1.21.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "djangorestframework" }, + { name = "inflection" }, + { name = "packaging" }, + { name = "pytz" }, + { name = "pyyaml", version = "6.0.3", source = { registry = "https://pypi.org/simple" } }, + { name = "uritemplate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4a/88/345135459b9cbaff0e8ee3270819e89ca92064a35a0a94a1cfce41c084db/drf_yasg-1.21.15.tar.gz", hash = "sha256:ef86838c4ef10dcd3ac1ebf2be601cbe02978b999671caa43667f7c9db961468", size = 5153419, upload-time = "2026-02-24T18:09:21.072Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/a4/400b0565cf25395f1d5e1a24e5d18dab8f4199e4212174341fea6f05747c/drf_yasg-1.21.15-py3-none-any.whl", hash = "sha256:7c7a7ab9feb0e13cdd6e25147d99adb0500a68bd96509ffd8f8cf7efd4bdc77e", size = 4856209, upload-time = "2026-02-24T18:09:18.982Z" }, +] + +[[package]] +name = "edx-ace" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "django" }, + { name = "django-push-notifications" }, + { name = "edx-django-utils" }, + { name = "firebase-admin" }, + { name = "python-dateutil" }, + { name = "sailthru-client" }, + { name = "six" }, + { name = "stevedore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/c8/5f3af78945d647f7083c92a02a03d4deefac4f778967cca291c652ae5bd1/edx_ace-1.15.0.tar.gz", hash = "sha256:638f47dd0fa93506d9c4111d0614c5f4c8be61711d1a0c74b87128b63099e313", size = 57699, upload-time = "2025-06-25T07:43:27.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/a9/61e293cba803cce681d37d442aaed492486094ae34d2a342272b3bf23ee4/edx_ace-1.15.0-py2.py3-none-any.whl", hash = "sha256:24f60a856777a2a4ced42ab0d9c0b56289f8080000532795e82e3d17f93e1f31", size = 65600, upload-time = "2025-06-25T07:43:26.377Z" }, +] + +[[package]] +name = "edx-api-doc-tools" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "djangorestframework" }, + { name = "drf-yasg" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/f9/ebfd100a265fdcc44dd2abdbc86c1a5feda763334a97e02de919519ae39c/edx_api_doc_tools-3.0.0.tar.gz", hash = "sha256:478525f7d90d83ffd74b23261949231f8aeee6cab45aad62eef144856de92908", size = 20611, upload-time = "2026-03-13T16:47:34.074Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/31/c8c8cd8019a06eab01d61e3cf39e76a7a2f9ed33f21b18a735e36b13e204/edx_api_doc_tools-3.0.0-py2.py3-none-any.whl", hash = "sha256:c96afaa3a69a88ee2c62302f3c4dcbbb0a23903ba817e671a6d117c438947f9b", size = 14917, upload-time = "2026-03-13T16:47:32.782Z" }, +] + +[[package]] +name = "edx-braze-client" +version = "1.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "edx-ace" }, + { name = "edx-django-utils" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/33/e2e4fcef03fb2e7acaae2f8656d0a1b5a4a0e2b22218b637b418666867e4/edx_braze_client-1.1.3.tar.gz", hash = "sha256:17bcd2269d2bedf09c1db07c624c9fea96b997d843618f04adddb63c2f32b201", size = 38081, upload-time = "2025-09-03T15:26:37.991Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/cb/0ce9800718a39ef0310e7985fbeb936a4124a01f11db4639ae984d7425ae/edx_braze_client-1.1.3-py2.py3-none-any.whl", hash = "sha256:e93f6cca16530f76ad26d211d8b2cd1ff25a85ca2b3105b7502e5bf7e0069644", size = 36599, upload-time = "2025-09-03T15:26:37.047Z" }, +] + +[[package]] +name = "edx-ccx-keys" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "edx-opaque-keys" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/ca/118458ec6a14e5040a4feedb496fee99eb261e8c9b81112e16dabb77efcf/edx_ccx_keys-2.0.2.tar.gz", hash = "sha256:da17b2b3281011a540d5ab847acf7946c4a57dd10c0931cec3ff9ac3c1fa33a0", size = 19528, upload-time = "2024-12-02T13:23:33.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/f8/870ec0597d5f8bd3235130ae7d888650531618c552932c89f57e5251f410/edx_ccx_keys-2.0.2-py3-none-any.whl", hash = "sha256:4071fc0f3a76288c2f7d784a8b53aa8c5e672604a1d8c5a1891fa1bf5612791a", size = 16226, upload-time = "2024-12-02T13:23:32.276Z" }, +] + +[[package]] +name = "edx-django-utils" +version = "8.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "django" }, + { name = "django-crum" }, + { name = "django-waffle" }, + { name = "psutil" }, + { name = "pynacl" }, + { name = "stevedore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/68/96a58ff4e9d0173d2ad8cc2b2f446ae00c462cd84d8efd39f085a4589801/edx_django_utils-8.0.1.tar.gz", hash = "sha256:fadf4954b12556a79fadd9cc6bc8efd45da4a90c043a63c915339a3cc90d610b", size = 109365, upload-time = "2025-09-29T18:17:06.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/ae/a8e618fee2be5f1a8ae3e2d1b6ce0b405fbca2726dd11557e1b982cf58ae/edx_django_utils-8.0.1-py2.py3-none-any.whl", hash = "sha256:849c253b5e14ddfbdc47c5e36143fad54147778a53e0b49095c1fecab24edd9e", size = 121130, upload-time = "2025-09-29T18:17:04.628Z" }, +] + +[[package]] +name = "edx-drf-extensions" +version = "10.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "django-waffle" }, + { name = "djangorestframework" }, + { name = "drf-jwt" }, + { name = "edx-django-utils" }, + { name = "edx-opaque-keys" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "requests" }, + { name = "semantic-version" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/b4/24ae933674841abb97332b134ff4d2b6ea099716d5f61935fd2128cb0d38/edx_drf_extensions-10.6.0.tar.gz", hash = "sha256:c633be6aeb615836a5cbb118b52311d87905942273fdb470bfcc1c95fd5f84b7", size = 77425, upload-time = "2025-04-04T11:43:49.648Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/a7/60ce0beb203878005010c396026b3666a4e604e7963608dff94571e0a6f2/edx_drf_extensions-10.6.0-py2.py3-none-any.whl", hash = "sha256:82603edc63f7f34a3d1ab024808320ad0e175e608484f392f3c76e594d7715d1", size = 76298, upload-time = "2025-04-04T11:43:47.913Z" }, +] + +[[package]] +name = "edx-enterprise" +source = { editable = "." } +dependencies = [ + { name = "bleach" }, + { name = "celery" }, + { name = "code-annotations" }, + { name = "cryptography" }, + { name = "django" }, + { name = "django-cache-memoize" }, + { name = "django-config-models" }, + { name = "django-countries" }, + { name = "django-crum" }, + { name = "django-fernet-fields-v2" }, + { name = "django-filter" }, + { name = "django-ipware" }, + { name = "django-model-utils" }, + { name = "django-multi-email-field" }, + { name = "django-oauth-toolkit" }, + { name = "django-object-actions" }, + { name = "django-simple-history" }, + { name = "django-waffle" }, + { name = "djangorestframework" }, + { name = "djangorestframework-xml" }, + { name = "edx-django-utils" }, + { name = "edx-drf-extensions" }, + { name = "edx-opaque-keys" }, + { name = "edx-rbac" }, + { name = "edx-rest-api-client" }, + { name = "edx-toggles" }, + { name = "jsondiff" }, + { name = "jsonfield" }, + { name = "lxml" }, + { name = "openedx-atlas" }, + { name = "openedx-events" }, + { name = "openedx-filters" }, + { name = "paramiko" }, + { name = "path-py" }, + { name = "pgpy" }, + { name = "pillow" }, + { name = "python-dateutil" }, + { name = "python3-saml" }, + { name = "pytz" }, + { name = "requests" }, + { name = "rules" }, + { name = "slumber" }, + { name = "social-auth-app-django" }, + { name = "stevedore" }, + { name = "testfixtures" }, + { name = "tincan" }, + { name = "unicodecsv" }, +] + +[package.optional-dependencies] +braze = [ + { name = "edx-braze-client" }, +] + +[package.dev-dependencies] +ci = [ + { name = "tox" }, + { name = "tox-uv" }, +] +dev = [ + { name = "build" }, + { name = "ddt" }, + { name = "diff-cover" }, + { name = "django-mock-queries" }, + { name = "django-model-utils" }, + { name = "doc8" }, + { name = "docutils" }, + { name = "edx-api-doc-tools" }, + { name = "edx-braze-client" }, + { name = "edx-i18n-tools" }, + { name = "edx-lint" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "isort" }, + { name = "mock" }, + { name = "myst-parser" }, + { name = "pycodestyle" }, + { name = "pydocstyle" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "readme-renderer" }, + { name = "responses" }, + { name = "sphinx" }, + { name = "sphinx-book-theme" }, + { name = "sphinxcontrib-mermaid" }, + { name = "testfixtures" }, + { name = "tox" }, + { name = "tox-uv" }, + { name = "twine" }, + { name = "wheel" }, +] +doc = [ + { name = "build" }, + { name = "doc8" }, + { name = "docutils" }, + { name = "edx-api-doc-tools" }, + { name = "edx-braze-client" }, + { name = "factory-boy" }, + { name = "myst-parser" }, + { name = "pytest" }, + { name = "readme-renderer" }, + { name = "sphinx" }, + { name = "sphinx-book-theme" }, + { name = "sphinxcontrib-mermaid" }, + { name = "twine" }, +] +js-test = [ + { name = "jaraco-classes" }, + { name = "jaraco-collections" }, + { name = "jaraco-functools" }, + { name = "jasmine" }, + { name = "tempora" }, +] +postgresql = [ + { name = "psycopg2-binary" }, +] +test = [ + { name = "ddt" }, + { name = "diff-cover" }, + { name = "django-mock-queries" }, + { name = "django-model-utils" }, + { name = "edx-api-doc-tools" }, + { name = "edx-braze-client" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "responses" }, + { name = "testfixtures" }, +] +test-master = [ + { name = "edx-api-doc-tools" }, + { name = "edx-braze-client" }, +] + +[package.metadata] +requires-dist = [ + { name = "bleach" }, + { name = "celery" }, + { name = "code-annotations" }, + { name = "cryptography" }, + { name = "django" }, + { name = "django-cache-memoize" }, + { name = "django-config-models" }, + { name = "django-countries" }, + { name = "django-crum" }, + { name = "django-fernet-fields-v2" }, + { name = "django-filter" }, + { name = "django-ipware" }, + { name = "django-model-utils" }, + { name = "django-multi-email-field" }, + { name = "django-oauth-toolkit" }, + { name = "django-object-actions" }, + { name = "django-simple-history" }, + { name = "django-waffle" }, + { name = "djangorestframework" }, + { name = "djangorestframework-xml" }, + { name = "edx-braze-client", marker = "extra == 'braze'" }, + { name = "edx-django-utils", specifier = ">=3.12.0" }, + { name = "edx-drf-extensions" }, + { name = "edx-opaque-keys", extras = ["django"] }, + { name = "edx-rbac" }, + { name = "edx-rest-api-client" }, + { name = "edx-toggles" }, + { name = "jsondiff" }, + { name = "jsonfield" }, + { name = "lxml" }, + { name = "openedx-atlas" }, + { name = "openedx-events" }, + { name = "openedx-filters" }, + { name = "paramiko" }, + { name = "path-py" }, + { name = "pgpy" }, + { name = "pillow" }, + { name = "python-dateutil" }, + { name = "python3-saml" }, + { name = "pytz" }, + { name = "requests" }, + { name = "rules" }, + { name = "slumber" }, + { name = "social-auth-app-django" }, + { name = "stevedore" }, + { name = "testfixtures" }, + { name = "tincan" }, + { name = "unicodecsv" }, +] +provides-extras = ["braze"] + +[package.metadata.requires-dev] +ci = [ + { name = "tox" }, + { name = "tox-uv" }, +] +dev = [ + { name = "build" }, + { name = "ddt", specifier = "<1.4.0" }, + { name = "diff-cover" }, + { name = "django-mock-queries" }, + { name = "django-model-utils" }, + { name = "doc8" }, + { name = "docutils" }, + { name = "edx-api-doc-tools" }, + { name = "edx-braze-client" }, + { name = "edx-i18n-tools" }, + { name = "edx-lint" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "isort" }, + { name = "mock" }, + { name = "myst-parser" }, + { name = "pycodestyle" }, + { name = "pydocstyle" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "readme-renderer" }, + { name = "responses" }, + { name = "sphinx" }, + { name = "sphinx-book-theme" }, + { name = "sphinxcontrib-mermaid" }, + { name = "testfixtures" }, + { name = "tox" }, + { name = "tox-uv" }, + { name = "twine" }, + { name = "wheel" }, +] +doc = [ + { name = "build" }, + { name = "doc8" }, + { name = "docutils" }, + { name = "edx-api-doc-tools" }, + { name = "edx-braze-client" }, + { name = "factory-boy" }, + { name = "myst-parser" }, + { name = "pytest" }, + { name = "readme-renderer" }, + { name = "sphinx" }, + { name = "sphinx-book-theme" }, + { name = "sphinxcontrib-mermaid" }, + { name = "twine" }, +] +js-test = [ + { name = "jaraco-classes" }, + { name = "jaraco-collections" }, + { name = "jaraco-functools" }, + { name = "jasmine" }, + { name = "tempora" }, +] +postgresql = [{ name = "psycopg2-binary" }] +test = [ + { name = "ddt", specifier = "<1.4.0" }, + { name = "diff-cover" }, + { name = "django-mock-queries" }, + { name = "django-model-utils" }, + { name = "edx-api-doc-tools" }, + { name = "edx-braze-client" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "responses" }, + { name = "testfixtures" }, +] +test-master = [ + { name = "edx-api-doc-tools" }, + { name = "edx-braze-client" }, +] + +[[package]] +name = "edx-i18n-tools" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "lxml", extra = ["html-clean"], marker = "extra == 'group-14-edx-enterprise-dev' or extra == 'group-14-edx-enterprise-doc' or extra != 'group-14-edx-enterprise-js-test' or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, + { name = "path" }, + { name = "polib" }, + { name = "pyyaml", version = "6.0.3", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/7a/800a34409b305a74f8848ae61cca6398a9d3b4f905aaf1c5754378596954/edx_i18n_tools-2.0.0.tar.gz", hash = "sha256:20b4c2b978ccb0c5164570375d082b47d59eae7f1f7513a0fe5bf04b0e7d6dc2", size = 38552, upload-time = "2026-03-10T15:29:03.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/5e/d3f836a41a10a9a76a290277876c2326eafa77f3073a15bbbff25cdb3c1d/edx_i18n_tools-2.0.0-py2.py3-none-any.whl", hash = "sha256:d3f6d9ee36ca5af367653eabdfc71dd967fd4d5dcceeb855d23a058ce391eb35", size = 32872, upload-time = "2026-03-10T15:29:02.763Z" }, +] + +[[package]] +name = "edx-lint" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "click-log" }, + { name = "code-annotations" }, + { name = "pylint" }, + { name = "pylint-celery" }, + { name = "pylint-django" }, + { name = "six" }, + { name = "tomlkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/e2/20b4782eba5bbbaeb949877666f871912db05fb22cee2eafdbc83566cffc/edx_lint-6.2.0.tar.gz", hash = "sha256:2ce94b0b1235024e7714792442ea674e1bbe2877e7ca2ca970609e74aa73dfdf", size = 55456, upload-time = "2026-08-18T12:40:35.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/f3/72bbb973cb654aa9d8291c438dd02b21ffb3bf2bdc9e653f9ea9048e3b20/edx_lint-6.2.0-py3-none-any.whl", hash = "sha256:0e1491f9a049927e35eb05a0fd33464b4ec912b83e387568e37f4ce5d10acb30", size = 64109, upload-time = "2026-08-18T12:40:34.102Z" }, +] + +[[package]] +name = "edx-opaque-keys" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pymongo" }, + { name = "stevedore" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/12/eeb5e5431f7e600875e620bd2592f77f04ee509f474f52cc6b0ab1f4312b/edx_opaque_keys-4.0.0.tar.gz", hash = "sha256:d9c06793cf99629836432f2a9f34b0bb24ad7a66a1e397ffa716f714aa43b269", size = 68222, upload-time = "2026-04-02T19:00:56.247Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/1b/e9edebd12fd461b605691759a01c12e73a78cb50a4cd0b04ab58bb8303d9/edx_opaque_keys-4.0.0-py3-none-any.whl", hash = "sha256:dab0fd985b13d6d6515049606f93684d1eb284207b6d5e8da0721e29efdd0088", size = 77651, upload-time = "2026-04-02T19:00:55.259Z" }, +] + +[[package]] +name = "edx-rbac" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "django-crum" }, + { name = "django-model-utils" }, + { name = "edx-drf-extensions" }, + { name = "setuptools" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/e8/efcec117a5caa063e311d82e6c663434fc989e38ef65d584ca4ea61ac33a/edx_rbac-3.0.0.tar.gz", hash = "sha256:f4aeb05cf1142e748a5d9a47874ba2955509f31663bb1aa11887a413f28d1524", size = 49274, upload-time = "2026-03-13T14:21:34.397Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/5b/e60d2d696ac3cb5da189299337b6a1c0b33774e505bc585a9aa54108a51e/edx_rbac-3.0.0-py2.py3-none-any.whl", hash = "sha256:7113ab86ad647e11384442406f252fc4888d0f020c60aa081272e90b63720b3f", size = 40018, upload-time = "2026-03-13T14:21:33.14Z" }, +] + +[[package]] +name = "edx-rest-api-client" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "edx-django-utils" }, + { name = "pyjwt" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/76/9e4ab36555e1bb932df6d7b98e63ce134872a954c5b99b7fbb08513fa0be/edx_rest_api_client-7.0.0.tar.gz", hash = "sha256:221cb6299d6af30df879084e9f1d1d16a7362e4afd3eef2f81c2e7a8ae7c2e17", size = 15499, upload-time = "2026-04-08T08:38:48.991Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/3a/11b38d254cb1921ec6a8a8e5c9efb90a5f8fb212cfe95264c3308e9ef6cf/edx_rest_api_client-7.0.0-py3-none-any.whl", hash = "sha256:718c573aa6dd11ae23f940ccca0792e66376a8a4d1c515c28612a425e509e679", size = 13041, upload-time = "2026-04-08T08:38:48.024Z" }, +] + +[[package]] +name = "edx-toggles" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "code-annotations" }, + { name = "django" }, + { name = "django-crum" }, + { name = "django-waffle" }, + { name = "edx-django-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/75/21/91f555509cc44c9a146ab0178c8b3aed92d7296551be80dff91f73e73891/edx_toggles-6.0.0.tar.gz", hash = "sha256:a2b20324fc85bdc91f7b3c1418f2162171e054e47fe6627dec413c6c43a9b46f", size = 37181, upload-time = "2026-04-07T16:37:10.207Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/08/5997a64defd6e699ecd8a4b5d0678afc360426a3486ca805db78d898e324/edx_toggles-6.0.0-py2.py3-none-any.whl", hash = "sha256:a1a40ff55c8d655b1150fe121ede7354eb01ce84408d2cb7fd32cfc7731de9f3", size = 33247, upload-time = "2026-04-07T16:37:09.036Z" }, +] + +[[package]] +name = "factory-boy" +version = "3.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "faker" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/98/75cacae9945f67cfe323829fc2ac451f64517a8a330b572a06a323997065/factory_boy-3.3.3.tar.gz", hash = "sha256:866862d226128dfac7f2b4160287e899daf54f2612778327dd03d0e2cb1e3d03", size = 164146, upload-time = "2025-02-03T09:49:04.433Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/8d/2bc5f5546ff2ccb3f7de06742853483ab75bf74f36a92254702f8baecc79/factory_boy-3.3.3-py2.py3-none-any.whl", hash = "sha256:1c39e3289f7e667c4285433f305f8d506efc2fe9c73aaea4151ebd5cdea394fc", size = 37036, upload-time = "2025-02-03T09:49:01.659Z" }, +] + +[[package]] +name = "faker" +version = "40.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/2d/3ead106cef42eab305e15f9c089dcc68a40387d5ce04af18585af4ebbb44/faker-40.28.1.tar.gz", hash = "sha256:2a63fb51abab8790636d4030a094cf942404cbccc9c288d1cad70e2e3e9ecd58", size = 2022717, upload-time = "2026-07-01T22:23:43.763Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/a6/6111b9f13c1564b0e2f5dbeeb611fd00dc731e6add2336f62b798598c73d/faker-40.28.1-py3-none-any.whl", hash = "sha256:e8d3f5c469100a553d246dce7937c291308068a5ec6c9c3a228d7878b50720be", size = 2061052, upload-time = "2026-07-01T22:23:41.946Z" }, +] + +[[package]] +name = "fastavro" +version = "1.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/5b/ccb338db71f347e3bc031d268bf6dc41e5ead63b6997b8e72af92f05e18e/fastavro-1.12.2.tar.gz", hash = "sha256:3c79502d56cf6b76210032e1c53494ddfbc73c140bccf2ef4092b3f0825323ab", size = 1030127, upload-time = "2026-04-24T14:36:01.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/bc/fe5731d6724d978694fbd3196bc1c0d7cab3fd0766e9551c40c39f798b52/fastavro-1.12.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0e331896e8efffc72fa03e63b87ebfc37960113127da8e0f5152d91664ffed68", size = 964331, upload-time = "2026-04-24T14:36:31.297Z" }, + { url = "https://files.pythonhosted.org/packages/98/36/50abf1145e4f1c4f418cd4b5f2ac806643d0b14e360b60e953826edf1b34/fastavro-1.12.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f01ebaada59d74fdf6d28e5031a961a413b3752e9edb0c03866fa18480cf4c8", size = 3340170, upload-time = "2026-04-24T14:36:33.364Z" }, + { url = "https://files.pythonhosted.org/packages/fc/8c/76ef4641e6c1c1aa3e6bb3c9efb5533ffda5dd975c8b5ae54e794322d9e3/fastavro-1.12.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25ef6855935f67582740ffa6bb978e40ec51be876117a3555c36fa2488dcdf25", size = 3425061, upload-time = "2026-04-24T14:36:35.497Z" }, + { url = "https://files.pythonhosted.org/packages/31/10/379ff23425b2b470d5209cbc6736a6e5cbc34392ff17bb7355b8fd4aa0ca/fastavro-1.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:84a4f76a0aece0aa72b5ed8162ba2ff8c78908b8361b5a5d92ddd161977ccb74", size = 3243618, upload-time = "2026-04-24T14:36:37.969Z" }, + { url = "https://files.pythonhosted.org/packages/88/29/4c8f9e7cd78f932f0d82823899e67a6d7f7e8f2524992db03956f9d9f5ef/fastavro-1.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81e8da77d201916f6771fc357fda8267c2a256d7aa11923d43bc5f2fc155878b", size = 3378427, upload-time = "2026-04-24T14:36:40.278Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/eafeb302aaaea6055d4a9c11272b4aeaf713e43fe8eaf782f43a1fee2b44/fastavro-1.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:1924349c74666c89417bd5cc2749f598e2f15f1d56ee81428b2317ab02c88aae", size = 441077, upload-time = "2026-04-24T14:36:41.791Z" }, + { url = "https://files.pythonhosted.org/packages/56/9d/67e831041ba8efc16265c65bd71ba92e1095bba19b91be99e102f19d9be6/fastavro-1.12.2-cp312-cp312-win_arm64.whl", hash = "sha256:4c346cf449baf3b113e997c34151ad205e7135bc429469b005b180ade7e65e28", size = 378205, upload-time = "2026-04-24T14:36:43.679Z" }, + { url = "https://files.pythonhosted.org/packages/83/39/f489a441d41cc9c0a8449fb1325d7a9c9eb57a5634e6ab19dfb0a1105324/fastavro-1.12.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:57bb6b908cb2e05baab63b04c3a31be3b4545a10bfab9748b8763016b5256704", size = 958566, upload-time = "2026-04-24T14:36:45.49Z" }, + { url = "https://files.pythonhosted.org/packages/31/69/776cc025aee2d02acacb734cf690d2fbc295eaadde1b5d47caf8c77a6a2b/fastavro-1.12.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a007f95cc682f56e6d83f1d17c29c00bf719d6fe8e003282b535af3a1ba09c0", size = 3276390, upload-time = "2026-04-24T14:36:47.875Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bc/b7e15fa788f42cbe65827af2ec06c9ad91bb9f72c213110dbef61b53a5b0/fastavro-1.12.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e90460b0cd21f62be3cb26087e706e2cebb7b3fcef9e05b4473b61bb0415b5e", size = 3372779, upload-time = "2026-04-24T14:36:50.122Z" }, + { url = "https://files.pythonhosted.org/packages/79/c2/98993ca810231fc1397212f48c3d46626983722a24bbaaa5c27ee0963751/fastavro-1.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ccd15966b8218d41b06ec3e7c2556be89a8a693026c771e6564d2e40bbaf8ea", size = 3187591, upload-time = "2026-04-24T14:36:52.451Z" }, + { url = "https://files.pythonhosted.org/packages/c6/bb/c180f340eba6478f1b20deccdd17e2b4a4d5074dafd812e3c4254fd035f7/fastavro-1.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06b6971d3dae10cb34353b857d16ad21ebd6f0ea394e86c96abdcad109005d6e", size = 3320589, upload-time = "2026-04-24T14:36:54.647Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e9/aca0456216b5b8992e7b0a8542711b66799c05bfe24c8e32ef6f56e7eb93/fastavro-1.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:98dfcdfaf1498ae2f0e2fafe900a82e8320cc81d8ae5a95b8b8879eaa3298c39", size = 440883, upload-time = "2026-04-24T14:36:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7e/984896e716af504927be71b80a1e9661aa96c6f9e1e777d52823aacb99f2/fastavro-1.12.2-cp313-cp313-win_arm64.whl", hash = "sha256:3888ef7a51adc77cdf07251bc762566a1be36211e1cff689f13980f3776a2f36", size = 377536, upload-time = "2026-04-24T14:36:58.274Z" }, + { url = "https://files.pythonhosted.org/packages/e9/42/09a1e1f8d9998d73848a6ff0aad6713ae6abf0dbf99918776f8ef33344a7/fastavro-1.12.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:283dcd3129b632021894425974bedd0eb6db3bbf5994e448ccad10db4d803d31", size = 1049506, upload-time = "2026-04-24T14:36:59.797Z" }, + { url = "https://files.pythonhosted.org/packages/52/ef/80cc16f43919d532f25a707f34b275cccc09dca87a05b000fbbfc8e8f255/fastavro-1.12.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d125e210d5a0a1f701f12c0ecad9a03f1b04b5eddbce6ca36a1fc217da977ef", size = 3495899, upload-time = "2026-04-24T14:37:02.306Z" }, + { url = "https://files.pythonhosted.org/packages/c1/54/a0817d1d0236e9e0233f5c996f450cc795b056b8e06edb531f24b9df82ed/fastavro-1.12.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d4d66afad78e8f47feaa307728a6b71fe3effc63ba2b9eeb109ee687c9bd397", size = 3399232, upload-time = "2026-04-24T14:37:04.837Z" }, + { url = "https://files.pythonhosted.org/packages/38/0a/650f256c15f5875b6081544b9ba7ed8254329213e7e49e3db0aec68b5bee/fastavro-1.12.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2328ec07925c04c89719e3971c9068a165c7fd474ea87675b1204de0440e71ff", size = 3320222, upload-time = "2026-04-24T14:37:07.281Z" }, + { url = "https://files.pythonhosted.org/packages/f5/54/8351d388f94fbb0870e8cffaae41d3cc607acc8d6a8a6a217e2794829593/fastavro-1.12.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:55dea7e74b834d4b70467fc19c5b9ccb5509fe39abc4d26891187c1b22176423", size = 3337096, upload-time = "2026-04-24T14:37:09.452Z" }, + { url = "https://files.pythonhosted.org/packages/da/eb/b36ba9a88826e8c272df02e2f8b5da717e88b6eb508fddca3ca450043731/fastavro-1.12.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8d37c87826ae7195cfbd20fcd448801f2f563bb38f2691ec6574e39cb9eca6c8", size = 963119, upload-time = "2026-04-24T14:37:11.557Z" }, + { url = "https://files.pythonhosted.org/packages/e1/02/3d7f540fb26ba4ea1f4ebd2783c586614da9ac00906a3092e92fd3f104a2/fastavro-1.12.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c463a3701f293e30d3d62e71e1989f112028d07f87432baf4507eeb57ec3831", size = 3266238, upload-time = "2026-04-24T14:37:13.84Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0b/b77be56c5109da0fc7dcfd7e6b6752fe0a61d0a5c58c6a65e38b4501946a/fastavro-1.12.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f604ba83498e209fff4c7ecc5063a39421dc538dace694bc592f9f338254f3dc", size = 3324020, upload-time = "2026-04-24T14:37:16.096Z" }, + { url = "https://files.pythonhosted.org/packages/e7/6e/951d41f244107e91bf2f59245b71783c03eaab4bdbc960d58316c19652bb/fastavro-1.12.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bfac2dada8ddc002e8b7d8289d6fad4f070bc1fec20371cec684a7d10d932e96", size = 3170160, upload-time = "2026-04-24T14:37:18.168Z" }, + { url = "https://files.pythonhosted.org/packages/94/6f/2adb571fda448d4afd2466e1cef2963fefdc6b37847da05249983e415f17/fastavro-1.12.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bc44ba6289fb1f5ee318335958dde6ad6d742dcb4bb8930de843e9024c64b68c", size = 3281842, upload-time = "2026-04-24T14:37:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/17/07/4bad2e96c4c6bae40253be2573cc09c1e5b9ccf821e1ff74e0d33b64bf90/fastavro-1.12.2-cp314-cp314-win_amd64.whl", hash = "sha256:a475418f71c5aed69899813ecccf392429c08c3a63df3030129db71760b0db8f", size = 450903, upload-time = "2026-04-24T14:37:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b7/180f67ba9a46ba23a1ff6432f48d3087d4f2048579ecc262b00426cb1c63/fastavro-1.12.2-cp314-cp314-win_arm64.whl", hash = "sha256:daec9f9655a1d4636613c47d6d3343f6e039150d66cdce62543e20ca36612a8a", size = 391076, upload-time = "2026-04-24T14:37:24.756Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8f/18f60329b627d2118a4a2b19e8741fbd807d60bf0470554e1bbfb7f1bca3/fastavro-1.12.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:57594b72cf663bbd0f3ad8a319a999fc3d7c71065a6799b2c1d1a6a137894c5b", size = 1055430, upload-time = "2026-05-09T21:53:14.364Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ac/a1fa1fc29df0efc89d4946a743b09bdc9500591b5b92083eaf8e93664916/fastavro-1.12.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74412132bbfb153cbf704517f2c89f7d3e170feb681b13bceace690f66f8d5fa", size = 3503075, upload-time = "2026-04-24T14:37:26.826Z" }, + { url = "https://files.pythonhosted.org/packages/82/bf/4f669e10b6bc38a731ee3400aed1a1e2d0a3e3cf411e72f6b320d3af0eaf/fastavro-1.12.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e367a84c9133018e0a3bc822abe78d7f1f9a6092991a0ec409468cf4ef260282", size = 3410900, upload-time = "2026-04-24T14:37:29.233Z" }, + { url = "https://files.pythonhosted.org/packages/10/39/ecb19fdae4158a7730b5963fbf1b6d38d74678392d73083be518642af0c1/fastavro-1.12.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:044fafca0853e9ae14009de7763ac9e8e8f8b96f8a4e90bd58b695443266a370", size = 3335637, upload-time = "2026-04-24T14:37:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/32/f1/f21bd5319113e89ceceed2df840df21e9c5150d181db74b6ba80400f9f48/fastavro-1.12.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afede7324822800e4f90e96b9514188a237a60f35e8e7a10b2129c10c78f6e4d", size = 3356664, upload-time = "2026-04-24T14:37:34.231Z" }, +] + +[[package]] +name = "filelock" +version = "3.29.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/c8/35bdf04fb30755e2ed758f877edf3eb4a243c2463d3a258cc28b18b7a6e2/filelock-3.29.6.tar.gz", hash = "sha256:895c532ef3f4ef04972b9446a8c4e2931a5c399ff3c4be4c9369f2639b80f793", size = 70301, upload-time = "2026-07-06T23:08:08.577Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/49/7467c2946ccd9617f7da38187071bdc45bb9a95df51f4d63d6622432ce4e/filelock-3.29.6-py3-none-any.whl", hash = "sha256:14d5f5597d2e0c4dbd774cfb6d8132da1db44da83732aab679d54f7dcf97ab65", size = 45478, upload-time = "2026-07-06T23:08:07.197Z" }, +] + +[[package]] +name = "firebase-admin" +version = "7.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachecontrol" }, + { name = "google-api-core", extra = ["grpc"], marker = "platform_python_implementation != 'PyPy' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, + { name = "google-cloud-firestore", marker = "platform_python_implementation != 'PyPy' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, + { name = "google-cloud-storage" }, + { name = "httpx", extra = ["http2"] }, + { name = "pyjwt", extra = ["crypto"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/bc/769faa4e14d274a89d26c6e81337a279ce6ec795f885751db6b530e2784c/firebase_admin-7.5.0.tar.gz", hash = "sha256:6e2810cec954c6e69f21fd6dac9db152a0ba3fe11b7f8793830ad1e3a0032e20", size = 202138, upload-time = "2026-07-02T15:06:30.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/7e/718dc2599ec9a4e8cce37cd227fd4d4d998b5ac643660432316432b7cd9d/firebase_admin-7.5.0-py3-none-any.whl", hash = "sha256:a37383d9c2e406d82a660776679672bed74407fc50bde7aa1418ed436d0346b7", size = 141490, upload-time = "2026-07-02T15:06:28.967Z" }, +] + +[[package]] +name = "flask" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker" }, + { name = "click" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424, upload-time = "2026-02-19T05:00:56.027Z" }, +] + +[[package]] +name = "freezegun" +version = "1.5.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/dd/23e2f4e357f8fd3bdff613c1fe4466d21bfb00a6177f238079b17f7b1c84/freezegun-1.5.5.tar.gz", hash = "sha256:ac7742a6cc6c25a2c35e9292dfd554b897b517d2dec26891a2e8debf205cb94a", size = 35914, upload-time = "2025-08-09T10:39:08.338Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/2e/b41d8a1a917d6581fc27a35d05561037b048e47df50f27f8ac9c7e27a710/freezegun-1.5.5-py3-none-any.whl", hash = "sha256:cd557f4a75cf074e84bc374249b9dd491eaeacd61376b9eb3c423282211619d2", size = 19266, upload-time = "2025-08-09T10:39:06.636Z" }, +] + +[[package]] +name = "fuzzywuzzy" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/4b/0a002eea91be6048a2b5d53c5f1b4dafd57ba2e36eea961d05086d7c28ce/fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8", size = 28888, upload-time = "2020-02-13T21:06:27.054Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ff/74f23998ad2f93b945c0309f825be92e04e0348e062026998b5eefef4c33/fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993", size = 18272, upload-time = "2020-02-13T21:06:25.209Z" }, +] + +[[package]] +name = "glob2" +version = "0.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/a5/bbbc3b74a94fbdbd7915e7ad030f16539bfdc1362f7e9003b594f0537950/glob2-0.7.tar.gz", hash = "sha256:85c3dbd07c8aa26d63d7aacee34fa86e9a91a3873bc30bf62ec46e531f92ab8c", size = 10697, upload-time = "2019-06-10T23:33:48.308Z" } + +[[package]] +name = "google-api-core" +version = "2.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "googleapis-common-protos" }, + { name = "proto-plus" }, + { name = "protobuf" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/22/155cadf1d49272a9cf48f3168c0f3874fa13397297e611a5ea00cd093880/google_api_core-2.31.0.tar.gz", hash = "sha256:2be84ee0f584c48e6bde1b36766e23348b361fb7e55e56135fc76ce1c397f9c2", size = 176492, upload-time = "2026-06-03T14:52:17.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/40/9bdbb60b03a332bd45acb8703da08bbc27d991d35286b62e42acc86d243a/google_api_core-2.31.0-py3-none-any.whl", hash = "sha256:ef79fb3784c71cbac89cbd03301ba0c8fb8ad2aa95d7f9204dd9628f7adf59ab", size = 173102, upload-time = "2026-06-03T14:51:26.729Z" }, +] + +[package.optional-dependencies] +grpc = [ + { name = "grpcio" }, + { name = "grpcio-status" }, +] + +[[package]] +name = "google-auth" +version = "2.55.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyasn1-modules" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/6f/f3f4ac177c67bbee8fe8e88f2ab4f36af88c44a096e165c5217accf6e5d3/google_auth-2.55.1.tar.gz", hash = "sha256:fb2d9b730f2c9b8d326ec8d7222f21aef2ead15bf0513793d6442485d87af0a1", size = 349527, upload-time = "2026-06-25T23:39:27.182Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/1d/f6d3ca1ad0725f2e08a1c6915640748a52de2e66596160a4d53b010cccf0/google_auth-2.55.1-py3-none-any.whl", hash = "sha256:eada68dfd52b3b81191827601e2a0c3fa12540c818534b630ddc5355769c3995", size = 252349, upload-time = "2026-06-25T23:38:52.946Z" }, +] + +[[package]] +name = "google-cloud-core" +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/dd/1eef226e470369b26824a505c34482c0b493bc35fe8e0c6b003b5feca21a/google_cloud_core-2.6.0.tar.gz", hash = "sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83", size = 36001, upload-time = "2026-05-07T08:04:04.124Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/4a/98da8930ab109c73d9a5d13782a9ebb81ea8c111f6d534a567b71d23e52b/google_cloud_core-2.6.0-py3-none-any.whl", hash = "sha256:6d63ac8e5eca6d9e4319d0a1e2265fadcd7f1049904378caecfa01cf52dd869e", size = 29390, upload-time = "2026-05-07T08:02:34.672Z" }, +] + +[[package]] +name = "google-cloud-firestore" +version = "2.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core", extra = ["grpc"] }, + { name = "google-auth" }, + { name = "google-cloud-core" }, + { name = "grpcio" }, + { name = "proto-plus" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/e2/7db007e30a84a2134a8c2880d3cfc30673f5f37f4e3b5b50ead6c3c61465/google_cloud_firestore-2.28.0.tar.gz", hash = "sha256:8211418bd746f3857046fc375138ddd0dfb023d5012545a9ade149be1461c6db", size = 651021, upload-time = "2026-06-25T23:39:43.754Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/96/6d58d540145b06d372a9ead34cf50ff17f35296cf9a8c43ccc141aa207ea/google_cloud_firestore-2.28.0-py3-none-any.whl", hash = "sha256:055daab3e5fb292f389b4e7d9e03dffb30f38a3463c23363f93d25569c933e59", size = 431943, upload-time = "2026-06-25T23:39:11.735Z" }, +] + +[[package]] +name = "google-cloud-storage" +version = "3.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, + { name = "google-cloud-core" }, + { name = "google-crc32c" }, + { name = "google-resumable-media" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/72/86f94e1639a8bcd9d33e8e01b49afcaa1c3a13bda7683c681717e0901e15/google_cloud_storage-3.12.0.tar.gz", hash = "sha256:03ae9847c6babb368f35f054126b8a08cbc0e3266efb990eb17b9926a45cf3be", size = 17338620, upload-time = "2026-06-12T18:03:29.215Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/bd/a89eaebd2f9db5f92ddcc8e4f23c266be1dbd11058bb83451d8dd029f34c/google_cloud_storage-3.12.0-py3-none-any.whl", hash = "sha256:3880773754ddf7c27567b04e2a4d193950b6b99429f37b9097d873686e95b09c", size = 340605, upload-time = "2026-06-12T18:03:12.677Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/41/4b9c02f99e4c5fb477122cd5437403b552873f014616ac1d19ac8221a58d/google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79", size = 14192, upload-time = "2025-12-16T00:35:25.142Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/5f/7307325b1198b59324c0fa9807cafb551afb65e831699f2ce211ad5c8240/google_crc32c-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113", size = 31300, upload-time = "2025-12-16T00:21:56.723Z" }, + { url = "https://files.pythonhosted.org/packages/21/8e/58c0d5d86e2220e6a37befe7e6a94dd2f6006044b1a33edf1ff6d9f7e319/google_crc32c-1.8.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb", size = 30867, upload-time = "2025-12-16T00:38:31.302Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a9/a780cc66f86335a6019f557a8aaca8fbb970728f0efd2430d15ff1beae0e/google_crc32c-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411", size = 33364, upload-time = "2025-12-16T00:40:22.96Z" }, + { url = "https://files.pythonhosted.org/packages/21/3f/3457ea803db0198c9aaca2dd373750972ce28a26f00544b6b85088811939/google_crc32c-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454", size = 33740, upload-time = "2025-12-16T00:40:23.96Z" }, + { url = "https://files.pythonhosted.org/packages/df/c0/87c2073e0c72515bb8733d4eef7b21548e8d189f094b5dad20b0ecaf64f6/google_crc32c-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962", size = 34437, upload-time = "2025-12-16T00:35:21.395Z" }, + { url = "https://files.pythonhosted.org/packages/d1/db/000f15b41724589b0e7bc24bc7a8967898d8d3bc8caf64c513d91ef1f6c0/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b", size = 31297, upload-time = "2025-12-16T00:23:20.709Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/8ebed0c39c53a7e838e2a486da8abb0e52de135f1b376ae2f0b160eb4c1a/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27", size = 30867, upload-time = "2025-12-16T00:43:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/b468aec74a0354b34c8cbf748db20d6e350a68a2b0912e128cabee49806c/google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa", size = 33344, upload-time = "2025-12-16T00:40:24.742Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e8/b33784d6fc77fb5062a8a7854e43e1e618b87d5ddf610a88025e4de6226e/google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8", size = 33694, upload-time = "2025-12-16T00:40:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/92/b1/d3cbd4d988afb3d8e4db94ca953df429ed6db7282ed0e700d25e6c7bfc8d/google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f", size = 34435, upload-time = "2025-12-16T00:35:22.107Z" }, + { url = "https://files.pythonhosted.org/packages/21/88/8ecf3c2b864a490b9e7010c84fd203ec8cf3b280651106a3a74dd1b0ca72/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697", size = 31301, upload-time = "2025-12-16T00:24:48.527Z" }, + { url = "https://files.pythonhosted.org/packages/36/c6/f7ff6c11f5ca215d9f43d3629163727a272eabc356e5c9b2853df2bfe965/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651", size = 30868, upload-time = "2025-12-16T00:48:12.163Z" }, + { url = "https://files.pythonhosted.org/packages/56/15/c25671c7aad70f8179d858c55a6ae8404902abe0cdcf32a29d581792b491/google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2", size = 33381, upload-time = "2025-12-16T00:40:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/42/fa/f50f51260d7b0ef5d4898af122d8a7ec5a84e2984f676f746445f783705f/google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21", size = 33734, upload-time = "2025-12-16T00:40:27.028Z" }, + { url = "https://files.pythonhosted.org/packages/08/a5/7b059810934a09fb3ccb657e0843813c1fee1183d3bc2c8041800374aa2c/google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2", size = 34878, upload-time = "2025-12-16T00:35:23.142Z" }, +] + +[[package]] +name = "google-resumable-media" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-crc32c" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/f8/1ca5781d6be9cb9f73f7d40f4958c4bd1226a60598e3e39e1d6aaf838c4b/google_resumable_media-2.10.0.tar.gz", hash = "sha256:e324bc9d0fdae4c52a08ae90456edc4e71ece858399e1217ac0eb3a51d6bc6ee", size = 2164570, upload-time = "2026-06-03T16:14:26.103Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/d8/00c6854ac1512bb9eaf13bd3f8f28222f7674947fc510a4ff7616f2efc80/google_resumable_media-2.10.0-py3-none-any.whl", hash = "sha256:88152884bee37b2bf36a0ab81ad8c7fd12212c9803dd981d77c1b35b02d34e7c", size = 81533, upload-time = "2026-06-03T16:13:12.51Z" }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.75.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/c8/e2645aa8ed02fd4c7a2f59d68783b65b1f3cbdfe39a6308e156509d1fee8/googleapis_common_protos-1.75.0-py3-none-any.whl", hash = "sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed", size = 300631, upload-time = "2026-05-07T08:03:30.345Z" }, +] + +[[package]] +name = "grpcio" +version = "1.82.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/19/e29d3979b420b92d516ee97f0bff4fb88cbb3d724791318f50beb55db549/grpcio-1.82.0.tar.gz", hash = "sha256:bfe3247e0bb598585ce26565730970d21bccf3c9dc547dc6703a1a3c7888e8e1", size = 13184479, upload-time = "2026-07-06T04:22:54.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/e6/9ce68bc431224177b6f506cfb4896a742119c51255143069970955b6510b/grpcio-1.82.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:03cce11532da292215cd8e5f444de91982e39dfb41a916e0e0f91a5c128588ea", size = 6144680, upload-time = "2026-07-06T04:21:29.808Z" }, + { url = "https://files.pythonhosted.org/packages/59/93/00ecf28e1be7a70b4b4d148d3a551b6c9a37024a669c3650a2c374c64026/grpcio-1.82.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:01336fe31d1ea5d5154b0d803eb3584e69fb96e0e657acc87bd4d48d6abc9587", size = 11952213, upload-time = "2026-07-06T04:21:32.347Z" }, + { url = "https://files.pythonhosted.org/packages/38/05/9be6bf4cddb5b5f39c0748cdf5639525cd4116a157c8f3802c9217e54882/grpcio-1.82.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe56f1bea709ddb2531fbd510a2dd6040e993985507c3b2bf3404507aee989b1", size = 6710770, upload-time = "2026-07-06T04:21:35.382Z" }, + { url = "https://files.pythonhosted.org/packages/00/97/62c0969e993673ebef16d526db2504f38bc4c73cf2593c28746791ab7956/grpcio-1.82.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:77a5d8fe331376c7aaa4e06e903a43bd144de4f98c6e414e13cbc5d64e5aa61e", size = 7450671, upload-time = "2026-07-06T04:21:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/67/1f/d83d9fbaaef2b6ebbf70a6e467000f13f92b4cf0b84c561c162b43128439/grpcio-1.82.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9ce80ea66c803398fde9c5b1fd925920c9742da7f10f8b85acac0adac3e4d7e0", size = 6886855, upload-time = "2026-07-06T04:21:40.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/36/5ed2e28b8c5f00599c7d5e94d5f82c32cf73a6fa42d13c2900cb37c861ec/grpcio-1.82.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4665dc8c9ec30acff455e2b15c47b825f18647c555483aa1ccf670adead8adcc", size = 7501322, upload-time = "2026-07-06T04:21:43.78Z" }, + { url = "https://files.pythonhosted.org/packages/89/4e/69113709e14e24289940d6aef067b797c73c8c96f580683af7d5f09b22b0/grpcio-1.82.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4405d19ecfc7a8caa9043ff5a651e1871b54fc620f917de5dede7e6fb78e9e14", size = 8536896, upload-time = "2026-07-06T04:21:46.387Z" }, + { url = "https://files.pythonhosted.org/packages/30/f6/08bd6eb89a558f0f59dacaef747afda7c21e2c2ecf138ae2ec533dea8aeb/grpcio-1.82.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:30e580c19178609799660f52b1e1eb09248969be20dc44caaa4dcaa3e8450dd9", size = 7913890, upload-time = "2026-07-06T04:21:49.733Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a1/04b467e2ffc93f8e50b660bc6f47c3c8e9ba7603104a741e3d5663a261d4/grpcio-1.82.0-cp312-cp312-win32.whl", hash = "sha256:dbbd83dbaa856b387a4eba74ec3add7f594f090d3b4d390d829dd5834816aae4", size = 4240969, upload-time = "2026-07-06T04:21:52.281Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/15d3601384d5937e8d9fbe6d8e7b8171008d649744dd7b6c864932937ec9/grpcio-1.82.0-cp312-cp312-win_amd64.whl", hash = "sha256:73176d270699d76a9dc3753f25e01c19fb98f830f826a506e917d83629f1b39b", size = 5001575, upload-time = "2026-07-06T04:21:54.839Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c8/7aace81e7cd12c6ffccf0d47ac389a3f19e5280e9ab04d301d02855ecd25/grpcio-1.82.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:841bcaa24882921d41cd7a82118f9a766edcf8807c2f486e7deeb0ff5ea36181", size = 6146066, upload-time = "2026-07-06T04:21:57.527Z" }, + { url = "https://files.pythonhosted.org/packages/10/17/b448f2265e4927188425c0b09fb943c39b50f7f53fbead644b44ccdf834b/grpcio-1.82.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:d4bb7219c39c735e6573ae3c33aeafb2a4e1f1cc93a762f7899c283defaed365", size = 11948617, upload-time = "2026-07-06T04:22:00.066Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a3/fba54e50fffc9f74b1ffd5eb4e47310e6650557ef136a165f1fe7df03a65/grpcio-1.82.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:254230d2cb773a87380858d0fc74653b4761bf2013c83fe1c5d77ed8f241fc9d", size = 6714591, upload-time = "2026-07-06T04:22:04.04Z" }, + { url = "https://files.pythonhosted.org/packages/29/6f/f0ec3f1a61a746dc7037a737ba4cbe60959645311ac8542bb1ad4e72ae8b/grpcio-1.82.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:16d4f215344057eb21038319b05a0c531306230c17b075fa8461a944581006dd", size = 7454986, upload-time = "2026-07-06T04:22:06.776Z" }, + { url = "https://files.pythonhosted.org/packages/b6/11/9d6ce94465d6a7f92c413430b3e77f0879b39427a217ffb3d23585df4bb3/grpcio-1.82.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a7c283b459151a2e84df32b28c31562ab3e7f624bccffce176c5608565b0212f", size = 6888623, upload-time = "2026-07-06T04:22:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/51/1a/b887adb7abb69081c4f24bc66c3612975e87caf5f7c6aa3916bb82d42e5f/grpcio-1.82.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:96a3be4d2a482ff004c036f6391f33553b36a7627138d1ca3ecc1e70d55d8af5", size = 7505067, upload-time = "2026-07-06T04:22:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/60/94/90f11c0f227ac653cff769e05c7f279da945e134c9351a1c37d475714686/grpcio-1.82.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bc481e6c7e6c8721797f2ab764092c843fd5cea06d4c7e9f4c3e3b7ecf331eb0", size = 8535382, upload-time = "2026-07-06T04:22:14.453Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3d/de8569386685213135dfbaab58e221add11858485524cf7d5987efc6d70b/grpcio-1.82.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:680f633bc788652222cb90a568ec374edcd91e1fe7715a7c248ece8e1032c2bd", size = 7910708, upload-time = "2026-07-06T04:22:17.994Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/3950b32369763818ae89ef76d52e84bd034d3a0ab46bf315669c913b32e2/grpcio-1.82.0-cp313-cp313-win32.whl", hash = "sha256:640b4715b9c206e5176e46601aa1422c47c779f642a869dfd27062e8fde13dfb", size = 4240351, upload-time = "2026-07-06T04:22:20.626Z" }, + { url = "https://files.pythonhosted.org/packages/a7/5c/c7b9a48efe973883f5707a311f87772a4c307a22ec80d6f3c851846a0a02/grpcio-1.82.0-cp313-cp313-win_amd64.whl", hash = "sha256:8523e81bd23f83e607aed28fbd8244b2be4aeb34e084fcef1bd1867709085c2a", size = 5000985, upload-time = "2026-07-06T04:22:23.365Z" }, + { url = "https://files.pythonhosted.org/packages/bd/6e/abc5efe11b73eefa0183531032eef2a53f33aeced6484b0d9da559c12ed6/grpcio-1.82.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:136969867c14fcc743fa39b12d7da133cae7da4f8e0e7767b6b8b7e75a8c24fd", size = 6146898, upload-time = "2026-07-06T04:22:26.082Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e4/d01ee88ceac221436dce1584ae1f046bd44d0dffc5a92e95aa34857c4516/grpcio-1.82.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:a7e246cd216662f513ae79ea3afadde6afe8a659b48a4170bae9a896e69ac254", size = 11954897, upload-time = "2026-07-06T04:22:29.114Z" }, + { url = "https://files.pythonhosted.org/packages/99/b9/2a35540ec08afc08859c35afd1a8a51e2585f39b12cf4eee68dcb1fa973d/grpcio-1.82.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:85c2a4e9e8a30d73d41e547a5101e57a1ed2093ec4b2daf6847c344adba00523", size = 6723102, upload-time = "2026-07-06T04:22:32.146Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ba/af71af59943b5d08879617a1d97495d45c53e43f3c6ef16f820c64e107f9/grpcio-1.82.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:a3a7802328e0d20e6ac458ff1974a8096cfaa3ca84dea0903235f641f1d703c1", size = 7454545, upload-time = "2026-07-06T04:22:34.776Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7e/258aae12b68910140725873657469ff166f8968bdb0674e12d6452b1812c/grpcio-1.82.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9331e6b91b26cffd63fb70a545f3c2cac8dc1b434b4436f43915c23e1e22f265", size = 6889585, upload-time = "2026-07-06T04:22:37.411Z" }, + { url = "https://files.pythonhosted.org/packages/5e/04/cfada8930306b9101cfb405b33ecb3b72abce51d725f900f167ffbc3146b/grpcio-1.82.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:670ab93a0059e707de53b9e715304b9f566b6defee80e5490cdd15820ce032f6", size = 7514162, upload-time = "2026-07-06T04:22:40.076Z" }, + { url = "https://files.pythonhosted.org/packages/2e/57/955f95989338857a6d73ee838b4d9e8198d50972a70ca83ec22322396f4c/grpcio-1.82.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbfe2e321bb30b84799677d6e8469896e487b494e9e4fbc9b8cc4425fe054d44", size = 8536163, upload-time = "2026-07-06T04:22:42.801Z" }, + { url = "https://files.pythonhosted.org/packages/06/62/826da0b0f01c7ba3f7ea0185968f551290deb28968d98b1edf604c895db8/grpcio-1.82.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2472b72a55da8570e089f1ca22f34a350d86c109be2755f6ee1cca5ebbdd9b54", size = 7912573, upload-time = "2026-07-06T04:22:46.187Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b4/d8824a66ac1ac7fbcdf63806f1a8725d95426654e859afa4606070c78740/grpcio-1.82.0-cp314-cp314-win32.whl", hash = "sha256:c9feb986151c2726789599b3672c1c9faa1d0824da921dc3f33a8cb1f93e2861", size = 4321824, upload-time = "2026-07-06T04:22:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/da/08/02e581cc0bbb4c7b842f85e66a945b46d5bcc5927575c1086edfbc3360e7/grpcio-1.82.0-cp314-cp314-win_amd64.whl", hash = "sha256:b1eeb0480d86965263f8c8ae7ee5360c284d22176a196aab02fce7fba8d89dd8", size = 5141112, upload-time = "2026-07-06T04:22:51.443Z" }, +] + +[[package]] +name = "grpcio-status" +version = "1.82.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "googleapis-common-protos" }, + { name = "grpcio" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/c3/42148fdb28747b6c12df1351dece3fd574262fa14b180eca9821428626df/grpcio_status-1.82.0.tar.gz", hash = "sha256:ea0cbc12c52a902cb33ba56fb3233dcfad53ffead08f4a659b1752d473a6a0ac", size = 13902, upload-time = "2026-07-06T04:26:47.864Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/f3/fe7e1f57f170ed6cae20eecc0dea62e9de862e68adede80a6cd54a9b4dfa/grpcio_status-1.82.0-py3-none-any.whl", hash = "sha256:d41e45164ae2c265b268aebd9d86defa292a1ba91d86a548bad1f059c4645676", size = 14634, upload-time = "2026-07-06T04:26:38.672Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "h2" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hpack" }, + { name = "hyperframe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" }, +] + +[[package]] +name = "hpack" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/5b/fcabf6028144a8723726318b07a32c2f3314acdff6265743cf08a344b18e/hpack-4.2.0.tar.gz", hash = "sha256:0895cfa3b5531fc65fe439c05eb65144f123bf7a394fcaa56aa423548d8e45c0", size = 51300, upload-time = "2026-06-23T18:34:46.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/b4/4a9fcfb2aef6ba44d9073ecd301443aa00b3dac95de5619f2a7de7ec8a91/hpack-4.2.0-py3-none-any.whl", hash = "sha256:858ac0b02280fa582b5080d68db0899c62a80375e0e5413a74970c5e518b6986", size = 34246, upload-time = "2026-06-23T18:34:45.472Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[package.optional-dependencies] +http2 = [ + { name = "h2" }, +] + +[[package]] +name = "hyperframe" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, +] + +[[package]] +name = "id" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/04/c2156091427636080787aac190019dc64096e56a23b7364d3c1764ee3a06/id-1.6.1.tar.gz", hash = "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069", size = 18088, upload-time = "2026-02-04T16:19:41.26Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/77/de194443bf38daed9452139e960c632b0ef9f9a5dd9ce605fdf18ca9f1b1/id-1.6.1-py3-none-any.whl", hash = "sha256:f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca", size = 14689, upload-time = "2026-02-04T16:19:40.051Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "imagesize" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, +] + +[[package]] +name = "inflection" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/7e/691d061b7329bc8d54edbf0ec22fbfb2afe61facb681f9aaa9bff7a27d04/inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417", size = 15091, upload-time = "2020-08-22T08:16:29.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", size = 9454, upload-time = "2020-08-22T08:16:27.816Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "invoke" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/227c48c5fe47fa178ccf1fda8f047d16c97ba926567b661e9ce2045c600c/invoke-3.0.3.tar.gz", hash = "sha256:437b6a622223824380bfb4e64f612711a6b648c795f565efc8625af66fb57f0c", size = 343419, upload-time = "2026-04-07T15:17:48.307Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/de/bbc12563bbf979618d17625a4e753ff7a078523e28d870d3626daa97261a/invoke-3.0.3-py3-none-any.whl", hash = "sha256:f11327165e5cbb89b2ad1d88d3292b5113332c43b8553b494da435d6ec6f5053", size = 160958, upload-time = "2026-04-07T15:17:46.875Z" }, +] + +[[package]] +name = "iso8601" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/f3/ef59cee614d5e0accf6fd0cbba025b93b272e626ca89fb70a3e9187c5d15/iso8601-2.1.0.tar.gz", hash = "sha256:6b1d3829ee8921c4301998c909f7829fa9ed3cbdac0d3b16af2d743aed1ba8df", size = 6522, upload-time = "2023-10-03T00:25:39.317Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/0c/f37b6a241f0759b7653ffa7213889d89ad49a2b76eb2ddf3b57b2738c347/iso8601-2.1.0-py3-none-any.whl", hash = "sha256:aac4145c4dcb66ad8b648a02830f5e2ff6c24af20f4f482689be402db2429242", size = 7545, upload-time = "2023-10-03T00:25:32.304Z" }, +] + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "isort" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/82/fa43935523efdfcce6abbae9da7f372b627b27142c3419fcf13bf5b0c397/isort-6.1.0.tar.gz", hash = "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481", size = 824325, upload-time = "2025-10-01T16:26:45.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/cc/9b681a170efab4868a032631dea1e8446d8ec718a7f657b94d49d1a12643/isort-6.1.0-py3-none-any.whl", hash = "sha256:58d8927ecce74e5087aef019f778d4081a3b6c98f15a80ba35782ca8a2097784", size = 94329, upload-time = "2025-10-01T16:26:43.291Z" }, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, +] + +[[package]] +name = "jaraco-collections" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaraco-text" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/d2/751000cf702676dbb78f97728f4d52b029e817e2b3c94088dfe5c70ff46d/jaraco_collections-5.2.1.tar.gz", hash = "sha256:dab81970bad6f0ab53b20745f1b01da37926e4c0fcd425046aa45e0d8efa18ed", size = 19729, upload-time = "2025-06-21T20:03:24.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/fe/570f6a7b4443a3548ab02ba88c77b64521452a2eed2c80449d13be8fd4d1/jaraco_collections-5.2.1-py3-none-any.whl", hash = "sha256:ea3415ddfc50206b6ba7d09c3deb358b76a5f8c1ddc82be788e8e8bd151ebfa8", size = 11588, upload-time = "2025-06-21T20:03:22.935Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/cf/ea4ef2920830dea3f5ab2ea4da6fb67724e6dca80ee2553788c3607243d0/jaraco_functools-4.5.0.tar.gz", hash = "sha256:3bb5665ea4a020cf78a7040e89154c77edadb3ca74f366479669c5999aa70b03", size = 20272, upload-time = "2026-05-15T21:34:10.025Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl", hash = "sha256:79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4", size = 10594, upload-time = "2026-05-15T21:34:08.595Z" }, +] + +[[package]] +name = "jaraco-text" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "more-itertools" }, + { name = "typer-slim" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/20/f071dfb40f06fd0395167a40218c10adb7164635f65ebdafe45e0c714935/jaraco_text-4.2.0.tar.gz", hash = "sha256:194e386aa5b15a6616019df87a6b29c00fd3c9c8b0475731b64633ca7afd495b", size = 20077, upload-time = "2026-02-09T23:30:06.845Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/6d/628f347098059957987596123b3992120c673d17e8ce560185b1d6b88a27/jaraco_text-4.2.0-py3-none-any.whl", hash = "sha256:034408ef073f72de919124e9934a12acd50d10bd139bea47732620fa964b0144", size = 13267, upload-time = "2026-02-09T23:30:05.517Z" }, +] + +[[package]] +name = "jasmine" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argparse" }, + { name = "cherrypy" }, + { name = "django" }, + { name = "flask" }, + { name = "jasmine-core" }, + { name = "jinja2" }, + { name = "lettuce" }, + { name = "mock" }, + { name = "mockfs" }, + { name = "ordereddict" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "pyyaml", version = "3.10", source = { registry = "https://pypi.org/simple" } }, + { name = "selenium" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/06/759316d361d9f55cca32f7b0fef4a3dc2fbb0501c82e2a857423545351cf/jasmine-2.0.0.tar.gz", hash = "sha256:1cc3146984993f4a66e09e3afaa8c81dc2ed258964b4262a5522d56a5eeb051e", size = 16410, upload-time = "2014-02-28T19:54:32.293Z" } + +[[package]] +name = "jasmine-core" +version = "3.99.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "glob2" }, + { name = "ordereddict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/e8/50ea87204ad20a42f76164fae4ad31c5f89e6c97b2eef820de64d01c95f1/jasmine-core-3.99.0.tar.gz", hash = "sha256:9af06f63d8d5c392a64018aec6eb8af1df59c80a682b35ff9d01a5d42cfbc140", size = 94464, upload-time = "2022-01-01T19:08:35.856Z" } + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jsondiff" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml", version = "3.10", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-14-edx-enterprise-js-test'" }, + { name = "pyyaml", version = "6.0.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-14-edx-enterprise-dev' or extra == 'group-14-edx-enterprise-doc' or extra != 'group-14-edx-enterprise-js-test' or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/48/841137f1843fa215ea284834d1514b8e9e20962bda63a636c7417e02f8fb/jsondiff-2.2.1.tar.gz", hash = "sha256:658d162c8a86ba86de26303cd86a7b37e1b2c1ec98b569a60e2ca6180545f7fe", size = 26649, upload-time = "2024-08-29T04:09:06.201Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/94/a8066f84d62ab666d61ef97deba1a33126e3e5c0c0da2c458ada17053ed6/jsondiff-2.2.1-py3-none-any.whl", hash = "sha256:b1f0f7e2421881848b1d556d541ac01a91680cfcc14f51a9b62cdf4da0e56722", size = 13440, upload-time = "2024-08-29T04:09:04.955Z" }, +] + +[[package]] +name = "jsonfield" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/e9/537e105246dba81d898853dbbe17eb3edd23d47a35074b99fd4add6f1662/jsonfield-3.2.0.tar.gz", hash = "sha256:ca53871bc3308ae4f4cddc3b4f99ed5c6fc6abb1832fbfb499bc6da566c70e4a", size = 17156, upload-time = "2025-07-04T23:06:24.883Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/22/2e08e7b957f50e5eceefde018ce9ee88aceb5126231128d9c1cb8167c1c8/jsonfield-3.2.0-py3-none-any.whl", hash = "sha256:ca4f6bf89c819f293e77074d613c0021e3c4e8521be95c73d03caecb4372e1ee", size = 8316, upload-time = "2025-07-04T23:06:23.588Z" }, +] + +[[package]] +name = "jwcrypto" +version = "1.5.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/7e/53c14813521693e931e420d9db00efe317419ff194495903bce03402275e/jwcrypto-1.5.8.tar.gz", hash = "sha256:c3d7114b6f6e65b52f6b7da817eb8cb8423e1da31e1ef13508447c81ecbdcc34", size = 90772, upload-time = "2026-06-24T19:36:50.782Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/7c/f87c5db042c4f7b4476346fc0d22f1025a777fee08eebde3720d3b9c4eb5/jwcrypto-1.5.8-py3-none-any.whl", hash = "sha256:85aeb475f808d56bbc2f2ed1f6f73e6a317c4011a4321505f02f0aed695a3742", size = 96133, upload-time = "2026-06-24T19:36:49.519Z" }, +] + +[[package]] +name = "keyring" +version = "25.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, +] + +[[package]] +name = "kombu" +version = "5.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "amqp" }, + { name = "packaging" }, + { name = "tzdata" }, + { name = "vine" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/a5/607e533ed6c83ae1a696969b8e1c137dfebd5759a2e9682e26ff1b97740b/kombu-5.6.2.tar.gz", hash = "sha256:8060497058066c6f5aed7c26d7cd0d3b574990b09de842a8c5aaed0b92cc5a55", size = 472594, upload-time = "2025-12-29T20:30:07.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/0f/834427d8c03ff1d7e867d3db3d176470c64871753252b21b4f4897d1fa45/kombu-5.6.2-py3-none-any.whl", hash = "sha256:efcfc559da324d41d61ca311b0c64965ea35b4c55cc04ee36e55386145dace93", size = 214219, upload-time = "2025-12-29T20:30:05.74Z" }, +] + +[[package]] +name = "lettuce" +version = "0.2.23" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fuzzywuzzy" }, + { name = "python-subunit" }, + { name = "sure" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/13/3d6f2df85877965856fac975cf391714fcf54e7906462300c2d981b59481/lettuce-0.2.23.tar.gz", hash = "sha256:e9a86f98c7dbe860d9b51f8493a1f039663dcb05fddbad2e8c042ede33cc3c22", size = 56988, upload-time = "2016-07-26T14:25:00.003Z" } + +[[package]] +name = "lxml" +version = "5.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/80/61/d3dc048cd6c7be6fe45b80cedcbdd4326ba4d550375f266d9f4246d0f4bc/lxml-5.3.2.tar.gz", hash = "sha256:773947d0ed809ddad824b7b14467e1a481b8976e87278ac4a730c2f7c7fcddc1", size = 3679948, upload-time = "2025-04-05T18:31:58.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/7e/c749257a7fabc712c4df57927b0f703507f316e9f2c7e3219f8f76d36145/lxml-5.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:16b3897691ec0316a1aa3c6585f61c8b7978475587c5b16fc1d2c28d283dc1b0", size = 8193212, upload-time = "2025-04-05T18:26:42.692Z" }, + { url = "https://files.pythonhosted.org/packages/a8/50/17e985ba162c9f1ca119f4445004b58f9e5ef559ded599b16755e9bfa260/lxml-5.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8d4b34a0eeaf6e73169dcfd653c8d47f25f09d806c010daf074fba2db5e2d3f", size = 4451439, upload-time = "2025-04-05T18:26:46.468Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b5/4960ba0fcca6ce394ed4a2f89ee13083e7fcbe9641a91166e8e9792fedb1/lxml-5.3.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cd7a959396da425022e1e4214895b5cfe7de7035a043bcc2d11303792b67554", size = 5052146, upload-time = "2025-04-05T18:26:49.737Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d1/184b04481a5d1f5758916de087430752a7b229bddbd6c1d23405078c72bd/lxml-5.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cac5eaeec3549c5df7f8f97a5a6db6963b91639389cdd735d5a806370847732b", size = 4789082, upload-time = "2025-04-05T18:26:52.295Z" }, + { url = "https://files.pythonhosted.org/packages/7d/75/1a19749d373e9a3d08861addccdf50c92b628c67074b22b8f3c61997cf5a/lxml-5.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29b5f7d77334877c2146e7bb8b94e4df980325fab0a8af4d524e5d43cd6f789d", size = 5312300, upload-time = "2025-04-05T18:26:54.923Z" }, + { url = "https://files.pythonhosted.org/packages/fb/00/9d165d4060d3f347e63b219fcea5c6a3f9193e9e2868c6801e18e5379725/lxml-5.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13f3495cfec24e3d63fffd342cc8141355d1d26ee766ad388775f5c8c5ec3932", size = 4836655, upload-time = "2025-04-05T18:26:57.488Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e9/06720a33cc155966448a19677f079100517b6629a872382d22ebd25e48aa/lxml-5.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e70ad4c9658beeff99856926fd3ee5fde8b519b92c693f856007177c36eb2e30", size = 4961795, upload-time = "2025-04-05T18:27:00.126Z" }, + { url = "https://files.pythonhosted.org/packages/2d/57/4540efab2673de2904746b37ef7f74385329afd4643ed92abcc9ec6e00ca/lxml-5.3.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:507085365783abd7879fa0a6fa55eddf4bdd06591b17a2418403bb3aff8a267d", size = 4779791, upload-time = "2025-04-05T18:27:03.061Z" }, + { url = "https://files.pythonhosted.org/packages/99/ad/6056edf6c9f4fa1d41e6fbdae52c733a4a257fd0d7feccfa26ae051bb46f/lxml-5.3.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:5bb304f67cbf5dfa07edad904732782cbf693286b9cd85af27059c5779131050", size = 5346807, upload-time = "2025-04-05T18:27:05.877Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/5be91fc91a18f3f705ea5533bc2210b25d738c6b615bf1c91e71a9b2f26b/lxml-5.3.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:3d84f5c093645c21c29a4e972b84cb7cf682f707f8706484a5a0c7ff13d7a988", size = 4909213, upload-time = "2025-04-05T18:27:08.588Z" }, + { url = "https://files.pythonhosted.org/packages/f3/74/71bb96a3b5ae36b74e0402f4fa319df5559a8538577f8c57c50f1b57dc15/lxml-5.3.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:bdc13911db524bd63f37b0103af014b7161427ada41f1b0b3c9b5b5a9c1ca927", size = 4987694, upload-time = "2025-04-05T18:27:11.66Z" }, + { url = "https://files.pythonhosted.org/packages/08/c2/3953a68b0861b2f97234b1838769269478ccf872d8ea7a26e911238220ad/lxml-5.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ec944539543f66ebc060ae180d47e86aca0188bda9cbfadff47d86b0dc057dc", size = 4862865, upload-time = "2025-04-05T18:27:14.194Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9a/52e48f7cfd5a5e61f44a77e679880580dfb4f077af52d6ed5dd97e3356fe/lxml-5.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:59d437cc8a7f838282df5a199cf26f97ef08f1c0fbec6e84bd6f5cc2b7913f6e", size = 5423383, upload-time = "2025-04-05T18:27:16.988Z" }, + { url = "https://files.pythonhosted.org/packages/17/67/42fe1d489e4dcc0b264bef361aef0b929fbb2b5378702471a3043bc6982c/lxml-5.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e275961adbd32e15672e14e0cc976a982075208224ce06d149c92cb43db5b93", size = 5286864, upload-time = "2025-04-05T18:27:19.703Z" }, + { url = "https://files.pythonhosted.org/packages/29/e4/03b1d040ee3aaf2bd4e1c2061de2eae1178fe9a460d3efc1ea7ef66f6011/lxml-5.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:038aeb6937aa404480c2966b7f26f1440a14005cb0702078c173c028eca72c31", size = 5056819, upload-time = "2025-04-05T18:27:22.814Z" }, + { url = "https://files.pythonhosted.org/packages/83/b3/e2ec8a6378e4d87da3af9de7c862bcea7ca624fc1a74b794180c82e30123/lxml-5.3.2-cp312-cp312-win32.whl", hash = "sha256:3c2c8d0fa3277147bff180e3590be67597e17d365ce94beb2efa3138a2131f71", size = 3486177, upload-time = "2025-04-05T18:27:25.078Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8a/6a08254b0bab2da9573735725caab8302a2a1c9b3818533b41568ca489be/lxml-5.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:77809fcd97dfda3f399102db1794f7280737b69830cd5c961ac87b3c5c05662d", size = 3817134, upload-time = "2025-04-05T18:27:27.481Z" }, + { url = "https://files.pythonhosted.org/packages/19/fe/904fd1b0ba4f42ed5a144fcfff7b8913181892a6aa7aeb361ee783d441f8/lxml-5.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:77626571fb5270ceb36134765f25b665b896243529eefe840974269b083e090d", size = 8173598, upload-time = "2025-04-05T18:27:31.229Z" }, + { url = "https://files.pythonhosted.org/packages/97/e8/5e332877b3ce4e2840507b35d6dbe1cc33b17678ece945ba48d2962f8c06/lxml-5.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78a533375dc7aa16d0da44af3cf6e96035e484c8c6b2b2445541a5d4d3d289ee", size = 4441586, upload-time = "2025-04-05T18:27:33.883Z" }, + { url = "https://files.pythonhosted.org/packages/de/f4/8fe2e6d8721803182fbce2325712e98f22dbc478126070e62731ec6d54a0/lxml-5.3.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6f62b2404b3f3f0744bbcabb0381c5fe186fa2a9a67ecca3603480f4846c585", size = 5038447, upload-time = "2025-04-05T18:27:36.426Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ac/fa63f86a1a4b1ba8b03599ad9e2f5212fa813223ac60bfe1155390d1cc0c/lxml-5.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea918da00091194526d40c30c4996971f09dacab032607581f8d8872db34fbf", size = 4783583, upload-time = "2025-04-05T18:27:39.492Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7a/08898541296a02c868d4acc11f31a5839d80f5b21d4a96f11d4c0fbed15e/lxml-5.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c35326f94702a7264aa0eea826a79547d3396a41ae87a70511b9f6e9667ad31c", size = 5305684, upload-time = "2025-04-05T18:27:42.16Z" }, + { url = "https://files.pythonhosted.org/packages/0b/be/9a6d80b467771b90be762b968985d3de09e0d5886092238da65dac9c1f75/lxml-5.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3bef90af21d31c4544bc917f51e04f94ae11b43156356aff243cdd84802cbf2", size = 4830797, upload-time = "2025-04-05T18:27:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/8d/1c/493632959f83519802637f7db3be0113b6e8a4e501b31411fbf410735a75/lxml-5.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52fa7ba11a495b7cbce51573c73f638f1dcff7b3ee23697467dc063f75352a69", size = 4950302, upload-time = "2025-04-05T18:27:47.979Z" }, + { url = "https://files.pythonhosted.org/packages/c7/13/01aa3b92a6b93253b90c061c7527261b792f5ae7724b420cded733bfd5d6/lxml-5.3.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ad131e2c4d2c3803e736bb69063382334e03648de2a6b8f56a878d700d4b557d", size = 4775247, upload-time = "2025-04-05T18:27:51.174Z" }, + { url = "https://files.pythonhosted.org/packages/60/4a/baeb09fbf5c84809e119c9cf8e2e94acec326a9b45563bf5ae45a234973b/lxml-5.3.2-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:00a4463ca409ceacd20490a893a7e08deec7870840eff33dc3093067b559ce3e", size = 5338824, upload-time = "2025-04-05T18:27:54.15Z" }, + { url = "https://files.pythonhosted.org/packages/69/c7/a05850f169ad783ed09740ac895e158b06d25fce4b13887a8ac92a84d61c/lxml-5.3.2-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:87e8d78205331cace2b73ac8249294c24ae3cba98220687b5b8ec5971a2267f1", size = 4899079, upload-time = "2025-04-05T18:27:57.03Z" }, + { url = "https://files.pythonhosted.org/packages/de/48/18ca583aba5235582db0e933ed1af6540226ee9ca16c2ee2d6f504fcc34a/lxml-5.3.2-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bf6389133bb255e530a4f2f553f41c4dd795b1fbb6f797aea1eff308f1e11606", size = 4978041, upload-time = "2025-04-05T18:27:59.918Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/6968ddc88554209d1dba0dca196360c629b3dfe083bc32a3370f9523a0c4/lxml-5.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b3709fc752b42fb6b6ffa2ba0a5b9871646d97d011d8f08f4d5b3ee61c7f3b2b", size = 4859761, upload-time = "2025-04-05T18:28:02.83Z" }, + { url = "https://files.pythonhosted.org/packages/2e/52/d2d3baa1e0b7d04a729613160f1562f466fb1a0e45085a33acb0d6981a2b/lxml-5.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:abc795703d0de5d83943a4badd770fbe3d1ca16ee4ff3783d7caffc252f309ae", size = 5418209, upload-time = "2025-04-05T18:28:05.851Z" }, + { url = "https://files.pythonhosted.org/packages/d3/50/6005b297ba5f858a113d6e81ccdb3a558b95a615772e7412d1f1cbdf22d7/lxml-5.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98050830bb6510159f65d9ad1b8aca27f07c01bb3884ba95f17319ccedc4bcf9", size = 5274231, upload-time = "2025-04-05T18:28:08.849Z" }, + { url = "https://files.pythonhosted.org/packages/fb/33/6f40c09a5f7d7e7fcb85ef75072e53eba3fbadbf23e4991ca069ab2b1abb/lxml-5.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ba465a91acc419c5682f8b06bcc84a424a7aa5c91c220241c6fd31de2a72bc6", size = 5051899, upload-time = "2025-04-05T18:28:11.729Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3a/673bc5c0d5fb6596ee2963dd016fdaefaed2c57ede82c7634c08cbda86c1/lxml-5.3.2-cp313-cp313-win32.whl", hash = "sha256:56a1d56d60ea1ec940f949d7a309e0bff05243f9bd337f585721605670abb1c1", size = 3485315, upload-time = "2025-04-05T18:28:14.815Z" }, + { url = "https://files.pythonhosted.org/packages/8c/be/cab8dd33b0dbe3af5b5d4d24137218f79ea75d540f74eb7d8581195639e0/lxml-5.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:1a580dc232c33d2ad87d02c8a3069d47abbcdce974b9c9cc82a79ff603065dbe", size = 3814639, upload-time = "2025-04-05T18:28:17.268Z" }, +] + +[package.optional-dependencies] +html-clean = [ + { name = "lxml-html-clean" }, +] + +[[package]] +name = "lxml-html-clean" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/a4/5c62acfacd69ff4f5db395100f5cfb9b54e7ac8c69a235e4e939fd13f021/lxml_html_clean-0.4.4.tar.gz", hash = "sha256:58f39a9d632711202ed1d6d0b9b47a904e306c85de5761543b90e3e3f736acfb", size = 23899, upload-time = "2026-02-27T09:35:52.911Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/76/7ffc1d3005cf7749123bc47cb3ea343cd97b0ac2211bab40f57283577d0e/lxml_html_clean-0.4.4-py3-none-any.whl", hash = "sha256:ce2ef506614ecb85ee1c5fe0a2aa45b06a19514ec7949e9c8f34f06925cfabcb", size = 14565, upload-time = "2026-02-27T09:35:51.86Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mock" +version = "5.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/8c/14c2ae915e5f9dca5a22edd68b35be94400719ccfa068a03e0fb63d0f6f6/mock-5.2.0.tar.gz", hash = "sha256:4e460e818629b4b173f32d08bf30d3af8123afbb8e04bb5707a1fd4799e503f0", size = 92796, upload-time = "2025-03-03T12:31:42.911Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/d9/617e6af809bf3a1d468e0d58c3997b1dc219a9a9202e650d30c2fc85d481/mock-5.2.0-py3-none-any.whl", hash = "sha256:7ba87f72ca0e915175596069dbbcc7c75af7b5e9b9bc107ad6349ede0819982f", size = 31617, upload-time = "2025-03-03T12:31:41.518Z" }, +] + +[[package]] +name = "mockfs" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/ad/9abe4bf8a0c84aafc8d45ccaab91e7f114fd8e4b96f7e477b7510f614b89/mockfs-2.0.2.tar.gz", hash = "sha256:c71d9f951e78c4f05148c0b647e8703371dc126315d7fe1093914d8f3ee2fcb7", size = 23735, upload-time = "2024-10-19T05:45:11.574Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/91/8a7e8d51113663b85be2894ba9ce70be1387a7fadfc51f0939e7846b8990/mockfs-2.0.2-py3-none-any.whl", hash = "sha256:cb936d09ab756bfadab0536fbc6d680a9a7859ac0d05b1e0342e8b960c072af6", size = 12032, upload-time = "2024-10-19T05:45:09.73Z" }, +] + +[[package]] +name = "model-bakery" +version = "1.24.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/49/3e5b51d7af52bf39e348767c1feb16c97d18654a8e3f3306eb4b899e98cf/model_bakery-1.24.0.tar.gz", hash = "sha256:6469223c9fb0eccb021d5c33667b914e9208dd2282d7dc1e55394c2310a7687d", size = 28372, upload-time = "2026-06-23T21:55:23.19Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/8e/9108507501846c9ee2a1b277d35d1f92ae251852bbd1527f6dbf2665d94a/model_bakery-1.24.0-py3-none-any.whl", hash = "sha256:d1f739cfc43e8d403d04734a18c73c8e677f655dd08719e35342c2f5ada1d7e9", size = 30819, upload-time = "2026-06-23T21:55:21.911Z" }, +] + +[[package]] +name = "more-itertools" +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, +] + +[[package]] +name = "msgpack" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531, upload-time = "2026-06-18T16:12:58.249Z" }, + { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657, upload-time = "2026-06-18T16:12:59.396Z" }, + { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989, upload-time = "2026-06-18T16:13:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544, upload-time = "2026-06-18T16:13:03.637Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842, upload-time = "2026-06-18T16:13:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108, upload-time = "2026-06-18T16:13:06.232Z" }, + { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939, upload-time = "2026-06-18T16:13:07.478Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b9/8377a5ad8953fc0437c70cc98d9ae29f27fe5ac5109fbec0812085865735/msgpack-1.2.1-cp312-cp312-win32.whl", hash = "sha256:0c0d9802354507bcba62af19c17918e3eb437cc25e6f50657d511b5856a77aac", size = 64504, upload-time = "2026-06-18T16:13:08.822Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/ce1e377df7e62461fefd9eb23bfb93a4a523f40a517b377b8f844d836828/msgpack-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c24aa15d5963051e1a5c62b12c50cd705992502b5ec1f3bece6046f33c9fc24", size = 71421, upload-time = "2026-06-18T16:13:09.828Z" }, + { url = "https://files.pythonhosted.org/packages/8f/32/ebfe84c9929f08f188d56c7a2fd913406a9ddad76a634697c1c43b8112e6/msgpack-1.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:4227224aaec8f7fbcbfbd4272319347b2bb4030366502600f8c45588c5187b07", size = 64775, upload-time = "2026-06-18T16:13:11.056Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ac/dcddcab6f6c20ecb387ca5e980371cdb3f87ff69aeca388be97eebc4c074/msgpack-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a70e3cf2804a300d921bb0940426e35f4e489a23adfb77a808892241db0a064", size = 83151, upload-time = "2026-06-18T16:13:12.173Z" }, + { url = "https://files.pythonhosted.org/packages/64/71/fbcfa83a1d6a9c6091942d1cfd070962244664b87427a9a49a6897b1b219/msgpack-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:491cc39455ca765fad51fb451bf2915eb2cf41192ab5801ce8d67c1d614fe056", size = 82351, upload-time = "2026-06-18T16:13:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518, upload-time = "2026-06-18T16:13:14.233Z" }, + { url = "https://files.pythonhosted.org/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405, upload-time = "2026-06-18T16:13:15.435Z" }, + { url = "https://files.pythonhosted.org/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257, upload-time = "2026-06-18T16:13:17.022Z" }, + { url = "https://files.pythonhosted.org/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469, upload-time = "2026-06-18T16:13:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802, upload-time = "2026-06-18T16:13:19.685Z" }, + { url = "https://files.pythonhosted.org/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273, upload-time = "2026-06-18T16:13:21.028Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c5/133f4512a56e983a93445c836c9d94d88f3bc2e0980ff4b9e577bd8416ce/msgpack-1.2.1-cp313-cp313-win32.whl", hash = "sha256:6d09badf350af2be9d189184e04e64cf54ad93569ab3d96fca58bd3e84aad707", size = 64471, upload-time = "2026-06-18T16:13:22.293Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/577e10b055096a7dd40732358cabaf7180a20c79ed1dcdbb618e4b9deac7/msgpack-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:33f14fba63278b714efe6ad07e50ea5f03d91537aa6a1c5f1ceca4cf44013ca9", size = 71274, upload-time = "2026-06-18T16:13:23.455Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ee/0c0048e7cfbef23c6a94791b8959ab28155232e7956de8a305b5ff588f05/msgpack-1.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc5febcd4c99effbc02b528e49d6fd0760b2b7d48c05239e345a5fa6e743d9a", size = 64795, upload-time = "2026-06-18T16:13:24.687Z" }, + { url = "https://files.pythonhosted.org/packages/77/58/cce442852c6b9e1639c7c8ac8fd9143121cb32dab0f308df4d1426a8eb9c/msgpack-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:05f340e47e7e47d2da8db9b53e1bb1d294369e9ef45a747441309f6650b8351d", size = 83610, upload-time = "2026-06-18T16:13:25.724Z" }, + { url = "https://files.pythonhosted.org/packages/60/5c/15b4c7a0182f75ffa90751958ba36a9c01cafee367d49a3edc10ed140b01/msgpack-1.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:810b916696c86ef0deb3b74588480224df4c1b071136c34183e4a2a4284d7ac7", size = 83138, upload-time = "2026-06-18T16:13:26.781Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/99e58722feaffc5f2fbcc0c8c0d1451ab9f84097f7af87291b46af2390f4/msgpack-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca0dacff965c47afdc3749a8469d7302a8f801d6a28758d55120d75e66ce6889", size = 406090, upload-time = "2026-06-18T16:13:28.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/03/8c63e8cf52958534ef688625965ab04c269a6cadd8caef16758b380a821a/msgpack-1.2.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e2bf9280bceb5efca998435904b5d3e9fdbcc11d90dc9df30aec7973252b720", size = 412106, upload-time = "2026-06-18T16:13:29.427Z" }, + { url = "https://files.pythonhosted.org/packages/63/d2/155d9e71b40e41fd934bc0c48b9b2770f22263e1ac20aad8e29fdca7be3f/msgpack-1.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6c4be5d1c02a42b066ca6ddb71adf36432868fdcdb6ee87e634e86e0674190", size = 374851, upload-time = "2026-06-18T16:13:30.631Z" }, + { url = "https://files.pythonhosted.org/packages/98/48/deaf2326262a8d5ea3295ce9649912ecd3f551ba7ec8e33c665d2ba583f3/msgpack-1.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec0e675d59150a6269ddc9139087c722292664a37d071a849c05c473350f1f2d", size = 396168, upload-time = "2026-06-18T16:13:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/2a/b4410f906c2ec0008f1608d3ab5143afc3ad3f4e6da0fed3ea2231d0bef4/msgpack-1.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dd3bfe82d53edfe4b7fc9a7ec9761e23a7a5b1dac22264505af428253c29ed24", size = 371959, upload-time = "2026-06-18T16:13:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/59/86/1edc67270099a528fa2093ea60fe191233cd238e4bd30cfacf7db79fc959/msgpack-1.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ad5467fc3f68b5468e06c5f788d712e9f8ffc8b0cd1bcb160c105c1ee92dae7", size = 408457, upload-time = "2026-06-18T16:13:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/82/90/8b630fef07d8c5ab457b71ff2c217910c83d333c7a68472c186e87cc504a/msgpack-1.2.1-cp314-cp314-win32.whl", hash = "sha256:98b58bdb89c46190e4609bb36abe17c6d4105ad13f9c5f8f6f64d320f8ced3fb", size = 65942, upload-time = "2026-06-18T16:13:36.056Z" }, + { url = "https://files.pythonhosted.org/packages/16/f1/467b81e98b24dd3885d7b1857728797b4ffc76a7a7483af4fb321a07de3c/msgpack-1.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:74847557e28ce71bd3c438a447ca90e4b507e997ddbdef8a12a7b283b86c156b", size = 72627, upload-time = "2026-06-18T16:13:37.079Z" }, + { url = "https://files.pythonhosted.org/packages/a7/1d/5d8c4c89985feb6acefb82a09e501c60392261856d2408d20bfe4f0360b1/msgpack-1.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:b50b727bd652bdc37d950336c848ef20ec54a4cafc38dce19b1cd86ad625d0f7", size = 66908, upload-time = "2026-06-18T16:13:38.23Z" }, + { url = "https://files.pythonhosted.org/packages/1b/02/ad2afb678b4de94496cd432b581759b756a92c1192d8c767edd6b132efdc/msgpack-1.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8d00f177ca88a77c1cf848d204a38f249751650b601cb6532acc68805d8a8273", size = 86000, upload-time = "2026-06-18T16:13:39.44Z" }, + { url = "https://files.pythonhosted.org/packages/54/74/0b797484013128837f3b1cbb6cea019277c4de4e377dc512b4d9a0f92940/msgpack-1.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5bb9c386f0a329c035ddbab4b72d1028bf9627add8dda41070288563d57ed1b1", size = 86544, upload-time = "2026-06-18T16:13:40.447Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b4/b774d7eb95561739907fec675582f83203cf41c597a418c2589b4bfb8e9d/msgpack-1.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20466cca18c49c7292a8984bc15d65857b171e7264bdcb5f96baf8be238791fc", size = 427661, upload-time = "2026-06-18T16:13:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f9/3243191dc9937e00756c8bc1b0272fed8f23758e43df2a3b46f533e5090f/msgpack-1.2.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:196300e7e5d6e74d50f1607ab9c06c4a1484c383cd22defd727902591f7e8dde", size = 426375, upload-time = "2026-06-18T16:13:42.936Z" }, + { url = "https://files.pythonhosted.org/packages/23/c7/1693111db9944ba4ad4b67a1e788400d78a0b6af7a6523dc7e4e58f8274b/msgpack-1.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575957e79cd51903a4e8495a242442949641e08f1efd5197b43bebd3ea7682b4", size = 380495, upload-time = "2026-06-18T16:13:44.306Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2b/92f86956a0c13e8662f7e2ad630c4eb4db07497b967589bd5245e018b2c1/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8c2ed1e48cc0f460bf3c7780e7137ff21a4e18433451916f2442c1b21036cd7d", size = 410897, upload-time = "2026-06-18T16:13:45.629Z" }, + { url = "https://files.pythonhosted.org/packages/da/ea/1479f72d200313a76fc2f823a79d1e07ed052ab7b8a0280640aa7b95de42/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f6277e5f783c36786a145e0247fc189a03f35f84b251646e53592d2bc12b355", size = 378519, upload-time = "2026-06-18T16:13:46.998Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4d/fa006060ffa1011d32bfae826fe766fe73e02982183601633b7121058ab3/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9389552ecf4784886345ead0647e4edc96bee37cbab05b75540f542f766c48c", size = 419815, upload-time = "2026-06-18T16:13:48.205Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/aab6c946570496b78e67804721f3d5e2d62a93081b9b37df77764ef56347/msgpack-1.2.1-cp314-cp314t-win32.whl", hash = "sha256:c1c79a604a2969a868a78b6ebd27a887e00c624f14f66b3038e0590cb23332d1", size = 70914, upload-time = "2026-06-18T16:13:49.385Z" }, + { url = "https://files.pythonhosted.org/packages/13/0a/e608956488a2af014cfe6e3d665e090b8ee42aa14b07f8f95b8880d66b09/msgpack-1.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f12038a35fabd52e56a3547bab42401af49a45caa6dd00b34c44de235bc93ee2", size = 77999, upload-time = "2026-06-18T16:13:50.467Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8a/27e2e57055176e366a46b85d02d68e7a5bcfbdd8474c9706375d965f24d3/msgpack-1.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0adcf06ffde0777c0e1a9b771a2b1c4226ba1bbf748c8efcc02fcdeca3299107", size = 71160, upload-time = "2026-06-18T16:13:51.498Z" }, +] + +[[package]] +name = "myst-parser" +version = "5.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "pyyaml", version = "6.0.3", source = { registry = "https://pypi.org/simple" } }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/dc/603751677fff302f34396e206b610f556a59d7fe58b9a2145f54e96b48e8/myst_parser-5.1.0.tar.gz", hash = "sha256:ab69322dc6719dcc7f296479dbb70181b66df6ed315064f92dbc85c0e1bf2f02", size = 101182, upload-time = "2026-05-13T09:38:19.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/dc/f3dfb7488b770f3f67e6545085bf2abea5172e88f57b8ad25ef860ca704c/myst_parser-5.1.0-py3-none-any.whl", hash = "sha256:9c91c52b3cdb4d94a6506e4fab4e2f296c7623a0da0dcbe6de1565c3dad67a8a", size = 85817, upload-time = "2026-05-13T09:38:17.904Z" }, +] + +[[package]] +name = "nh3" +version = "0.3.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/1b/ef84624f14954d270f74060a19fc550dd4f06656399447569afb584d8c06/nh3-0.3.6.tar.gz", hash = "sha256:f3736c9dd3d1856f80cd031715b84ca75cda2bbb1ac802c3da26bfce590838d7", size = 24684, upload-time = "2026-06-22T00:47:02.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/3e/6506aa4f23dc7b7993a2d0a45dca3ce864ec48380adfe15a173e643c63e8/nh3-0.3.6-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2411e8c3cee81a1ddd62c2a5d50585c28aa5566d373ad1db92536b95ddb24ef2", size = 1421679, upload-time = "2026-06-22T00:46:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e1/e96e7864a7a53bd6b6fab7e9632467382a2a2c1f3fed951918ad131542fb/nh3-0.3.6-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e196fa70c2ff2eb4de7d3df3108f8f358c1d69dff20d45b11f20a5aa227ffb6d", size = 792570, upload-time = "2026-06-22T00:46:22.179Z" }, + { url = "https://files.pythonhosted.org/packages/59/62/5b6108bedaef2b2637fed04c87bdbcb5967b9961758b41f0e466ef22a022/nh3-0.3.6-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34d2b0d934156b87ee114f599a3ba9b8b9e17b5d79652ba3a13fa50903de965e", size = 842243, upload-time = "2026-06-22T00:46:23.801Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4a/526f199626bfcb496bc01a268051b44737962005553b158e985ed7e64865/nh3-0.3.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2f14b7ae1fca99c4a66c981aac3974e7fbc1ca30a12673d223ae1df76680917", size = 1001468, upload-time = "2026-06-22T00:46:25.481Z" }, + { url = "https://files.pythonhosted.org/packages/49/09/0d8e3101636d9ad88cdefb2914e764cb8e876ebdbb4286bfc251277d9c67/nh3-0.3.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:889932a97fb4abb6f95fef1914c0d269ebfb60011e67121c1163059b9449dbb4", size = 1082933, upload-time = "2026-06-22T00:46:27.15Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/ea83abe738a3fbaa203dfdb836ca7cbab0e7e9609faaee4fe1d4652599c0/nh3-0.3.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:edb2b4a1a27523e6cc7c417f8d21ce3d005243548b93e56b762b66b0c7f589f9", size = 1043120, upload-time = "2026-06-22T00:46:28.89Z" }, + { url = "https://files.pythonhosted.org/packages/66/69/0654482b8635012fbae67826bd6c381abb05d841ac7388b9b4666300fdad/nh3-0.3.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:43bc1ed3fa0716295fabee29ba42b2667e4a51d140b0a68e092170a765474fa6", size = 1023824, upload-time = "2026-06-22T00:46:30.453Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/1f7285ffadc8307c4dbeb08d21b920536d5117785056d1079e998c4dfa44/nh3-0.3.6-cp314-cp314t-win32.whl", hash = "sha256:597a8e843bea00b2eb5520658dc24a9bb032e7fc9e7c2c0c4cd29420220c9796", size = 599253, upload-time = "2026-06-22T00:46:32.072Z" }, + { url = "https://files.pythonhosted.org/packages/36/ea/5542f3c45da4c00290d9d67a65e996702e23e613c4b627de3e09cb9fe357/nh3-0.3.6-cp314-cp314t-win_amd64.whl", hash = "sha256:4713502748f564fee0633b37b3403783ce0a3af3a3d148ad91025a5bdadb7bc6", size = 612553, upload-time = "2026-06-22T00:46:33.53Z" }, + { url = "https://files.pythonhosted.org/packages/66/35/26bd47e6af5915a628281dccdac354ddf4e32f7397047894270acd8c9870/nh3-0.3.6-cp314-cp314t-win_arm64.whl", hash = "sha256:69bbb92865a693d909db3a700d3c01537533844d0948c1e9323561ce06ecda41", size = 595151, upload-time = "2026-06-22T00:46:34.878Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ab/a7653bce9a3b204be6a6931767a9e23595807bb84790ce6685e4d7e5bd08/nh3-0.3.6-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a43ebd7543555c3ac1bc353023d0794e75cb76f6f18f19c32e95441496c0cc25", size = 1443564, upload-time = "2026-06-22T00:46:36.66Z" }, + { url = "https://files.pythonhosted.org/packages/41/21/e1084ab18eb589506335c7c7576f2d4643e9a0c0e33983ef0e549a256b96/nh3-0.3.6-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1b160831c9cdb06a6c79c2f9cdb11386602938f9af260d1c457a85add4f6f69", size = 838002, upload-time = "2026-06-22T00:46:38.101Z" }, + { url = "https://files.pythonhosted.org/packages/b0/94/f48d08e6f72a406300fa11d8acd929fea1a80d4bf750fa292cb10785f126/nh3-0.3.6-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d14bf7982e7a77c0c775634c29c07ce08b38a046df73e1c1f139b3e82f18a38e", size = 823045, upload-time = "2026-06-22T00:46:39.495Z" }, + { url = "https://files.pythonhosted.org/packages/25/bb/431615ba1d1d3eb63cde0f974f2114edf863a8a3f6049a12fed23fc241d3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:44673b27010051ab5a5e438a86ec31bbda61d4a77d7e900af6b7be3037c1abae", size = 1093171, upload-time = "2026-06-22T00:46:41.21Z" }, + { url = "https://files.pythonhosted.org/packages/0e/24/a0d80182a18919665fefd19c1c06f1d1df1c9a6455d0252de40c034a0bc3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6b7beece07525dc6e6b0fc2f104442de2ba328360ad00e50cbe2e1fd620447d", size = 1049217, upload-time = "2026-06-22T00:46:42.804Z" }, + { url = "https://files.pythonhosted.org/packages/0a/13/6f1e302ca674ac74362e150848ad56a1be5145391204f74facdb8e94df12/nh3-0.3.6-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:455469a29951edc92bc48b47ac2281c3f2609e6c4f6a047056449f8c2c23facf", size = 917372, upload-time = "2026-06-22T00:46:44.495Z" }, + { url = "https://files.pythonhosted.org/packages/5b/67/314f6151bad77a93d751978a344033e1fc890822f05f0416079338e34231/nh3-0.3.6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:905f877dc66dd7aea4a76e54bcb26acb5ff8216f720c0017ccf63e0e6035698e", size = 806699, upload-time = "2026-06-22T00:46:45.99Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a6/bfaa00046e58603507dcfc266c4778e3ab7adf68a5dedd73b6274b8d9314/nh3-0.3.6-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:25c733bee928530556b1db0ea46c52cf5aa686146e38e60a6fc7cb801ef91cec", size = 835165, upload-time = "2026-06-22T00:46:47.617Z" }, + { url = "https://files.pythonhosted.org/packages/30/a8/fb2c38845efb703a9173bffdfc745fc64d2b0e55cfc73a3647d2f028250c/nh3-0.3.6-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f90d9a0cfdbee218994fdaaeeb5a0fde62d08f35e4eef0378ec1e2200172fd0", size = 858282, upload-time = "2026-06-22T00:46:49.276Z" }, + { url = "https://files.pythonhosted.org/packages/68/17/06e72a18ee9b572914447338237ca7eb164c0df901f141bc10d1282247a2/nh3-0.3.6-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:82ca5bf427ad1b216b65ede1a2e2d87dc49bec417ceba0f297213107d3cd9d78", size = 1014328, upload-time = "2026-06-22T00:46:51.026Z" }, + { url = "https://files.pythonhosted.org/packages/11/f9/3966c61455668c08853bf5e33b4bed93c421f3194ce4de896dc248d6f6ce/nh3-0.3.6-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f5ed5fe84aee7f39db95c214a7421bf0499fbf500fec6d86a4e29bfc37971438", size = 1098207, upload-time = "2026-06-22T00:46:52.674Z" }, + { url = "https://files.pythonhosted.org/packages/19/d3/479cb4ae440424825735d60525b53e3c77fd60fd6e6afc0e984f00eb0178/nh3-0.3.6-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:082675ff87b9385ec430ffe6d5847ba7456cc39b73720cd4add472f9f4cffd56", size = 1056961, upload-time = "2026-06-22T00:46:54.335Z" }, + { url = "https://files.pythonhosted.org/packages/17/0c/6cdb5ee1e127be50dc8391e54bddc1f64e87bf4bfad0c55633320e2e02db/nh3-0.3.6-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36d06341bd501240d320f5942481ed5e6846136b666e1ba4faf802b78ebc875f", size = 1033829, upload-time = "2026-06-22T00:46:56.258Z" }, + { url = "https://files.pythonhosted.org/packages/e9/55/9de666ad975d6ccd77d799ea0add55ee2347aa81286ce21b2a97c070746b/nh3-0.3.6-cp38-abi3-win32.whl", hash = "sha256:5276ef17bdba9ad8040575c74072008b13aae429436e9d0429e718bb5f90f4da", size = 609081, upload-time = "2026-06-22T00:46:57.665Z" }, + { url = "https://files.pythonhosted.org/packages/82/fa/2b5d684e3edf1e81bfd02d298c78c3e3da77ca1d8a2be3183a79544a7548/nh3-0.3.6-cp38-abi3-win_amd64.whl", hash = "sha256:f338ac7d594c067679f1e99b4f5ec3906842979560f9d8f15d6bdfa39a353b10", size = 624461, upload-time = "2026-06-22T00:46:59.163Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e5/7cafee2f0413ca4cb0ef3bd111e94d408a48810008b283ad8aee00dd1809/nh3-0.3.6-cp38-abi3-win_arm64.whl", hash = "sha256:69f365963f63a1e9bff53bdbb3c542c7c2efed3e163c9d5d83a772a2ac468c21", size = 603060, upload-time = "2026-06-22T00:47:00.596Z" }, +] + +[[package]] +name = "oauthlib" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, +] + +[[package]] +name = "openedx-atlas" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/97/6cece8758ce11aa2511300929051077d498e23d4387f89caf86c076e664b/openedx-atlas-0.7.0.tar.gz", hash = "sha256:a698366c902c88e533cfcfea3ef1a6e32a693a275e673eaad67747463ba4efd5", size = 23165, upload-time = "2025-04-08T07:51:37.842Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/1c/868da1caa571d1c01e785a03110f90a0490465fc34a138ef7ce6dc5deed8/openedx_atlas-0.7.0-py3-none-any.whl", hash = "sha256:4884d98e03282181b14f6acefb264cd0843a892ac8ec91b9b53163d1155b4718", size = 22385, upload-time = "2025-04-08T07:51:36.502Z" }, +] + +[[package]] +name = "openedx-events" +version = "11.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "django" }, + { name = "edx-ccx-keys" }, + { name = "edx-django-utils" }, + { name = "edx-opaque-keys" }, + { name = "fastavro" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/8f/cc77bf1748e6c16125b04c47586b46fb43cac66f836780c73029db3393f8/openedx_events-11.2.0.tar.gz", hash = "sha256:b3216aeb959c3429c0091fa40ff8045322a0569a8cf36fa8910458f92923e472", size = 83833, upload-time = "2026-04-22T17:29:25.777Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/5d/6af3fcf206ff649a04eb35fb314721a9182f2edca06f7fc2f8ac66ba0b9d/openedx_events-11.2.0-py3-none-any.whl", hash = "sha256:679527b1e96a73c70a886c4c64c9109371040f73529bf32ea6ac9a442979ab5b", size = 61344, upload-time = "2026-04-22T17:29:24.146Z" }, +] + +[[package]] +name = "openedx-filters" +version = "3.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "edx-opaque-keys" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/54/34ff71ff7ac30feff9b76f4961b1ad1561010d2b218afb30c44ac2e81361/openedx_filters-3.9.0.tar.gz", hash = "sha256:928c159c9d215172f82cc894a06ada805b7a0c53a3ab1d148efefa1209efe4d5", size = 51210, upload-time = "2026-08-07T00:39:07.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/98/eccd5dd4e25996209ddb623c74c219f0961c92cd6fed1b630483bc872039/openedx_filters-3.9.0-py2.py3-none-any.whl", hash = "sha256:a29bfd0c897d53f5567bf6205ffbb3ea2688aacbbb9c3f5071010d3ab3534412", size = 50085, upload-time = "2026-08-07T00:39:06.47Z" }, +] + +[[package]] +name = "ordereddict" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/25/ef88e8e45db141faa9598fbf7ad0062df8f50f881a36ed6a0073e1572126/ordereddict-1.1.tar.gz", hash = "sha256:1c35b4ac206cef2d24816c89f89cf289dd3d38cf7c449bb3fab7bf6d43f01b1f", size = 2114, upload-time = "2010-10-28T10:08:17.831Z" } + +[[package]] +name = "outcome" +version = "1.3.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060, upload-time = "2023-10-26T04:26:04.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692, upload-time = "2023-10-26T04:26:02.532Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "paramiko" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bcrypt" }, + { name = "cryptography" }, + { name = "invoke" }, + { name = "pynacl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/93/dcc25d52f49022ae6175d15e6bd751f1acc99b98bc61fc55e5155a7be2e7/paramiko-5.0.0.tar.gz", hash = "sha256:36763b5b95c2a0dcfdf1abc48e48156ee425b21efe2f0e787c2dd5a95c0e5e79", size = 1548586, upload-time = "2026-05-09T18:28:52.256Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/5b/eadf6d45de38d30ab603f49393b6cd2cbe7e233af8cf90197e32782b68a9/paramiko-5.0.0-py3-none-any.whl", hash = "sha256:b7044611c30140d9a75261653210e2002977b71a0497ff3ba0d98d7edbf62f7c", size = 208919, upload-time = "2026-05-09T18:28:50.295Z" }, +] + +[[package]] +name = "path" +version = "16.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/ae/60c756b1bcdd2abc786ee5a20b58e9a4f84db8d1612ebdf3f8f5f8b1efd9/path-16.11.0.tar.gz", hash = "sha256:b4bba7fd041f5c2f1d3968f1d50d555ff58b1d518148fa3b92e0ccf75574e7d3", size = 49580, upload-time = "2024-04-04T10:09:45.795Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/dd/5c40ea50d16cc4816df03e0fc08f891f200217dca379c2c2187e4673e34d/path-16.11.0-py3-none-any.whl", hash = "sha256:482bebf4a2d81c4f783cf23bd1dbc40436aec74a556e2779ca3bad24cfaaaaf3", size = 25256, upload-time = "2024-04-04T10:09:43.594Z" }, +] + +[[package]] +name = "path-py" +version = "12.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "path" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/e3/81be70016d58ade0f516191fa80152daba5453d0b07ce648d9daae86a188/path.py-12.5.0.tar.gz", hash = "sha256:8d885e8b2497aed005703d94e0fd97943401f035e42a136810308bff034529a8", size = 15713, upload-time = "2020-07-27T23:53:38.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/04/130b7a538c25693c85c4dee7e25d126ebf5511b1eb7320e64906687b159e/path.py-12.5.0-py3-none-any.whl", hash = "sha256:a43e82eb2c344c3fd0b9d6352f6b856f40b8b7d3d65cc05978b42c3715668496", size = 2251, upload-time = "2020-07-27T23:53:37.293Z" }, +] + +[[package]] +name = "pgpy" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/68/5e285ba9465550a48e837b08b27fa99ef238618f6085a1464afaa4dc8426/PGPy-0.6.0.tar.gz", hash = "sha256:279c2e353f4c3a319f00bd9bd582456e420f8a3ac6de2b4e9731444746828383", size = 603002, upload-time = "2022-11-24T02:35:22.133Z" } + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, + { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, + { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, + { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" }, + { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, + { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, + { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" }, + { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" }, + { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" }, + { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" }, + { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" }, + { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" }, + { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" }, + { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" }, + { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" }, + { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" }, + { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" }, + { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" }, + { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" }, + { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" }, + { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" }, + { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" }, + { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" }, + { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" }, + { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" }, + { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" }, + { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" }, + { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" }, + { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" }, + { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" }, + { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" }, + { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" }, + { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "polib" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/9a/79b1067d27e38ddf84fe7da6ec516f1743f31f752c6122193e7bce38bdbf/polib-1.2.0.tar.gz", hash = "sha256:f3ef94aefed6e183e342a8a269ae1fc4742ba193186ad76f175938621dbfc26b", size = 161658, upload-time = "2023-02-23T17:53:56.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/99/45bb1f9926efe370c6dbe324741c749658e44cb060124f28dad201202274/polib-1.2.0-py2.py3-none-any.whl", hash = "sha256:1c77ee1b81feb31df9bca258cbc58db1bbb32d10214b173882452c73af06d62d", size = 20634, upload-time = "2023-02-23T17:53:59.919Z" }, +] + +[[package]] +name = "portend" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tempora" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/57/be90f42996fc4f57d5742ef2c95f7f7bb8e9183af2cc11bff8e7df338888/portend-3.2.1.tar.gz", hash = "sha256:aa9d40ab1f9e14bdb7d401f42210df35d017c9b97991baeb18568cedfb8c6489", size = 12243, upload-time = "2025-05-29T20:27:45.091Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/11/b0b19077f80cb8972b44c96af983e8cfcdb1506090bacef137ed8b448af8/portend-3.2.1-py3-none-any.whl", hash = "sha256:bd2bb1cd8585e32f1f986c1b8eae2950c8622c648db163b711a2fc2ef8d8d492", size = 5653, upload-time = "2025-05-29T20:27:43.75Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "proto-plus" +version = "1.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/56/e647b0c675392d2da368da7b6f158f7368b18542fd6f7d7400a2f39de000/proto_plus-1.28.0.tar.gz", hash = "sha256:38e5696342835b08fc116f30a25665b29531cda9d5d5643e9b81fc312385abd9", size = 57221, upload-time = "2026-05-07T08:04:50.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/20/b122d4626976acb81132036d2ad1bb35a1a8775fceb837ec30964622516a/proto_plus-1.28.0-py3-none-any.whl", hash = "sha256:a630604310899e73c59ec302e5765c058d412b2f090b9c79c8822589f14955b8", size = 50410, upload-time = "2026-05-07T08:03:31.962Z" }, +] + +[[package]] +name = "protobuf" +version = "7.35.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/01/9ef0afd7999eb9badb3a768b4aedd78c86d4c65cfaf1958ab276199e76b4/protobuf-7.35.1.tar.gz", hash = "sha256:ce115a26fe0c39a2c29973d914d327e516a6455464489fe3cd1e51a1b354f81a", size = 458717, upload-time = "2026-06-11T21:55:40.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/03/8aeeb7458d22546bf64b5250ca1daeb5ff757d900e8e4a7476c6f0db843e/protobuf-7.35.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:24f857477359a85c0c235261b8ba905fd51b2562f4a64ca1df5473f29850cbf6", size = 433226, upload-time = "2026-06-11T21:55:31.719Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/dfb89eb0e652a1ff073c39a59fb5e3a83cfe9b57a2c83fa6d78270101767/protobuf-7.35.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799", size = 328847, upload-time = "2026-06-11T21:55:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/0f/58/dc12f2cd484951524af6e3382c785869b9b3fb5e52ee95ae23add53ee8f9/protobuf-7.35.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:b73f9489a4b8b1c9cb1f8ed951c736392592edb24b9d6819f36d2e10b171d5b4", size = 344030, upload-time = "2026-06-11T21:55:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/e4/be/5b3cfe508bfab6761414ff944e3366eb13be4fd71efcd69450f89ba39f43/protobuf-7.35.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:74758715c53d7158fb76caf4f0cfdacc5329a4b1bb994f865d6cf302d413a1c4", size = 327130, upload-time = "2026-06-11T21:55:35.921Z" }, + { url = "https://files.pythonhosted.org/packages/d8/bc/6d6c7ba8709c85f8f2c390b2b118d6fb08a783676a572271851bf45a7d22/protobuf-7.35.1-cp310-abi3-win32.whl", hash = "sha256:353652e4efd0bca5b5fc2656abf8307ef351f0cf938c9eba09f0e09c20a25c30", size = 428945, upload-time = "2026-06-11T21:55:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/0a/19/8d0cb6f20a1ef7b18f1c8986ad5783f22f84cce39c6ce9a6e645ea55192e/protobuf-7.35.1-cp310-abi3-win_amd64.whl", hash = "sha256:230a75ddfc2de4806e56696ce9640c1cdfdb6543b7cfce98d42a4c0a0e7bdb87", size = 439996, upload-time = "2026-06-11T21:55:38.123Z" }, + { url = "https://files.pythonhosted.org/packages/19/c7/5f7c636ec43e0c545e28d1f1db71990108306f7bdcb89f069ba97e428e7f/protobuf-7.35.1-py3-none-any.whl", hash = "sha256:4bc97768d8fe4ad6743c8a19403e314511ed9f6d13205b687e52421c023ac1b9", size = 171659, upload-time = "2026-06-11T21:55:39.155Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "psycopg2-binary" +version = "2.9.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/60/a3624f79acea344c16fbef3a94d28b89a8042ddfb8f3e4ca83f538671409/psycopg2_binary-2.9.12.tar.gz", hash = "sha256:5ac9444edc768c02a6b6a591f070b8aae28ff3a99be57560ac996001580f294c", size = 379686, upload-time = "2026-04-21T09:40:34.304Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/9f/ef4ef3c8e15083df90ca35265cfd1a081a2f0cc07bb229c6314c6af817f4/psycopg2_binary-2.9.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5cdc05117180c5fa9c40eea8ea559ce64d73824c39d928b7da9fb5f6a9392433", size = 3712459, upload-time = "2026-04-20T23:34:30.549Z" }, + { url = "https://files.pythonhosted.org/packages/b5/01/3dd14e46ba48c1e1a6ec58ee599fa1b5efa00c246d5046cd903d0eeb1af1/psycopg2_binary-2.9.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3227a3bc228c10d21011a99245edca923e4e8bf461857e869a507d9a41fe9f6", size = 3822936, upload-time = "2026-04-20T23:34:32.77Z" }, + { url = "https://files.pythonhosted.org/packages/a6/f7/0640e4901119d8a9f7a1784b927f494e2198e213ceb593753d1f2c8b1b30/psycopg2_binary-2.9.12-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:995ce929eede89db6254b50827e2b7fd61e50d11f0b116b29fffe4a2e53c4580", size = 4578676, upload-time = "2026-04-20T23:34:35.18Z" }, + { url = "https://files.pythonhosted.org/packages/b0/55/44df3965b5f297c50cc0b1b594a31c67d6127a9d133045b8a66611b14dfb/psycopg2_binary-2.9.12-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9fe06d93e72f1c048e731a2e3e7854a5bfaa58fc736068df90b352cefe66f03f", size = 4274917, upload-time = "2026-04-20T23:34:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/b0/4b/74535248b1eac0c9336862e8617c765ac94dac76f9e25d7c4a79588c8907/psycopg2_binary-2.9.12-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40e7b28b63aaf737cb3a1edc3a9bbc9a9f4ad3dcb7152e8c1130e4050eddcb7d", size = 5894843, upload-time = "2026-04-20T23:34:40.856Z" }, + { url = "https://files.pythonhosted.org/packages/f2/ba/f1bf8d2ae71868ad800b661099086ee52bc0f8d9f05be1acd8ebb06757cc/psycopg2_binary-2.9.12-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:89d19a9f7899e8eb0656a2b3a08e0da04c720a06db6e0033eab5928aabe60fa9", size = 4110556, upload-time = "2026-04-20T23:34:44.016Z" }, + { url = "https://files.pythonhosted.org/packages/45/46/c15706c338403b7c420bcc0c2905aad116cc064545686d8bf85f1999ea00/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:612b965daee295ae2da8f8218ce1d274645dc76ef3f1abf6a0a94fd57eff876d", size = 3655714, upload-time = "2026-04-20T23:34:46.233Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7c/a2d5dc09b64a4564db242a0fe418fde7d33f6f8259dd2c5b9d7def00fb5a/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b9a339b79d37c1b45f3235265f07cdeb0cb5ad7acd2ac7720a5920989c17c24e", size = 3301154, upload-time = "2026-04-20T23:34:49.528Z" }, + { url = "https://files.pythonhosted.org/packages/c0/e8/cc8c9a4ce71461f9ec548d38cadc41dc184b34c73e6455450775a9334ccd/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3471336e1acfd9c7fe507b8bad5af9317b6a89294f9eb37bd9a030bb7bebcdc6", size = 3048882, upload-time = "2026-04-20T23:34:51.86Z" }, + { url = "https://files.pythonhosted.org/packages/19/6a/31e2296bc0787c5ab75d3d118e40b239db8151b5192b90b77c72bc9256e9/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7af18183109e23502c8b2ae7f6926c0882766f35b5175a4cd737ad825e4d7a1b", size = 3351298, upload-time = "2026-04-20T23:34:54.124Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a8/75f4e3e11203b590150abed2cf7794b9c9c9f7eceddae955191138b44dde/psycopg2_binary-2.9.12-cp312-cp312-win_amd64.whl", hash = "sha256:398fcd4db988c7d7d3713e2b8e18939776fd3fb447052daae4f24fa39daede4c", size = 2757230, upload-time = "2026-04-20T23:34:56.242Z" }, + { url = "https://files.pythonhosted.org/packages/91/bb/4608c96f970f6e0c56572e87027ef4404f709382a3503e9934526d7ba051/psycopg2_binary-2.9.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7c729a73c7b1b84de3582f73cdd27d905121dc2c531f3d9a3c32a3011033b965", size = 3712419, upload-time = "2026-04-20T23:34:58.754Z" }, + { url = "https://files.pythonhosted.org/packages/5e/af/48f76af9d50d61cf390f8cd657b503168b089e2e9298e48465d029fcc713/psycopg2_binary-2.9.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4413d0caef93c5cf50b96863df4c2efe8c269bf2267df353225595e7e15e8df7", size = 3822990, upload-time = "2026-04-20T23:35:00.821Z" }, + { url = "https://files.pythonhosted.org/packages/7a/df/aba0f99397cd811d32e06fc0cc781f1f3ce98bc0e729cb423925085d781a/psycopg2_binary-2.9.12-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4dfcf8e45ebb0c663be34a3442f65e17311f3367089cd4e5e3a3e8e62c978777", size = 4578696, upload-time = "2026-04-20T23:35:03.409Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/eaa74021ac4e4d5c2f83d82fc6615a63f4fe6c94dc4e94c3990427053f67/psycopg2_binary-2.9.12-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c41321a14dd74aceb6a9a643b9253a334521babfa763fa873e33d89cfa122fb5", size = 4274982, upload-time = "2026-04-20T23:35:05.583Z" }, + { url = "https://files.pythonhosted.org/packages/35/ed/c25deff98bd26187ba48b3b250a3ffc3037c46c5b89362534a15d200e0db/psycopg2_binary-2.9.12-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83946ba43979ebfdc99a3cd0ee775c89f221df026984ba19d46133d8d75d3cd9", size = 5894867, upload-time = "2026-04-20T23:35:07.902Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/8d0e21ca77373c6c9589e5c4528f6e8f0c08c62cafc76fb0bddb7a2cee22/psycopg2_binary-2.9.12-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:411e85815652d13560fbe731878daa5d92378c4995a22302071890ec3397d019", size = 4110578, upload-time = "2026-04-20T23:35:10.149Z" }, + { url = "https://files.pythonhosted.org/packages/00/fc/f481e2435bd8f742d0123309174aae4165160ad3ef17c1b99c3622c241d2/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c8ad4c08e00f7679559eaed7aff1edfffc60c086b976f93972f686384a95e2c", size = 3655816, upload-time = "2026-04-20T23:35:12.56Z" }, + { url = "https://files.pythonhosted.org/packages/53/79/b9f46466bdbe9f239c96cde8be33c1aace4842f06013b47b730dc9759187/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:00814e40fa23c2b37ef0a1e3c749d89982c73a9cb5046137f0752a22d432e82f", size = 3301307, upload-time = "2026-04-20T23:35:15.029Z" }, + { url = "https://files.pythonhosted.org/packages/3f/19/7dc003b32fe35024df89b658104f7c8538a8b2dcbde7a4e746ce929742e7/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:98062447aebc20ed20add1f547a364fd0ef8933640d5372ff1873f8deb9b61be", size = 3048968, upload-time = "2026-04-20T23:35:16.757Z" }, + { url = "https://files.pythonhosted.org/packages/91/58/2dbd7db5c604d45f4950d988506aae672a14126ec22998ced5021cbb76bb/psycopg2_binary-2.9.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:66a7685d7e548f10fb4ce32fb01a7b7f4aa702134de92a292c7bd9e0d3dbd290", size = 3351369, upload-time = "2026-04-20T23:35:18.933Z" }, + { url = "https://files.pythonhosted.org/packages/42/ee/dee8dcaad07f735824de3d6563bc67119fa6c28257b17977a8d624f02fab/psycopg2_binary-2.9.12-cp313-cp313-win_amd64.whl", hash = "sha256:b6937f5fe4e180aeee87de907a2fa982ded6f7f15d7218f78a083e4e1d68f2a0", size = 2757347, upload-time = "2026-04-20T23:35:21.283Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/708c0dca874acfad6d65314271859899a79007686f3a1f74e82a2ed4b645/psycopg2_binary-2.9.12-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6f3b3de8a74ef8db215f22edffb19e32dc6fa41340456de7ec99efdc8a7b3ec2", size = 3712428, upload-time = "2026-04-20T23:35:23.453Z" }, + { url = "https://files.pythonhosted.org/packages/d6/39/ddbea9d4b4de6aca9431b6ed253f530f8a02d3b8f9bcfd0dbfe2b3de6fe4/psycopg2_binary-2.9.12-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1006fb62f0f0bc5ce256a832356c6262e91be43f5e4eb15b5eaf38079464caf2", size = 3823184, upload-time = "2026-04-20T23:35:25.92Z" }, + { url = "https://files.pythonhosted.org/packages/bf/a0/bc2fef74b106fa345567122a0659e6d94512ed7dc0131ec44c9e5aba3725/psycopg2_binary-2.9.12-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:840066105706cd2eb29b9a1c2329620056582a4bf3e8169dec5c447042d0869f", size = 4579157, upload-time = "2026-04-20T23:35:28.542Z" }, + { url = "https://files.pythonhosted.org/packages/57/d7/d4e3b2005d3de607ca4fbb0e8742e248056e52184a6b94ebda3c1c2c329b/psycopg2_binary-2.9.12-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:863f5d12241ebe1c76a72a04c2113b6dc905f90b9cef0e9be0efd994affd9354", size = 4274970, upload-time = "2026-04-20T23:35:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/2e/42/c9853f8db3967fe08bcde11f53d53b85d351750cae726ce001cb68afa9c1/psycopg2_binary-2.9.12-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a99eaab34a9010f1a086b126de467466620a750634d114d20455f3a824aae033", size = 5895175, upload-time = "2026-04-20T23:35:33.584Z" }, + { url = "https://files.pythonhosted.org/packages/eb/fd/b82b5601a97630308bef079f545ffec481bbbc795c2ba5ec416a01d03f60/psycopg2_binary-2.9.12-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ffdd7dc5463ccd61845ac37b7012d0f35a1548df9febe14f8dd549be4a0bc81e", size = 4110658, upload-time = "2026-04-20T23:35:35.638Z" }, + { url = "https://files.pythonhosted.org/packages/62/8c/32ca69b0389ef25dd22937bf9e8fbe2ce27aea20b05ded48c4ce4cb42475/psycopg2_binary-2.9.12-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:54a0dfecab1b48731f934e06139dfe11e24219fb6d0ceb32177cf0375f14c7b5", size = 3656251, upload-time = "2026-04-20T23:35:37.854Z" }, + { url = "https://files.pythonhosted.org/packages/c4/29/96992a2b59e3b9d730fcf9612d0a387305025dc867a9fc490a9e496e074e/psycopg2_binary-2.9.12-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:96937c9c5d891f772430f418a7a8b4691a90c3e6b93cf72b5bd7cad8cbca32a5", size = 3301810, upload-time = "2026-04-20T23:35:39.927Z" }, + { url = "https://files.pythonhosted.org/packages/56/ad/44b06659949b243ae10112cd3b20a197f9bf3e81d5651379b9eb889bfaad/psycopg2_binary-2.9.12-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:77b348775efd4cdab410ec6609d81ccecd1139c90265fa583a7255c8064bc03d", size = 3048977, upload-time = "2026-04-20T23:35:41.806Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f2/10a1bcebadb6aa55e280e1f58975c36a7b560ea525184c7aa4064c466633/psycopg2_binary-2.9.12-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:527e6342b3e44c2f0544f6b8e927d60de7f163f5723b8f1dfa7d2a84298738cd", size = 3351466, upload-time = "2026-04-20T23:35:43.993Z" }, + { url = "https://files.pythonhosted.org/packages/20/be/b732c8418ffa5bcfda002890f5dc4c869fc17db66ff11f53b17cfe44afc0/psycopg2_binary-2.9.12-cp314-cp314-win_amd64.whl", hash = "sha256:f12ae41fcafadb39b2785e64a40f9db05d6de2ac114077457e0e7c597f3af980", size = 2848762, upload-time = "2026-04-20T23:35:46.421Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pycodestyle" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", size = 39472, upload-time = "2025-06-20T18:49:48.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydata-sphinx-theme" +version = "0.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accessible-pygments" }, + { name = "babel" }, + { name = "beautifulsoup4" }, + { name = "docutils" }, + { name = "pygments" }, + { name = "sphinx" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/20/bb50f9de3a6de69e6abd6b087b52fa2418a0418b19597601605f855ad044/pydata_sphinx_theme-0.16.1.tar.gz", hash = "sha256:a08b7f0b7f70387219dc659bff0893a7554d5eb39b59d3b8ef37b8401b7642d7", size = 2412693, upload-time = "2024-12-17T10:53:39.537Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl", hash = "sha256:225331e8ac4b32682c18fcac5a57a6f717c4e632cea5dd0e247b55155faeccde", size = 6723264, upload-time = "2024-12-17T10:53:35.645Z" }, +] + +[[package]] +name = "pydocstyle" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "snowballstemmer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/d5385ca59fd065e3c6a5fe19f9bc9d5ea7f2509fa8c9c22fb6b2031dd953/pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1", size = 36796, upload-time = "2023-01-17T20:29:19.838Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019", size = 38038, upload-time = "2023-01-17T20:29:18.094Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + +[[package]] +name = "pylint" +version = "3.3.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astroid" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "dill" }, + { name = "isort" }, + { name = "mccabe" }, + { name = "platformdirs" }, + { name = "tomlkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/9d/81c84a312d1fa8133b0db0c76148542a98349298a01747ab122f9314b04e/pylint-3.3.9.tar.gz", hash = "sha256:d312737d7b25ccf6b01cc4ac629b5dcd14a0fcf3ec392735ac70f137a9d5f83a", size = 1525946, upload-time = "2025-10-05T18:41:43.786Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/a7/69460c4a6af7575449e615144aa2205b89408dc2969b87bc3df2f262ad0b/pylint-3.3.9-py3-none-any.whl", hash = "sha256:01f9b0462c7730f94786c283f3e52a1fbdf0494bbe0971a78d7277ef46a751e7", size = 523465, upload-time = "2025-10-05T18:41:41.766Z" }, +] + +[[package]] +name = "pylint-celery" +version = "0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astroid" }, + { name = "pylint" }, + { name = "pylint-plugin-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/11/7241fec486839a853cee783e3a00950d46ee1e3e993884341b1d4208a287/pylint-celery-0.3.tar.gz", hash = "sha256:41e32094e7408d15c044178ea828dd524beedbdbe6f83f712c5e35bde1de4beb", size = 1899, upload-time = "2014-09-25T07:23:50.824Z" } + +[[package]] +name = "pylint-django" +version = "2.5.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pylint" }, + { name = "pylint-plugin-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/80/204a27ecaca2a85571a0de772e96a9b0cc0bc35b816f20284daf25cd2dc5/pylint_django-2.5.5.tar.gz", hash = "sha256:2f339e4bf55776958283395c5139c37700c91bd5ef1d8251ef6ac88b5abbba9b", size = 38135, upload-time = "2023-10-23T13:09:37.945Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/af/a12d87924a021ebec74fc79c6742edd09cc63a23d957aca3c32796b8b521/pylint_django-2.5.5-py3-none-any.whl", hash = "sha256:5abd5c2228e0e5e2a4cb6d0b4fc1d1cef1e773d0be911412f4dd4fc1a1a440b7", size = 53262, upload-time = "2023-10-23T13:09:34.578Z" }, +] + +[[package]] +name = "pylint-plugin-utils" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pylint" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/85/24eaf5d0d078fc8799ae6d89faf326d6e4d27d862fc9a710a52ab07b7bb5/pylint_plugin_utils-0.9.0.tar.gz", hash = "sha256:5468d763878a18d5cc4db46eaffdda14313b043c962a263a7d78151b90132055", size = 10474, upload-time = "2025-06-24T07:14:00.534Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/c9/a3b871b0b590c49e38884af6dab58ab9711053bd5c39b8899b72e367b9f6/pylint_plugin_utils-0.9.0-py3-none-any.whl", hash = "sha256:16e9b84e5326ba893a319a0323fcc8b4bcc9c71fc654fcabba0605596c673818", size = 11129, upload-time = "2025-06-24T07:13:58.993Z" }, +] + +[[package]] +name = "pymongo" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/49/f2487573da7a2ee0e19ca488a235a23338b076e670368d447095b634c605/pymongo-4.4.0.tar.gz", hash = "sha256:a1b5d286fee4b9b5a0312faede02f2ce2f56ac695685af1d25f428abdac9a22c", size = 828425, upload-time = "2023-06-21T17:59:09.253Z" } + +[[package]] +name = "pynacl" +version = "1.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/9a/4019b524b03a13438637b11538c82781a5eda427394380381af8f04f467a/pynacl-1.6.2.tar.gz", hash = "sha256:018494d6d696ae03c7e656e5e74cdfd8ea1326962cc401bcf018f1ed8436811c", size = 3511692, upload-time = "2026-01-01T17:48:10.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/79/0e3c34dc3c4671f67d251c07aa8eb100916f250ee470df230b0ab89551b4/pynacl-1.6.2-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:622d7b07cc5c02c666795792931b50c91f3ce3c2649762efb1ef0d5684c81594", size = 390064, upload-time = "2026-01-01T17:31:57.264Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/23a26e931736e13b16483795c8a6b2f641bf6a3d5238c22b070a5112722c/pynacl-1.6.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d071c6a9a4c94d79eb665db4ce5cedc537faf74f2355e4d502591d850d3913c0", size = 809370, upload-time = "2026-01-01T17:31:59.198Z" }, + { url = "https://files.pythonhosted.org/packages/87/74/8d4b718f8a22aea9e8dcc8b95deb76d4aae380e2f5b570cc70b5fd0a852d/pynacl-1.6.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe9847ca47d287af41e82be1dd5e23023d3c31a951da134121ab02e42ac218c9", size = 1408304, upload-time = "2026-01-01T17:32:01.162Z" }, + { url = "https://files.pythonhosted.org/packages/fd/73/be4fdd3a6a87fe8a4553380c2b47fbd1f7f58292eb820902f5c8ac7de7b0/pynacl-1.6.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:04316d1fc625d860b6c162fff704eb8426b1a8bcd3abacea11142cbd99a6b574", size = 844871, upload-time = "2026-01-01T17:32:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/55/ad/6efc57ab75ee4422e96b5f2697d51bbcf6cdcc091e66310df91fbdc144a8/pynacl-1.6.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44081faff368d6c5553ccf55322ef2819abb40e25afaec7e740f159f74813634", size = 1446356, upload-time = "2026-01-01T17:32:04.452Z" }, + { url = "https://files.pythonhosted.org/packages/78/b7/928ee9c4779caa0a915844311ab9fb5f99585621c5d6e4574538a17dca07/pynacl-1.6.2-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:a9f9932d8d2811ce1a8ffa79dcbdf3970e7355b5c8eb0c1a881a57e7f7d96e88", size = 826814, upload-time = "2026-01-01T17:32:06.078Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a9/1bdba746a2be20f8809fee75c10e3159d75864ef69c6b0dd168fc60e485d/pynacl-1.6.2-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:bc4a36b28dd72fb4845e5d8f9760610588a96d5a51f01d84d8c6ff9849968c14", size = 1411742, upload-time = "2026-01-01T17:32:07.651Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2f/5e7ea8d85f9f3ea5b6b87db1d8388daa3587eed181bdeb0306816fdbbe79/pynacl-1.6.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bffb6d0f6becacb6526f8f42adfb5efb26337056ee0831fb9a7044d1a964444", size = 801714, upload-time = "2026-01-01T17:32:09.558Z" }, + { url = "https://files.pythonhosted.org/packages/06/ea/43fe2f7eab5f200e40fb10d305bf6f87ea31b3bbc83443eac37cd34a9e1e/pynacl-1.6.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2fef529ef3ee487ad8113d287a593fa26f48ee3620d92ecc6f1d09ea38e0709b", size = 1372257, upload-time = "2026-01-01T17:32:11.026Z" }, + { url = "https://files.pythonhosted.org/packages/4d/54/c9ea116412788629b1347e415f72195c25eb2f3809b2d3e7b25f5c79f13a/pynacl-1.6.2-cp314-cp314t-win32.whl", hash = "sha256:a84bf1c20339d06dc0c85d9aea9637a24f718f375d861b2668b2f9f96fa51145", size = 231319, upload-time = "2026-01-01T17:32:12.46Z" }, + { url = "https://files.pythonhosted.org/packages/ce/04/64e9d76646abac2dccf904fccba352a86e7d172647557f35b9fe2a5ee4a1/pynacl-1.6.2-cp314-cp314t-win_amd64.whl", hash = "sha256:320ef68a41c87547c91a8b58903c9caa641ab01e8512ce291085b5fe2fcb7590", size = 244044, upload-time = "2026-01-01T17:32:13.781Z" }, + { url = "https://files.pythonhosted.org/packages/33/33/7873dc161c6a06f43cda13dec67b6fe152cb2f982581151956fa5e5cdb47/pynacl-1.6.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d29bfe37e20e015a7d8b23cfc8bd6aa7909c92a1b8f41ee416bbb3e79ef182b2", size = 188740, upload-time = "2026-01-01T17:32:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/be/7b/4845bbf88e94586ec47a432da4e9107e3fc3ce37eb412b1398630a37f7dd/pynacl-1.6.2-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:c949ea47e4206af7c8f604b8278093b674f7c79ed0d4719cc836902bf4517465", size = 388458, upload-time = "2026-01-01T17:32:16.829Z" }, + { url = "https://files.pythonhosted.org/packages/1e/b4/e927e0653ba63b02a4ca5b4d852a8d1d678afbf69b3dbf9c4d0785ac905c/pynacl-1.6.2-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8845c0631c0be43abdd865511c41eab235e0be69c81dc66a50911594198679b0", size = 800020, upload-time = "2026-01-01T17:32:18.34Z" }, + { url = "https://files.pythonhosted.org/packages/7f/81/d60984052df5c97b1d24365bc1e30024379b42c4edcd79d2436b1b9806f2/pynacl-1.6.2-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22de65bb9010a725b0dac248f353bb072969c94fa8d6b1f34b87d7953cf7bbe4", size = 1399174, upload-time = "2026-01-01T17:32:20.239Z" }, + { url = "https://files.pythonhosted.org/packages/68/f7/322f2f9915c4ef27d140101dd0ed26b479f7e6f5f183590fd32dfc48c4d3/pynacl-1.6.2-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:46065496ab748469cdd999246d17e301b2c24ae2fdf739132e580a0e94c94a87", size = 835085, upload-time = "2026-01-01T17:32:22.24Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d0/f301f83ac8dbe53442c5a43f6a39016f94f754d7a9815a875b65e218a307/pynacl-1.6.2-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a66d6fb6ae7661c58995f9c6435bda2b1e68b54b598a6a10247bfcdadac996c", size = 1437614, upload-time = "2026-01-01T17:32:23.766Z" }, + { url = "https://files.pythonhosted.org/packages/c4/58/fc6e649762b029315325ace1a8c6be66125e42f67416d3dbd47b69563d61/pynacl-1.6.2-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:26bfcd00dcf2cf160f122186af731ae30ab120c18e8375684ec2670dccd28130", size = 818251, upload-time = "2026-01-01T17:32:25.69Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a8/b917096b1accc9acd878819a49d3d84875731a41eb665f6ebc826b1af99e/pynacl-1.6.2-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c8a231e36ec2cab018c4ad4358c386e36eede0319a0c41fed24f840b1dac59f6", size = 1402859, upload-time = "2026-01-01T17:32:27.215Z" }, + { url = "https://files.pythonhosted.org/packages/85/42/fe60b5f4473e12c72f977548e4028156f4d340b884c635ec6b063fe7e9a5/pynacl-1.6.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:68be3a09455743ff9505491220b64440ced8973fe930f270c8e07ccfa25b1f9e", size = 791926, upload-time = "2026-01-01T17:32:29.314Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f9/e40e318c604259301cc091a2a63f237d9e7b424c4851cafaea4ea7c4834e/pynacl-1.6.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b097553b380236d51ed11356c953bf8ce36a29a3e596e934ecabe76c985a577", size = 1363101, upload-time = "2026-01-01T17:32:31.263Z" }, + { url = "https://files.pythonhosted.org/packages/48/47/e761c254f410c023a469284a9bc210933e18588ca87706ae93002c05114c/pynacl-1.6.2-cp38-abi3-win32.whl", hash = "sha256:5811c72b473b2f38f7e2a3dc4f8642e3a3e9b5e7317266e4ced1fba85cae41aa", size = 227421, upload-time = "2026-01-01T17:32:33.076Z" }, + { url = "https://files.pythonhosted.org/packages/41/ad/334600e8cacc7d86587fe5f565480fde569dfb487389c8e1be56ac21d8ac/pynacl-1.6.2-cp38-abi3-win_amd64.whl", hash = "sha256:62985f233210dee6548c223301b6c25440852e13d59a8b81490203c3227c5ba0", size = 239754, upload-time = "2026-01-01T17:32:34.557Z" }, + { url = "https://files.pythonhosted.org/packages/29/7d/5945b5af29534641820d3bd7b00962abbbdfee84ec7e19f0d5b3175f9a31/pynacl-1.6.2-cp38-abi3-win_arm64.whl", hash = "sha256:834a43af110f743a754448463e8fd61259cd4ab5bbedcf70f9dabad1d28a394c", size = 184801, upload-time = "2026-01-01T17:32:36.309Z" }, +] + +[[package]] +name = "pyproject-api" +version = "1.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/62/0fe346fe380b1aafaf819c8cb195d3241bb4f355f908e6339814131a830b/pyproject_api-1.10.1.tar.gz", hash = "sha256:c2b2726bd7aa9217b6c50b621fef5b2ae5def4d55b779c9e0694c15e0a8517ba", size = 23477, upload-time = "2026-05-28T14:22:14.049Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/d7/29e1e5e882f79133631f7bcace42d23db493f616463c157a1ab614bf69dd/pyproject_api-1.10.1-py3-none-any.whl", hash = "sha256:fa9e6f66c35b5017e909825d8f2b5d5482ea699d7be809d21c03bd1f7317f36a", size = 12992, upload-time = "2026-05-28T14:22:12.711Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pysocks" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/11/293dd436aea955d45fc4e8a35b6ae7270f5b8e00b53cf6c024c83b657a11/PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0", size = 284429, upload-time = "2019-09-20T02:07:35.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", size = 16725, upload-time = "2019-09-20T02:06:22.938Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "pytest-django" +version = "4.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/2b/db9a193df89e5660137f5428063bcc2ced7ad790003b26974adf5c5ceb3b/pytest_django-4.12.0.tar.gz", hash = "sha256:df94ec819a83c8979c8f6de13d9cdfbe76e8c21d39473cfe2b40c9fc9be3c758", size = 91156, upload-time = "2026-02-14T18:40:49.235Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/a5/41d091f697c09609e7ef1d5d61925494e0454ebf51de7de05f0f0a728f1d/pytest_django-4.12.0-py3-none-any.whl", hash = "sha256:3ff300c49f8350ba2953b90297d23bf5f589db69545f56f1ec5f8cff5da83e85", size = 26123, upload-time = "2026-02-14T18:40:47.381Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-discovery" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/81/58c70036dffeccb7fe7d79d6260c69f7a28272bbd3909c29a01ea9422744/python_discovery-1.4.4.tar.gz", hash = "sha256:5cad33982d412c1f3ffb8f9ca4ea292c9680bca3942451d30b69c37fce53a4a3", size = 72212, upload-time = "2026-07-08T23:06:50.691Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/ae/84bc0d2440c95772272bb6f4b3d09ccf08b2898fce89b3d4f969a9fc74e9/python_discovery-1.4.4-py3-none-any.whl", hash = "sha256:abebe9120b43453b68c908acfb1e72a19d1a959ed2cb620ad38fc57d08056dbe", size = 34181, upload-time = "2026-07-08T23:06:49.402Z" }, +] + +[[package]] +name = "python-ipware" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/60/da4426c3e9aee56f08b24091a9e85a0414260f928f97afd0013dfbd0332f/python_ipware-3.0.0.tar.gz", hash = "sha256:9117b1c4dddcb5d5ca49e6a9617de2fc66aec2ef35394563ac4eecabdf58c062", size = 16609, upload-time = "2024-04-19T20:00:58.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/bd/ccd7416fdb30f104ddf6cfd8ee9f699441c7d9880a26f9b3089438adee05/python_ipware-3.0.0-py3-none-any.whl", hash = "sha256:fc936e6e7ec9fcc107f9315df40658f468ac72f739482a707181742882e36b60", size = 10761, upload-time = "2024-04-19T20:00:57.171Z" }, +] + +[[package]] +name = "python-slugify" +version = "8.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "text-unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" }, +] + +[[package]] +name = "python-subunit" +version = "1.4.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "iso8601" }, + { name = "pyyaml", version = "3.10", source = { registry = "https://pypi.org/simple" } }, + { name = "testtools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/8a/954ea9440df88462f5a4f693fe096b00b53afec8739e47e6d050af1581b5/python_subunit-1.4.6.tar.gz", hash = "sha256:31fe6a7b35550b0d72da98caaa6ba64c547d9346c2846b845cb5c781849e2762", size = 97218, upload-time = "2026-05-04T10:34:32.466Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/f7/9a1dce797e9d3b0bee367539f00380fe0b9d8a9ce2ee4bf096e84bd17ace/python_subunit-1.4.6-py3-none-any.whl", hash = "sha256:931a0c89709105b23095b9a2c6d7fe904a232aa7a450ce43e15317c82819c22d", size = 77458, upload-time = "2026-05-04T10:34:30.774Z" }, +] + +[[package]] +name = "python3-openid" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "defusedxml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/4a/29feb8da6c44f77007dcd29518fea73a3d5653ee02a587ae1f17f1f5ddb5/python3-openid-3.2.0.tar.gz", hash = "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf", size = 305600, upload-time = "2020-06-29T12:15:49.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/a5/c6ba13860bdf5525f1ab01e01cc667578d6f1efc8a1dba355700fb04c29b/python3_openid-3.2.0-py3-none-any.whl", hash = "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b", size = 133681, upload-time = "2020-06-29T12:15:47.502Z" }, +] + +[[package]] +name = "python3-saml" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "isodate" }, + { name = "lxml" }, + { name = "xmlsec" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/98/6e0268c3a9893af3d4c5cf670183e0314cd6b5cb034a612d6a7cc5060df8/python3-saml-1.16.0.tar.gz", hash = "sha256:97c9669aecabc283c6e5fb4eb264f446b6e006f5267d01c9734f9d8bffdac133", size = 83468, upload-time = "2023-10-09T10:37:43.128Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/14/49d9828443b58bd5cc80a454c91b0f867fbf36a24975d501945e6cb9e32f/python3_saml-1.16.0-py3-none-any.whl", hash = "sha256:20b97d11b04f01ee22e98f4a38242e2fea2e28fbc7fbc9bdd57cab5ac7fc2d0d", size = 76155, upload-time = "2023-10-09T10:40:34.001Z" }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, +] + +[[package]] +name = "pyyaml" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version == '3.13.*'", + "python_full_version < '3.13'", +] +sdist = { url = "https://files.pythonhosted.org/packages/00/17/3b822893a1789a025d3f676a381338516a8f65e686d915b0834ecc9b4979/PyYAML-3.10.tar.gz", hash = "sha256:e713da45c96ca53a3a8b48140d4120374db622df16ab71759c9ceb5b8d46fe7c", size = 241524, upload-time = "2011-07-01T22:59:26.759Z" } + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version == '3.13.*'", + "python_full_version < '3.13'", +] +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "readme-renderer" +version = "45.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "nh3" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/51/d3a6ea424652c60f05600d8c2e01a55c913755e7cdad64afabbd1aa16f44/readme_renderer-45.0.tar.gz", hash = "sha256:030a8fac74904f8fba11ad1bb6964e3f76e896dc7e5e71f16af190c9056696d1", size = 36172, upload-time = "2026-06-09T21:05:17.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/1b/295bf2fa3e740131778065e5ffa2c481f0e7210182d408e9a2c244ff5b0c/readme_renderer-45.0-py3-none-any.whl", hash = "sha256:3385ed220117104a2bceb4a9dac8c5fdf6d1f96890d7ea2a9c7174fd5c84091f", size = 14134, upload-time = "2026-06-09T21:05:15.85Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, +] + +[[package]] +name = "responses" +version = "0.26.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml", version = "6.0.3", source = { registry = "https://pypi.org/simple" } }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/1a/4af3e6d659394b809838490b144e4ab8d7ed3b9fecc7ca78f5d2f79b1a3d/responses-0.26.2.tar.gz", hash = "sha256:9c9259b46a8349197edebf43cfa68a87e1a2802ef503ff8b2fecbabc0b45afd8", size = 84030, upload-time = "2026-07-03T16:44:50.325Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/28/693e1d9ebf72baa062ded80d837a035b86ce75eda5a269379e9e2b1008a8/responses-0.26.2-py3-none-any.whl", hash = "sha256:6fdfeabd58e5ec473b98dfe02e6d46d3173bd8dd573eff2ccccf1a05a5135364", size = 35609, upload-time = "2026-07-03T16:44:49.1Z" }, +] + +[[package]] +name = "restructuredtext-lint" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/e6/eefcad2228f4124f17e01064428fbcd0ade06a274f3063ce3a126a569d6b/restructuredtext_lint-2.0.2.tar.gz", hash = "sha256:dd25209b9e0b726929d8306339faf723734a3137db382bcf27294fa18a6bc52b", size = 17494, upload-time = "2025-11-23T08:05:18.585Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl", hash = "sha256:374c0d3e7e0867b2335146a145343ac619400623716b211b9a010c94426bbed7", size = 14198, upload-time = "2025-11-23T08:05:23.267Z" }, +] + +[[package]] +name = "rfc3986" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload-time = "2022-01-10T00:52:30.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload-time = "2022-01-10T00:52:29.594Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "roman-numerals" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, +] + +[[package]] +name = "roman-numerals-py" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "roman-numerals" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/b5/de96fca640f4f656eb79bbee0e79aeec52e3e0e359f8a3e6a0d366378b64/roman_numerals_py-4.1.0.tar.gz", hash = "sha256:f5d7b2b4ca52dd855ef7ab8eb3590f428c0b1ea480736ce32b01fef2a5f8daf9", size = 4274, upload-time = "2025-12-17T18:25:41.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl", hash = "sha256:553114c1167141c1283a51743759723ecd05604a1b6b507225e91dc1a6df0780", size = 4547, upload-time = "2025-12-17T18:25:40.136Z" }, +] + +[[package]] +name = "rules" +version = "3.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/36/918cf4cc9fd0e38bb9310b2d1a13ae6ebb2b5732d56e7de6feb4a992a6ed/rules-3.5.tar.gz", hash = "sha256:f01336218f4561bab95f53672d22418b4168baea271423d50d9e8490d64cb27a", size = 55504, upload-time = "2024-09-02T16:01:46.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/33/16213dd62ca8ce8749985318a966ac1300ab55c977b2d66632a45b405c99/rules-3.5-py2.py3-none-any.whl", hash = "sha256:0f00fc9ee448b3f82e9aff9334ab0c56c76dce4dfa14f1598f57969f1022acc0", size = 25658, upload-time = "2024-09-02T16:01:44.844Z" }, +] + +[[package]] +name = "sailthru-client" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, + { name = "simplejson" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/15/4a166de02d301b2bb5956d70d3e34c5dfe842bb3ce629ef803a4bdf22726/sailthru-client-2.2.3.tar.gz", hash = "sha256:f426706fd57955f88fe5b0488458b24024503edd555364b9e001823a31838656", size = 10357, upload-time = "2016-04-07T19:19:34.707Z" } + +[[package]] +name = "secretstorage" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jeepney" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, +] + +[[package]] +name = "selenium" +version = "4.45.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "trio" }, + { name = "trio-websocket" }, + { name = "typing-extensions" }, + { name = "urllib3", extra = ["socks"], marker = "extra == 'group-14-edx-enterprise-js-test'" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/48/486aa67320f27452e9f551b8608f1a59ce7091c8fe7ebc9f4eba274775d4/selenium-4.45.0.tar.gz", hash = "sha256:563f0c4102f112df1cda30d46ce6d177b2e4a7a3d4b0756902d5dc84d3a8a365", size = 1005503, upload-time = "2026-06-16T04:43:57.915Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/8a/6ff6beb9c7c6cc642f628df9328a8b6637f86602eff8d28e70b5d4e8bca7/selenium-4.45.0-py3-none-any.whl", hash = "sha256:1fd9d0dc08192b2f8100e264ed720f83b05d2dd3a7feff673df04e0c7580df4b", size = 9536616, upload-time = "2026-06-16T04:43:55.968Z" }, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, +] + +[[package]] +name = "setuptools" +version = "81.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/1c/73e719955c59b8e424d015ab450f51c0af856ae46ea2da83eba51cc88de1/setuptools-81.0.0.tar.gz", hash = "sha256:487b53915f52501f0a79ccfd0c02c165ffe06631443a886740b91af4b7a5845a", size = 1198299, upload-time = "2026-02-06T21:10:39.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/e3/c164c88b2e5ce7b24d667b9bd83589cf4f3520d97cad01534cd3c4f55fdb/setuptools-81.0.0-py3-none-any.whl", hash = "sha256:fdd925d5c5d9f62e4b74b30d6dd7828ce236fd6ed998a08d81de62ce5a6310d6", size = 1062021, upload-time = "2026-02-06T21:10:37.175Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "simplejson" +version = "4.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/2a/54837395a3487c725669428d513293612a48d82b95a0642c936932e5d898/simplejson-4.1.1.tar.gz", hash = "sha256:c08eb9f7a90f77ae470e19a07472e9a79ebc0d1c2315d86a72767665bd5ba79f", size = 118860, upload-time = "2026-04-24T19:24:59.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/25/e90998fe8e480eb43b966c09e835379887d427567ebd496563d3b1e16b19/simplejson-4.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:19040a17154dc03d289bab68d73ce0a6a0be01de30c584bbdd93490bead14b22", size = 112414, upload-time = "2026-04-24T19:23:06.084Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a0/abd4785f36c3400f1fbb21f517be39295a750a714f04b7ee175adf6ef580/simplejson-4.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a94ebaecdbaa80d9551a3ec6bf0c9302fc8b53ab6c1b2bfd498a1df4cb28158d", size = 91120, upload-time = "2026-04-24T19:23:07.877Z" }, + { url = "https://files.pythonhosted.org/packages/b8/78/fc060d2e3b13c6ec59288574b8efac64075e316b2afba4396a56b2422f78/simplejson-4.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:67341c95c0a168ab4a6d1e807e50463f1c8da932c3286d81e201266c427061fa", size = 91055, upload-time = "2026-04-24T19:23:09.264Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b6/156a8de1e1b47694f0e7de6675866936608d45dc68388fd017d36f8693be/simplejson-4.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:45ec18e337fec538b7e902d489505c450b2454653d1290f3f50385e6fd8aa607", size = 190297, upload-time = "2026-04-24T19:23:11.226Z" }, + { url = "https://files.pythonhosted.org/packages/86/1c/e4d0eab695be3eb21d0f46bce820752031f03e7113f9c80a9b3c73ee7157/simplejson-4.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:820c69a4710400e9b248d5670647d60be58824369282d3925e516b3ff1a7cd82", size = 187002, upload-time = "2026-04-24T19:23:12.982Z" }, + { url = "https://files.pythonhosted.org/packages/76/0e/7f5a59d29426b062d5928fb88b403c3f797129d53be7102f955dbe51aa44/simplejson-4.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e708d373a10e4378ef2d59f8361850c7150fd907ed49efe49bc5492160476d1", size = 195146, upload-time = "2026-04-24T19:23:14.517Z" }, + { url = "https://files.pythonhosted.org/packages/78/18/9943db224dd4d5fa3c090c3e56a94c37b254338c83995ec5680285111c40/simplejson-4.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:980fc33353f81fd12d8c49d44f8c2760d1dc8192285e627c5180d141035b228a", size = 183931, upload-time = "2026-04-24T19:23:16.742Z" }, + { url = "https://files.pythonhosted.org/packages/c2/08/9a690da9a766161c06c627d805362cf159f1abe480969372b2897649b955/simplejson-4.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:de2ed102fff88dacf543699f53ee3a533cc11539a39baa176b7e09dd783069d6", size = 192228, upload-time = "2026-04-24T19:23:18.33Z" }, + { url = "https://files.pythonhosted.org/packages/05/88/bd8aad36b451ffb0e0a3f721d695a88befa6d1ac7d1e02ae788ca7ff4029/simplejson-4.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2785ff8edc0e28bf773a32543a6bbed46351453c997b3f6709c744e3c2f7eabb", size = 187808, upload-time = "2026-04-24T19:23:21.165Z" }, + { url = "https://files.pythonhosted.org/packages/04/ee/14f91db0d1f481533b651dafbf8cd0da088d9817f7af30c68f7f19f9c847/simplejson-4.1.1-cp312-cp312-win32.whl", hash = "sha256:2e0d5ead6d14610467ec356ec1f6b5d8a56aa216abaad8d41c8b873b16cf313f", size = 88512, upload-time = "2026-04-24T19:23:22.764Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c4/90de06b2d8737c68c05ff9274113f854dbf6a5f28b7a955212111672cb57/simplejson-4.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:63a5451f557d6be48a231bae932458655c620902b868170b2f1c8afed496f6b4", size = 90748, upload-time = "2026-04-24T19:23:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/37/a9/47b445eeb559c9593453a0648e0fd6d08e8adff64dd5e5ced66726da8a09/simplejson-4.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dff52fc7af272e84fc21cc5a06c927c823ca6ae00af14f3b0d7707b42775ed98", size = 113160, upload-time = "2026-04-24T19:23:26.033Z" }, + { url = "https://files.pythonhosted.org/packages/4c/65/cb72db31523c164dea5dc55b02dad065a40c478856bc7534b279d2b51906/simplejson-4.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:971aed0647ad6e840a3943bec812fcda5f2d26a5497a4981d1fb49aa4f9a396c", size = 91521, upload-time = "2026-04-24T19:23:27.572Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e5/54cb7c50ad5fdc1e0a86b7df4b135c2cbd5c4623605aa94466659098e8da/simplejson-4.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:249e2e220aa6d9b9d936bde84eb7bf79d5b6c5a8273c6e411f8b1635a9073f2d", size = 91407, upload-time = "2026-04-24T19:23:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/21a3ede87f0bf82d6c7bcb90480d50a6490eb974c6ab20881188e440957c/simplejson-4.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e5cdd6a5d52299f345c15ab5678cc4249e24f383f361d986afbc3c7072a6b6b", size = 192451, upload-time = "2026-04-24T19:23:30.56Z" }, + { url = "https://files.pythonhosted.org/packages/59/df/9903edd3102bf0b5984edfcb90c88612330996efa3b4fbf8a971d6e17839/simplejson-4.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:642cec364e0676e2d5a73fa4d31d0c7c55886997caa2fde24e8292ca44d32728", size = 189015, upload-time = "2026-04-24T19:23:32.647Z" }, + { url = "https://files.pythonhosted.org/packages/98/cd/33230927a780e1398b857e3944abb914556994d252b1d765ae40d112cb25/simplejson-4.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:76fe296ca1df23d290033f10aaacf534fd1b3e3007e7f9ff8aa68b21413aaa78", size = 196658, upload-time = "2026-04-24T19:23:34.563Z" }, + { url = "https://files.pythonhosted.org/packages/cd/84/2c5a7444eb53e9a86d3738299bffddd9f53aeed799ded2f45368221fdb19/simplejson-4.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f0ad25b7dc4e0fb23858355819f2e994f1a5badcdcde8737eac7921c2f1ed2a", size = 185967, upload-time = "2026-04-24T19:23:36.191Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/454378e06d059cd412a7ed5d87fb6d29fd5b60f13a4d89fc1f764ff434df/simplejson-4.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a59ebd0533f03fd06ff0c42ba0f02d93cbcdd7944922bf3b93911327a95b901f", size = 193940, upload-time = "2026-04-24T19:23:38.151Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d5/a15bf915f623a2c5a079d6e3be8256fdb8ef06f110669493a09b9d6933e0/simplejson-4.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bccbf4419676b517939852e5aeff2af6aee4dc046881c67a1581fa6f1cb01abd", size = 189795, upload-time = "2026-04-24T19:23:40.139Z" }, + { url = "https://files.pythonhosted.org/packages/d2/c9/37212ae7dc4b607f0978c408e8633f05c810884e054c33113184c6c2c8a2/simplejson-4.1.1-cp313-cp313-win32.whl", hash = "sha256:6c845363eb5fd166fb7c72243da38f4fcfde666ede7fdf2cc6fd7762894626f7", size = 88773, upload-time = "2026-04-24T19:23:41.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a5/c7a0a47883a9015b54c9d8a4b62f2aba17bd4335b1787b9b8a0fc2fa6d52/simplejson-4.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:104d8324c34f25b4b90800bc5fa363780cbc3d8496aef061cba7ce1af9162270", size = 90888, upload-time = "2026-04-24T19:23:43.11Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/4a118a6a92eb33bb08c8e2fe7ec85cb96f0673491bb2b829930831ee4fbe/simplejson-4.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ed7473602b6625de793b6acba49aa949f144a475f538792067e4cf2fda2071f5", size = 110492, upload-time = "2026-04-24T19:23:44.957Z" }, + { url = "https://files.pythonhosted.org/packages/07/f4/84d160e9fa8cada1e0a9381cae4fa81eecd573577a5b34366d8ced59bdf7/simplejson-4.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:225c9caa324c5b554d009fb9cac22aee7711e71bd96f487938c659af467e828e", size = 90152, upload-time = "2026-04-24T19:23:46.355Z" }, + { url = "https://files.pythonhosted.org/packages/68/31/9a5432c433a7671107182cdc9a20ea78a70f99c4e5334aa54b6d4d0d79ed/simplejson-4.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:95407269340c7f22f09776ea7b717a52cf56cfcf119b5e45f66faa4a26445bea", size = 90115, upload-time = "2026-04-24T19:23:47.743Z" }, + { url = "https://files.pythonhosted.org/packages/78/91/3635cdb13318cb0a328abaa69e2b91251caad39d6779aa308098f341f6cb/simplejson-4.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3851658d642c1184d2023f0e6c9ce44a21eb1629e74e7c84ef956b128841fe12", size = 184036, upload-time = "2026-04-24T19:23:49.472Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/149b6ec5393f6849d98c59cadba888b710a8ef4b805ab91e11a566960d40/simplejson-4.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:95a3bb0f78e85f4937f99092239f2011ce06f0f2d803df5c299cc05abbeae008", size = 180543, upload-time = "2026-04-24T19:23:51.023Z" }, + { url = "https://files.pythonhosted.org/packages/df/7c/a5d968d0b527a748b667e62bea94309ccbcb1e2b108e8f0cf8547efaa12b/simplejson-4.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bbfdaa7c0603f75b7b14b211b7f2be44696d4e26833ad2d91d5c87bf5fb9a920", size = 188725, upload-time = "2026-04-24T19:23:52.995Z" }, + { url = "https://files.pythonhosted.org/packages/db/e3/6a8d11181d587ef00e2db9112357e6832111e56dd56b01b5c11758a1965d/simplejson-4.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39e3c584071dced8c21b4689f0254303521daeb9b5bc1f4289755d71fa3cb0d3", size = 177492, upload-time = "2026-04-24T19:23:54.581Z" }, + { url = "https://files.pythonhosted.org/packages/67/e3/8b0eb8b06e8198cfbd1270487da163d0093df05cc4f557350cd65e2f7e79/simplejson-4.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:036a27bd0469b9d79557cbddb392969f876cd7f278cfbd0fba81534927a06575", size = 185281, upload-time = "2026-04-24T19:23:56.13Z" }, + { url = "https://files.pythonhosted.org/packages/dc/5f/64990f07ec9e2cb1a814c674e2e21b5693207f74ac70eb72151b847ea4e6/simplejson-4.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b70bfd2f67f3351baba08aa3ae9233c83f21fd95ae5e6b3d0ecb8c647929112f", size = 181848, upload-time = "2026-04-24T19:23:57.92Z" }, + { url = "https://files.pythonhosted.org/packages/61/a5/bbc1bc0447f339f79f99ab8c37f7f037cb2f1f93af75d6a4d553096bb0c3/simplejson-4.1.1-cp314-cp314-win32.whl", hash = "sha256:37233c72ce88d06acb92747347742b3c07871eba6789f060c179c9302dde8efe", size = 88761, upload-time = "2026-04-24T19:23:59.397Z" }, + { url = "https://files.pythonhosted.org/packages/18/72/ec1b5cbdcb140c132e6c7bdf99bd73e4f675439e77126c88f472fcffa09c/simplejson-4.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:cc0442dea71cd9cbf30a0b8b9929ab5aa6c02c0443a3d977351e6ec5bada4388", size = 91018, upload-time = "2026-04-24T19:24:00.85Z" }, + { url = "https://files.pythonhosted.org/packages/3d/97/4fa437f68ff72219bac3bf3d050de9c6265691f3a170e16954bd69d7cddd/simplejson-4.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:c996a4d38290c515af347740659ce095b425449c164a5c9fa3977caa6eff5dbe", size = 113919, upload-time = "2026-04-24T19:24:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/c2/83/59de041d09eb4a9577f7015d7263c32095dfb7fde49717dff62145d89809/simplejson-4.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c65c763fb20d7ca113c1c14dce2fc04a0fc3a57aceff533d6fdac707c7bffb40", size = 91904, upload-time = "2026-04-24T19:24:03.812Z" }, + { url = "https://files.pythonhosted.org/packages/03/8e/46bb345d540f6eb31427d984a4e518cdb182d0621814fee4fee045e8815b/simplejson-4.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0da5c9f57206ee7ef280ff7f1d924937b0a64f9a271a5ef371a2ecdbebba7421", size = 91752, upload-time = "2026-04-24T19:24:05.622Z" }, + { url = "https://files.pythonhosted.org/packages/83/e2/1b2ce97f068835eb3d253c116a4df7a3f436b7bf2fb5ff1ba29287e8b0ec/simplejson-4.1.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ea3426e786425d10e9e82f8a6eda74a7d6eb10d99165ac3d0d3bbcb65c0ea343", size = 214021, upload-time = "2026-04-24T19:24:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/48/70/d93e556df6a0786298644a7c08304fcbeddc248325f23f38acbebeb21165/simplejson-4.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d75cea7a1025edd7e439b2966b3d977c45b5b899e2adaf422811b3ac702ed9fb", size = 213530, upload-time = "2026-04-24T19:24:09.289Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/c93bf305b9f00d7259e09e713d60e75bd0f7f53da970f716ab90491770e7/simplejson-4.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63c2ada8e58f266491f19eed2eeeb7c25c6141e52f8f9e820f6bb94156cf8dbc", size = 218282, upload-time = "2026-04-24T19:24:10.991Z" }, + { url = "https://files.pythonhosted.org/packages/0c/20/a9b5d2e27ec44b069ee251bd55544fc76929a067107b1050001566ba86f3/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d1fffb56305c5b475ee746cf9e04f97423ba5aaacd292dc1255bd75b1d3b124b", size = 209249, upload-time = "2026-04-24T19:24:12.662Z" }, + { url = "https://files.pythonhosted.org/packages/97/e4/e06ee682ed5df67592181f5ecb062e35878967e27f5b6e087237d4548d95/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a6525ec733f43d0541206cffa64fd2aad5a7ae3eb76566aff49cd4db6382209a", size = 213963, upload-time = "2026-04-24T19:24:14.302Z" }, + { url = "https://files.pythonhosted.org/packages/9c/9f/1e160e4cd8cdbf062bf6a454cdf814dc7a48eb47e566fdb8f80ccb202605/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:861e393260508efa64d8805a8e49c416c3484907e3f146ce966c69552b49b9a3", size = 210474, upload-time = "2026-04-24T19:24:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e6/cecd913df322df5bbe7ebb8ba39e0708e505a165553900da8a7761026d6f/simplejson-4.1.1-cp314-cp314t-win32.whl", hash = "sha256:d083b89d30948a751d3d97476c2ed91e4caaa24a1a1459bdbadb8876242c71fe", size = 91134, upload-time = "2026-04-24T19:24:17.635Z" }, + { url = "https://files.pythonhosted.org/packages/97/73/f540dde99cc1d393bd062ab3b5735b777561a5d8f8a5f2e241164444d77a/simplejson-4.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4cbb299d0528ec0447fe366d8c9641860e28f997a62730690fef905f1f41046e", size = 94467, upload-time = "2026-04-24T19:24:19.109Z" }, + { url = "https://files.pythonhosted.org/packages/ce/6a/8b74c52ffd33dbbde00fe7251fee6a0acdc8cea33f7a43805aed258fb79b/simplejson-4.1.1-py3-none-any.whl", hash = "sha256:2ce92b3748f02423e26d2bfb636fb9d7a8f67c8f5854dcae69d350d123b2eee2", size = 69195, upload-time = "2026-04-24T19:24:57.962Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "slumber" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/3a/6d42c6a5909207aa2487fda0c6f09c7dac259e5154d6ad74ec160db69660/slumber-0.7.1.tar.gz", hash = "sha256:96899ce914f8d7862ce34f4e50af3a82e35588ab61b4912b85844479f4d177cb", size = 10755, upload-time = "2015-05-14T15:53:57.617Z" } + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "snowballstemmer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/f8/0a71edf031f03c40db17503cb8ca78a69a171254e568e7db241b0ab57ea1/snowballstemmer-3.1.1.tar.gz", hash = "sha256:e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260", size = 123314, upload-time = "2026-06-03T00:56:40.194Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/07/2ebca9b11fb9be7340a818d8d6f63feaebb146be2c4afbd6061701d6df6e/snowballstemmer-3.1.1-py3-none-any.whl", hash = "sha256:7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752", size = 104164, upload-time = "2026-06-03T00:56:38.614Z" }, +] + +[[package]] +name = "social-auth-app-django" +version = "5.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "social-auth-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/f5/cede3d063625add7405f0be6a6391a1103593d20275e5fa11fffb5380c88/social-auth-app-django-5.4.1.tar.gz", hash = "sha256:2a43cde559dd34fdc7132417b6c52c780fa99ec2332dee9f405b4763f371c367", size = 25250, upload-time = "2024-04-24T17:22:36.821Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/e3/60318a13a5d58daa0b37eb2b8b0bada5a9d5725efb407358cebedbcc0ada/social_auth_app_django-5.4.1-py3-none-any.whl", hash = "sha256:7519f186c63c50f2d364457b236f051338d194bcface55e318a6a705c5213477", size = 26874, upload-time = "2024-04-24T17:22:34.089Z" }, +] + +[[package]] +name = "social-auth-core" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "defusedxml" }, + { name = "oauthlib" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "python3-openid" }, + { name = "requests" }, + { name = "requests-oauthlib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/b7/f2878b7ce6a5195aa2f14eef8337f2734940b11d68e14a36308770b633d7/social_auth_core-5.0.2.tar.gz", hash = "sha256:f53930c9b2a86ee0fc8e8fb0eac79221cfc2f017d9efb578691e5a3e2cf36784", size = 260859, upload-time = "2026-06-26T07:25:19.522Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/04/7530b56a1eaa33bac6595739b19e4ebe3fe9d35a5c5f188790de9d3c26de/social_auth_core-5.0.2-py3-none-any.whl", hash = "sha256:c7250f0c1d539bb1420a7d165b240f066d866ec19d9b829e660260f024f0e2d3", size = 459405, upload-time = "2026-06-26T07:25:18.009Z" }, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" }, +] + +[[package]] +name = "sphinx" +version = "8.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals-py" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, +] + +[[package]] +name = "sphinx-book-theme" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydata-sphinx-theme" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/f7/154786f3cfb7692cd7acc24b6dfe4dcd1146b66f376b17df9e47125555e9/sphinx_book_theme-1.2.0.tar.gz", hash = "sha256:4a7ebfc7da4395309ac942ddfc38fbec5c5254c3be22195e99ad12586fbda9e3", size = 443962, upload-time = "2026-03-09T23:20:30.442Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/bf/6f506a37c7f8ecc4576caf9486e303c7af249f6d70447bb51dde9d78cb99/sphinx_book_theme-1.2.0-py3-none-any.whl", hash = "sha256:709605d308e1991c5ef0cf19c481dbe9084b62852e317fafab74382a0ee7ccfa", size = 455936, upload-time = "2026-03-09T23:20:28.788Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, +] + +[[package]] +name = "sphinxcontrib-mermaid" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "pyyaml", version = "6.0.3", source = { registry = "https://pypi.org/simple" } }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/9d/bf3a48a657682c7e0445c71d916bca7ab8194454276cc22b16e7f974e502/sphinxcontrib_mermaid-2.1.0.tar.gz", hash = "sha256:13c5f9ac395cb6abf403eca34e228dc9fb3a30c9d960dbf3e40e9a8cef969549", size = 21695, upload-time = "2026-07-18T23:08:11.265Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/bd/d3348d62296e73a91420f0edf671450c9003ecd8704da40b1e3d9b868459/sphinxcontrib_mermaid-2.1.0-py3-none-any.whl", hash = "sha256:417cd144ec4b28852f46ba653f02ce8e538881c812111671a4c30344e87f2112", size = 16190, upload-time = "2026-07-18T23:08:10.098Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, +] + +[[package]] +name = "sqlparse" +version = "0.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" }, +] + +[[package]] +name = "stevedore" +version = "5.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/dd/04d56c2a5232358df41f3d0f0e31833d378b6c8ed7803a6b1b7867b0eba6/stevedore-5.9.0.tar.gz", hash = "sha256:abbd0af7a38a8bbb1d6adea2e35b17609cf004eaac323e88a8d8963640dd2b3c", size = 514850, upload-time = "2026-07-02T11:38:08.509Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/8d/008761f6e1000600e5303db30d05724bdcf3d2d186cbb59fac79b52e39ed/stevedore-5.9.0-py3-none-any.whl", hash = "sha256:e520945d4c257700eddc1eb1d79df04b2ea578eef185e0e3fa5b442fc848d3f7", size = 54463, upload-time = "2026-07-02T11:38:07.43Z" }, +] + +[[package]] +name = "sure" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mock" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/ae/eb28ee3b6768e51cb938abcf521cb678217203f33385a2df54d3f23331c5/sure-2.0.1.tar.gz", hash = "sha256:c8fc6fabc0e7f6984eeabb942540e45646e5bef0bb99fe59e02da634e4d4b9ca", size = 48467, upload-time = "2023-02-06T11:58:48.043Z" } + +[[package]] +name = "tempora" +version = "5.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaraco-collections" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "more-itertools" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/e8/20e489ba55092e0d737dc54a5c43424a7762d38f59efce54ed86f4fc51bc/tempora-5.9.0.tar.gz", hash = "sha256:66e6ddee320c38f4b253a7d8039337424c699916451b9271e0ccce770a4e8f62", size = 24490, upload-time = "2026-05-06T00:07:18.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/5e/9326e8ec4418ea59c6c290f4f3209d61f790f0737bfc5afcb588cad3fd9f/tempora-5.9.0-py3-none-any.whl", hash = "sha256:5aa96ab2b8a2be795bd4c78a4299c0196365a91976972f8852b19e1d363ccd29", size = 15394, upload-time = "2026-05-06T00:07:17.302Z" }, +] + +[[package]] +name = "testfixtures" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/e1/c286b05197f4171935ddc24d7c4b88fe23a9d7e17212a71020398f362042/testfixtures-12.2.0.tar.gz", hash = "sha256:3d20c1834b1308ce2ecbd3d7eafe3c970315163df0f1f491dbf66a6150af6c85", size = 189430, upload-time = "2026-06-20T09:55:14.485Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/0c/5da2a2524deedcd1ea55878d9e1b2a9631b688e8f647c618451631d3a86c/testfixtures-12.2.0-py3-none-any.whl", hash = "sha256:d86f5bb7903871a14394f38f8e05b23058eb402f2d62c536f94423542255434f", size = 65915, upload-time = "2026-06-20T09:55:13.046Z" }, +] + +[[package]] +name = "testtools" +version = "2.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/80/af955640b4e8348aaa8026f9f48304811ec3342d9928ddb611d38a190ea0/testtools-2.9.1.tar.gz", hash = "sha256:39ad9eb9e1b935d6838f4b3aee4d6e72db65df5602f6feda998dbb4fe8de0b19", size = 221377, upload-time = "2026-04-24T09:42:51.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/5f/80ea589bc04651ea10c0f53da06cb0ac33b616b0ec78bf7dc8d8fd642f5d/testtools-2.9.1-py3-none-any.whl", hash = "sha256:faf2d689b3614d87459f7f715fc8349a3f77a252486b104d0cfe635b44326895", size = 110306, upload-time = "2026-04-24T09:42:50.102Z" }, +] + +[[package]] +name = "text-unidecode" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" }, +] + +[[package]] +name = "tincan" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aniso8601" }, + { name = "pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/00/0b1fb81a390f976ff5ebc68ddeb60cede36be4c28c1b0ffcb5f5f4ec0212/tincan-1.0.0.tar.gz", hash = "sha256:d3d46247d9540acf4f6836705d6a1d1448093fbb8a87691f40f3d732b53910b4", size = 28450, upload-time = "2020-09-03T14:42:00.598Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/08/19b482267863765a2cdabe0031dc0c626fcd9c65da88e8f831e473971cd6/tincan-1.0.0-py3-none-any.whl", hash = "sha256:6658d8b5f0d8830ee66487e612c53fa42fb73868367d439521a99f19646e33c9", size = 58526, upload-time = "2020-09-03T14:41:59.793Z" }, +] + +[[package]] +name = "tomli-w" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" }, +] + +[[package]] +name = "tomlkit" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/db/03eaf4331631ef6b27d6e3c9b68c54dc6f0d63d87201fed600cc409307fd/tomlkit-0.15.0.tar.gz", hash = "sha256:7d1a9ecba3086638211b13814ea79c90dd54dd11993564376f3aa92271f5c7a3", size = 161875, upload-time = "2026-05-10T07:38:22.245Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/43/8bd850ee71a191bf072e31302c73a66be413fecdd98fdcd111ecbcce13ca/tomlkit-0.15.0-py3-none-any.whl", hash = "sha256:4dbc8f0fc024412b57ced8757ac7461305126a648ff8c2c807fcb8e133a78738", size = 41328, upload-time = "2026-05-10T07:38:23.517Z" }, +] + +[[package]] +name = "tox" +version = "4.56.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "colorama" }, + { name = "filelock" }, + { name = "packaging" }, + { name = "platformdirs" }, + { name = "pluggy" }, + { name = "pyproject-api" }, + { name = "python-discovery" }, + { name = "tomli-w" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/fc/903385f783a1d7b7670eb742654e8f6f109c7a5a65913f92dfee8d033ea7/tox-4.56.4.tar.gz", hash = "sha256:d49e371119ebfafb15054ad7ccff3d03027ccb65195fae3ac656b431b5524055", size = 286611, upload-time = "2026-07-08T23:59:07.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/f2/d2e2b6969203c319165860ba93272cf12c71d42acff5acd2c84d7543b460/tox-4.56.4-py3-none-any.whl", hash = "sha256:53bac88382b9638a5ce40fbaddd6076e1c8f638751af7bf8e759392c953df2f0", size = 217458, upload-time = "2026-07-08T23:59:05.21Z" }, +] + +[[package]] +name = "tox-uv" +version = "1.35.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tox-uv-bare" }, + { name = "uv" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/dc/6e9994c799bdbb309f829dd6b8d98764dd0757302f3433c380438a3a127b/tox_uv-1.35.2-py3-none-any.whl", hash = "sha256:2d99b0e3c782ba49e7cbe521c8d344758595961b17a3633738d67096641c1bde", size = 6565, upload-time = "2026-05-05T01:34:16.07Z" }, +] + +[[package]] +name = "tox-uv-bare" +version = "1.35.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "tox" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/cb/168dc1ccf24e4065a9a0a33df55709ed2b5eb73bd2b13ddd53187e5dffb8/tox_uv_bare-1.35.2.tar.gz", hash = "sha256:49e28a804c97f23ea17e25859960c0fa78f35bccb7e14344cfd840e89a9aade9", size = 32333, upload-time = "2026-05-05T01:34:18.916Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/53/4a33dc81da39db7b31e5622333df361e8fe055b7ec636bd5fea762c9182d/tox_uv_bare-1.35.2-py3-none-any.whl", hash = "sha256:c0d590a41d1054a1ad0874e9e5943ff52402786e3d4599d8f8d37a65b566ef53", size = 22307, upload-time = "2026-05-05T01:34:17.681Z" }, +] + +[[package]] +name = "trio" +version = "0.33.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "cffi", marker = "implementation_name != 'pypy' and os_name == 'nt'" }, + { name = "idna" }, + { name = "outcome" }, + { name = "sniffio" }, + { name = "sortedcontainers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/b6/c744031c6f89b18b3f5f4f7338603ab381d740a7f45938c4607b2302481f/trio-0.33.0.tar.gz", hash = "sha256:a29b92b73f09d4b48ed249acd91073281a7f1063f09caba5dc70465b5c7aa970", size = 605109, upload-time = "2026-02-14T18:40:55.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/93/dab25dc87ac48da0fe0f6419e07d0bfd98799bed4e05e7b9e0f85a1a4b4b/trio-0.33.0-py3-none-any.whl", hash = "sha256:3bd5d87f781d9b0192d592aef28691f8951d6c2e41b7e1da4c25cde6c180ae9b", size = 510294, upload-time = "2026-02-14T18:40:53.313Z" }, +] + +[[package]] +name = "trio-websocket" +version = "0.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "outcome" }, + { name = "trio" }, + { name = "wsproto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/3c/8b4358e81f2f2cfe71b66a267f023a91db20a817b9425dd964873796980a/trio_websocket-0.12.2.tar.gz", hash = "sha256:22c72c436f3d1e264d0910a3951934798dcc5b00ae56fc4ee079d46c7cf20fae", size = 33549, upload-time = "2025-02-25T05:16:58.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/19/eb640a397bba49ba49ef9dbe2e7e5c04202ba045b6ce2ec36e9cadc51e04/trio_websocket-0.12.2-py3-none-any.whl", hash = "sha256:df605665f1db533f4a386c94525870851096a223adcb97f72a07e8b4beba45b6", size = 21221, upload-time = "2025-02-25T05:16:57.545Z" }, +] + +[[package]] +name = "twine" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "id" }, + { name = "keyring", marker = "platform_machine != 'ppc64le' and platform_machine != 's390x'" }, + { name = "packaging" }, + { name = "readme-renderer" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "rfc3986" }, + { name = "rich" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/a8/949edebe3a82774c1ec34f637f5dd82d1cf22c25e963b7d63771083bbee5/twine-6.2.0.tar.gz", hash = "sha256:e5ed0d2fd70c9959770dce51c8f39c8945c574e18173a7b81802dab51b4b75cf", size = 172262, upload-time = "2025-09-04T15:43:17.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl", hash = "sha256:418ebf08ccda9a8caaebe414433b0ba5e25eb5e4a927667122fbe8f829f985d8", size = 42727, upload-time = "2025-09-04T15:43:15.994Z" }, +] + +[[package]] +name = "typer" +version = "0.26.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/f7/68adc395201b20b872d68e975386832e8005ffeacedd43a1d837a32815be/typer-0.26.8.tar.gz", hash = "sha256:c244a6bd558886fe3f8780efb6bdd28bb9aff005a94eedebaa5cb32926fe2f7e", size = 202097, upload-time = "2026-06-26T09:22:45.705Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/87/b9fd69c92c6102a066e1b86a35243f53e70bd4c709f2a26d9f4fee4f4dc0/typer-0.26.8-py3-none-any.whl", hash = "sha256:3512ca79ac5c11113414b36e80281b872884477722440691c89d1112e321a49c", size = 122564, upload-time = "2026-06-26T09:22:44.72Z" }, +] + +[[package]] +name = "typer-slim" +version = "0.24.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/a7/e6aecc4b4eb59598829a3b5076a93aff291b4fdaa2ded25efc4e1f4d219c/typer_slim-0.24.0.tar.gz", hash = "sha256:f0ed36127183f52ae6ced2ecb2521789995992c521a46083bfcdbb652d22ad34", size = 4776, upload-time = "2026-02-16T22:08:51.2Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/24/5480c20380dfd18cf33d14784096dca45a24eae6102e91d49a718d3b6855/typer_slim-0.24.0-py3-none-any.whl", hash = "sha256:d5d7ee1ee2834d5020c7c616ed5e0d0f29b9a4b1dd283bdebae198ec09778d0e", size = 3394, upload-time = "2026-02-16T22:08:49.92Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, +] + +[[package]] +name = "tzlocal" +version = "5.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32' or (extra == 'group-14-edx-enterprise-dev' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-doc' and extra == 'group-14-edx-enterprise-js-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test') or (extra == 'group-14-edx-enterprise-js-test' and extra == 'group-14-edx-enterprise-test-master')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/5b/879b2f932adfa7a053c360d50bc896c977fa6426109185f7c12ebdd0cb9d/tzlocal-5.4.4.tar.gz", hash = "sha256:8dbb8660838688a7b6ba4fed31d18dedf842afb4d47ca050d6d891c2c15f3be4", size = 31170, upload-time = "2026-06-29T08:03:40.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl", hash = "sha256:aae09f0126a8a86fa736be266eb4a471380d26a0de3bc14844e7821fee3e2a15", size = 18115, upload-time = "2026-06-29T08:03:38.666Z" }, +] + +[[package]] +name = "unicodecsv" +version = "0.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc", size = 10267, upload-time = "2015-09-22T22:00:19.516Z" } + +[[package]] +name = "uritemplate" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload-time = "2025-06-02T15:12:06.318Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload-time = "2025-06-02T15:12:03.405Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[package.optional-dependencies] +socks = [ + { name = "pysocks" }, +] + +[[package]] +name = "uv" +version = "0.11.28" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/a2/bfd6755b40682ef7e775ddb9d52823dea6551352f4244106da4bad37cd3c/uv-0.11.28.tar.gz", hash = "sha256:df86cfd135542a833e9f84708b3b8dbaa987a3b9db85b267062db49ab639d242", size = 5985690, upload-time = "2026-07-07T23:12:47.095Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/5d/507b829e79353fe3dcb2779cde8f64497d9c99f9b08b18b8f55ee3bf1786/uv-0.11.28-py3-none-linux_armv6l.whl", hash = "sha256:ae5bbdb6150adcd625f5fa720b04abf2014247d878d1035f19751bb0e7274543", size = 25893158, upload-time = "2026-07-07T23:11:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/10/54/50c85a663ce723e061523ab4ac8b01b650077584e80950f9c93fd073979f/uv-0.11.28-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:bb11d94cb848ff58af79e0bb5e4037cd324d27dbe2dabb7746db698b724a9a20", size = 25041511, upload-time = "2026-07-07T23:11:58.885Z" }, + { url = "https://files.pythonhosted.org/packages/32/e1/49968cab72f16a7d6c45d095d319f9efbe8ce05f3f15c5f7104493694289/uv-0.11.28-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e9eb317b1cdb249887df77ac232d8a9448f26858b2399f9f2949c6a7b9bedf88", size = 23570471, upload-time = "2026-07-07T23:12:01.832Z" }, + { url = "https://files.pythonhosted.org/packages/b8/4d/c9fe448dcd5cf65a5f054517aa42551b7f0920710a6891d98af321a06b22/uv-0.11.28-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:041e4b80bebc58d7142ac9394370cacd73185fd8d066d6675d14707d83408f6d", size = 25594677, upload-time = "2026-07-07T23:12:04.597Z" }, + { url = "https://files.pythonhosted.org/packages/07/aa/4c0c71075ba66cc594f856cbd98844058fcb53cb4dd8a6fccda8419562bb/uv-0.11.28-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:185416a5316df8c5442b47178349f1f27fc1034468670ac1fb499eae3b25bd68", size = 25427944, upload-time = "2026-07-07T23:12:07.226Z" }, + { url = "https://files.pythonhosted.org/packages/6c/77/50fef66f4e26bf771429e1d88f849476d8ed21f0fb0708acaa53dc5772a5/uv-0.11.28-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a4a9fe246cb2882532277f5d5e5bd8a59462981462a2f98426f35ecfca82460e", size = 25448458, upload-time = "2026-07-07T23:12:10.894Z" }, + { url = "https://files.pythonhosted.org/packages/d0/93/720f45af65ebda460166dc64f3318acd65f7bd3a8e326fbd21810fd920ee/uv-0.11.28-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f7ce6f6015a3e857bc6a663514afa62856b669ee5c1bd120e4c58ac2ef5513d", size = 26917218, upload-time = "2026-07-07T23:12:13.802Z" }, + { url = "https://files.pythonhosted.org/packages/cd/27/a9b68a15a5fe8db7103bea514c2adb79e9b1114fc8dc96fb39dbd7a5b898/uv-0.11.28-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b3d0ea11e83b373a2166b82dd0864f5677fbadf98db64541ab2e59c42968905", size = 27771542, upload-time = "2026-07-07T23:12:16.519Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fd/208607a7f5f86188775387fe0839ef97cf8d013e8d0e909140b7fdb7d0d1/uv-0.11.28-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c60294e3be4fa203a04015fc02ac8a31d936e86fde06dcb43c7f8f22661dfff", size = 26972190, upload-time = "2026-07-07T23:12:19.191Z" }, + { url = "https://files.pythonhosted.org/packages/75/2e/62273ee6c9fbebccd8248c153b44870f81ebf5267c31edf4c095d78537fb/uv-0.11.28-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fe42df9f42056037473f3876adec1615709b57d3470ed39178ff420f3afb9f", size = 27127688, upload-time = "2026-07-07T23:12:22.43Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8c/b15212904e6f0aa4a3709dc86838c6fa070fe97c7e96b3f10174a26b16e3/uv-0.11.28-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:fab3c31007a611866475824a666f5a721bf0c9335db806355a97fcfba2a6bbb7", size = 25715221, upload-time = "2026-07-07T23:12:25.144Z" }, + { url = "https://files.pythonhosted.org/packages/64/35/b83b7c599474aaf1277c2224c09679640c2320562155c4b6ece1c6f014c1/uv-0.11.28-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:2e91eb8a0b00d5f4427195fc818bcaa4d8bb4fccb79f4e973e74802419ab06ca", size = 26392793, upload-time = "2026-07-07T23:12:27.848Z" }, + { url = "https://files.pythonhosted.org/packages/81/49/8093318206dee51b5cfcabbf110892ff63cfd897a5df002e2d8b61350fe6/uv-0.11.28-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:47e3f12fe6f5c80a01639d8df36efde7bdddfc3bbc52250df623547d8d393105", size = 26522809, upload-time = "2026-07-07T23:12:30.757Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c5/b26d82e9297c29c201f61698ee56bba956f94953b23089532d026a97d93f/uv-0.11.28-py3-none-musllinux_1_1_i686.whl", hash = "sha256:d01c7c665511c047f350e587b8b6557c96b61b2eddafbcd8964f0cc2f5b9afbe", size = 26156793, upload-time = "2026-07-07T23:12:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c2/163e89424668d6c01499efbe85a854ad38f07834bde3f2b16df159eab1d5/uv-0.11.28-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:3fcfda468448093f4d5961ca8c068b0aeec2d02f7226d58ee8513321a929fe4f", size = 27327614, upload-time = "2026-07-07T23:12:36.252Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c9/db4cb824777d013272ccfa77db07a4d12bf1584899458c1917a4b5a4069d/uv-0.11.28-py3-none-win32.whl", hash = "sha256:692edef9cf1d2dd69bb9d9fc01f281a82610547900ce227a3cb269cdf988b5ce", size = 24665179, upload-time = "2026-07-07T23:12:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/40/bc/d67b18cddd54c503c7bad2b189a47fd7a1d07ea10b9212624f892b985498/uv-0.11.28-py3-none-win_amd64.whl", hash = "sha256:f4fcf2c8d9f1444b900e6b8dbbb828825fb76eca01acd18aeaa5c90240408cda", size = 27603677, upload-time = "2026-07-07T23:12:41.985Z" }, + { url = "https://files.pythonhosted.org/packages/57/94/dc31a771eac989973219c730552dbcf5bf7ea6652dba4ba89b1bbdc75a80/uv-0.11.28-py3-none-win_arm64.whl", hash = "sha256:e94560995737c50525d586da553521fbafe9ef06641e7d885db4b270f53ee84d", size = 25839294, upload-time = "2026-07-07T23:12:44.893Z" }, +] + +[[package]] +name = "vine" +version = "5.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/e4/d07b5f29d283596b9727dd5275ccbceb63c44a1a82aa9e4bfd20426762ac/vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0", size = 48980, upload-time = "2023-11-05T08:46:53.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/ff/7c0c86c43b3cbb927e0ccc0255cb4057ceba4799cd44ae95174ce8e8b5b2/vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc", size = 9636, upload-time = "2023-11-05T08:46:51.205Z" }, +] + +[[package]] +name = "virtualenv" +version = "21.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "python-discovery" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/65/ec1d92091671e6407d3e7c1f5801413bb7b2b57630a50cae7750456ba0ed/virtualenv-21.6.0.tar.gz", hash = "sha256:e18a4d750f2b64dea73e72ffde3922f3c52365fabdc8157ebd3da20d031c4734", size = 5526111, upload-time = "2026-07-06T22:49:56.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/e7/2fbd0cc1653c53eed8f10670538bb547de2b3e37aacad283faa82a71094b/virtualenv-21.6.0-py3-none-any.whl", hash = "sha256:bce9d097950fef9d81129b333babfb7767072850c2f1acce0ec536708401bfd1", size = 5506216, upload-time = "2026-07-06T22:49:54.941Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + +[[package]] +name = "werkzeug" +version = "3.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" }, +] + +[[package]] +name = "wheel" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c456652c7780e4d749b929eb605c098ce3a5b6b6bc081/wheel-0.47.0.tar.gz", hash = "sha256:cc72bd1009ba0cf63922e28f94d9d83b920aa2bb28f798a31d0691b02fa3c9b3", size = 63854, upload-time = "2026-04-22T15:51:27.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, +] + +[[package]] +name = "wsproto" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/79/12135bdf8b9c9367b8701c2c19a14c913c120b882d50b014ca0d38083c2c/wsproto-1.3.2.tar.gz", hash = "sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294", size = 50116, upload-time = "2025-11-20T18:18:01.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl", hash = "sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584", size = 24405, upload-time = "2025-11-20T18:18:00.454Z" }, +] + +[[package]] +name = "xmlsec" +version = "1.3.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/5b/244459b51dfe91211c1d9ec68fb5307dfc51e014698f52de575d25f753e0/xmlsec-1.3.14.tar.gz", hash = "sha256:934f804f2f895bcdb86f1eaee236b661013560ee69ec108d29cdd6e5f292a2d9", size = 68854, upload-time = "2024-04-17T19:34:29.388Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/66/cb02e33c72fe7279016d60802e1e1b6b007a8b056ca34b990fca30356921/xmlsec-1.3.14-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1eb3dcf244a52f796377112d8f238dbb522eb87facffb498425dc8582a84a6bf", size = 3299742, upload-time = "2024-04-18T16:25:57.12Z" }, + { url = "https://files.pythonhosted.org/packages/60/f2/a7489f3bd3bb7c2bbebe100a72e9e10cb645aac5ef160a7ed01e9b7817aa/xmlsec-1.3.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:330147ce59fbe56a9be5b2085d739c55a569f112576b3f1b33681f87416eaf33", size = 3675677, upload-time = "2024-04-18T16:25:58.939Z" }, + { url = "https://files.pythonhosted.org/packages/15/1a/4703acc7dea24146db06cd4f93c4e9d6a148ff10f5b21a7eddca36fc4da4/xmlsec-1.3.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed4034939d8566ccdcd3b4e4f23c63fd807fb8763ae5668d59a19e11640a8242", size = 4201542, upload-time = "2024-04-18T16:26:01.101Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b6/1e5ee93e0150721d4c832860c321f0edc3ed753f4a0f376f48cce41bf697/xmlsec-1.3.14-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a98eadfcb0c3b23ccceb7a2f245811f8d784bd287640dcfe696a26b9db1e2fc0", size = 3616672, upload-time = "2024-04-18T16:26:03.585Z" }, + { url = "https://files.pythonhosted.org/packages/6e/43/e83346261f25ee1f9eb0b6719bb77d19dff194333a02c0747dd1d360d520/xmlsec-1.3.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86ff7b2711557c1087b72b0a1a88d82eafbf2a6d38b97309a6f7101d4a7041c3", size = 3921961, upload-time = "2024-04-18T16:26:06.09Z" }, + { url = "https://files.pythonhosted.org/packages/d9/d2/228f5e7edf8cf2affb76c22cd77a1adf423a8ce1b73c727a32d6939dcb18/xmlsec-1.3.14-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:774d5d1e45f07f953c1cc14fd055c1063f0725f7248b6b0e681f59fd8638934d", size = 4263947, upload-time = "2024-04-18T16:26:08.171Z" }, + { url = "https://files.pythonhosted.org/packages/dc/d5/393ab85efbf633ea0d10e21a8dbb0a83d5b6ba66a16ce1fb987b90262335/xmlsec-1.3.14-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bd10ca3201f164482775a7ce61bf7ee9aade2e7d032046044dd0f6f52c91d79d", size = 4010992, upload-time = "2024-04-18T16:26:10.347Z" }, + { url = "https://files.pythonhosted.org/packages/d1/70/d74de2e26fb9c92220411d44aa179826d525491c033e3828650ad3fafaaf/xmlsec-1.3.14-cp312-cp312-win32.whl", hash = "sha256:19c86bab1498e4c2e56d8e2c878f461ccb6e56b67fd7522b0c8fda46d8910781", size = 2146077, upload-time = "2024-04-17T19:34:08.94Z" }, + { url = "https://files.pythonhosted.org/packages/e3/3f/75e69fa9d2084524ca4e796442d8058a78d78c64c1e8229d552c031a23b4/xmlsec-1.3.14-cp312-cp312-win_amd64.whl", hash = "sha256:d0762f4232bce2c7f6c0af329db8b821b4460bbe123a2528fb5677d03db7a4b5", size = 2441942, upload-time = "2024-04-17T19:34:10.416Z" }, +] + +[[package]] +name = "zc-lockfile" +version = "4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/9a/2fef89272d98b799e4daa50201c5582ec76bdd4e92a1a7e3deb74c52b7fa/zc_lockfile-4.0.tar.gz", hash = "sha256:d3ab0f53974296a806db3219b9191ba0e6d5cbbd1daa2e0d17208cb9b29d2102", size = 10956, upload-time = "2025-09-18T07:32:34.412Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/7f/3a614b65bc4b181578b1d50a78663ee02d5d2d3b859712f3d3597c8afe6f/zc_lockfile-4.0-py3-none-any.whl", hash = "sha256:aa3aa295257bebaa09ea9ad5cb288bf9f98f88de6932f96b6659f62715d83581", size = 9143, upload-time = "2025-09-18T07:32:33.517Z" }, +] diff --git a/webpack.config.js b/webpack.config.js index ef371891a3..d603adb499 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,6 +1,6 @@ const path = require('path'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); -const context = path.join(__dirname, 'enterprise/static/enterprise'); +const context = path.join(__dirname, 'src/enterprise/static/enterprise'); module.exports = { context: context,