From 199dc30137c475c14dd05cafc5a20def263e4540 Mon Sep 17 00:00:00 2001 From: salmannawaz Date: Thu, 17 Sep 2026 16:16:01 +0500 Subject: [PATCH 1/7] build: modernize Python tooling (uv, pyproject.toml, src layout, semantic-release) - Migrate to src layout (src/openassessment/) - Adopt uv for dependency management with pyproject.toml - Add tox environments: docs, quality; update js env to django42 - Integrate python-semantic-release for automated versioning - Update release workflow with immutable releases strategy and bumped action versions - Fix i18n_tool, webpack, and eslint paths for src layout - Update author to Open edX Project convention - Add docs tox env with doc8, build, and twine checks - Switch coverage to source_pkgs; add pragma: no cover to __version__ Co-Authored-By: Claude Sonnet 4.6 --- .coveragerc | 8 - .github/workflows/ci.yml | 31 +- .github/workflows/pypi-publish.yml | 30 - .github/workflows/release.yml | 121 + .readthedocs.yaml | 7 +- MANIFEST.in | 27 +- Makefile | 85 +- karma.conf.js | 25 +- openassessment/__init__.py | 5 - package.json | 4 +- pyproject.toml | 214 ++ require-config.js | 9 + requirements/base.in | 32 - requirements/base.txt | 214 -- requirements/ci.in | 5 - requirements/ci.txt | 90 - requirements/common_constraints.txt | 21 - requirements/constraints.txt | 13 - requirements/docs.in | 8 - requirements/docs.txt | 109 - requirements/pip-tools.in | 7 - requirements/pip-tools.txt | 26 - requirements/pip.in | 6 - requirements/pip.txt | 16 - requirements/quality.in | 8 - requirements/quality.txt | 563 --- requirements/test-acceptance.in | 8 - requirements/test-acceptance.txt | 522 --- requirements/test.in | 19 - requirements/test.txt | 451 --- requirements/tox.in | 3 - requirements/tox.txt | 40 - scripts/render-templates.sh | 2 +- scripts/run-pycodestyle.sh | 2 +- scripts/run-pylint.sh | 2 +- setup.cfg | 9 - setup.py | 83 - src/openassessment/__init__.py | 6 + .../openassessment}/assessment/__init__.py | 0 .../openassessment}/assessment/admin.py | 0 .../assessment/api/__init__.py | 0 .../openassessment}/assessment/api/peer.py | 0 .../openassessment}/assessment/api/self.py | 0 .../openassessment}/assessment/api/staff.py | 0 .../assessment/api/student_training.py | 0 .../openassessment}/assessment/api/teams.py | 0 .../assessment/data_conversion.py | 0 .../assessment/errors/__init__.py | 0 .../openassessment}/assessment/errors/base.py | 0 .../openassessment}/assessment/errors/peer.py | 0 .../openassessment}/assessment/errors/self.py | 0 .../assessment/errors/staff.py | 0 .../assessment/errors/student_training.py | 0 .../assessment/migrations/0001_initial.py | 0 .../migrations/0002_staffworkflow.py | 0 .../migrations/0003_expand_course_id.py | 0 ...oricalsharedfileupload_sharedfileupload.py | 0 .../0005_add_filename_to_sharedupload.py | 0 .../migrations/0006_TeamWorkflows.py | 0 .../migrations/0007_staff_workflow_blank.py | 0 ...lter_historicalsharedfileupload_options.py | 0 ...th_peer_staff_studenttraining_workflows.py | 0 .../assessment/migrations/__init__.py | 0 .../assessment/models/__init__.py | 0 .../openassessment}/assessment/models/base.py | 0 .../openassessment}/assessment/models/peer.py | 0 .../assessment/models/staff.py | 0 .../assessment/models/student_training.py | 0 .../assessment/models/training.py | 0 .../assessment/score_type_constants.py | 0 .../assessment/serializers/__init__.py | 0 .../assessment/serializers/base.py | 0 .../assessment/serializers/peer.py | 0 .../assessment/serializers/training.py | 0 .../openassessment}/assessment/signals.py | 0 .../assessment/templates/evaluations.html | 0 .../assessment/test/__init__.py | 0 .../assessment/test/constants.py | 0 .../data/models_check_criteria_assessed.json | 0 .../test/data/rubric/empty_criteria.json | 0 .../test/data/rubric/empty_options.json | 0 .../test/data/rubric/missing_criteria.json | 0 .../test/data/rubric/missing_options.json | 0 .../test/data/rubric/no_points.json | 0 .../test/data/rubric/project_plan_rubric.json | 0 .../test/data/valid_assessments.json | 0 .../test/data/validate_training_examples.json | 0 .../assessment/test/test_assessment_models.py | 0 .../assessment/test/test_peer.py | 0 .../assessment/test/test_rubric.py | 0 .../assessment/test/test_self.py | 0 .../assessment/test/test_serializers.py | 0 .../assessment/test/test_staff.py | 0 .../test/test_student_training_api.py | 0 .../test/test_student_training_models.py | 0 .../assessment/test/test_team.py | 0 .../assessment/test/test_training.py | 0 .../openassessment}/assessment/urls.py | 0 .../openassessment}/assessment/views.py | 0 .../conf/locale/ar/LC_MESSAGES/django.mo | Bin .../conf/locale/ar/LC_MESSAGES/django.po | 0 .../conf/locale/ar/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/ar/LC_MESSAGES/djangojs.po | 0 .../conf/locale/ar_SA/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/ar_SA/LC_MESSAGES/djangojs.po | 0 .../openassessment}/conf/locale/config.yaml | 0 .../conf/locale/cs/LC_MESSAGES/django.mo | Bin .../conf/locale/cs/LC_MESSAGES/django.po | 0 .../conf/locale/cs/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/cs/LC_MESSAGES/djangojs.po | 0 .../conf/locale/da/LC_MESSAGES/django.mo | Bin .../conf/locale/da/LC_MESSAGES/django.po | 0 .../conf/locale/da/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/da/LC_MESSAGES/djangojs.po | 0 .../conf/locale/de_DE/LC_MESSAGES/django.mo | Bin .../conf/locale/de_DE/LC_MESSAGES/django.po | 0 .../conf/locale/de_DE/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/de_DE/LC_MESSAGES/djangojs.po | 0 .../conf/locale/el/LC_MESSAGES/django.mo | Bin .../conf/locale/el/LC_MESSAGES/django.po | 0 .../conf/locale/el/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/el/LC_MESSAGES/djangojs.po | 0 .../conf/locale/en/LC_MESSAGES/django.mo | Bin .../conf/locale/en/LC_MESSAGES/django.po | 0 .../conf/locale/en/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/en/LC_MESSAGES/djangojs.po | 0 .../conf/locale/eo/LC_MESSAGES/django.mo | Bin .../conf/locale/eo/LC_MESSAGES/django.po | 0 .../conf/locale/eo/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/eo/LC_MESSAGES/djangojs.po | 0 .../conf/locale/es_419/LC_MESSAGES/django.mo | Bin .../conf/locale/es_419/LC_MESSAGES/django.po | 0 .../locale/es_419/LC_MESSAGES/djangojs.mo | Bin .../locale/es_419/LC_MESSAGES/djangojs.po | 0 .../conf/locale/es_AR/LC_MESSAGES/django.mo | Bin .../conf/locale/es_AR/LC_MESSAGES/django.po | 0 .../conf/locale/es_AR/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/es_AR/LC_MESSAGES/djangojs.po | 0 .../conf/locale/es_ES/LC_MESSAGES/django.mo | Bin .../conf/locale/es_ES/LC_MESSAGES/django.po | 0 .../conf/locale/es_ES/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/es_ES/LC_MESSAGES/djangojs.po | 0 .../conf/locale/eu_ES/LC_MESSAGES/django.mo | Bin .../conf/locale/eu_ES/LC_MESSAGES/django.po | 0 .../conf/locale/eu_ES/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/eu_ES/LC_MESSAGES/djangojs.po | 0 .../conf/locale/fa_IR/LC_MESSAGES/django.mo | Bin .../conf/locale/fa_IR/LC_MESSAGES/django.po | 0 .../conf/locale/fa_IR/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/fa_IR/LC_MESSAGES/djangojs.po | 0 .../conf/locale/fr/LC_MESSAGES/django.mo | Bin .../conf/locale/fr/LC_MESSAGES/django.po | 0 .../conf/locale/fr/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/fr/LC_MESSAGES/djangojs.po | 0 .../conf/locale/fr_CA/LC_MESSAGES/django.mo | Bin .../conf/locale/fr_CA/LC_MESSAGES/django.po | 0 .../conf/locale/fr_CA/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/fr_CA/LC_MESSAGES/djangojs.po | 0 .../conf/locale/he/LC_MESSAGES/django.mo | Bin .../conf/locale/he/LC_MESSAGES/django.po | 0 .../conf/locale/he/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/he/LC_MESSAGES/djangojs.po | 0 .../conf/locale/hi/LC_MESSAGES/django.mo | Bin .../conf/locale/hi/LC_MESSAGES/django.po | 0 .../conf/locale/hi/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/hi/LC_MESSAGES/djangojs.po | 0 .../conf/locale/id/LC_MESSAGES/django.mo | Bin .../conf/locale/id/LC_MESSAGES/django.po | 0 .../conf/locale/id/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/id/LC_MESSAGES/djangojs.po | 0 .../conf/locale/it_IT/LC_MESSAGES/django.mo | Bin .../conf/locale/it_IT/LC_MESSAGES/django.po | 0 .../conf/locale/it_IT/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/it_IT/LC_MESSAGES/djangojs.po | 0 .../conf/locale/ja_JP/LC_MESSAGES/django.mo | Bin .../conf/locale/ja_JP/LC_MESSAGES/django.po | 0 .../conf/locale/ja_JP/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/ja_JP/LC_MESSAGES/djangojs.po | 0 .../conf/locale/ka/LC_MESSAGES/django.mo | Bin .../conf/locale/ka/LC_MESSAGES/django.po | 0 .../conf/locale/ka/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/ka/LC_MESSAGES/djangojs.po | 0 .../conf/locale/lt_LT/LC_MESSAGES/django.mo | Bin .../conf/locale/lt_LT/LC_MESSAGES/django.po | 0 .../conf/locale/lt_LT/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/lt_LT/LC_MESSAGES/djangojs.po | 0 .../conf/locale/lv/LC_MESSAGES/django.mo | Bin .../conf/locale/lv/LC_MESSAGES/django.po | 0 .../conf/locale/lv/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/lv/LC_MESSAGES/djangojs.po | 0 .../openassessment}/conf/locale/messages.mo | Bin .../conf/locale/mn/LC_MESSAGES/django.mo | Bin .../conf/locale/mn/LC_MESSAGES/django.po | 0 .../conf/locale/mn/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/mn/LC_MESSAGES/djangojs.po | 0 .../conf/locale/nb/LC_MESSAGES/django.mo | Bin .../conf/locale/nb/LC_MESSAGES/django.po | 0 .../conf/locale/nb/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/nb/LC_MESSAGES/djangojs.po | 0 .../conf/locale/pl/LC_MESSAGES/django.mo | Bin .../conf/locale/pl/LC_MESSAGES/django.po | 0 .../conf/locale/pl/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/pl/LC_MESSAGES/djangojs.po | 0 .../conf/locale/pt_BR/LC_MESSAGES/django.mo | Bin .../conf/locale/pt_BR/LC_MESSAGES/django.po | 0 .../conf/locale/pt_BR/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/pt_BR/LC_MESSAGES/djangojs.po | 0 .../conf/locale/pt_PT/LC_MESSAGES/django.mo | Bin .../conf/locale/pt_PT/LC_MESSAGES/django.po | 0 .../conf/locale/pt_PT/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/pt_PT/LC_MESSAGES/djangojs.po | 0 .../conf/locale/ro/LC_MESSAGES/django.mo | Bin .../conf/locale/ro/LC_MESSAGES/django.po | 0 .../conf/locale/ro/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/ro/LC_MESSAGES/djangojs.po | 0 .../conf/locale/ru/LC_MESSAGES/django.mo | Bin .../conf/locale/ru/LC_MESSAGES/django.po | 0 .../conf/locale/ru/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/ru/LC_MESSAGES/djangojs.po | 0 .../conf/locale/sk/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/sk/LC_MESSAGES/djangojs.po | 0 .../conf/locale/sq/LC_MESSAGES/django.mo | Bin .../conf/locale/sq/LC_MESSAGES/django.po | 0 .../conf/locale/sq/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/sq/LC_MESSAGES/djangojs.po | 0 .../conf/locale/sw_KE/LC_MESSAGES/django.mo | Bin .../conf/locale/sw_KE/LC_MESSAGES/django.po | 0 .../conf/locale/sw_KE/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/sw_KE/LC_MESSAGES/djangojs.po | 0 .../conf/locale/th/LC_MESSAGES/django.mo | Bin .../conf/locale/th/LC_MESSAGES/django.po | 0 .../conf/locale/th/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/th/LC_MESSAGES/djangojs.po | 0 .../conf/locale/tr_TR/LC_MESSAGES/django.mo | Bin .../conf/locale/tr_TR/LC_MESSAGES/django.po | 0 .../conf/locale/tr_TR/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/tr_TR/LC_MESSAGES/djangojs.po | 0 .../conf/locale/uk/LC_MESSAGES/django.mo | Bin .../conf/locale/uk/LC_MESSAGES/django.po | 0 .../conf/locale/uk/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/uk/LC_MESSAGES/djangojs.po | 0 .../conf/locale/vi/LC_MESSAGES/django.mo | Bin .../conf/locale/vi/LC_MESSAGES/django.po | 0 .../conf/locale/vi/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/vi/LC_MESSAGES/djangojs.po | 0 .../conf/locale/zh_CN/LC_MESSAGES/django.mo | Bin .../conf/locale/zh_CN/LC_MESSAGES/django.po | 0 .../conf/locale/zh_CN/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/zh_CN/LC_MESSAGES/djangojs.po | 0 .../conf/locale/zh_TW/LC_MESSAGES/django.mo | Bin .../conf/locale/zh_TW/LC_MESSAGES/django.po | 0 .../conf/locale/zh_TW/LC_MESSAGES/djangojs.mo | Bin .../conf/locale/zh_TW/LC_MESSAGES/djangojs.po | 0 .../openassessment}/data.py | 0 .../openassessment}/fileupload/__init__.py | 0 .../openassessment}/fileupload/api.py | 0 .../fileupload/backends/__init__.py | 0 .../fileupload/backends/base.py | 0 .../fileupload/backends/django_storage.py | 0 .../fileupload/backends/filesystem.py | 0 .../openassessment}/fileupload/backends/s3.py | 0 .../fileupload/backends/swift.py | 0 .../openassessment}/fileupload/exceptions.py | 0 .../fileupload/tests/test_api.py | 0 .../fileupload/tests/test_api_functions.py | 0 .../fileupload/tests/test_file_management.py | 0 .../openassessment}/fileupload/urls.py | 0 .../fileupload/views_django_storage.py | 0 .../fileupload/views_filesystem.py | 0 {openassessment => src/openassessment}/locale | 0 .../openassessment}/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../management/commands/collect_ora2_data.py | 0 .../commands/create_oa_submissions.py | 0 .../create_oa_submissions_from_file.py | 0 .../management/commands/loremipsum.py | 0 .../commands/update_ora_workflows.py | 0 .../management/commands/upload_oa_data.py | 0 .../management/tests/__init__.py | 0 .../tests/test_collect_ora2_data.py | 0 .../tests/test_create_oa_submissions.py | 0 .../test_create_oa_submissions_from_file.py | 0 .../tests/test_update_ora_workflows.py | 0 .../management/tests/test_upload_oa_data.py | 0 .../runtime_imports/__init__.py | 0 .../runtime_imports/classes.py | 0 .../runtime_imports/functions.py | 0 .../openassessment}/staffgrader/__init__.py | 0 .../openassessment}/staffgrader/admin.py | 0 .../staffgrader/errors/__init__.py | 0 .../staffgrader/errors/submission_lock.py | 0 .../staffgrader/migrations/0001_initial.py | 0 .../staffgrader/migrations/__init__.py | 0 .../staffgrader/models/__init__.py | 0 .../staffgrader/models/submission_lock.py | 0 .../staffgrader/serializers/__init__.py | 0 .../staffgrader/serializers/assessments.py | 0 .../serializers/submission_list.py | 0 .../serializers/submission_lock.py | 0 .../staffgrader/staff_grader_mixin.py | 0 .../staffgrader/tests/__init__.py | 0 .../staffgrader/tests/test_base.py | 0 .../staffgrader/tests/test_decorators.py | 0 .../tests/test_get_assessment_info.py | 0 .../tests/test_get_submission_info.py | 0 .../tests/test_list_staff_workflows.py | 0 .../staffgrader/tests/test_serializers.py | 0 .../tests/test_staff_grader_mixin.py | 0 .../tests/test_submission_lock_model.py | 0 .../templates/legacy/edit/oa_edit.html | 0 .../legacy/edit/oa_edit_assessment_steps.html | 0 .../edit/oa_edit_basic_settings_list.html | 0 .../legacy/edit/oa_edit_criterion.html | 0 .../edit/oa_edit_header_and_validation.html | 0 .../templates/legacy/edit/oa_edit_option.html | 0 .../legacy/edit/oa_edit_peer_assessment.html | 0 .../oa_edit_peer_assessment_schedule.html | 0 .../templates/legacy/edit/oa_edit_prompt.html | 0 .../legacy/edit/oa_edit_prompts.html | 0 .../templates/legacy/edit/oa_edit_rubric.html | 0 .../legacy/edit/oa_edit_schedule.html | 0 .../legacy/edit/oa_edit_self_assessment.html | 0 .../oa_edit_self_assessment_schedule.html | 0 .../legacy/edit/oa_edit_settings.html | 0 .../legacy/edit/oa_edit_staff_assessment.html | 0 .../legacy/edit/oa_edit_student_training.html | 0 .../legacy/edit/oa_rubric_reuse.html | 0 .../legacy/edit/oa_training_example.html | 0 .../edit/oa_training_example_criterion.html | 0 .../legacy/grade/oa_assessment_feedback.html | 0 .../legacy/grade/oa_assessment_title.html | 0 .../legacy/grade/oa_grade_cancelled.html | 0 .../legacy/grade/oa_grade_complete.html | 0 .../legacy/grade/oa_grade_incomplete.html | 0 .../legacy/grade/oa_grade_not_started.html | 0 .../legacy/grade/oa_grade_waiting.html | 0 .../legacy/icons/warning_filled.html | 0 .../oa_grade_available_responses.html | 0 .../instructor_dashboard/oa_listing.html | 0 .../oa_waiting_step_details.html | 0 ...pen-response-assessment-summary.underscore | 0 .../leaderboard/oa_leaderboard_show.html | 0 .../leaderboard/oa_leaderboard_waiting.html | 0 .../legacy/message/oa_message_cancelled.html | 0 .../legacy/message/oa_message_closed.html | 0 .../legacy/message/oa_message_complete.html | 0 .../legacy/message/oa_message_incomplete.html | 0 .../legacy/message/oa_message_no_team.html | 0 .../legacy/message/oa_message_open.html | 0 .../message/oa_message_unavailable.html | 0 .../templates/legacy/oa_base.html | 0 .../templates/legacy/oa_error.html | 0 .../templates/legacy/oa_latex_preview.html | 0 .../templates/legacy/oa_rubric.html | 0 .../legacy/oa_submission_answer.html | 0 .../legacy/oa_team_uploaded_files.html | 0 .../templates/legacy/oa_uploaded_file.html | 0 .../legacy/peer/oa_peer_assessment.html | 0 .../legacy/peer/oa_peer_cancelled.html | 0 .../templates/legacy/peer/oa_peer_closed.html | 0 .../legacy/peer/oa_peer_complete.html | 0 .../legacy/peer/oa_peer_turbo_mode.html | 0 .../peer/oa_peer_turbo_mode_waiting.html | 0 .../legacy/peer/oa_peer_unavailable.html | 0 .../legacy/peer/oa_peer_waiting.html | 0 .../legacy/response/oa_response.html | 0 .../response/oa_response_cancelled.html | 0 .../legacy/response/oa_response_closed.html | 0 .../legacy/response/oa_response_graded.html | 0 .../response/oa_response_studio_preview.html | 0 .../response/oa_response_submitted.html | 0 .../oa_response_team_already_submitted.html | 0 .../response/oa_response_unavailable.html | 0 .../legacy/self/oa_self_assessment.html | 0 .../legacy/self/oa_self_cancelled.html | 0 .../templates/legacy/self/oa_self_closed.html | 0 .../legacy/self/oa_self_complete.html | 0 .../legacy/self/oa_self_unavailable.html | 0 .../legacy/staff/oa_staff_grade.html | 0 .../legacy/staff_area/oa_staff_area.html | 0 .../staff_area/oa_staff_grade_learners.html | 0 .../oa_staff_grade_learners_assessment.html | 0 .../oa_staff_grade_learners_count.html | 0 .../oa_staff_override_assessment.html | 0 .../legacy/staff_area/oa_student_info.html | 0 .../oa_student_info_assessment_detail.html | 0 .../student_training/student_training.html | 0 .../student_training_cancelled.html | 0 .../student_training_closed.html | 0 .../student_training_complete.html | 0 .../student_training_error.html | 0 .../student_training_unavailable.html | 0 .../templates/openassessmentblock/base.html | 0 .../openassessment}/templatetags/__init__.py | 0 .../openassessment}/templatetags/oa_extras.py | 0 .../openassessment}/test_utils.py | 0 .../openassessment}/tests/__init__.py | 0 .../tests/data/db_fixtures/empty.json | 0 .../db_fixtures/feedback_on_assessment.json | 0 .../db_fixtures/feedback_only_criterion.json | 0 .../tests/data/db_fixtures/peer_assessed.json | 0 .../tests/data/db_fixtures/scored.json | 0 .../tests/data/db_fixtures/self_assessed.json | 0 .../tests/data/db_fixtures/submitted.json | 0 .../tests/data/db_fixtures/unicode.json | 0 .../tests/data/write_to_csv.json | 0 .../openassessment}/tests/factories.py | 0 .../openassessment}/tests/test_data.py | 0 .../tests/test_templatetags.py | 0 .../openassessment}/workflow/__init__.py | 0 .../openassessment}/workflow/admin.py | 0 .../openassessment}/workflow/api.py | 0 .../openassessment}/workflow/errors.py | 0 .../workflow/migrations/0001_initial.py | 0 .../0002_remove_django_extensions.py | 0 .../workflow/migrations/0003_TeamWorkflows.py | 0 .../0004_assessmentworkflowstep_skipped.py | 0 .../0005_alter_assessmentworkflow_status.py | 0 .../0006_mariadb_uuid_conversion.py | 0 .../workflow/migrations/0007_orareminder.py | 0 .../migrations/0008_orareminder_sent_count.py | 0 .../workflow/migrations/__init__.py | 0 .../openassessment}/workflow/models.py | 0 .../openassessment}/workflow/serializers.py | 0 .../openassessment}/workflow/tasks.py | 0 .../openassessment}/workflow/team_api.py | 0 .../openassessment}/workflow/test/__init__.py | 0 .../workflow/test/data/assessments.json | 0 .../workflow/test/factories.py | 0 .../openassessment}/workflow/test/test_api.py | 0 .../workflow/test/test_models.py | 0 .../workflow/test/test_signals.py | 0 .../workflow/test/test_team_api.py | 0 .../test/test_workflow_batch_update_api.py | 0 .../workflow/workflow_batch_update_api.py | 0 .../openassessment}/xblock/__init__.py | 0 .../openassessment}/xblock/apis/__init__.py | 0 .../xblock/apis/assessments/__init__.py | 0 .../xblock/apis/assessments/errors.py | 0 .../apis/assessments/peer_assessment_api.py | 0 .../apis/assessments/self_assessment_api.py | 0 .../apis/assessments/staff_assessment_api.py | 0 .../apis/assessments/student_training_api.py | 0 .../openassessment}/xblock/apis/grades_api.py | 0 .../xblock/apis/ora_config_api.py | 0 .../xblock/apis/ora_data_accessor.py | 0 .../xblock/apis/step_data_api.py | 0 .../xblock/apis/submissions/__init__.py | 0 .../xblock/apis/submissions/errors.py | 0 .../xblock/apis/submissions/file_api.py | 0 .../apis/submissions/submissions_actions.py | 0 .../apis/submissions/submissions_api.py | 0 .../xblock/apis/workflow_api.py | 0 .../openassessment}/xblock/config_mixin.py | 0 .../xblock/course_items_listing_mixin.py | 0 .../openassessment}/xblock/files_mixin.py | 0 .../openassessment}/xblock/grade_mixin.py | 0 .../xblock/leaderboard_mixin.py | 4 +- .../openassessment}/xblock/lms_mixin.py | 0 .../openassessment}/xblock/load_static.py | 0 .../openassessment}/xblock/message_mixin.py | 0 .../openassessment}/xblock/mobile.py | 0 .../xblock/openassesment_template_mixin.py | 0 .../xblock/openassessmentblock.py | 1 + .../xblock/rubric_reuse_mixin.py | 0 .../xblock/staff_area_mixin.py | 0 .../static/css/lib/backgrid/backgrid.css | 0 .../static/css/lib/backgrid/backgrid.min.css | 0 .../dist/4620b30a966533ace489dcc7afb151b9.png | Bin .../dist/95ec738c0b7faac5b5c9126794446bbd.svg | 0 .../xblock/static/dist/manifest.json | 0 ...nt-editor-textarea.cbb31e4372be87d437fb.js | 0 ...ent-editor-tinymce.ab9f042f233087bba4b8.js | 0 ...penassessment-lms.0ed216fc6ce56a916473.css | 0 ...openassessment-lms.0ed216fc6ce56a916473.js | 0 ...penassessment-ltr.0c6318822d5661f0f9ea.css | 0 ...openassessment-ltr.0c6318822d5661f0f9ea.js | 0 ...penassessment-rtl.c938e1614108d8feb891.css | 0 ...openassessment-rtl.c938e1614108d8feb891.js | 0 ...nassessment-studio.b58bb4e55f63dadac6de.js | 0 .../fonts/libs/font-awesome/FontAwesome.otf | Bin .../libs/font-awesome/fontawesome-webfont.eot | Bin .../libs/font-awesome/fontawesome-webfont.svg | 0 .../libs/font-awesome/fontawesome-webfont.ttf | Bin .../font-awesome/fontawesome-webfont.woff | Bin .../xblock/static/js/fixtures/templates.json | 0 .../xblock/static/js/lib/backgrid/backgrid.js | 0 .../static/js/lib/backgrid/backgrid.min.js | 0 .../xblock/static/js/lib/codemirror.js | 0 .../static/js/lib/jquery-ui-1.10.4.min.js | 0 .../xblock/static/js/lib/jquery.min.js | 0 .../static/js/lib/jquery.timepicker.min.js | 0 .../xblock/static/js/lib/underscore-min.js | 0 .../WaitingStepDetailsPage.spec.jsx | 0 .../lms/components/WaitingStepList.spec.jsx | 0 .../xblock/static/js/spec/lms/oa_base.js | 0 .../static/js/spec/lms/oa_datefactory.js | 0 .../static/js/spec/lms/oa_file_upload.js | 0 .../xblock/static/js/spec/lms/oa_grade.js | 0 .../xblock/static/js/spec/lms/oa_listing.js | 0 .../xblock/static/js/spec/lms/oa_peer.js | 0 .../xblock/static/js/spec/lms/oa_response.js | 0 .../static/js/spec/lms/oa_response_editor.js | 0 .../xblock/static/js/spec/lms/oa_rubric.js | 0 .../xblock/static/js/spec/lms/oa_self.js | 0 .../static/js/spec/lms/oa_staff_area.js | 0 .../xblock/static/js/spec/lms/oa_training.js | 0 .../xblock/static/js/spec/oa_server.js | 0 .../static/js/spec/studio/oa_container.js | 0 .../xblock/static/js/spec/studio/oa_edit.js | 0 .../js/spec/studio/oa_edit_assessments.js | 0 .../spec/studio/oa_edit_assessments_steps.js | 0 .../static/js/spec/studio/oa_edit_fields.js | 0 .../js/spec/studio/oa_edit_listeners.js | 0 .../static/js/spec/studio/oa_edit_notifier.js | 0 .../static/js/spec/studio/oa_edit_prompt.js | 0 .../static/js/spec/studio/oa_edit_rubric.js | 0 .../static/js/spec/studio/oa_edit_schedule.js | 0 .../static/js/spec/studio/oa_edit_settings.js | 0 .../spec/studio/oa_edit_validation_alert.js | 0 .../xblock/static/js/spec/test_shared.js | 0 .../js/src/lms/api/waiting_step_details.js | 0 .../src/lms/components/WaitingStepContent.jsx | 0 .../js/src/lms/components/WaitingStepList.jsx | 0 .../WaitingStepDetailsContainer.jsx | 0 .../js/src/lms/editors/oa_editor_textarea.js | 0 .../js/src/lms/editors/oa_editor_tinymce.js | 0 .../xblock/static/js/src/lms/oa_base.js | 0 .../js/src/lms/oa_confirmation_alert.js | 0 .../js/src/lms/oa_course_items_listing.js | 0 .../static/js/src/lms/oa_datefactory.js | 0 .../static/js/src/lms/oa_file_upload.js | 0 .../xblock/static/js/src/lms/oa_grade.js | 0 .../static/js/src/lms/oa_leaderboard.js | 0 .../xblock/static/js/src/lms/oa_message.js | 0 .../xblock/static/js/src/lms/oa_peer.js | 0 .../xblock/static/js/src/lms/oa_prompts.js | 0 .../xblock/static/js/src/lms/oa_response.js | 0 .../static/js/src/lms/oa_response_editor.js | 0 .../xblock/static/js/src/lms/oa_rubric.js | 0 .../xblock/static/js/src/lms/oa_self.js | 0 .../xblock/static/js/src/lms/oa_staff.js | 0 .../xblock/static/js/src/lms/oa_staff_area.js | 0 .../js/src/lms/oa_staff_waiting_step.jsx | 0 .../xblock/static/js/src/lms/oa_training.js | 0 .../xblock/static/js/src/lms_index.js | 0 .../xblock/static/js/src/oa_server.js | 0 .../xblock/static/js/src/oa_shared.js | 0 .../static/js/src/studio/oa_container.js | 0 .../static/js/src/studio/oa_container_item.js | 0 .../xblock/static/js/src/studio/oa_edit.js | 0 .../js/src/studio/oa_edit_assessment.js | 0 .../src/studio/oa_edit_assessments_steps.js | 0 .../static/js/src/studio/oa_edit_fields.js | 0 .../static/js/src/studio/oa_edit_listeners.js | 0 .../static/js/src/studio/oa_edit_notifier.js | 0 .../static/js/src/studio/oa_edit_prompts.js | 0 .../static/js/src/studio/oa_edit_rubric.js | 0 .../static/js/src/studio/oa_edit_schedule.js | 0 .../static/js/src/studio/oa_edit_settings.js | 0 .../js/src/studio/oa_edit_validation_alert.js | 0 .../static/js/src/studio/oa_tiny_mce.js | 0 .../xblock/static/js/src/studio_index.js | 0 .../xblock/static/sass/_openassessment.scss | 0 .../xblock/static/sass/oa/contexts/_ie.scss | 0 .../static/sass/oa/contexts/_responsive.scss | 0 .../static/sass/oa/elements/_confirm.scss | 0 .../static/sass/oa/elements/_footer.scss | 0 .../static/sass/oa/elements/_header.scss | 0 .../static/sass/oa/elements/_layout.scss | 0 .../static/sass/oa/elements/_navigation.scss | 0 .../static/sass/oa/elements/_staff.scss | 0 .../static/sass/oa/utilities/_developer.scss | 0 .../static/sass/oa/utilities/_extends.scss | 0 .../static/sass/oa/utilities/_mixins.scss | 0 .../static/sass/oa/utilities/_shame.scss | 0 .../static/sass/oa/utilities/_variables.scss | 0 .../xblock/static/sass/oa/views/_oa-base.scss | 0 .../oa/views/_oa-course-items-listing.scss | 0 .../oa/views/_oa-jquery-ui-rubric-reuse.scss | 0 .../static/sass/openassessment-ltr.scss | 0 .../static/sass/openassessment-rtl.scss | 0 .../xblock/static/sass/themes/edx/_base.scss | 0 .../static/sass/themes/edx/_elements.scss | 0 .../static/sass/themes/edx/_utilities.scss | 0 .../xblock/static/sass/vendor/_hint.scss | 0 .../sass/vendor/bi-app/_bi-app-ltr.scss | 0 .../sass/vendor/bi-app/_bi-app-rtl.scss | 0 .../static/sass/vendor/bi-app/_mixins.scss | 0 .../sass/vendor/bi-app/_variables-ltr.scss | 0 .../sass/vendor/bi-app/_variables-rtl.scss | 0 .../xblock/static/sass/xb/assets/_fonts.scss | 0 .../static/sass/xb/assets/_graphics.scss | 0 .../xblock/static/sass/xb/contexts/_ie.scss | 0 .../xblock/static/sass/xb/elements/_base.scss | 0 .../static/sass/xb/elements/_controls.scss | 0 .../static/sass/xb/elements/_forms.scss | 0 .../static/sass/xb/elements/_layout.scss | 0 .../sass/xb/elements/_system-feedback.scss | 0 .../static/sass/xb/elements/_typography.scss | 0 .../bourbon/_bourbon-deprecated-upcoming.scss | 0 .../static/sass/xb/libs/bourbon/_bourbon.scss | 0 .../sass/xb/libs/bourbon/addons/_button.scss | 0 .../xb/libs/bourbon/addons/_clearfix.scss | 0 .../xb/libs/bourbon/addons/_font-family.scss | 0 .../xb/libs/bourbon/addons/_hide-text.scss | 0 .../bourbon/addons/_html5-input-types.scss | 0 .../xb/libs/bourbon/addons/_position.scss | 0 .../xb/libs/bourbon/addons/_prefixer.scss | 0 .../xb/libs/bourbon/addons/_retina-image.scss | 0 .../sass/xb/libs/bourbon/addons/_size.scss | 0 .../bourbon/addons/_timing-functions.scss | 0 .../xb/libs/bourbon/addons/_triangle.scss | 0 .../sass/xb/libs/bourbon/css3/_animation.scss | 0 .../xb/libs/bourbon/css3/_appearance.scss | 0 .../bourbon/css3/_backface-visibility.scss | 0 .../libs/bourbon/css3/_background-image.scss | 0 .../xb/libs/bourbon/css3/_background.scss | 0 .../xb/libs/bourbon/css3/_border-image.scss | 0 .../xb/libs/bourbon/css3/_border-radius.scss | 0 .../xb/libs/bourbon/css3/_box-sizing.scss | 0 .../sass/xb/libs/bourbon/css3/_columns.scss | 0 .../sass/xb/libs/bourbon/css3/_flex-box.scss | 0 .../sass/xb/libs/bourbon/css3/_font-face.scss | 0 .../libs/bourbon/css3/_hidpi-media-query.scss | 0 .../libs/bourbon/css3/_image-rendering.scss | 0 .../xb/libs/bourbon/css3/_inline-block.scss | 0 .../sass/xb/libs/bourbon/css3/_keyframes.scss | 0 .../libs/bourbon/css3/_linear-gradient.scss | 0 .../xb/libs/bourbon/css3/_perspective.scss | 0 .../xb/libs/bourbon/css3/_placeholder.scss | 0 .../libs/bourbon/css3/_radial-gradient.scss | 0 .../sass/xb/libs/bourbon/css3/_transform.scss | 0 .../xb/libs/bourbon/css3/_transition.scss | 0 .../xb/libs/bourbon/css3/_user-select.scss | 0 .../xb/libs/bourbon/functions/_compact.scss | 0 .../xb/libs/bourbon/functions/_flex-grid.scss | 0 .../libs/bourbon/functions/_grid-width.scss | 0 .../bourbon/functions/_linear-gradient.scss | 0 .../bourbon/functions/_modular-scale.scss | 0 .../xb/libs/bourbon/functions/_px-to-em.scss | 0 .../bourbon/functions/_radial-gradient.scss | 0 .../libs/bourbon/functions/_tint-shade.scss | 0 .../functions/_transition-property-name.scss | 0 .../helpers/_deprecated-webkit-gradient.scss | 0 .../helpers/_gradient-positions-parser.scss | 0 .../helpers/_linear-positions-parser.scss | 0 .../bourbon/helpers/_radial-arg-parser.scss | 0 .../helpers/_radial-positions-parser.scss | 0 .../bourbon/helpers/_render-gradients.scss | 0 .../bourbon/helpers/_shape-size-stripper.scss | 0 .../sass/xb/libs/neat/_neat-helpers.scss | 0 .../static/sass/xb/libs/neat/_neat.scss | 0 .../libs/neat/functions/_new-breakpoint.scss | 0 .../sass/xb/libs/neat/functions/_private.scss | 0 .../sass/xb/libs/neat/grid/_box-sizing.scss | 0 .../xb/libs/neat/grid/_direction-context.scss | 0 .../xb/libs/neat/grid/_display-context.scss | 0 .../sass/xb/libs/neat/grid/_fill-parent.scss | 0 .../static/sass/xb/libs/neat/grid/_grid.scss | 0 .../static/sass/xb/libs/neat/grid/_media.scss | 0 .../static/sass/xb/libs/neat/grid/_omega.scss | 0 .../xb/libs/neat/grid/_outer-container.scss | 0 .../static/sass/xb/libs/neat/grid/_pad.scss | 0 .../sass/xb/libs/neat/grid/_private.scss | 0 .../static/sass/xb/libs/neat/grid/_reset.scss | 0 .../static/sass/xb/libs/neat/grid/_row.scss | 0 .../static/sass/xb/libs/neat/grid/_shift.scss | 0 .../sass/xb/libs/neat/grid/_span-columns.scss | 0 .../sass/xb/libs/neat/grid/_to-deprecate.scss | 0 .../sass/xb/libs/neat/grid/_visual-grid.scss | 0 .../libs/neat/settings/_disable-warnings.scss | 0 .../sass/xb/libs/neat/settings/_grid.scss | 0 .../xb/libs/neat/settings/_visual-grid.scss | 0 .../static/sass/xb/utilities/_animations.scss | 0 .../static/sass/xb/utilities/_extends.scss | 0 .../static/sass/xb/utilities/_mixins.scss | 0 .../static/sass/xb/utilities/_reset.scss | 0 .../static/sass/xb/utilities/_variables.scss | 0 .../static/xml/censorship_rubric_example.xml | 0 .../xblock/static/xml/file_upload_compat.xml | 0 .../xblock/static/xml/file_upload_custom.xml | 0 .../static/xml/file_upload_image_only.xml | 0 .../static/xml/file_upload_pdf_and_image.xml | 0 .../xblock/static/xml/leaderboard.xml | 0 .../xblock/static/xml/leaderboard_custom.xml | 0 .../static/xml/poverty_peer_only_example.xml | 0 .../static/xml/poverty_rubric_example.xml | 0 .../static/xml/poverty_self_only_example.xml | 0 .../static/xml/promptless_rubric_example.xml | 0 .../xblock/static/xml/unicode.xml | 0 .../openassessment}/xblock/studio_mixin.py | 0 .../openassessment}/xblock/team_mixin.py | 0 .../xblock/team_workflow_mixin.py | 0 .../openassessment}/xblock/test/__init__.py | 0 .../openassessment}/xblock/test/base.py | 0 .../xblock/test/data/assessment_combo.json | 0 .../xblock/test/data/assessment_due.xml | 0 .../test/data/assessment_not_started.xml | 0 .../test/data/assessment_steps_reordered.xml | 0 .../assessment_with_multiple_html_prompt.xml | 0 .../assessment_with_single_html_prompt.xml | 0 .../xblock/test/data/basic_scenario.xml | 0 .../data/basic_scenario_html_prompts_type.xml | 0 .../xblock/test/data/custom_file_upload.xml | 0 .../xblock/test/data/date_config_scenario.xml | 0 .../xblock/test/data/dates_scenario.xml | 0 .../xblock/test/data/empty_prompt.xml | 0 .../data/feedback_only_criterion_grade.xml | 0 .../data/feedback_only_criterion_peer.xml | 0 .../data/feedback_only_criterion_self.xml | 0 .../data/feedback_only_criterion_staff.xml | 0 ...edback_only_criterion_student_training.xml | 0 .../test/data/feedback_per_criterion.xml | 0 .../data/file_upload_missing_scenario.xml | 0 .../xblock/test/data/file_upload_scenario.xml | 0 .../test/data/grade_incomplete_scenario.xml | 0 .../xblock/test/data/grade_scenario.xml | 0 .../test/data/grade_scenario_peer_only.xml | 0 .../test/data/grade_scenario_self_only.xml | 0 .../test/data/grade_scenario_self_staff.xml | 0 ...grade_scenario_self_staff_not_required.xml | 0 .../data/grade_scenario_self_staff_peer.xml | 0 .../test/data/grade_scenario_staff_only.xml | 0 .../test/data/grade_scenario_staff_peer.xml | 0 .../test/data/grade_waiting_scenario.xml | 0 .../data/invalid_assessment_combo_order.xml | 0 .../invalid_assessment_combo_peer_only.xml | 0 .../data/invalid_assessment_examples.json | 0 .../xblock/test/data/invalid_assessments.json | 0 .../xblock/test/data/invalid_dates.json | 0 .../test/data/invalid_dates_scenario.xml | 0 .../xblock/test/data/invalid_rubric.json | 0 .../xblock/test/data/invalid_rubrics.json | 0 .../test/data/invalid_rubrics_no_prompts.json | 0 .../test/data/invalid_update_xblock.json | 0 .../xblock/test/data/leaderboard_show.xml | 0 .../test/data/leaderboard_show_allowfiles.xml | 0 .../test/data/leaderboard_unavailable.xml | 0 .../xblock/test/data/line_breaks.xml | 0 .../xblock/test/data/message_scenario.xml | 0 .../test/data/message_scenario_no_peer.xml | 0 .../test/data/message_scenario_no_self.xml | 0 ...message_scenario_staff_assessment_only.xml | 0 .../message_scenario_student_training.xml | 0 .../test/data/neither_response_type.xml | 0 .../data/optional_assessments_self_only.xml | 0 .../xblock/test/data/over_grade_scenario.xml | 0 .../test/data/parse_assessments_xml.json | 0 .../xblock/test/data/parse_examples_xml.json | 0 .../xblock/test/data/parse_prompts_xml.json | 0 .../xblock/test/data/parse_rubric_xml.json | 0 ...ment_default_grading_strategy_scenario.xml | 0 .../peer_assessment_flex_grading_scenario.xml | 0 ...essment_mean_grading_strategy_scenario.xml | 0 ...sment_median_grading_strategy_scenario.xml | 0 .../test/data/peer_assessment_scenario.xml | 0 .../xblock/test/data/peer_closed_scenario.xml | 0 .../xblock/test/data/peer_future_scenario.xml | 0 .../xblock/test/data/peer_only_scenario.xml | 0 .../xblock/test/data/prompt_html.xml | 0 .../xblock/test/data/resolve_dates.json | 0 .../test/data/resolve_dates_scenario.xml | 0 .../xblock/test/data/save_responses.json | 0 .../xblock/test/data/save_scenario.xml | 0 .../test/data/self_assessment_closed.xml | 0 .../xblock/test/data/self_assessment_open.xml | 0 .../test/data/self_assessment_scenario.xml | 0 .../test/data/self_assessment_unavailable.xml | 0 .../xblock/test/data/self_only_scenario.xml | 0 .../xblock/test/data/self_then_peer.xml | 0 .../xblock/test/data/serialize.json | 0 .../test/data/simple_self_staff_scenario.xml | 0 .../test/data/single_file_upload_scenario.xml | 0 .../xblock/test/data/staff_dates_scenario.xml | 0 .../xblock/test/data/staff_grade_scenario.xml | 0 .../xblock/test/data/student_training.xml | 0 .../test/data/student_training_combo.json | 0 .../xblock/test/data/student_training_due.xml | 0 .../test/data/student_training_future.xml | 0 .../test/data/student_training_mixin.json | 0 .../xblock/test/data/submission_closed.xml | 0 .../test/data/submission_no_deadline.xml | 0 .../xblock/test/data/submission_open.xml | 0 .../test/data/submission_unavailable.xml | 0 .../xblock/test/data/team_submission.xml | 0 .../data/team_submission_file_scenario.xml | 0 .../xblock/test/data/update_from_xml.json | 0 .../test/data/update_from_xml_error.json | 0 .../xblock/test/data/update_xblock.json | 0 .../xblock/test/data/updated_block.xml | 0 .../test/data/valid_assessment_examples.json | 0 .../xblock/test/data/valid_assessments.json | 0 .../xblock/test/data/valid_dates.json | 0 .../xblock/test/data/valid_rubrics.json | 0 .../xblock/test/data/waiting_scenarios.json | 0 .../xblock/test/data/zero_points.xml | 0 .../xblock/test/test_allow_resubmission.py | 0 .../xblock/test/test_config_mixin.py | 0 .../xblock/test/test_course_items_listing.py | 0 .../xblock/test/test_data_conversion.py | 0 .../xblock/test/test_defaults.py | 0 .../xblock/test/test_export_import.py | 0 .../openassessment}/xblock/test/test_grade.py | 0 .../xblock/test/test_grade_explanation.py | 0 .../xblock/test/test_leaderboard.py | 0 .../openassessment}/xblock/test/test_lms.py | 0 .../xblock/test/test_load_static.py | 0 .../xblock/test/test_message.py | 0 .../xblock/test/test_mobile.py | 0 .../xblock/test/test_notifications.py | 0 .../xblock/test/test_openassessment.py | 0 .../xblock/test/test_ora_reminders.py | 0 .../openassessment}/xblock/test/test_peer.py | 0 .../xblock/test/test_resolve_dates.py | 0 .../xblock/test/test_rubric_reuse.py | 0 .../test/test_save_files_descriptions.py | 0 .../xblock/test/test_save_response.py | 0 .../openassessment}/xblock/test/test_self.py | 0 .../openassessment}/xblock/test/test_staff.py | 0 .../xblock/test/test_staff_area.py | 0 .../xblock/test/test_student_training.py | 0 .../xblock/test/test_studio.py | 0 .../xblock/test/test_submission.py | 0 .../openassessment}/xblock/test/test_team.py | 0 .../xblock/test/test_team_workflow_mixin.py | 0 .../xblock/test/test_templates.py | 0 .../xblock/test/test_validation.py | 0 .../xblock/test/test_workflow_mixin.py | 0 .../openassessment}/xblock/test/test_xml.py | 115 + .../xblock/ui_mixins/__init__.py | 0 .../xblock/ui_mixins/legacy/__init__.py | 0 .../xblock/ui_mixins/legacy/handlers_mixin.py | 0 .../xblock/ui_mixins/legacy/serializers.py | 0 .../xblock/ui_mixins/legacy/views/__init__.py | 0 .../xblock/ui_mixins/legacy/views/peer.py | 0 .../xblock/ui_mixins/legacy/views/self.py | 0 .../xblock/ui_mixins/legacy/views/staff.py | 0 .../ui_mixins/legacy/views/submission.py | 0 .../xblock/ui_mixins/legacy/views/training.py | 0 .../xblock/ui_mixins/legacy/views_mixin.py | 0 .../xblock/ui_mixins/mfe/__init__.py | 0 .../ui_mixins/mfe/assessment_serializers.py | 0 .../ui_mixins/mfe/constants/__init__.py | 0 .../ui_mixins/mfe/constants/error_codes.py | 0 .../mfe/constants/handler_suffixes.py | 0 .../xblock/ui_mixins/mfe/mixin.py | 0 .../ui_mixins/mfe/ora_config_serializer.py | 0 .../ui_mixins/mfe/page_context_serializer.py | 0 .../xblock/ui_mixins/mfe/serializer_utils.py | 0 .../ui_mixins/mfe/submission_serializers.py | 0 .../mfe/test_assessment_serializers.py | 0 .../xblock/ui_mixins/mfe/test_mfe_mixin.py | 0 .../mfe/test_page_context_serializer.py | 0 .../xblock/ui_mixins/mfe/test_serializers.py | 0 .../mfe/test_submission_serializers.py | 0 .../openassessment}/xblock/utils/__init__.py | 0 .../xblock/utils/allow_resubmission.py | 0 .../xblock/utils/data_conversion.py | 0 .../openassessment}/xblock/utils/defaults.py | 0 .../xblock/utils/editor_config.py | 0 .../xblock/utils/notifications.py | 0 .../xblock/utils/ora_reminders.py | 0 .../xblock/utils/resolve_dates.py | 0 .../openassessment}/xblock/utils/schema.py | 0 .../openassessment}/xblock/utils/user_data.py | 0 .../xblock/utils/validation.py | 0 .../openassessment}/xblock/utils/xml.py | 15 + .../openassessment}/xblock/workflow_mixin.py | 0 tox.ini | 37 +- uv.lock | 3029 +++++++++++++++++ webpack.dev.config.js | 18 +- webpack.prod.config.js | 18 +- 873 files changed, 3639 insertions(+), 2429 deletions(-) delete mode 100644 .coveragerc delete mode 100644 .github/workflows/pypi-publish.yml create mode 100644 .github/workflows/release.yml delete mode 100644 openassessment/__init__.py create mode 100644 pyproject.toml delete mode 100644 requirements/base.in delete mode 100644 requirements/base.txt delete mode 100644 requirements/ci.in delete mode 100644 requirements/ci.txt delete mode 100644 requirements/common_constraints.txt delete mode 100644 requirements/constraints.txt delete mode 100644 requirements/docs.in delete mode 100644 requirements/docs.txt delete mode 100644 requirements/pip-tools.in delete mode 100644 requirements/pip-tools.txt delete mode 100644 requirements/pip.in delete mode 100644 requirements/pip.txt delete mode 100644 requirements/quality.in delete mode 100644 requirements/quality.txt delete mode 100644 requirements/test-acceptance.in delete mode 100644 requirements/test-acceptance.txt delete mode 100644 requirements/test.in delete mode 100644 requirements/test.txt delete mode 100644 requirements/tox.in delete mode 100644 requirements/tox.txt delete mode 100644 setup.cfg delete mode 100644 setup.py create mode 100644 src/openassessment/__init__.py rename {openassessment => src/openassessment}/assessment/__init__.py (100%) rename {openassessment => src/openassessment}/assessment/admin.py (100%) rename {openassessment => src/openassessment}/assessment/api/__init__.py (100%) rename {openassessment => src/openassessment}/assessment/api/peer.py (100%) rename {openassessment => src/openassessment}/assessment/api/self.py (100%) rename {openassessment => src/openassessment}/assessment/api/staff.py (100%) rename {openassessment => src/openassessment}/assessment/api/student_training.py (100%) rename {openassessment => src/openassessment}/assessment/api/teams.py (100%) rename {openassessment => src/openassessment}/assessment/data_conversion.py (100%) rename {openassessment => src/openassessment}/assessment/errors/__init__.py (100%) rename {openassessment => src/openassessment}/assessment/errors/base.py (100%) rename {openassessment => src/openassessment}/assessment/errors/peer.py (100%) rename {openassessment => src/openassessment}/assessment/errors/self.py (100%) rename {openassessment => src/openassessment}/assessment/errors/staff.py (100%) rename {openassessment => src/openassessment}/assessment/errors/student_training.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/0001_initial.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/0002_staffworkflow.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/0003_expand_course_id.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/0004_historicalsharedfileupload_sharedfileupload.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/0005_add_filename_to_sharedupload.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/0006_TeamWorkflows.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/0007_staff_workflow_blank.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/0008_alter_historicalsharedfileupload_options.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/0009_increase_item_id_max_length_peer_staff_studenttraining_workflows.py (100%) rename {openassessment => src/openassessment}/assessment/migrations/__init__.py (100%) rename {openassessment => src/openassessment}/assessment/models/__init__.py (100%) rename {openassessment => src/openassessment}/assessment/models/base.py (100%) rename {openassessment => src/openassessment}/assessment/models/peer.py (100%) rename {openassessment => src/openassessment}/assessment/models/staff.py (100%) rename {openassessment => src/openassessment}/assessment/models/student_training.py (100%) rename {openassessment => src/openassessment}/assessment/models/training.py (100%) rename {openassessment => src/openassessment}/assessment/score_type_constants.py (100%) rename {openassessment => src/openassessment}/assessment/serializers/__init__.py (100%) rename {openassessment => src/openassessment}/assessment/serializers/base.py (100%) rename {openassessment => src/openassessment}/assessment/serializers/peer.py (100%) rename {openassessment => src/openassessment}/assessment/serializers/training.py (100%) rename {openassessment => src/openassessment}/assessment/signals.py (100%) rename {openassessment => src/openassessment}/assessment/templates/evaluations.html (100%) rename {openassessment => src/openassessment}/assessment/test/__init__.py (100%) rename {openassessment => src/openassessment}/assessment/test/constants.py (100%) rename {openassessment => src/openassessment}/assessment/test/data/models_check_criteria_assessed.json (100%) rename {openassessment => src/openassessment}/assessment/test/data/rubric/empty_criteria.json (100%) rename {openassessment => src/openassessment}/assessment/test/data/rubric/empty_options.json (100%) rename {openassessment => src/openassessment}/assessment/test/data/rubric/missing_criteria.json (100%) rename {openassessment => src/openassessment}/assessment/test/data/rubric/missing_options.json (100%) rename {openassessment => src/openassessment}/assessment/test/data/rubric/no_points.json (100%) rename {openassessment => src/openassessment}/assessment/test/data/rubric/project_plan_rubric.json (100%) rename {openassessment => src/openassessment}/assessment/test/data/valid_assessments.json (100%) rename {openassessment => src/openassessment}/assessment/test/data/validate_training_examples.json (100%) rename {openassessment => src/openassessment}/assessment/test/test_assessment_models.py (100%) rename {openassessment => src/openassessment}/assessment/test/test_peer.py (100%) rename {openassessment => src/openassessment}/assessment/test/test_rubric.py (100%) rename {openassessment => src/openassessment}/assessment/test/test_self.py (100%) rename {openassessment => src/openassessment}/assessment/test/test_serializers.py (100%) rename {openassessment => src/openassessment}/assessment/test/test_staff.py (100%) rename {openassessment => src/openassessment}/assessment/test/test_student_training_api.py (100%) rename {openassessment => src/openassessment}/assessment/test/test_student_training_models.py (100%) rename {openassessment => src/openassessment}/assessment/test/test_team.py (100%) rename {openassessment => src/openassessment}/assessment/test/test_training.py (100%) rename {openassessment => src/openassessment}/assessment/urls.py (100%) rename {openassessment => src/openassessment}/assessment/views.py (100%) rename {openassessment => src/openassessment}/conf/locale/ar/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ar/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/ar/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ar/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/ar_SA/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ar_SA/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/config.yaml (100%) rename {openassessment => src/openassessment}/conf/locale/cs/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/cs/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/cs/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/cs/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/da/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/da/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/da/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/da/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/de_DE/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/de_DE/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/de_DE/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/de_DE/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/el/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/el/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/el/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/el/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/en/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/en/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/en/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/en/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/eo/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/eo/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/eo/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/eo/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/es_419/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/es_419/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/es_419/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/es_419/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/es_AR/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/es_AR/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/es_AR/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/es_AR/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/es_ES/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/es_ES/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/es_ES/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/es_ES/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/eu_ES/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/eu_ES/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/eu_ES/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/eu_ES/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/fa_IR/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/fa_IR/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/fa_IR/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/fa_IR/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/fr/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/fr/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/fr/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/fr/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/fr_CA/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/fr_CA/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/fr_CA/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/fr_CA/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/he/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/he/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/he/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/he/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/hi/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/hi/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/hi/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/hi/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/id/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/id/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/id/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/id/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/it_IT/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/it_IT/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/it_IT/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/it_IT/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/ja_JP/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ja_JP/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/ja_JP/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ja_JP/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/ka/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ka/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/ka/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ka/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/lt_LT/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/lt_LT/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/lt_LT/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/lt_LT/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/lv/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/lv/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/lv/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/lv/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/messages.mo (100%) rename {openassessment => src/openassessment}/conf/locale/mn/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/mn/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/mn/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/mn/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/nb/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/nb/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/nb/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/nb/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/pl/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/pl/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/pl/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/pl/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/pt_BR/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/pt_BR/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/pt_BR/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/pt_PT/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/pt_PT/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/pt_PT/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/pt_PT/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/ro/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ro/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/ro/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ro/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/ru/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ru/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/ru/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/ru/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/sk/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/sk/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/sq/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/sq/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/sq/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/sq/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/sw_KE/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/sw_KE/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/sw_KE/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/sw_KE/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/th/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/th/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/th/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/th/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/tr_TR/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/tr_TR/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/tr_TR/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/tr_TR/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/uk/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/uk/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/uk/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/uk/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/vi/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/vi/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/vi/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/vi/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/zh_CN/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/zh_CN/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/zh_CN/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/conf/locale/zh_TW/LC_MESSAGES/django.mo (100%) rename {openassessment => src/openassessment}/conf/locale/zh_TW/LC_MESSAGES/django.po (100%) rename {openassessment => src/openassessment}/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo (100%) rename {openassessment => src/openassessment}/conf/locale/zh_TW/LC_MESSAGES/djangojs.po (100%) rename {openassessment => src/openassessment}/data.py (100%) rename {openassessment => src/openassessment}/fileupload/__init__.py (100%) rename {openassessment => src/openassessment}/fileupload/api.py (100%) rename {openassessment => src/openassessment}/fileupload/backends/__init__.py (100%) rename {openassessment => src/openassessment}/fileupload/backends/base.py (100%) rename {openassessment => src/openassessment}/fileupload/backends/django_storage.py (100%) rename {openassessment => src/openassessment}/fileupload/backends/filesystem.py (100%) rename {openassessment => src/openassessment}/fileupload/backends/s3.py (100%) rename {openassessment => src/openassessment}/fileupload/backends/swift.py (100%) rename {openassessment => src/openassessment}/fileupload/exceptions.py (100%) rename {openassessment => src/openassessment}/fileupload/tests/test_api.py (100%) rename {openassessment => src/openassessment}/fileupload/tests/test_api_functions.py (100%) rename {openassessment => src/openassessment}/fileupload/tests/test_file_management.py (100%) rename {openassessment => src/openassessment}/fileupload/urls.py (100%) rename {openassessment => src/openassessment}/fileupload/views_django_storage.py (100%) rename {openassessment => src/openassessment}/fileupload/views_filesystem.py (100%) rename {openassessment => src/openassessment}/locale (100%) rename {openassessment => src/openassessment}/management/__init__.py (100%) rename {openassessment => src/openassessment}/management/commands/__init__.py (100%) rename {openassessment => src/openassessment}/management/commands/collect_ora2_data.py (100%) rename {openassessment => src/openassessment}/management/commands/create_oa_submissions.py (100%) rename {openassessment => src/openassessment}/management/commands/create_oa_submissions_from_file.py (100%) rename {openassessment => src/openassessment}/management/commands/loremipsum.py (100%) rename {openassessment => src/openassessment}/management/commands/update_ora_workflows.py (100%) rename {openassessment => src/openassessment}/management/commands/upload_oa_data.py (100%) rename {openassessment => src/openassessment}/management/tests/__init__.py (100%) rename {openassessment => src/openassessment}/management/tests/test_collect_ora2_data.py (100%) rename {openassessment => src/openassessment}/management/tests/test_create_oa_submissions.py (100%) rename {openassessment => src/openassessment}/management/tests/test_create_oa_submissions_from_file.py (100%) rename {openassessment => src/openassessment}/management/tests/test_update_ora_workflows.py (100%) rename {openassessment => src/openassessment}/management/tests/test_upload_oa_data.py (100%) rename {openassessment => src/openassessment}/runtime_imports/__init__.py (100%) rename {openassessment => src/openassessment}/runtime_imports/classes.py (100%) rename {openassessment => src/openassessment}/runtime_imports/functions.py (100%) rename {openassessment => src/openassessment}/staffgrader/__init__.py (100%) rename {openassessment => src/openassessment}/staffgrader/admin.py (100%) rename {openassessment => src/openassessment}/staffgrader/errors/__init__.py (100%) rename {openassessment => src/openassessment}/staffgrader/errors/submission_lock.py (100%) rename {openassessment => src/openassessment}/staffgrader/migrations/0001_initial.py (100%) rename {openassessment => src/openassessment}/staffgrader/migrations/__init__.py (100%) rename {openassessment => src/openassessment}/staffgrader/models/__init__.py (100%) rename {openassessment => src/openassessment}/staffgrader/models/submission_lock.py (100%) rename {openassessment => src/openassessment}/staffgrader/serializers/__init__.py (100%) rename {openassessment => src/openassessment}/staffgrader/serializers/assessments.py (100%) rename {openassessment => src/openassessment}/staffgrader/serializers/submission_list.py (100%) rename {openassessment => src/openassessment}/staffgrader/serializers/submission_lock.py (100%) rename {openassessment => src/openassessment}/staffgrader/staff_grader_mixin.py (100%) rename {openassessment => src/openassessment}/staffgrader/tests/__init__.py (100%) rename {openassessment => src/openassessment}/staffgrader/tests/test_base.py (100%) rename {openassessment => src/openassessment}/staffgrader/tests/test_decorators.py (100%) rename {openassessment => src/openassessment}/staffgrader/tests/test_get_assessment_info.py (100%) rename {openassessment => src/openassessment}/staffgrader/tests/test_get_submission_info.py (100%) rename {openassessment => src/openassessment}/staffgrader/tests/test_list_staff_workflows.py (100%) rename {openassessment => src/openassessment}/staffgrader/tests/test_serializers.py (100%) rename {openassessment => src/openassessment}/staffgrader/tests/test_staff_grader_mixin.py (100%) rename {openassessment => src/openassessment}/staffgrader/tests/test_submission_lock_model.py (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_assessment_steps.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_basic_settings_list.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_criterion.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_header_and_validation.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_option.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_peer_assessment.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_peer_assessment_schedule.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_prompt.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_prompts.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_rubric.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_schedule.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_self_assessment.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_self_assessment_schedule.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_settings.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_staff_assessment.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_edit_student_training.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_rubric_reuse.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_training_example.html (100%) rename {openassessment => src/openassessment}/templates/legacy/edit/oa_training_example_criterion.html (100%) rename {openassessment => src/openassessment}/templates/legacy/grade/oa_assessment_feedback.html (100%) rename {openassessment => src/openassessment}/templates/legacy/grade/oa_assessment_title.html (100%) rename {openassessment => src/openassessment}/templates/legacy/grade/oa_grade_cancelled.html (100%) rename {openassessment => src/openassessment}/templates/legacy/grade/oa_grade_complete.html (100%) rename {openassessment => src/openassessment}/templates/legacy/grade/oa_grade_incomplete.html (100%) rename {openassessment => src/openassessment}/templates/legacy/grade/oa_grade_not_started.html (100%) rename {openassessment => src/openassessment}/templates/legacy/grade/oa_grade_waiting.html (100%) rename {openassessment => src/openassessment}/templates/legacy/icons/warning_filled.html (100%) rename {openassessment => src/openassessment}/templates/legacy/instructor_dashboard/oa_grade_available_responses.html (100%) rename {openassessment => src/openassessment}/templates/legacy/instructor_dashboard/oa_listing.html (100%) rename {openassessment => src/openassessment}/templates/legacy/instructor_dashboard/oa_waiting_step_details.html (100%) rename {openassessment => src/openassessment}/templates/legacy/instructor_dashboard/open-response-assessment-summary.underscore (100%) rename {openassessment => src/openassessment}/templates/legacy/leaderboard/oa_leaderboard_show.html (100%) rename {openassessment => src/openassessment}/templates/legacy/leaderboard/oa_leaderboard_waiting.html (100%) rename {openassessment => src/openassessment}/templates/legacy/message/oa_message_cancelled.html (100%) rename {openassessment => src/openassessment}/templates/legacy/message/oa_message_closed.html (100%) rename {openassessment => src/openassessment}/templates/legacy/message/oa_message_complete.html (100%) rename {openassessment => src/openassessment}/templates/legacy/message/oa_message_incomplete.html (100%) rename {openassessment => src/openassessment}/templates/legacy/message/oa_message_no_team.html (100%) rename {openassessment => src/openassessment}/templates/legacy/message/oa_message_open.html (100%) rename {openassessment => src/openassessment}/templates/legacy/message/oa_message_unavailable.html (100%) rename {openassessment => src/openassessment}/templates/legacy/oa_base.html (100%) rename {openassessment => src/openassessment}/templates/legacy/oa_error.html (100%) rename {openassessment => src/openassessment}/templates/legacy/oa_latex_preview.html (100%) rename {openassessment => src/openassessment}/templates/legacy/oa_rubric.html (100%) rename {openassessment => src/openassessment}/templates/legacy/oa_submission_answer.html (100%) rename {openassessment => src/openassessment}/templates/legacy/oa_team_uploaded_files.html (100%) rename {openassessment => src/openassessment}/templates/legacy/oa_uploaded_file.html (100%) rename {openassessment => src/openassessment}/templates/legacy/peer/oa_peer_assessment.html (100%) rename {openassessment => src/openassessment}/templates/legacy/peer/oa_peer_cancelled.html (100%) rename {openassessment => src/openassessment}/templates/legacy/peer/oa_peer_closed.html (100%) rename {openassessment => src/openassessment}/templates/legacy/peer/oa_peer_complete.html (100%) rename {openassessment => src/openassessment}/templates/legacy/peer/oa_peer_turbo_mode.html (100%) rename {openassessment => src/openassessment}/templates/legacy/peer/oa_peer_turbo_mode_waiting.html (100%) rename {openassessment => src/openassessment}/templates/legacy/peer/oa_peer_unavailable.html (100%) rename {openassessment => src/openassessment}/templates/legacy/peer/oa_peer_waiting.html (100%) rename {openassessment => src/openassessment}/templates/legacy/response/oa_response.html (100%) rename {openassessment => src/openassessment}/templates/legacy/response/oa_response_cancelled.html (100%) rename {openassessment => src/openassessment}/templates/legacy/response/oa_response_closed.html (100%) rename {openassessment => src/openassessment}/templates/legacy/response/oa_response_graded.html (100%) rename {openassessment => src/openassessment}/templates/legacy/response/oa_response_studio_preview.html (100%) rename {openassessment => src/openassessment}/templates/legacy/response/oa_response_submitted.html (100%) rename {openassessment => src/openassessment}/templates/legacy/response/oa_response_team_already_submitted.html (100%) rename {openassessment => src/openassessment}/templates/legacy/response/oa_response_unavailable.html (100%) rename {openassessment => src/openassessment}/templates/legacy/self/oa_self_assessment.html (100%) rename {openassessment => src/openassessment}/templates/legacy/self/oa_self_cancelled.html (100%) rename {openassessment => src/openassessment}/templates/legacy/self/oa_self_closed.html (100%) rename {openassessment => src/openassessment}/templates/legacy/self/oa_self_complete.html (100%) rename {openassessment => src/openassessment}/templates/legacy/self/oa_self_unavailable.html (100%) rename {openassessment => src/openassessment}/templates/legacy/staff/oa_staff_grade.html (100%) rename {openassessment => src/openassessment}/templates/legacy/staff_area/oa_staff_area.html (100%) rename {openassessment => src/openassessment}/templates/legacy/staff_area/oa_staff_grade_learners.html (100%) rename {openassessment => src/openassessment}/templates/legacy/staff_area/oa_staff_grade_learners_assessment.html (100%) rename {openassessment => src/openassessment}/templates/legacy/staff_area/oa_staff_grade_learners_count.html (100%) rename {openassessment => src/openassessment}/templates/legacy/staff_area/oa_staff_override_assessment.html (100%) rename {openassessment => src/openassessment}/templates/legacy/staff_area/oa_student_info.html (100%) rename {openassessment => src/openassessment}/templates/legacy/staff_area/oa_student_info_assessment_detail.html (100%) rename {openassessment => src/openassessment}/templates/legacy/student_training/student_training.html (100%) rename {openassessment => src/openassessment}/templates/legacy/student_training/student_training_cancelled.html (100%) rename {openassessment => src/openassessment}/templates/legacy/student_training/student_training_closed.html (100%) rename {openassessment => src/openassessment}/templates/legacy/student_training/student_training_complete.html (100%) rename {openassessment => src/openassessment}/templates/legacy/student_training/student_training_error.html (100%) rename {openassessment => src/openassessment}/templates/legacy/student_training/student_training_unavailable.html (100%) rename {openassessment => src/openassessment}/templates/openassessmentblock/base.html (100%) rename {openassessment => src/openassessment}/templatetags/__init__.py (100%) rename {openassessment => src/openassessment}/templatetags/oa_extras.py (100%) rename {openassessment => src/openassessment}/test_utils.py (100%) rename {openassessment => src/openassessment}/tests/__init__.py (100%) rename {openassessment => src/openassessment}/tests/data/db_fixtures/empty.json (100%) rename {openassessment => src/openassessment}/tests/data/db_fixtures/feedback_on_assessment.json (100%) rename {openassessment => src/openassessment}/tests/data/db_fixtures/feedback_only_criterion.json (100%) rename {openassessment => src/openassessment}/tests/data/db_fixtures/peer_assessed.json (100%) rename {openassessment => src/openassessment}/tests/data/db_fixtures/scored.json (100%) rename {openassessment => src/openassessment}/tests/data/db_fixtures/self_assessed.json (100%) rename {openassessment => src/openassessment}/tests/data/db_fixtures/submitted.json (100%) rename {openassessment => src/openassessment}/tests/data/db_fixtures/unicode.json (100%) rename {openassessment => src/openassessment}/tests/data/write_to_csv.json (100%) rename {openassessment => src/openassessment}/tests/factories.py (100%) rename {openassessment => src/openassessment}/tests/test_data.py (100%) rename {openassessment => src/openassessment}/tests/test_templatetags.py (100%) rename {openassessment => src/openassessment}/workflow/__init__.py (100%) rename {openassessment => src/openassessment}/workflow/admin.py (100%) rename {openassessment => src/openassessment}/workflow/api.py (100%) rename {openassessment => src/openassessment}/workflow/errors.py (100%) rename {openassessment => src/openassessment}/workflow/migrations/0001_initial.py (100%) rename {openassessment => src/openassessment}/workflow/migrations/0002_remove_django_extensions.py (100%) rename {openassessment => src/openassessment}/workflow/migrations/0003_TeamWorkflows.py (100%) rename {openassessment => src/openassessment}/workflow/migrations/0004_assessmentworkflowstep_skipped.py (100%) rename {openassessment => src/openassessment}/workflow/migrations/0005_alter_assessmentworkflow_status.py (100%) rename {openassessment => src/openassessment}/workflow/migrations/0006_mariadb_uuid_conversion.py (100%) rename {openassessment => src/openassessment}/workflow/migrations/0007_orareminder.py (100%) rename {openassessment => src/openassessment}/workflow/migrations/0008_orareminder_sent_count.py (100%) rename {openassessment => src/openassessment}/workflow/migrations/__init__.py (100%) rename {openassessment => src/openassessment}/workflow/models.py (100%) rename {openassessment => src/openassessment}/workflow/serializers.py (100%) rename {openassessment => src/openassessment}/workflow/tasks.py (100%) rename {openassessment => src/openassessment}/workflow/team_api.py (100%) rename {openassessment => src/openassessment}/workflow/test/__init__.py (100%) rename {openassessment => src/openassessment}/workflow/test/data/assessments.json (100%) rename {openassessment => src/openassessment}/workflow/test/factories.py (100%) rename {openassessment => src/openassessment}/workflow/test/test_api.py (100%) rename {openassessment => src/openassessment}/workflow/test/test_models.py (100%) rename {openassessment => src/openassessment}/workflow/test/test_signals.py (100%) rename {openassessment => src/openassessment}/workflow/test/test_team_api.py (100%) rename {openassessment => src/openassessment}/workflow/test/test_workflow_batch_update_api.py (100%) rename {openassessment => src/openassessment}/workflow/workflow_batch_update_api.py (100%) rename {openassessment => src/openassessment}/xblock/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/apis/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/apis/assessments/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/apis/assessments/errors.py (100%) rename {openassessment => src/openassessment}/xblock/apis/assessments/peer_assessment_api.py (100%) rename {openassessment => src/openassessment}/xblock/apis/assessments/self_assessment_api.py (100%) rename {openassessment => src/openassessment}/xblock/apis/assessments/staff_assessment_api.py (100%) rename {openassessment => src/openassessment}/xblock/apis/assessments/student_training_api.py (100%) rename {openassessment => src/openassessment}/xblock/apis/grades_api.py (100%) rename {openassessment => src/openassessment}/xblock/apis/ora_config_api.py (100%) rename {openassessment => src/openassessment}/xblock/apis/ora_data_accessor.py (100%) rename {openassessment => src/openassessment}/xblock/apis/step_data_api.py (100%) rename {openassessment => src/openassessment}/xblock/apis/submissions/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/apis/submissions/errors.py (100%) rename {openassessment => src/openassessment}/xblock/apis/submissions/file_api.py (100%) rename {openassessment => src/openassessment}/xblock/apis/submissions/submissions_actions.py (100%) rename {openassessment => src/openassessment}/xblock/apis/submissions/submissions_api.py (100%) rename {openassessment => src/openassessment}/xblock/apis/workflow_api.py (100%) rename {openassessment => src/openassessment}/xblock/config_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/course_items_listing_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/files_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/grade_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/leaderboard_mixin.py (98%) rename {openassessment => src/openassessment}/xblock/lms_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/load_static.py (100%) rename {openassessment => src/openassessment}/xblock/message_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/mobile.py (100%) rename {openassessment => src/openassessment}/xblock/openassesment_template_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/openassessmentblock.py (99%) rename {openassessment => src/openassessment}/xblock/rubric_reuse_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/staff_area_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/static/css/lib/backgrid/backgrid.css (100%) rename {openassessment => src/openassessment}/xblock/static/css/lib/backgrid/backgrid.min.css (100%) rename {openassessment => src/openassessment}/xblock/static/dist/4620b30a966533ace489dcc7afb151b9.png (100%) rename {openassessment => src/openassessment}/xblock/static/dist/95ec738c0b7faac5b5c9126794446bbd.svg (100%) rename {openassessment => src/openassessment}/xblock/static/dist/manifest.json (100%) rename {openassessment => src/openassessment}/xblock/static/dist/openassessment-editor-textarea.cbb31e4372be87d437fb.js (100%) rename {openassessment => src/openassessment}/xblock/static/dist/openassessment-editor-tinymce.ab9f042f233087bba4b8.js (100%) rename {openassessment => src/openassessment}/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.css (100%) rename {openassessment => src/openassessment}/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.js (100%) rename {openassessment => src/openassessment}/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.css (100%) rename {openassessment => src/openassessment}/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.js (100%) rename {openassessment => src/openassessment}/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.css (100%) rename {openassessment => src/openassessment}/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.js (100%) rename {openassessment => src/openassessment}/xblock/static/dist/openassessment-studio.b58bb4e55f63dadac6de.js (100%) rename {openassessment => src/openassessment}/xblock/static/fonts/libs/font-awesome/FontAwesome.otf (100%) rename {openassessment => src/openassessment}/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.eot (100%) rename {openassessment => src/openassessment}/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.svg (100%) rename {openassessment => src/openassessment}/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.ttf (100%) rename {openassessment => src/openassessment}/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.woff (100%) rename {openassessment => src/openassessment}/xblock/static/js/fixtures/templates.json (100%) rename {openassessment => src/openassessment}/xblock/static/js/lib/backgrid/backgrid.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/lib/backgrid/backgrid.min.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/lib/codemirror.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/lib/jquery-ui-1.10.4.min.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/lib/jquery.min.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/lib/jquery.timepicker.min.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/lib/underscore-min.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/components/WaitingStepDetailsPage.spec.jsx (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/components/WaitingStepList.spec.jsx (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_base.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_datefactory.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_file_upload.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_grade.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_listing.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_peer.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_response.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_response_editor.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_rubric.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_self.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_staff_area.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/lms/oa_training.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/oa_server.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_container.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_assessments.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_assessments_steps.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_fields.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_listeners.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_notifier.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_prompt.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_rubric.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_schedule.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_settings.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/studio/oa_edit_validation_alert.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/spec/test_shared.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/api/waiting_step_details.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/components/WaitingStepContent.jsx (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/components/WaitingStepList.jsx (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/containers/WaitingStepDetailsContainer.jsx (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/editors/oa_editor_textarea.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/editors/oa_editor_tinymce.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_base.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_confirmation_alert.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_course_items_listing.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_datefactory.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_file_upload.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_grade.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_leaderboard.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_message.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_peer.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_prompts.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_response.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_response_editor.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_rubric.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_self.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_staff.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_staff_area.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_staff_waiting_step.jsx (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms/oa_training.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/lms_index.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/oa_server.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/oa_shared.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_container.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_container_item.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_assessment.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_assessments_steps.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_fields.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_listeners.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_notifier.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_prompts.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_rubric.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_schedule.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_settings.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_edit_validation_alert.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio/oa_tiny_mce.js (100%) rename {openassessment => src/openassessment}/xblock/static/js/src/studio_index.js (100%) rename {openassessment => src/openassessment}/xblock/static/sass/_openassessment.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/contexts/_ie.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/contexts/_responsive.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/elements/_confirm.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/elements/_footer.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/elements/_header.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/elements/_layout.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/elements/_navigation.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/elements/_staff.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/utilities/_developer.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/utilities/_extends.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/utilities/_mixins.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/utilities/_shame.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/utilities/_variables.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/views/_oa-base.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/views/_oa-course-items-listing.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/oa/views/_oa-jquery-ui-rubric-reuse.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/openassessment-ltr.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/openassessment-rtl.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/themes/edx/_base.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/themes/edx/_elements.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/themes/edx/_utilities.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/vendor/_hint.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/vendor/bi-app/_bi-app-ltr.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/vendor/bi-app/_bi-app-rtl.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/vendor/bi-app/_mixins.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/vendor/bi-app/_variables-ltr.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/vendor/bi-app/_variables-rtl.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/assets/_fonts.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/assets/_graphics.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/contexts/_ie.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/elements/_base.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/elements/_controls.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/elements/_forms.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/elements/_layout.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/elements/_system-feedback.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/elements/_typography.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/_bourbon-deprecated-upcoming.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/_bourbon.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_button.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_clearfix.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_font-family.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_hide-text.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_html5-input-types.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_position.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_prefixer.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_retina-image.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_size.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_timing-functions.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/addons/_triangle.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_animation.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_appearance.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_backface-visibility.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_background-image.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_background.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_border-image.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_border-radius.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_box-sizing.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_columns.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_flex-box.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_font-face.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_hidpi-media-query.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_image-rendering.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_inline-block.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_keyframes.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_linear-gradient.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_perspective.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_placeholder.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_radial-gradient.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_transform.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_transition.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/css3/_user-select.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/functions/_compact.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/functions/_flex-grid.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/functions/_grid-width.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/functions/_linear-gradient.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/functions/_modular-scale.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/functions/_px-to-em.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/functions/_radial-gradient.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/functions/_tint-shade.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/functions/_transition-property-name.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/helpers/_deprecated-webkit-gradient.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/helpers/_gradient-positions-parser.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/helpers/_linear-positions-parser.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/helpers/_radial-arg-parser.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/helpers/_radial-positions-parser.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/helpers/_render-gradients.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/bourbon/helpers/_shape-size-stripper.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/_neat-helpers.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/_neat.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/functions/_new-breakpoint.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/functions/_private.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_box-sizing.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_direction-context.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_display-context.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_fill-parent.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_grid.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_media.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_omega.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_outer-container.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_pad.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_private.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_reset.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_row.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_shift.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_span-columns.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_to-deprecate.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/grid/_visual-grid.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/settings/_disable-warnings.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/settings/_grid.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/libs/neat/settings/_visual-grid.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/utilities/_animations.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/utilities/_extends.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/utilities/_mixins.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/utilities/_reset.scss (100%) rename {openassessment => src/openassessment}/xblock/static/sass/xb/utilities/_variables.scss (100%) rename {openassessment => src/openassessment}/xblock/static/xml/censorship_rubric_example.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/file_upload_compat.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/file_upload_custom.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/file_upload_image_only.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/file_upload_pdf_and_image.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/leaderboard.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/leaderboard_custom.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/poverty_peer_only_example.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/poverty_rubric_example.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/poverty_self_only_example.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/promptless_rubric_example.xml (100%) rename {openassessment => src/openassessment}/xblock/static/xml/unicode.xml (100%) rename {openassessment => src/openassessment}/xblock/studio_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/team_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/team_workflow_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/test/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/test/base.py (100%) rename {openassessment => src/openassessment}/xblock/test/data/assessment_combo.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/assessment_due.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/assessment_not_started.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/assessment_steps_reordered.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/assessment_with_multiple_html_prompt.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/assessment_with_single_html_prompt.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/basic_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/basic_scenario_html_prompts_type.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/custom_file_upload.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/date_config_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/dates_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/empty_prompt.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/feedback_only_criterion_grade.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/feedback_only_criterion_peer.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/feedback_only_criterion_self.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/feedback_only_criterion_staff.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/feedback_only_criterion_student_training.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/feedback_per_criterion.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/file_upload_missing_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/file_upload_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_incomplete_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_scenario_peer_only.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_scenario_self_only.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_scenario_self_staff.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_scenario_self_staff_not_required.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_scenario_self_staff_peer.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_scenario_staff_only.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_scenario_staff_peer.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/grade_waiting_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_assessment_combo_order.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_assessment_combo_peer_only.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_assessment_examples.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_assessments.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_dates.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_dates_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_rubric.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_rubrics.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_rubrics_no_prompts.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/invalid_update_xblock.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/leaderboard_show.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/leaderboard_show_allowfiles.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/leaderboard_unavailable.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/line_breaks.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/message_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/message_scenario_no_peer.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/message_scenario_no_self.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/message_scenario_staff_assessment_only.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/message_scenario_student_training.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/neither_response_type.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/optional_assessments_self_only.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/over_grade_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/parse_assessments_xml.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/parse_examples_xml.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/parse_prompts_xml.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/parse_rubric_xml.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/peer_assessment_default_grading_strategy_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/peer_assessment_flex_grading_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/peer_assessment_mean_grading_strategy_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/peer_assessment_median_grading_strategy_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/peer_assessment_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/peer_closed_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/peer_future_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/peer_only_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/prompt_html.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/resolve_dates.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/resolve_dates_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/save_responses.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/save_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/self_assessment_closed.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/self_assessment_open.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/self_assessment_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/self_assessment_unavailable.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/self_only_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/self_then_peer.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/serialize.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/simple_self_staff_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/single_file_upload_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/staff_dates_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/staff_grade_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/student_training.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/student_training_combo.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/student_training_due.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/student_training_future.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/student_training_mixin.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/submission_closed.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/submission_no_deadline.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/submission_open.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/submission_unavailable.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/team_submission.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/team_submission_file_scenario.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/update_from_xml.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/update_from_xml_error.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/update_xblock.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/updated_block.xml (100%) rename {openassessment => src/openassessment}/xblock/test/data/valid_assessment_examples.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/valid_assessments.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/valid_dates.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/valid_rubrics.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/waiting_scenarios.json (100%) rename {openassessment => src/openassessment}/xblock/test/data/zero_points.xml (100%) rename {openassessment => src/openassessment}/xblock/test/test_allow_resubmission.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_config_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_course_items_listing.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_data_conversion.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_defaults.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_export_import.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_grade.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_grade_explanation.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_leaderboard.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_lms.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_load_static.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_message.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_mobile.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_notifications.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_openassessment.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_ora_reminders.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_peer.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_resolve_dates.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_rubric_reuse.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_save_files_descriptions.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_save_response.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_self.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_staff.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_staff_area.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_student_training.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_studio.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_submission.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_team.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_team_workflow_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_templates.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_validation.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_workflow_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/test/test_xml.py (77%) rename {openassessment => src/openassessment}/xblock/ui_mixins/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/handlers_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/serializers.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/views/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/views/peer.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/views/self.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/views/staff.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/views/submission.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/views/training.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/legacy/views_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/assessment_serializers.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/constants/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/constants/error_codes.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/constants/handler_suffixes.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/mixin.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/ora_config_serializer.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/page_context_serializer.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/serializer_utils.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/submission_serializers.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/test_assessment_serializers.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/test_mfe_mixin.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/test_page_context_serializer.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/test_serializers.py (100%) rename {openassessment => src/openassessment}/xblock/ui_mixins/mfe/test_submission_serializers.py (100%) rename {openassessment => src/openassessment}/xblock/utils/__init__.py (100%) rename {openassessment => src/openassessment}/xblock/utils/allow_resubmission.py (100%) rename {openassessment => src/openassessment}/xblock/utils/data_conversion.py (100%) rename {openassessment => src/openassessment}/xblock/utils/defaults.py (100%) rename {openassessment => src/openassessment}/xblock/utils/editor_config.py (100%) rename {openassessment => src/openassessment}/xblock/utils/notifications.py (100%) rename {openassessment => src/openassessment}/xblock/utils/ora_reminders.py (100%) rename {openassessment => src/openassessment}/xblock/utils/resolve_dates.py (100%) rename {openassessment => src/openassessment}/xblock/utils/schema.py (100%) rename {openassessment => src/openassessment}/xblock/utils/user_data.py (100%) rename {openassessment => src/openassessment}/xblock/utils/validation.py (100%) rename {openassessment => src/openassessment}/xblock/utils/xml.py (97%) rename {openassessment => src/openassessment}/xblock/workflow_mixin.py (100%) create mode 100644 uv.lock diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index f337235ea7..0000000000 --- a/.coveragerc +++ /dev/null @@ -1,8 +0,0 @@ -[run] -branch = True - -[report] -include = openassessment/* -omit = - */migrations/* - openassessment/runtime_imports/* diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1847166be..66d138d756 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,15 +2,19 @@ name: Python CI on: push: - branches: [master] + branches: + - master pull_request: branches: - "**" + workflow_call: jobs: run_tests: - name: Tests + name: ${{ matrix.toxenv }} runs-on: ${{ matrix.os }} + permissions: + contents: read strategy: fail-fast: false matrix: @@ -19,33 +23,30 @@ jobs: toxenv: [quality, js, django42, django52] steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - name: setup python - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - with: - python-version: ${{ matrix.python-version }} + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - name: Install pip - run: pip install -r requirements/pip.txt + - name: Setup uv and Python + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + with: + python-version: "${{ matrix.python-version }}" + enable-cache: true - name: Set env variable run: export AWS_CONFIG_FILE=/dev/null - - name: Install Dependencies - run: pip install -r requirements/ci.txt + - name: Install CI dependencies + run: uv sync --group ci - name: Install GNU gettext run: sudo apt-get install gettext - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version-file: ".nvmrc" - name: Run Tests - env: - TOXENV: ${{ matrix.toxenv }} - run: tox + run: uv run tox -e ${{ matrix.toxenv }} - name: Run Coverage if: matrix.python-version == '3.12' && matrix.toxenv=='django42' diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml deleted file mode 100644 index 419ffe1974..0000000000 --- a/.github/workflows/pypi-publish.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Publish package to PyPi - -on: - push: - tags: - - "*" - -jobs: - push: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - name: setup python - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 - with: - python-version: 3.12 - - - name: Install pip - run: pip install -r requirements/pip.txt - - - 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..0c5e6220b0 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,121 @@ +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 + secrets: inherit + permissions: + contents: read + + 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@9a026e9303981c866c3425723009becb2437c757 # v10.6.2 + 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@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + if: steps.release.outputs.released == 'true' + with: + name: dist + 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@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: dist + path: dist/ + + - name: Publish to PyPi + uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 + with: + packages-dir: dist/ diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 276719cb60..cabbbec6a6 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -16,7 +16,10 @@ build: tools: python: "3.12" -# Optionally install extra requirements required to build your docs +# Install doc dependencies from uv.lock using the doc dependency group python: install: - - requirements: requirements/docs.txt + - method: uv + command: sync + groups: + - doc diff --git a/MANIFEST.in b/MANIFEST.in index 7083fa1d81..409009fd04 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,16 +1,17 @@ include LICENSE include AUTHORS include README.rst -include setup.cfg -include openassessment/xblock/static/dist/manifest.json -include openassessment/xblock/static/dist/*.js -include openassessment/xblock/static/dist/*.css -include openassessment/xblock/static/css/*.css -include openassessment/xblock/static/css/lib/backgrid/*.css -include openassessment/xblock/static/js/openassessment*.js -include openassessment/xblock/static/js/lib/backgrid/*.js -include requirements/*.in -recursive-include openassessment/xblock/static/js/src *.js -recursive-include openassessment/templates *.html *.underscore -recursive-include openassessment/locale *.po -recursive-include openassessment/locale *.mo +include src/openassessment/xblock/static/dist/manifest.json +include src/openassessment/xblock/static/dist/*.js +include src/openassessment/xblock/static/dist/*.css +include src/openassessment/xblock/static/css/*.css +include src/openassessment/xblock/static/css/lib/backgrid/*.css +include src/openassessment/xblock/static/js/openassessment*.js +include src/openassessment/xblock/static/js/lib/backgrid/*.js +recursive-include src/openassessment/xblock/static/js/src *.js +recursive-include src/openassessment/templates *.html *.underscore +recursive-include src/openassessment/locale *.po +recursive-include src/openassessment/locale *.mo +prune .github +prune htmlcov +exclude .coverage coverage.xml diff --git a/Makefile b/Makefile index a2931aa6c5..5ceb074262 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ -.PHONY: help install-python install-js install-test install \ +.PHONY: help install-js install \ update-npm-requirements static \ extract_translations compile_translations generate_dummy_translations validate_translations \ detect_changed_source_translations pull_translations push_translations check_translations_up_to_date \ quality test-python render-templates test-js test-js-debug test test-acceptance test-a11y test-sandbox \ - compile-requirements install-osx-requirements + requirements compile-requirements upgrade .DEFAULT_GOAL := help @@ -12,10 +12,10 @@ help: ## display this help message @perl -nle'print $& if m{^[a-zA-Z_-]+:.*?## .*$$}' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m %-25s\033[0m %s\n", $$1, $$2}' clean: ## remove generated byte code, coverage reports, and build artifacts - find openassessment/ -name '__pycache__' -exec rm -rf {} + - find openassessment/ -name '*.pyc' -exec rm -f {} + - find openassessment/ -name '*.pyo' -exec rm -f {} + - find openassessment/ -name '*~' -exec rm -f {} + + find src/openassessment/ -name '__pycache__' -exec rm -rf {} + + find src/openassessment/ -name '*.pyc' -exec rm -f {} + + find src/openassessment/ -name '*.pyo' -exec rm -f {} + + find src/openassessment/ -name '*~' -exec rm -f {} + coverage erase rm -fr build/ rm -fr dist/ @@ -25,59 +25,28 @@ clean: ## remove generated byte code, coverage reports, and build artifacts # Install commands ################## -install-python: ## Install python dependencies - pip install -r requirements/base.txt --only-binary=lxml - install-js: ## install JavaScript dependencies npm install -install-test: ## install requirements for tests - pip install -r requirements/test.txt - python setup.py develop --quiet # XBlock plugin (openassessment) has to be installed via entry_points. - -install: install-python install-js install-test static ## install all dependencies - -COMMON_CONSTRAINTS_TXT=requirements/common_constraints.txt -.PHONY: $(COMMON_CONSTRAINTS_TXT) -$(COMMON_CONSTRAINTS_TXT): - wget -O "$(@)" https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt || touch "$(@)" - echo "$(COMMON_CONSTRAINTS_TEMP_COMMENT)" | cat - $(@) > temp && mv temp $(@) - -compile-requirements: export CUSTOM_COMPILE_COMMAND=make upgrade -compile-requirements: $(COMMON_CONSTRAINTS_TXT) ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in - # global common_constraints has this pin. - sed 's/django-simple-history==3.0.0//g' requirements/common_constraints.txt > requirements/common_constraints.tmp - mv requirements/common_constraints.tmp requirements/common_constraints.txt - pip install -qr requirements/pip-tools.txt - pip-compile ${COMPILE_OPTS} --allow-unsafe -o requirements/pip.txt requirements/pip.in - pip-compile ${COMPILE_OPTS} -o requirements/pip-tools.txt requirements/pip-tools.in - pip install -qr requirements/pip.txt - pip install -qr requirements/pip-tools.txt - pip-compile ${COMPILE_OPTS} --allow-unsafe -o requirements/base.txt requirements/base.in - pip-compile ${COMPILE_OPTS} -o requirements/test.txt requirements/test.in - pip-compile ${COMPILE_OPTS} --allow-unsafe -o requirements/quality.txt requirements/quality.in - pip-compile ${COMPILE_OPTS} -o requirements/test-acceptance.txt requirements/test-acceptance.in - pip-compile ${COMPILE_OPTS} -o requirements/tox.txt requirements/tox.in - pip-compile ${COMPILE_OPTS} --allow-unsafe -o requirements/ci.txt requirements/ci.in - pip-compile ${COMPILE_OPTS} -o requirements/docs.txt requirements/docs.in - # Delete django pin from test requirements to avoid tox version collision - sed -i.tmp '/^[d|D]jango==/d' requirements/test.txt - # Delete extra metadata that causes build to fail - sed -i.tmp '/^--index-url/d' requirements/*.txt - sed -i.tmp '/^--extra-index-url/d' requirements/*.txt - sed -i.tmp '/^--trusted-host/d' requirements/*.txt - # Delete temporary files - rm requirements/*.txt.tmp - -upgrade: ## update the pip requirements files to use the latest releases satisfying our constraints - $(MAKE) compile-requirements COMPILE_OPTS="--upgrade" +install: install-js static ## install all dependencies + uv sync --group dev + +requirements: ## sync the Python dev environment + uv sync --group dev + +compile-requirements: ## regenerate uv.lock from pyproject.toml + uv lock + +upgrade: ## upgrade all dependencies to the latest allowed versions + uv run --with edx-lint edx_lint write_uv_constraints pyproject.toml + uv lock --upgrade ############################## # Generate js/css output files ############################## -STATIC_JS = openassessment/xblock/static/js -STATIC_CSS = openassessment/xblock/static/css +STATIC_JS = src/openassessment/xblock/static/js +STATIC_CSS = src/openassessment/xblock/static/css update-npm-requirements: ## update NPM requrements npm update --silent @@ -92,20 +61,20 @@ static: ## Webpack JavaScript and SASS source files ####################### extract_translations: ## creates the django-partial.po & django-partial.mo files - cd ./openassessment && django-admin makemessages -l en -v1 -d django - cd ./openassessment && django-admin makemessages -l en -v1 -d djangojs + cd ./src/openassessment && django-admin makemessages -l en -v1 -d django + cd ./src/openassessment && django-admin makemessages -l en -v1 -d djangojs compile_translations: ## compiles the *.po & *.mo files - cd ./openassessment/ && i18n_tool generate -v && cd .. + cd ./src/openassessment/ && i18n_tool generate -v && cd ../.. generate_dummy_translations: ## generate dummy translations - i18n_tool dummy + cd ./src/openassessment/ && i18n_tool dummy validate_translations: ## Test translation files - cd ./openassessment/ && i18n_tool validate -v + cd ./src/openassessment/ && i18n_tool validate -v detect_changed_source_translations: ## check if translation files are up-to-date - i18n_tool changed + cd ./src/openassessment/ && i18n_tool changed pull_translations: ## pull translations from Transifex tx pull -a -f -t --mode reviewed --minimum-perc=1 @@ -125,7 +94,7 @@ quality: ## Run linting and code quality checks ./scripts/run-pylint.sh test-python: ## Run Python tests - pytest + uv run tox -e django52 render-templates: ## Render HTML templates ./scripts/render-templates.sh diff --git a/karma.conf.js b/karma.conf.js index e0baf16c0f..423c223959 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,11 +1,18 @@ // Karma configuration +const path = require('path'); const webpackConfig = require('./webpack.prod.config.js'); +// Use process.cwd() (guaranteed to be project root when `npm test` runs) to compute +// absolute paths for files outside the basePath (node_modules, require-config.js). +// This avoids any path traversal issues since basePath (src/openassessment/xblock/static) +// is 3 levels deep from src/, not the project root. +const projectRoot = process.cwd(); + module.exports = function(config) { config.set({ // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: 'openassessment/xblock/static', + basePath: 'src/openassessment/xblock/static', plugins: [ @@ -33,17 +40,19 @@ module.exports = function(config) { 'js/lib/jquery.timepicker.min.js', 'js/lib/jquery-ui-1.10.4.min.js', 'js/lib/underscore-min.js', - '../../../node_modules/@babel/polyfill/dist/polyfill.js', - '../../../node_modules/backbone/backbone.js', - '../../../node_modules/backgrid/lib/backgrid.min.js', - '../../../node_modules/requirejs/require.js', - '../../../require-config.js', + // Use absolute paths from projectRoot for files outside src/openassessment/ (node_modules, + // require-config.js) since basePath is 3 levels deep from src/, not the project root. + path.resolve(projectRoot, 'node_modules/@babel/polyfill/dist/polyfill.js'), + path.resolve(projectRoot, 'node_modules/backbone/backbone.js'), + path.resolve(projectRoot, 'node_modules/backgrid/lib/backgrid.min.js'), + path.resolve(projectRoot, 'node_modules/requirejs/require.js'), + path.resolve(projectRoot, 'require-config.js'), { - pattern: '../../../node_modules/moment-timezone/builds/moment-timezone-with-data.min.js', + pattern: path.resolve(projectRoot, 'node_modules/moment-timezone/builds/moment-timezone-with-data.min.js'), served: true, included: false }, { - pattern: '../../../node_modules/moment/min/moment-with-locales.min.js', + pattern: path.resolve(projectRoot, 'node_modules/moment/min/moment-with-locales.min.js'), served: true, included: false }, // diff --git a/openassessment/__init__.py b/openassessment/__init__.py deleted file mode 100644 index 2635ba37d3..0000000000 --- a/openassessment/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -""" -Initialization Information for Open Assessment Module -""" - -__version__ = '7.1.0' diff --git a/package.json b/package.json index 26c671ef74..f44e07b166 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "dev": "fedx-scripts webpack --config webpack.dev.config.js", "start": "fedx-scripts webpack-dev-server --progress", "test": "./node_modules/karma/bin/karma start --reporters spec,coverage", - "lint": "fedx-scripts eslint --ext .jsx,.js openassessment/xblock/static/js/src/", - "lint-fix": "fedx-scripts eslint --ext .jsx,.js openassessment/xblock/static/js/src/ --fix" + "lint": "fedx-scripts eslint --ext .jsx,.js src/openassessment/xblock/static/js/src/", + "lint-fix": "fedx-scripts eslint --ext .jsx,.js src/openassessment/xblock/static/js/src/ --fix" }, "overrides": { "@edx/frontend-build": { diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000..f65f84cd65 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,214 @@ +[build-system] +requires = ["setuptools", "setuptools-scm>8.1"] +build-backend = "setuptools.build_meta" + +[project] +name = "ora2" +description = "edx-ora2" +readme = "README.rst" +license = "AGPL-3.0-only" +license-files = ["LICENSE"] +authors = [ + { name = "Open edX Project", email = "oscm@openedx.org" } +] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Framework :: Django", + "Framework :: Django :: 4.2", + "Framework :: Django :: 5.2", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.12", +] +requires-python = ">=3.12" +dependencies = [ + "bleach>=6.0.0", + "boto3", + "defusedxml", + "django>=4.2", + "django-model-utils", + "django-simple-history", + "djangorestframework", + "edx-django-utils", + "edx-i18n-tools", + "edx-opaque-keys", + "edx-submissions", + "edx-toggles", + "html5lib", + "jsonfield", + "lazy", + "lxml", + "openedx-events", + "openedx-filters", + "path.py", + "python-dateutil", + "python-swiftclient", + "pytz", + "voluptuous", + "XBlock", +] +dynamic = ["version"] + +[project.urls] +Homepage = "https://github.com/openedx/edx-ora2" + +[project.entry-points."xblock.v1"] +openassessment = "openassessment.xblock.openassessmentblock:OpenAssessmentBlock" + +[tool.setuptools_scm] +version_scheme = "only-version" +local_scheme = "no-local-version" +# Dummy version number for when .git isn't accessible. +# This happens, for example, when bind-mounting into a Docker image. +fallback_version = "0.0.0.dev0" + +[tool.setuptools.packages.find] +where = ["src"] +include = ["openassessment*"] +exclude = ["*.tests", "*.tests.*"] + +[tool.setuptools.package-data] +# locale/ is a symlink to conf/locale/ — include the real path instead +# (setuptools cannot copy symlinked directories into the wheel) +"openassessment" = [ + "conf/locale/**", + "templates/**", + "xblock/static/**", +] + +[tool.setuptools.exclude-package-data] +"*" = ["tests*", "*.tests*", "spec*", "*.spec*"] + +[tool.coverage.run] +branch = true +source_pkgs = ["openassessment"] +omit = [ + "*/tests/*", + "*/migrations/*", + "*/__pycache__/*", + "*/settings.py", + "openassessment/runtime_imports/*", +] + +[tool.coverage.report] +show_missing = true +exclude_lines = [ + "pragma: no cover", + "def __repr__", + "raise AssertionError", + "raise NotImplementedError", + "if __name__ == .__main__.:", + "if TYPE_CHECKING:", +] + +[tool.coverage.html] +directory = "htmlcov" + +[dependency-groups] +# Framework-independent test dependencies +test-base = [ + "celery", + "coverage", + "ddt", + "factory-boy", + "freezegun", + "mock", + "more-itertools", + "moto", + "pytest", + "pytest-cov", + "pytest-django", + "testfixtures", + "xblock-sdk", +] +# Default test env: current supported Django version +# To add a new Django version: add a group below (e.g. django60), add it to conflicts, +# and add a tox env + CI matrix entry. +test = [ + { include-group = "test-base" }, + "Django>=5.2,<6.0", +] +# Legacy Django 4.2 support +django42 = [ + { include-group = "test-base" }, + "Django>=4.2,<5.0", +] +quality = [ + { include-group = "test" }, + "edx-lint", + "pycodestyle", + "pyinstrument", +] +doc = [ + { include-group = "test" }, + "build", + "doc8", + "sphinx", + "sphinx-autobuild", + "sphinx-book-theme", + "sphinx-copybutton", + "sphinxcontrib-mermaid", + "twine", +] +# Minimal group for CI bootstrap — install this, then call uv run tox +ci = [ + "tox", + "tox-uv>=1", +] +dev = [ + { include-group = "quality" }, + { include-group = "ci" }, + { include-group = "doc" }, + "coveralls", +] + +[tool.uv] +package = true +default-groups = [] +# test and django42 both pin a Django version — they can't be resolved together. +# Install one at a time: uv sync --group test OR uv sync --group django42. +conflicts = [ + [ + { group = "test" }, + { group = "django42" }, + ], +] + +# DO NOT EDIT constraint-dependencies DIRECTLY. +# This list is managed by `edx_lint write_uv_constraints` +# and will be overwritten the next time `make upgrade` is run. +# - GLOBAL constraints: edit edx_lint/files/common_constraints.txt +# - REPO-SPECIFIC constraints: edit [tool.edx_lint].uv_constraints in this file +constraint-dependencies = [ + "Django<6.0", + "elasticsearch<7.14.0", + "ddt==1.0.0", + "freezegun<=0.3.14", + "moto<5.0", +] +[tool.edx_lint] +# Repo-specific version overrides — machine-managed via edx_lint write_uv_constraints. +# Do not edit [tool.uv].constraint-dependencies directly; edit this list instead. +uv_constraints = [ + "ddt==1.0.0", # Test failures at versions > 1.0.0 + "freezegun<=0.3.14", # Test failures on 0.3.15 + "moto<5.0", # Moto latest version has breaking changes; tests need fixing +] + +[tool.semantic_release] +# Version is managed by setuptools-scm via git tags — no static version_toml field. +# build_command uses python -m build (not uv build) because the PSR action environment +# does not have uv available. +build_command = "python -m pip install --upgrade build && SETUPTOOLS_SCM_PRETEND_VERSION=$NEW_VERSION python -m build" + +[tool.isort] +line_length = 120 +known_third_party = ["ddt", "mock"] +known_django = ["django"] +known_djangoapp = ["jsonfield", "model_utils"] +known_edx = [] +known_first_party = ["openassessment"] +sections = ["FUTURE", "STDLIB", "THIRDPARTY", "DJANGO", "DJANGOAPP", "EDX", "FIRSTPARTY", "LOCALFOLDER"] +force_sort_within_sections = true diff --git a/require-config.js b/require-config.js index 02aadf4d8e..522fa0ca11 100644 --- a/require-config.js +++ b/require-config.js @@ -37,6 +37,15 @@ // the Travis server, devstack, and staging/production servers all place the // node_module files differently in absolute paths - this is a way to retrieve the // path to the Jasmine req's as nicely as possible + // + // When running under karma (e.g. with uv editable install), require-config.js may + // be served via an absolute-path URL (/absolute/...) rather than /base/. In that + // case the src-based calculation returns a filesystem path as baseUrl, which causes + // RequireJS to make requests to non-existent URLs. Use /base/ directly when running + // under karma so RequireJS is configured with the correct URL scheme. + if (window.__karma__) { + return '/base/'; + } var scripts = document.getElementsByTagName("script"); var fullTag = $(scripts[scripts.length-1]); var baseUrl = fullTag.attr('src').split(['require-config'])[0]; diff --git a/requirements/base.in b/requirements/base.in deleted file mode 100644 index bfcaa2bc9e..0000000000 --- a/requirements/base.in +++ /dev/null @@ -1,32 +0,0 @@ -# Core requirements for using this application --c constraints.txt - -# edX Internal Requirements -edx-i18n-tools -edx-submissions -edx-django-utils -edx-toggles -djangorestframework -Xblock -edx-opaque-keys -openedx-filters -openedx-events - -django -django-simple-history - -# Third Party Requirements -bleach>=6.0.0 -html5lib -boto3 -python-swiftclient -defusedxml -django-model-utils -jsonfield -lazy -lxml -openedx-events -path.py -python-dateutil -pytz -voluptuous diff --git a/requirements/base.txt b/requirements/base.txt deleted file mode 100644 index b99ab78edf..0000000000 --- a/requirements/base.txt +++ /dev/null @@ -1,214 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -appdirs==1.4.4 - # via fs -asgiref==3.11.1 - # via django -attrs==26.1.0 - # via openedx-events -bleach==6.3.0 - # via -r requirements/base.in -boto3==1.43.22 - # via -r requirements/base.in -botocore==1.43.22 - # via - # boto3 - # s3transfer -certifi==2026.5.20 - # via requests -cffi==2.0.0 - # via pynacl -charset-normalizer==3.4.7 - # via requests -click==8.4.1 - # via - # code-annotations - # edx-django-utils -code-annotations==3.0.0 - # via edx-toggles -defusedxml==0.7.1 - # via -r requirements/base.in -django==5.2.15 - # via - # -c requirements/common_constraints.txt - # -r requirements/base.in - # django-crum - # django-model-utils - # django-simple-history - # django-waffle - # djangorestframework - # edx-django-release-util - # edx-django-utils - # edx-i18n-tools - # edx-submissions - # edx-toggles - # jsonfield - # openedx-events - # openedx-filters -django-crum==0.7.9 - # via - # edx-django-utils - # edx-toggles -django-model-utils==5.0.0 - # via - # -r requirements/base.in - # edx-submissions -django-simple-history==3.11.0 - # via -r requirements/base.in -django-waffle==5.0.0 - # via - # edx-django-utils - # edx-toggles -djangorestframework==3.17.1 - # via - # -r requirements/base.in - # edx-submissions -dnspython==2.8.0 - # via pymongo -edx-ccx-keys==2.0.2 - # via openedx-events -edx-django-release-util==1.5.0 - # via edx-submissions -edx-django-utils==8.0.1 - # via - # -r requirements/base.in - # edx-toggles - # openedx-events -edx-i18n-tools==2.0.0 - # via -r requirements/base.in -edx-opaque-keys[django]==4.0.0 - # via - # -r requirements/base.in - # edx-ccx-keys - # openedx-events - # openedx-filters -edx-submissions==4.0.0 - # via -r requirements/base.in -edx-toggles==6.0.0 - # via -r requirements/base.in -fastavro==1.12.2 - # via openedx-events -fs==2.4.16 - # via xblock -html5lib==1.1 - # via -r requirements/base.in -idna==3.18 - # via requests -jinja2==3.1.6 - # via code-annotations -jmespath==1.1.0 - # via - # boto3 - # botocore -jsonfield==3.2.0 - # via - # -r requirements/base.in - # edx-submissions -lazy==1.6 - # via -r requirements/base.in -lxml[html-clean]==6.1.1 - # via - # -r requirements/base.in - # edx-i18n-tools - # lxml-html-clean - # xblock -lxml-html-clean==0.4.5 - # via lxml -mako==1.3.12 - # via xblock -markupsafe==3.0.3 - # via - # jinja2 - # mako - # xblock -openedx-events==11.2.0 - # via -r requirements/base.in -openedx-filters==3.4.1 - # via -r requirements/base.in -path==16.16.0 - # via - # edx-i18n-tools - # path-py -path-py==12.5.0 - # via -r requirements/base.in -polib==1.2.0 - # via edx-i18n-tools -psutil==7.2.2 - # via edx-django-utils -pycparser==3.0 - # via cffi -pymongo==4.17.0 - # via edx-opaque-keys -pynacl==1.6.2 - # via edx-django-utils -python-dateutil==2.9.0.post0 - # via - # -r requirements/base.in - # botocore - # xblock -python-slugify==8.0.4 - # via code-annotations -python-swiftclient==4.10.0 - # via -r requirements/base.in -pytz==2026.2 - # via - # -r requirements/base.in - # edx-submissions - # xblock -pyyaml==6.0.3 - # via - # code-annotations - # edx-django-release-util - # edx-i18n-tools - # xblock -requests==2.34.2 - # via python-swiftclient -s3transfer==0.18.0 - # via boto3 -simplejson==4.1.1 - # via xblock -six==1.17.0 - # via - # edx-ccx-keys - # edx-django-release-util - # fs - # html5lib - # python-dateutil -sqlparse==0.5.5 - # via django -stevedore==5.8.0 - # via - # code-annotations - # edx-django-utils - # edx-opaque-keys -text-unidecode==1.3 - # via python-slugify -typing-extensions==4.15.0 - # via edx-opaque-keys -urllib3==2.7.0 - # via - # botocore - # requests -voluptuous==0.16.0 - # via -r requirements/base.in -web-fragments==4.0.0 - # via xblock -webencodings==0.5.1 - # via - # bleach - # html5lib -webob==1.8.10 - # via xblock -xblock==6.1.0 - # via -r requirements/base.in - -# The following packages are considered to be unsafe in a requirements file: -setuptools==82.0.1 - # via - # fs - # openedx-events - # openedx-filters diff --git a/requirements/ci.in b/requirements/ci.in deleted file mode 100644 index 079c1ce83d..0000000000 --- a/requirements/ci.in +++ /dev/null @@ -1,5 +0,0 @@ --c constraints.txt --r tox.txt - -coveralls -setuptools diff --git a/requirements/ci.txt b/requirements/ci.txt deleted file mode 100644 index 97e21a5bd9..0000000000 --- a/requirements/ci.txt +++ /dev/null @@ -1,90 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -annotated-doc==0.0.4 - # via typer -cachetools==7.1.4 - # via - # -r requirements/tox.txt - # tox -certifi==2026.5.20 - # via requests -charset-normalizer==3.4.7 - # via requests -colorama==0.4.6 - # via - # -r requirements/tox.txt - # tox -coverage[toml]==7.14.1 - # via coveralls -coveralls==4.1.0 - # via -r requirements/ci.in -distlib==0.4.1 - # via - # -r requirements/tox.txt - # virtualenv -filelock==3.29.1 - # via - # -r requirements/tox.txt - # python-discovery - # tox - # virtualenv -idna==3.18 - # via requests -markdown-it-py==4.2.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -packaging==26.2 - # via - # -r requirements/tox.txt - # pyproject-api - # tox -platformdirs==4.10.0 - # via - # -r requirements/tox.txt - # python-discovery - # tox - # virtualenv -pluggy==1.6.0 - # via - # -r requirements/tox.txt - # tox -pygments==2.20.0 - # via rich -pyproject-api==1.10.1 - # via - # -r requirements/tox.txt - # tox -python-discovery==1.4.0 - # via - # -r requirements/tox.txt - # tox - # virtualenv -requests==2.34.2 - # via coveralls -rich==15.0.0 - # via typer -shellingham==1.5.4 - # via typer -tomli-w==1.2.0 - # via - # -r requirements/tox.txt - # tox -tox==4.55.1 - # via -r requirements/tox.txt -typer==0.26.7 - # via coveralls -urllib3==2.7.0 - # via requests -virtualenv==21.4.2 - # via - # -r requirements/tox.txt - # tox - -# The following packages are considered to be unsafe in a requirements file: -setuptools==82.0.1 - # via -r requirements/ci.in diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt deleted file mode 100644 index 367be40f06..0000000000 --- a/requirements/common_constraints.txt +++ /dev/null @@ -1,21 +0,0 @@ - -# A central location for most common version constraints -# (across edx repos) for pip-installation. -# -# Similar to other constraint files 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 it is a good -# idea to pin this package across all edx repos, 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: Changes to this file will automatically be used by other repos, referencing -# this file from Github directly. It does not require packaging in edx-lint. - -# using LTS django version -Django<6.0 - -# elasticsearch>=7.14.0 includes breaking changes in it which caused issues in discovery upgrade process. -# elastic search changelog: https://www.elastic.co/guide/en/enterprise-search/master/release-notes-7.14.0.html -# See https://github.com/openedx/edx-platform/issues/35126 for more info -elasticsearch<7.14.0 diff --git a/requirements/constraints.txt b/requirements/constraints.txt deleted file mode 100644 index cd30cf2eb1..0000000000 --- a/requirements/constraints.txt +++ /dev/null @@ -1,13 +0,0 @@ -# Version constraints for pip-installation. - --c common_constraints.txt - -# Test dependencies -ddt==1.0.0 # Test failures at versions > 1.0.0 -freezegun<=0.3.14 # Test failures on 0.3.15 -pylint-django<2.6.0 # Quality fails with infinite recursion errors -# Moto latest version has breaking changes. Needs the tests to be fixed. -moto<5.0 - -# backports.zoneinfo is only needed for Python < 3.9 -backports.zoneinfo; python_version<'3.9' diff --git a/requirements/docs.in b/requirements/docs.in deleted file mode 100644 index 1284bcfefa..0000000000 --- a/requirements/docs.in +++ /dev/null @@ -1,8 +0,0 @@ -# Requirements to build the documentation. --c constraints.txt - -sphinx -sphinx-book-theme -sphinx-copybutton -sphinx-autobuild -sphinxcontrib-mermaid diff --git a/requirements/docs.txt b/requirements/docs.txt deleted file mode 100644 index e367323ff9..0000000000 --- a/requirements/docs.txt +++ /dev/null @@ -1,109 +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 -anyio==4.13.0 - # via - # starlette - # watchfiles -babel==2.18.0 - # via - # pydata-sphinx-theme - # sphinx -beautifulsoup4==4.14.3 - # via pydata-sphinx-theme -certifi==2026.5.20 - # via requests -charset-normalizer==3.4.7 - # via requests -click==8.4.1 - # via uvicorn -colorama==0.4.6 - # via sphinx-autobuild -docutils==0.22.4 - # via - # pydata-sphinx-theme - # sphinx -h11==0.16.0 - # via uvicorn -idna==3.18 - # via - # anyio - # requests -imagesize==2.0.0 - # via sphinx -jinja2==3.1.6 - # via - # sphinx - # sphinxcontrib-mermaid -markupsafe==3.0.3 - # via jinja2 -packaging==26.2 - # via sphinx -pydata-sphinx-theme==0.16.1 - # via sphinx-book-theme -pygments==2.20.0 - # via - # accessible-pygments - # pydata-sphinx-theme - # sphinx -pyyaml==6.0.3 - # via sphinxcontrib-mermaid -requests==2.34.2 - # via sphinx -roman-numerals==4.1.0 - # via sphinx -snowballstemmer==3.1.1 - # via sphinx -soupsieve==2.8.4 - # via beautifulsoup4 -sphinx==9.1.0 - # via - # -r requirements/docs.in - # pydata-sphinx-theme - # sphinx-autobuild - # sphinx-book-theme - # sphinx-copybutton - # sphinxcontrib-mermaid -sphinx-autobuild==2025.8.25 - # via -r requirements/docs.in -sphinx-book-theme==1.2.0 - # via -r requirements/docs.in -sphinx-copybutton==0.5.2 - # via -r requirements/docs.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.0.2 - # via -r requirements/docs.in -sphinxcontrib-qthelp==2.0.0 - # via sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via sphinx -starlette==1.2.1 - # via sphinx-autobuild -typing-extensions==4.15.0 - # via - # anyio - # beautifulsoup4 - # pydata-sphinx-theme - # starlette -urllib3==2.7.0 - # via requests -uvicorn==0.49.0 - # via sphinx-autobuild -watchfiles==1.2.0 - # via sphinx-autobuild -websockets==16.0 - # via sphinx-autobuild diff --git a/requirements/pip-tools.in b/requirements/pip-tools.in deleted file mode 100644 index 9db429edc7..0000000000 --- a/requirements/pip-tools.in +++ /dev/null @@ -1,7 +0,0 @@ -# Allows us to generate version pins with `pip-compile`, and install -# them deterministically with `pip-sync`. -# `pip-compile` itself is used to generate pip-tools.txt. - --c constraints.txt - -pip-tools diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt deleted file mode 100644 index ae6076a05e..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.5.0 - # via pip-tools -click==8.4.1 - # via pip-tools -packaging==26.2 - # via - # build - # wheel -pip-tools==7.5.3 - # via -r requirements/pip-tools.in -pyproject-hooks==1.2.0 - # via - # build - # pip-tools -wheel==0.47.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 f3c1555080..0000000000 --- a/requirements/pip.txt +++ /dev/null @@ -1,16 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -packaging==26.2 - # via wheel -wheel==0.47.0 - # via -r requirements/pip.in - -# The following packages are considered to be unsafe in a requirements file: -pip==26.1.2 - # via -r requirements/pip.in -setuptools==82.0.1 - # via -r requirements/pip.in diff --git a/requirements/quality.in b/requirements/quality.in deleted file mode 100644 index 07339ac7bb..0000000000 --- a/requirements/quality.in +++ /dev/null @@ -1,8 +0,0 @@ -# Requirements for code quality checks --c constraints.txt - --r test.txt # Testing dependencies to allow pylint to check imports - -edx-lint -pycodestyle - diff --git a/requirements/quality.txt b/requirements/quality.txt deleted file mode 100644 index e03c9bd915..0000000000 --- a/requirements/quality.txt +++ /dev/null @@ -1,563 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -amqp==5.3.1 - # via - # -r requirements/test.txt - # kombu -appdirs==1.4.4 - # via - # -r requirements/test.txt - # fs -arrow==1.4.0 - # via - # -r requirements/test.txt - # cookiecutter -asgiref==3.11.1 - # via - # -r requirements/test.txt - # django -astroid==3.3.11 - # via - # pylint - # pylint-celery -attrs==26.1.0 - # via - # -r requirements/test.txt - # openedx-events -billiard==4.2.4 - # via - # -r requirements/test.txt - # celery -binaryornot==0.6.0 - # via - # -r requirements/test.txt - # cookiecutter -bleach==6.3.0 - # via -r requirements/test.txt -boto3==1.43.22 - # via - # -r requirements/test.txt - # fs-s3fs - # moto -botocore==1.43.22 - # via - # -r requirements/test.txt - # boto3 - # moto - # s3transfer -cachetools==7.1.4 - # via - # -r requirements/test.txt - # tox -celery==5.6.3 - # via -r requirements/test.txt -certifi==2026.5.20 - # via - # -r requirements/test.txt - # requests -cffi==2.0.0 - # via - # -r requirements/test.txt - # cryptography - # pynacl -charset-normalizer==3.4.7 - # via - # -r requirements/test.txt - # requests -click==8.4.1 - # via - # -r requirements/test.txt - # celery - # click-didyoumean - # click-log - # click-plugins - # click-repl - # code-annotations - # cookiecutter - # edx-django-utils - # edx-lint -click-didyoumean==0.3.1 - # via - # -r requirements/test.txt - # celery -click-log==0.4.0 - # via edx-lint -click-plugins==1.1.1.2 - # via - # -r requirements/test.txt - # celery -click-repl==0.3.0 - # via - # -r requirements/test.txt - # celery -code-annotations==3.0.0 - # via - # -r requirements/test.txt - # edx-lint - # edx-toggles -colorama==0.4.6 - # via - # -r requirements/test.txt - # tox -cookiecutter==2.7.1 - # via - # -r requirements/test.txt - # xblock-sdk -coverage[toml]==7.14.1 - # via - # -r requirements/test.txt - # pytest-cov -cryptography==48.0.0 - # via - # -r requirements/test.txt - # moto -ddt==1.0.0 - # via - # -c requirements/constraints.txt - # -r requirements/test.txt -defusedxml==0.7.1 - # via -r requirements/test.txt -dill==0.4.1 - # via pylint -distlib==0.4.1 - # via - # -r requirements/test.txt - # virtualenv -django==5.2.15 - # via - # -c requirements/common_constraints.txt - # -r requirements/test.txt - # django-crum - # django-model-utils - # django-simple-history - # django-waffle - # djangorestframework - # edx-django-release-util - # edx-django-utils - # edx-i18n-tools - # edx-submissions - # edx-toggles - # jsonfield - # openedx-events - # openedx-filters - # xblock-sdk -django-crum==0.7.9 - # via - # -r requirements/test.txt - # edx-django-utils - # edx-toggles -django-model-utils==5.0.0 - # via - # -r requirements/test.txt - # edx-submissions -django-simple-history==3.11.0 - # via -r requirements/test.txt -django-waffle==5.0.0 - # via - # -r requirements/test.txt - # edx-django-utils - # edx-toggles -djangorestframework==3.17.1 - # via - # -r requirements/test.txt - # edx-submissions -dnspython==2.8.0 - # via - # -r requirements/test.txt - # pymongo -edx-ccx-keys==2.0.2 - # via - # -r requirements/test.txt - # openedx-events -edx-django-release-util==1.5.0 - # via - # -r requirements/test.txt - # edx-submissions -edx-django-utils==8.0.1 - # via - # -r requirements/test.txt - # edx-toggles - # openedx-events -edx-i18n-tools==2.0.0 - # via -r requirements/test.txt -edx-lint==6.1.0 - # via -r requirements/quality.in -edx-opaque-keys[django]==4.0.0 - # via - # -r requirements/test.txt - # edx-ccx-keys - # openedx-events - # openedx-filters -edx-submissions==4.0.0 - # via -r requirements/test.txt -edx-toggles==6.0.0 - # via -r requirements/test.txt -factory-boy==3.3.3 - # via -r requirements/test.txt -faker==40.21.0 - # via - # -r requirements/test.txt - # factory-boy -fastavro==1.12.2 - # via - # -r requirements/test.txt - # openedx-events -filelock==3.29.1 - # via - # -r requirements/test.txt - # python-discovery - # tox - # virtualenv -freezegun==0.3.14 - # via - # -c requirements/constraints.txt - # -r requirements/test.txt -fs==2.4.16 - # via - # -r requirements/test.txt - # fs-s3fs - # xblock -fs-s3fs==1.1.1 - # via - # -r requirements/test.txt - # xblock-sdk -html5lib==1.1 - # via -r requirements/test.txt -idna==3.18 - # via - # -r requirements/test.txt - # requests -iniconfig==2.3.0 - # via - # -r requirements/test.txt - # pytest -isort==6.1.0 - # via pylint -jinja2==3.1.6 - # via - # -r requirements/test.txt - # code-annotations - # cookiecutter - # moto -jmespath==1.1.0 - # via - # -r requirements/test.txt - # boto3 - # botocore -jsonfield==3.2.0 - # via - # -r requirements/test.txt - # edx-submissions -kombu==5.6.2 - # via - # -r requirements/test.txt - # celery -lazy==1.6 - # via -r requirements/test.txt -lxml[html-clean]==6.1.1 - # via - # -r requirements/test.txt - # edx-i18n-tools - # lxml-html-clean - # xblock - # xblock-sdk -lxml-html-clean==0.4.5 - # via - # -r requirements/test.txt - # lxml -mako==1.3.12 - # via - # -r requirements/test.txt - # xblock -markdown-it-py==4.2.0 - # via - # -r requirements/test.txt - # rich -markupsafe==3.0.3 - # via - # -r requirements/test.txt - # jinja2 - # mako - # werkzeug - # xblock -mccabe==0.7.0 - # via pylint -mdurl==0.1.2 - # via - # -r requirements/test.txt - # markdown-it-py -mock==5.2.0 - # via -r requirements/test.txt -more-itertools==11.1.0 - # via -r requirements/test.txt -moto==4.2.14 - # via - # -c requirements/constraints.txt - # -r requirements/test.txt -openedx-events==11.2.0 - # via -r requirements/test.txt -openedx-filters==3.4.1 - # via -r requirements/test.txt -packaging==26.2 - # via - # -r requirements/test.txt - # kombu - # pyproject-api - # pytest - # tox -path==16.16.0 - # via - # -r requirements/test.txt - # edx-i18n-tools - # path-py -path-py==12.5.0 - # via -r requirements/test.txt -platformdirs==4.10.0 - # via - # -r requirements/test.txt - # pylint - # python-discovery - # tox - # virtualenv -pluggy==1.6.0 - # via - # -r requirements/test.txt - # pytest - # pytest-cov - # tox -polib==1.2.0 - # via - # -r requirements/test.txt - # edx-i18n-tools -prompt-toolkit==3.0.52 - # via - # -r requirements/test.txt - # click-repl -psutil==7.2.2 - # via - # -r requirements/test.txt - # edx-django-utils -pycodestyle==2.14.0 - # via -r requirements/quality.in -pycparser==3.0 - # via - # -r requirements/test.txt - # cffi -pygments==2.20.0 - # via - # -r requirements/test.txt - # pytest - # rich -pylint==3.3.9 - # via - # edx-lint - # pylint-celery - # pylint-django - # pylint-plugin-utils -pylint-celery==0.3 - # via edx-lint -pylint-django==2.5.5 - # via - # -c requirements/constraints.txt - # edx-lint -pylint-plugin-utils==0.9.0 - # via - # pylint-celery - # pylint-django -pymongo==4.17.0 - # via - # -r requirements/test.txt - # edx-opaque-keys -pynacl==1.6.2 - # via - # -r requirements/test.txt - # edx-django-utils -pypng==0.20220715.0 - # via - # -r requirements/test.txt - # xblock-sdk -pyproject-api==1.10.1 - # via - # -r requirements/test.txt - # tox -pytest==9.0.3 - # via - # -r requirements/test.txt - # pytest-cov - # pytest-django -pytest-cov==7.1.0 - # via -r requirements/test.txt -pytest-django==4.12.0 - # via -r requirements/test.txt -python-dateutil==2.9.0.post0 - # via - # -r requirements/test.txt - # arrow - # botocore - # celery - # freezegun - # moto - # xblock -python-discovery==1.4.0 - # via - # -r requirements/test.txt - # tox - # virtualenv -python-slugify==8.0.4 - # via - # -r requirements/test.txt - # code-annotations - # cookiecutter -python-swiftclient==4.10.0 - # via -r requirements/test.txt -pytz==2026.2 - # via - # -r requirements/test.txt - # edx-submissions - # xblock -pyyaml==6.0.3 - # via - # -r requirements/test.txt - # code-annotations - # cookiecutter - # edx-django-release-util - # edx-i18n-tools - # responses - # xblock -requests==2.34.2 - # via - # -r requirements/test.txt - # cookiecutter - # moto - # python-swiftclient - # responses - # xblock-sdk -responses==0.26.1 - # via - # -r requirements/test.txt - # moto -rich==15.0.0 - # via - # -r requirements/test.txt - # cookiecutter -s3transfer==0.18.0 - # via - # -r requirements/test.txt - # boto3 -simplejson==4.1.1 - # via - # -r requirements/test.txt - # xblock - # xblock-sdk -six==1.17.0 - # via - # -r requirements/test.txt - # edx-ccx-keys - # edx-django-release-util - # edx-lint - # freezegun - # fs - # fs-s3fs - # html5lib - # python-dateutil -sqlparse==0.5.5 - # via - # -r requirements/test.txt - # django -stevedore==5.8.0 - # via - # -r requirements/test.txt - # code-annotations - # edx-django-utils - # edx-opaque-keys -testfixtures==12.0.0 - # via -r requirements/test.txt -text-unidecode==1.3 - # via - # -r requirements/test.txt - # python-slugify -tomli-w==1.2.0 - # via - # -r requirements/test.txt - # tox -tomlkit==0.15.0 - # via - # edx-lint - # pylint -tox==4.55.1 - # via -r requirements/test.txt -typing-extensions==4.15.0 - # via - # -r requirements/test.txt - # edx-opaque-keys -tzdata==2026.2 - # via - # -r requirements/test.txt - # arrow - # kombu -tzlocal==5.3.1 - # via - # -r requirements/test.txt - # celery -urllib3==2.7.0 - # via - # -r requirements/test.txt - # botocore - # requests - # responses -vine==5.1.0 - # via - # -r requirements/test.txt - # amqp - # celery - # kombu -virtualenv==21.4.2 - # via - # -r requirements/test.txt - # tox -voluptuous==0.16.0 - # via -r requirements/test.txt -wcwidth==0.7.0 - # via - # -r requirements/test.txt - # prompt-toolkit -web-fragments==4.0.0 - # via - # -r requirements/test.txt - # xblock - # xblock-sdk -webencodings==0.5.1 - # via - # -r requirements/test.txt - # bleach - # html5lib -webob==1.8.10 - # via - # -r requirements/test.txt - # xblock - # xblock-sdk -werkzeug==3.1.8 - # via - # -r requirements/test.txt - # moto -xblock==6.1.0 - # via - # -r requirements/test.txt - # xblock-sdk -xblock-sdk==0.14.0 - # via -r requirements/test.txt -xmltodict==1.0.4 - # via - # -r requirements/test.txt - # moto - -# The following packages are considered to be unsafe in a requirements file: -setuptools==82.0.1 - # via - # fs - # openedx-events - # openedx-filters diff --git a/requirements/test-acceptance.in b/requirements/test-acceptance.in deleted file mode 100644 index 2248356bbd..0000000000 --- a/requirements/test-acceptance.in +++ /dev/null @@ -1,8 +0,0 @@ -# Requirements for acceptance tests --c constraints.txt - --r test.txt - -ddt -pytest -pyinstrument diff --git a/requirements/test-acceptance.txt b/requirements/test-acceptance.txt deleted file mode 100644 index c5d69c5b32..0000000000 --- a/requirements/test-acceptance.txt +++ /dev/null @@ -1,522 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -amqp==5.3.1 - # via - # -r requirements/test.txt - # kombu -appdirs==1.4.4 - # via - # -r requirements/test.txt - # fs -arrow==1.4.0 - # via - # -r requirements/test.txt - # cookiecutter -asgiref==3.11.1 - # via - # -r requirements/test.txt - # django -attrs==26.1.0 - # via - # -r requirements/test.txt - # openedx-events -billiard==4.2.4 - # via - # -r requirements/test.txt - # celery -binaryornot==0.6.0 - # via - # -r requirements/test.txt - # cookiecutter -bleach==6.3.0 - # via -r requirements/test.txt -boto3==1.43.22 - # via - # -r requirements/test.txt - # fs-s3fs - # moto -botocore==1.43.22 - # via - # -r requirements/test.txt - # boto3 - # moto - # s3transfer -cachetools==7.1.4 - # via - # -r requirements/test.txt - # tox -celery==5.6.3 - # via -r requirements/test.txt -certifi==2026.5.20 - # via - # -r requirements/test.txt - # requests -cffi==2.0.0 - # via - # -r requirements/test.txt - # cryptography - # pynacl -charset-normalizer==3.4.7 - # via - # -r requirements/test.txt - # requests -click==8.4.1 - # via - # -r requirements/test.txt - # celery - # click-didyoumean - # click-plugins - # click-repl - # code-annotations - # cookiecutter - # edx-django-utils -click-didyoumean==0.3.1 - # via - # -r requirements/test.txt - # celery -click-plugins==1.1.1.2 - # via - # -r requirements/test.txt - # celery -click-repl==0.3.0 - # via - # -r requirements/test.txt - # celery -code-annotations==3.0.0 - # via - # -r requirements/test.txt - # edx-toggles -colorama==0.4.6 - # via - # -r requirements/test.txt - # tox -cookiecutter==2.7.1 - # via - # -r requirements/test.txt - # xblock-sdk -coverage[toml]==7.14.1 - # via - # -r requirements/test.txt - # pytest-cov -cryptography==48.0.0 - # via - # -r requirements/test.txt - # moto -ddt==1.0.0 - # via - # -c requirements/constraints.txt - # -r requirements/test-acceptance.in - # -r requirements/test.txt -defusedxml==0.7.1 - # via -r requirements/test.txt -distlib==0.4.1 - # via - # -r requirements/test.txt - # virtualenv -django==5.2.15 - # via - # -c requirements/common_constraints.txt - # -r requirements/test.txt - # django-crum - # django-model-utils - # django-simple-history - # django-waffle - # djangorestframework - # edx-django-release-util - # edx-django-utils - # edx-i18n-tools - # edx-submissions - # edx-toggles - # jsonfield - # openedx-events - # openedx-filters - # xblock-sdk -django-crum==0.7.9 - # via - # -r requirements/test.txt - # edx-django-utils - # edx-toggles -django-model-utils==5.0.0 - # via - # -r requirements/test.txt - # edx-submissions -django-simple-history==3.11.0 - # via -r requirements/test.txt -django-waffle==5.0.0 - # via - # -r requirements/test.txt - # edx-django-utils - # edx-toggles -djangorestframework==3.17.1 - # via - # -r requirements/test.txt - # edx-submissions -dnspython==2.8.0 - # via - # -r requirements/test.txt - # pymongo -edx-ccx-keys==2.0.2 - # via - # -r requirements/test.txt - # openedx-events -edx-django-release-util==1.5.0 - # via - # -r requirements/test.txt - # edx-submissions -edx-django-utils==8.0.1 - # via - # -r requirements/test.txt - # edx-toggles - # openedx-events -edx-i18n-tools==2.0.0 - # via -r requirements/test.txt -edx-opaque-keys[django]==4.0.0 - # via - # -r requirements/test.txt - # edx-ccx-keys - # openedx-events - # openedx-filters -edx-submissions==4.0.0 - # via -r requirements/test.txt -edx-toggles==6.0.0 - # via -r requirements/test.txt -factory-boy==3.3.3 - # via -r requirements/test.txt -faker==40.21.0 - # via - # -r requirements/test.txt - # factory-boy -fastavro==1.12.2 - # via - # -r requirements/test.txt - # openedx-events -filelock==3.29.1 - # via - # -r requirements/test.txt - # python-discovery - # tox - # virtualenv -freezegun==0.3.14 - # via - # -c requirements/constraints.txt - # -r requirements/test.txt -fs==2.4.16 - # via - # -r requirements/test.txt - # fs-s3fs - # xblock -fs-s3fs==1.1.1 - # via - # -r requirements/test.txt - # xblock-sdk -html5lib==1.1 - # via -r requirements/test.txt -idna==3.18 - # via - # -r requirements/test.txt - # requests -iniconfig==2.3.0 - # via - # -r requirements/test.txt - # pytest -jinja2==3.1.6 - # via - # -r requirements/test.txt - # code-annotations - # cookiecutter - # moto -jmespath==1.1.0 - # via - # -r requirements/test.txt - # boto3 - # botocore -jsonfield==3.2.0 - # via - # -r requirements/test.txt - # edx-submissions -kombu==5.6.2 - # via - # -r requirements/test.txt - # celery -lazy==1.6 - # via -r requirements/test.txt -lxml[html-clean]==6.1.1 - # via - # -r requirements/test.txt - # edx-i18n-tools - # lxml-html-clean - # xblock - # xblock-sdk -lxml-html-clean==0.4.5 - # via - # -r requirements/test.txt - # lxml -mako==1.3.12 - # via - # -r requirements/test.txt - # xblock -markdown-it-py==4.2.0 - # via - # -r requirements/test.txt - # rich -markupsafe==3.0.3 - # via - # -r requirements/test.txt - # jinja2 - # mako - # werkzeug - # xblock -mdurl==0.1.2 - # via - # -r requirements/test.txt - # markdown-it-py -mock==5.2.0 - # via -r requirements/test.txt -more-itertools==11.1.0 - # via -r requirements/test.txt -moto==4.2.14 - # via - # -c requirements/constraints.txt - # -r requirements/test.txt -openedx-events==11.2.0 - # via -r requirements/test.txt -openedx-filters==3.4.1 - # via -r requirements/test.txt -packaging==26.2 - # via - # -r requirements/test.txt - # kombu - # pyproject-api - # pytest - # tox -path==16.16.0 - # via - # -r requirements/test.txt - # edx-i18n-tools - # path-py -path-py==12.5.0 - # via -r requirements/test.txt -platformdirs==4.10.0 - # via - # -r requirements/test.txt - # python-discovery - # tox - # virtualenv -pluggy==1.6.0 - # via - # -r requirements/test.txt - # pytest - # pytest-cov - # tox -polib==1.2.0 - # via - # -r requirements/test.txt - # edx-i18n-tools -prompt-toolkit==3.0.52 - # via - # -r requirements/test.txt - # click-repl -psutil==7.2.2 - # via - # -r requirements/test.txt - # edx-django-utils -pycparser==3.0 - # via - # -r requirements/test.txt - # cffi -pygments==2.20.0 - # via - # -r requirements/test.txt - # pytest - # rich -pyinstrument==5.1.2 - # via -r requirements/test-acceptance.in -pymongo==4.17.0 - # via - # -r requirements/test.txt - # edx-opaque-keys -pynacl==1.6.2 - # via - # -r requirements/test.txt - # edx-django-utils -pypng==0.20220715.0 - # via - # -r requirements/test.txt - # xblock-sdk -pyproject-api==1.10.1 - # via - # -r requirements/test.txt - # tox -pytest==9.0.3 - # via - # -r requirements/test-acceptance.in - # -r requirements/test.txt - # pytest-cov - # pytest-django -pytest-cov==7.1.0 - # via -r requirements/test.txt -pytest-django==4.12.0 - # via -r requirements/test.txt -python-dateutil==2.9.0.post0 - # via - # -r requirements/test.txt - # arrow - # botocore - # celery - # freezegun - # moto - # xblock -python-discovery==1.4.0 - # via - # -r requirements/test.txt - # tox - # virtualenv -python-slugify==8.0.4 - # via - # -r requirements/test.txt - # code-annotations - # cookiecutter -python-swiftclient==4.10.0 - # via -r requirements/test.txt -pytz==2026.2 - # via - # -r requirements/test.txt - # edx-submissions - # xblock -pyyaml==6.0.3 - # via - # -r requirements/test.txt - # code-annotations - # cookiecutter - # edx-django-release-util - # edx-i18n-tools - # responses - # xblock -requests==2.34.2 - # via - # -r requirements/test.txt - # cookiecutter - # moto - # python-swiftclient - # responses - # xblock-sdk -responses==0.26.1 - # via - # -r requirements/test.txt - # moto -rich==15.0.0 - # via - # -r requirements/test.txt - # cookiecutter -s3transfer==0.18.0 - # via - # -r requirements/test.txt - # boto3 -simplejson==4.1.1 - # via - # -r requirements/test.txt - # xblock - # xblock-sdk -six==1.17.0 - # via - # -r requirements/test.txt - # edx-ccx-keys - # edx-django-release-util - # freezegun - # fs - # fs-s3fs - # html5lib - # python-dateutil -sqlparse==0.5.5 - # via - # -r requirements/test.txt - # django -stevedore==5.8.0 - # via - # -r requirements/test.txt - # code-annotations - # edx-django-utils - # edx-opaque-keys -testfixtures==12.0.0 - # via -r requirements/test.txt -text-unidecode==1.3 - # via - # -r requirements/test.txt - # python-slugify -tomli-w==1.2.0 - # via - # -r requirements/test.txt - # tox -tox==4.55.1 - # via -r requirements/test.txt -typing-extensions==4.15.0 - # via - # -r requirements/test.txt - # edx-opaque-keys -tzdata==2026.2 - # via - # -r requirements/test.txt - # arrow - # kombu -tzlocal==5.3.1 - # via - # -r requirements/test.txt - # celery -urllib3==2.7.0 - # via - # -r requirements/test.txt - # botocore - # requests - # responses -vine==5.1.0 - # via - # -r requirements/test.txt - # amqp - # celery - # kombu -virtualenv==21.4.2 - # via - # -r requirements/test.txt - # tox -voluptuous==0.16.0 - # via -r requirements/test.txt -wcwidth==0.7.0 - # via - # -r requirements/test.txt - # prompt-toolkit -web-fragments==4.0.0 - # via - # -r requirements/test.txt - # xblock - # xblock-sdk -webencodings==0.5.1 - # via - # -r requirements/test.txt - # bleach - # html5lib -webob==1.8.10 - # via - # -r requirements/test.txt - # xblock - # xblock-sdk -werkzeug==3.1.8 - # via - # -r requirements/test.txt - # moto -xblock==6.1.0 - # via - # -r requirements/test.txt - # xblock-sdk -xblock-sdk==0.14.0 - # via -r requirements/test.txt -xmltodict==1.0.4 - # via - # -r requirements/test.txt - # moto - -# 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 2d65218ec7..0000000000 --- a/requirements/test.in +++ /dev/null @@ -1,19 +0,0 @@ -# Requirements for test runs --c constraints.txt - --r base.txt - -coverage # Repeat a test case with multiple data inputs -ddt -factory_boy # Fixture factories for test setup -freezegun # Mock the datetime module to manipulate date functions -mock # Stub out specific code during test runs -pytest -pytest-cov # pytest extension for code coverage statistics -pytest-django # pytest extension for better Django support -moto -testfixtures # Provides a LogCapture utility to be used by tests -tox -more-itertools -xblock-sdk -celery # Celery task queue framework diff --git a/requirements/test.txt b/requirements/test.txt deleted file mode 100644 index 30a92ce417..0000000000 --- a/requirements/test.txt +++ /dev/null @@ -1,451 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -amqp==5.3.1 - # via kombu -appdirs==1.4.4 - # via - # -r requirements/base.txt - # fs -arrow==1.4.0 - # via cookiecutter -asgiref==3.11.1 - # via - # -r requirements/base.txt - # django -attrs==26.1.0 - # via - # -r requirements/base.txt - # openedx-events -billiard==4.2.4 - # via celery -binaryornot==0.6.0 - # via cookiecutter -bleach==6.3.0 - # via -r requirements/base.txt -boto3==1.43.22 - # via - # -r requirements/base.txt - # fs-s3fs - # moto -botocore==1.43.22 - # via - # -r requirements/base.txt - # boto3 - # moto - # s3transfer -cachetools==7.1.4 - # via tox -celery==5.6.3 - # via -r requirements/test.in -certifi==2026.5.20 - # via - # -r requirements/base.txt - # requests -cffi==2.0.0 - # via - # -r requirements/base.txt - # cryptography - # pynacl -charset-normalizer==3.4.7 - # via - # -r requirements/base.txt - # requests -click==8.4.1 - # via - # -r requirements/base.txt - # celery - # click-didyoumean - # click-plugins - # click-repl - # code-annotations - # cookiecutter - # edx-django-utils -click-didyoumean==0.3.1 - # via celery -click-plugins==1.1.1.2 - # via celery -click-repl==0.3.0 - # via celery -code-annotations==3.0.0 - # via - # -r requirements/base.txt - # edx-toggles -colorama==0.4.6 - # via tox -cookiecutter==2.7.1 - # via xblock-sdk -coverage[toml]==7.14.1 - # via - # -r requirements/test.in - # pytest-cov -cryptography==48.0.0 - # via moto -ddt==1.0.0 - # via - # -c requirements/constraints.txt - # -r requirements/test.in -defusedxml==0.7.1 - # via -r requirements/base.txt -distlib==0.4.1 - # via virtualenv - # via - # -c requirements/common_constraints.txt - # -r requirements/base.txt - # django-crum - # django-model-utils - # django-simple-history - # django-waffle - # djangorestframework - # edx-django-release-util - # edx-django-utils - # edx-i18n-tools - # edx-submissions - # edx-toggles - # jsonfield - # openedx-events - # openedx-filters - # xblock-sdk -django-crum==0.7.9 - # via - # -r requirements/base.txt - # edx-django-utils - # edx-toggles -django-model-utils==5.0.0 - # via - # -r requirements/base.txt - # edx-submissions -django-simple-history==3.11.0 - # via -r requirements/base.txt -django-waffle==5.0.0 - # via - # -r requirements/base.txt - # edx-django-utils - # edx-toggles -djangorestframework==3.17.1 - # via - # -r requirements/base.txt - # edx-submissions -dnspython==2.8.0 - # via - # -r requirements/base.txt - # pymongo -edx-ccx-keys==2.0.2 - # via - # -r requirements/base.txt - # openedx-events -edx-django-release-util==1.5.0 - # via - # -r requirements/base.txt - # edx-submissions -edx-django-utils==8.0.1 - # via - # -r requirements/base.txt - # edx-toggles - # openedx-events -edx-i18n-tools==2.0.0 - # via -r requirements/base.txt -edx-opaque-keys[django]==4.0.0 - # via - # -r requirements/base.txt - # edx-ccx-keys - # openedx-events - # openedx-filters -edx-submissions==4.0.0 - # via -r requirements/base.txt -edx-toggles==6.0.0 - # via -r requirements/base.txt -factory-boy==3.3.3 - # via -r requirements/test.in -faker==40.21.0 - # via factory-boy -fastavro==1.12.2 - # via - # -r requirements/base.txt - # openedx-events -filelock==3.29.1 - # via - # python-discovery - # tox - # virtualenv -freezegun==0.3.14 - # via - # -c requirements/constraints.txt - # -r requirements/test.in -fs==2.4.16 - # via - # -r requirements/base.txt - # fs-s3fs - # xblock -fs-s3fs==1.1.1 - # via xblock-sdk -html5lib==1.1 - # via -r requirements/base.txt -idna==3.18 - # via - # -r requirements/base.txt - # requests -iniconfig==2.3.0 - # via pytest -jinja2==3.1.6 - # via - # -r requirements/base.txt - # code-annotations - # cookiecutter - # moto -jmespath==1.1.0 - # via - # -r requirements/base.txt - # boto3 - # botocore -jsonfield==3.2.0 - # via - # -r requirements/base.txt - # edx-submissions -kombu==5.6.2 - # via celery -lazy==1.6 - # via -r requirements/base.txt -lxml[html-clean]==6.1.1 - # via - # -r requirements/base.txt - # edx-i18n-tools - # lxml-html-clean - # xblock - # xblock-sdk -lxml-html-clean==0.4.5 - # via - # -r requirements/base.txt - # lxml -mako==1.3.12 - # via - # -r requirements/base.txt - # xblock -markdown-it-py==4.2.0 - # via rich -markupsafe==3.0.3 - # via - # -r requirements/base.txt - # jinja2 - # mako - # werkzeug - # xblock -mdurl==0.1.2 - # via markdown-it-py -mock==5.2.0 - # via -r requirements/test.in -more-itertools==11.1.0 - # via -r requirements/test.in -moto==4.2.14 - # via - # -c requirements/constraints.txt - # -r requirements/test.in -openedx-events==11.2.0 - # via -r requirements/base.txt -openedx-filters==3.4.1 - # via -r requirements/base.txt -packaging==26.2 - # via - # kombu - # pyproject-api - # pytest - # tox -path==16.16.0 - # via - # -r requirements/base.txt - # edx-i18n-tools - # path-py -path-py==12.5.0 - # via -r requirements/base.txt -platformdirs==4.10.0 - # via - # python-discovery - # tox - # virtualenv -pluggy==1.6.0 - # via - # pytest - # pytest-cov - # tox -polib==1.2.0 - # via - # -r requirements/base.txt - # edx-i18n-tools -prompt-toolkit==3.0.52 - # via click-repl -psutil==7.2.2 - # via - # -r requirements/base.txt - # edx-django-utils -pycparser==3.0 - # via - # -r requirements/base.txt - # cffi -pygments==2.20.0 - # via - # pytest - # rich -pymongo==4.17.0 - # via - # -r requirements/base.txt - # edx-opaque-keys -pynacl==1.6.2 - # via - # -r requirements/base.txt - # edx-django-utils -pypng==0.20220715.0 - # via xblock-sdk -pyproject-api==1.10.1 - # via tox -pytest==9.0.3 - # via - # -r requirements/test.in - # pytest-cov - # pytest-django -pytest-cov==7.1.0 - # via -r requirements/test.in -pytest-django==4.12.0 - # via -r requirements/test.in -python-dateutil==2.9.0.post0 - # via - # -r requirements/base.txt - # arrow - # botocore - # celery - # freezegun - # moto - # xblock -python-discovery==1.4.0 - # via - # tox - # virtualenv -python-slugify==8.0.4 - # via - # -r requirements/base.txt - # code-annotations - # cookiecutter -python-swiftclient==4.10.0 - # via -r requirements/base.txt -pytz==2026.2 - # via - # -r requirements/base.txt - # edx-submissions - # xblock -pyyaml==6.0.3 - # via - # -r requirements/base.txt - # code-annotations - # cookiecutter - # edx-django-release-util - # edx-i18n-tools - # responses - # xblock -requests==2.34.2 - # via - # -r requirements/base.txt - # cookiecutter - # moto - # python-swiftclient - # responses - # xblock-sdk -responses==0.26.1 - # via moto -rich==15.0.0 - # via cookiecutter -s3transfer==0.18.0 - # via - # -r requirements/base.txt - # boto3 -simplejson==4.1.1 - # via - # -r requirements/base.txt - # xblock - # xblock-sdk -six==1.17.0 - # via - # -r requirements/base.txt - # edx-ccx-keys - # edx-django-release-util - # freezegun - # fs - # fs-s3fs - # html5lib - # python-dateutil -sqlparse==0.5.5 - # via - # -r requirements/base.txt - # django -stevedore==5.8.0 - # via - # -r requirements/base.txt - # code-annotations - # edx-django-utils - # edx-opaque-keys -testfixtures==12.0.0 - # via -r requirements/test.in -text-unidecode==1.3 - # via - # -r requirements/base.txt - # python-slugify -tomli-w==1.2.0 - # via tox -tox==4.55.1 - # via -r requirements/test.in -typing-extensions==4.15.0 - # via - # -r requirements/base.txt - # edx-opaque-keys -tzdata==2026.2 - # via - # arrow - # kombu -tzlocal==5.3.1 - # via celery -urllib3==2.7.0 - # via - # -r requirements/base.txt - # botocore - # requests - # responses -vine==5.1.0 - # via - # amqp - # celery - # kombu -virtualenv==21.4.2 - # via tox -voluptuous==0.16.0 - # via -r requirements/base.txt -wcwidth==0.7.0 - # via prompt-toolkit -web-fragments==4.0.0 - # via - # -r requirements/base.txt - # xblock - # xblock-sdk -webencodings==0.5.1 - # via - # -r requirements/base.txt - # bleach - # html5lib -webob==1.8.10 - # via - # -r requirements/base.txt - # xblock - # xblock-sdk -werkzeug==3.1.8 - # via moto -xblock==6.1.0 - # via - # -r requirements/base.txt - # xblock-sdk -xblock-sdk==0.14.0 - # via -r requirements/test.in -xmltodict==1.0.4 - # via moto - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/requirements/tox.in b/requirements/tox.in deleted file mode 100644 index ed6c88590d..0000000000 --- a/requirements/tox.in +++ /dev/null @@ -1,3 +0,0 @@ --c constraints.txt - -tox \ No newline at end of file diff --git a/requirements/tox.txt b/requirements/tox.txt deleted file mode 100644 index 4edefbdee9..0000000000 --- a/requirements/tox.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# make upgrade -# -cachetools==7.1.4 - # via tox -colorama==0.4.6 - # via tox -distlib==0.4.1 - # via virtualenv -filelock==3.29.1 - # via - # python-discovery - # tox - # virtualenv -packaging==26.2 - # via - # pyproject-api - # tox -platformdirs==4.10.0 - # via - # python-discovery - # tox - # virtualenv -pluggy==1.6.0 - # via tox -pyproject-api==1.10.1 - # via tox -python-discovery==1.4.0 - # via - # tox - # virtualenv -tomli-w==1.2.0 - # via tox -tox==4.55.1 - # via -r requirements/tox.in -virtualenv==21.4.2 - # via tox diff --git a/scripts/render-templates.sh b/scripts/render-templates.sh index 8bc5fcc398..4b90337d7b 100755 --- a/scripts/render-templates.sh +++ b/scripts/render-templates.sh @@ -4,4 +4,4 @@ cd `dirname $BASH_SOURCE` && cd .. echo "Generating HTML fixtures for JavaScript tests..." export DJANGO_SETTINGS_MODULE=${DJANGO_SETTINGS_MODULE:-"settings.base"} -./scripts/render_templates.py openassessment/xblock/static/js/fixtures/templates.json +./scripts/render_templates.py src/openassessment/xblock/static/js/fixtures/templates.json diff --git a/scripts/run-pycodestyle.sh b/scripts/run-pycodestyle.sh index 7d5c3086e4..4aa2fbb031 100755 --- a/scripts/run-pycodestyle.sh +++ b/scripts/run-pycodestyle.sh @@ -6,7 +6,7 @@ mkdir -p test/logs PEP8_VIOLATIONS=test/logs/pep8.txt touch $PEP8_VIOLATIONS -pycodestyle --config=.pycodestyle openassessment test > $PEP8_VIOLATIONS +pycodestyle --config=.pycodestyle src/openassessment test > $PEP8_VIOLATIONS NUM_PEP8_VIOLATIONS=$(cat $PEP8_VIOLATIONS | wc -l) echo "Found" $NUM_PEP8_VIOLATIONS "pep8 violations, threshold is" $MAX_PEP8_VIOLATIONS diff --git a/scripts/run-pylint.sh b/scripts/run-pylint.sh index 260f35e4f1..a71de85792 100755 --- a/scripts/run-pylint.sh +++ b/scripts/run-pylint.sh @@ -7,7 +7,7 @@ PYLINT_VIOLATIONS=test/logs/pylint.txt touch $PYLINT_VIOLATIONS export DJANGO_SETTINGS_MODULE=settings.test -pylint --rcfile=pylintrc openassessment test --msg-template='"{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}"'> $PYLINT_VIOLATIONS +pylint --rcfile=pylintrc src/openassessment test --msg-template='"{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}"'> $PYLINT_VIOLATIONS if [ $? -eq 1 ] then echo "Pylint fatal error" diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index e479214e9d..0000000000 --- a/setup.cfg +++ /dev/null @@ -1,9 +0,0 @@ -[isort] -line_length = 120 -known_third_party = ddt,mock -known_django = django -known_djangoapp = jsonfield,model_utils -known_edx = -known_first_party = openassessment -sections = FUTURE,STDLIB,THIRDPARTY,DJANGO,DJANGOAPP,EDX,FIRSTPARTY,LOCALFOLDER -force_sort_within_sections = true diff --git a/setup.py b/setup.py deleted file mode 100644 index cf0d206a5d..0000000000 --- a/setup.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python - -import os -import re -import os.path -from io import open as open_as_of_py3 -import os.path - -from setuptools import find_packages, setup - -README = open_as_of_py3( - os.path.join(os.path.dirname(__file__), 'README.rst') -).read() - - -def is_requirement(line): - """ - Return True if the requirement line is a package requirement; - that is, it is not blank, a comment, a URL, or an included file. - """ - return line and not line.startswith(('-r', '#', '-e', 'git+', '-c')) - - -def load_requirements(*requirements_paths): - """ - Load all requirements from the specified requirements files. - Returns a list of requirement strings. - """ - requirements = set() - for path in requirements_paths: - with open(path) as reqs: - requirements.update( - line.split('#')[0].strip() for line in reqs - if is_requirement(line.strip()) - ) - return list(requirements) - - -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.") - - -VERSION = get_version("openassessment", "__init__.py") - - -setup( - name='ora2', - version=VERSION, - author='edX', - author_email='oscm@edx.org', - url='http://github.com/openedx/edx-ora2', - description='edx-ora2', - license='AGPL', - long_description=README, - long_description_content_type='text/x-rst', - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Framework :: Django :: 4.2', - 'Framework :: Django :: 5.2', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: GNU Affero General Public License v3', - 'Operating System :: OS Independent', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.12', - ], - packages=find_packages(include=['openassessment*'], exclude=['*.test', '*.tests']), - include_package_data=True, - install_requires=load_requirements('requirements/base.in'), - tests_require=load_requirements('requirements/test.in'), - entry_points={ - 'xblock.v1': [ - 'openassessment = openassessment.xblock.openassessmentblock:OpenAssessmentBlock', - ] - }, -) diff --git a/src/openassessment/__init__.py b/src/openassessment/__init__.py new file mode 100644 index 0000000000..330e08c0cf --- /dev/null +++ b/src/openassessment/__init__.py @@ -0,0 +1,6 @@ +""" +Initialization Information for Open Assessment Module +""" + +from importlib.metadata import version +__version__ = version("ora2") # pragma: no cover diff --git a/openassessment/assessment/__init__.py b/src/openassessment/assessment/__init__.py similarity index 100% rename from openassessment/assessment/__init__.py rename to src/openassessment/assessment/__init__.py diff --git a/openassessment/assessment/admin.py b/src/openassessment/assessment/admin.py similarity index 100% rename from openassessment/assessment/admin.py rename to src/openassessment/assessment/admin.py diff --git a/openassessment/assessment/api/__init__.py b/src/openassessment/assessment/api/__init__.py similarity index 100% rename from openassessment/assessment/api/__init__.py rename to src/openassessment/assessment/api/__init__.py diff --git a/openassessment/assessment/api/peer.py b/src/openassessment/assessment/api/peer.py similarity index 100% rename from openassessment/assessment/api/peer.py rename to src/openassessment/assessment/api/peer.py diff --git a/openassessment/assessment/api/self.py b/src/openassessment/assessment/api/self.py similarity index 100% rename from openassessment/assessment/api/self.py rename to src/openassessment/assessment/api/self.py diff --git a/openassessment/assessment/api/staff.py b/src/openassessment/assessment/api/staff.py similarity index 100% rename from openassessment/assessment/api/staff.py rename to src/openassessment/assessment/api/staff.py diff --git a/openassessment/assessment/api/student_training.py b/src/openassessment/assessment/api/student_training.py similarity index 100% rename from openassessment/assessment/api/student_training.py rename to src/openassessment/assessment/api/student_training.py diff --git a/openassessment/assessment/api/teams.py b/src/openassessment/assessment/api/teams.py similarity index 100% rename from openassessment/assessment/api/teams.py rename to src/openassessment/assessment/api/teams.py diff --git a/openassessment/assessment/data_conversion.py b/src/openassessment/assessment/data_conversion.py similarity index 100% rename from openassessment/assessment/data_conversion.py rename to src/openassessment/assessment/data_conversion.py diff --git a/openassessment/assessment/errors/__init__.py b/src/openassessment/assessment/errors/__init__.py similarity index 100% rename from openassessment/assessment/errors/__init__.py rename to src/openassessment/assessment/errors/__init__.py diff --git a/openassessment/assessment/errors/base.py b/src/openassessment/assessment/errors/base.py similarity index 100% rename from openassessment/assessment/errors/base.py rename to src/openassessment/assessment/errors/base.py diff --git a/openassessment/assessment/errors/peer.py b/src/openassessment/assessment/errors/peer.py similarity index 100% rename from openassessment/assessment/errors/peer.py rename to src/openassessment/assessment/errors/peer.py diff --git a/openassessment/assessment/errors/self.py b/src/openassessment/assessment/errors/self.py similarity index 100% rename from openassessment/assessment/errors/self.py rename to src/openassessment/assessment/errors/self.py diff --git a/openassessment/assessment/errors/staff.py b/src/openassessment/assessment/errors/staff.py similarity index 100% rename from openassessment/assessment/errors/staff.py rename to src/openassessment/assessment/errors/staff.py diff --git a/openassessment/assessment/errors/student_training.py b/src/openassessment/assessment/errors/student_training.py similarity index 100% rename from openassessment/assessment/errors/student_training.py rename to src/openassessment/assessment/errors/student_training.py diff --git a/openassessment/assessment/migrations/0001_initial.py b/src/openassessment/assessment/migrations/0001_initial.py similarity index 100% rename from openassessment/assessment/migrations/0001_initial.py rename to src/openassessment/assessment/migrations/0001_initial.py diff --git a/openassessment/assessment/migrations/0002_staffworkflow.py b/src/openassessment/assessment/migrations/0002_staffworkflow.py similarity index 100% rename from openassessment/assessment/migrations/0002_staffworkflow.py rename to src/openassessment/assessment/migrations/0002_staffworkflow.py diff --git a/openassessment/assessment/migrations/0003_expand_course_id.py b/src/openassessment/assessment/migrations/0003_expand_course_id.py similarity index 100% rename from openassessment/assessment/migrations/0003_expand_course_id.py rename to src/openassessment/assessment/migrations/0003_expand_course_id.py diff --git a/openassessment/assessment/migrations/0004_historicalsharedfileupload_sharedfileupload.py b/src/openassessment/assessment/migrations/0004_historicalsharedfileupload_sharedfileupload.py similarity index 100% rename from openassessment/assessment/migrations/0004_historicalsharedfileupload_sharedfileupload.py rename to src/openassessment/assessment/migrations/0004_historicalsharedfileupload_sharedfileupload.py diff --git a/openassessment/assessment/migrations/0005_add_filename_to_sharedupload.py b/src/openassessment/assessment/migrations/0005_add_filename_to_sharedupload.py similarity index 100% rename from openassessment/assessment/migrations/0005_add_filename_to_sharedupload.py rename to src/openassessment/assessment/migrations/0005_add_filename_to_sharedupload.py diff --git a/openassessment/assessment/migrations/0006_TeamWorkflows.py b/src/openassessment/assessment/migrations/0006_TeamWorkflows.py similarity index 100% rename from openassessment/assessment/migrations/0006_TeamWorkflows.py rename to src/openassessment/assessment/migrations/0006_TeamWorkflows.py diff --git a/openassessment/assessment/migrations/0007_staff_workflow_blank.py b/src/openassessment/assessment/migrations/0007_staff_workflow_blank.py similarity index 100% rename from openassessment/assessment/migrations/0007_staff_workflow_blank.py rename to src/openassessment/assessment/migrations/0007_staff_workflow_blank.py diff --git a/openassessment/assessment/migrations/0008_alter_historicalsharedfileupload_options.py b/src/openassessment/assessment/migrations/0008_alter_historicalsharedfileupload_options.py similarity index 100% rename from openassessment/assessment/migrations/0008_alter_historicalsharedfileupload_options.py rename to src/openassessment/assessment/migrations/0008_alter_historicalsharedfileupload_options.py diff --git a/openassessment/assessment/migrations/0009_increase_item_id_max_length_peer_staff_studenttraining_workflows.py b/src/openassessment/assessment/migrations/0009_increase_item_id_max_length_peer_staff_studenttraining_workflows.py similarity index 100% rename from openassessment/assessment/migrations/0009_increase_item_id_max_length_peer_staff_studenttraining_workflows.py rename to src/openassessment/assessment/migrations/0009_increase_item_id_max_length_peer_staff_studenttraining_workflows.py diff --git a/openassessment/assessment/migrations/__init__.py b/src/openassessment/assessment/migrations/__init__.py similarity index 100% rename from openassessment/assessment/migrations/__init__.py rename to src/openassessment/assessment/migrations/__init__.py diff --git a/openassessment/assessment/models/__init__.py b/src/openassessment/assessment/models/__init__.py similarity index 100% rename from openassessment/assessment/models/__init__.py rename to src/openassessment/assessment/models/__init__.py diff --git a/openassessment/assessment/models/base.py b/src/openassessment/assessment/models/base.py similarity index 100% rename from openassessment/assessment/models/base.py rename to src/openassessment/assessment/models/base.py diff --git a/openassessment/assessment/models/peer.py b/src/openassessment/assessment/models/peer.py similarity index 100% rename from openassessment/assessment/models/peer.py rename to src/openassessment/assessment/models/peer.py diff --git a/openassessment/assessment/models/staff.py b/src/openassessment/assessment/models/staff.py similarity index 100% rename from openassessment/assessment/models/staff.py rename to src/openassessment/assessment/models/staff.py diff --git a/openassessment/assessment/models/student_training.py b/src/openassessment/assessment/models/student_training.py similarity index 100% rename from openassessment/assessment/models/student_training.py rename to src/openassessment/assessment/models/student_training.py diff --git a/openassessment/assessment/models/training.py b/src/openassessment/assessment/models/training.py similarity index 100% rename from openassessment/assessment/models/training.py rename to src/openassessment/assessment/models/training.py diff --git a/openassessment/assessment/score_type_constants.py b/src/openassessment/assessment/score_type_constants.py similarity index 100% rename from openassessment/assessment/score_type_constants.py rename to src/openassessment/assessment/score_type_constants.py diff --git a/openassessment/assessment/serializers/__init__.py b/src/openassessment/assessment/serializers/__init__.py similarity index 100% rename from openassessment/assessment/serializers/__init__.py rename to src/openassessment/assessment/serializers/__init__.py diff --git a/openassessment/assessment/serializers/base.py b/src/openassessment/assessment/serializers/base.py similarity index 100% rename from openassessment/assessment/serializers/base.py rename to src/openassessment/assessment/serializers/base.py diff --git a/openassessment/assessment/serializers/peer.py b/src/openassessment/assessment/serializers/peer.py similarity index 100% rename from openassessment/assessment/serializers/peer.py rename to src/openassessment/assessment/serializers/peer.py diff --git a/openassessment/assessment/serializers/training.py b/src/openassessment/assessment/serializers/training.py similarity index 100% rename from openassessment/assessment/serializers/training.py rename to src/openassessment/assessment/serializers/training.py diff --git a/openassessment/assessment/signals.py b/src/openassessment/assessment/signals.py similarity index 100% rename from openassessment/assessment/signals.py rename to src/openassessment/assessment/signals.py diff --git a/openassessment/assessment/templates/evaluations.html b/src/openassessment/assessment/templates/evaluations.html similarity index 100% rename from openassessment/assessment/templates/evaluations.html rename to src/openassessment/assessment/templates/evaluations.html diff --git a/openassessment/assessment/test/__init__.py b/src/openassessment/assessment/test/__init__.py similarity index 100% rename from openassessment/assessment/test/__init__.py rename to src/openassessment/assessment/test/__init__.py diff --git a/openassessment/assessment/test/constants.py b/src/openassessment/assessment/test/constants.py similarity index 100% rename from openassessment/assessment/test/constants.py rename to src/openassessment/assessment/test/constants.py diff --git a/openassessment/assessment/test/data/models_check_criteria_assessed.json b/src/openassessment/assessment/test/data/models_check_criteria_assessed.json similarity index 100% rename from openassessment/assessment/test/data/models_check_criteria_assessed.json rename to src/openassessment/assessment/test/data/models_check_criteria_assessed.json diff --git a/openassessment/assessment/test/data/rubric/empty_criteria.json b/src/openassessment/assessment/test/data/rubric/empty_criteria.json similarity index 100% rename from openassessment/assessment/test/data/rubric/empty_criteria.json rename to src/openassessment/assessment/test/data/rubric/empty_criteria.json diff --git a/openassessment/assessment/test/data/rubric/empty_options.json b/src/openassessment/assessment/test/data/rubric/empty_options.json similarity index 100% rename from openassessment/assessment/test/data/rubric/empty_options.json rename to src/openassessment/assessment/test/data/rubric/empty_options.json diff --git a/openassessment/assessment/test/data/rubric/missing_criteria.json b/src/openassessment/assessment/test/data/rubric/missing_criteria.json similarity index 100% rename from openassessment/assessment/test/data/rubric/missing_criteria.json rename to src/openassessment/assessment/test/data/rubric/missing_criteria.json diff --git a/openassessment/assessment/test/data/rubric/missing_options.json b/src/openassessment/assessment/test/data/rubric/missing_options.json similarity index 100% rename from openassessment/assessment/test/data/rubric/missing_options.json rename to src/openassessment/assessment/test/data/rubric/missing_options.json diff --git a/openassessment/assessment/test/data/rubric/no_points.json b/src/openassessment/assessment/test/data/rubric/no_points.json similarity index 100% rename from openassessment/assessment/test/data/rubric/no_points.json rename to src/openassessment/assessment/test/data/rubric/no_points.json diff --git a/openassessment/assessment/test/data/rubric/project_plan_rubric.json b/src/openassessment/assessment/test/data/rubric/project_plan_rubric.json similarity index 100% rename from openassessment/assessment/test/data/rubric/project_plan_rubric.json rename to src/openassessment/assessment/test/data/rubric/project_plan_rubric.json diff --git a/openassessment/assessment/test/data/valid_assessments.json b/src/openassessment/assessment/test/data/valid_assessments.json similarity index 100% rename from openassessment/assessment/test/data/valid_assessments.json rename to src/openassessment/assessment/test/data/valid_assessments.json diff --git a/openassessment/assessment/test/data/validate_training_examples.json b/src/openassessment/assessment/test/data/validate_training_examples.json similarity index 100% rename from openassessment/assessment/test/data/validate_training_examples.json rename to src/openassessment/assessment/test/data/validate_training_examples.json diff --git a/openassessment/assessment/test/test_assessment_models.py b/src/openassessment/assessment/test/test_assessment_models.py similarity index 100% rename from openassessment/assessment/test/test_assessment_models.py rename to src/openassessment/assessment/test/test_assessment_models.py diff --git a/openassessment/assessment/test/test_peer.py b/src/openassessment/assessment/test/test_peer.py similarity index 100% rename from openassessment/assessment/test/test_peer.py rename to src/openassessment/assessment/test/test_peer.py diff --git a/openassessment/assessment/test/test_rubric.py b/src/openassessment/assessment/test/test_rubric.py similarity index 100% rename from openassessment/assessment/test/test_rubric.py rename to src/openassessment/assessment/test/test_rubric.py diff --git a/openassessment/assessment/test/test_self.py b/src/openassessment/assessment/test/test_self.py similarity index 100% rename from openassessment/assessment/test/test_self.py rename to src/openassessment/assessment/test/test_self.py diff --git a/openassessment/assessment/test/test_serializers.py b/src/openassessment/assessment/test/test_serializers.py similarity index 100% rename from openassessment/assessment/test/test_serializers.py rename to src/openassessment/assessment/test/test_serializers.py diff --git a/openassessment/assessment/test/test_staff.py b/src/openassessment/assessment/test/test_staff.py similarity index 100% rename from openassessment/assessment/test/test_staff.py rename to src/openassessment/assessment/test/test_staff.py diff --git a/openassessment/assessment/test/test_student_training_api.py b/src/openassessment/assessment/test/test_student_training_api.py similarity index 100% rename from openassessment/assessment/test/test_student_training_api.py rename to src/openassessment/assessment/test/test_student_training_api.py diff --git a/openassessment/assessment/test/test_student_training_models.py b/src/openassessment/assessment/test/test_student_training_models.py similarity index 100% rename from openassessment/assessment/test/test_student_training_models.py rename to src/openassessment/assessment/test/test_student_training_models.py diff --git a/openassessment/assessment/test/test_team.py b/src/openassessment/assessment/test/test_team.py similarity index 100% rename from openassessment/assessment/test/test_team.py rename to src/openassessment/assessment/test/test_team.py diff --git a/openassessment/assessment/test/test_training.py b/src/openassessment/assessment/test/test_training.py similarity index 100% rename from openassessment/assessment/test/test_training.py rename to src/openassessment/assessment/test/test_training.py diff --git a/openassessment/assessment/urls.py b/src/openassessment/assessment/urls.py similarity index 100% rename from openassessment/assessment/urls.py rename to src/openassessment/assessment/urls.py diff --git a/openassessment/assessment/views.py b/src/openassessment/assessment/views.py similarity index 100% rename from openassessment/assessment/views.py rename to src/openassessment/assessment/views.py diff --git a/openassessment/conf/locale/ar/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/ar/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/ar/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/ar/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/ar/LC_MESSAGES/django.po b/src/openassessment/conf/locale/ar/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/ar/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/ar/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/ar/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/ar/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/ar/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/ar/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/ar/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/ar/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/ar/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/ar/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/ar_SA/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/ar_SA/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/ar_SA/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/ar_SA/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/ar_SA/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/ar_SA/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/ar_SA/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/ar_SA/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/config.yaml b/src/openassessment/conf/locale/config.yaml similarity index 100% rename from openassessment/conf/locale/config.yaml rename to src/openassessment/conf/locale/config.yaml diff --git a/openassessment/conf/locale/cs/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/cs/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/cs/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/cs/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/cs/LC_MESSAGES/django.po b/src/openassessment/conf/locale/cs/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/cs/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/cs/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/cs/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/cs/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/cs/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/cs/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/cs/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/cs/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/cs/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/cs/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/da/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/da/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/da/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/da/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/da/LC_MESSAGES/django.po b/src/openassessment/conf/locale/da/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/da/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/da/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/da/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/da/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/da/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/da/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/da/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/da/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/da/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/da/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/de_DE/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/de_DE/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/de_DE/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/de_DE/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/de_DE/LC_MESSAGES/django.po b/src/openassessment/conf/locale/de_DE/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/de_DE/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/de_DE/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/de_DE/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/de_DE/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/de_DE/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/de_DE/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/de_DE/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/de_DE/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/de_DE/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/de_DE/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/el/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/el/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/el/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/el/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/el/LC_MESSAGES/django.po b/src/openassessment/conf/locale/el/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/el/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/el/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/el/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/el/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/el/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/el/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/el/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/el/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/el/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/el/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/en/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/en/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/en/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/en/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/en/LC_MESSAGES/django.po b/src/openassessment/conf/locale/en/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/en/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/en/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/en/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/en/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/en/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/en/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/en/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/en/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/en/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/en/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/eo/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/eo/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/eo/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/eo/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/eo/LC_MESSAGES/django.po b/src/openassessment/conf/locale/eo/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/eo/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/eo/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/eo/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/eo/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/eo/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/eo/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/eo/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/eo/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/eo/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/eo/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/es_419/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/es_419/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/es_419/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/es_419/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/es_419/LC_MESSAGES/django.po b/src/openassessment/conf/locale/es_419/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/es_419/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/es_419/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/es_419/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/es_419/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/es_419/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/es_419/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/es_419/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/es_419/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/es_419/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/es_419/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/es_AR/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/es_AR/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/es_AR/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/es_AR/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/es_AR/LC_MESSAGES/django.po b/src/openassessment/conf/locale/es_AR/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/es_AR/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/es_AR/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/es_AR/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/es_AR/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/es_AR/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/es_AR/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/es_AR/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/es_AR/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/es_AR/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/es_AR/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/es_ES/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/es_ES/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/es_ES/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/es_ES/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/es_ES/LC_MESSAGES/django.po b/src/openassessment/conf/locale/es_ES/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/es_ES/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/es_ES/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/es_ES/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/es_ES/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/es_ES/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/es_ES/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/es_ES/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/es_ES/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/es_ES/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/es_ES/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/eu_ES/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/eu_ES/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/eu_ES/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/eu_ES/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/eu_ES/LC_MESSAGES/django.po b/src/openassessment/conf/locale/eu_ES/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/eu_ES/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/eu_ES/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/eu_ES/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/eu_ES/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/eu_ES/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/eu_ES/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/eu_ES/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/eu_ES/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/eu_ES/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/eu_ES/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/fa_IR/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/fa_IR/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/fa_IR/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/fa_IR/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/fa_IR/LC_MESSAGES/django.po b/src/openassessment/conf/locale/fa_IR/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/fa_IR/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/fa_IR/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/fa_IR/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/fa_IR/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/fa_IR/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/fa_IR/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/fa_IR/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/fa_IR/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/fa_IR/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/fa_IR/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/fr/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/fr/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/fr/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/fr/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/fr/LC_MESSAGES/django.po b/src/openassessment/conf/locale/fr/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/fr/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/fr/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/fr/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/fr/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/fr/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/fr/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/fr/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/fr/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/fr/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/fr/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/fr_CA/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/fr_CA/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/fr_CA/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/fr_CA/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/fr_CA/LC_MESSAGES/django.po b/src/openassessment/conf/locale/fr_CA/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/fr_CA/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/fr_CA/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/fr_CA/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/fr_CA/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/fr_CA/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/fr_CA/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/fr_CA/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/fr_CA/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/fr_CA/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/fr_CA/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/he/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/he/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/he/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/he/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/he/LC_MESSAGES/django.po b/src/openassessment/conf/locale/he/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/he/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/he/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/he/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/he/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/he/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/he/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/he/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/he/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/he/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/he/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/hi/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/hi/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/hi/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/hi/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/hi/LC_MESSAGES/django.po b/src/openassessment/conf/locale/hi/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/hi/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/hi/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/hi/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/hi/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/hi/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/hi/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/hi/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/hi/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/hi/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/hi/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/id/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/id/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/id/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/id/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/id/LC_MESSAGES/django.po b/src/openassessment/conf/locale/id/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/id/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/id/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/id/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/id/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/id/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/id/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/id/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/id/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/id/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/id/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/it_IT/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/it_IT/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/it_IT/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/it_IT/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/it_IT/LC_MESSAGES/django.po b/src/openassessment/conf/locale/it_IT/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/it_IT/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/it_IT/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/it_IT/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/it_IT/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/it_IT/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/it_IT/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/it_IT/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/it_IT/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/it_IT/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/it_IT/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/ja_JP/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/ja_JP/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/ja_JP/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/ja_JP/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/ja_JP/LC_MESSAGES/django.po b/src/openassessment/conf/locale/ja_JP/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/ja_JP/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/ja_JP/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/ja_JP/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/ja_JP/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/ja_JP/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/ja_JP/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/ja_JP/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/ja_JP/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/ja_JP/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/ja_JP/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/ka/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/ka/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/ka/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/ka/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/ka/LC_MESSAGES/django.po b/src/openassessment/conf/locale/ka/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/ka/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/ka/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/ka/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/ka/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/ka/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/ka/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/ka/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/ka/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/ka/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/ka/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/lt_LT/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/lt_LT/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/lt_LT/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/lt_LT/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/lt_LT/LC_MESSAGES/django.po b/src/openassessment/conf/locale/lt_LT/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/lt_LT/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/lt_LT/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/lt_LT/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/lt_LT/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/lt_LT/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/lt_LT/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/lt_LT/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/lt_LT/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/lt_LT/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/lt_LT/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/lv/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/lv/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/lv/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/lv/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/lv/LC_MESSAGES/django.po b/src/openassessment/conf/locale/lv/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/lv/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/lv/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/lv/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/lv/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/lv/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/lv/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/lv/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/lv/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/lv/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/lv/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/messages.mo b/src/openassessment/conf/locale/messages.mo similarity index 100% rename from openassessment/conf/locale/messages.mo rename to src/openassessment/conf/locale/messages.mo diff --git a/openassessment/conf/locale/mn/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/mn/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/mn/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/mn/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/mn/LC_MESSAGES/django.po b/src/openassessment/conf/locale/mn/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/mn/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/mn/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/mn/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/mn/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/mn/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/mn/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/mn/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/mn/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/mn/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/mn/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/nb/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/nb/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/nb/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/nb/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/nb/LC_MESSAGES/django.po b/src/openassessment/conf/locale/nb/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/nb/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/nb/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/nb/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/nb/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/nb/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/nb/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/nb/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/nb/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/nb/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/nb/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/pl/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/pl/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/pl/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/pl/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/pl/LC_MESSAGES/django.po b/src/openassessment/conf/locale/pl/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/pl/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/pl/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/pl/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/pl/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/pl/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/pl/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/pl/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/pl/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/pl/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/pl/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/pt_BR/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/pt_BR/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/pt_BR/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/pt_BR/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/pt_BR/LC_MESSAGES/django.po b/src/openassessment/conf/locale/pt_BR/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/pt_BR/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/pt_BR/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/pt_BR/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/pt_BR/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/pt_BR/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/pt_BR/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/pt_PT/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/pt_PT/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/pt_PT/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/pt_PT/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/pt_PT/LC_MESSAGES/django.po b/src/openassessment/conf/locale/pt_PT/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/pt_PT/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/pt_PT/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/pt_PT/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/pt_PT/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/pt_PT/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/pt_PT/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/pt_PT/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/pt_PT/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/pt_PT/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/pt_PT/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/ro/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/ro/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/ro/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/ro/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/ro/LC_MESSAGES/django.po b/src/openassessment/conf/locale/ro/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/ro/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/ro/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/ro/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/ro/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/ro/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/ro/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/ro/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/ro/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/ro/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/ro/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/ru/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/ru/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/ru/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/ru/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/ru/LC_MESSAGES/django.po b/src/openassessment/conf/locale/ru/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/ru/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/ru/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/ru/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/ru/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/ru/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/ru/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/ru/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/ru/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/ru/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/ru/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/sk/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/sk/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/sk/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/sk/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/sk/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/sk/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/sk/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/sk/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/sq/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/sq/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/sq/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/sq/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/sq/LC_MESSAGES/django.po b/src/openassessment/conf/locale/sq/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/sq/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/sq/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/sq/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/sq/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/sq/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/sq/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/sq/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/sq/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/sq/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/sq/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/sw_KE/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/sw_KE/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/sw_KE/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/sw_KE/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/sw_KE/LC_MESSAGES/django.po b/src/openassessment/conf/locale/sw_KE/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/sw_KE/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/sw_KE/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/sw_KE/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/sw_KE/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/sw_KE/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/sw_KE/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/sw_KE/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/sw_KE/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/sw_KE/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/sw_KE/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/th/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/th/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/th/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/th/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/th/LC_MESSAGES/django.po b/src/openassessment/conf/locale/th/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/th/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/th/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/th/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/th/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/th/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/th/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/th/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/th/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/th/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/th/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/tr_TR/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/tr_TR/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/tr_TR/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/tr_TR/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/tr_TR/LC_MESSAGES/django.po b/src/openassessment/conf/locale/tr_TR/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/tr_TR/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/tr_TR/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/tr_TR/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/tr_TR/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/tr_TR/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/tr_TR/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/tr_TR/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/tr_TR/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/tr_TR/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/tr_TR/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/uk/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/uk/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/uk/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/uk/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/uk/LC_MESSAGES/django.po b/src/openassessment/conf/locale/uk/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/uk/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/uk/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/uk/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/uk/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/uk/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/uk/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/uk/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/uk/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/uk/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/uk/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/vi/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/vi/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/vi/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/vi/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/vi/LC_MESSAGES/django.po b/src/openassessment/conf/locale/vi/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/vi/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/vi/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/vi/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/vi/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/vi/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/vi/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/vi/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/vi/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/vi/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/vi/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/zh_CN/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/zh_CN/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/zh_CN/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/zh_CN/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/zh_CN/LC_MESSAGES/django.po b/src/openassessment/conf/locale/zh_CN/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/zh_CN/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/zh_CN/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/zh_CN/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/zh_CN/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/zh_CN/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/zh_CN/LC_MESSAGES/djangojs.po diff --git a/openassessment/conf/locale/zh_TW/LC_MESSAGES/django.mo b/src/openassessment/conf/locale/zh_TW/LC_MESSAGES/django.mo similarity index 100% rename from openassessment/conf/locale/zh_TW/LC_MESSAGES/django.mo rename to src/openassessment/conf/locale/zh_TW/LC_MESSAGES/django.mo diff --git a/openassessment/conf/locale/zh_TW/LC_MESSAGES/django.po b/src/openassessment/conf/locale/zh_TW/LC_MESSAGES/django.po similarity index 100% rename from openassessment/conf/locale/zh_TW/LC_MESSAGES/django.po rename to src/openassessment/conf/locale/zh_TW/LC_MESSAGES/django.po diff --git a/openassessment/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo b/src/openassessment/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo similarity index 100% rename from openassessment/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo rename to src/openassessment/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo diff --git a/openassessment/conf/locale/zh_TW/LC_MESSAGES/djangojs.po b/src/openassessment/conf/locale/zh_TW/LC_MESSAGES/djangojs.po similarity index 100% rename from openassessment/conf/locale/zh_TW/LC_MESSAGES/djangojs.po rename to src/openassessment/conf/locale/zh_TW/LC_MESSAGES/djangojs.po diff --git a/openassessment/data.py b/src/openassessment/data.py similarity index 100% rename from openassessment/data.py rename to src/openassessment/data.py diff --git a/openassessment/fileupload/__init__.py b/src/openassessment/fileupload/__init__.py similarity index 100% rename from openassessment/fileupload/__init__.py rename to src/openassessment/fileupload/__init__.py diff --git a/openassessment/fileupload/api.py b/src/openassessment/fileupload/api.py similarity index 100% rename from openassessment/fileupload/api.py rename to src/openassessment/fileupload/api.py diff --git a/openassessment/fileupload/backends/__init__.py b/src/openassessment/fileupload/backends/__init__.py similarity index 100% rename from openassessment/fileupload/backends/__init__.py rename to src/openassessment/fileupload/backends/__init__.py diff --git a/openassessment/fileupload/backends/base.py b/src/openassessment/fileupload/backends/base.py similarity index 100% rename from openassessment/fileupload/backends/base.py rename to src/openassessment/fileupload/backends/base.py diff --git a/openassessment/fileupload/backends/django_storage.py b/src/openassessment/fileupload/backends/django_storage.py similarity index 100% rename from openassessment/fileupload/backends/django_storage.py rename to src/openassessment/fileupload/backends/django_storage.py diff --git a/openassessment/fileupload/backends/filesystem.py b/src/openassessment/fileupload/backends/filesystem.py similarity index 100% rename from openassessment/fileupload/backends/filesystem.py rename to src/openassessment/fileupload/backends/filesystem.py diff --git a/openassessment/fileupload/backends/s3.py b/src/openassessment/fileupload/backends/s3.py similarity index 100% rename from openassessment/fileupload/backends/s3.py rename to src/openassessment/fileupload/backends/s3.py diff --git a/openassessment/fileupload/backends/swift.py b/src/openassessment/fileupload/backends/swift.py similarity index 100% rename from openassessment/fileupload/backends/swift.py rename to src/openassessment/fileupload/backends/swift.py diff --git a/openassessment/fileupload/exceptions.py b/src/openassessment/fileupload/exceptions.py similarity index 100% rename from openassessment/fileupload/exceptions.py rename to src/openassessment/fileupload/exceptions.py diff --git a/openassessment/fileupload/tests/test_api.py b/src/openassessment/fileupload/tests/test_api.py similarity index 100% rename from openassessment/fileupload/tests/test_api.py rename to src/openassessment/fileupload/tests/test_api.py diff --git a/openassessment/fileupload/tests/test_api_functions.py b/src/openassessment/fileupload/tests/test_api_functions.py similarity index 100% rename from openassessment/fileupload/tests/test_api_functions.py rename to src/openassessment/fileupload/tests/test_api_functions.py diff --git a/openassessment/fileupload/tests/test_file_management.py b/src/openassessment/fileupload/tests/test_file_management.py similarity index 100% rename from openassessment/fileupload/tests/test_file_management.py rename to src/openassessment/fileupload/tests/test_file_management.py diff --git a/openassessment/fileupload/urls.py b/src/openassessment/fileupload/urls.py similarity index 100% rename from openassessment/fileupload/urls.py rename to src/openassessment/fileupload/urls.py diff --git a/openassessment/fileupload/views_django_storage.py b/src/openassessment/fileupload/views_django_storage.py similarity index 100% rename from openassessment/fileupload/views_django_storage.py rename to src/openassessment/fileupload/views_django_storage.py diff --git a/openassessment/fileupload/views_filesystem.py b/src/openassessment/fileupload/views_filesystem.py similarity index 100% rename from openassessment/fileupload/views_filesystem.py rename to src/openassessment/fileupload/views_filesystem.py diff --git a/openassessment/locale b/src/openassessment/locale similarity index 100% rename from openassessment/locale rename to src/openassessment/locale diff --git a/openassessment/management/__init__.py b/src/openassessment/management/__init__.py similarity index 100% rename from openassessment/management/__init__.py rename to src/openassessment/management/__init__.py diff --git a/openassessment/management/commands/__init__.py b/src/openassessment/management/commands/__init__.py similarity index 100% rename from openassessment/management/commands/__init__.py rename to src/openassessment/management/commands/__init__.py diff --git a/openassessment/management/commands/collect_ora2_data.py b/src/openassessment/management/commands/collect_ora2_data.py similarity index 100% rename from openassessment/management/commands/collect_ora2_data.py rename to src/openassessment/management/commands/collect_ora2_data.py diff --git a/openassessment/management/commands/create_oa_submissions.py b/src/openassessment/management/commands/create_oa_submissions.py similarity index 100% rename from openassessment/management/commands/create_oa_submissions.py rename to src/openassessment/management/commands/create_oa_submissions.py diff --git a/openassessment/management/commands/create_oa_submissions_from_file.py b/src/openassessment/management/commands/create_oa_submissions_from_file.py similarity index 100% rename from openassessment/management/commands/create_oa_submissions_from_file.py rename to src/openassessment/management/commands/create_oa_submissions_from_file.py diff --git a/openassessment/management/commands/loremipsum.py b/src/openassessment/management/commands/loremipsum.py similarity index 100% rename from openassessment/management/commands/loremipsum.py rename to src/openassessment/management/commands/loremipsum.py diff --git a/openassessment/management/commands/update_ora_workflows.py b/src/openassessment/management/commands/update_ora_workflows.py similarity index 100% rename from openassessment/management/commands/update_ora_workflows.py rename to src/openassessment/management/commands/update_ora_workflows.py diff --git a/openassessment/management/commands/upload_oa_data.py b/src/openassessment/management/commands/upload_oa_data.py similarity index 100% rename from openassessment/management/commands/upload_oa_data.py rename to src/openassessment/management/commands/upload_oa_data.py diff --git a/openassessment/management/tests/__init__.py b/src/openassessment/management/tests/__init__.py similarity index 100% rename from openassessment/management/tests/__init__.py rename to src/openassessment/management/tests/__init__.py diff --git a/openassessment/management/tests/test_collect_ora2_data.py b/src/openassessment/management/tests/test_collect_ora2_data.py similarity index 100% rename from openassessment/management/tests/test_collect_ora2_data.py rename to src/openassessment/management/tests/test_collect_ora2_data.py diff --git a/openassessment/management/tests/test_create_oa_submissions.py b/src/openassessment/management/tests/test_create_oa_submissions.py similarity index 100% rename from openassessment/management/tests/test_create_oa_submissions.py rename to src/openassessment/management/tests/test_create_oa_submissions.py diff --git a/openassessment/management/tests/test_create_oa_submissions_from_file.py b/src/openassessment/management/tests/test_create_oa_submissions_from_file.py similarity index 100% rename from openassessment/management/tests/test_create_oa_submissions_from_file.py rename to src/openassessment/management/tests/test_create_oa_submissions_from_file.py diff --git a/openassessment/management/tests/test_update_ora_workflows.py b/src/openassessment/management/tests/test_update_ora_workflows.py similarity index 100% rename from openassessment/management/tests/test_update_ora_workflows.py rename to src/openassessment/management/tests/test_update_ora_workflows.py diff --git a/openassessment/management/tests/test_upload_oa_data.py b/src/openassessment/management/tests/test_upload_oa_data.py similarity index 100% rename from openassessment/management/tests/test_upload_oa_data.py rename to src/openassessment/management/tests/test_upload_oa_data.py diff --git a/openassessment/runtime_imports/__init__.py b/src/openassessment/runtime_imports/__init__.py similarity index 100% rename from openassessment/runtime_imports/__init__.py rename to src/openassessment/runtime_imports/__init__.py diff --git a/openassessment/runtime_imports/classes.py b/src/openassessment/runtime_imports/classes.py similarity index 100% rename from openassessment/runtime_imports/classes.py rename to src/openassessment/runtime_imports/classes.py diff --git a/openassessment/runtime_imports/functions.py b/src/openassessment/runtime_imports/functions.py similarity index 100% rename from openassessment/runtime_imports/functions.py rename to src/openassessment/runtime_imports/functions.py diff --git a/openassessment/staffgrader/__init__.py b/src/openassessment/staffgrader/__init__.py similarity index 100% rename from openassessment/staffgrader/__init__.py rename to src/openassessment/staffgrader/__init__.py diff --git a/openassessment/staffgrader/admin.py b/src/openassessment/staffgrader/admin.py similarity index 100% rename from openassessment/staffgrader/admin.py rename to src/openassessment/staffgrader/admin.py diff --git a/openassessment/staffgrader/errors/__init__.py b/src/openassessment/staffgrader/errors/__init__.py similarity index 100% rename from openassessment/staffgrader/errors/__init__.py rename to src/openassessment/staffgrader/errors/__init__.py diff --git a/openassessment/staffgrader/errors/submission_lock.py b/src/openassessment/staffgrader/errors/submission_lock.py similarity index 100% rename from openassessment/staffgrader/errors/submission_lock.py rename to src/openassessment/staffgrader/errors/submission_lock.py diff --git a/openassessment/staffgrader/migrations/0001_initial.py b/src/openassessment/staffgrader/migrations/0001_initial.py similarity index 100% rename from openassessment/staffgrader/migrations/0001_initial.py rename to src/openassessment/staffgrader/migrations/0001_initial.py diff --git a/openassessment/staffgrader/migrations/__init__.py b/src/openassessment/staffgrader/migrations/__init__.py similarity index 100% rename from openassessment/staffgrader/migrations/__init__.py rename to src/openassessment/staffgrader/migrations/__init__.py diff --git a/openassessment/staffgrader/models/__init__.py b/src/openassessment/staffgrader/models/__init__.py similarity index 100% rename from openassessment/staffgrader/models/__init__.py rename to src/openassessment/staffgrader/models/__init__.py diff --git a/openassessment/staffgrader/models/submission_lock.py b/src/openassessment/staffgrader/models/submission_lock.py similarity index 100% rename from openassessment/staffgrader/models/submission_lock.py rename to src/openassessment/staffgrader/models/submission_lock.py diff --git a/openassessment/staffgrader/serializers/__init__.py b/src/openassessment/staffgrader/serializers/__init__.py similarity index 100% rename from openassessment/staffgrader/serializers/__init__.py rename to src/openassessment/staffgrader/serializers/__init__.py diff --git a/openassessment/staffgrader/serializers/assessments.py b/src/openassessment/staffgrader/serializers/assessments.py similarity index 100% rename from openassessment/staffgrader/serializers/assessments.py rename to src/openassessment/staffgrader/serializers/assessments.py diff --git a/openassessment/staffgrader/serializers/submission_list.py b/src/openassessment/staffgrader/serializers/submission_list.py similarity index 100% rename from openassessment/staffgrader/serializers/submission_list.py rename to src/openassessment/staffgrader/serializers/submission_list.py diff --git a/openassessment/staffgrader/serializers/submission_lock.py b/src/openassessment/staffgrader/serializers/submission_lock.py similarity index 100% rename from openassessment/staffgrader/serializers/submission_lock.py rename to src/openassessment/staffgrader/serializers/submission_lock.py diff --git a/openassessment/staffgrader/staff_grader_mixin.py b/src/openassessment/staffgrader/staff_grader_mixin.py similarity index 100% rename from openassessment/staffgrader/staff_grader_mixin.py rename to src/openassessment/staffgrader/staff_grader_mixin.py diff --git a/openassessment/staffgrader/tests/__init__.py b/src/openassessment/staffgrader/tests/__init__.py similarity index 100% rename from openassessment/staffgrader/tests/__init__.py rename to src/openassessment/staffgrader/tests/__init__.py diff --git a/openassessment/staffgrader/tests/test_base.py b/src/openassessment/staffgrader/tests/test_base.py similarity index 100% rename from openassessment/staffgrader/tests/test_base.py rename to src/openassessment/staffgrader/tests/test_base.py diff --git a/openassessment/staffgrader/tests/test_decorators.py b/src/openassessment/staffgrader/tests/test_decorators.py similarity index 100% rename from openassessment/staffgrader/tests/test_decorators.py rename to src/openassessment/staffgrader/tests/test_decorators.py diff --git a/openassessment/staffgrader/tests/test_get_assessment_info.py b/src/openassessment/staffgrader/tests/test_get_assessment_info.py similarity index 100% rename from openassessment/staffgrader/tests/test_get_assessment_info.py rename to src/openassessment/staffgrader/tests/test_get_assessment_info.py diff --git a/openassessment/staffgrader/tests/test_get_submission_info.py b/src/openassessment/staffgrader/tests/test_get_submission_info.py similarity index 100% rename from openassessment/staffgrader/tests/test_get_submission_info.py rename to src/openassessment/staffgrader/tests/test_get_submission_info.py diff --git a/openassessment/staffgrader/tests/test_list_staff_workflows.py b/src/openassessment/staffgrader/tests/test_list_staff_workflows.py similarity index 100% rename from openassessment/staffgrader/tests/test_list_staff_workflows.py rename to src/openassessment/staffgrader/tests/test_list_staff_workflows.py diff --git a/openassessment/staffgrader/tests/test_serializers.py b/src/openassessment/staffgrader/tests/test_serializers.py similarity index 100% rename from openassessment/staffgrader/tests/test_serializers.py rename to src/openassessment/staffgrader/tests/test_serializers.py diff --git a/openassessment/staffgrader/tests/test_staff_grader_mixin.py b/src/openassessment/staffgrader/tests/test_staff_grader_mixin.py similarity index 100% rename from openassessment/staffgrader/tests/test_staff_grader_mixin.py rename to src/openassessment/staffgrader/tests/test_staff_grader_mixin.py diff --git a/openassessment/staffgrader/tests/test_submission_lock_model.py b/src/openassessment/staffgrader/tests/test_submission_lock_model.py similarity index 100% rename from openassessment/staffgrader/tests/test_submission_lock_model.py rename to src/openassessment/staffgrader/tests/test_submission_lock_model.py diff --git a/openassessment/templates/legacy/edit/oa_edit.html b/src/openassessment/templates/legacy/edit/oa_edit.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit.html rename to src/openassessment/templates/legacy/edit/oa_edit.html diff --git a/openassessment/templates/legacy/edit/oa_edit_assessment_steps.html b/src/openassessment/templates/legacy/edit/oa_edit_assessment_steps.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_assessment_steps.html rename to src/openassessment/templates/legacy/edit/oa_edit_assessment_steps.html diff --git a/openassessment/templates/legacy/edit/oa_edit_basic_settings_list.html b/src/openassessment/templates/legacy/edit/oa_edit_basic_settings_list.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_basic_settings_list.html rename to src/openassessment/templates/legacy/edit/oa_edit_basic_settings_list.html diff --git a/openassessment/templates/legacy/edit/oa_edit_criterion.html b/src/openassessment/templates/legacy/edit/oa_edit_criterion.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_criterion.html rename to src/openassessment/templates/legacy/edit/oa_edit_criterion.html diff --git a/openassessment/templates/legacy/edit/oa_edit_header_and_validation.html b/src/openassessment/templates/legacy/edit/oa_edit_header_and_validation.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_header_and_validation.html rename to src/openassessment/templates/legacy/edit/oa_edit_header_and_validation.html diff --git a/openassessment/templates/legacy/edit/oa_edit_option.html b/src/openassessment/templates/legacy/edit/oa_edit_option.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_option.html rename to src/openassessment/templates/legacy/edit/oa_edit_option.html diff --git a/openassessment/templates/legacy/edit/oa_edit_peer_assessment.html b/src/openassessment/templates/legacy/edit/oa_edit_peer_assessment.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_peer_assessment.html rename to src/openassessment/templates/legacy/edit/oa_edit_peer_assessment.html diff --git a/openassessment/templates/legacy/edit/oa_edit_peer_assessment_schedule.html b/src/openassessment/templates/legacy/edit/oa_edit_peer_assessment_schedule.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_peer_assessment_schedule.html rename to src/openassessment/templates/legacy/edit/oa_edit_peer_assessment_schedule.html diff --git a/openassessment/templates/legacy/edit/oa_edit_prompt.html b/src/openassessment/templates/legacy/edit/oa_edit_prompt.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_prompt.html rename to src/openassessment/templates/legacy/edit/oa_edit_prompt.html diff --git a/openassessment/templates/legacy/edit/oa_edit_prompts.html b/src/openassessment/templates/legacy/edit/oa_edit_prompts.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_prompts.html rename to src/openassessment/templates/legacy/edit/oa_edit_prompts.html diff --git a/openassessment/templates/legacy/edit/oa_edit_rubric.html b/src/openassessment/templates/legacy/edit/oa_edit_rubric.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_rubric.html rename to src/openassessment/templates/legacy/edit/oa_edit_rubric.html diff --git a/openassessment/templates/legacy/edit/oa_edit_schedule.html b/src/openassessment/templates/legacy/edit/oa_edit_schedule.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_schedule.html rename to src/openassessment/templates/legacy/edit/oa_edit_schedule.html diff --git a/openassessment/templates/legacy/edit/oa_edit_self_assessment.html b/src/openassessment/templates/legacy/edit/oa_edit_self_assessment.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_self_assessment.html rename to src/openassessment/templates/legacy/edit/oa_edit_self_assessment.html diff --git a/openassessment/templates/legacy/edit/oa_edit_self_assessment_schedule.html b/src/openassessment/templates/legacy/edit/oa_edit_self_assessment_schedule.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_self_assessment_schedule.html rename to src/openassessment/templates/legacy/edit/oa_edit_self_assessment_schedule.html diff --git a/openassessment/templates/legacy/edit/oa_edit_settings.html b/src/openassessment/templates/legacy/edit/oa_edit_settings.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_settings.html rename to src/openassessment/templates/legacy/edit/oa_edit_settings.html diff --git a/openassessment/templates/legacy/edit/oa_edit_staff_assessment.html b/src/openassessment/templates/legacy/edit/oa_edit_staff_assessment.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_staff_assessment.html rename to src/openassessment/templates/legacy/edit/oa_edit_staff_assessment.html diff --git a/openassessment/templates/legacy/edit/oa_edit_student_training.html b/src/openassessment/templates/legacy/edit/oa_edit_student_training.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_edit_student_training.html rename to src/openassessment/templates/legacy/edit/oa_edit_student_training.html diff --git a/openassessment/templates/legacy/edit/oa_rubric_reuse.html b/src/openassessment/templates/legacy/edit/oa_rubric_reuse.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_rubric_reuse.html rename to src/openassessment/templates/legacy/edit/oa_rubric_reuse.html diff --git a/openassessment/templates/legacy/edit/oa_training_example.html b/src/openassessment/templates/legacy/edit/oa_training_example.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_training_example.html rename to src/openassessment/templates/legacy/edit/oa_training_example.html diff --git a/openassessment/templates/legacy/edit/oa_training_example_criterion.html b/src/openassessment/templates/legacy/edit/oa_training_example_criterion.html similarity index 100% rename from openassessment/templates/legacy/edit/oa_training_example_criterion.html rename to src/openassessment/templates/legacy/edit/oa_training_example_criterion.html diff --git a/openassessment/templates/legacy/grade/oa_assessment_feedback.html b/src/openassessment/templates/legacy/grade/oa_assessment_feedback.html similarity index 100% rename from openassessment/templates/legacy/grade/oa_assessment_feedback.html rename to src/openassessment/templates/legacy/grade/oa_assessment_feedback.html diff --git a/openassessment/templates/legacy/grade/oa_assessment_title.html b/src/openassessment/templates/legacy/grade/oa_assessment_title.html similarity index 100% rename from openassessment/templates/legacy/grade/oa_assessment_title.html rename to src/openassessment/templates/legacy/grade/oa_assessment_title.html diff --git a/openassessment/templates/legacy/grade/oa_grade_cancelled.html b/src/openassessment/templates/legacy/grade/oa_grade_cancelled.html similarity index 100% rename from openassessment/templates/legacy/grade/oa_grade_cancelled.html rename to src/openassessment/templates/legacy/grade/oa_grade_cancelled.html diff --git a/openassessment/templates/legacy/grade/oa_grade_complete.html b/src/openassessment/templates/legacy/grade/oa_grade_complete.html similarity index 100% rename from openassessment/templates/legacy/grade/oa_grade_complete.html rename to src/openassessment/templates/legacy/grade/oa_grade_complete.html diff --git a/openassessment/templates/legacy/grade/oa_grade_incomplete.html b/src/openassessment/templates/legacy/grade/oa_grade_incomplete.html similarity index 100% rename from openassessment/templates/legacy/grade/oa_grade_incomplete.html rename to src/openassessment/templates/legacy/grade/oa_grade_incomplete.html diff --git a/openassessment/templates/legacy/grade/oa_grade_not_started.html b/src/openassessment/templates/legacy/grade/oa_grade_not_started.html similarity index 100% rename from openassessment/templates/legacy/grade/oa_grade_not_started.html rename to src/openassessment/templates/legacy/grade/oa_grade_not_started.html diff --git a/openassessment/templates/legacy/grade/oa_grade_waiting.html b/src/openassessment/templates/legacy/grade/oa_grade_waiting.html similarity index 100% rename from openassessment/templates/legacy/grade/oa_grade_waiting.html rename to src/openassessment/templates/legacy/grade/oa_grade_waiting.html diff --git a/openassessment/templates/legacy/icons/warning_filled.html b/src/openassessment/templates/legacy/icons/warning_filled.html similarity index 100% rename from openassessment/templates/legacy/icons/warning_filled.html rename to src/openassessment/templates/legacy/icons/warning_filled.html diff --git a/openassessment/templates/legacy/instructor_dashboard/oa_grade_available_responses.html b/src/openassessment/templates/legacy/instructor_dashboard/oa_grade_available_responses.html similarity index 100% rename from openassessment/templates/legacy/instructor_dashboard/oa_grade_available_responses.html rename to src/openassessment/templates/legacy/instructor_dashboard/oa_grade_available_responses.html diff --git a/openassessment/templates/legacy/instructor_dashboard/oa_listing.html b/src/openassessment/templates/legacy/instructor_dashboard/oa_listing.html similarity index 100% rename from openassessment/templates/legacy/instructor_dashboard/oa_listing.html rename to src/openassessment/templates/legacy/instructor_dashboard/oa_listing.html diff --git a/openassessment/templates/legacy/instructor_dashboard/oa_waiting_step_details.html b/src/openassessment/templates/legacy/instructor_dashboard/oa_waiting_step_details.html similarity index 100% rename from openassessment/templates/legacy/instructor_dashboard/oa_waiting_step_details.html rename to src/openassessment/templates/legacy/instructor_dashboard/oa_waiting_step_details.html diff --git a/openassessment/templates/legacy/instructor_dashboard/open-response-assessment-summary.underscore b/src/openassessment/templates/legacy/instructor_dashboard/open-response-assessment-summary.underscore similarity index 100% rename from openassessment/templates/legacy/instructor_dashboard/open-response-assessment-summary.underscore rename to src/openassessment/templates/legacy/instructor_dashboard/open-response-assessment-summary.underscore diff --git a/openassessment/templates/legacy/leaderboard/oa_leaderboard_show.html b/src/openassessment/templates/legacy/leaderboard/oa_leaderboard_show.html similarity index 100% rename from openassessment/templates/legacy/leaderboard/oa_leaderboard_show.html rename to src/openassessment/templates/legacy/leaderboard/oa_leaderboard_show.html diff --git a/openassessment/templates/legacy/leaderboard/oa_leaderboard_waiting.html b/src/openassessment/templates/legacy/leaderboard/oa_leaderboard_waiting.html similarity index 100% rename from openassessment/templates/legacy/leaderboard/oa_leaderboard_waiting.html rename to src/openassessment/templates/legacy/leaderboard/oa_leaderboard_waiting.html diff --git a/openassessment/templates/legacy/message/oa_message_cancelled.html b/src/openassessment/templates/legacy/message/oa_message_cancelled.html similarity index 100% rename from openassessment/templates/legacy/message/oa_message_cancelled.html rename to src/openassessment/templates/legacy/message/oa_message_cancelled.html diff --git a/openassessment/templates/legacy/message/oa_message_closed.html b/src/openassessment/templates/legacy/message/oa_message_closed.html similarity index 100% rename from openassessment/templates/legacy/message/oa_message_closed.html rename to src/openassessment/templates/legacy/message/oa_message_closed.html diff --git a/openassessment/templates/legacy/message/oa_message_complete.html b/src/openassessment/templates/legacy/message/oa_message_complete.html similarity index 100% rename from openassessment/templates/legacy/message/oa_message_complete.html rename to src/openassessment/templates/legacy/message/oa_message_complete.html diff --git a/openassessment/templates/legacy/message/oa_message_incomplete.html b/src/openassessment/templates/legacy/message/oa_message_incomplete.html similarity index 100% rename from openassessment/templates/legacy/message/oa_message_incomplete.html rename to src/openassessment/templates/legacy/message/oa_message_incomplete.html diff --git a/openassessment/templates/legacy/message/oa_message_no_team.html b/src/openassessment/templates/legacy/message/oa_message_no_team.html similarity index 100% rename from openassessment/templates/legacy/message/oa_message_no_team.html rename to src/openassessment/templates/legacy/message/oa_message_no_team.html diff --git a/openassessment/templates/legacy/message/oa_message_open.html b/src/openassessment/templates/legacy/message/oa_message_open.html similarity index 100% rename from openassessment/templates/legacy/message/oa_message_open.html rename to src/openassessment/templates/legacy/message/oa_message_open.html diff --git a/openassessment/templates/legacy/message/oa_message_unavailable.html b/src/openassessment/templates/legacy/message/oa_message_unavailable.html similarity index 100% rename from openassessment/templates/legacy/message/oa_message_unavailable.html rename to src/openassessment/templates/legacy/message/oa_message_unavailable.html diff --git a/openassessment/templates/legacy/oa_base.html b/src/openassessment/templates/legacy/oa_base.html similarity index 100% rename from openassessment/templates/legacy/oa_base.html rename to src/openassessment/templates/legacy/oa_base.html diff --git a/openassessment/templates/legacy/oa_error.html b/src/openassessment/templates/legacy/oa_error.html similarity index 100% rename from openassessment/templates/legacy/oa_error.html rename to src/openassessment/templates/legacy/oa_error.html diff --git a/openassessment/templates/legacy/oa_latex_preview.html b/src/openassessment/templates/legacy/oa_latex_preview.html similarity index 100% rename from openassessment/templates/legacy/oa_latex_preview.html rename to src/openassessment/templates/legacy/oa_latex_preview.html diff --git a/openassessment/templates/legacy/oa_rubric.html b/src/openassessment/templates/legacy/oa_rubric.html similarity index 100% rename from openassessment/templates/legacy/oa_rubric.html rename to src/openassessment/templates/legacy/oa_rubric.html diff --git a/openassessment/templates/legacy/oa_submission_answer.html b/src/openassessment/templates/legacy/oa_submission_answer.html similarity index 100% rename from openassessment/templates/legacy/oa_submission_answer.html rename to src/openassessment/templates/legacy/oa_submission_answer.html diff --git a/openassessment/templates/legacy/oa_team_uploaded_files.html b/src/openassessment/templates/legacy/oa_team_uploaded_files.html similarity index 100% rename from openassessment/templates/legacy/oa_team_uploaded_files.html rename to src/openassessment/templates/legacy/oa_team_uploaded_files.html diff --git a/openassessment/templates/legacy/oa_uploaded_file.html b/src/openassessment/templates/legacy/oa_uploaded_file.html similarity index 100% rename from openassessment/templates/legacy/oa_uploaded_file.html rename to src/openassessment/templates/legacy/oa_uploaded_file.html diff --git a/openassessment/templates/legacy/peer/oa_peer_assessment.html b/src/openassessment/templates/legacy/peer/oa_peer_assessment.html similarity index 100% rename from openassessment/templates/legacy/peer/oa_peer_assessment.html rename to src/openassessment/templates/legacy/peer/oa_peer_assessment.html diff --git a/openassessment/templates/legacy/peer/oa_peer_cancelled.html b/src/openassessment/templates/legacy/peer/oa_peer_cancelled.html similarity index 100% rename from openassessment/templates/legacy/peer/oa_peer_cancelled.html rename to src/openassessment/templates/legacy/peer/oa_peer_cancelled.html diff --git a/openassessment/templates/legacy/peer/oa_peer_closed.html b/src/openassessment/templates/legacy/peer/oa_peer_closed.html similarity index 100% rename from openassessment/templates/legacy/peer/oa_peer_closed.html rename to src/openassessment/templates/legacy/peer/oa_peer_closed.html diff --git a/openassessment/templates/legacy/peer/oa_peer_complete.html b/src/openassessment/templates/legacy/peer/oa_peer_complete.html similarity index 100% rename from openassessment/templates/legacy/peer/oa_peer_complete.html rename to src/openassessment/templates/legacy/peer/oa_peer_complete.html diff --git a/openassessment/templates/legacy/peer/oa_peer_turbo_mode.html b/src/openassessment/templates/legacy/peer/oa_peer_turbo_mode.html similarity index 100% rename from openassessment/templates/legacy/peer/oa_peer_turbo_mode.html rename to src/openassessment/templates/legacy/peer/oa_peer_turbo_mode.html diff --git a/openassessment/templates/legacy/peer/oa_peer_turbo_mode_waiting.html b/src/openassessment/templates/legacy/peer/oa_peer_turbo_mode_waiting.html similarity index 100% rename from openassessment/templates/legacy/peer/oa_peer_turbo_mode_waiting.html rename to src/openassessment/templates/legacy/peer/oa_peer_turbo_mode_waiting.html diff --git a/openassessment/templates/legacy/peer/oa_peer_unavailable.html b/src/openassessment/templates/legacy/peer/oa_peer_unavailable.html similarity index 100% rename from openassessment/templates/legacy/peer/oa_peer_unavailable.html rename to src/openassessment/templates/legacy/peer/oa_peer_unavailable.html diff --git a/openassessment/templates/legacy/peer/oa_peer_waiting.html b/src/openassessment/templates/legacy/peer/oa_peer_waiting.html similarity index 100% rename from openassessment/templates/legacy/peer/oa_peer_waiting.html rename to src/openassessment/templates/legacy/peer/oa_peer_waiting.html diff --git a/openassessment/templates/legacy/response/oa_response.html b/src/openassessment/templates/legacy/response/oa_response.html similarity index 100% rename from openassessment/templates/legacy/response/oa_response.html rename to src/openassessment/templates/legacy/response/oa_response.html diff --git a/openassessment/templates/legacy/response/oa_response_cancelled.html b/src/openassessment/templates/legacy/response/oa_response_cancelled.html similarity index 100% rename from openassessment/templates/legacy/response/oa_response_cancelled.html rename to src/openassessment/templates/legacy/response/oa_response_cancelled.html diff --git a/openassessment/templates/legacy/response/oa_response_closed.html b/src/openassessment/templates/legacy/response/oa_response_closed.html similarity index 100% rename from openassessment/templates/legacy/response/oa_response_closed.html rename to src/openassessment/templates/legacy/response/oa_response_closed.html diff --git a/openassessment/templates/legacy/response/oa_response_graded.html b/src/openassessment/templates/legacy/response/oa_response_graded.html similarity index 100% rename from openassessment/templates/legacy/response/oa_response_graded.html rename to src/openassessment/templates/legacy/response/oa_response_graded.html diff --git a/openassessment/templates/legacy/response/oa_response_studio_preview.html b/src/openassessment/templates/legacy/response/oa_response_studio_preview.html similarity index 100% rename from openassessment/templates/legacy/response/oa_response_studio_preview.html rename to src/openassessment/templates/legacy/response/oa_response_studio_preview.html diff --git a/openassessment/templates/legacy/response/oa_response_submitted.html b/src/openassessment/templates/legacy/response/oa_response_submitted.html similarity index 100% rename from openassessment/templates/legacy/response/oa_response_submitted.html rename to src/openassessment/templates/legacy/response/oa_response_submitted.html diff --git a/openassessment/templates/legacy/response/oa_response_team_already_submitted.html b/src/openassessment/templates/legacy/response/oa_response_team_already_submitted.html similarity index 100% rename from openassessment/templates/legacy/response/oa_response_team_already_submitted.html rename to src/openassessment/templates/legacy/response/oa_response_team_already_submitted.html diff --git a/openassessment/templates/legacy/response/oa_response_unavailable.html b/src/openassessment/templates/legacy/response/oa_response_unavailable.html similarity index 100% rename from openassessment/templates/legacy/response/oa_response_unavailable.html rename to src/openassessment/templates/legacy/response/oa_response_unavailable.html diff --git a/openassessment/templates/legacy/self/oa_self_assessment.html b/src/openassessment/templates/legacy/self/oa_self_assessment.html similarity index 100% rename from openassessment/templates/legacy/self/oa_self_assessment.html rename to src/openassessment/templates/legacy/self/oa_self_assessment.html diff --git a/openassessment/templates/legacy/self/oa_self_cancelled.html b/src/openassessment/templates/legacy/self/oa_self_cancelled.html similarity index 100% rename from openassessment/templates/legacy/self/oa_self_cancelled.html rename to src/openassessment/templates/legacy/self/oa_self_cancelled.html diff --git a/openassessment/templates/legacy/self/oa_self_closed.html b/src/openassessment/templates/legacy/self/oa_self_closed.html similarity index 100% rename from openassessment/templates/legacy/self/oa_self_closed.html rename to src/openassessment/templates/legacy/self/oa_self_closed.html diff --git a/openassessment/templates/legacy/self/oa_self_complete.html b/src/openassessment/templates/legacy/self/oa_self_complete.html similarity index 100% rename from openassessment/templates/legacy/self/oa_self_complete.html rename to src/openassessment/templates/legacy/self/oa_self_complete.html diff --git a/openassessment/templates/legacy/self/oa_self_unavailable.html b/src/openassessment/templates/legacy/self/oa_self_unavailable.html similarity index 100% rename from openassessment/templates/legacy/self/oa_self_unavailable.html rename to src/openassessment/templates/legacy/self/oa_self_unavailable.html diff --git a/openassessment/templates/legacy/staff/oa_staff_grade.html b/src/openassessment/templates/legacy/staff/oa_staff_grade.html similarity index 100% rename from openassessment/templates/legacy/staff/oa_staff_grade.html rename to src/openassessment/templates/legacy/staff/oa_staff_grade.html diff --git a/openassessment/templates/legacy/staff_area/oa_staff_area.html b/src/openassessment/templates/legacy/staff_area/oa_staff_area.html similarity index 100% rename from openassessment/templates/legacy/staff_area/oa_staff_area.html rename to src/openassessment/templates/legacy/staff_area/oa_staff_area.html diff --git a/openassessment/templates/legacy/staff_area/oa_staff_grade_learners.html b/src/openassessment/templates/legacy/staff_area/oa_staff_grade_learners.html similarity index 100% rename from openassessment/templates/legacy/staff_area/oa_staff_grade_learners.html rename to src/openassessment/templates/legacy/staff_area/oa_staff_grade_learners.html diff --git a/openassessment/templates/legacy/staff_area/oa_staff_grade_learners_assessment.html b/src/openassessment/templates/legacy/staff_area/oa_staff_grade_learners_assessment.html similarity index 100% rename from openassessment/templates/legacy/staff_area/oa_staff_grade_learners_assessment.html rename to src/openassessment/templates/legacy/staff_area/oa_staff_grade_learners_assessment.html diff --git a/openassessment/templates/legacy/staff_area/oa_staff_grade_learners_count.html b/src/openassessment/templates/legacy/staff_area/oa_staff_grade_learners_count.html similarity index 100% rename from openassessment/templates/legacy/staff_area/oa_staff_grade_learners_count.html rename to src/openassessment/templates/legacy/staff_area/oa_staff_grade_learners_count.html diff --git a/openassessment/templates/legacy/staff_area/oa_staff_override_assessment.html b/src/openassessment/templates/legacy/staff_area/oa_staff_override_assessment.html similarity index 100% rename from openassessment/templates/legacy/staff_area/oa_staff_override_assessment.html rename to src/openassessment/templates/legacy/staff_area/oa_staff_override_assessment.html diff --git a/openassessment/templates/legacy/staff_area/oa_student_info.html b/src/openassessment/templates/legacy/staff_area/oa_student_info.html similarity index 100% rename from openassessment/templates/legacy/staff_area/oa_student_info.html rename to src/openassessment/templates/legacy/staff_area/oa_student_info.html diff --git a/openassessment/templates/legacy/staff_area/oa_student_info_assessment_detail.html b/src/openassessment/templates/legacy/staff_area/oa_student_info_assessment_detail.html similarity index 100% rename from openassessment/templates/legacy/staff_area/oa_student_info_assessment_detail.html rename to src/openassessment/templates/legacy/staff_area/oa_student_info_assessment_detail.html diff --git a/openassessment/templates/legacy/student_training/student_training.html b/src/openassessment/templates/legacy/student_training/student_training.html similarity index 100% rename from openassessment/templates/legacy/student_training/student_training.html rename to src/openassessment/templates/legacy/student_training/student_training.html diff --git a/openassessment/templates/legacy/student_training/student_training_cancelled.html b/src/openassessment/templates/legacy/student_training/student_training_cancelled.html similarity index 100% rename from openassessment/templates/legacy/student_training/student_training_cancelled.html rename to src/openassessment/templates/legacy/student_training/student_training_cancelled.html diff --git a/openassessment/templates/legacy/student_training/student_training_closed.html b/src/openassessment/templates/legacy/student_training/student_training_closed.html similarity index 100% rename from openassessment/templates/legacy/student_training/student_training_closed.html rename to src/openassessment/templates/legacy/student_training/student_training_closed.html diff --git a/openassessment/templates/legacy/student_training/student_training_complete.html b/src/openassessment/templates/legacy/student_training/student_training_complete.html similarity index 100% rename from openassessment/templates/legacy/student_training/student_training_complete.html rename to src/openassessment/templates/legacy/student_training/student_training_complete.html diff --git a/openassessment/templates/legacy/student_training/student_training_error.html b/src/openassessment/templates/legacy/student_training/student_training_error.html similarity index 100% rename from openassessment/templates/legacy/student_training/student_training_error.html rename to src/openassessment/templates/legacy/student_training/student_training_error.html diff --git a/openassessment/templates/legacy/student_training/student_training_unavailable.html b/src/openassessment/templates/legacy/student_training/student_training_unavailable.html similarity index 100% rename from openassessment/templates/legacy/student_training/student_training_unavailable.html rename to src/openassessment/templates/legacy/student_training/student_training_unavailable.html diff --git a/openassessment/templates/openassessmentblock/base.html b/src/openassessment/templates/openassessmentblock/base.html similarity index 100% rename from openassessment/templates/openassessmentblock/base.html rename to src/openassessment/templates/openassessmentblock/base.html diff --git a/openassessment/templatetags/__init__.py b/src/openassessment/templatetags/__init__.py similarity index 100% rename from openassessment/templatetags/__init__.py rename to src/openassessment/templatetags/__init__.py diff --git a/openassessment/templatetags/oa_extras.py b/src/openassessment/templatetags/oa_extras.py similarity index 100% rename from openassessment/templatetags/oa_extras.py rename to src/openassessment/templatetags/oa_extras.py diff --git a/openassessment/test_utils.py b/src/openassessment/test_utils.py similarity index 100% rename from openassessment/test_utils.py rename to src/openassessment/test_utils.py diff --git a/openassessment/tests/__init__.py b/src/openassessment/tests/__init__.py similarity index 100% rename from openassessment/tests/__init__.py rename to src/openassessment/tests/__init__.py diff --git a/openassessment/tests/data/db_fixtures/empty.json b/src/openassessment/tests/data/db_fixtures/empty.json similarity index 100% rename from openassessment/tests/data/db_fixtures/empty.json rename to src/openassessment/tests/data/db_fixtures/empty.json diff --git a/openassessment/tests/data/db_fixtures/feedback_on_assessment.json b/src/openassessment/tests/data/db_fixtures/feedback_on_assessment.json similarity index 100% rename from openassessment/tests/data/db_fixtures/feedback_on_assessment.json rename to src/openassessment/tests/data/db_fixtures/feedback_on_assessment.json diff --git a/openassessment/tests/data/db_fixtures/feedback_only_criterion.json b/src/openassessment/tests/data/db_fixtures/feedback_only_criterion.json similarity index 100% rename from openassessment/tests/data/db_fixtures/feedback_only_criterion.json rename to src/openassessment/tests/data/db_fixtures/feedback_only_criterion.json diff --git a/openassessment/tests/data/db_fixtures/peer_assessed.json b/src/openassessment/tests/data/db_fixtures/peer_assessed.json similarity index 100% rename from openassessment/tests/data/db_fixtures/peer_assessed.json rename to src/openassessment/tests/data/db_fixtures/peer_assessed.json diff --git a/openassessment/tests/data/db_fixtures/scored.json b/src/openassessment/tests/data/db_fixtures/scored.json similarity index 100% rename from openassessment/tests/data/db_fixtures/scored.json rename to src/openassessment/tests/data/db_fixtures/scored.json diff --git a/openassessment/tests/data/db_fixtures/self_assessed.json b/src/openassessment/tests/data/db_fixtures/self_assessed.json similarity index 100% rename from openassessment/tests/data/db_fixtures/self_assessed.json rename to src/openassessment/tests/data/db_fixtures/self_assessed.json diff --git a/openassessment/tests/data/db_fixtures/submitted.json b/src/openassessment/tests/data/db_fixtures/submitted.json similarity index 100% rename from openassessment/tests/data/db_fixtures/submitted.json rename to src/openassessment/tests/data/db_fixtures/submitted.json diff --git a/openassessment/tests/data/db_fixtures/unicode.json b/src/openassessment/tests/data/db_fixtures/unicode.json similarity index 100% rename from openassessment/tests/data/db_fixtures/unicode.json rename to src/openassessment/tests/data/db_fixtures/unicode.json diff --git a/openassessment/tests/data/write_to_csv.json b/src/openassessment/tests/data/write_to_csv.json similarity index 100% rename from openassessment/tests/data/write_to_csv.json rename to src/openassessment/tests/data/write_to_csv.json diff --git a/openassessment/tests/factories.py b/src/openassessment/tests/factories.py similarity index 100% rename from openassessment/tests/factories.py rename to src/openassessment/tests/factories.py diff --git a/openassessment/tests/test_data.py b/src/openassessment/tests/test_data.py similarity index 100% rename from openassessment/tests/test_data.py rename to src/openassessment/tests/test_data.py diff --git a/openassessment/tests/test_templatetags.py b/src/openassessment/tests/test_templatetags.py similarity index 100% rename from openassessment/tests/test_templatetags.py rename to src/openassessment/tests/test_templatetags.py diff --git a/openassessment/workflow/__init__.py b/src/openassessment/workflow/__init__.py similarity index 100% rename from openassessment/workflow/__init__.py rename to src/openassessment/workflow/__init__.py diff --git a/openassessment/workflow/admin.py b/src/openassessment/workflow/admin.py similarity index 100% rename from openassessment/workflow/admin.py rename to src/openassessment/workflow/admin.py diff --git a/openassessment/workflow/api.py b/src/openassessment/workflow/api.py similarity index 100% rename from openassessment/workflow/api.py rename to src/openassessment/workflow/api.py diff --git a/openassessment/workflow/errors.py b/src/openassessment/workflow/errors.py similarity index 100% rename from openassessment/workflow/errors.py rename to src/openassessment/workflow/errors.py diff --git a/openassessment/workflow/migrations/0001_initial.py b/src/openassessment/workflow/migrations/0001_initial.py similarity index 100% rename from openassessment/workflow/migrations/0001_initial.py rename to src/openassessment/workflow/migrations/0001_initial.py diff --git a/openassessment/workflow/migrations/0002_remove_django_extensions.py b/src/openassessment/workflow/migrations/0002_remove_django_extensions.py similarity index 100% rename from openassessment/workflow/migrations/0002_remove_django_extensions.py rename to src/openassessment/workflow/migrations/0002_remove_django_extensions.py diff --git a/openassessment/workflow/migrations/0003_TeamWorkflows.py b/src/openassessment/workflow/migrations/0003_TeamWorkflows.py similarity index 100% rename from openassessment/workflow/migrations/0003_TeamWorkflows.py rename to src/openassessment/workflow/migrations/0003_TeamWorkflows.py diff --git a/openassessment/workflow/migrations/0004_assessmentworkflowstep_skipped.py b/src/openassessment/workflow/migrations/0004_assessmentworkflowstep_skipped.py similarity index 100% rename from openassessment/workflow/migrations/0004_assessmentworkflowstep_skipped.py rename to src/openassessment/workflow/migrations/0004_assessmentworkflowstep_skipped.py diff --git a/openassessment/workflow/migrations/0005_alter_assessmentworkflow_status.py b/src/openassessment/workflow/migrations/0005_alter_assessmentworkflow_status.py similarity index 100% rename from openassessment/workflow/migrations/0005_alter_assessmentworkflow_status.py rename to src/openassessment/workflow/migrations/0005_alter_assessmentworkflow_status.py diff --git a/openassessment/workflow/migrations/0006_mariadb_uuid_conversion.py b/src/openassessment/workflow/migrations/0006_mariadb_uuid_conversion.py similarity index 100% rename from openassessment/workflow/migrations/0006_mariadb_uuid_conversion.py rename to src/openassessment/workflow/migrations/0006_mariadb_uuid_conversion.py diff --git a/openassessment/workflow/migrations/0007_orareminder.py b/src/openassessment/workflow/migrations/0007_orareminder.py similarity index 100% rename from openassessment/workflow/migrations/0007_orareminder.py rename to src/openassessment/workflow/migrations/0007_orareminder.py diff --git a/openassessment/workflow/migrations/0008_orareminder_sent_count.py b/src/openassessment/workflow/migrations/0008_orareminder_sent_count.py similarity index 100% rename from openassessment/workflow/migrations/0008_orareminder_sent_count.py rename to src/openassessment/workflow/migrations/0008_orareminder_sent_count.py diff --git a/openassessment/workflow/migrations/__init__.py b/src/openassessment/workflow/migrations/__init__.py similarity index 100% rename from openassessment/workflow/migrations/__init__.py rename to src/openassessment/workflow/migrations/__init__.py diff --git a/openassessment/workflow/models.py b/src/openassessment/workflow/models.py similarity index 100% rename from openassessment/workflow/models.py rename to src/openassessment/workflow/models.py diff --git a/openassessment/workflow/serializers.py b/src/openassessment/workflow/serializers.py similarity index 100% rename from openassessment/workflow/serializers.py rename to src/openassessment/workflow/serializers.py diff --git a/openassessment/workflow/tasks.py b/src/openassessment/workflow/tasks.py similarity index 100% rename from openassessment/workflow/tasks.py rename to src/openassessment/workflow/tasks.py diff --git a/openassessment/workflow/team_api.py b/src/openassessment/workflow/team_api.py similarity index 100% rename from openassessment/workflow/team_api.py rename to src/openassessment/workflow/team_api.py diff --git a/openassessment/workflow/test/__init__.py b/src/openassessment/workflow/test/__init__.py similarity index 100% rename from openassessment/workflow/test/__init__.py rename to src/openassessment/workflow/test/__init__.py diff --git a/openassessment/workflow/test/data/assessments.json b/src/openassessment/workflow/test/data/assessments.json similarity index 100% rename from openassessment/workflow/test/data/assessments.json rename to src/openassessment/workflow/test/data/assessments.json diff --git a/openassessment/workflow/test/factories.py b/src/openassessment/workflow/test/factories.py similarity index 100% rename from openassessment/workflow/test/factories.py rename to src/openassessment/workflow/test/factories.py diff --git a/openassessment/workflow/test/test_api.py b/src/openassessment/workflow/test/test_api.py similarity index 100% rename from openassessment/workflow/test/test_api.py rename to src/openassessment/workflow/test/test_api.py diff --git a/openassessment/workflow/test/test_models.py b/src/openassessment/workflow/test/test_models.py similarity index 100% rename from openassessment/workflow/test/test_models.py rename to src/openassessment/workflow/test/test_models.py diff --git a/openassessment/workflow/test/test_signals.py b/src/openassessment/workflow/test/test_signals.py similarity index 100% rename from openassessment/workflow/test/test_signals.py rename to src/openassessment/workflow/test/test_signals.py diff --git a/openassessment/workflow/test/test_team_api.py b/src/openassessment/workflow/test/test_team_api.py similarity index 100% rename from openassessment/workflow/test/test_team_api.py rename to src/openassessment/workflow/test/test_team_api.py diff --git a/openassessment/workflow/test/test_workflow_batch_update_api.py b/src/openassessment/workflow/test/test_workflow_batch_update_api.py similarity index 100% rename from openassessment/workflow/test/test_workflow_batch_update_api.py rename to src/openassessment/workflow/test/test_workflow_batch_update_api.py diff --git a/openassessment/workflow/workflow_batch_update_api.py b/src/openassessment/workflow/workflow_batch_update_api.py similarity index 100% rename from openassessment/workflow/workflow_batch_update_api.py rename to src/openassessment/workflow/workflow_batch_update_api.py diff --git a/openassessment/xblock/__init__.py b/src/openassessment/xblock/__init__.py similarity index 100% rename from openassessment/xblock/__init__.py rename to src/openassessment/xblock/__init__.py diff --git a/openassessment/xblock/apis/__init__.py b/src/openassessment/xblock/apis/__init__.py similarity index 100% rename from openassessment/xblock/apis/__init__.py rename to src/openassessment/xblock/apis/__init__.py diff --git a/openassessment/xblock/apis/assessments/__init__.py b/src/openassessment/xblock/apis/assessments/__init__.py similarity index 100% rename from openassessment/xblock/apis/assessments/__init__.py rename to src/openassessment/xblock/apis/assessments/__init__.py diff --git a/openassessment/xblock/apis/assessments/errors.py b/src/openassessment/xblock/apis/assessments/errors.py similarity index 100% rename from openassessment/xblock/apis/assessments/errors.py rename to src/openassessment/xblock/apis/assessments/errors.py diff --git a/openassessment/xblock/apis/assessments/peer_assessment_api.py b/src/openassessment/xblock/apis/assessments/peer_assessment_api.py similarity index 100% rename from openassessment/xblock/apis/assessments/peer_assessment_api.py rename to src/openassessment/xblock/apis/assessments/peer_assessment_api.py diff --git a/openassessment/xblock/apis/assessments/self_assessment_api.py b/src/openassessment/xblock/apis/assessments/self_assessment_api.py similarity index 100% rename from openassessment/xblock/apis/assessments/self_assessment_api.py rename to src/openassessment/xblock/apis/assessments/self_assessment_api.py diff --git a/openassessment/xblock/apis/assessments/staff_assessment_api.py b/src/openassessment/xblock/apis/assessments/staff_assessment_api.py similarity index 100% rename from openassessment/xblock/apis/assessments/staff_assessment_api.py rename to src/openassessment/xblock/apis/assessments/staff_assessment_api.py diff --git a/openassessment/xblock/apis/assessments/student_training_api.py b/src/openassessment/xblock/apis/assessments/student_training_api.py similarity index 100% rename from openassessment/xblock/apis/assessments/student_training_api.py rename to src/openassessment/xblock/apis/assessments/student_training_api.py diff --git a/openassessment/xblock/apis/grades_api.py b/src/openassessment/xblock/apis/grades_api.py similarity index 100% rename from openassessment/xblock/apis/grades_api.py rename to src/openassessment/xblock/apis/grades_api.py diff --git a/openassessment/xblock/apis/ora_config_api.py b/src/openassessment/xblock/apis/ora_config_api.py similarity index 100% rename from openassessment/xblock/apis/ora_config_api.py rename to src/openassessment/xblock/apis/ora_config_api.py diff --git a/openassessment/xblock/apis/ora_data_accessor.py b/src/openassessment/xblock/apis/ora_data_accessor.py similarity index 100% rename from openassessment/xblock/apis/ora_data_accessor.py rename to src/openassessment/xblock/apis/ora_data_accessor.py diff --git a/openassessment/xblock/apis/step_data_api.py b/src/openassessment/xblock/apis/step_data_api.py similarity index 100% rename from openassessment/xblock/apis/step_data_api.py rename to src/openassessment/xblock/apis/step_data_api.py diff --git a/openassessment/xblock/apis/submissions/__init__.py b/src/openassessment/xblock/apis/submissions/__init__.py similarity index 100% rename from openassessment/xblock/apis/submissions/__init__.py rename to src/openassessment/xblock/apis/submissions/__init__.py diff --git a/openassessment/xblock/apis/submissions/errors.py b/src/openassessment/xblock/apis/submissions/errors.py similarity index 100% rename from openassessment/xblock/apis/submissions/errors.py rename to src/openassessment/xblock/apis/submissions/errors.py diff --git a/openassessment/xblock/apis/submissions/file_api.py b/src/openassessment/xblock/apis/submissions/file_api.py similarity index 100% rename from openassessment/xblock/apis/submissions/file_api.py rename to src/openassessment/xblock/apis/submissions/file_api.py diff --git a/openassessment/xblock/apis/submissions/submissions_actions.py b/src/openassessment/xblock/apis/submissions/submissions_actions.py similarity index 100% rename from openassessment/xblock/apis/submissions/submissions_actions.py rename to src/openassessment/xblock/apis/submissions/submissions_actions.py diff --git a/openassessment/xblock/apis/submissions/submissions_api.py b/src/openassessment/xblock/apis/submissions/submissions_api.py similarity index 100% rename from openassessment/xblock/apis/submissions/submissions_api.py rename to src/openassessment/xblock/apis/submissions/submissions_api.py diff --git a/openassessment/xblock/apis/workflow_api.py b/src/openassessment/xblock/apis/workflow_api.py similarity index 100% rename from openassessment/xblock/apis/workflow_api.py rename to src/openassessment/xblock/apis/workflow_api.py diff --git a/openassessment/xblock/config_mixin.py b/src/openassessment/xblock/config_mixin.py similarity index 100% rename from openassessment/xblock/config_mixin.py rename to src/openassessment/xblock/config_mixin.py diff --git a/openassessment/xblock/course_items_listing_mixin.py b/src/openassessment/xblock/course_items_listing_mixin.py similarity index 100% rename from openassessment/xblock/course_items_listing_mixin.py rename to src/openassessment/xblock/course_items_listing_mixin.py diff --git a/openassessment/xblock/files_mixin.py b/src/openassessment/xblock/files_mixin.py similarity index 100% rename from openassessment/xblock/files_mixin.py rename to src/openassessment/xblock/files_mixin.py diff --git a/openassessment/xblock/grade_mixin.py b/src/openassessment/xblock/grade_mixin.py similarity index 100% rename from openassessment/xblock/grade_mixin.py rename to src/openassessment/xblock/grade_mixin.py diff --git a/openassessment/xblock/leaderboard_mixin.py b/src/openassessment/xblock/leaderboard_mixin.py similarity index 98% rename from openassessment/xblock/leaderboard_mixin.py rename to src/openassessment/xblock/leaderboard_mixin.py index 54c563c5d8..25768ad49d 100644 --- a/openassessment/xblock/leaderboard_mixin.py +++ b/src/openassessment/xblock/leaderboard_mixin.py @@ -143,8 +143,8 @@ def _get_file_download_url(self, file_key): except FileUploadError as exc: logger.exception( 'FileUploadError: URL retrieval failed for key %s with error %s', - file_key=file_key, - error=exc + file_key, + exc, ) file_download_url = '' return file_download_url diff --git a/openassessment/xblock/lms_mixin.py b/src/openassessment/xblock/lms_mixin.py similarity index 100% rename from openassessment/xblock/lms_mixin.py rename to src/openassessment/xblock/lms_mixin.py diff --git a/openassessment/xblock/load_static.py b/src/openassessment/xblock/load_static.py similarity index 100% rename from openassessment/xblock/load_static.py rename to src/openassessment/xblock/load_static.py diff --git a/openassessment/xblock/message_mixin.py b/src/openassessment/xblock/message_mixin.py similarity index 100% rename from openassessment/xblock/message_mixin.py rename to src/openassessment/xblock/message_mixin.py diff --git a/openassessment/xblock/mobile.py b/src/openassessment/xblock/mobile.py similarity index 100% rename from openassessment/xblock/mobile.py rename to src/openassessment/xblock/mobile.py diff --git a/openassessment/xblock/openassesment_template_mixin.py b/src/openassessment/xblock/openassesment_template_mixin.py similarity index 100% rename from openassessment/xblock/openassesment_template_mixin.py rename to src/openassessment/xblock/openassesment_template_mixin.py diff --git a/openassessment/xblock/openassessmentblock.py b/src/openassessment/xblock/openassessmentblock.py similarity index 99% rename from openassessment/xblock/openassessmentblock.py rename to src/openassessment/xblock/openassessmentblock.py index 2b920a2a48..aece74b153 100644 --- a/openassessment/xblock/openassessmentblock.py +++ b/src/openassessment/xblock/openassessmentblock.py @@ -935,6 +935,7 @@ def parse_xml(cls, node, runtime, keys): block.allow_latex = config['allow_latex'] block.allow_learner_resubmissions = config['allow_learner_resubmissions'] block.allow_multiple_files = config['allow_multiple_files'] + block.date_config_type = config['date_config_type'] or DATE_CONFIG_MANUAL block.display_name = config['title'] block.file_upload_response = config['file_upload_response'] block.file_upload_type = config['file_upload_type'] diff --git a/openassessment/xblock/rubric_reuse_mixin.py b/src/openassessment/xblock/rubric_reuse_mixin.py similarity index 100% rename from openassessment/xblock/rubric_reuse_mixin.py rename to src/openassessment/xblock/rubric_reuse_mixin.py diff --git a/openassessment/xblock/staff_area_mixin.py b/src/openassessment/xblock/staff_area_mixin.py similarity index 100% rename from openassessment/xblock/staff_area_mixin.py rename to src/openassessment/xblock/staff_area_mixin.py diff --git a/openassessment/xblock/static/css/lib/backgrid/backgrid.css b/src/openassessment/xblock/static/css/lib/backgrid/backgrid.css similarity index 100% rename from openassessment/xblock/static/css/lib/backgrid/backgrid.css rename to src/openassessment/xblock/static/css/lib/backgrid/backgrid.css diff --git a/openassessment/xblock/static/css/lib/backgrid/backgrid.min.css b/src/openassessment/xblock/static/css/lib/backgrid/backgrid.min.css similarity index 100% rename from openassessment/xblock/static/css/lib/backgrid/backgrid.min.css rename to src/openassessment/xblock/static/css/lib/backgrid/backgrid.min.css diff --git a/openassessment/xblock/static/dist/4620b30a966533ace489dcc7afb151b9.png b/src/openassessment/xblock/static/dist/4620b30a966533ace489dcc7afb151b9.png similarity index 100% rename from openassessment/xblock/static/dist/4620b30a966533ace489dcc7afb151b9.png rename to src/openassessment/xblock/static/dist/4620b30a966533ace489dcc7afb151b9.png diff --git a/openassessment/xblock/static/dist/95ec738c0b7faac5b5c9126794446bbd.svg b/src/openassessment/xblock/static/dist/95ec738c0b7faac5b5c9126794446bbd.svg similarity index 100% rename from openassessment/xblock/static/dist/95ec738c0b7faac5b5c9126794446bbd.svg rename to src/openassessment/xblock/static/dist/95ec738c0b7faac5b5c9126794446bbd.svg diff --git a/openassessment/xblock/static/dist/manifest.json b/src/openassessment/xblock/static/dist/manifest.json similarity index 100% rename from openassessment/xblock/static/dist/manifest.json rename to src/openassessment/xblock/static/dist/manifest.json diff --git a/openassessment/xblock/static/dist/openassessment-editor-textarea.cbb31e4372be87d437fb.js b/src/openassessment/xblock/static/dist/openassessment-editor-textarea.cbb31e4372be87d437fb.js similarity index 100% rename from openassessment/xblock/static/dist/openassessment-editor-textarea.cbb31e4372be87d437fb.js rename to src/openassessment/xblock/static/dist/openassessment-editor-textarea.cbb31e4372be87d437fb.js diff --git a/openassessment/xblock/static/dist/openassessment-editor-tinymce.ab9f042f233087bba4b8.js b/src/openassessment/xblock/static/dist/openassessment-editor-tinymce.ab9f042f233087bba4b8.js similarity index 100% rename from openassessment/xblock/static/dist/openassessment-editor-tinymce.ab9f042f233087bba4b8.js rename to src/openassessment/xblock/static/dist/openassessment-editor-tinymce.ab9f042f233087bba4b8.js diff --git a/openassessment/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.css b/src/openassessment/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.css similarity index 100% rename from openassessment/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.css rename to src/openassessment/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.css diff --git a/openassessment/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.js b/src/openassessment/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.js similarity index 100% rename from openassessment/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.js rename to src/openassessment/xblock/static/dist/openassessment-lms.0ed216fc6ce56a916473.js diff --git a/openassessment/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.css b/src/openassessment/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.css similarity index 100% rename from openassessment/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.css rename to src/openassessment/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.css diff --git a/openassessment/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.js b/src/openassessment/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.js similarity index 100% rename from openassessment/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.js rename to src/openassessment/xblock/static/dist/openassessment-ltr.0c6318822d5661f0f9ea.js diff --git a/openassessment/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.css b/src/openassessment/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.css similarity index 100% rename from openassessment/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.css rename to src/openassessment/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.css diff --git a/openassessment/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.js b/src/openassessment/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.js similarity index 100% rename from openassessment/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.js rename to src/openassessment/xblock/static/dist/openassessment-rtl.c938e1614108d8feb891.js diff --git a/openassessment/xblock/static/dist/openassessment-studio.b58bb4e55f63dadac6de.js b/src/openassessment/xblock/static/dist/openassessment-studio.b58bb4e55f63dadac6de.js similarity index 100% rename from openassessment/xblock/static/dist/openassessment-studio.b58bb4e55f63dadac6de.js rename to src/openassessment/xblock/static/dist/openassessment-studio.b58bb4e55f63dadac6de.js diff --git a/openassessment/xblock/static/fonts/libs/font-awesome/FontAwesome.otf b/src/openassessment/xblock/static/fonts/libs/font-awesome/FontAwesome.otf similarity index 100% rename from openassessment/xblock/static/fonts/libs/font-awesome/FontAwesome.otf rename to src/openassessment/xblock/static/fonts/libs/font-awesome/FontAwesome.otf diff --git a/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.eot b/src/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.eot similarity index 100% rename from openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.eot rename to src/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.eot diff --git a/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.svg b/src/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.svg similarity index 100% rename from openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.svg rename to src/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.svg diff --git a/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.ttf b/src/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.ttf similarity index 100% rename from openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.ttf rename to src/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.ttf diff --git a/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.woff b/src/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.woff similarity index 100% rename from openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.woff rename to src/openassessment/xblock/static/fonts/libs/font-awesome/fontawesome-webfont.woff diff --git a/openassessment/xblock/static/js/fixtures/templates.json b/src/openassessment/xblock/static/js/fixtures/templates.json similarity index 100% rename from openassessment/xblock/static/js/fixtures/templates.json rename to src/openassessment/xblock/static/js/fixtures/templates.json diff --git a/openassessment/xblock/static/js/lib/backgrid/backgrid.js b/src/openassessment/xblock/static/js/lib/backgrid/backgrid.js similarity index 100% rename from openassessment/xblock/static/js/lib/backgrid/backgrid.js rename to src/openassessment/xblock/static/js/lib/backgrid/backgrid.js diff --git a/openassessment/xblock/static/js/lib/backgrid/backgrid.min.js b/src/openassessment/xblock/static/js/lib/backgrid/backgrid.min.js similarity index 100% rename from openassessment/xblock/static/js/lib/backgrid/backgrid.min.js rename to src/openassessment/xblock/static/js/lib/backgrid/backgrid.min.js diff --git a/openassessment/xblock/static/js/lib/codemirror.js b/src/openassessment/xblock/static/js/lib/codemirror.js similarity index 100% rename from openassessment/xblock/static/js/lib/codemirror.js rename to src/openassessment/xblock/static/js/lib/codemirror.js diff --git a/openassessment/xblock/static/js/lib/jquery-ui-1.10.4.min.js b/src/openassessment/xblock/static/js/lib/jquery-ui-1.10.4.min.js similarity index 100% rename from openassessment/xblock/static/js/lib/jquery-ui-1.10.4.min.js rename to src/openassessment/xblock/static/js/lib/jquery-ui-1.10.4.min.js diff --git a/openassessment/xblock/static/js/lib/jquery.min.js b/src/openassessment/xblock/static/js/lib/jquery.min.js similarity index 100% rename from openassessment/xblock/static/js/lib/jquery.min.js rename to src/openassessment/xblock/static/js/lib/jquery.min.js diff --git a/openassessment/xblock/static/js/lib/jquery.timepicker.min.js b/src/openassessment/xblock/static/js/lib/jquery.timepicker.min.js similarity index 100% rename from openassessment/xblock/static/js/lib/jquery.timepicker.min.js rename to src/openassessment/xblock/static/js/lib/jquery.timepicker.min.js diff --git a/openassessment/xblock/static/js/lib/underscore-min.js b/src/openassessment/xblock/static/js/lib/underscore-min.js similarity index 100% rename from openassessment/xblock/static/js/lib/underscore-min.js rename to src/openassessment/xblock/static/js/lib/underscore-min.js diff --git a/openassessment/xblock/static/js/spec/lms/components/WaitingStepDetailsPage.spec.jsx b/src/openassessment/xblock/static/js/spec/lms/components/WaitingStepDetailsPage.spec.jsx similarity index 100% rename from openassessment/xblock/static/js/spec/lms/components/WaitingStepDetailsPage.spec.jsx rename to src/openassessment/xblock/static/js/spec/lms/components/WaitingStepDetailsPage.spec.jsx diff --git a/openassessment/xblock/static/js/spec/lms/components/WaitingStepList.spec.jsx b/src/openassessment/xblock/static/js/spec/lms/components/WaitingStepList.spec.jsx similarity index 100% rename from openassessment/xblock/static/js/spec/lms/components/WaitingStepList.spec.jsx rename to src/openassessment/xblock/static/js/spec/lms/components/WaitingStepList.spec.jsx diff --git a/openassessment/xblock/static/js/spec/lms/oa_base.js b/src/openassessment/xblock/static/js/spec/lms/oa_base.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_base.js rename to src/openassessment/xblock/static/js/spec/lms/oa_base.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_datefactory.js b/src/openassessment/xblock/static/js/spec/lms/oa_datefactory.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_datefactory.js rename to src/openassessment/xblock/static/js/spec/lms/oa_datefactory.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_file_upload.js b/src/openassessment/xblock/static/js/spec/lms/oa_file_upload.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_file_upload.js rename to src/openassessment/xblock/static/js/spec/lms/oa_file_upload.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_grade.js b/src/openassessment/xblock/static/js/spec/lms/oa_grade.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_grade.js rename to src/openassessment/xblock/static/js/spec/lms/oa_grade.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_listing.js b/src/openassessment/xblock/static/js/spec/lms/oa_listing.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_listing.js rename to src/openassessment/xblock/static/js/spec/lms/oa_listing.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_peer.js b/src/openassessment/xblock/static/js/spec/lms/oa_peer.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_peer.js rename to src/openassessment/xblock/static/js/spec/lms/oa_peer.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_response.js b/src/openassessment/xblock/static/js/spec/lms/oa_response.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_response.js rename to src/openassessment/xblock/static/js/spec/lms/oa_response.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_response_editor.js b/src/openassessment/xblock/static/js/spec/lms/oa_response_editor.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_response_editor.js rename to src/openassessment/xblock/static/js/spec/lms/oa_response_editor.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_rubric.js b/src/openassessment/xblock/static/js/spec/lms/oa_rubric.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_rubric.js rename to src/openassessment/xblock/static/js/spec/lms/oa_rubric.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_self.js b/src/openassessment/xblock/static/js/spec/lms/oa_self.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_self.js rename to src/openassessment/xblock/static/js/spec/lms/oa_self.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_staff_area.js b/src/openassessment/xblock/static/js/spec/lms/oa_staff_area.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_staff_area.js rename to src/openassessment/xblock/static/js/spec/lms/oa_staff_area.js diff --git a/openassessment/xblock/static/js/spec/lms/oa_training.js b/src/openassessment/xblock/static/js/spec/lms/oa_training.js similarity index 100% rename from openassessment/xblock/static/js/spec/lms/oa_training.js rename to src/openassessment/xblock/static/js/spec/lms/oa_training.js diff --git a/openassessment/xblock/static/js/spec/oa_server.js b/src/openassessment/xblock/static/js/spec/oa_server.js similarity index 100% rename from openassessment/xblock/static/js/spec/oa_server.js rename to src/openassessment/xblock/static/js/spec/oa_server.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_container.js b/src/openassessment/xblock/static/js/spec/studio/oa_container.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_container.js rename to src/openassessment/xblock/static/js/spec/studio/oa_container.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_assessments.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_assessments.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_assessments.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_assessments.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_assessments_steps.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_assessments_steps.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_assessments_steps.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_assessments_steps.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_fields.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_fields.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_fields.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_fields.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_listeners.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_listeners.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_listeners.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_listeners.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_notifier.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_notifier.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_notifier.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_notifier.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_prompt.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_prompt.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_prompt.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_prompt.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_rubric.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_rubric.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_rubric.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_rubric.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_schedule.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_schedule.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_schedule.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_schedule.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_settings.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_settings.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_settings.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_settings.js diff --git a/openassessment/xblock/static/js/spec/studio/oa_edit_validation_alert.js b/src/openassessment/xblock/static/js/spec/studio/oa_edit_validation_alert.js similarity index 100% rename from openassessment/xblock/static/js/spec/studio/oa_edit_validation_alert.js rename to src/openassessment/xblock/static/js/spec/studio/oa_edit_validation_alert.js diff --git a/openassessment/xblock/static/js/spec/test_shared.js b/src/openassessment/xblock/static/js/spec/test_shared.js similarity index 100% rename from openassessment/xblock/static/js/spec/test_shared.js rename to src/openassessment/xblock/static/js/spec/test_shared.js diff --git a/openassessment/xblock/static/js/src/lms/api/waiting_step_details.js b/src/openassessment/xblock/static/js/src/lms/api/waiting_step_details.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/api/waiting_step_details.js rename to src/openassessment/xblock/static/js/src/lms/api/waiting_step_details.js diff --git a/openassessment/xblock/static/js/src/lms/components/WaitingStepContent.jsx b/src/openassessment/xblock/static/js/src/lms/components/WaitingStepContent.jsx similarity index 100% rename from openassessment/xblock/static/js/src/lms/components/WaitingStepContent.jsx rename to src/openassessment/xblock/static/js/src/lms/components/WaitingStepContent.jsx diff --git a/openassessment/xblock/static/js/src/lms/components/WaitingStepList.jsx b/src/openassessment/xblock/static/js/src/lms/components/WaitingStepList.jsx similarity index 100% rename from openassessment/xblock/static/js/src/lms/components/WaitingStepList.jsx rename to src/openassessment/xblock/static/js/src/lms/components/WaitingStepList.jsx diff --git a/openassessment/xblock/static/js/src/lms/containers/WaitingStepDetailsContainer.jsx b/src/openassessment/xblock/static/js/src/lms/containers/WaitingStepDetailsContainer.jsx similarity index 100% rename from openassessment/xblock/static/js/src/lms/containers/WaitingStepDetailsContainer.jsx rename to src/openassessment/xblock/static/js/src/lms/containers/WaitingStepDetailsContainer.jsx diff --git a/openassessment/xblock/static/js/src/lms/editors/oa_editor_textarea.js b/src/openassessment/xblock/static/js/src/lms/editors/oa_editor_textarea.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/editors/oa_editor_textarea.js rename to src/openassessment/xblock/static/js/src/lms/editors/oa_editor_textarea.js diff --git a/openassessment/xblock/static/js/src/lms/editors/oa_editor_tinymce.js b/src/openassessment/xblock/static/js/src/lms/editors/oa_editor_tinymce.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/editors/oa_editor_tinymce.js rename to src/openassessment/xblock/static/js/src/lms/editors/oa_editor_tinymce.js diff --git a/openassessment/xblock/static/js/src/lms/oa_base.js b/src/openassessment/xblock/static/js/src/lms/oa_base.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_base.js rename to src/openassessment/xblock/static/js/src/lms/oa_base.js diff --git a/openassessment/xblock/static/js/src/lms/oa_confirmation_alert.js b/src/openassessment/xblock/static/js/src/lms/oa_confirmation_alert.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_confirmation_alert.js rename to src/openassessment/xblock/static/js/src/lms/oa_confirmation_alert.js diff --git a/openassessment/xblock/static/js/src/lms/oa_course_items_listing.js b/src/openassessment/xblock/static/js/src/lms/oa_course_items_listing.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_course_items_listing.js rename to src/openassessment/xblock/static/js/src/lms/oa_course_items_listing.js diff --git a/openassessment/xblock/static/js/src/lms/oa_datefactory.js b/src/openassessment/xblock/static/js/src/lms/oa_datefactory.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_datefactory.js rename to src/openassessment/xblock/static/js/src/lms/oa_datefactory.js diff --git a/openassessment/xblock/static/js/src/lms/oa_file_upload.js b/src/openassessment/xblock/static/js/src/lms/oa_file_upload.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_file_upload.js rename to src/openassessment/xblock/static/js/src/lms/oa_file_upload.js diff --git a/openassessment/xblock/static/js/src/lms/oa_grade.js b/src/openassessment/xblock/static/js/src/lms/oa_grade.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_grade.js rename to src/openassessment/xblock/static/js/src/lms/oa_grade.js diff --git a/openassessment/xblock/static/js/src/lms/oa_leaderboard.js b/src/openassessment/xblock/static/js/src/lms/oa_leaderboard.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_leaderboard.js rename to src/openassessment/xblock/static/js/src/lms/oa_leaderboard.js diff --git a/openassessment/xblock/static/js/src/lms/oa_message.js b/src/openassessment/xblock/static/js/src/lms/oa_message.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_message.js rename to src/openassessment/xblock/static/js/src/lms/oa_message.js diff --git a/openassessment/xblock/static/js/src/lms/oa_peer.js b/src/openassessment/xblock/static/js/src/lms/oa_peer.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_peer.js rename to src/openassessment/xblock/static/js/src/lms/oa_peer.js diff --git a/openassessment/xblock/static/js/src/lms/oa_prompts.js b/src/openassessment/xblock/static/js/src/lms/oa_prompts.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_prompts.js rename to src/openassessment/xblock/static/js/src/lms/oa_prompts.js diff --git a/openassessment/xblock/static/js/src/lms/oa_response.js b/src/openassessment/xblock/static/js/src/lms/oa_response.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_response.js rename to src/openassessment/xblock/static/js/src/lms/oa_response.js diff --git a/openassessment/xblock/static/js/src/lms/oa_response_editor.js b/src/openassessment/xblock/static/js/src/lms/oa_response_editor.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_response_editor.js rename to src/openassessment/xblock/static/js/src/lms/oa_response_editor.js diff --git a/openassessment/xblock/static/js/src/lms/oa_rubric.js b/src/openassessment/xblock/static/js/src/lms/oa_rubric.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_rubric.js rename to src/openassessment/xblock/static/js/src/lms/oa_rubric.js diff --git a/openassessment/xblock/static/js/src/lms/oa_self.js b/src/openassessment/xblock/static/js/src/lms/oa_self.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_self.js rename to src/openassessment/xblock/static/js/src/lms/oa_self.js diff --git a/openassessment/xblock/static/js/src/lms/oa_staff.js b/src/openassessment/xblock/static/js/src/lms/oa_staff.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_staff.js rename to src/openassessment/xblock/static/js/src/lms/oa_staff.js diff --git a/openassessment/xblock/static/js/src/lms/oa_staff_area.js b/src/openassessment/xblock/static/js/src/lms/oa_staff_area.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_staff_area.js rename to src/openassessment/xblock/static/js/src/lms/oa_staff_area.js diff --git a/openassessment/xblock/static/js/src/lms/oa_staff_waiting_step.jsx b/src/openassessment/xblock/static/js/src/lms/oa_staff_waiting_step.jsx similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_staff_waiting_step.jsx rename to src/openassessment/xblock/static/js/src/lms/oa_staff_waiting_step.jsx diff --git a/openassessment/xblock/static/js/src/lms/oa_training.js b/src/openassessment/xblock/static/js/src/lms/oa_training.js similarity index 100% rename from openassessment/xblock/static/js/src/lms/oa_training.js rename to src/openassessment/xblock/static/js/src/lms/oa_training.js diff --git a/openassessment/xblock/static/js/src/lms_index.js b/src/openassessment/xblock/static/js/src/lms_index.js similarity index 100% rename from openassessment/xblock/static/js/src/lms_index.js rename to src/openassessment/xblock/static/js/src/lms_index.js diff --git a/openassessment/xblock/static/js/src/oa_server.js b/src/openassessment/xblock/static/js/src/oa_server.js similarity index 100% rename from openassessment/xblock/static/js/src/oa_server.js rename to src/openassessment/xblock/static/js/src/oa_server.js diff --git a/openassessment/xblock/static/js/src/oa_shared.js b/src/openassessment/xblock/static/js/src/oa_shared.js similarity index 100% rename from openassessment/xblock/static/js/src/oa_shared.js rename to src/openassessment/xblock/static/js/src/oa_shared.js diff --git a/openassessment/xblock/static/js/src/studio/oa_container.js b/src/openassessment/xblock/static/js/src/studio/oa_container.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_container.js rename to src/openassessment/xblock/static/js/src/studio/oa_container.js diff --git a/openassessment/xblock/static/js/src/studio/oa_container_item.js b/src/openassessment/xblock/static/js/src/studio/oa_container_item.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_container_item.js rename to src/openassessment/xblock/static/js/src/studio/oa_container_item.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit.js b/src/openassessment/xblock/static/js/src/studio/oa_edit.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_assessment.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_assessment.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_assessment.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_assessment.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_assessments_steps.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_assessments_steps.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_assessments_steps.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_assessments_steps.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_fields.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_fields.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_fields.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_fields.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_listeners.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_listeners.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_listeners.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_listeners.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_notifier.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_notifier.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_notifier.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_notifier.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_prompts.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_prompts.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_prompts.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_prompts.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_rubric.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_rubric.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_rubric.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_rubric.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_schedule.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_schedule.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_schedule.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_schedule.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_settings.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_settings.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_settings.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_settings.js diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_validation_alert.js b/src/openassessment/xblock/static/js/src/studio/oa_edit_validation_alert.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_edit_validation_alert.js rename to src/openassessment/xblock/static/js/src/studio/oa_edit_validation_alert.js diff --git a/openassessment/xblock/static/js/src/studio/oa_tiny_mce.js b/src/openassessment/xblock/static/js/src/studio/oa_tiny_mce.js similarity index 100% rename from openassessment/xblock/static/js/src/studio/oa_tiny_mce.js rename to src/openassessment/xblock/static/js/src/studio/oa_tiny_mce.js diff --git a/openassessment/xblock/static/js/src/studio_index.js b/src/openassessment/xblock/static/js/src/studio_index.js similarity index 100% rename from openassessment/xblock/static/js/src/studio_index.js rename to src/openassessment/xblock/static/js/src/studio_index.js diff --git a/openassessment/xblock/static/sass/_openassessment.scss b/src/openassessment/xblock/static/sass/_openassessment.scss similarity index 100% rename from openassessment/xblock/static/sass/_openassessment.scss rename to src/openassessment/xblock/static/sass/_openassessment.scss diff --git a/openassessment/xblock/static/sass/oa/contexts/_ie.scss b/src/openassessment/xblock/static/sass/oa/contexts/_ie.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/contexts/_ie.scss rename to src/openassessment/xblock/static/sass/oa/contexts/_ie.scss diff --git a/openassessment/xblock/static/sass/oa/contexts/_responsive.scss b/src/openassessment/xblock/static/sass/oa/contexts/_responsive.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/contexts/_responsive.scss rename to src/openassessment/xblock/static/sass/oa/contexts/_responsive.scss diff --git a/openassessment/xblock/static/sass/oa/elements/_confirm.scss b/src/openassessment/xblock/static/sass/oa/elements/_confirm.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/elements/_confirm.scss rename to src/openassessment/xblock/static/sass/oa/elements/_confirm.scss diff --git a/openassessment/xblock/static/sass/oa/elements/_footer.scss b/src/openassessment/xblock/static/sass/oa/elements/_footer.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/elements/_footer.scss rename to src/openassessment/xblock/static/sass/oa/elements/_footer.scss diff --git a/openassessment/xblock/static/sass/oa/elements/_header.scss b/src/openassessment/xblock/static/sass/oa/elements/_header.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/elements/_header.scss rename to src/openassessment/xblock/static/sass/oa/elements/_header.scss diff --git a/openassessment/xblock/static/sass/oa/elements/_layout.scss b/src/openassessment/xblock/static/sass/oa/elements/_layout.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/elements/_layout.scss rename to src/openassessment/xblock/static/sass/oa/elements/_layout.scss diff --git a/openassessment/xblock/static/sass/oa/elements/_navigation.scss b/src/openassessment/xblock/static/sass/oa/elements/_navigation.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/elements/_navigation.scss rename to src/openassessment/xblock/static/sass/oa/elements/_navigation.scss diff --git a/openassessment/xblock/static/sass/oa/elements/_staff.scss b/src/openassessment/xblock/static/sass/oa/elements/_staff.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/elements/_staff.scss rename to src/openassessment/xblock/static/sass/oa/elements/_staff.scss diff --git a/openassessment/xblock/static/sass/oa/utilities/_developer.scss b/src/openassessment/xblock/static/sass/oa/utilities/_developer.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/utilities/_developer.scss rename to src/openassessment/xblock/static/sass/oa/utilities/_developer.scss diff --git a/openassessment/xblock/static/sass/oa/utilities/_extends.scss b/src/openassessment/xblock/static/sass/oa/utilities/_extends.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/utilities/_extends.scss rename to src/openassessment/xblock/static/sass/oa/utilities/_extends.scss diff --git a/openassessment/xblock/static/sass/oa/utilities/_mixins.scss b/src/openassessment/xblock/static/sass/oa/utilities/_mixins.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/utilities/_mixins.scss rename to src/openassessment/xblock/static/sass/oa/utilities/_mixins.scss diff --git a/openassessment/xblock/static/sass/oa/utilities/_shame.scss b/src/openassessment/xblock/static/sass/oa/utilities/_shame.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/utilities/_shame.scss rename to src/openassessment/xblock/static/sass/oa/utilities/_shame.scss diff --git a/openassessment/xblock/static/sass/oa/utilities/_variables.scss b/src/openassessment/xblock/static/sass/oa/utilities/_variables.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/utilities/_variables.scss rename to src/openassessment/xblock/static/sass/oa/utilities/_variables.scss diff --git a/openassessment/xblock/static/sass/oa/views/_oa-base.scss b/src/openassessment/xblock/static/sass/oa/views/_oa-base.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/views/_oa-base.scss rename to src/openassessment/xblock/static/sass/oa/views/_oa-base.scss diff --git a/openassessment/xblock/static/sass/oa/views/_oa-course-items-listing.scss b/src/openassessment/xblock/static/sass/oa/views/_oa-course-items-listing.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/views/_oa-course-items-listing.scss rename to src/openassessment/xblock/static/sass/oa/views/_oa-course-items-listing.scss diff --git a/openassessment/xblock/static/sass/oa/views/_oa-jquery-ui-rubric-reuse.scss b/src/openassessment/xblock/static/sass/oa/views/_oa-jquery-ui-rubric-reuse.scss similarity index 100% rename from openassessment/xblock/static/sass/oa/views/_oa-jquery-ui-rubric-reuse.scss rename to src/openassessment/xblock/static/sass/oa/views/_oa-jquery-ui-rubric-reuse.scss diff --git a/openassessment/xblock/static/sass/openassessment-ltr.scss b/src/openassessment/xblock/static/sass/openassessment-ltr.scss similarity index 100% rename from openassessment/xblock/static/sass/openassessment-ltr.scss rename to src/openassessment/xblock/static/sass/openassessment-ltr.scss diff --git a/openassessment/xblock/static/sass/openassessment-rtl.scss b/src/openassessment/xblock/static/sass/openassessment-rtl.scss similarity index 100% rename from openassessment/xblock/static/sass/openassessment-rtl.scss rename to src/openassessment/xblock/static/sass/openassessment-rtl.scss diff --git a/openassessment/xblock/static/sass/themes/edx/_base.scss b/src/openassessment/xblock/static/sass/themes/edx/_base.scss similarity index 100% rename from openassessment/xblock/static/sass/themes/edx/_base.scss rename to src/openassessment/xblock/static/sass/themes/edx/_base.scss diff --git a/openassessment/xblock/static/sass/themes/edx/_elements.scss b/src/openassessment/xblock/static/sass/themes/edx/_elements.scss similarity index 100% rename from openassessment/xblock/static/sass/themes/edx/_elements.scss rename to src/openassessment/xblock/static/sass/themes/edx/_elements.scss diff --git a/openassessment/xblock/static/sass/themes/edx/_utilities.scss b/src/openassessment/xblock/static/sass/themes/edx/_utilities.scss similarity index 100% rename from openassessment/xblock/static/sass/themes/edx/_utilities.scss rename to src/openassessment/xblock/static/sass/themes/edx/_utilities.scss diff --git a/openassessment/xblock/static/sass/vendor/_hint.scss b/src/openassessment/xblock/static/sass/vendor/_hint.scss similarity index 100% rename from openassessment/xblock/static/sass/vendor/_hint.scss rename to src/openassessment/xblock/static/sass/vendor/_hint.scss diff --git a/openassessment/xblock/static/sass/vendor/bi-app/_bi-app-ltr.scss b/src/openassessment/xblock/static/sass/vendor/bi-app/_bi-app-ltr.scss similarity index 100% rename from openassessment/xblock/static/sass/vendor/bi-app/_bi-app-ltr.scss rename to src/openassessment/xblock/static/sass/vendor/bi-app/_bi-app-ltr.scss diff --git a/openassessment/xblock/static/sass/vendor/bi-app/_bi-app-rtl.scss b/src/openassessment/xblock/static/sass/vendor/bi-app/_bi-app-rtl.scss similarity index 100% rename from openassessment/xblock/static/sass/vendor/bi-app/_bi-app-rtl.scss rename to src/openassessment/xblock/static/sass/vendor/bi-app/_bi-app-rtl.scss diff --git a/openassessment/xblock/static/sass/vendor/bi-app/_mixins.scss b/src/openassessment/xblock/static/sass/vendor/bi-app/_mixins.scss similarity index 100% rename from openassessment/xblock/static/sass/vendor/bi-app/_mixins.scss rename to src/openassessment/xblock/static/sass/vendor/bi-app/_mixins.scss diff --git a/openassessment/xblock/static/sass/vendor/bi-app/_variables-ltr.scss b/src/openassessment/xblock/static/sass/vendor/bi-app/_variables-ltr.scss similarity index 100% rename from openassessment/xblock/static/sass/vendor/bi-app/_variables-ltr.scss rename to src/openassessment/xblock/static/sass/vendor/bi-app/_variables-ltr.scss diff --git a/openassessment/xblock/static/sass/vendor/bi-app/_variables-rtl.scss b/src/openassessment/xblock/static/sass/vendor/bi-app/_variables-rtl.scss similarity index 100% rename from openassessment/xblock/static/sass/vendor/bi-app/_variables-rtl.scss rename to src/openassessment/xblock/static/sass/vendor/bi-app/_variables-rtl.scss diff --git a/openassessment/xblock/static/sass/xb/assets/_fonts.scss b/src/openassessment/xblock/static/sass/xb/assets/_fonts.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/assets/_fonts.scss rename to src/openassessment/xblock/static/sass/xb/assets/_fonts.scss diff --git a/openassessment/xblock/static/sass/xb/assets/_graphics.scss b/src/openassessment/xblock/static/sass/xb/assets/_graphics.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/assets/_graphics.scss rename to src/openassessment/xblock/static/sass/xb/assets/_graphics.scss diff --git a/openassessment/xblock/static/sass/xb/contexts/_ie.scss b/src/openassessment/xblock/static/sass/xb/contexts/_ie.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/contexts/_ie.scss rename to src/openassessment/xblock/static/sass/xb/contexts/_ie.scss diff --git a/openassessment/xblock/static/sass/xb/elements/_base.scss b/src/openassessment/xblock/static/sass/xb/elements/_base.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/elements/_base.scss rename to src/openassessment/xblock/static/sass/xb/elements/_base.scss diff --git a/openassessment/xblock/static/sass/xb/elements/_controls.scss b/src/openassessment/xblock/static/sass/xb/elements/_controls.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/elements/_controls.scss rename to src/openassessment/xblock/static/sass/xb/elements/_controls.scss diff --git a/openassessment/xblock/static/sass/xb/elements/_forms.scss b/src/openassessment/xblock/static/sass/xb/elements/_forms.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/elements/_forms.scss rename to src/openassessment/xblock/static/sass/xb/elements/_forms.scss diff --git a/openassessment/xblock/static/sass/xb/elements/_layout.scss b/src/openassessment/xblock/static/sass/xb/elements/_layout.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/elements/_layout.scss rename to src/openassessment/xblock/static/sass/xb/elements/_layout.scss diff --git a/openassessment/xblock/static/sass/xb/elements/_system-feedback.scss b/src/openassessment/xblock/static/sass/xb/elements/_system-feedback.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/elements/_system-feedback.scss rename to src/openassessment/xblock/static/sass/xb/elements/_system-feedback.scss diff --git a/openassessment/xblock/static/sass/xb/elements/_typography.scss b/src/openassessment/xblock/static/sass/xb/elements/_typography.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/elements/_typography.scss rename to src/openassessment/xblock/static/sass/xb/elements/_typography.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/_bourbon-deprecated-upcoming.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/_bourbon-deprecated-upcoming.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/_bourbon-deprecated-upcoming.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/_bourbon-deprecated-upcoming.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/_bourbon.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/_bourbon.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/_bourbon.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/_bourbon.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_button.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_button.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_button.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_button.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_clearfix.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_clearfix.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_clearfix.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_clearfix.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_font-family.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_font-family.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_font-family.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_font-family.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_hide-text.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_hide-text.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_hide-text.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_hide-text.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_html5-input-types.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_html5-input-types.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_html5-input-types.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_html5-input-types.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_position.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_position.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_position.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_position.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_prefixer.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_prefixer.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_prefixer.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_prefixer.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_retina-image.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_retina-image.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_retina-image.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_retina-image.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_size.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_size.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_size.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_size.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_timing-functions.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_timing-functions.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_timing-functions.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_timing-functions.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_triangle.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_triangle.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/addons/_triangle.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/addons/_triangle.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_animation.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_animation.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_animation.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_animation.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_appearance.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_appearance.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_appearance.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_appearance.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_backface-visibility.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_backface-visibility.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_backface-visibility.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_backface-visibility.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_background-image.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_background-image.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_background-image.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_background-image.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_background.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_background.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_background.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_background.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_border-image.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_border-image.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_border-image.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_border-image.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_border-radius.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_border-radius.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_border-radius.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_border-radius.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_box-sizing.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_box-sizing.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_box-sizing.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_box-sizing.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_columns.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_columns.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_columns.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_columns.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_flex-box.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_flex-box.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_flex-box.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_flex-box.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_font-face.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_font-face.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_font-face.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_font-face.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_hidpi-media-query.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_hidpi-media-query.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_hidpi-media-query.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_hidpi-media-query.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_image-rendering.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_image-rendering.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_image-rendering.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_image-rendering.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_inline-block.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_inline-block.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_inline-block.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_inline-block.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_keyframes.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_keyframes.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_keyframes.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_keyframes.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_linear-gradient.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_linear-gradient.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_linear-gradient.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_linear-gradient.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_perspective.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_perspective.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_perspective.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_perspective.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_placeholder.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_placeholder.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_placeholder.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_placeholder.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_radial-gradient.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_radial-gradient.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_radial-gradient.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_radial-gradient.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_transform.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_transform.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_transform.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_transform.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_transition.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_transition.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_transition.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_transition.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_user-select.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_user-select.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/css3/_user-select.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/css3/_user-select.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_compact.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_compact.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/functions/_compact.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_compact.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_flex-grid.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_flex-grid.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/functions/_flex-grid.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_flex-grid.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_grid-width.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_grid-width.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/functions/_grid-width.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_grid-width.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_linear-gradient.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_linear-gradient.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/functions/_linear-gradient.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_linear-gradient.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_modular-scale.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_modular-scale.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/functions/_modular-scale.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_modular-scale.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_px-to-em.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_px-to-em.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/functions/_px-to-em.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_px-to-em.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_radial-gradient.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_radial-gradient.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/functions/_radial-gradient.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_radial-gradient.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_tint-shade.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_tint-shade.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/functions/_tint-shade.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_tint-shade.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_transition-property-name.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_transition-property-name.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/functions/_transition-property-name.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/functions/_transition-property-name.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_deprecated-webkit-gradient.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_deprecated-webkit-gradient.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_deprecated-webkit-gradient.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_deprecated-webkit-gradient.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_gradient-positions-parser.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_gradient-positions-parser.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_gradient-positions-parser.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_gradient-positions-parser.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_linear-positions-parser.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_linear-positions-parser.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_linear-positions-parser.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_linear-positions-parser.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_radial-arg-parser.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_radial-arg-parser.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_radial-arg-parser.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_radial-arg-parser.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_radial-positions-parser.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_radial-positions-parser.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_radial-positions-parser.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_radial-positions-parser.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_render-gradients.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_render-gradients.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_render-gradients.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_render-gradients.scss diff --git a/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_shape-size-stripper.scss b/src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_shape-size-stripper.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_shape-size-stripper.scss rename to src/openassessment/xblock/static/sass/xb/libs/bourbon/helpers/_shape-size-stripper.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/_neat-helpers.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/_neat-helpers.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/_neat-helpers.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/_neat-helpers.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/_neat.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/_neat.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/_neat.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/_neat.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/functions/_new-breakpoint.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/functions/_new-breakpoint.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/functions/_new-breakpoint.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/functions/_new-breakpoint.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/functions/_private.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/functions/_private.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/functions/_private.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/functions/_private.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_box-sizing.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_box-sizing.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_box-sizing.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_box-sizing.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_direction-context.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_direction-context.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_direction-context.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_direction-context.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_display-context.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_display-context.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_display-context.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_display-context.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_fill-parent.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_fill-parent.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_fill-parent.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_fill-parent.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_grid.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_grid.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_grid.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_grid.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_media.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_media.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_media.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_media.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_omega.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_omega.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_omega.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_omega.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_outer-container.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_outer-container.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_outer-container.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_outer-container.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_pad.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_pad.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_pad.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_pad.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_private.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_private.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_private.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_private.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_reset.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_reset.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_reset.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_reset.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_row.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_row.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_row.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_row.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_shift.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_shift.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_shift.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_shift.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_span-columns.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_span-columns.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_span-columns.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_span-columns.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_to-deprecate.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_to-deprecate.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_to-deprecate.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_to-deprecate.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/grid/_visual-grid.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/grid/_visual-grid.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/grid/_visual-grid.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/grid/_visual-grid.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/settings/_disable-warnings.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/settings/_disable-warnings.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/settings/_disable-warnings.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/settings/_disable-warnings.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/settings/_grid.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/settings/_grid.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/settings/_grid.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/settings/_grid.scss diff --git a/openassessment/xblock/static/sass/xb/libs/neat/settings/_visual-grid.scss b/src/openassessment/xblock/static/sass/xb/libs/neat/settings/_visual-grid.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/libs/neat/settings/_visual-grid.scss rename to src/openassessment/xblock/static/sass/xb/libs/neat/settings/_visual-grid.scss diff --git a/openassessment/xblock/static/sass/xb/utilities/_animations.scss b/src/openassessment/xblock/static/sass/xb/utilities/_animations.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/utilities/_animations.scss rename to src/openassessment/xblock/static/sass/xb/utilities/_animations.scss diff --git a/openassessment/xblock/static/sass/xb/utilities/_extends.scss b/src/openassessment/xblock/static/sass/xb/utilities/_extends.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/utilities/_extends.scss rename to src/openassessment/xblock/static/sass/xb/utilities/_extends.scss diff --git a/openassessment/xblock/static/sass/xb/utilities/_mixins.scss b/src/openassessment/xblock/static/sass/xb/utilities/_mixins.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/utilities/_mixins.scss rename to src/openassessment/xblock/static/sass/xb/utilities/_mixins.scss diff --git a/openassessment/xblock/static/sass/xb/utilities/_reset.scss b/src/openassessment/xblock/static/sass/xb/utilities/_reset.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/utilities/_reset.scss rename to src/openassessment/xblock/static/sass/xb/utilities/_reset.scss diff --git a/openassessment/xblock/static/sass/xb/utilities/_variables.scss b/src/openassessment/xblock/static/sass/xb/utilities/_variables.scss similarity index 100% rename from openassessment/xblock/static/sass/xb/utilities/_variables.scss rename to src/openassessment/xblock/static/sass/xb/utilities/_variables.scss diff --git a/openassessment/xblock/static/xml/censorship_rubric_example.xml b/src/openassessment/xblock/static/xml/censorship_rubric_example.xml similarity index 100% rename from openassessment/xblock/static/xml/censorship_rubric_example.xml rename to src/openassessment/xblock/static/xml/censorship_rubric_example.xml diff --git a/openassessment/xblock/static/xml/file_upload_compat.xml b/src/openassessment/xblock/static/xml/file_upload_compat.xml similarity index 100% rename from openassessment/xblock/static/xml/file_upload_compat.xml rename to src/openassessment/xblock/static/xml/file_upload_compat.xml diff --git a/openassessment/xblock/static/xml/file_upload_custom.xml b/src/openassessment/xblock/static/xml/file_upload_custom.xml similarity index 100% rename from openassessment/xblock/static/xml/file_upload_custom.xml rename to src/openassessment/xblock/static/xml/file_upload_custom.xml diff --git a/openassessment/xblock/static/xml/file_upload_image_only.xml b/src/openassessment/xblock/static/xml/file_upload_image_only.xml similarity index 100% rename from openassessment/xblock/static/xml/file_upload_image_only.xml rename to src/openassessment/xblock/static/xml/file_upload_image_only.xml diff --git a/openassessment/xblock/static/xml/file_upload_pdf_and_image.xml b/src/openassessment/xblock/static/xml/file_upload_pdf_and_image.xml similarity index 100% rename from openassessment/xblock/static/xml/file_upload_pdf_and_image.xml rename to src/openassessment/xblock/static/xml/file_upload_pdf_and_image.xml diff --git a/openassessment/xblock/static/xml/leaderboard.xml b/src/openassessment/xblock/static/xml/leaderboard.xml similarity index 100% rename from openassessment/xblock/static/xml/leaderboard.xml rename to src/openassessment/xblock/static/xml/leaderboard.xml diff --git a/openassessment/xblock/static/xml/leaderboard_custom.xml b/src/openassessment/xblock/static/xml/leaderboard_custom.xml similarity index 100% rename from openassessment/xblock/static/xml/leaderboard_custom.xml rename to src/openassessment/xblock/static/xml/leaderboard_custom.xml diff --git a/openassessment/xblock/static/xml/poverty_peer_only_example.xml b/src/openassessment/xblock/static/xml/poverty_peer_only_example.xml similarity index 100% rename from openassessment/xblock/static/xml/poverty_peer_only_example.xml rename to src/openassessment/xblock/static/xml/poverty_peer_only_example.xml diff --git a/openassessment/xblock/static/xml/poverty_rubric_example.xml b/src/openassessment/xblock/static/xml/poverty_rubric_example.xml similarity index 100% rename from openassessment/xblock/static/xml/poverty_rubric_example.xml rename to src/openassessment/xblock/static/xml/poverty_rubric_example.xml diff --git a/openassessment/xblock/static/xml/poverty_self_only_example.xml b/src/openassessment/xblock/static/xml/poverty_self_only_example.xml similarity index 100% rename from openassessment/xblock/static/xml/poverty_self_only_example.xml rename to src/openassessment/xblock/static/xml/poverty_self_only_example.xml diff --git a/openassessment/xblock/static/xml/promptless_rubric_example.xml b/src/openassessment/xblock/static/xml/promptless_rubric_example.xml similarity index 100% rename from openassessment/xblock/static/xml/promptless_rubric_example.xml rename to src/openassessment/xblock/static/xml/promptless_rubric_example.xml diff --git a/openassessment/xblock/static/xml/unicode.xml b/src/openassessment/xblock/static/xml/unicode.xml similarity index 100% rename from openassessment/xblock/static/xml/unicode.xml rename to src/openassessment/xblock/static/xml/unicode.xml diff --git a/openassessment/xblock/studio_mixin.py b/src/openassessment/xblock/studio_mixin.py similarity index 100% rename from openassessment/xblock/studio_mixin.py rename to src/openassessment/xblock/studio_mixin.py diff --git a/openassessment/xblock/team_mixin.py b/src/openassessment/xblock/team_mixin.py similarity index 100% rename from openassessment/xblock/team_mixin.py rename to src/openassessment/xblock/team_mixin.py diff --git a/openassessment/xblock/team_workflow_mixin.py b/src/openassessment/xblock/team_workflow_mixin.py similarity index 100% rename from openassessment/xblock/team_workflow_mixin.py rename to src/openassessment/xblock/team_workflow_mixin.py diff --git a/openassessment/xblock/test/__init__.py b/src/openassessment/xblock/test/__init__.py similarity index 100% rename from openassessment/xblock/test/__init__.py rename to src/openassessment/xblock/test/__init__.py diff --git a/openassessment/xblock/test/base.py b/src/openassessment/xblock/test/base.py similarity index 100% rename from openassessment/xblock/test/base.py rename to src/openassessment/xblock/test/base.py diff --git a/openassessment/xblock/test/data/assessment_combo.json b/src/openassessment/xblock/test/data/assessment_combo.json similarity index 100% rename from openassessment/xblock/test/data/assessment_combo.json rename to src/openassessment/xblock/test/data/assessment_combo.json diff --git a/openassessment/xblock/test/data/assessment_due.xml b/src/openassessment/xblock/test/data/assessment_due.xml similarity index 100% rename from openassessment/xblock/test/data/assessment_due.xml rename to src/openassessment/xblock/test/data/assessment_due.xml diff --git a/openassessment/xblock/test/data/assessment_not_started.xml b/src/openassessment/xblock/test/data/assessment_not_started.xml similarity index 100% rename from openassessment/xblock/test/data/assessment_not_started.xml rename to src/openassessment/xblock/test/data/assessment_not_started.xml diff --git a/openassessment/xblock/test/data/assessment_steps_reordered.xml b/src/openassessment/xblock/test/data/assessment_steps_reordered.xml similarity index 100% rename from openassessment/xblock/test/data/assessment_steps_reordered.xml rename to src/openassessment/xblock/test/data/assessment_steps_reordered.xml diff --git a/openassessment/xblock/test/data/assessment_with_multiple_html_prompt.xml b/src/openassessment/xblock/test/data/assessment_with_multiple_html_prompt.xml similarity index 100% rename from openassessment/xblock/test/data/assessment_with_multiple_html_prompt.xml rename to src/openassessment/xblock/test/data/assessment_with_multiple_html_prompt.xml diff --git a/openassessment/xblock/test/data/assessment_with_single_html_prompt.xml b/src/openassessment/xblock/test/data/assessment_with_single_html_prompt.xml similarity index 100% rename from openassessment/xblock/test/data/assessment_with_single_html_prompt.xml rename to src/openassessment/xblock/test/data/assessment_with_single_html_prompt.xml diff --git a/openassessment/xblock/test/data/basic_scenario.xml b/src/openassessment/xblock/test/data/basic_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/basic_scenario.xml rename to src/openassessment/xblock/test/data/basic_scenario.xml diff --git a/openassessment/xblock/test/data/basic_scenario_html_prompts_type.xml b/src/openassessment/xblock/test/data/basic_scenario_html_prompts_type.xml similarity index 100% rename from openassessment/xblock/test/data/basic_scenario_html_prompts_type.xml rename to src/openassessment/xblock/test/data/basic_scenario_html_prompts_type.xml diff --git a/openassessment/xblock/test/data/custom_file_upload.xml b/src/openassessment/xblock/test/data/custom_file_upload.xml similarity index 100% rename from openassessment/xblock/test/data/custom_file_upload.xml rename to src/openassessment/xblock/test/data/custom_file_upload.xml diff --git a/openassessment/xblock/test/data/date_config_scenario.xml b/src/openassessment/xblock/test/data/date_config_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/date_config_scenario.xml rename to src/openassessment/xblock/test/data/date_config_scenario.xml diff --git a/openassessment/xblock/test/data/dates_scenario.xml b/src/openassessment/xblock/test/data/dates_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/dates_scenario.xml rename to src/openassessment/xblock/test/data/dates_scenario.xml diff --git a/openassessment/xblock/test/data/empty_prompt.xml b/src/openassessment/xblock/test/data/empty_prompt.xml similarity index 100% rename from openassessment/xblock/test/data/empty_prompt.xml rename to src/openassessment/xblock/test/data/empty_prompt.xml diff --git a/openassessment/xblock/test/data/feedback_only_criterion_grade.xml b/src/openassessment/xblock/test/data/feedback_only_criterion_grade.xml similarity index 100% rename from openassessment/xblock/test/data/feedback_only_criterion_grade.xml rename to src/openassessment/xblock/test/data/feedback_only_criterion_grade.xml diff --git a/openassessment/xblock/test/data/feedback_only_criterion_peer.xml b/src/openassessment/xblock/test/data/feedback_only_criterion_peer.xml similarity index 100% rename from openassessment/xblock/test/data/feedback_only_criterion_peer.xml rename to src/openassessment/xblock/test/data/feedback_only_criterion_peer.xml diff --git a/openassessment/xblock/test/data/feedback_only_criterion_self.xml b/src/openassessment/xblock/test/data/feedback_only_criterion_self.xml similarity index 100% rename from openassessment/xblock/test/data/feedback_only_criterion_self.xml rename to src/openassessment/xblock/test/data/feedback_only_criterion_self.xml diff --git a/openassessment/xblock/test/data/feedback_only_criterion_staff.xml b/src/openassessment/xblock/test/data/feedback_only_criterion_staff.xml similarity index 100% rename from openassessment/xblock/test/data/feedback_only_criterion_staff.xml rename to src/openassessment/xblock/test/data/feedback_only_criterion_staff.xml diff --git a/openassessment/xblock/test/data/feedback_only_criterion_student_training.xml b/src/openassessment/xblock/test/data/feedback_only_criterion_student_training.xml similarity index 100% rename from openassessment/xblock/test/data/feedback_only_criterion_student_training.xml rename to src/openassessment/xblock/test/data/feedback_only_criterion_student_training.xml diff --git a/openassessment/xblock/test/data/feedback_per_criterion.xml b/src/openassessment/xblock/test/data/feedback_per_criterion.xml similarity index 100% rename from openassessment/xblock/test/data/feedback_per_criterion.xml rename to src/openassessment/xblock/test/data/feedback_per_criterion.xml diff --git a/openassessment/xblock/test/data/file_upload_missing_scenario.xml b/src/openassessment/xblock/test/data/file_upload_missing_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/file_upload_missing_scenario.xml rename to src/openassessment/xblock/test/data/file_upload_missing_scenario.xml diff --git a/openassessment/xblock/test/data/file_upload_scenario.xml b/src/openassessment/xblock/test/data/file_upload_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/file_upload_scenario.xml rename to src/openassessment/xblock/test/data/file_upload_scenario.xml diff --git a/openassessment/xblock/test/data/grade_incomplete_scenario.xml b/src/openassessment/xblock/test/data/grade_incomplete_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/grade_incomplete_scenario.xml rename to src/openassessment/xblock/test/data/grade_incomplete_scenario.xml diff --git a/openassessment/xblock/test/data/grade_scenario.xml b/src/openassessment/xblock/test/data/grade_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/grade_scenario.xml rename to src/openassessment/xblock/test/data/grade_scenario.xml diff --git a/openassessment/xblock/test/data/grade_scenario_peer_only.xml b/src/openassessment/xblock/test/data/grade_scenario_peer_only.xml similarity index 100% rename from openassessment/xblock/test/data/grade_scenario_peer_only.xml rename to src/openassessment/xblock/test/data/grade_scenario_peer_only.xml diff --git a/openassessment/xblock/test/data/grade_scenario_self_only.xml b/src/openassessment/xblock/test/data/grade_scenario_self_only.xml similarity index 100% rename from openassessment/xblock/test/data/grade_scenario_self_only.xml rename to src/openassessment/xblock/test/data/grade_scenario_self_only.xml diff --git a/openassessment/xblock/test/data/grade_scenario_self_staff.xml b/src/openassessment/xblock/test/data/grade_scenario_self_staff.xml similarity index 100% rename from openassessment/xblock/test/data/grade_scenario_self_staff.xml rename to src/openassessment/xblock/test/data/grade_scenario_self_staff.xml diff --git a/openassessment/xblock/test/data/grade_scenario_self_staff_not_required.xml b/src/openassessment/xblock/test/data/grade_scenario_self_staff_not_required.xml similarity index 100% rename from openassessment/xblock/test/data/grade_scenario_self_staff_not_required.xml rename to src/openassessment/xblock/test/data/grade_scenario_self_staff_not_required.xml diff --git a/openassessment/xblock/test/data/grade_scenario_self_staff_peer.xml b/src/openassessment/xblock/test/data/grade_scenario_self_staff_peer.xml similarity index 100% rename from openassessment/xblock/test/data/grade_scenario_self_staff_peer.xml rename to src/openassessment/xblock/test/data/grade_scenario_self_staff_peer.xml diff --git a/openassessment/xblock/test/data/grade_scenario_staff_only.xml b/src/openassessment/xblock/test/data/grade_scenario_staff_only.xml similarity index 100% rename from openassessment/xblock/test/data/grade_scenario_staff_only.xml rename to src/openassessment/xblock/test/data/grade_scenario_staff_only.xml diff --git a/openassessment/xblock/test/data/grade_scenario_staff_peer.xml b/src/openassessment/xblock/test/data/grade_scenario_staff_peer.xml similarity index 100% rename from openassessment/xblock/test/data/grade_scenario_staff_peer.xml rename to src/openassessment/xblock/test/data/grade_scenario_staff_peer.xml diff --git a/openassessment/xblock/test/data/grade_waiting_scenario.xml b/src/openassessment/xblock/test/data/grade_waiting_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/grade_waiting_scenario.xml rename to src/openassessment/xblock/test/data/grade_waiting_scenario.xml diff --git a/openassessment/xblock/test/data/invalid_assessment_combo_order.xml b/src/openassessment/xblock/test/data/invalid_assessment_combo_order.xml similarity index 100% rename from openassessment/xblock/test/data/invalid_assessment_combo_order.xml rename to src/openassessment/xblock/test/data/invalid_assessment_combo_order.xml diff --git a/openassessment/xblock/test/data/invalid_assessment_combo_peer_only.xml b/src/openassessment/xblock/test/data/invalid_assessment_combo_peer_only.xml similarity index 100% rename from openassessment/xblock/test/data/invalid_assessment_combo_peer_only.xml rename to src/openassessment/xblock/test/data/invalid_assessment_combo_peer_only.xml diff --git a/openassessment/xblock/test/data/invalid_assessment_examples.json b/src/openassessment/xblock/test/data/invalid_assessment_examples.json similarity index 100% rename from openassessment/xblock/test/data/invalid_assessment_examples.json rename to src/openassessment/xblock/test/data/invalid_assessment_examples.json diff --git a/openassessment/xblock/test/data/invalid_assessments.json b/src/openassessment/xblock/test/data/invalid_assessments.json similarity index 100% rename from openassessment/xblock/test/data/invalid_assessments.json rename to src/openassessment/xblock/test/data/invalid_assessments.json diff --git a/openassessment/xblock/test/data/invalid_dates.json b/src/openassessment/xblock/test/data/invalid_dates.json similarity index 100% rename from openassessment/xblock/test/data/invalid_dates.json rename to src/openassessment/xblock/test/data/invalid_dates.json diff --git a/openassessment/xblock/test/data/invalid_dates_scenario.xml b/src/openassessment/xblock/test/data/invalid_dates_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/invalid_dates_scenario.xml rename to src/openassessment/xblock/test/data/invalid_dates_scenario.xml diff --git a/openassessment/xblock/test/data/invalid_rubric.json b/src/openassessment/xblock/test/data/invalid_rubric.json similarity index 100% rename from openassessment/xblock/test/data/invalid_rubric.json rename to src/openassessment/xblock/test/data/invalid_rubric.json diff --git a/openassessment/xblock/test/data/invalid_rubrics.json b/src/openassessment/xblock/test/data/invalid_rubrics.json similarity index 100% rename from openassessment/xblock/test/data/invalid_rubrics.json rename to src/openassessment/xblock/test/data/invalid_rubrics.json diff --git a/openassessment/xblock/test/data/invalid_rubrics_no_prompts.json b/src/openassessment/xblock/test/data/invalid_rubrics_no_prompts.json similarity index 100% rename from openassessment/xblock/test/data/invalid_rubrics_no_prompts.json rename to src/openassessment/xblock/test/data/invalid_rubrics_no_prompts.json diff --git a/openassessment/xblock/test/data/invalid_update_xblock.json b/src/openassessment/xblock/test/data/invalid_update_xblock.json similarity index 100% rename from openassessment/xblock/test/data/invalid_update_xblock.json rename to src/openassessment/xblock/test/data/invalid_update_xblock.json diff --git a/openassessment/xblock/test/data/leaderboard_show.xml b/src/openassessment/xblock/test/data/leaderboard_show.xml similarity index 100% rename from openassessment/xblock/test/data/leaderboard_show.xml rename to src/openassessment/xblock/test/data/leaderboard_show.xml diff --git a/openassessment/xblock/test/data/leaderboard_show_allowfiles.xml b/src/openassessment/xblock/test/data/leaderboard_show_allowfiles.xml similarity index 100% rename from openassessment/xblock/test/data/leaderboard_show_allowfiles.xml rename to src/openassessment/xblock/test/data/leaderboard_show_allowfiles.xml diff --git a/openassessment/xblock/test/data/leaderboard_unavailable.xml b/src/openassessment/xblock/test/data/leaderboard_unavailable.xml similarity index 100% rename from openassessment/xblock/test/data/leaderboard_unavailable.xml rename to src/openassessment/xblock/test/data/leaderboard_unavailable.xml diff --git a/openassessment/xblock/test/data/line_breaks.xml b/src/openassessment/xblock/test/data/line_breaks.xml similarity index 100% rename from openassessment/xblock/test/data/line_breaks.xml rename to src/openassessment/xblock/test/data/line_breaks.xml diff --git a/openassessment/xblock/test/data/message_scenario.xml b/src/openassessment/xblock/test/data/message_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/message_scenario.xml rename to src/openassessment/xblock/test/data/message_scenario.xml diff --git a/openassessment/xblock/test/data/message_scenario_no_peer.xml b/src/openassessment/xblock/test/data/message_scenario_no_peer.xml similarity index 100% rename from openassessment/xblock/test/data/message_scenario_no_peer.xml rename to src/openassessment/xblock/test/data/message_scenario_no_peer.xml diff --git a/openassessment/xblock/test/data/message_scenario_no_self.xml b/src/openassessment/xblock/test/data/message_scenario_no_self.xml similarity index 100% rename from openassessment/xblock/test/data/message_scenario_no_self.xml rename to src/openassessment/xblock/test/data/message_scenario_no_self.xml diff --git a/openassessment/xblock/test/data/message_scenario_staff_assessment_only.xml b/src/openassessment/xblock/test/data/message_scenario_staff_assessment_only.xml similarity index 100% rename from openassessment/xblock/test/data/message_scenario_staff_assessment_only.xml rename to src/openassessment/xblock/test/data/message_scenario_staff_assessment_only.xml diff --git a/openassessment/xblock/test/data/message_scenario_student_training.xml b/src/openassessment/xblock/test/data/message_scenario_student_training.xml similarity index 100% rename from openassessment/xblock/test/data/message_scenario_student_training.xml rename to src/openassessment/xblock/test/data/message_scenario_student_training.xml diff --git a/openassessment/xblock/test/data/neither_response_type.xml b/src/openassessment/xblock/test/data/neither_response_type.xml similarity index 100% rename from openassessment/xblock/test/data/neither_response_type.xml rename to src/openassessment/xblock/test/data/neither_response_type.xml diff --git a/openassessment/xblock/test/data/optional_assessments_self_only.xml b/src/openassessment/xblock/test/data/optional_assessments_self_only.xml similarity index 100% rename from openassessment/xblock/test/data/optional_assessments_self_only.xml rename to src/openassessment/xblock/test/data/optional_assessments_self_only.xml diff --git a/openassessment/xblock/test/data/over_grade_scenario.xml b/src/openassessment/xblock/test/data/over_grade_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/over_grade_scenario.xml rename to src/openassessment/xblock/test/data/over_grade_scenario.xml diff --git a/openassessment/xblock/test/data/parse_assessments_xml.json b/src/openassessment/xblock/test/data/parse_assessments_xml.json similarity index 100% rename from openassessment/xblock/test/data/parse_assessments_xml.json rename to src/openassessment/xblock/test/data/parse_assessments_xml.json diff --git a/openassessment/xblock/test/data/parse_examples_xml.json b/src/openassessment/xblock/test/data/parse_examples_xml.json similarity index 100% rename from openassessment/xblock/test/data/parse_examples_xml.json rename to src/openassessment/xblock/test/data/parse_examples_xml.json diff --git a/openassessment/xblock/test/data/parse_prompts_xml.json b/src/openassessment/xblock/test/data/parse_prompts_xml.json similarity index 100% rename from openassessment/xblock/test/data/parse_prompts_xml.json rename to src/openassessment/xblock/test/data/parse_prompts_xml.json diff --git a/openassessment/xblock/test/data/parse_rubric_xml.json b/src/openassessment/xblock/test/data/parse_rubric_xml.json similarity index 100% rename from openassessment/xblock/test/data/parse_rubric_xml.json rename to src/openassessment/xblock/test/data/parse_rubric_xml.json diff --git a/openassessment/xblock/test/data/peer_assessment_default_grading_strategy_scenario.xml b/src/openassessment/xblock/test/data/peer_assessment_default_grading_strategy_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/peer_assessment_default_grading_strategy_scenario.xml rename to src/openassessment/xblock/test/data/peer_assessment_default_grading_strategy_scenario.xml diff --git a/openassessment/xblock/test/data/peer_assessment_flex_grading_scenario.xml b/src/openassessment/xblock/test/data/peer_assessment_flex_grading_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/peer_assessment_flex_grading_scenario.xml rename to src/openassessment/xblock/test/data/peer_assessment_flex_grading_scenario.xml diff --git a/openassessment/xblock/test/data/peer_assessment_mean_grading_strategy_scenario.xml b/src/openassessment/xblock/test/data/peer_assessment_mean_grading_strategy_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/peer_assessment_mean_grading_strategy_scenario.xml rename to src/openassessment/xblock/test/data/peer_assessment_mean_grading_strategy_scenario.xml diff --git a/openassessment/xblock/test/data/peer_assessment_median_grading_strategy_scenario.xml b/src/openassessment/xblock/test/data/peer_assessment_median_grading_strategy_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/peer_assessment_median_grading_strategy_scenario.xml rename to src/openassessment/xblock/test/data/peer_assessment_median_grading_strategy_scenario.xml diff --git a/openassessment/xblock/test/data/peer_assessment_scenario.xml b/src/openassessment/xblock/test/data/peer_assessment_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/peer_assessment_scenario.xml rename to src/openassessment/xblock/test/data/peer_assessment_scenario.xml diff --git a/openassessment/xblock/test/data/peer_closed_scenario.xml b/src/openassessment/xblock/test/data/peer_closed_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/peer_closed_scenario.xml rename to src/openassessment/xblock/test/data/peer_closed_scenario.xml diff --git a/openassessment/xblock/test/data/peer_future_scenario.xml b/src/openassessment/xblock/test/data/peer_future_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/peer_future_scenario.xml rename to src/openassessment/xblock/test/data/peer_future_scenario.xml diff --git a/openassessment/xblock/test/data/peer_only_scenario.xml b/src/openassessment/xblock/test/data/peer_only_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/peer_only_scenario.xml rename to src/openassessment/xblock/test/data/peer_only_scenario.xml diff --git a/openassessment/xblock/test/data/prompt_html.xml b/src/openassessment/xblock/test/data/prompt_html.xml similarity index 100% rename from openassessment/xblock/test/data/prompt_html.xml rename to src/openassessment/xblock/test/data/prompt_html.xml diff --git a/openassessment/xblock/test/data/resolve_dates.json b/src/openassessment/xblock/test/data/resolve_dates.json similarity index 100% rename from openassessment/xblock/test/data/resolve_dates.json rename to src/openassessment/xblock/test/data/resolve_dates.json diff --git a/openassessment/xblock/test/data/resolve_dates_scenario.xml b/src/openassessment/xblock/test/data/resolve_dates_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/resolve_dates_scenario.xml rename to src/openassessment/xblock/test/data/resolve_dates_scenario.xml diff --git a/openassessment/xblock/test/data/save_responses.json b/src/openassessment/xblock/test/data/save_responses.json similarity index 100% rename from openassessment/xblock/test/data/save_responses.json rename to src/openassessment/xblock/test/data/save_responses.json diff --git a/openassessment/xblock/test/data/save_scenario.xml b/src/openassessment/xblock/test/data/save_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/save_scenario.xml rename to src/openassessment/xblock/test/data/save_scenario.xml diff --git a/openassessment/xblock/test/data/self_assessment_closed.xml b/src/openassessment/xblock/test/data/self_assessment_closed.xml similarity index 100% rename from openassessment/xblock/test/data/self_assessment_closed.xml rename to src/openassessment/xblock/test/data/self_assessment_closed.xml diff --git a/openassessment/xblock/test/data/self_assessment_open.xml b/src/openassessment/xblock/test/data/self_assessment_open.xml similarity index 100% rename from openassessment/xblock/test/data/self_assessment_open.xml rename to src/openassessment/xblock/test/data/self_assessment_open.xml diff --git a/openassessment/xblock/test/data/self_assessment_scenario.xml b/src/openassessment/xblock/test/data/self_assessment_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/self_assessment_scenario.xml rename to src/openassessment/xblock/test/data/self_assessment_scenario.xml diff --git a/openassessment/xblock/test/data/self_assessment_unavailable.xml b/src/openassessment/xblock/test/data/self_assessment_unavailable.xml similarity index 100% rename from openassessment/xblock/test/data/self_assessment_unavailable.xml rename to src/openassessment/xblock/test/data/self_assessment_unavailable.xml diff --git a/openassessment/xblock/test/data/self_only_scenario.xml b/src/openassessment/xblock/test/data/self_only_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/self_only_scenario.xml rename to src/openassessment/xblock/test/data/self_only_scenario.xml diff --git a/openassessment/xblock/test/data/self_then_peer.xml b/src/openassessment/xblock/test/data/self_then_peer.xml similarity index 100% rename from openassessment/xblock/test/data/self_then_peer.xml rename to src/openassessment/xblock/test/data/self_then_peer.xml diff --git a/openassessment/xblock/test/data/serialize.json b/src/openassessment/xblock/test/data/serialize.json similarity index 100% rename from openassessment/xblock/test/data/serialize.json rename to src/openassessment/xblock/test/data/serialize.json diff --git a/openassessment/xblock/test/data/simple_self_staff_scenario.xml b/src/openassessment/xblock/test/data/simple_self_staff_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/simple_self_staff_scenario.xml rename to src/openassessment/xblock/test/data/simple_self_staff_scenario.xml diff --git a/openassessment/xblock/test/data/single_file_upload_scenario.xml b/src/openassessment/xblock/test/data/single_file_upload_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/single_file_upload_scenario.xml rename to src/openassessment/xblock/test/data/single_file_upload_scenario.xml diff --git a/openassessment/xblock/test/data/staff_dates_scenario.xml b/src/openassessment/xblock/test/data/staff_dates_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/staff_dates_scenario.xml rename to src/openassessment/xblock/test/data/staff_dates_scenario.xml diff --git a/openassessment/xblock/test/data/staff_grade_scenario.xml b/src/openassessment/xblock/test/data/staff_grade_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/staff_grade_scenario.xml rename to src/openassessment/xblock/test/data/staff_grade_scenario.xml diff --git a/openassessment/xblock/test/data/student_training.xml b/src/openassessment/xblock/test/data/student_training.xml similarity index 100% rename from openassessment/xblock/test/data/student_training.xml rename to src/openassessment/xblock/test/data/student_training.xml diff --git a/openassessment/xblock/test/data/student_training_combo.json b/src/openassessment/xblock/test/data/student_training_combo.json similarity index 100% rename from openassessment/xblock/test/data/student_training_combo.json rename to src/openassessment/xblock/test/data/student_training_combo.json diff --git a/openassessment/xblock/test/data/student_training_due.xml b/src/openassessment/xblock/test/data/student_training_due.xml similarity index 100% rename from openassessment/xblock/test/data/student_training_due.xml rename to src/openassessment/xblock/test/data/student_training_due.xml diff --git a/openassessment/xblock/test/data/student_training_future.xml b/src/openassessment/xblock/test/data/student_training_future.xml similarity index 100% rename from openassessment/xblock/test/data/student_training_future.xml rename to src/openassessment/xblock/test/data/student_training_future.xml diff --git a/openassessment/xblock/test/data/student_training_mixin.json b/src/openassessment/xblock/test/data/student_training_mixin.json similarity index 100% rename from openassessment/xblock/test/data/student_training_mixin.json rename to src/openassessment/xblock/test/data/student_training_mixin.json diff --git a/openassessment/xblock/test/data/submission_closed.xml b/src/openassessment/xblock/test/data/submission_closed.xml similarity index 100% rename from openassessment/xblock/test/data/submission_closed.xml rename to src/openassessment/xblock/test/data/submission_closed.xml diff --git a/openassessment/xblock/test/data/submission_no_deadline.xml b/src/openassessment/xblock/test/data/submission_no_deadline.xml similarity index 100% rename from openassessment/xblock/test/data/submission_no_deadline.xml rename to src/openassessment/xblock/test/data/submission_no_deadline.xml diff --git a/openassessment/xblock/test/data/submission_open.xml b/src/openassessment/xblock/test/data/submission_open.xml similarity index 100% rename from openassessment/xblock/test/data/submission_open.xml rename to src/openassessment/xblock/test/data/submission_open.xml diff --git a/openassessment/xblock/test/data/submission_unavailable.xml b/src/openassessment/xblock/test/data/submission_unavailable.xml similarity index 100% rename from openassessment/xblock/test/data/submission_unavailable.xml rename to src/openassessment/xblock/test/data/submission_unavailable.xml diff --git a/openassessment/xblock/test/data/team_submission.xml b/src/openassessment/xblock/test/data/team_submission.xml similarity index 100% rename from openassessment/xblock/test/data/team_submission.xml rename to src/openassessment/xblock/test/data/team_submission.xml diff --git a/openassessment/xblock/test/data/team_submission_file_scenario.xml b/src/openassessment/xblock/test/data/team_submission_file_scenario.xml similarity index 100% rename from openassessment/xblock/test/data/team_submission_file_scenario.xml rename to src/openassessment/xblock/test/data/team_submission_file_scenario.xml diff --git a/openassessment/xblock/test/data/update_from_xml.json b/src/openassessment/xblock/test/data/update_from_xml.json similarity index 100% rename from openassessment/xblock/test/data/update_from_xml.json rename to src/openassessment/xblock/test/data/update_from_xml.json diff --git a/openassessment/xblock/test/data/update_from_xml_error.json b/src/openassessment/xblock/test/data/update_from_xml_error.json similarity index 100% rename from openassessment/xblock/test/data/update_from_xml_error.json rename to src/openassessment/xblock/test/data/update_from_xml_error.json diff --git a/openassessment/xblock/test/data/update_xblock.json b/src/openassessment/xblock/test/data/update_xblock.json similarity index 100% rename from openassessment/xblock/test/data/update_xblock.json rename to src/openassessment/xblock/test/data/update_xblock.json diff --git a/openassessment/xblock/test/data/updated_block.xml b/src/openassessment/xblock/test/data/updated_block.xml similarity index 100% rename from openassessment/xblock/test/data/updated_block.xml rename to src/openassessment/xblock/test/data/updated_block.xml diff --git a/openassessment/xblock/test/data/valid_assessment_examples.json b/src/openassessment/xblock/test/data/valid_assessment_examples.json similarity index 100% rename from openassessment/xblock/test/data/valid_assessment_examples.json rename to src/openassessment/xblock/test/data/valid_assessment_examples.json diff --git a/openassessment/xblock/test/data/valid_assessments.json b/src/openassessment/xblock/test/data/valid_assessments.json similarity index 100% rename from openassessment/xblock/test/data/valid_assessments.json rename to src/openassessment/xblock/test/data/valid_assessments.json diff --git a/openassessment/xblock/test/data/valid_dates.json b/src/openassessment/xblock/test/data/valid_dates.json similarity index 100% rename from openassessment/xblock/test/data/valid_dates.json rename to src/openassessment/xblock/test/data/valid_dates.json diff --git a/openassessment/xblock/test/data/valid_rubrics.json b/src/openassessment/xblock/test/data/valid_rubrics.json similarity index 100% rename from openassessment/xblock/test/data/valid_rubrics.json rename to src/openassessment/xblock/test/data/valid_rubrics.json diff --git a/openassessment/xblock/test/data/waiting_scenarios.json b/src/openassessment/xblock/test/data/waiting_scenarios.json similarity index 100% rename from openassessment/xblock/test/data/waiting_scenarios.json rename to src/openassessment/xblock/test/data/waiting_scenarios.json diff --git a/openassessment/xblock/test/data/zero_points.xml b/src/openassessment/xblock/test/data/zero_points.xml similarity index 100% rename from openassessment/xblock/test/data/zero_points.xml rename to src/openassessment/xblock/test/data/zero_points.xml diff --git a/openassessment/xblock/test/test_allow_resubmission.py b/src/openassessment/xblock/test/test_allow_resubmission.py similarity index 100% rename from openassessment/xblock/test/test_allow_resubmission.py rename to src/openassessment/xblock/test/test_allow_resubmission.py diff --git a/openassessment/xblock/test/test_config_mixin.py b/src/openassessment/xblock/test/test_config_mixin.py similarity index 100% rename from openassessment/xblock/test/test_config_mixin.py rename to src/openassessment/xblock/test/test_config_mixin.py diff --git a/openassessment/xblock/test/test_course_items_listing.py b/src/openassessment/xblock/test/test_course_items_listing.py similarity index 100% rename from openassessment/xblock/test/test_course_items_listing.py rename to src/openassessment/xblock/test/test_course_items_listing.py diff --git a/openassessment/xblock/test/test_data_conversion.py b/src/openassessment/xblock/test/test_data_conversion.py similarity index 100% rename from openassessment/xblock/test/test_data_conversion.py rename to src/openassessment/xblock/test/test_data_conversion.py diff --git a/openassessment/xblock/test/test_defaults.py b/src/openassessment/xblock/test/test_defaults.py similarity index 100% rename from openassessment/xblock/test/test_defaults.py rename to src/openassessment/xblock/test/test_defaults.py diff --git a/openassessment/xblock/test/test_export_import.py b/src/openassessment/xblock/test/test_export_import.py similarity index 100% rename from openassessment/xblock/test/test_export_import.py rename to src/openassessment/xblock/test/test_export_import.py diff --git a/openassessment/xblock/test/test_grade.py b/src/openassessment/xblock/test/test_grade.py similarity index 100% rename from openassessment/xblock/test/test_grade.py rename to src/openassessment/xblock/test/test_grade.py diff --git a/openassessment/xblock/test/test_grade_explanation.py b/src/openassessment/xblock/test/test_grade_explanation.py similarity index 100% rename from openassessment/xblock/test/test_grade_explanation.py rename to src/openassessment/xblock/test/test_grade_explanation.py diff --git a/openassessment/xblock/test/test_leaderboard.py b/src/openassessment/xblock/test/test_leaderboard.py similarity index 100% rename from openassessment/xblock/test/test_leaderboard.py rename to src/openassessment/xblock/test/test_leaderboard.py diff --git a/openassessment/xblock/test/test_lms.py b/src/openassessment/xblock/test/test_lms.py similarity index 100% rename from openassessment/xblock/test/test_lms.py rename to src/openassessment/xblock/test/test_lms.py diff --git a/openassessment/xblock/test/test_load_static.py b/src/openassessment/xblock/test/test_load_static.py similarity index 100% rename from openassessment/xblock/test/test_load_static.py rename to src/openassessment/xblock/test/test_load_static.py diff --git a/openassessment/xblock/test/test_message.py b/src/openassessment/xblock/test/test_message.py similarity index 100% rename from openassessment/xblock/test/test_message.py rename to src/openassessment/xblock/test/test_message.py diff --git a/openassessment/xblock/test/test_mobile.py b/src/openassessment/xblock/test/test_mobile.py similarity index 100% rename from openassessment/xblock/test/test_mobile.py rename to src/openassessment/xblock/test/test_mobile.py diff --git a/openassessment/xblock/test/test_notifications.py b/src/openassessment/xblock/test/test_notifications.py similarity index 100% rename from openassessment/xblock/test/test_notifications.py rename to src/openassessment/xblock/test/test_notifications.py diff --git a/openassessment/xblock/test/test_openassessment.py b/src/openassessment/xblock/test/test_openassessment.py similarity index 100% rename from openassessment/xblock/test/test_openassessment.py rename to src/openassessment/xblock/test/test_openassessment.py diff --git a/openassessment/xblock/test/test_ora_reminders.py b/src/openassessment/xblock/test/test_ora_reminders.py similarity index 100% rename from openassessment/xblock/test/test_ora_reminders.py rename to src/openassessment/xblock/test/test_ora_reminders.py diff --git a/openassessment/xblock/test/test_peer.py b/src/openassessment/xblock/test/test_peer.py similarity index 100% rename from openassessment/xblock/test/test_peer.py rename to src/openassessment/xblock/test/test_peer.py diff --git a/openassessment/xblock/test/test_resolve_dates.py b/src/openassessment/xblock/test/test_resolve_dates.py similarity index 100% rename from openassessment/xblock/test/test_resolve_dates.py rename to src/openassessment/xblock/test/test_resolve_dates.py diff --git a/openassessment/xblock/test/test_rubric_reuse.py b/src/openassessment/xblock/test/test_rubric_reuse.py similarity index 100% rename from openassessment/xblock/test/test_rubric_reuse.py rename to src/openassessment/xblock/test/test_rubric_reuse.py diff --git a/openassessment/xblock/test/test_save_files_descriptions.py b/src/openassessment/xblock/test/test_save_files_descriptions.py similarity index 100% rename from openassessment/xblock/test/test_save_files_descriptions.py rename to src/openassessment/xblock/test/test_save_files_descriptions.py diff --git a/openassessment/xblock/test/test_save_response.py b/src/openassessment/xblock/test/test_save_response.py similarity index 100% rename from openassessment/xblock/test/test_save_response.py rename to src/openassessment/xblock/test/test_save_response.py diff --git a/openassessment/xblock/test/test_self.py b/src/openassessment/xblock/test/test_self.py similarity index 100% rename from openassessment/xblock/test/test_self.py rename to src/openassessment/xblock/test/test_self.py diff --git a/openassessment/xblock/test/test_staff.py b/src/openassessment/xblock/test/test_staff.py similarity index 100% rename from openassessment/xblock/test/test_staff.py rename to src/openassessment/xblock/test/test_staff.py diff --git a/openassessment/xblock/test/test_staff_area.py b/src/openassessment/xblock/test/test_staff_area.py similarity index 100% rename from openassessment/xblock/test/test_staff_area.py rename to src/openassessment/xblock/test/test_staff_area.py diff --git a/openassessment/xblock/test/test_student_training.py b/src/openassessment/xblock/test/test_student_training.py similarity index 100% rename from openassessment/xblock/test/test_student_training.py rename to src/openassessment/xblock/test/test_student_training.py diff --git a/openassessment/xblock/test/test_studio.py b/src/openassessment/xblock/test/test_studio.py similarity index 100% rename from openassessment/xblock/test/test_studio.py rename to src/openassessment/xblock/test/test_studio.py diff --git a/openassessment/xblock/test/test_submission.py b/src/openassessment/xblock/test/test_submission.py similarity index 100% rename from openassessment/xblock/test/test_submission.py rename to src/openassessment/xblock/test/test_submission.py diff --git a/openassessment/xblock/test/test_team.py b/src/openassessment/xblock/test/test_team.py similarity index 100% rename from openassessment/xblock/test/test_team.py rename to src/openassessment/xblock/test/test_team.py diff --git a/openassessment/xblock/test/test_team_workflow_mixin.py b/src/openassessment/xblock/test/test_team_workflow_mixin.py similarity index 100% rename from openassessment/xblock/test/test_team_workflow_mixin.py rename to src/openassessment/xblock/test/test_team_workflow_mixin.py diff --git a/openassessment/xblock/test/test_templates.py b/src/openassessment/xblock/test/test_templates.py similarity index 100% rename from openassessment/xblock/test/test_templates.py rename to src/openassessment/xblock/test/test_templates.py diff --git a/openassessment/xblock/test/test_validation.py b/src/openassessment/xblock/test/test_validation.py similarity index 100% rename from openassessment/xblock/test/test_validation.py rename to src/openassessment/xblock/test/test_validation.py diff --git a/openassessment/xblock/test/test_workflow_mixin.py b/src/openassessment/xblock/test/test_workflow_mixin.py similarity index 100% rename from openassessment/xblock/test/test_workflow_mixin.py rename to src/openassessment/xblock/test/test_workflow_mixin.py diff --git a/openassessment/xblock/test/test_xml.py b/src/openassessment/xblock/test/test_xml.py similarity index 77% rename from openassessment/xblock/test/test_xml.py rename to src/openassessment/xblock/test/test_xml.py index db4d35a807..c5f96b4323 100644 --- a/openassessment/xblock/test/test_xml.py +++ b/src/openassessment/xblock/test/test_xml.py @@ -151,6 +151,7 @@ def _configure_xblock(self, data): self.oa_block.teams_enabled = data.get('teams_enabled', None) self.oa_block.selected_teamset_id = data.get('selected_teamset_id', None) self.oa_block.show_rubric_during_response = data.get('show_rubric_during_response') + self.oa_block.date_config_type = data.get('date_config_type', None) @ddt.file_data('data/serialize.json') def test_serialize(self, data): @@ -559,3 +560,117 @@ def test_parse_from_xml(self, data): def test_parse_from_xml_error(self, data): with self.assertRaises(UpdateFromXmlError): parse_from_xml_str("".join(data['xml'])) + + +class TestDateConfigTypeXml(TestCase): + """ + Regression tests for round-tripping `date_config_type` through XML + (course export/import, re-run, and other OLX round-trip flows). + """ + MINIMAL_XML = ( + '' + 'Foo' + '' + '' + '' + '' + '' + '' + 'Test prompt' + '' + 'Test criterion' + '' + 'Test criterion prompt' + '' + '' + '' + '' + '' + ) + + def _xml(self, date_config_type=None): + attrs = f' date_config_type="{date_config_type}"' if date_config_type is not None else '' + return self.MINIMAL_XML.format(attrs=attrs) + + def test_parse_from_xml_reads_date_config_type(self): + config = parse_from_xml_str(self._xml('subsection')) + self.assertEqual(config['date_config_type'], 'subsection') + + def test_parse_from_xml_missing_attribute_defaults_to_none(self): + # Backwards compatibility: XML exported before this fix (or that never + # set the field) has no "date_config_type" attribute at all. This must + # not error, and must not silently claim a value was set. + config = parse_from_xml_str(self._xml()) + self.assertIsNone(config['date_config_type']) + + def test_parse_from_xml_invalid_value_raises(self): + with self.assertRaises(UpdateFromXmlError): + parse_from_xml_str(self._xml('not_a_real_option')) + + def test_serialize_writes_date_config_type(self): + oa_block = mock.MagicMock(OpenAssessmentBlock) + oa_block.title = 'Foo' + oa_block.display_name = 'Foo' + oa_block.prompts = create_prompts_list('Test prompt') + oa_block.prompts_type = 'text' + oa_block.rubric_criteria = TestSerializeContent.BASIC_CRITERIA + oa_block.rubric_assessments = TestSerializeContent.BASIC_ASSESSMENTS + oa_block.rubric_feedback_prompt = None + oa_block.rubric_feedback_default_text = None + oa_block.submission_start = None + oa_block.submission_due = None + oa_block.leaderboard_show = 0 + oa_block.text_response = '' + oa_block.text_response_editor = 'text' + oa_block.file_upload_response = None + oa_block.file_upload_type = None + oa_block.white_listed_file_types = None + oa_block.allow_multiple_files = None + oa_block.allow_latex = None + oa_block.allow_learner_resubmissions = None + oa_block.resubmissions_grace_period = None + oa_block.group_access = {} + oa_block.teams_enabled = None + oa_block.selected_teamset_id = None + oa_block.show_rubric_during_response = None + oa_block.date_config_type = 'subsection' + + xml = serialize_content(oa_block) + parsed = etree.fromstring(xml) + self.assertEqual(parsed.get('date_config_type'), 'subsection') + + def test_round_trip_preserves_date_config_type(self): + config = parse_from_xml_str(self._xml('course_end')) + self.assertEqual(config['date_config_type'], 'course_end') + + oa_block = mock.MagicMock(OpenAssessmentBlock) + oa_block.title = config['title'] + oa_block.display_name = config['title'] + oa_block.prompts = config['prompts'] + oa_block.prompts_type = config['prompts_type'] + oa_block.rubric_criteria = config['rubric_criteria'] + oa_block.rubric_assessments = config['rubric_assessments'] + oa_block.rubric_feedback_prompt = config['rubric_feedback_prompt'] + oa_block.rubric_feedback_default_text = config['rubric_feedback_default_text'] + oa_block.submission_start = config['submission_start'] + oa_block.submission_due = config['submission_due'] + oa_block.leaderboard_show = config['leaderboard_show'] + oa_block.text_response = config['text_response'] + oa_block.text_response_editor = config['text_response_editor'] + oa_block.file_upload_response = config['file_upload_response'] + oa_block.file_upload_type = config['file_upload_type'] + oa_block.white_listed_file_types = config['white_listed_file_types'] + oa_block.allow_multiple_files = config['allow_multiple_files'] + oa_block.allow_latex = config['allow_latex'] + oa_block.allow_learner_resubmissions = config['allow_learner_resubmissions'] + oa_block.resubmissions_grace_period = config['resubmissions_grace_period'] + oa_block.group_access = config['group_access'] + oa_block.teams_enabled = config['teams_enabled'] + oa_block.selected_teamset_id = config['selected_teamset_id'] + oa_block.show_rubric_during_response = config['show_rubric_during_response'] + oa_block.date_config_type = config['date_config_type'] + + reserialized_xml = serialize_content(oa_block) + reparsed_config = parse_from_xml_str(reserialized_xml) + self.assertEqual(reparsed_config['date_config_type'], 'course_end') diff --git a/openassessment/xblock/ui_mixins/__init__.py b/src/openassessment/xblock/ui_mixins/__init__.py similarity index 100% rename from openassessment/xblock/ui_mixins/__init__.py rename to src/openassessment/xblock/ui_mixins/__init__.py diff --git a/openassessment/xblock/ui_mixins/legacy/__init__.py b/src/openassessment/xblock/ui_mixins/legacy/__init__.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/__init__.py rename to src/openassessment/xblock/ui_mixins/legacy/__init__.py diff --git a/openassessment/xblock/ui_mixins/legacy/handlers_mixin.py b/src/openassessment/xblock/ui_mixins/legacy/handlers_mixin.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/handlers_mixin.py rename to src/openassessment/xblock/ui_mixins/legacy/handlers_mixin.py diff --git a/openassessment/xblock/ui_mixins/legacy/serializers.py b/src/openassessment/xblock/ui_mixins/legacy/serializers.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/serializers.py rename to src/openassessment/xblock/ui_mixins/legacy/serializers.py diff --git a/openassessment/xblock/ui_mixins/legacy/views/__init__.py b/src/openassessment/xblock/ui_mixins/legacy/views/__init__.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/views/__init__.py rename to src/openassessment/xblock/ui_mixins/legacy/views/__init__.py diff --git a/openassessment/xblock/ui_mixins/legacy/views/peer.py b/src/openassessment/xblock/ui_mixins/legacy/views/peer.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/views/peer.py rename to src/openassessment/xblock/ui_mixins/legacy/views/peer.py diff --git a/openassessment/xblock/ui_mixins/legacy/views/self.py b/src/openassessment/xblock/ui_mixins/legacy/views/self.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/views/self.py rename to src/openassessment/xblock/ui_mixins/legacy/views/self.py diff --git a/openassessment/xblock/ui_mixins/legacy/views/staff.py b/src/openassessment/xblock/ui_mixins/legacy/views/staff.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/views/staff.py rename to src/openassessment/xblock/ui_mixins/legacy/views/staff.py diff --git a/openassessment/xblock/ui_mixins/legacy/views/submission.py b/src/openassessment/xblock/ui_mixins/legacy/views/submission.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/views/submission.py rename to src/openassessment/xblock/ui_mixins/legacy/views/submission.py diff --git a/openassessment/xblock/ui_mixins/legacy/views/training.py b/src/openassessment/xblock/ui_mixins/legacy/views/training.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/views/training.py rename to src/openassessment/xblock/ui_mixins/legacy/views/training.py diff --git a/openassessment/xblock/ui_mixins/legacy/views_mixin.py b/src/openassessment/xblock/ui_mixins/legacy/views_mixin.py similarity index 100% rename from openassessment/xblock/ui_mixins/legacy/views_mixin.py rename to src/openassessment/xblock/ui_mixins/legacy/views_mixin.py diff --git a/openassessment/xblock/ui_mixins/mfe/__init__.py b/src/openassessment/xblock/ui_mixins/mfe/__init__.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/__init__.py rename to src/openassessment/xblock/ui_mixins/mfe/__init__.py diff --git a/openassessment/xblock/ui_mixins/mfe/assessment_serializers.py b/src/openassessment/xblock/ui_mixins/mfe/assessment_serializers.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/assessment_serializers.py rename to src/openassessment/xblock/ui_mixins/mfe/assessment_serializers.py diff --git a/openassessment/xblock/ui_mixins/mfe/constants/__init__.py b/src/openassessment/xblock/ui_mixins/mfe/constants/__init__.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/constants/__init__.py rename to src/openassessment/xblock/ui_mixins/mfe/constants/__init__.py diff --git a/openassessment/xblock/ui_mixins/mfe/constants/error_codes.py b/src/openassessment/xblock/ui_mixins/mfe/constants/error_codes.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/constants/error_codes.py rename to src/openassessment/xblock/ui_mixins/mfe/constants/error_codes.py diff --git a/openassessment/xblock/ui_mixins/mfe/constants/handler_suffixes.py b/src/openassessment/xblock/ui_mixins/mfe/constants/handler_suffixes.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/constants/handler_suffixes.py rename to src/openassessment/xblock/ui_mixins/mfe/constants/handler_suffixes.py diff --git a/openassessment/xblock/ui_mixins/mfe/mixin.py b/src/openassessment/xblock/ui_mixins/mfe/mixin.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/mixin.py rename to src/openassessment/xblock/ui_mixins/mfe/mixin.py diff --git a/openassessment/xblock/ui_mixins/mfe/ora_config_serializer.py b/src/openassessment/xblock/ui_mixins/mfe/ora_config_serializer.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/ora_config_serializer.py rename to src/openassessment/xblock/ui_mixins/mfe/ora_config_serializer.py diff --git a/openassessment/xblock/ui_mixins/mfe/page_context_serializer.py b/src/openassessment/xblock/ui_mixins/mfe/page_context_serializer.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/page_context_serializer.py rename to src/openassessment/xblock/ui_mixins/mfe/page_context_serializer.py diff --git a/openassessment/xblock/ui_mixins/mfe/serializer_utils.py b/src/openassessment/xblock/ui_mixins/mfe/serializer_utils.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/serializer_utils.py rename to src/openassessment/xblock/ui_mixins/mfe/serializer_utils.py diff --git a/openassessment/xblock/ui_mixins/mfe/submission_serializers.py b/src/openassessment/xblock/ui_mixins/mfe/submission_serializers.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/submission_serializers.py rename to src/openassessment/xblock/ui_mixins/mfe/submission_serializers.py diff --git a/openassessment/xblock/ui_mixins/mfe/test_assessment_serializers.py b/src/openassessment/xblock/ui_mixins/mfe/test_assessment_serializers.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/test_assessment_serializers.py rename to src/openassessment/xblock/ui_mixins/mfe/test_assessment_serializers.py diff --git a/openassessment/xblock/ui_mixins/mfe/test_mfe_mixin.py b/src/openassessment/xblock/ui_mixins/mfe/test_mfe_mixin.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/test_mfe_mixin.py rename to src/openassessment/xblock/ui_mixins/mfe/test_mfe_mixin.py diff --git a/openassessment/xblock/ui_mixins/mfe/test_page_context_serializer.py b/src/openassessment/xblock/ui_mixins/mfe/test_page_context_serializer.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/test_page_context_serializer.py rename to src/openassessment/xblock/ui_mixins/mfe/test_page_context_serializer.py diff --git a/openassessment/xblock/ui_mixins/mfe/test_serializers.py b/src/openassessment/xblock/ui_mixins/mfe/test_serializers.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/test_serializers.py rename to src/openassessment/xblock/ui_mixins/mfe/test_serializers.py diff --git a/openassessment/xblock/ui_mixins/mfe/test_submission_serializers.py b/src/openassessment/xblock/ui_mixins/mfe/test_submission_serializers.py similarity index 100% rename from openassessment/xblock/ui_mixins/mfe/test_submission_serializers.py rename to src/openassessment/xblock/ui_mixins/mfe/test_submission_serializers.py diff --git a/openassessment/xblock/utils/__init__.py b/src/openassessment/xblock/utils/__init__.py similarity index 100% rename from openassessment/xblock/utils/__init__.py rename to src/openassessment/xblock/utils/__init__.py diff --git a/openassessment/xblock/utils/allow_resubmission.py b/src/openassessment/xblock/utils/allow_resubmission.py similarity index 100% rename from openassessment/xblock/utils/allow_resubmission.py rename to src/openassessment/xblock/utils/allow_resubmission.py diff --git a/openassessment/xblock/utils/data_conversion.py b/src/openassessment/xblock/utils/data_conversion.py similarity index 100% rename from openassessment/xblock/utils/data_conversion.py rename to src/openassessment/xblock/utils/data_conversion.py diff --git a/openassessment/xblock/utils/defaults.py b/src/openassessment/xblock/utils/defaults.py similarity index 100% rename from openassessment/xblock/utils/defaults.py rename to src/openassessment/xblock/utils/defaults.py diff --git a/openassessment/xblock/utils/editor_config.py b/src/openassessment/xblock/utils/editor_config.py similarity index 100% rename from openassessment/xblock/utils/editor_config.py rename to src/openassessment/xblock/utils/editor_config.py diff --git a/openassessment/xblock/utils/notifications.py b/src/openassessment/xblock/utils/notifications.py similarity index 100% rename from openassessment/xblock/utils/notifications.py rename to src/openassessment/xblock/utils/notifications.py diff --git a/openassessment/xblock/utils/ora_reminders.py b/src/openassessment/xblock/utils/ora_reminders.py similarity index 100% rename from openassessment/xblock/utils/ora_reminders.py rename to src/openassessment/xblock/utils/ora_reminders.py diff --git a/openassessment/xblock/utils/resolve_dates.py b/src/openassessment/xblock/utils/resolve_dates.py similarity index 100% rename from openassessment/xblock/utils/resolve_dates.py rename to src/openassessment/xblock/utils/resolve_dates.py diff --git a/openassessment/xblock/utils/schema.py b/src/openassessment/xblock/utils/schema.py similarity index 100% rename from openassessment/xblock/utils/schema.py rename to src/openassessment/xblock/utils/schema.py diff --git a/openassessment/xblock/utils/user_data.py b/src/openassessment/xblock/utils/user_data.py similarity index 100% rename from openassessment/xblock/utils/user_data.py rename to src/openassessment/xblock/utils/user_data.py diff --git a/openassessment/xblock/utils/validation.py b/src/openassessment/xblock/utils/validation.py similarity index 100% rename from openassessment/xblock/utils/validation.py rename to src/openassessment/xblock/utils/validation.py diff --git a/openassessment/xblock/utils/xml.py b/src/openassessment/xblock/utils/xml.py similarity index 97% rename from openassessment/xblock/utils/xml.py rename to src/openassessment/xblock/utils/xml.py index b6331e9149..8262036ca1 100644 --- a/openassessment/xblock/utils/xml.py +++ b/src/openassessment/xblock/utils/xml.py @@ -13,6 +13,7 @@ from lxml import etree from openassessment.xblock.utils.data_conversion import update_assessments_format +from openassessment.xblock.utils.defaults import DATE_CONFIG_MANUAL, DATE_CONFIG_SUBSECTION, DATE_CONFIG_COURSE_END from openassessment.xblock.lms_mixin import GroupAccessDict log = logging.getLogger(__name__) @@ -725,6 +726,10 @@ def serialize_content_to_xml(oa_block, root): if oa_block.submission_due is not None: root.set('submission_due', str(oa_block.submission_due)) + # Set date configuration type + if oa_block.date_config_type is not None: + root.set('date_config_type', str(oa_block.date_config_type)) + # Set leaderboard show if oa_block.leaderboard_show: root.set('leaderboard_show', str(oa_block.leaderboard_show)) @@ -947,6 +952,15 @@ def parse_from_xml(root, block=None): if 'show_rubric_during_response' in root.attrib: show_rubric_during_response = _parse_boolean(str(root.attrib['show_rubric_during_response'])) + date_config_type = None + if 'date_config_type' in root.attrib: + date_config_type = str(root.attrib['date_config_type']) + valid_date_config_types = [DATE_CONFIG_MANUAL, DATE_CONFIG_SUBSECTION, DATE_CONFIG_COURSE_END] + if date_config_type not in valid_date_config_types: + raise UpdateFromXmlError( + 'The "date_config_type" value must be one of: {}.'.format(", ".join(valid_date_config_types)) + ) + # Retrieve the title title_el = root.find('title') title = block and block.display_name @@ -1023,6 +1037,7 @@ def parse_from_xml(root, block=None): 'show_rubric_during_response': show_rubric_during_response, 'allow_learner_resubmissions': allow_learner_resubmissions, 'resubmissions_grace_period': resubmissions_grace_period, + 'date_config_type': date_config_type, } diff --git a/openassessment/xblock/workflow_mixin.py b/src/openassessment/xblock/workflow_mixin.py similarity index 100% rename from openassessment/xblock/workflow_mixin.py rename to src/openassessment/xblock/workflow_mixin.py diff --git a/tox.ini b/tox.ini index 0c45f1f174..dc43b74a1a 100644 --- a/tox.ini +++ b/tox.ini @@ -1,34 +1,47 @@ [tox] -envlist = py{311, 312}-django{42,52}, js, quality +envlist = django42, django52, js, quality, docs +requires = tox-uv>=1 [testenv] -deps = - -rrequirements/test.txt - django42: Django>=4.2,<5.0 - django52: Django>=5.2,<5.3 +runner = uv-venv-lock-runner +dependency_groups = test +commands = + pytest +[testenv:django42] +runner = uv-venv-lock-runner +dependency_groups = django42 commands = pytest [testenv:js] +runner = uv-venv-lock-runner allowlist_externals = make -deps = - -rrequirements/test.txt +dependency_groups = django42 commands = make install-js make static make test-js +[testenv:docs] +runner = uv-venv-lock-runner +dependency_groups = doc +allowlist_externals = make +commands = + doc8 docs/ + python -m build --wheel + twine check dist/* + make -C docs clean + make -C docs html + [testenv:quality] +runner = uv-venv-lock-runner setenv = - PYTHONPATH = . + PYTHONPATH = src allowlist_externals = make npm -deps = - -rrequirements/test.txt - -rrequirements/quality.txt - -rrequirements/test-acceptance.txt +dependency_groups = quality commands = npm install jshint --no-save make quality diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000000..7b1f5afd24 --- /dev/null +++ b/uv.lock @@ -0,0 +1,3029 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version < '3.13'", +] +conflicts = [[ + { package = "ora2", group = "django42" }, + { package = "ora2", group = "test" }, +], [ + { package = "ora2", group = "django42" }, + { package = "ora2", group = "doc" }, +], [ + { package = "ora2", group = "django42" }, + { package = "ora2", group = "quality" }, +], [ + { package = "ora2", group = "dev" }, + { package = "ora2", group = "django42" }, +]] + +[manifest] +constraints = [ + { name = "ddt", specifier = "==1.0.0" }, + { name = "django", specifier = "<6.0" }, + { name = "elasticsearch", specifier = "<7.14.0" }, + { name = "freezegun", specifier = "<=0.3.14" }, + { name = "moto", specifier = "<5.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 = "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.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, +] + +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + +[[package]] +name = "asgiref" +version = "3.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/26/3b59f2bdae5f640389becb1f673cded775287f5fc4f816309d9ca9a3f93d/asgiref-3.12.1.tar.gz", hash = "sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340", size = 42378, upload-time = "2026-07-14T09:56:18.087Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/1b/54f4ad77cd8a584fa70746c47df988e002cf1ee1eba43364d46f87803647/asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094", size = 25478, upload-time = "2026-07-14T09:56:16.926Z" }, +] + +[[package]] +name = "astroid" +version = "4.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/63/0adf26577da5eff6eb7a177876c1cfa213856be9926a000f65c4add9692b/astroid-4.0.4.tar.gz", hash = "sha256:986fed8bcf79fb82c78b18a53352a0b287a73817d6dbcfba3162da36667c49a0", size = 406358, upload-time = "2026-02-07T23:35:07.509Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/cf/1c5f42b110e57bc5502eb80dbc3b03d256926062519224835ef08134f1f9/astroid-4.0.4-py3-none-any.whl", hash = "sha256:52f39653876c7dec3e3afd4c2696920e05c83832b9737afc21928f2d2eb7a753", size = 276445, upload-time = "2026-02-07T23:35:05.344Z" }, +] + +[[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 = "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 = "binaryornot" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/4755b85101f37707c71526a301c1203e413c715a0016ecb592de3d2dcfff/binaryornot-0.6.0.tar.gz", hash = "sha256:cc8d57cfa71d74ff8c28a7726734d53a851d02fad9e3a5581fb807f989f702f0", size = 478718, upload-time = "2026-03-08T16:26:28.804Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/0c/31cfaa6b56fe23488ecb993bc9fc526c0d84d89607decdf2a10776426c2e/binaryornot-0.6.0-py3-none-any.whl", hash = "sha256:900adfd5e1b821255ba7e63139b0396b14c88b9286e74e03b6f51e0200331337", size = 14185, upload-time = "2026-03-08T16:26:27.466Z" }, +] + +[[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 = "boto3" +version = "1.43.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/2c/e7f668f2d022b5c7dca881c7a9530aa7200445566c06f0f23daf4bf78084/boto3-1.43.50.tar.gz", hash = "sha256:a6865b9cd1d15511f6aad89cef964105acecff2160a3e29ae53c10d9821416af", size = 112731, upload-time = "2026-07-16T19:33:15.719Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/db/603de8ccaac4ffa7ddc2cea6cdeb9f8f7d997d892af73edd5191e99d0ead/boto3-1.43.50-py3-none-any.whl", hash = "sha256:779eb5cfa8bd1d615f36051465f8182860219eef78b4ab8ca2c666bb56702325", size = 140030, upload-time = "2026-07-16T19:33:14.233Z" }, +] + +[[package]] +name = "botocore" +version = "1.43.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/3b/0a640eb595fb86e853c06301982393e60cbaba634cb0fc70bbdc119e1140/botocore-1.43.50.tar.gz", hash = "sha256:7b07c423c44b1ab3815af103f11fa28ea317e28dda1335718a02ecde371a25e9", size = 15709326, upload-time = "2026-07-16T19:33:05.282Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/32/405d01c0bcd9deab0d3744894a328ce12899824d284480f7b3f4c6cdfe40/botocore-1.43.50-py3-none-any.whl", hash = "sha256:4a57a1e0dd4a8be855c29183fc0e029c18e9ec84cd4ac172869f3e800f972528", size = 15394880, upload-time = "2026-07-16T19:33:02.097Z" }, +] + +[[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-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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 = "charset-normalizer" +version = "3.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0", size = 319300, upload-time = "2026-07-07T14:33:15.666Z" }, + { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" }, + { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" }, + { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" }, + { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" }, + { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642", size = 151185, upload-time = "2026-07-07T14:33:30.781Z" }, + { url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0", size = 162557, upload-time = "2026-07-07T14:33:32.176Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2", size = 152665, upload-time = "2026-07-07T14:33:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" }, + { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" }, + { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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" }, + { 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 = "cookiecutter" +version = "2.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "binaryornot" }, + { name = "click" }, + { name = "jinja2" }, + { name = "python-slugify" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/92/03/f4c96d8fd4f5e8af0210bf896eb63927f35d3014a8e8f3bf9d2c43ad3332/cookiecutter-2.7.1.tar.gz", hash = "sha256:ca7bb7bc8c6ff441fbf53921b5537668000e38d56e28d763a1b73975c66c6138", size = 142854, upload-time = "2026-03-04T04:06:02.786Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/a9/8c855c14b401dc67d20739345295af5afce5e930a69600ab20f6cfa50b5c/cookiecutter-2.7.1-py3-none-any.whl", hash = "sha256:cee50defc1eaa7ad0071ee9b9893b746c1b3201b66bf4d3686d0f127c8ed6cf9", size = 41317, upload-time = "2026-03-04T04:06:01.221Z" }, +] + +[[package]] +name = "coverage" +version = "7.15.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/d0/55fe630f4cf94e3fcba868240fad8c8cdd1f764e2a932f8926347e6ec4cd/coverage-7.15.2.tar.gz", hash = "sha256:3df60dc267f0a2ca23cb7a9ab1109c62b9335ffbf519fcfe167157c28c09b81d", size = 927741, upload-time = "2026-07-15T18:56:19.558Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/50/eb5bf42e531611a9f8d272556b1ed4de503f84a91413584094487cf69f8f/coverage-7.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1adac78e5abc7c5438f7a209c9ca69d06542f0bf481d728b6989ea80b813fdf9", size = 221587, upload-time = "2026-07-15T18:54:18.439Z" }, + { url = "https://files.pythonhosted.org/packages/06/d1/da99af464c335d4e023a6efcd7ec30f63b88a43c93745154ab74ffb31cea/coverage-7.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b868acc62aa5de3be7a9d05c2333bf8359ca987e43f9cb30ff8fbda6a024ab73", size = 221943, upload-time = "2026-07-15T18:54:20.062Z" }, + { url = "https://files.pythonhosted.org/packages/5b/8a/13c42723d61ca447eafa18732e8141dd6a63f2732e1c7e1502c182dd88d7/coverage-7.15.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6f6966fc30e6f06ca8f98fb0ce51eda6b111b3ee8d066a8b1ec9e77fa06ab55d", size = 253450, upload-time = "2026-07-15T18:54:21.765Z" }, + { url = "https://files.pythonhosted.org/packages/d7/29/99021303f98fbdcb63504b4d07bea4cc025b9b2dd907c4f07c85d50a0dab/coverage-7.15.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:68af907f595ab01a78f794932ff3bdf929c316d3000810d38dbc247129e26f8b", size = 256187, upload-time = "2026-07-15T18:54:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a8/fd503715ed6ca9c5d742923aa5209257340b367a867b2ced0c7d4ba8a0b9/coverage-7.15.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afa29e2eff3d5729267e2cb2fd4ce9d61c952932fb2694e34ccb5d9540c6a296", size = 257301, upload-time = "2026-07-15T18:54:25.183Z" }, + { url = "https://files.pythonhosted.org/packages/da/40/3f4b8fb409810036ebc2857d36adc0498c6e957b5df0290c5036b2e143f1/coverage-7.15.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bbf44513ceb1589e31948e20eafbde9deaface90e1a1afa5f5f77b4423d17ce6", size = 259562, upload-time = "2026-07-15T18:54:27.204Z" }, + { url = "https://files.pythonhosted.org/packages/0b/8a/9bdffbef47db77cce3d6b02a28f7e919b19f0106c4b080c2c2246040f885/coverage-7.15.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9deddf09eecb717b7f980414b43d90a5b22ff3967d2949ab29cb0aa83d9e9098", size = 253841, upload-time = "2026-07-15T18:54:29.134Z" }, + { url = "https://files.pythonhosted.org/packages/1b/1e/9031efde019d31a06646261fce6dfc5c3c74e951e27a71e5c9a424563178/coverage-7.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae901f7e55ba405c84ee1cab3d3e962e4e871e4a2bcb9c90911adbd69b42ac5a", size = 255221, upload-time = "2026-07-15T18:54:31.142Z" }, + { url = "https://files.pythonhosted.org/packages/56/db/787acde872389fc84a9ef9d8cd1ccc658e391ab4cb5b28092a714426a394/coverage-7.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a0f47002c6eeb7c280228467a4cb0cc15ca2103a8421b986b2d3ec04a0f9bd8b", size = 253366, upload-time = "2026-07-15T18:54:32.886Z" }, + { url = "https://files.pythonhosted.org/packages/2f/9b/6f57bc4b93c842eef1695f8cdaf2318e35e7ba54f5ba80d84be213ab7858/coverage-7.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1cd7a5beb7af3e864a13b1f0fb26efd3695da43ef0daf71e586adfffaf34d5b2", size = 257434, upload-time = "2026-07-15T18:54:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/88/26/b3186a21b2acc83e451118978905c81c7072c3333707804db09a78c096a2/coverage-7.15.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:97a5c5457a9fb1d6c4e06cfb5dc835871fbfb6a6a51addc9e925bdeff5ef7440", size = 252935, upload-time = "2026-07-15T18:54:36.548Z" }, + { url = "https://files.pythonhosted.org/packages/20/c2/c9f3376b2e717ea69ed7a6e9a5fcab968fb0b290db6cf4bd9a1fc7541b75/coverage-7.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0901cfe6c13bcd2302da4f83e884555d2a22bda6e4c476f09ef204ba20ca536e", size = 254807, upload-time = "2026-07-15T18:54:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e1/dfc15401f4a8aaeb486e1ba3e9e3c40522a6e38bd0ecf0b3f29cb8082957/coverage-7.15.2-cp312-cp312-win32.whl", hash = "sha256:b171bdd71cb7ff792bf32e376173b0ace7e7963e7e57c58dfc42063a6a7174cd", size = 223641, upload-time = "2026-07-15T18:54:40.103Z" }, + { url = "https://files.pythonhosted.org/packages/91/40/81b6d809d320cd366ec5bdf8176575e897dcb8efe7fb4b489ef9e93e4d13/coverage-7.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:582edc45c2040543fef83341be23c43024a3ab3ae0c2d8bc498a06282905ad40", size = 224172, upload-time = "2026-07-15T18:54:41.882Z" }, + { url = "https://files.pythonhosted.org/packages/ef/28/9f14ec438149f7de557f45518f09b4a7917b795cc37083aa7db482693f8c/coverage-7.15.2-cp312-cp312-win_arm64.whl", hash = "sha256:a638db90c61cd219aeee65e83a24fdaa57269a741ae0cf773309208ac862cee3", size = 223556, upload-time = "2026-07-15T18:54:43.674Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d5/f8c838e6b7282976f7c918884b792df7a0c42c5bba5d99c60ad2d221d56d/coverage-7.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1121caa19159a38b5463eaae4b1e1fde81e525b15ecc5e000cd5b1a108f743a8", size = 221606, upload-time = "2026-07-15T18:54:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/bf/37/97c926376364f66298cc44893b89cdf17b8bc406376497c4061ae4b8a8ff/coverage-7.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a300c6934e0989c327b9e8a1e110329da4641149f872bbe9f70168be66da76c1", size = 221982, upload-time = "2026-07-15T18:54:47.341Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/a36050a6e83c2135ee0776f452ca3948224befc6d7f26acecc082d0c106a/coverage-7.15.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2617f8799d268fabdeef42a7e89ac3a23e1deee9025427db2df970f99a89a578", size = 252972, upload-time = "2026-07-15T18:54:49.2Z" }, + { url = "https://files.pythonhosted.org/packages/31/d3/06b5f1daf95f0f15ab05bd75f26ba5f3c8b33d0bb72f3aaa3cf41d1bad3a/coverage-7.15.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7dc2950a2992cd676d35c20ae63522836deeb034f08874699d14068710af3dc1", size = 255569, upload-time = "2026-07-15T18:54:51.098Z" }, + { url = "https://files.pythonhosted.org/packages/81/1c/9afb3f8de2b8d36960391c48559a2e3ff96594b58099f115921549ea8d0d/coverage-7.15.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e36686f7a442185db2400b3df171aac520869faf9deb59df687d28659eda2a6", size = 256806, upload-time = "2026-07-15T18:54:53.145Z" }, + { url = "https://files.pythonhosted.org/packages/64/d8/b989f96061a5e32d82fddd1b1b9ff48a7c8f8ae7606f0e80fd9de54b1e33/coverage-7.15.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d29ca7bd67af6e12e74632d65f026eabc1364da5c254494cd914446a28a3ef7", size = 258936, upload-time = "2026-07-15T18:54:55.015Z" }, + { url = "https://files.pythonhosted.org/packages/b8/fa/f99771f5110457c7b511c1935ca49ddf288218eaa84322e028b9334146ae/coverage-7.15.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:db9c8438057e5b0f6a22a0af99c0c1d26b57fbbdbd1be5861ddb8f897fcc3a2d", size = 253178, upload-time = "2026-07-15T18:54:57.527Z" }, + { url = "https://files.pythonhosted.org/packages/f6/96/c098a6044d119c751ceede7be91035fa8310170ec24a6523aff72f0a5793/coverage-7.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:63022c4c8dec1d0342f05c3ede99842fe3d007689acc45e86f123a1746e4a026", size = 254934, upload-time = "2026-07-15T18:54:59.41Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a2/1457b3a7a50c8d77500103b97a046db863e2f59a1cf6d2f814595f349885/coverage-7.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6c0be82b4d4aa5b2704e08518e2252f3e3d110164bcca826816801052e48a7aa", size = 252898, upload-time = "2026-07-15T18:55:01.338Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0e/76958874c471ecfcdde0d2b2747bb2c61bdbf34a40636f4ce9db9923e643/coverage-7.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4510fb9cdf6bb02dfa6af0be4a534b8102d086e22e4a33f8836df663da3d660d", size = 257056, upload-time = "2026-07-15T18:55:03.243Z" }, + { url = "https://files.pythonhosted.org/packages/7c/7c/3d7c4e3bf58baa40327dc7edc2272b17cf02299366d52763db1b0ca1556a/coverage-7.15.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:42ec3d989421b174a2ab607c1539f24127ad362757b7f1c0c0d7a2993f7eb37b", size = 252718, upload-time = "2026-07-15T18:55:05.029Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/1cecffed9ce14fb25be9ba42d37b6bb61485c9a3ddd43cd3dde36b6087d8/coverage-7.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8f91bce78e32343af184c3b7fa28fcf5a9e2641f4b6623d392038f804939188", size = 254490, upload-time = "2026-07-15T18:55:06.889Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2c/42984561bc7f4c045dca67516a0c50ee5ef8d84352dbeb5559dc86c4823e/coverage-7.15.2-cp313-cp313-win32.whl", hash = "sha256:434e68d531858205895eb0d74b73d20b84260de426387d53c422a5acda2cf050", size = 223647, upload-time = "2026-07-15T18:55:08.941Z" }, + { url = "https://files.pythonhosted.org/packages/41/9f/39c7c9245efc583beddf89a87683574e663ed93637f3afb6cd7b88405676/coverage-7.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:26c3b04a6377fd7c09800921fa934e3a17c0020439cd59df73e73ae1d4b6a78c", size = 224190, upload-time = "2026-07-15T18:55:10.789Z" }, + { url = "https://files.pythonhosted.org/packages/c7/de/3a2883cf8a213659280ef4b403059e17a9acaeb7fc7fd4105e1226ff2e6d/coverage-7.15.2-cp313-cp313-win_arm64.whl", hash = "sha256:3ed010aa1b69cda8e827aabfca9866216c980e2dca82ab9a78c5f83689964c8b", size = 223583, upload-time = "2026-07-15T18:55:12.678Z" }, + { url = "https://files.pythonhosted.org/packages/81/5f/aed265fd7a3551a394f36dfe41868aee709b7f95db4052205b4ad1563ac3/coverage-7.15.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:40f633c5c5fc783732f6312280122e859538fa24461235597c13d803ea9a108a", size = 221650, upload-time = "2026-07-15T18:55:14.527Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2c/222ba12a545189017120f8eddfc1a0bd4616b47d5d4a8d99421edb2fe4c6/coverage-7.15.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:075560438765b7a2ef43bf7aa7758661b53d889df47f062a31bda6c1ade553a2", size = 221988, upload-time = "2026-07-15T18:55:16.674Z" }, + { url = "https://files.pythonhosted.org/packages/aa/38/304b5877ab46e6c290b4292cfcf3fe28245f0e5597cad7f6acc91fc7e0a4/coverage-7.15.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:25fd15dd40a0a2c51a500d664ca29053c09c3259d998407bf982b6e114696138", size = 253029, upload-time = "2026-07-15T18:55:18.856Z" }, + { url = "https://files.pythonhosted.org/packages/6c/58/821b533b8db9e44cf1d8a97bd525149ced40dde1d0093da02cb78e715244/coverage-7.15.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b9a6367e4aff723e8ee8190836836124284e8fcd4265e307c844010cfa074f3f", size = 255536, upload-time = "2026-07-15T18:55:21.027Z" }, + { url = "https://files.pythonhosted.org/packages/f1/f2/7aa06604c389d32ea7f0a6a988359a7eafc3cd3f8e7bc2e88cd2fdf0b877/coverage-7.15.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9854ca62c152874b2060772503535be2e8f53f70b8aaa7686b094888d872f984", size = 256881, upload-time = "2026-07-15T18:55:23.125Z" }, + { url = "https://files.pythonhosted.org/packages/a2/4f/1ef342339c7916d0096bc5888cc0f653882cc7bc8f897d5cb89143287c9b/coverage-7.15.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:913b6c56e110da40e035bbd168353bf7aaa2544a5eaccea5d98a4629aac156c7", size = 259196, upload-time = "2026-07-15T18:55:25.099Z" }, + { url = "https://files.pythonhosted.org/packages/fe/f4/7ed055d7a9c5ec13b161773a115a5ccc6b0081d568c31fad830806306cc7/coverage-7.15.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aaccad4129d735a8a4d526f26929894c9a4e8ef7034566f210b176749d6906e3", size = 253036, upload-time = "2026-07-15T18:55:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/14/79/ea82cca18c242a3a38b6c017da39726aa62dcb64aa635abf79b92009975c/coverage-7.15.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a164b50081fc7357331c4024ef4d17b78ba325f8380d05f5a69599a7e05257ee", size = 254887, upload-time = "2026-07-15T18:55:29.084Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ba/a136db3c0d9562b00e10b72540dbf3a33cd3bc5b95060c9308e247494623/coverage-7.15.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bfd341ccf78128e72c094bc70cc25b3ef309c33c7c2c66ba3ed4309549e02de1", size = 252852, upload-time = "2026-07-15T18:55:31.184Z" }, + { url = "https://files.pythonhosted.org/packages/17/17/ea334246b16b7d059953fad6fdefa11e33c68efbd3fe37b1098120a1fac2/coverage-7.15.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:1473b3ba8e7ee0f076117b1a72c23f579a2b9e2bb742f48a8d86ea27ca93f91a", size = 257128, upload-time = "2026-07-15T18:55:33.163Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c3/074fb66d46d607855f710876b117cbda562c5ab08363528e78820449f937/coverage-7.15.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:17c432b5f73ad52ef46fb06019f6fa7c66ce381961cf0f7dfd1d3a4bd3a98145", size = 252668, upload-time = "2026-07-15T18:55:35.063Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c1/f620850ada9b36435921c9a3a8057013422b1d964eb4bf37fe138724d192/coverage-7.15.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:77f0ef5011df53a4bd1b35211ab122287f8d9b8d7aa1c4553e5c2deb24b1d446", size = 254325, upload-time = "2026-07-15T18:55:37.125Z" }, + { url = "https://files.pythonhosted.org/packages/cc/31/a729ca3689404493af82ef8e6ff70bd88bdda8da89aeef6ca9b387aeb2b4/coverage-7.15.2-cp314-cp314-win32.whl", hash = "sha256:f653e5d7248c1191ec988a85c72edeab46c3ff44f90639a4ed4874ec0be90243", size = 223844, upload-time = "2026-07-15T18:55:39.078Z" }, + { url = "https://files.pythonhosted.org/packages/c6/83/5d809dc808fb1698c671f3e372259bb9158e64b7ea526fc6ab7de64de9fe/coverage-7.15.2-cp314-cp314-win_amd64.whl", hash = "sha256:9911f31aad8906abe337c271343485cf20df5e70df5d2f57f9f136e7b55f26bc", size = 224331, upload-time = "2026-07-15T18:55:41.346Z" }, + { url = "https://files.pythonhosted.org/packages/16/4e/35e488548e952795829e129995c4174df33bf432b591d1aa42c8d9e4e7ad/coverage-7.15.2-cp314-cp314-win_arm64.whl", hash = "sha256:e38def96ad59853824c97953fdcd2c320a84ba3ce99b417db78af8bb6c3db635", size = 223760, upload-time = "2026-07-15T18:55:43.518Z" }, + { url = "https://files.pythonhosted.org/packages/ed/49/dd2c86cd6374038f6e415fb5bfb86db5218553209c081384a020369dee79/coverage-7.15.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:835ec4e20b45f0a7f63ed78f94065aca00de033403df8377bfe8b9c6abc0a7be", size = 222384, upload-time = "2026-07-15T18:55:45.569Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/173ff17a1c0808e5a438f549f6f145d5ac7528f2791310b63523e3200ac7/coverage-7.15.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7466cc7ab6dc0db871d264bf99e8779f0917ee63d40730af0552f71535a6e072", size = 222647, upload-time = "2026-07-15T18:55:47.544Z" }, + { url = "https://files.pythonhosted.org/packages/84/f8/b8cba872162356fb44ac79c10309d987206a4461e32072fc29228dad7331/coverage-7.15.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e370c12133095ff18432de8c044962be85a5a96d90c6fcbce8e17e76236d2328", size = 264013, upload-time = "2026-07-15T18:55:49.768Z" }, + { url = "https://files.pythonhosted.org/packages/ee/67/a807a7586d0b8cae485308ddd55756f0806c92f8e0b411bacbf23c48edf3/coverage-7.15.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fe41909c9515c3bfdb5f02c4d1f857dba322d9a9a1178069b91eea77889df63a", size = 266135, upload-time = "2026-07-15T18:55:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/cd78771dc985f7e4ebdcc82b1a96d9a932af9e806f01f2f91a89f4c72e80/coverage-7.15.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aa28cfb6488e5453b5b762d65f73aa586380f6693a04d58078ce228a29b06c0", size = 268555, upload-time = "2026-07-15T18:55:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/18/3e/10134cf81275188c58568f324fc74aedff32c63ca4d5bbc513a91944a6f0/coverage-7.15.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcc0aae933921d03096f53b0b03eeb702129fd406dee59f08d2efacc68681fa5", size = 269674, upload-time = "2026-07-15T18:55:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/75/4a/771b77de446cba985dc414bbc5844bd21604da05dbc044286df8318a48a7/coverage-7.15.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7c63387e21ab21f512c69c9756a8c7dadd322c7275edb064064433c9a09c3743", size = 263101, upload-time = "2026-07-15T18:55:58.107Z" }, + { url = "https://files.pythonhosted.org/packages/5f/b5/70a7011da15f4071943361183aefa27847f3e3aec4fd335f1cb3d3a622b1/coverage-7.15.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e55510bc98ae943cece9e667a6c0fe94c6a92913720dea34243657a17993d0c", size = 266007, upload-time = "2026-07-15T18:56:00.468Z" }, + { url = "https://files.pythonhosted.org/packages/b4/0d/f9547e804ce7ad49646ffeffac26699510efbe6c0f751b66fdc960c4e825/coverage-7.15.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2ff08701be2d1556fc78b326c80a3e8042da09352ecb3819105f8e386c8a3071", size = 263611, upload-time = "2026-07-15T18:56:02.615Z" }, + { url = "https://files.pythonhosted.org/packages/ac/59/f576a396659c0efd351f5c1544f67c3560e89c7761cabf7f65e412beeda5/coverage-7.15.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:38c9518b7103826c403a461544e3c2e77151e8676d06eaed85911a97e962584a", size = 267344, upload-time = "2026-07-15T18:56:04.622Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5d/c2e4fce3579c0cb635024293f1a32bbe26df101b3e3a69f22243d1352b6c/coverage-7.15.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:dee88b1ed88587abd8c0269a1fc1f4cc77f7750d1dfde2869e2a123af420e67d", size = 262456, upload-time = "2026-07-15T18:56:06.641Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/956287d69436b66094bc4b57ac2da71e43bfd2a5524e958900b9f582fcf8/coverage-7.15.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2fbeeeecea279727f8ac16c8e1133ddfeee793e985c86ae343d6a5ce744eef8c", size = 264771, upload-time = "2026-07-15T18:56:08.795Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5a/6f979530c2734c575de77cf58f5f28d51f7123a94b5030fd9156fe5f363c/coverage-7.15.2-cp314-cp314t-win32.whl", hash = "sha256:cb0fddaa6884be6aae36ced9544b5e90f7d5f03845a2853bf47a14953a4e8688", size = 224151, upload-time = "2026-07-15T18:56:10.856Z" }, + { url = "https://files.pythonhosted.org/packages/54/7e/27f6b2a74d484742f4017553e710b01e396b23d809df3e95ca0bb9a2824b/coverage-7.15.2-cp314-cp314t-win_amd64.whl", hash = "sha256:77f091ea3a9cc611cd29f433565476bc1936c084ac8eee00ea0e7e70c27e4199", size = 224981, upload-time = "2026-07-15T18:56:12.928Z" }, + { url = "https://files.pythonhosted.org/packages/b1/48/284863423aa474240f6842bd00d680da22f4e6ea2e466618ef7c9c9e69a9/coverage-7.15.2-cp314-cp314t-win_arm64.whl", hash = "sha256:6fc448c377d6eeb00a47c673494bd9bae29280ca53987e1869e67ebedfe20658", size = 224294, upload-time = "2026-07-15T18:56:15.156Z" }, + { url = "https://files.pythonhosted.org/packages/ec/82/32e3bd191d498e64f6f911ad55d14006a0861e54869d2d32452326399e65/coverage-7.15.2-py3-none-any.whl", hash = "sha256:eb6bcae8d1a9d305351ecb108232441d11c5cfe9de840a04388ba5d2db8d735c", size = 213375, upload-time = "2026-07-15T18:56:17.305Z" }, +] + +[[package]] +name = "coveralls" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { name = "requests" }, + { name = "typer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/16/aa263cb5450de470234f5176ce42664c5e0535aab1a2094b739447065797/coveralls-4.1.0.tar.gz", hash = "sha256:dab364025ba80cbb95ce56c6fc62cd9172d7fd637060ea235dde99d9b46a4494", size = 12736, upload-time = "2026-02-28T15:16:47.591Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/f1/5a884d2e8e3e7e7d854d3032b777bd22aad1598161cf9aa77ac37d684908/coveralls-4.1.0-py3-none-any.whl", hash = "sha256:bfacfda2d443c24fc90d67035027cec15015fff2dbd036427e8bf8f4953dda2e", size = 14168, upload-time = "2026-02-28T15:16:46.181Z" }, +] + +[[package]] +name = "cryptography" +version = "49.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/1b/aa77c841989b7382822329eaf457333c8bed2be526a27cc0916189ba5f66/ddt-1.0.0.tar.gz", hash = "sha256:e24ecb7e2cf0bf43fa9d4255d3ae2bd0b7ce30b1d1b89ace7aa68aca1152f37a", size = 5535, upload-time = "2015-01-27T18:41:49.136Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/11/dd2e377e6f6811b49fb9a51dc04d89f4578251eca94ccd285ac1942046db/ddt-1.0.0-py2.py3-none-any.whl", hash = "sha256:da252baf3646ba0d6665795ae097ae7df03b05e00f7753239027bf651617447c", size = 4847, upload-time = "2015-01-27T18:41:51.44Z" }, +] + +[[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 = "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 = "4.2.30" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version < '3.13'", +] +dependencies = [ + { name = "asgiref", marker = "extra == 'group-4-ora2-django42'" }, + { name = "sqlparse", marker = "extra == 'group-4-ora2-django42'" }, + { name = "tzdata", marker = "(sys_platform == 'win32' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/b5/f1a53dc68da6429d6e0345bb848161e2381a2e9f02700148911e8582c2b3/django-4.2.30.tar.gz", hash = "sha256:4ebc7a434e3819db6cf4b399fb5b3f536310a30e8486f08b66886840be84b37c", size = 10468707, upload-time = "2026-04-07T14:05:45.57Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/b7/a7c96f239cf91313a6589233fed55111c7063b26683b226802732c455dbc/django-4.2.30-py3-none-any.whl", hash = "sha256:4d07aaf1c62f9984842b67c2874ebbf7056a17be253860299b93ae1881faad65", size = 7997231, upload-time = "2026-04-07T14:05:38.241Z" }, +] + +[[package]] +name = "django" +version = "5.2.16" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version < '3.13'", +] +dependencies = [ + { name = "asgiref", marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { name = "sqlparse", marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { name = "tzdata", marker = "(sys_platform == 'win32' and extra == 'group-4-ora2-dev') or (sys_platform == 'win32' and extra != 'group-4-ora2-django42') or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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-crum" +version = "0.7.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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-model-utils" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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-simple-history" +version = "3.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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 = "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 = "docutils" +version = "0.22.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, +] + +[[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-release-util" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { name = "pyyaml" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/99/43e955e01b4d2dc49a0e06f5d43d1cfe7b245451ae1d0895f24e2da99fc3/edx_django_release_util-1.5.0.tar.gz", hash = "sha256:7273b2fcae0a1ee004afc71dd78fc7e41c882503574ab419e18f156049233219", size = 34007, upload-time = "2025-04-23T15:53:07.42Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/06/d43925fd19a18df6d84b28e222d2455601882fbc2bb36bb9e3edb3249a5b/edx_django_release_util-1.5.0-py2.py3-none-any.whl", hash = "sha256:8d7cc6d11e7f4b0aee42edd21ade6ebf330f85e01fd702f20a543ecb185ecc15", size = 40435, upload-time = "2025-04-23T15:53:06.487Z" }, +] + +[[package]] +name = "edx-django-utils" +version = "8.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { 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-i18n-tools" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { name = "lxml", extra = ["html-clean"] }, + { name = "path" }, + { name = "polib" }, + { name = "pyyaml" }, +] +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.1.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/ee/f0/834dcbb9d847d5654c1fc22dad18813eef66046d521e70d3d21be5a8647f/edx_lint-6.1.0.tar.gz", hash = "sha256:f879f55ed0a94222dee69a4361833f7de6b91576256881eeb35afbed2a85dfa2", size = 50843, upload-time = "2026-04-27T14:05:06.491Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/3c/dd55e7200bab2b60d993f76cf540b4098e02ce9d300367b395d936d48152/edx_lint-6.1.0-py3-none-any.whl", hash = "sha256:937eeee9c440bf4fbcbdee8553ee11d11a6c675e0834fe43f27174457de7c84a", size = 58548, upload-time = "2026-04-27T14:05:05.167Z" }, +] + +[[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-submissions" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { name = "django-model-utils" }, + { name = "djangorestframework" }, + { name = "edx-django-release-util" }, + { name = "jsonfield" }, + { name = "pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/d7/8c6ba2f669e7698a4cbd3f7c5f3c36f0c6906fcbc33e961c5d99089c3917/edx_submissions-4.0.0.tar.gz", hash = "sha256:138ca6063be6e1abd4dec1d1d217a6a846d4bd5a2e1bc8860c63fccbe8174f9d", size = 56182, upload-time = "2026-04-07T16:12:15.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/a5/ac9b1282933e60a0d76835495bb69900626990a3d5fc41b47a76b2ecfd29/edx_submissions-4.0.0-py3-none-any.whl", hash = "sha256:588491b12a94782d0f470e345a8ea591479519d4f98e1bf11783acd12985660e", size = 62941, upload-time = "2026-04-07T16:12:14.398Z" }, +] + +[[package]] +name = "edx-toggles" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "code-annotations" }, + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { 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.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32' or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/e1/adf05724d5838fa9fe2ada64bf390bbf37b77e3714189ae9f17a2c6d0470/faker-40.31.0.tar.gz", hash = "sha256:af163a937aec99dca5abaeb94dd5008c51c26c6e9af1a26c8db4b3c4e7ca4403", size = 2024136, upload-time = "2026-07-14T15:33:32.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f5/e427b19d79e241a51ce6fcd69a47e7a9ca791a8bc3da00d91d5be05e1456/faker-40.31.0-py3-none-any.whl", hash = "sha256:bedc97c292a48a6a1bbe471a9076d7395a196421ede1cedde99d5719f6b91027", size = 2061930, upload-time = "2026-07-14T15:33:29.004Z" }, +] + +[[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.30.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/f7/2165ef325da22d854b8f81ca4799395f2eb6afa55cdb52c7710f028b5336/filelock-3.30.2.tar.gz", hash = "sha256:1ea7c857465c897a4a6e64c1aace28ff6b83f5bc66c1c06ea148efa65bc2ec5d", size = 176823, upload-time = "2026-07-16T19:50:42.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/df/05118016cad66cd0d7c9417b2d4fc245be35decc4c36810f3c8dbf729d88/filelock-3.30.2-py3-none-any.whl", hash = "sha256:a64b58f75048ec39589983e97f5117163f822261dcb6ba843e098f05aac9663f", size = 94092, upload-time = "2026-07-16T19:50:41.189Z" }, +] + +[[package]] +name = "freezegun" +version = "0.3.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/0f/d0d963902e3d5d9172fa187599fc67cdb3daf5a0af66398c2c4807dca0a0/freezegun-0.3.14.tar.gz", hash = "sha256:6262de2f4bab671f7189bb8a0b9d8751da69a53f0b9813fb8f412681662d872a", size = 25327, upload-time = "2020-01-23T00:10:49.564Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/16/7d65dd4188b3a22c3c51cf7382a3973fdba58543c5d69c2ff7d2178dc588/freezegun-0.3.14-py2.py3-none-any.whl", hash = "sha256:10336fc80a235847c64033f9727f3847f37db4bd549be1d9f3b5ae0279256c69", size = 14477, upload-time = "2020-01-23T00:10:47.992Z" }, +] + +[[package]] +name = "fs" +version = "2.4.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appdirs" }, + { name = "setuptools" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/a9/af5bfd5a92592c16cdae5c04f68187a309be8a146b528eac3c6e30edbad2/fs-2.4.16.tar.gz", hash = "sha256:ae97c7d51213f4b70b6a958292530289090de3a7e15841e108fbe144f069d313", size = 187441, upload-time = "2022-05-02T09:25:54.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/5c/a3d95dc1ec6cdeb032d789b552ecc76effa3557ea9186e1566df6aac18df/fs-2.4.16-py2.py3-none-any.whl", hash = "sha256:660064febbccda264ae0b6bace80a8d1be9e089e0a5eb2427b7d517f9a91545c", size = 135261, upload-time = "2022-05-02T09:25:52.363Z" }, +] + +[[package]] +name = "fs-s3fs" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boto3" }, + { name = "fs" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/f1/b641963f8694cdf7c3daed0276fef361c2b51717bf5f3e8a89b63c8ba237/fs-s3fs-1.1.1.tar.gz", hash = "sha256:b57f8c7664460ff7b451b4b44ca2ea9623a374d74e1284c2d5e6df499dc7976c", size = 10353, upload-time = "2019-08-14T10:59:30.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/71/9b36a6dbd28386e2028e4ab9aac9c30874fc9c74d6b8fa0c8c2806548311/fs_s3fs-1.1.1-py2.py3-none-any.whl", hash = "sha256:9ba160eaa93390cc5992a857675666cb2fbb3721b872474dfdc659a715c39280", size = 9675, upload-time = "2019-08-14T10:59:32.547Z" }, +] + +[[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 = "html5lib" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/b6/b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2/html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f", size = 272215, upload-time = "2020-06-22T23:32:38.834Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173, upload-time = "2020-06-22T23:32:36.781Z" }, +] + +[[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 = "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 = "isort" +version = "8.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/7c/ec4ab396d31b3b395e2e999c8f46dec78c5e29209fac49d1f4dace04041d/isort-8.0.1.tar.gz", hash = "sha256:171ac4ff559cdc060bcfff550bc8404a486fee0caab245679c2abe7cb253c78d", size = 769592, upload-time = "2026-02-28T10:08:20.685Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/95/c7c34aa53c16353c56d0b802fba48d5f5caa2cdee7958acbcb795c830416/isort-8.0.1-py3-none-any.whl", hash = "sha256:28b89bc70f751b559aeca209e6120393d43fbe2490de0559662be7a9787e3d75", size = 89733, upload-time = "2026-02-28T10:08:19.466Z" }, +] + +[[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 = "jmespath" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/59/322338183ecda247fb5d1763a6cbe46eff7222eaeebafd9fa65d4bf5cb11/jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d", size = 27377, upload-time = "2026-01-22T16:35:26.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419, upload-time = "2026-01-22T16:35:24.919Z" }, +] + +[[package]] +name = "jsonfield" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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 = "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 = "lazy" +version = "2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/4a/e1204ed0cdf2feb50768e638fda3e97363f362c9a10123c585d5056af556/lazy-2.0.tar.gz", hash = "sha256:f92ec0d32dd6bd115ddec4e3323473ebc0b682ad58c6aca78ebfd9e6d1aa5777", size = 10602, upload-time = "2026-07-04T15:50:01.984Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/82/11dc927238558638dcabc59b37c398ca3e1c0db935e2539d7e710e515aa0/lazy-2.0-py3-none-any.whl", hash = "sha256:6bf06f6a71dbe6148f3948c6388b264772493972ad22fb958d24bb52e7e7ec9b", size = 5274, upload-time = "2026-07-04T15:50:00.8Z" }, +] + +[[package]] +name = "legacy-cgi" +version = "2.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/9c/91c7d2c5ebbdf0a1a510bfa0ddeaa2fbb5b78677df5ac0a0aa51cf7125b0/legacy_cgi-2.6.4.tar.gz", hash = "sha256:abb9dfc7835772f7c9317977c63253fd22a7484b5c9bbcdca60a29dcce97c577", size = 24603, upload-time = "2025-10-27T05:20:05.395Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/7e/e7394eeb49a41cc514b3eb49020223666cbf40d86f5721c2f07871e6d84a/legacy_cgi-2.6.4-py3-none-any.whl", hash = "sha256:7e235ce58bf1e25d1fc9b2d299015e4e2cd37305eccafec1e6bac3fc04b878cd", size = 20035, upload-time = "2025-10-27T05:20:04.289Z" }, +] + +[[package]] +name = "lxml" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/6e/c4add832b6fc1e887125b96f880d7b9b70aae5248718e046b1704bcac4b9/lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7", size = 8570821, upload-time = "2026-05-18T19:17:42.068Z" }, + { url = "https://files.pythonhosted.org/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1", size = 4624252, upload-time = "2026-05-18T19:17:47.897Z" }, + { url = "https://files.pythonhosted.org/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746, upload-time = "2026-05-18T19:18:29.637Z" }, + { url = "https://files.pythonhosted.org/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723, upload-time = "2026-05-18T19:18:34.168Z" }, + { url = "https://files.pythonhosted.org/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557, upload-time = "2026-05-18T19:18:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036, upload-time = "2026-05-18T19:18:44.858Z" }, + { url = "https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367, upload-time = "2026-05-18T19:18:49.217Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/8555d40948b09ce86f1bd0c68a7ac31d07b1929f92cc1b074006c97ef2d2/lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740", size = 5350171, upload-time = "2026-05-18T19:18:52.779Z" }, + { url = "https://files.pythonhosted.org/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874, upload-time = "2026-05-18T19:18:55.139Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492, upload-time = "2026-05-18T19:19:01.28Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232, upload-time = "2026-05-18T19:18:12.67Z" }, + { url = "https://files.pythonhosted.org/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023, upload-time = "2026-05-18T19:18:15.928Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773, upload-time = "2026-05-18T19:18:23.223Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088, upload-time = "2026-05-18T19:18:31.433Z" }, + { url = "https://files.pythonhosted.org/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995, upload-time = "2026-05-18T19:18:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/69/8b/6772e1a4b513fc50a8d931f19edde0e13ae6918510a1e13ff67864f3e5ed/lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a", size = 3596382, upload-time = "2026-05-18T19:17:18.37Z" }, + { url = "https://files.pythonhosted.org/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77", size = 3997255, upload-time = "2026-05-18T19:17:56.781Z" }, + { url = "https://files.pythonhosted.org/packages/90/a9/7a54b6834088d9ae528a7b780584ba6a39a9457b0ac330479f20ffbc9449/lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f", size = 3659610, upload-time = "2026-05-19T19:22:50.843Z" }, + { url = "https://files.pythonhosted.org/packages/a5/eb/7e6f37c5584ccbb2ff267f56fd0339016938c1c8684cfefab9b33ffc2f36/lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736", size = 8559780, upload-time = "2026-05-18T19:17:57.661Z" }, + { url = "https://files.pythonhosted.org/packages/a1/36/587c2521cf23a2cd6c9c22108aa7528f683a1f195ed7ccd23a4b1786ad36/lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9", size = 4618006, upload-time = "2026-05-18T19:18:04.452Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ca/ab7bfe2bf4c972af5e7878262845ead3a24a929a9b04bc11c7c1ece6c82a/lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354", size = 4924139, upload-time = "2026-05-18T19:19:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6b/55/a0c72851dfee5ecc689f949723a73dea457758912542cb955b108eaf0d8f/lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca", size = 5082329, upload-time = "2026-05-18T19:19:09.728Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b6/0608f7d61a3b96cc67e5648a3d906e31a5082093e10e7be65b3886289938/lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099", size = 4993564, upload-time = "2026-05-18T19:19:13.608Z" }, + { url = "https://files.pythonhosted.org/packages/4c/66/ae227524b066d29d55bf0b453d93d2d793c40218657d643dcbbca13b8faf/lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6", size = 5613467, upload-time = "2026-05-18T19:19:16.228Z" }, + { url = "https://files.pythonhosted.org/packages/a6/76/dbe4a00b50385e40194231dcfe5a12c059de7cf90e89c83407d2b085b719/lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085", size = 5228304, upload-time = "2026-05-18T19:19:19.354Z" }, + { url = "https://files.pythonhosted.org/packages/1c/01/00b1b8442ed2041793336868ba0b9ea4b13d7da7c085c6404c207a63bf79/lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e", size = 5341607, upload-time = "2026-05-18T19:19:22.297Z" }, + { url = "https://files.pythonhosted.org/packages/63/36/1ad29931e9a4638bb707869f01d423a6c815f82152138d1a40dfcfde2b95/lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f", size = 4700168, upload-time = "2026-05-18T19:19:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d1/a9536cecf9be18a0dc72d32bead283a2332d1ffebd2dd3ac70ce444686e5/lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c", size = 5232487, upload-time = "2026-05-18T19:19:28.603Z" }, + { url = "https://files.pythonhosted.org/packages/0e/77/b4fb1e03bf5d130e879214d3100092e386418807fb74dd0adc4b0a48f351/lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b", size = 5044231, upload-time = "2026-05-18T19:18:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/26/4c/d00daeeb0a5530c4028a9232aa1b93db3ef4ed2158c116ea73c79a9765b3/lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2", size = 4769450, upload-time = "2026-05-18T19:18:48.013Z" }, + { url = "https://files.pythonhosted.org/packages/ed/6a/715a3a8d156ce42f29cf014706f5410c2ff3b02267774110fc23266409fe/lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5", size = 5635874, upload-time = "2026-05-18T19:18:51.914Z" }, + { url = "https://files.pythonhosted.org/packages/45/37/0544bc21dde2a88f3a17b504e6fc79c0e01d25a33c2f6079724e9e72b9c7/lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785", size = 5223987, upload-time = "2026-05-18T19:18:59.715Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f8/f6a5e8185bcb28c2befae3d31f8e3df3b811cb0f47746517a81279fcafe1/lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947", size = 5250276, upload-time = "2026-05-18T19:19:03.834Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f2/1a2b9f1b7a49d45495369be7ef9ad05b262930f2eab3e3145706fca8083f/lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca", size = 3596903, upload-time = "2026-05-18T19:17:29.863Z" }, + { url = "https://files.pythonhosted.org/packages/e6/99/f4ffb024f238eec2131aaa09f3278fb6129cf892741bf68e1fc1afb8c100/lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660", size = 3995869, upload-time = "2026-05-18T19:18:02.596Z" }, + { url = "https://files.pythonhosted.org/packages/d1/53/70eb8c5c6037f27448f1e3c54ebede9545a801ae63f0a7254afca4fe8e45/lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc", size = 3658490, upload-time = "2026-05-19T19:22:53.846Z" }, + { url = "https://files.pythonhosted.org/packages/13/e2/2e325795566de01d0d7c3bb57d3c370616b2d07b01214e84eec5d3b10963/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0", size = 8577146, upload-time = "2026-05-18T19:18:17.765Z" }, + { url = "https://files.pythonhosted.org/packages/93/cf/5630b5e4be7d2e6bee8efe83865c925221103cf0221303b104ce134b01e2/lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840", size = 4623866, upload-time = "2026-05-18T19:18:30.669Z" }, + { url = "https://files.pythonhosted.org/packages/d2/51/3904907c063451cf8d4a5c9fe0cad95fa1f4ec57f4e3884fa0731bd7a305/lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14", size = 4950022, upload-time = "2026-05-18T19:19:31.958Z" }, + { url = "https://files.pythonhosted.org/packages/94/cd/9c7611a51c37a2830928405817cc5d56a97f64fab83cc3f628748b135749/lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909", size = 5086695, upload-time = "2026-05-18T19:19:34.764Z" }, + { url = "https://files.pythonhosted.org/packages/da/d6/24e3b5906abb0b674ff2ae195bc3ce59708df2bcd17cf17703b2d7dd643a/lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00", size = 5031642, upload-time = "2026-05-18T19:19:37.771Z" }, + { url = "https://files.pythonhosted.org/packages/2d/db/6ec54f99019838bff54785c51da07f189eb4676861c5f2730962b0d8d665/lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955", size = 5647338, upload-time = "2026-05-18T19:19:40.553Z" }, + { url = "https://files.pythonhosted.org/packages/42/3d/ef4dcfffd22d27a61805d8ed9f7fb888495bc6aa88648fa07c1eaa5586b6/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13", size = 5239528, upload-time = "2026-05-18T19:19:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/62/bb/37fb3f0dff146bdcfa78eec47879273820b2a0bf350ec236ce14bd0b1c26/lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7", size = 5350730, upload-time = "2026-05-18T19:19:46.307Z" }, + { url = "https://files.pythonhosted.org/packages/90/42/43253f168388df4fae1f38c01df36ddb9bee39e2048167b54cdcbae85ea3/lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245", size = 4697530, upload-time = "2026-05-18T19:19:49.889Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a8/c5a8504f81bbdfc8e7094c2c850cdb4ed6777fc4d5ddd9e5ab819f3b0d54/lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5", size = 5250670, upload-time = "2026-05-18T19:19:53.199Z" }, + { url = "https://files.pythonhosted.org/packages/77/b7/c7e76ab18744d75e21f320ebf9ff9d1ceae2b54dd431ea5a64caf26c9672/lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462", size = 5084485, upload-time = "2026-05-18T19:19:08.422Z" }, + { url = "https://files.pythonhosted.org/packages/31/31/b35c53f8ef7b7c31cacd23d3638652fff7bcd1deb6eedb709ab43b685908/lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465", size = 4737635, upload-time = "2026-05-18T19:19:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/d9/06/31f23c813a7fe8e0cb1b175e915b08c9bf4e86d225b210feadbdbe519667/lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a", size = 5670681, upload-time = "2026-05-18T19:19:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bc/ce619bccc89b1fd9ad8a8e1330ee3f3beff9f2ff95b712d7bbcdd6e22fc3/lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590", size = 5238229, upload-time = "2026-05-18T19:19:18.131Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5d/b329acbbedc0b619ebc2be6cf7ee9ed07e80892c88d4dfd612c33805789a/lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb", size = 5264191, upload-time = "2026-05-18T19:19:21.118Z" }, + { url = "https://files.pythonhosted.org/packages/d6/85/be36fb1425b30db3c3f9df75fe86343ebffb79e6320bd7f588e25bfeac39/lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603", size = 3657202, upload-time = "2026-05-18T19:17:39.509Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ce/3cf9a827342269f54d405a6202397de63f07c69cbd6ce7d183a3f0cba1e9/lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137", size = 4064497, upload-time = "2026-05-18T19:18:14.662Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3e/1a957bde8f0760039e627f94699f82caa782c9d838d86c3d28245ee67212/lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf", size = 3741991, upload-time = "2026-05-19T19:22:59.111Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/00ed55b3a2efa4658fb795c38d1090ec9b3e8a6c3683d4441fa517f09c3b/lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee", size = 8827545, upload-time = "2026-05-18T19:18:41.193Z" }, + { url = "https://files.pythonhosted.org/packages/c0/73/74573db19baa618d5f266f2407898b087ff6927115b00b71e5fc1b700847/lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c", size = 4735736, upload-time = "2026-05-18T19:18:46.761Z" }, + { url = "https://files.pythonhosted.org/packages/16/02/6f7061f4f95f51e545d48e87647c54791d204a4e881be4156e7a26ba5338/lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef", size = 4970291, upload-time = "2026-05-18T19:19:56.215Z" }, + { url = "https://files.pythonhosted.org/packages/b0/02/55fc057d8283427dea7d6edb102e7a840239c77a64a983d92f62a304c0e9/lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a", size = 5102822, upload-time = "2026-05-18T19:19:59.223Z" }, + { url = "https://files.pythonhosted.org/packages/e4/48/8e1cf78d89d66850121d9255a2a24414c98f775da93b90cf976956c24b14/lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c", size = 5027923, upload-time = "2026-05-18T19:20:01.549Z" }, + { url = "https://files.pythonhosted.org/packages/ed/00/0632a0647612c8af24d26997b3b961397daa9d5b2581444805933629a4cb/lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525", size = 5595843, upload-time = "2026-05-18T19:20:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/bc/86/ab008a7dc360711b66858d61c80a5979a70a09f2aa2b05d9698df80b803d/lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca", size = 5224515, upload-time = "2026-05-18T19:20:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/75/c6/2702ff375e728e34f56d9a45339a9cf7e4427e917f542225242d63a05afa/lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e", size = 5312511, upload-time = "2026-05-18T19:20:09.308Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/a5807c98f87a86f10ef9ffab35516df7c0f0c4b6d5d33e9f608ab9c04a31/lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038", size = 4639206, upload-time = "2026-05-18T19:20:11.704Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e1/8a0a2c35734812395f4da4eaf33748a7e5705bfb2a58b128da764339d5ec/lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e", size = 5232404, upload-time = "2026-05-18T19:20:14.064Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e2/0e6a4dd5ad84d01d99aa7bae7cfefd4a760a0e0f8176818241de17d9b6c0/lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072", size = 5083769, upload-time = "2026-05-18T19:19:23.758Z" }, + { url = "https://files.pythonhosted.org/packages/a0/7e/161f33d463f6ffc1c7679104b65086dea120080d49dde4d238f015aaee2f/lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52", size = 4758936, upload-time = "2026-05-18T19:19:27.256Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fb/2369825e3f6ca99305bf9f7b7085fda91c8b0922a89e54d900974aa3ef85/lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b", size = 5620296, upload-time = "2026-05-18T19:19:29.993Z" }, + { url = "https://files.pythonhosted.org/packages/30/90/d61e383146f74c5ab683947ea14dc7b82778838ab9b95ea73a23b60d0191/lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2", size = 5228598, upload-time = "2026-05-18T19:19:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/76/2d/2dafd8149e94b05bb070690efd5bb2680720681e03ff03fc57d2b70a1105/lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e", size = 5247845, upload-time = "2026-05-18T19:19:36.649Z" }, + { url = "https://files.pythonhosted.org/packages/ce/68/b30e913340c380ddac9580c6e6230991fc37240ec4f64704833e4f3e2769/lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1", size = 3897345, upload-time = "2026-05-18T19:17:33.562Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4e/9eb2af5335545f9fbcd7af57bcf87c6025d31eaa31b14ec184a6c8675328/lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e", size = 4393350, upload-time = "2026-05-18T19:18:10.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/2c/0f1e93c636720e8a3eb59af2bfda99d98b55891e1c53bc30c2e0e865f01b/lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c", size = 3817223, upload-time = "2026-05-19T19:22:56.823Z" }, +] + +[package.optional-dependencies] +html-clean = [ + { name = "lxml-html-clean" }, +] + +[[package]] +name = "lxml-html-clean" +version = "0.4.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/63/195dfdde380a84df309e3bccf4384b034b745dba43426886f7ae623b4fba/lxml_html_clean-0.4.5.tar.gz", hash = "sha256:e2a4c7d5beedd17cd7b484d848a0571e54baa239a4f9df5546e3acba7f990560", size = 24142, upload-time = "2026-05-20T12:17:53.574Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/bd/6e2b76a6c5dee10397db9c929f0c5066766ec1036046f0335b7ca7ca08b8/lxml_html_clean-0.4.5-py3-none-any.whl", hash = "sha256:c76fcadd1e5bfb9b8bafc2200d51e4e78eb0dad67f56881c21dfb6484c7e7746", size = 14573, upload-time = "2026-05-20T12:17:52.215Z" }, +] + +[[package]] +name = "mako" +version = "1.3.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/62/791b31e69ae182791ec67f04850f2f062716bbd205483d63a215f3e062d3/mako-1.3.12.tar.gz", hash = "sha256:9f778e93289bd410bb35daadeb4fc66d95a746f0b75777b942088b7fd7af550a", size = 400219, upload-time = "2026-04-28T19:01:08.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/b1/a0ec7a5a9db730a08daef1fdfb8090435b82465abbf758a596f0ea88727e/mako-1.3.12-py3-none-any.whl", hash = "sha256:8f61569480282dbf557145ce441e4ba888be453c30989f879f0d652e39f53ea9", size = 78521, upload-time = "2026-04-28T19:01:10.393Z" }, +] + +[[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 = "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 = "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 = "moto" +version = "4.2.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boto3" }, + { name = "botocore" }, + { name = "cryptography" }, + { name = "jinja2" }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "responses" }, + { name = "werkzeug" }, + { name = "xmltodict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b2/06671ae921e7c7ebf18a20a6218fb55e83c3784b026eaf3d5670f9315924/moto-4.2.14.tar.gz", hash = "sha256:8f9263ca70b646f091edcc93e97cda864a542e6d16ed04066b1370ed217bd190", size = 4933741, upload-time = "2024-01-27T12:34:45.795Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/0f/ef410e6660d381e04cb6f33065d03b3aefd3444d558fcdd41ef235a1802c/moto-4.2.14-py2.py3-none-any.whl", hash = "sha256:6d242dbbabe925bb385ddb6958449e5c827670b13b8e153ed63f91dbdb50372c", size = 3312702, upload-time = "2024-01-27T12:34:36.602Z" }, +] + +[[package]] +name = "openedx-events" +version = "11.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { 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.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { name = "edx-opaque-keys" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/3d/4afc98d1ee5327d75674b5165325b25902364bcf97eae0df2063b4af1c37/openedx_filters-3.8.0.tar.gz", hash = "sha256:3f8513a6165df43fe706d7b4eb0ad5e7db70c497d289de81367635f103e6f53e", size = 46122, upload-time = "2026-07-13T20:11:26.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/ef/c29863510fd5d6e7b9b12682bf906eb58aebbcaba3fd6551ac4b4dc6f46b/openedx_filters-3.8.0-py2.py3-none-any.whl", hash = "sha256:a8ae9ad74e6376efbbc7ea6ed4cc03e9924a92db5740d08ed57efb7a17b5a138", size = 43501, upload-time = "2026-07-13T20:11:25.805Z" }, +] + +[[package]] +name = "ora2" +source = { editable = "." } +dependencies = [ + { name = "bleach" }, + { name = "boto3" }, + { name = "defusedxml" }, + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { name = "django-model-utils" }, + { name = "django-simple-history" }, + { name = "djangorestframework" }, + { name = "edx-django-utils" }, + { name = "edx-i18n-tools" }, + { name = "edx-opaque-keys" }, + { name = "edx-submissions" }, + { name = "edx-toggles" }, + { name = "html5lib" }, + { name = "jsonfield" }, + { name = "lazy" }, + { name = "lxml" }, + { name = "openedx-events" }, + { name = "openedx-filters" }, + { name = "path-py" }, + { name = "python-dateutil" }, + { name = "python-swiftclient" }, + { name = "pytz" }, + { name = "voluptuous" }, + { name = "xblock" }, +] + +[package.dev-dependencies] +ci = [ + { name = "tox" }, + { name = "tox-uv" }, +] +dev = [ + { name = "celery" }, + { name = "coverage" }, + { name = "coveralls" }, + { name = "ddt" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" } }, + { name = "edx-lint" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pycodestyle" }, + { name = "pyinstrument" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "sphinx" }, + { name = "sphinx-autobuild" }, + { name = "sphinx-book-theme" }, + { name = "sphinx-copybutton" }, + { name = "sphinxcontrib-mermaid" }, + { name = "testfixtures" }, + { name = "tox" }, + { name = "tox-uv" }, + { name = "xblock-sdk" }, +] +django42 = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" } }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] +doc = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" } }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "sphinx" }, + { name = "sphinx-autobuild" }, + { name = "sphinx-book-theme" }, + { name = "sphinx-copybutton" }, + { name = "sphinxcontrib-mermaid" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] +quality = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" } }, + { name = "edx-lint" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pycodestyle" }, + { name = "pyinstrument" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] +test = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" } }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] +test-base = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] + +[package.metadata] +requires-dist = [ + { name = "bleach", specifier = ">=6.0.0" }, + { name = "boto3" }, + { name = "defusedxml" }, + { name = "django", specifier = ">=4.2" }, + { name = "django-model-utils" }, + { name = "django-simple-history" }, + { name = "djangorestframework" }, + { name = "edx-django-utils" }, + { name = "edx-i18n-tools" }, + { name = "edx-opaque-keys" }, + { name = "edx-submissions" }, + { name = "edx-toggles" }, + { name = "html5lib" }, + { name = "jsonfield" }, + { name = "lazy" }, + { name = "lxml" }, + { name = "openedx-events" }, + { name = "openedx-filters" }, + { name = "path-py" }, + { name = "python-dateutil" }, + { name = "python-swiftclient" }, + { name = "pytz" }, + { name = "voluptuous" }, + { name = "xblock" }, +] + +[package.metadata.requires-dev] +ci = [ + { name = "tox" }, + { name = "tox-uv", specifier = ">=1" }, +] +dev = [ + { name = "celery" }, + { name = "coverage" }, + { name = "coveralls" }, + { name = "ddt" }, + { name = "django", specifier = ">=5.2,<6.0" }, + { name = "edx-lint" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pycodestyle" }, + { name = "pyinstrument" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "sphinx" }, + { name = "sphinx-autobuild" }, + { name = "sphinx-book-theme" }, + { name = "sphinx-copybutton" }, + { name = "sphinxcontrib-mermaid" }, + { name = "testfixtures" }, + { name = "tox" }, + { name = "tox-uv", specifier = ">=1" }, + { name = "xblock-sdk" }, +] +django42 = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "django", specifier = ">=4.2,<5.0" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] +doc = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "django", specifier = ">=5.2,<6.0" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "sphinx" }, + { name = "sphinx-autobuild" }, + { name = "sphinx-book-theme" }, + { name = "sphinx-copybutton" }, + { name = "sphinxcontrib-mermaid" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] +quality = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "django", specifier = ">=5.2,<6.0" }, + { name = "edx-lint" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pycodestyle" }, + { name = "pyinstrument" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] +test = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "django", specifier = ">=5.2,<6.0" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] +test-base = [ + { name = "celery" }, + { name = "coverage" }, + { name = "ddt" }, + { name = "factory-boy" }, + { name = "freezegun" }, + { name = "mock" }, + { name = "more-itertools" }, + { name = "moto" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "testfixtures" }, + { name = "xblock-sdk" }, +] + +[[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 = "path" +version = "16.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/1c/3950c87aa25437af5f1663cc8627d44ff26f8c5117a5053c9fc3f641027c/path-16.16.0.tar.gz", hash = "sha256:a6a6d916c910dc17e0ddc883358756c5a33d1b6dbdf5d6de86554f399053af58", size = 50905, upload-time = "2024-07-27T09:37:45.926Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/0f/ddd60b4794cc8a8c086150e13ffbff438dbf306b2739918e65ddb706208f/path-16.16.0-py3-none-any.whl", hash = "sha256:d981989cf87598adc9f5b71ec5192d314a384836e81b4b1f34197138dc4ae659", size = 25531, upload-time = "2024-07-27T09:37:44.312Z" }, +] + +[[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 = "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 = "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 = "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 = "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 = "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 = "pyinstrument" +version = "5.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/32/7f/d3c4ef7c43f3294bd5a475dfa6f295a9fee5243c292d5c8122044fa83bcb/pyinstrument-5.1.2.tar.gz", hash = "sha256:af149d672da9493fa37334a1cc68f7b80c3e6cb9fd99b9e426c447db5c650bf0", size = 266889, upload-time = "2026-01-04T18:38:58.464Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/d9/8fa5571ddd21b2b7189bd8b0bb4e90be1659a54dda5af51c7f6bf2b5666f/pyinstrument-5.1.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2519865d4bf58936f2506c1c46a82d29a20f3239aa50c941df1ca9618c7da5f0", size = 131419, upload-time = "2026-01-04T18:37:46.843Z" }, + { url = "https://files.pythonhosted.org/packages/6f/50/0512adb83cadfeaa1a215dc9784defff5043c5aa052d15015e3d8013af75/pyinstrument-5.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:059442106b8b5de29ae5ac1bdc20d044fed4da534b8caba434b6ffb119037bf5", size = 124446, upload-time = "2026-01-04T18:37:48.572Z" }, + { url = "https://files.pythonhosted.org/packages/9b/78/c45f0b668fb3c8c0d32058a451a8e1d34737cd7586387982185e12df1977/pyinstrument-5.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd51f2d54fc39a4cfd73ba6be27cd0187123132ce3f445b639bff5e1b23d7e26", size = 149694, upload-time = "2026-01-04T18:37:49.876Z" }, + { url = "https://files.pythonhosted.org/packages/91/4d/2ca3ca9906ce6e05070f431c54d54ccbaf57a980cfa58032d35b0b0ac1f8/pyinstrument-5.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12af1e83795b6c640d657d339014dd1ff718b182dec736d7d1f1d8a97534eb53", size = 148461, upload-time = "2026-01-04T18:37:51.544Z" }, + { url = "https://files.pythonhosted.org/packages/18/d2/bfe84a4326172ef68655b65b49fd041eeb94c8e59ee47258589b8b79dd3b/pyinstrument-5.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2565513658e742c5eb691a779cb29d19d01bc9ee951d0eb76482e9f343c38c2e", size = 148560, upload-time = "2026-01-04T18:37:52.931Z" }, + { url = "https://files.pythonhosted.org/packages/d0/00/db7f5def351e869230b0165828c4edacbf3fdda8d66aff30dd73a62082c2/pyinstrument-5.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5afd0ba788a1d112da49fb77966918e01df1f9e7d62e72894d82f7acb0996c2d", size = 148178, upload-time = "2026-01-04T18:37:54.278Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bc/aea3329576e20b987d205027b8e6442ece845d681b9f9d8682d5404f81f3/pyinstrument-5.1.2-cp312-cp312-win32.whl", hash = "sha256:554077b031b278593cb2301f0057be771ea62a729878c69aaf29fcdfb7b71281", size = 125927, upload-time = "2026-01-04T18:37:55.615Z" }, + { url = "https://files.pythonhosted.org/packages/14/e2/d928434ec3a840478e95fd0d73b0dfc0b8060a07b06f4b45e9df30444e9a/pyinstrument-5.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:55a905384ba43efc924b8863aa6cfd276f029e4aa70c4a0e3b7389e27b191e45", size = 126675, upload-time = "2026-01-04T18:37:57.278Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8e/b9aea969eec67c129652000446384d550a0df45c297adc9fd74da2f8482c/pyinstrument-5.1.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7b8bab2334bf1d4c9e92d61db574300b914b594588a6b6dd67c45450152dfc29", size = 131418, upload-time = "2026-01-04T18:37:58.642Z" }, + { url = "https://files.pythonhosted.org/packages/8f/62/76418eb29b5591f3e5500369a6777ce928135c3aa6ccdb0c861a9c6ca93b/pyinstrument-5.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:13dcc138a61298ef4994b7aebff509d2c06db89dfd6e2021f0b9cd96aaa44ec3", size = 124448, upload-time = "2026-01-04T18:37:59.95Z" }, + { url = "https://files.pythonhosted.org/packages/07/73/874bccc04bcf6f4babc3de1a9568e209e7e40998563974f5030b0fb4d3e0/pyinstrument-5.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8abd4a7ffa2e7f9e00039a5e549e8eebc80d7ca8d43f0fb51a50ff2b117ce4a", size = 149853, upload-time = "2026-01-04T18:38:01.405Z" }, + { url = "https://files.pythonhosted.org/packages/cf/85/268446c4388d77ff4abdeaff202356e1527b3ff9576f5587443a24980bec/pyinstrument-5.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb3a05108edebc30f31e2c69c904576042f1158b2513ab80adc08f7848a7a8f0", size = 148641, upload-time = "2026-01-04T18:38:03.086Z" }, + { url = "https://files.pythonhosted.org/packages/fc/15/4f8dea3381483e68d00582a9b823a21a088acfe77a847a7991a1a8feed76/pyinstrument-5.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f70d588b53f3f35829d1d1ddfa05e07fcebf1434b3b1509d542ca317d8e9a2a5", size = 148674, upload-time = "2026-01-04T18:38:04.805Z" }, + { url = "https://files.pythonhosted.org/packages/fa/61/72c180454b6511d5b90166f8828e1bab3b45d0489952a1fe48c5c585233d/pyinstrument-5.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b007327e0d6a6a01d5064883dd27c19996f044ce7488d507826fee7884e6a32e", size = 148315, upload-time = "2026-01-04T18:38:06.114Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f0/4c27cebddf22a8840bd8b419366bb321ce41f921ca1893e309c932ab28bf/pyinstrument-5.1.2-cp313-cp313-win32.whl", hash = "sha256:9ba0e6b17a7e86c3dc02d208e4c25506e8f914d9964ae89449f1f37f0b70abc0", size = 125926, upload-time = "2026-01-04T18:38:07.507Z" }, + { url = "https://files.pythonhosted.org/packages/6c/20/6b1bee88ddef065b0df3a3ba4ba60ed8a9ca443d5cded7152a8a9750914f/pyinstrument-5.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:660d7fc486a839814db0b2f716bc13d8b99b9c780aaeb47f74a70a34adc02a7b", size = 126678, upload-time = "2026-01-04T18:38:08.826Z" }, + { url = "https://files.pythonhosted.org/packages/66/0f/7d5154c92904bdf25be067a7fe4cad4ba48919f16ccbb51bb953d9ae1a20/pyinstrument-5.1.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0baed297beee2bb9897e737bbd89e3b9d45a2fbbea9f1ad4e809007d780a9b1e", size = 131388, upload-time = "2026-01-04T18:38:10.491Z" }, + { url = "https://files.pythonhosted.org/packages/17/28/bf83231a3f951e11b4dfaf160e1eeba1ce29377eab30e3d2eb6ee22ff3ba/pyinstrument-5.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ebb910a32a45bde6c3fc30c578efc28a54517990e11e94b5e48a0d5479728568", size = 124456, upload-time = "2026-01-04T18:38:11.792Z" }, + { url = "https://files.pythonhosted.org/packages/ac/98/762cf10896d907268629e1db08a48f128984a53e8d92b99ea96f862597e5/pyinstrument-5.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bad403c157f9c6dba7f731a6fca5bfcd8ca2701a39bcc717dcc6e0b10055ffc4", size = 149594, upload-time = "2026-01-04T18:38:13.434Z" }, + { url = "https://files.pythonhosted.org/packages/1a/1b/48580e16e623d89af58b89c552c95a2ae65f70a1f4fab1d97879f34791db/pyinstrument-5.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f456cabdb95fd343c798a7f2a56688b028f981522e283c5f59bd59195b66df5", size = 148339, upload-time = "2026-01-04T18:38:14.767Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/38157a8a6ec67789d8ee109fd09877ea3340df44e1a7add8f249e30a8ade/pyinstrument-5.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4e9c4dcc1f2c4a0cd6b576e3604abc37496a7868243c9a1443ad3b9db69d590f", size = 148485, upload-time = "2026-01-04T18:38:16.121Z" }, + { url = "https://files.pythonhosted.org/packages/4b/34/31ee72b19cfc48a82801024b5d653f07982154a11381a3ae65bbfdbf2c7b/pyinstrument-5.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:acf93b128328c6d80fdb85431068ac17508f0f7845e89505b0ea6130dead5ca6", size = 148106, upload-time = "2026-01-04T18:38:17.623Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b4/7ab20243187262d66ab062778b1ccac4ca55090752f32a83f603f4e5e3a2/pyinstrument-5.1.2-cp314-cp314-win32.whl", hash = "sha256:9c7f0167903ecff8b1d744f7e37b2bd4918e05a69cca724cb112f5ed59d1e41b", size = 126593, upload-time = "2026-01-04T18:38:18.968Z" }, + { url = "https://files.pythonhosted.org/packages/9e/a0/db6a8ae3182546227f5a043b1be29b8d5f98bf973e20d922981ef206de85/pyinstrument-5.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:ce3f6b1f9a2b5d74819ecc07d631eadececf915f551474a75ad65ac580ec5a0e", size = 127358, upload-time = "2026-01-04T18:38:20.28Z" }, + { url = "https://files.pythonhosted.org/packages/59/d2/719f439972b3f80e35fb5b1bcd888c3218d60dbc91957b99ffafd7ac9221/pyinstrument-5.1.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:af8651b239049accbeecd389d35823233f649446f76f47fd005316b05d08cef2", size = 132317, upload-time = "2026-01-04T18:38:21.669Z" }, + { url = "https://files.pythonhosted.org/packages/e2/1c/0ebfef69ae926665fae635424c5647411235c3689c9a9ad69fd68de6cae2/pyinstrument-5.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c6082f1c3e43e1d22834e91ba8975f0080186df4018a04b4dd29f9623c59df1d", size = 124917, upload-time = "2026-01-04T18:38:23.385Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ee/5599f769f515a0f1c97443edc7394fe2b9829bf39f404c046499c1a62378/pyinstrument-5.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c031eb066ddc16425e1e2f56aad5c1ce1e27b2432a70329e5385b85e812decee", size = 157407, upload-time = "2026-01-04T18:38:24.774Z" }, + { url = "https://files.pythonhosted.org/packages/fd/40/32aa865252288caef301237488ee309bd6701125888bf453d23ab764e357/pyinstrument-5.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f447ec391cad30667ba412dce41607aaa20d4a2496a7ab867e0c199f0fe3ae3d", size = 155068, upload-time = "2026-01-04T18:38:26.112Z" }, + { url = "https://files.pythonhosted.org/packages/91/68/0b56a1540fe1c357dfcda82d4f5b52c87fada5962cbf18703ea39ccbbe69/pyinstrument-5.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:50299bddfc1fe0039898f895b10ef12f9db08acffb4d85326fad589cda24d2ee", size = 155186, upload-time = "2026-01-04T18:38:27.914Z" }, + { url = "https://files.pythonhosted.org/packages/7a/48/7ef84abfc3e41148cf993095214f104e75ecff585e94c6e8be001e672573/pyinstrument-5.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a193ff08825ece115ececa136832acb14c491c77ab1e6b6a361905df8753d5c6", size = 153979, upload-time = "2026-01-04T18:38:29.236Z" }, + { url = "https://files.pythonhosted.org/packages/8f/cf/a28ad117d58b33c1d74bcdfbbcf1603b67346883800ac7d510cff8d3bcee/pyinstrument-5.1.2-cp314-cp314t-win32.whl", hash = "sha256:de887ba19e1057bd2d86e6584f17788516a890ae6fe1b7eed9927873f416b4d8", size = 127267, upload-time = "2026-01-04T18:38:30.619Z" }, + { url = "https://files.pythonhosted.org/packages/8e/97/03635143a12a5d941f545548b00f8ac39d35565321a2effb4154ed267338/pyinstrument-5.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:b6a71f5e7f53c86c9b476b30cf19509463a63581ef17ddbd8680fee37ae509db", size = 128164, upload-time = "2026-01-04T18:38:32.281Z" }, +] + +[[package]] +name = "pylint" +version = "4.0.6" +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/7d/1d/3bb57f303701549550d74bf7ced2b07412be97125c167a0c9d216aa9f762/pylint-4.0.6.tar.gz", hash = "sha256:52f19191bee08bf103f9705ad1a0ece4aa5a0a4ef2bdcbd969375a1e6f6579d5", size = 1585588, upload-time = "2026-06-14T14:43:26.772Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/da/acb2e7d4dbd2dfb792d38c0d850481f29ad7049b356d23f56c687d35203b/pylint-4.0.6-py3-none-any.whl", hash = "sha256:d11a0e1fdb7b1cd46ec5d6fc78fee8b95f28695b2d6140e5809925f61e32ea54", size = 538389, upload-time = "2026-06-14T14:43:24.873Z" }, +] + +[[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.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pylint" }, + { name = "pylint-plugin-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/a1/b92e5d5cf320b603c9bcc5174da7e9ba4c6ce71087354322a2b83536df13/pylint_django-2.8.0.tar.gz", hash = "sha256:42accea9098e4a3298b4bfbae0e4da81f909f8bff0deda9485efbd6035a86d6a", size = 32038, upload-time = "2026-07-11T10:19:14.844Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/4a/3dae8a09e12a28ccf3d7204cc4fb69f28dfb30d2b19567eb5ff094fe1265/pylint_django-2.8.0-py3-none-any.whl", hash = "sha256:706eb2cc8d7692236be9fd033a341042afe3bbbf99df9234a659db931016ef5d", size = 44672, upload-time = "2026-07-11T10:05:29.281Z" }, +] + +[[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.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/64/50be6fbac9c79fe2e4c17401a467da2d8764d82833d83cec325afe5cab32/pymongo-4.17.0.tar.gz", hash = "sha256:70ffa08ba641468cc068cf46c06b34f01a8ce3489f6411309fcb5ceabe6b2fc0", size = 2523370, upload-time = "2026-04-20T16:39:53.524Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/90/60bcb508840135d5ee46b51b1a950f548338aa8145a8366dbe6639ae51ac/pymongo-4.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53ffa94b2340dbf6b055e09a0090618c60482c158ecfc9565642fc996bf0944", size = 930529, upload-time = "2026-04-20T16:38:00.936Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e9/313840f1e52c6dfac47f704428cbfbce59956ebe7633bffc92b03f74f0ad/pymongo-4.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6fe0de9d0f6791abce3471230b32b4817bf89d27b1182b6a550e1ec0fa72aa9a", size = 930665, upload-time = "2026-04-20T16:38:02.915Z" }, + { url = "https://files.pythonhosted.org/packages/78/35/9d3565ea45b1606f635c1e2cd2563c28d66caafdc50f7ad7d979fcd1b363/pymongo-4.17.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e537e95514dae1aaa718f481ec03151a0f0394bcd05f1322896d8fc1330cb729", size = 1762369, upload-time = "2026-04-20T16:38:05.375Z" }, + { url = "https://files.pythonhosted.org/packages/95/ee/149b0d4b1a11c38bff6f14c23d5814c9b0843fd6dc38ad40596bdb1a62d2/pymongo-4.17.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37a8385c29881b43eab31f584100fa0eaddedd5607adf010147ba1810118be90", size = 1798044, upload-time = "2026-04-20T16:38:07.195Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d4/4cee4a7b8d8f6f0550ef6cd2fea42455c5ed619a220cb6ba4fb40d6a5bc8/pymongo-4.17.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f3ee3d241ed77a4fc99ce3cff3b289c3ebce37f61fdd7349d3592c23b82c8784", size = 1878567, upload-time = "2026-04-20T16:38:09.121Z" }, + { url = "https://files.pythonhosted.org/packages/45/ef/7fe366c84952619ee2f69973566c214775e083dd4df465751912153e4b72/pymongo-4.17.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9eb5d63a3c518cb0804ed678f5e2b875af032d89a7cf57a57360322cf6a4d222", size = 1864881, upload-time = "2026-04-20T16:38:10.896Z" }, + { url = "https://files.pythonhosted.org/packages/2f/35/b577d82c6d1be7aee7ac7e249bc86f7847998345042e5f8360de238e177b/pymongo-4.17.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e97e03fa13327c87e3fdc5656acd01e71817f0c1dc3221cd8f30de136bf4ec3", size = 1800349, upload-time = "2026-04-20T16:38:13.589Z" }, + { url = "https://files.pythonhosted.org/packages/b8/69/dafcf04f66e130ddd91aeb92e7a692480eda46dcd04ec1dbe82c06619e10/pymongo-4.17.0-cp312-cp312-win32.whl", hash = "sha256:6877214bff5f06f6884a9fc8d9016a4a7a5f51f537f5c51ac3a576f93e7dfb32", size = 900518, upload-time = "2026-04-20T16:38:15.541Z" }, + { url = "https://files.pythonhosted.org/packages/11/35/5c9262a459f988b4eb2605f70815240b77a0d4131136c4326d18f1822b89/pymongo-4.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:9828485f72f63c7d802e0ec41f71906f633c2692621ab3af55ca990186b091b1", size = 920335, upload-time = "2026-04-20T16:38:17.665Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/e9c7265ee176faccf4e52c4797837e794d93569a1046f6b19a4acc36e5ad/pymongo-4.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:1195370a77baf003b59b10e91ecc4706297197f0dd9d29c840cc556dc08f7cee", size = 903289, upload-time = "2026-04-20T16:38:19.33Z" }, + { url = "https://files.pythonhosted.org/packages/2a/6b/c1206879708b94e82fcd8b9653440ec271f79a3674d122192df383047f5a/pymongo-4.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:809ec74de3b9148ae43fa8df9faf53470f511c8d384f13b99d6f671f2a379f15", size = 985829, upload-time = "2026-04-20T16:38:21.031Z" }, + { url = "https://files.pythonhosted.org/packages/cb/cf/bb044ed85160e5c40f568c7c4f4e8ea16f40764ff5d302e5befbe8f6f814/pymongo-4.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a431b737816bf4cddd4fa0fcef04e424ad36b7692734a64150f872fb8f3208be", size = 985899, upload-time = "2026-04-20T16:38:23.409Z" }, + { url = "https://files.pythonhosted.org/packages/74/0a/f6dfd5ea3901e5d6888da8de8ba728971a1d447debab681cfc56f90d1208/pymongo-4.17.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e4fab10f8403169ce92f3cea921609d9ee81107306caae06c08f592d4b8ad2b5", size = 2028569, upload-time = "2026-04-20T16:38:25.343Z" }, + { url = "https://files.pythonhosted.org/packages/4a/c5/081f59a1c02ae8c0dc73ae58e563838c44eec81aeafa7d0b93a637841c9b/pymongo-4.17.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20323b0b1c1d33770ad1fc68d429c757734ce9ad3594421c3d6618f10572b1b9", size = 2072916, upload-time = "2026-04-20T16:38:27.291Z" }, + { url = "https://files.pythonhosted.org/packages/31/42/6e41d434297ffe8b30d9c3717916591a4a7be9075a0dcc2fafdfaaaa62ed/pymongo-4.17.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5a5de048e6da5c18e27cc2437e8c15b3b0cdc8385c15b41178b0caa3322a09c2", size = 2173234, upload-time = "2026-04-20T16:38:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/3d/cf/1e4a7db352ef9485831c7268dfe8402f0117b32a9ad54b16e810699e3617/pymongo-4.17.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dff3de1294fbbc1db0ba6b511f77b8e540601d092538a31312e99c8a91a78b1e", size = 2156784, upload-time = "2026-04-20T16:38:32.134Z" }, + { url = "https://files.pythonhosted.org/packages/12/10/6195be29962a61ebb5f4bd9e4c7519890b172f7968a0a0d880398c6ddb02/pymongo-4.17.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:faf03e4c2aafd6de626dbd30ba246d369ae33f47f10629d1bbe40f72115027a6", size = 2074446, upload-time = "2026-04-20T16:38:34.004Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/33410b8819837ed370c738587306bdf060b59cef11823be212f4a07703c5/pymongo-4.17.0-cp313-cp313-win32.whl", hash = "sha256:c9786665926a09630c5d420c79762cfadbff35a9438bcbc4c81a9fb5ab9228b7", size = 948435, upload-time = "2026-04-20T16:38:35.922Z" }, + { url = "https://files.pythonhosted.org/packages/6f/77/c0ed522f798a286b99acaa7914ed8d9c80ab091f97f57c59ffed72906e5e/pymongo-4.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:5960519b4d7168f1ecdd3ea10c81b2aedeb9423651aca953cfbc8e76705d3b38", size = 972847, upload-time = "2026-04-20T16:38:37.888Z" }, + { url = "https://files.pythonhosted.org/packages/97/f0/c39480a2db385fde23861d0c8acda41cdaf1d43e46579db72c5c013a2e81/pymongo-4.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:0ff6bd2f735ab5356541e3e57d5b7dbfbc3f2ee1ccb10b6b0f82d58af69d1d8e", size = 951575, upload-time = "2026-04-20T16:38:40.544Z" }, + { url = "https://files.pythonhosted.org/packages/da/49/2b0250762a89737ed6f9cea238331baca061b89a8ddd10dd17fee52c3970/pymongo-4.17.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ff5aa3f1c7e3f08eb0e7a016c91ba468b1850ccfd63d9b1f12f56350f4974cef", size = 1040945, upload-time = "2026-04-20T16:38:42.783Z" }, + { url = "https://files.pythonhosted.org/packages/89/1c/7a9b5447a08be20e84b6e5b17330917e8d6d9507daa3cd099a9309f11ad7/pymongo-4.17.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e816db649ba5d7de0568cf3a9f287a9dc9aad21cf0ca667ab156a7ef47fca0b0", size = 1041187, upload-time = "2026-04-20T16:38:45.358Z" }, + { url = "https://files.pythonhosted.org/packages/78/a1/71704f61632dfc90407a5834fe5f6132854937c4a3648f6c05c351d85a45/pymongo-4.17.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:12c4fded3a9f1d6a687e36ebd384ac6d00b9b00de1969aa74048e7051ec2a713", size = 2294806, upload-time = "2026-04-20T16:38:47.734Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b9/aff42be75108b96c2469b1d9329b912c15108f3e7ef32fdc86da8423c330/pymongo-4.17.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2db66aa8dd253a0fc1fad3b0d23d5b3993f7ebde02fbbd7727128debf2853675", size = 2348231, upload-time = "2026-04-20T16:38:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/f2/30/44c115b8ba1479942c15fd9480eb29a7da0ba68acd56983423ba0deb4a94/pymongo-4.17.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3987e96e7c7be4083d42e8ac2cc6c0d5b78db9973c90fce42ae800b616ca6b20", size = 2467614, upload-time = "2026-04-20T16:38:52.665Z" }, + { url = "https://files.pythonhosted.org/packages/d2/84/21ee95c8bf0ca7acae7ec7eb365d740bf8fc0156c194baf2c3bdfcb85ec0/pymongo-4.17.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cee36b3c0d0354f880fa7a7fdcdaf2bb5e542c2281e25c1bfadf8cfe21eba7d2", size = 2445970, upload-time = "2026-04-20T16:38:55.175Z" }, + { url = "https://files.pythonhosted.org/packages/06/89/081d7f1809d5ca09d1e47e49f2111b245f5694de3a7af32cd3a353a6f43f/pymongo-4.17.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:320b34457b20bbcc79997801f95d25ce00472915ca5241167242b42c4359e027", size = 2348605, upload-time = "2026-04-20T16:38:57.557Z" }, + { url = "https://files.pythonhosted.org/packages/ea/c3/0d949f9d3f2a341c1f635c398c16615e96f89f51ff424ed81e914cf1a4de/pymongo-4.17.0-cp314-cp314-win32.whl", hash = "sha256:df4a644af9ae132d4bfdb2e9516ea51a615fd881caddfbfbd071cf1354844479", size = 1004119, upload-time = "2026-04-20T16:39:00.309Z" }, + { url = "https://files.pythonhosted.org/packages/f7/55/5c3a3db1048054c695c75c5964cc8bedc2247fdb5a75ef6fab4ec8bb013e/pymongo-4.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:c797f8a80957134f6dd9690367a0f8f5906d672119af2c6aa55f0c527b656bed", size = 1032314, upload-time = "2026-04-20T16:39:02.665Z" }, + { url = "https://files.pythonhosted.org/packages/e0/19/e235f39906134cb0ffd5574c5a59c355ef5380f0499644ab94994afbb109/pymongo-4.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:68fca71e05ee5da23a8d73cee8379dfb3d26e609a377cae731d742771ed96946", size = 1007627, upload-time = "2026-04-20T16:39:04.678Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e0/c4c1a86791415b14c684fa0908f9da96de91594a3fd1fa1b8dc689fbb800/pymongo-4.17.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b4384700cffc3f1dd98e088bc0072dedf6d7d68a230bb4b972665cf69c071c1e", size = 1099151, upload-time = "2026-04-20T16:39:06.969Z" }, + { url = "https://files.pythonhosted.org/packages/81/4b/69c67f3e23fd9b23b9bedc7ebd23754881cc9d5c5d5b2a9811e96b07f475/pymongo-4.17.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:93641192644fa1ee0f34030e774fd31022a27ad11ba22cb1716142231524f8bd", size = 1099346, upload-time = "2026-04-20T16:39:08.996Z" }, + { url = "https://files.pythonhosted.org/packages/a2/19/a5208f62f9508a26d73acc69bd3821b8c8adae253679a3c26d2f9652f0d5/pymongo-4.17.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:75bc3aa5b94fdb7138d357ec6ca61cd97e0c79f4f7f0bd3efe9639b15cc50942", size = 2619034, upload-time = "2026-04-20T16:39:11.049Z" }, + { url = "https://files.pythonhosted.org/packages/77/27/426cba1ec5973082a56d4150798529bfdf4151c31391ed1fbbecb23ef2ac/pymongo-4.17.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e8f8e23c6df7c6d6929f5e734980b227706e73ee847517c9ba5af90f7fc466", size = 2689939, upload-time = "2026-04-20T16:39:13.617Z" }, + { url = "https://files.pythonhosted.org/packages/ef/2e/f70993d1255e33f6ee59a4ec4371cc65bff7a7e3fda7d55c3386f25287e8/pymongo-4.17.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:15d3f3d732aecac1f8d481bde4029755615639bd3076f258a2147210aec8515a", size = 2824994, upload-time = "2026-04-20T16:39:16.057Z" }, + { url = "https://files.pythonhosted.org/packages/b3/eb/87b0e988ba889e1fcc3430c2cfc166b251872c813e92b43174298bee17ff/pymongo-4.17.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5f62862d0f87be481fa1fe8cb811994486773c94a2b61e509285e3f2890763", size = 2801745, upload-time = "2026-04-20T16:39:18.476Z" }, + { url = "https://files.pythonhosted.org/packages/67/4c/3f83412d086f682d4d468761d66ddc49cf161e786ea74073045eb4491c60/pymongo-4.17.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64837adbbd72073301af51bb0fc80e3d7707fe5527cea1033ba0320f0b2f881b", size = 2684636, upload-time = "2026-04-20T16:39:20.878Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d8/b75f6f4ab6c8beb50b0270a4f1e2530b5774f5e116563440e1677ca1820f/pymongo-4.17.0-cp314-cp314t-win32.whl", hash = "sha256:b93b22eedc62598cf5ee9d8c8007a8e9121c50fd88137012d8985500e9dc3151", size = 1056356, upload-time = "2026-04-20T16:39:22.996Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5e/648c8a238eef18a25ed8a169ea6542d4a860bbec3e95b3d9badac2935c71/pymongo-4.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:3689ea34f6b647c7d1e7bdc60fcfb214b2789ed1359a7fb96569c69f50e5f18f", size = 1090964, upload-time = "2026-04-20T16:39:24.989Z" }, + { url = "https://files.pythonhosted.org/packages/dc/cb/d9780b66939c4fc1f024bcc7be23a2abcfe06a9745ca8fa76dc73395482e/pymongo-4.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9543d8f84c2e5608565c08ac679774811e6730770d8a645439b073422a4276fb", size = 1058526, upload-time = "2026-04-20T16:39:27.924Z" }, +] + +[[package]] +name = "pynacl" +version = "1.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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 = "pypng" +version = "0.20220715.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/93/cd/112f092ec27cca83e0516de0a3368dbd9128c187fb6b52aaaa7cde39c96d/pypng-0.20220715.0.tar.gz", hash = "sha256:739c433ba96f078315de54c0db975aee537cbc3e1d0ae4ed9aab0ca1e427e2c1", size = 128992, upload-time = "2022-07-15T14:11:05.301Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/b9/3766cc361d93edb2ce81e2e1f87dd98f314d7d513877a342d31b30741680/pypng-0.20220715.0-py3-none-any.whl", hash = "sha256:4a43e969b8f5aaafb2a415536c1a8ec7e341cd6a3f957fd5b5f32a4cfeed902c", size = 58057, upload-time = "2022-07-15T14:11:03.713Z" }, +] + +[[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 = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { 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-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-swiftclient" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/d4/1db31bea9052c16f0215409f1749cae991bdb0b8d1eb4c3abfb61a9a0bf0/python_swiftclient-4.10.0.tar.gz", hash = "sha256:981891abc7fb355b266e823df3ecb80e5c267c57934fb5094bb102ddaf7e51be", size = 210948, upload-time = "2026-02-25T21:01:27.654Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/a8/afbe7a509bf178f620d0a11131c84fa855b98639ed90f86ea53dfb564124/python_swiftclient-4.10.0-py3-none-any.whl", hash = "sha256:6fb8187b736b63c1bc306aba203314510244cdf731dc54031d1cc5d5962e78e6", size = 88576, upload-time = "2026-02-25T21:01:26.32Z" }, +] + +[[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 = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +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 = "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 = "responses" +version = "0.26.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, + { 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 = "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 = "s3transfer" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/da/4bef7ce7bb989b222aa4785a413896dbec53306dfc59c6ce7d16a7ffbd6a/s3transfer-0.19.1.tar.gz", hash = "sha256:d3d6371dc3f1e5c5427b2b457bcf13bcf87bec334c95aed18642eae61f6926f3", size = 165354, upload-time = "2026-07-10T19:32:04.849Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/23/e84c64ad0e8bc59cd1b2ef98def848deff0ef3456c542afe74d51e9e8c85/s3transfer-0.19.1-py3-none-any.whl", hash = "sha256:d5fd7005ee39307455ad5f310b5ea67f4b1960d7fed5b3671ee50c249de675de", size = 90072, upload-time = "2026-07-10T19:32:03.673Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[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 = "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 = "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 = "9.1.0" +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" }, + { 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/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, +] + +[[package]] +name = "sphinx-autobuild" +version = "2025.8.25" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama" }, + { name = "sphinx" }, + { name = "starlette" }, + { name = "uvicorn" }, + { name = "watchfiles" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/3c/a59a3a453d4133777f7ed2e83c80b7dc817d43c74b74298ca0af869662ad/sphinx_autobuild-2025.8.25.tar.gz", hash = "sha256:9cf5aab32853c8c31af572e4fecdc09c997e2b8be5a07daf2a389e270e85b213", size = 15200, upload-time = "2025-08-25T18:44:55.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/20/56411b52f917696995f5ad27d2ea7e9492c84a043c5b49a3a3173573cd93/sphinx_autobuild-2025.8.25-py3-none-any.whl", hash = "sha256:b750ac7d5a18603e4665294323fd20f6dcc0a984117026d1986704fa68f0379a", size = 12535, upload-time = "2025-08-25T18:44:54.164Z" }, +] + +[[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 = "sphinx-copybutton" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload-time = "2023-04-14T08:10:20.844Z" }, +] + +[[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.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/51/29/54cf1f7e03630ca4859caba25bc192698954d7c630377c62d1e264715c37/sphinxcontrib_mermaid-2.0.3.tar.gz", hash = "sha256:a6865ef6b65b225c5403a3170de63a04a07227cada11a4a71a6b87b4f9ed185a", size = 20764, upload-time = "2026-07-08T00:30:44.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/57/b39c7a69b70a3ce999732bdb57fcaac78fb3cc8e2843a3daf1c1f821bc9d/sphinxcontrib_mermaid-2.0.3-py3-none-any.whl", hash = "sha256:f001ed36a55c108f6221a2d656a441c487ee30651b54db72b7c752a20c7a66e8", size = 15401, upload-time = "2026-07-08T00:30:42.877Z" }, +] + +[[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 = "starlette" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/e3/7c1dc7381d9f8ab7d854328ebfa884e62cb3f3d8549ddfd37c7814f42afa/starlette-1.3.1.tar.gz", hash = "sha256:05d0213193f2fbaae60e2ecb593b4add4262ad4e46536b54abe36f11a71724e0", size = 2703240, upload-time = "2026-06-12T09:23:11.602Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/bb/2799cc2ede3ed41131f8975621e7213dfc7ef4acbbaadfa440f32500c370/starlette-1.3.1-py3-none-any.whl", hash = "sha256:c7372aae11c3c3f26a42df7bd626cec2f47d03483d261d369516a615a53714c6", size = 73632, upload-time = "2026-06-12T09:23:10.017Z" }, +] + +[[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 = "testfixtures" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/4d/b1c5fae372cd46b7bc1ec1dbca6efecaef8fe1e4edad203cc6e36cd5eafd/testfixtures-12.3.0.tar.gz", hash = "sha256:d807ceb9bdd6ea7cc0663370dd5568339056b35dc15c26effd1ae267e323acf1", size = 201458, upload-time = "2026-07-08T21:32:04.42Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/7c/cf6a4bd936b0d8377992a07fe94ae9f6844e728fcfaa006b7ff9e059a038/testfixtures-12.3.0-py3-none-any.whl", hash = "sha256:da013e07f1e850b4d92ea6045c4a71f49d6ddcaab11c8b29f65ea38ff678aee8", size = 69493, upload-time = "2026-07-08T21:32:03.252Z" }, +] + +[[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 = "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.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/96/e07752635b98536177fa1f37671c8f3cdde2e724c6bcf6034b2cfb571565/tomlkit-0.15.1.tar.gz", hash = "sha256:e25bbf38843005246210a12982776f27f99cb9be67160e14434d0c0d21ee1e97", size = 180129, upload-time = "2026-07-17T01:48:04.562Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/bc/8c13eb66537dce1d2bd3a57132902f38d0e7f5bb46fa9f4daed9fe9d76ee/tomlkit-0.15.1-py3-none-any.whl", hash = "sha256:177a05aece5a8ca5266fd3c448abb47b8d352f09d477d3ca8332db4d89b24304", size = 49449, upload-time = "2026-07-17T01:48:05.728Z" }, +] + +[[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 = "typer" +version = "0.27.0" +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/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[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.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "tzlocal" +version = "5.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32' or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +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 = "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]] +name = "uv" +version = "0.11.29" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/16/2a3783a1197b54036ab0a866f6283a091717491b1726a2f186c5c25a58e2/uv-0.11.29.tar.gz", hash = "sha256:a4ca34dc3b247740e511ca7c718181d5300e7899bbef755db45bb6c993610a64", size = 6025977, upload-time = "2026-07-15T18:43:22.905Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/bb0c6be0c1d3479cd23013ef31e0276ecf4dfca93aa3ebf9f95a26c50558/uv-0.11.29-py3-none-linux_armv6l.whl", hash = "sha256:2dc8012a693b6bb9ec17dcb2c2345cf273ccad06ae2ab4a8c7a0833955812c75", size = 25869702, upload-time = "2026-07-15T18:42:15.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/50/b6e195025978174a06b7997bd59ed8663c56152e72401f08f46141ae56c6/uv-0.11.29-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7711c46452b44332352d344b5818ad8faf04596efaf837d8114aa9984e4a9610", size = 24804743, upload-time = "2026-07-15T18:42:19.54Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6e/2260f37ec915cf16f6008b9bf639081eb3efcbc09e37b5bb25b3d29328a5/uv-0.11.29-py3-none-macosx_11_0_arm64.whl", hash = "sha256:257c6df4393116114f296f7a02f51db9a2117f68c3ae93bbe218fa79e6521df3", size = 23506367, upload-time = "2026-07-15T18:42:23.346Z" }, + { url = "https://files.pythonhosted.org/packages/b5/41/4f44a7502844f714f44f6de70ac6360ee7ee6bb053258cb994d6657ccf40/uv-0.11.29-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:aa166ce529cfbce6b3afaabdc4cdbfdf9e3e3d82413c709d679ff374eb76d5e9", size = 25326589, upload-time = "2026-07-15T18:42:26.817Z" }, + { url = "https://files.pythonhosted.org/packages/a6/4a/09cb6756b1c203c44b74bc1741e91e70dec877de6aabc675a2ae276a89ab/uv-0.11.29-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:66b250d102f0e49f3d2306353aaabb43f39da5ccfa4e84fe10ba8a25de85316c", size = 25369704, upload-time = "2026-07-15T18:42:30.21Z" }, + { url = "https://files.pythonhosted.org/packages/65/81/79cc50cb74fb3acee6a17a218e38f3b23326965847ba339267a40606b920/uv-0.11.29-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:606e2bc7880d70448ff4359faa43a7c71743283010262fc142e1ca9fcb6937cf", size = 25394987, upload-time = "2026-07-15T18:42:33.894Z" }, + { url = "https://files.pythonhosted.org/packages/2e/5c/8fabb416ddbb7de9427be29005afd52edbfe2e12e2fdf7a5058959a71cbb/uv-0.11.29-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60e792b00f4cd6c5eadd814161cd046fa8418d83621d85d3e65aae28dc5b53ff", size = 26810263, upload-time = "2026-07-15T18:42:37.991Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5f/71cdb528faa4252f6dc4f5c91f68276d530cadbd3c3a1c63386becd04703/uv-0.11.29-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db119a3ec9d7ce42e98de3d014427d74fd92f1f7c40fc9dfe62b14601a9e83da", size = 27580584, upload-time = "2026-07-15T18:42:41.737Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/130c64c2367d17e38d225b68719f4780f7b5ceb4d80bb99da5dff3f9cea7/uv-0.11.29-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0222a51972e42bc1c132761ea027b9086d710ff5fa5199af658955bd03bee4d8", size = 26747059, upload-time = "2026-07-15T18:42:45.411Z" }, + { url = "https://files.pythonhosted.org/packages/0d/28/3fa1c2061d588184840e3e4ab17e6d318c744bb2fcb15ddb0c29b5bc0bb3/uv-0.11.29-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eec03a8b63d55915694db3af4e91324b39ced49e2aeac7af37851c7eb3f470ea", size = 26914059, upload-time = "2026-07-15T18:42:49.184Z" }, + { url = "https://files.pythonhosted.org/packages/32/23/3ec8bddbf007644457158cceacd9dbd06db596420fc81cbc22ea36a47106/uv-0.11.29-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:2b49e175bfbcd8ac1e09e06f0b9d544b9e671d2cdecf753aa3fbff4d61d19317", size = 25461006, upload-time = "2026-07-15T18:42:52.807Z" }, + { url = "https://files.pythonhosted.org/packages/54/f9/2b7658e1f664f53e27c2b7733d6a14023dd97500f70ecb8fc1b15e04006f/uv-0.11.29-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:91b5d1407ac8757e1757268e9d983e9e7b72eeb826808f9e2404344a6de1d3fb", size = 26322213, upload-time = "2026-07-15T18:42:56.444Z" }, + { url = "https://files.pythonhosted.org/packages/73/1d/df16af369a727e354d12d522b634788085593c61d46648ca88f241f47d74/uv-0.11.29-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7d618b4a2ae2b367d20710858838344604d5b9e8c0863343d5f793142408ea11", size = 26423853, upload-time = "2026-07-15T18:43:00.173Z" }, + { url = "https://files.pythonhosted.org/packages/00/e2/1516e73f98eb7acbc94d0494bb0080c4ad7f74af6528443038fcf9998e8a/uv-0.11.29-py3-none-musllinux_1_1_i686.whl", hash = "sha256:865f09f5de0c1913bf9ed424bcc5c1a15780d01debd4d62b8a22c8f3e9bdb420", size = 26058679, upload-time = "2026-07-15T18:43:03.962Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b6/3498d9400e92d76b7e8352529ff6d3464843053a4a24e183d284c1ffed85/uv-0.11.29-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:157ed0bcfef5aba9b53ff4b322e009b3261d83fbf5d9423e367a33c0416c85ac", size = 27129437, upload-time = "2026-07-15T18:43:07.707Z" }, + { url = "https://files.pythonhosted.org/packages/67/20/0ce6e7fc55b245cc66342f1adc91803a85747988e82e44e1486f10d0196f/uv-0.11.29-py3-none-win32.whl", hash = "sha256:f7e4c709397468264764f571003fd278cbd384321f5c497370c28352bdb8b6a9", size = 24487340, upload-time = "2026-07-15T18:43:11.558Z" }, + { url = "https://files.pythonhosted.org/packages/83/a2/02a3e74948f15440293723f183f38716c86328f0e234a9c733cce3bde12c/uv-0.11.29-py3-none-win_amd64.whl", hash = "sha256:abc641b24be42dc5d62f63ecb3500c07a0fb3c596e407963708f59114f0816ad", size = 27567430, upload-time = "2026-07-15T18:43:15.646Z" }, + { url = "https://files.pythonhosted.org/packages/48/8f/86a97f1e4c56bd0a300d5da3347b9762c94a95c2296ff8ce1fc043712d98/uv-0.11.29-py3-none-win_arm64.whl", hash = "sha256:e245e6f95f154ae56793bfc7742ec27334a546469bba4d09c03624470ab451d2", size = 25735940, upload-time = "2026-07-15T18:43:19.742Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.51.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/65/b7c6c443ccc58678c91e1e973bbe2a878591538655d6e1d47f24ba1c51f3/uvicorn-0.51.0.tar.gz", hash = "sha256:f6f4b69b657c312f516dd2d268ab9ae6f254b11e4bac504f37b2ab58b24dd0b0", size = 94412, upload-time = "2026-07-08T10:59:05.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/ec/dbb7e5a6b91f86bfb9eb7d2988a2730907b6a729875b949c7f022e8b88fa/uvicorn-0.51.0-py3-none-any.whl", hash = "sha256:5d38af6cd620f2ae3849fb44fd4879e0890aa1febe8d47eb355fb45d93fe6a5b", size = 73219, upload-time = "2026-07-08T10:59:04.44Z" }, +] + +[[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.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "python-discovery" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/d9/b477fddb68840b570af8b22afe9b035cbc277b5fb7b33dea390617a8b10f/virtualenv-21.6.1.tar.gz", hash = "sha256:15f978b7cd329f24855ff4a0c4b4899cc7678589f49adbdcbbb4d3232e641128", size = 5526620, upload-time = "2026-07-10T19:33:53.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/7c/4e7225d46d634a0d8d534dd8a6ce0c319d09b4d0cf0337eb314ca4789d8c/virtualenv-21.6.1-py3-none-any.whl", hash = "sha256:afe991df855715a2b2f60edfcc0107ef95a79fdfd8cb4cdaa71603d1c12e463b", size = 5506392, upload-time = "2026-07-10T19:33:51.629Z" }, +] + +[[package]] +name = "voluptuous" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/f4/0738e6849858deae22218be3bbb8207ba83a96e9d0ec7e8e8cd67b30e5ca/voluptuous-0.16.0.tar.gz", hash = "sha256:006535e22fed944aec17bef6e8725472476194743c87bd233e912eb463f8ff05", size = 54238, upload-time = "2025-12-18T23:18:46.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/00/0e0da784245c93cf346150ab67634177bf277f93b7a162bb56c928c39c04/voluptuous-0.16.0-py3-none-any.whl", hash = "sha256:ee342095263e1b5afbd4d418cb5adc92810eebfd07696bb033a261210df33db4", size = 31931, upload-time = "2025-12-18T23:18:44.694Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/2f/e42c992d2afda3108ea1c02acecc991b9f31d05c14adc2a7cee9ee211fc4/watchfiles-1.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:bc13eb17538be00c874699dc0abe4ee2bc8d50bb1166a6b9e175ef3fd7eb8f26", size = 400115, upload-time = "2026-05-18T04:32:02.06Z" }, + { url = "https://files.pythonhosted.org/packages/5f/8f/6af2ea19065c91d8b0ea3516fdfc8c0d349f407e8e9fbf4e5a17360de8ad/watchfiles-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d95ddc1eb6914154253d239089900813f6a767e174b8e6a50e7fdacb7e4236c", size = 393659, upload-time = "2026-05-18T04:30:50.951Z" }, + { url = "https://files.pythonhosted.org/packages/13/01/b32a967c56fb3e3e5be3db52c3d3b87fa4513aa367d8ed1ad96d42952e5f/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f70d8b291ef6e88d19b1f297a6905ddb978888d9272b0d05e6f53309856bcfc", size = 453207, upload-time = "2026-05-18T04:31:04.231Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/97557a812180338cb1abd32e1cffcc4588f59b5f23e0cb006b2ba95ba64a/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56d8641cf834c2836922899105bd3ce3d0dfc69291d52edf0b4d0436829b34c0", size = 459273, upload-time = "2026-05-18T04:31:50.377Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a8/b4b08dcb7653b8087c6586f7ce649505900e866bbcfe40dc9587af02e686/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2581a94056e55d7d0a31a823ea92bf73749c489ca2285bfdc0fbe6b2bb49d50c", size = 489927, upload-time = "2026-05-18T04:31:42.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/3dceea03545d2e5ddfd839f0ddd5e1cecbf1697b5a428d5ba11cef6af95d/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41bc1199f7523b3f82843c88cbb979180c949caef0342cf90968f178e5d49b01", size = 570476, upload-time = "2026-05-18T04:31:03.071Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f2/d39a5450c3532092b91f81d274360e613c2371bc874a89c7a1a3c5e8d138/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7571e4464cb6e434958f867f7f730b8ab0b75e3f8e5eac0499168486ab3c33a8", size = 465650, upload-time = "2026-05-18T04:30:12.701Z" }, + { url = "https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53a384f76b631c3ae5334ce6a52f0baa3a911eb94a4eac7f160079868b716d5", size = 456398, upload-time = "2026-05-18T04:30:13.784Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/982ef4a4e5bab5b6e5b6becc8cd5e732f6130a78b855f0abec6439a9a135/watchfiles-1.2.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d20029a60a71a052a24c4db7673bc4de39ab89adbaccbfb5d67987c5d73f424d", size = 465140, upload-time = "2026-05-18T04:31:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0c/95282abf4ed680b6096010bcfc30c5fa7a041fc5aa5a2ad17a2cc6c75bba/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2cb93af48550faf1cea04c303107c8b75833de7013e57ce27d3b8d21d8d0f58c", size = 630259, upload-time = "2026-05-18T04:31:25.676Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/607c1de1530c4bdcf2cf1d1ecc2505ddba5d96bd43ba9f2b0e79876f850f/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2995c176de7692b86a2e4c58d9ec718f753150a979cb4a754e2b4ffa38e70906", size = 659859, upload-time = "2026-05-18T04:30:24.333Z" }, + { url = "https://files.pythonhosted.org/packages/fa/08/d9e2e0f9e8e6791d33aefc694ad7eefa7f901f63caff84a81ded38692f9c/watchfiles-1.2.0-cp312-cp312-win32.whl", hash = "sha256:7a2cffd17d27d2ecbb310c2b1d8174f222a5495b1a721894afa88ec11e25b898", size = 275480, upload-time = "2026-05-18T04:30:31.307Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e6/9d42569c0102645cc8cea5d8c7d8a1e9d4ada2cb7f05f75e554b8aa2202a/watchfiles-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f155b3a1b2a5fc89cdc70d47ee5d54e3b75e88efa34982028a35daef9ba00379", size = 288718, upload-time = "2026-05-18T04:32:10.745Z" }, + { url = "https://files.pythonhosted.org/packages/0a/26/88e0dc6ee3898169d7fa22bb6a69cabf2502d2ee25cb8c876d1262d204f8/watchfiles-1.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fa585ede612ee9f9e91b18bebf9ba11b9ae29a4e3a0d0cf6fca3e382133f0d5", size = 281026, upload-time = "2026-05-18T04:30:22.23Z" }, + { url = "https://files.pythonhosted.org/packages/d1/4d/70a7feced9f87e2ff26dba42667290f41694fc64646c67261fbb8cab5d5c/watchfiles-1.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:01ea8d66f0693b9b60a6541c8d10263091ca9a9060d242f3c1f3143f9aad2c98", size = 399730, upload-time = "2026-05-18T04:31:38.162Z" }, + { url = "https://files.pythonhosted.org/packages/31/3a/0da302f2307aee316922806ebd5726c542cbd787c938271cf14a074c7daf/watchfiles-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44", size = 392842, upload-time = "2026-05-18T04:30:27.051Z" }, + { url = "https://files.pythonhosted.org/packages/db/ef/d5bdb705c224dbc256aa0c1ec47bf4e61ec52558f2afb44a71a1fe4d7015/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658", size = 452989, upload-time = "2026-05-18T04:31:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/71/29/5495f2c1661949ef7a35e4d71111d129cfe7606414a26887a919d0a55406/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb", size = 458978, upload-time = "2026-05-18T04:30:52.606Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8c/7f9c07c433811c2fffd93e13fdfb7135de9aab5f2ae41be08960fa0047dc/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cb4d80e212f116474a545c21c912b445f16bb0cef9e6a73a498164223e14e2f", size = 490248, upload-time = "2026-05-18T04:31:36.003Z" }, + { url = "https://files.pythonhosted.org/packages/3c/11/d93632febc52fbc21be90231bb7c17fd5387f46c9076fd40a5f9c2ae6910/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0", size = 571847, upload-time = "2026-05-18T04:31:10.862Z" }, + { url = "https://files.pythonhosted.org/packages/55/b4/383173e73aabb07ad1d9c7aa859d95437ac46a6d6a1e11005facda0c9d19/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5", size = 465974, upload-time = "2026-05-18T04:30:17.006Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6c/89b1a230a78f57c52dd8893adb1f92f94411721b6ec12596c56d98c74356/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71", size = 454782, upload-time = "2026-05-18T04:30:35.656Z" }, + { url = "https://files.pythonhosted.org/packages/24/62/1732118367cfff0a9fce3bf62ff4bfded09ef5df21d9d446b858b3f70a96/watchfiles-1.2.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3", size = 465182, upload-time = "2026-05-18T04:30:20.846Z" }, + { url = "https://files.pythonhosted.org/packages/28/96/716f7e5f51339bf22963f3345f9f27d7f3b30e2eadc597e257c881dd3c53/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0", size = 629841, upload-time = "2026-05-18T04:31:05.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fe/c40783950fd771ccf66ab3ec2722d188a9af1c7f96c6e811f36e40c6e03f/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427", size = 658028, upload-time = "2026-05-18T04:31:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/71/72/4508db1856d1d87fcbb3b63f4839bab1b5682cb0e8d224d122263c09654a/watchfiles-1.2.0-cp313-cp313-win32.whl", hash = "sha256:eb283ee99e21ad6443c8cdb06ac5b34b1308c329cbdf03fa02b445363714c799", size = 275183, upload-time = "2026-05-18T04:30:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/f9/36/14b76ca57652e5cc5fd1c11f32a261292c08a0d19a00351013c2549cbfb2/watchfiles-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a0f27f01bee51861392bb6b7c4fdb290b27d1eb194e9e28788d68102a0e898d9", size = 288059, upload-time = "2026-05-18T04:32:07.937Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8d/0a85e395398d8d20fadfe5c5d32c726eee17a519e78fb356f2cf7531bffe/watchfiles-1.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:3651aa7058595e9cfb75d35dd5ada2bf9f48a5b8a0f3562821d3e210c507e077", size = 280186, upload-time = "2026-05-18T04:31:54.484Z" }, + { url = "https://files.pythonhosted.org/packages/37/68/36db056f1fdcc5f07302f56e631774d6835bcd6fa3ace402304621d5f9e5/watchfiles-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:faea288b6f0ab1902ef08f4ca6de005dccf856c4e0c4f21b8c5fce02d90a1b08", size = 399031, upload-time = "2026-05-18T04:30:44.576Z" }, + { url = "https://files.pythonhosted.org/packages/c1/64/01a9d6f66a82a5c101ce939274106cc72759d62427e153f01edd2b9f87c2/watchfiles-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9", size = 391205, upload-time = "2026-05-18T04:30:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/84/2c/0a44fe058cb4bb7b8ede6b6670698bbb7c0400740e378d00022189b7b31d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4", size = 451892, upload-time = "2026-05-18T04:32:14.005Z" }, + { url = "https://files.pythonhosted.org/packages/67/a1/351e0d56cd35e6488b5c8b4fb11a809a5bc923e8fe8fed9faf8920be0c89/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55", size = 458867, upload-time = "2026-05-18T04:31:22.279Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/9d09605187f1b838998624049fcf8bf47b73c1a3b76901fcac1782f62277/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f22943b7770483f6ea0721c6b11d022947a98eb0acae14694de034f4d0d38925", size = 490217, upload-time = "2026-05-18T04:31:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/60/5d/a17a16eccb182f04188cd308ec24b1a71a9b5c4e7098269cf35d9fa56d02/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4", size = 571458, upload-time = "2026-05-18T04:32:11.875Z" }, + { url = "https://files.pythonhosted.org/packages/d3/3d/4dd457062083ab1938e5dfd45032eb425cee2ac817287ca8ff4356183e5d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2", size = 464707, upload-time = "2026-05-18T04:30:43.492Z" }, + { url = "https://files.pythonhosted.org/packages/c6/71/ea8c57b128f5383de74d0c7d2d9c57ad7c9a65a930c451bd25d524b295b7/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9", size = 454663, upload-time = "2026-05-18T04:30:16.061Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/2e812bf938406d7db351f0703ddd3fc6c061cf30d96153a77bc79a943a44/watchfiles-1.2.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa", size = 463537, upload-time = "2026-05-18T04:31:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/86/56/d17a7f1dd1bc3035f1072694a551301272f1739c2d8e319c927cb9e29b38/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44", size = 629194, upload-time = "2026-05-18T04:31:14.141Z" }, + { url = "https://files.pythonhosted.org/packages/be/06/f1ff66bf5cae50aa4062779a0ecd0bbaf15e466195719074078947d9a17d/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72", size = 656194, upload-time = "2026-05-18T04:31:47.14Z" }, + { url = "https://files.pythonhosted.org/packages/e7/54/a9c7ea9a82a4ac65e7004c0a03920b5cdd2f9c3b678757d9cd425aa51d53/watchfiles-1.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b8c8358484d5fa12ef34f05b7f4168eaf1932f408725ff6d023c33ec17bd79d4", size = 400205, upload-time = "2026-05-18T04:32:05.153Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5d/c9ab3534374a4a67450696905d6ef16a04405448b8dc52bd752ae50423d4/watchfiles-1.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f04b092229ad2c50126dd3c922c8822e51e605993764a33058d4a791ab42281", size = 392508, upload-time = "2026-05-18T04:30:54.849Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/1ad30103535cf0cecd7b993e8d50edc5351b1820e38f2d22e3df58962feb/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7ce236284f002a156f70add88efe5c70879cccbb658be0822c54b1306fc09d", size = 452448, upload-time = "2026-05-18T04:30:53.727Z" }, + { url = "https://files.pythonhosted.org/packages/37/a1/ceee2cdf2afbd715fa07758d39c9859513eae411b23196f7fd039e5feedd/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9909cc2b48468b575eefa944919e1fe8a36c5849d5c7c168f80a8c1db69398e", size = 459605, upload-time = "2026-05-18T04:30:23.312Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/421e30fd1cb3907a84ed92ab3f1983e37ba2dca015e9a894a048418417a2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a37faaed405c67e28e6be45a1fa4f206ef5a2860f27c237db9fa30704c38242", size = 490757, upload-time = "2026-05-18T04:30:47.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/55ed1b97ed08be7bba6f9a541cac15f2a858e1d74d2b07b6da70a82aab00/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9649193aa27bd9ff2e80ff29bfaa93085496c7a3a377592823cc58b77ee88add", size = 568672, upload-time = "2026-05-18T04:30:38.915Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cf/d8ae8a80dd7bafab395ea7681c10237311bbf34d37704a8c744e7cf31fc7/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e4ff8e37f99cf1da89e255e07c9c4b37c214038c4283707bdec308cb1b0ea1f", size = 464197, upload-time = "2026-05-18T04:30:09.914Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8a/3076c496ca8dafe0e8cd03fcebdfc47be4b1174b4e5b24ff6e396e6b3af2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:054dc20fd2e3132b4c3883b4a00d72fd6e1f56fdaf89fccd12e8057d74cd74d7", size = 453181, upload-time = "2026-05-18T04:30:14.829Z" }, + { url = "https://files.pythonhosted.org/packages/e5/10/9745e17c98e7b8a86454df0a3c7b5686bd650383f1e9f26e4ebcbd6cc0c0/watchfiles-1.2.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e140ed30ebde76796b686e67c182cff10ea2fbab186fafd1560f74bb5a473a6e", size = 465109, upload-time = "2026-05-18T04:30:28.123Z" }, + { url = "https://files.pythonhosted.org/packages/8f/95/8ef4a95481d3e0cb52d62a06fa6e972e81424be2d9698b91a2fecca9904c/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:bb7e52ecf68ba46d22df23467b87cffeb2146908aa523ebfe803019618cfda06", size = 630653, upload-time = "2026-05-18T04:31:49.304Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e4/3b3bf36b0f829b50c6ebcb8d031583863c59f923d6a6af3d485e470d0fac/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23282a321c8baf9b3a3c4afff673f9fe65eb7fdc2338d765ccad9d3d1916a5ba", size = 657838, upload-time = "2026-05-18T04:31:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/6cbbb50c1f3002ab568777d44aa21206dfb8807a840990c4037523b51812/watchfiles-1.2.0-cp314-cp314-win32.whl", hash = "sha256:c0db965c5f79aa49fe672d297cf1febc5ad149b658594944f49a54a2b96270a7", size = 275108, upload-time = "2026-05-18T04:30:06.891Z" }, + { url = "https://files.pythonhosted.org/packages/92/45/190ce6db8dcb4536682cf75d3889ff1a27182a58cb519d343cb6d9ea63d8/watchfiles-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:71283b39fd17e5408eb123bd37aeecfd9d54c81fc184421943208aadb879d103", size = 288441, upload-time = "2026-05-18T04:32:12.901Z" }, + { url = "https://files.pythonhosted.org/packages/74/0d/3eae1c2313ab08378431d907c3f8095ecca00f3eda33111cf4f0f2591799/watchfiles-1.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:c5c19526f4e54a00f2666a6c0e9e40d582c09e865055ea7378bf0009aab857b3", size = 280684, upload-time = "2026-05-18T04:31:26.902Z" }, + { url = "https://files.pythonhosted.org/packages/b1/75/fb64e6c25d6b5ca636d03df34ffb1c6e9873303e76d27967e045f8df088f/watchfiles-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d73a585accffa5ae39c17264c36ec3166d2fad7000c780f5ef83b2722afb9dd2", size = 398857, upload-time = "2026-05-18T04:32:17.108Z" }, + { url = "https://files.pythonhosted.org/packages/73/4e/9f7adf01754cbf81843722ccfec169d8f26c69778281a302855cecd2ee08/watchfiles-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae99b14c5f21e026e0e9d96f40e07d8570ebee6cafd9d8fc318354606daa7a28", size = 392413, upload-time = "2026-05-18T04:31:07.911Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/bec626bcc2d69f44b9acb24ce7d60ed7b16b73628eea747fcbd169d8edda/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4429f3b105524a10b72c3a819b091c495d2811d419c1e1e8df773a5a5974f831", size = 452409, upload-time = "2026-05-18T04:31:20.142Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/b6362068e81e7c556d155a34c35d40ac3ef42d747b06d7f6e5bf58e359c2/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d818978d06062d9b22c4fab2ebe44cf5213d42dc8e62bda8c2760cfa2eeb33", size = 458827, upload-time = "2026-05-18T04:32:06.219Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/9a813fa42afb1e0b4625e75f0479826644d3ee8dc287e093799bc01f390c/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f732dc58b2dbe69e464ccf8fff7a03b0dd0be439da4c0720d3558527d3d6b4", size = 490104, upload-time = "2026-05-18T04:31:56.034Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bf/27dfb6094ca4c9aad21298b5525b6c53cb36121ee454331d05161e58d130/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f200104103feb097de4cab8fe4f5dd18a2026934c7dea98c55a2f5fd6d5a33b", size = 571360, upload-time = "2026-05-18T04:31:57.133Z" }, + { url = "https://files.pythonhosted.org/packages/fb/39/44a096d67270ea93df91d33877dbe91fbda3aa4f8ec2edf799d93eda8736/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ac26eefbf4af1741247d6fb68b11c49a25b2f7413fbd318a83a12aaa9cf666", size = 464644, upload-time = "2026-05-18T04:30:57.33Z" }, + { url = "https://files.pythonhosted.org/packages/0e/80/c7472203bad6268e3ef1ad260739704847898938ad7ea8b63a5131f46b50/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4997d4e4a55f0d02b6cde327322daf3a0400e5df6c6b15948994bf72497925", size = 454771, upload-time = "2026-05-18T04:30:48.736Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/3b10b268b4b7f0fc26e9debb5eef1998b515887840f444cd3ec80c688755/watchfiles-1.2.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4c887eba18b7945ac73067a8b4a66f21cd46c2539b2bc68588f7be6c7eb6d26b", size = 463494, upload-time = "2026-05-18T04:31:33.826Z" }, + { url = "https://files.pythonhosted.org/packages/3d/3e/a4302545cd589262a0dc7d140e86f7688eba3f9c72776c27f7e23b8864c4/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3416ff151bb6b5a8d8d11664974fbef4d9305b9b2957839ab5a270468fd8df30", size = 629383, upload-time = "2026-05-18T04:31:15.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/99/d5649df0a9a410d45b7c882304d0b790903ac9b6e8f2cfd12114e0c6b9f2/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:0e831a271c035d89789cffc386b6aa1375f39f1cd25eb7ca0997e4970d152fc5", size = 656093, upload-time = "2026-05-18T04:31:58.707Z" }, + { url = "https://files.pythonhosted.org/packages/92/b9/362702539275019a54dd2e94511b31a9b89c5f9e6a21966de7eb692549fc/watchfiles-1.2.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:37a6721cdf3f65dbb13aa9503510ccb4451603ac837e44d265d7992a597e1374", size = 400109, upload-time = "2026-05-18T04:31:16.879Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/71d5ba62db781e5587bded1d944c675374bc4aa37ff33d5018d98e8b6538/watchfiles-1.2.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2b37d10b5a63bd4d87e18472d80fa525bd670586fae62e5dd580452764879b65", size = 392167, upload-time = "2026-05-18T04:31:28.058Z" }, + { url = "https://files.pythonhosted.org/packages/3c/01/c66dd95d0423fe30d31820e2d1d5bda773764131bbb6ac0cb1cf303ac328/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a105bc2283f67e8fbec74253ec2d94925de92ed72c0393f1206bf326b7b7b69", size = 452372, upload-time = "2026-05-18T04:31:00.836Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/2fe99557e72f85627c6a8eed50d889e8d101623e060a22ad75b875cb932d/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5327989a465505f05cfe06f04fa9d0c2fd5432bb243e10e6f012b1bdca3c8579", size = 459596, upload-time = "2026-05-18T04:31:34.96Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/d4acfa0023367428ed48351b3b9b267893037b6cadae55620c61c24bcfd4/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecb47f183a8025b2aa18b546725c3657e542112ae9c0613a2af79b4fa8d04ad7", size = 490869, upload-time = "2026-05-18T04:31:59.923Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5f/3164cbdce06c9fb95c4f7b9e2f9760b5e2797af43a9ecc317ef42a23a278/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8520a4ab0e37f770afc34459c4f8f7019e153f9124dc101c15538365875d1ab2", size = 571641, upload-time = "2026-05-18T04:32:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/e6/85d3731c55e65cd7690f3f803d24c139588aaf863e4bf2148fe7a7fa1a19/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71cd71740ed2c15211ebb237ced4e39a1cdf6f80566e5fe95428da1626f4fde6", size = 464444, upload-time = "2026-05-18T04:30:34.298Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/562641012b8b09872742c3b8adf9629ec479fd78f8d68ae4a0c13da8add6/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f88af53d6ddaf72179ef613ddc905e6f4785f712b49b80b3bef9f3525e6194b4", size = 453593, upload-time = "2026-05-18T04:31:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/56/fe/cb8ef3d6f929d14158fdaaad9925985b7310abc9384dcd4d82dd0016fb59/watchfiles-1.2.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:cee9d5efd929efdac5f7e58f72b3376f676b64050a91c5b99a7094c5b2317488", size = 465096, upload-time = "2026-05-18T04:31:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/25/91/80908e835e100527a9267147b08c0eee1fa6ab0ffec15edc04d1d44885f7/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b718bf356bbc15e559bd8ef41782b573b8ae0e3f177ab244b440568d7ea02cfb", size = 630638, upload-time = "2026-05-18T04:30:49.89Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/95ab2f256bb4af3cb2eb23b9317bda984ee6e0f11733a5c004a6c95b06e3/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:922c0e019fe68b3ae392965a766b02a71ba1168c932cebc3733cd52c5fe5b377", size = 657684, upload-time = "2026-05-18T04:31:32.027Z" }, +] + +[[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 = "web-fragments" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/1c/938b2e2a7908937361dcaaeb7afe17ca0f1ca9e68c335c72820b772c5b24/web_fragments-4.0.0.tar.gz", hash = "sha256:e82488beb4e8666b9e37a10a81258142f404f4e1964b31d3010154896832f90b", size = 15590, upload-time = "2026-03-10T14:30:43.685Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/f8/28aa823f4a618481908bc3bb815e5961cc6e79682e7ceb568bcc4d6f10f4/web_fragments-4.0.0-py2.py3-none-any.whl", hash = "sha256:0d5f59c63b2ac5ee95f76f5904c2f20d0e83d6a1425680fcc676485b13f85d32", size = 15580, upload-time = "2026-03-10T14:30:41.406Z" }, +] + +[[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 = "webob" +version = "1.8.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "legacy-cgi", marker = "python_full_version >= '3.13' or (extra == 'group-4-ora2-dev' and extra == 'group-4-ora2-django42') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/f9/974eafebfd0bd442b8848899fe7d30675c93f750c313e1a6fe61acbde1e3/webob-1.8.10.tar.gz", hash = "sha256:1c963a11f307bc3f624fbab9dde737701eae255f32981b7a5486a88db1767c2b", size = 280796, upload-time = "2026-06-02T19:56:47.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/21/fce134877fb6fc6ad3c464e4a07ede0ee9219f705d26a981ae58ea36ca13/webob-1.8.10-py2.py3-none-any.whl", hash = "sha256:e68ad87fda378191081965ab02a185391c26e4e926adec855c3b0286a8369d49", size = 115825, upload-time = "2026-06-02T19:56:44.765Z" }, +] + +[[package]] +name = "websockets" +version = "16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/02/b9a097e1e16fee4e2fd1ec8c39f6a9c5d6257bae8fa12640caf869f54436/websockets-16.1.tar.gz", hash = "sha256:299468cbe42e2b9981134c7c51d99387d8a7bf562b00183b3eec53f882846dad", size = 182530, upload-time = "2026-07-10T06:32:57.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/52/748c014f07f4e0e170c8932de7e647a1511d5ab3049cd978797136aee577/websockets-16.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b6aa3f7ad345cf3862c21f4fbf2ef5e14d911348476c2845e137c091fe3a3f0b", size = 179798, upload-time = "2026-07-10T06:31:09.664Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5e/2a2e64d977d084e49d37c187c26c056daaff41965be7300cd5dbde6f8b07/websockets-16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b43fcfb521ac2f34ba80b7b8ea16303e4ad82dd8af667bf40839ad3a5d37b164", size = 177478, upload-time = "2026-07-10T06:31:11.072Z" }, + { url = "https://files.pythonhosted.org/packages/aa/12/5b85b4e75d697e548a94962ce5c036b05dd21cb9545759d555c5586422fc/websockets-16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2bd3e12cd9afbe2baedae0b1eeade8ba64329b60fe2f9abdc966bd10fd2c2ef5", size = 177746, upload-time = "2026-07-10T06:31:12.386Z" }, + { url = "https://files.pythonhosted.org/packages/9d/62/79b1c8f0cee0da648b4899e1c5b0dbd3aa59846985136a54854db6827ab4/websockets-16.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f41979c8623df9bd30d949d82010a8fda5c56ff12cd8508a5b7272b6d4b53a", size = 187345, upload-time = "2026-07-10T06:31:13.754Z" }, + { url = "https://files.pythonhosted.org/packages/25/34/b7c5c52c2f24280e1c017acb7ad491a566750a5cceca7f3cf999373bba21/websockets-16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a24d1f35aef07d794a16c853c688e74956c50239bec37b4f2de080056046419b", size = 188581, upload-time = "2026-07-10T06:31:15.075Z" }, + { url = "https://files.pythonhosted.org/packages/bc/37/604193bebcbeffe96fdf795960b83a15d600880c64dc17ec9c31c5b3427d/websockets-16.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c64c024ddf7a35331b21fcddb562a039c275d2c82e8c2d12939e7da23997270", size = 191362, upload-time = "2026-07-10T06:31:16.395Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b4/5ee27575b367d7110d4d13945e2a9de067ec84dc71e54b87f01e38550d9a/websockets-16.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3e99757f5baafe20fc598e202ea6f5b0b265186ad38d0a17bd8beca16296955", size = 189216, upload-time = "2026-07-10T06:31:17.776Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/3e2dcc78d85fc5d9d814895ce6d07d0dfacc0f6aaa1d151f2b8c8d772299/websockets-16.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:353f3bc6e058ac1ccab4b3588e8598837a8c04cfc8351233e6d523be675d844c", size = 187971, upload-time = "2026-07-10T06:31:19.152Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2f/cd271717b93d5ee19626cb5e38a85baab745c86e33db7c31a3ac729b31b8/websockets-16.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0352f5b38b40e857b6428d468fa21dbb4dd4a567d933c26d9831b4efe1b92f43", size = 185381, upload-time = "2026-07-10T06:31:20.665Z" }, + { url = "https://files.pythonhosted.org/packages/78/91/6ad6f2f1426317b5001bd490534208c7360636b35bac1dec2e0c22bfc40e/websockets-16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70bd789afab579602968c39f21cb925466505f3edff22f0ae852bca54978a4f9", size = 188015, upload-time = "2026-07-10T06:31:22.024Z" }, + { url = "https://files.pythonhosted.org/packages/c7/6d/533733132ab4c07540efd4a8f0b9a435d3a5059b2f26cc476ace1abf7f45/websockets-16.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d0fb4b46f121eccd539353baebd1083a8767a9a351109453d1d1caecd1ba40c2", size = 186619, upload-time = "2026-07-10T06:31:23.376Z" }, + { url = "https://files.pythonhosted.org/packages/08/73/16c059f3d73b3331eba10793704afa4faa9939234fb08ef7dca35794e8f0/websockets-16.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c14b6634af01541e4efe2954fd8f263386f7aa6d37c01e55dd8109fd17661452", size = 188497, upload-time = "2026-07-10T06:31:25.024Z" }, + { url = "https://files.pythonhosted.org/packages/4d/89/9a8fae7dd2acdcfb1a8844c29fe42b518a04b64fce38a0923b6290e452f1/websockets-16.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a58532c49a851bcb481e58c1be23b315c17fe2fbbed509d75aeea12f543d2c15", size = 186051, upload-time = "2026-07-10T06:31:26.291Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/b240c7dd6a0e0c59c1f68377cc3015263521080c327c15f5e753c1f6d378/websockets-16.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4e969170c3b08e1d8dabd990fef1fa702c4233aeaabec33f871806e444f6a0e4", size = 187029, upload-time = "2026-07-10T06:31:27.605Z" }, + { url = "https://files.pythonhosted.org/packages/50/35/524e3fac40e47d6fdcf6c4b2c95ef1bc8a97e01593c90eff86621df7b716/websockets-16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff9b000064b88787ba9f7a3cb2af2b68a658ca5aad76458a46469e7124b678a0", size = 187308, upload-time = "2026-07-10T06:31:28.927Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/56840cf62c8859af6ba22b9529da937332468c80f32b598753e8a66d3990/websockets-16.1-cp312-cp312-win32.whl", hash = "sha256:b9f5d83f80f4d7c4bba6d97f3755ac05850c784dce0fd2ab371c4e41172f53ff", size = 180161, upload-time = "2026-07-10T06:31:30.316Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ff/87eb9eb44cb62424a8d729834f2b0515a47e2669fabec29820268f4d50a1/websockets-16.1-cp312-cp312-win_amd64.whl", hash = "sha256:6852c9f653966c16109d3b6f31181fd734f7914927e3f0fa1117af7a18c9aa21", size = 180462, upload-time = "2026-07-10T06:31:31.708Z" }, + { url = "https://files.pythonhosted.org/packages/d9/63/df158b155420b566f025e75613424ad9649a24bcb0e9f259321ab3d58bea/websockets-16.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b0232ed141cec3df2af5a3959a071c51f40036336b0d37e17faf9ef52fc73e47", size = 179791, upload-time = "2026-07-10T06:31:33.108Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/00fe9414dfeafa6fe54eae9f5716c8c8e9ac59d192be3b893c096d395846/websockets-16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a71b73d143991714144e159f767b698f03c4a70b8a65ae1733b650cff488045b", size = 177472, upload-time = "2026-07-10T06:31:34.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/76/b10633424d40681b4e892ffd08ca5226322b2426e62d4ab71eae484c3a32/websockets-16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:187323204c3b2fc465e8fc2609e60437c521790cb9c1acb49c4c452a33e57f37", size = 177737, upload-time = "2026-07-10T06:31:35.964Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/d3bb03b2229bb1afd72008742d586cf1ea240dce64dd48c71c8c7fd3294c/websockets-16.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9dba74233c8c3ce368850818c98354dad2570f57231b3fd3bd00d7aa57628881", size = 187403, upload-time = "2026-07-10T06:31:37.496Z" }, + { url = "https://files.pythonhosted.org/packages/26/16/cc2e80478f688fc3c39c67dc1fac6a0783858058914ebc2489917462cb42/websockets-16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63339bc8c63c86a463177775cb7c677691f5bcfac7b3b2f01b286d42acd41600", size = 188639, upload-time = "2026-07-10T06:31:38.86Z" }, + { url = "https://files.pythonhosted.org/packages/15/d6/ad87b2507e57de1cbf897a56c963f2925962ed5e85fbe06aaa83ced27acd/websockets-16.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23e545ea8ae4263e37cdfd4e22a217f519e48e432728bc461185bbf585f38a83", size = 190078, upload-time = "2026-07-10T06:31:40.218Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1a/5b37b3fd335d5811f29fc829f2646a3e6d1463a4bf09c3100708684c766e/websockets-16.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2237081454846fb40403a80ba86d82e2038b9c45865ab96af0abe7d002a91045", size = 189267, upload-time = "2026-07-10T06:31:41.523Z" }, + { url = "https://files.pythonhosted.org/packages/42/98/06afc33e9450d4230f94c664db78875d90f5f6a5fb77f0bc6ec15ae74e1c/websockets-16.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5f5218de1ed047385ca53744caba9435d65f75d008364970a3fae95a05812cf9", size = 188022, upload-time = "2026-07-10T06:31:42.838Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/42fef5d5887c18cf2d148b02debf56cecb9cfbffc68027cde9b12c8f432c/websockets-16.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75c98e3920039d0edff03b74478ada504b7ce3a1bc406db2cabfca84320f7baf", size = 185435, upload-time = "2026-07-10T06:31:44.219Z" }, + { url = "https://files.pythonhosted.org/packages/a0/9b/8021c133add5fe40ed40312553a6cd1408c069d7efe3444ad483d4973ed3/websockets-16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1facd189d8190af30487a55b4c3688484dd50801628a3b5b2ccd26db08e67057", size = 188080, upload-time = "2026-07-10T06:31:45.986Z" }, + { url = "https://files.pythonhosted.org/packages/69/54/1e37384f395eaa127383aab15c1c45e200890a7d7b99db5c312233d193e0/websockets-16.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cc0c6a6eef613c7da32d4fb068f82ef834b58134f6a16b54e6c1e5bf9529ab3d", size = 186678, upload-time = "2026-07-10T06:31:47.449Z" }, + { url = "https://files.pythonhosted.org/packages/68/79/1caeacab5bc2081e4519288d248bc8bd2de30652e6eaa94be6be09a1fe5b/websockets-16.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ad9411eded8988b879be6038206698bf7106c85a78f642c004485bcb95be17eb", size = 188554, upload-time = "2026-07-10T06:31:48.886Z" }, + { url = "https://files.pythonhosted.org/packages/ee/83/b3dca5fad71487b726e31cb0acf56f226792c1cc34e6ab18cbf146bd2d74/websockets-16.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:cd68f0914f3b64694895bc5e9b14e8b447e41d7bf5ffaf989bb8dcb5e2dfdce7", size = 186109, upload-time = "2026-07-10T06:31:50.508Z" }, + { url = "https://files.pythonhosted.org/packages/5b/0b/8f246c3712f07f207b52ea5fb47f3b2b66fafec7303162644c74aed51c6a/websockets-16.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fef2debfe7f7ebdda12176f26166f95b7af17af05ba06150fcf889032e0213e9", size = 187061, upload-time = "2026-07-10T06:31:51.861Z" }, + { url = "https://files.pythonhosted.org/packages/47/eb/27d6c92a01696b6495386af4fc941d7d0a13f2eab2bf9c336111d7321491/websockets-16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3cd6c9b798218798f4bb7b2e71c38f0e744bb94ca537b13376f88019d46384d", size = 187347, upload-time = "2026-07-10T06:31:53.246Z" }, + { url = "https://files.pythonhosted.org/packages/6b/d5/eeee439921f55d5eaeabcea18d0f7ce32cdc39cb8fc1e185431a094c5c7b/websockets-16.1-cp313-cp313-win32.whl", hash = "sha256:84c170c6869633536921e4474b1cce7254c0c9b0053ef5725f966cee47e718e4", size = 180149, upload-time = "2026-07-10T06:31:55.058Z" }, + { url = "https://files.pythonhosted.org/packages/a3/03/971e98d4a4864cf263f9e94c5b2b7c9a9b7682d77bfbba4e732c55ee85a9/websockets-16.1-cp313-cp313-win_amd64.whl", hash = "sha256:bef52d327d70fa75dad93ee61ea2cb1d1489aca9f35c188833563f5a3b4df0a5", size = 180458, upload-time = "2026-07-10T06:31:56.767Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e6/da1dc11507f8118145a81c751fe0c77e5e1c11b8554496addb39389e2dc2/websockets-16.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f881fca0a45dd6789939bd6637cd98169b92f1c3fdc78262f2cb9ec2cb1f324e", size = 179833, upload-time = "2026-07-10T06:31:58.19Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ac/c0d46f62e31e232487b2c123bc3cfd9a4e45684ca7dc0c37f0987f29baae/websockets-16.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:30c379d5b207d3a7f0ba4c2e4602a895b0bcc63fb5f5371a4ae7fbddb03b672b", size = 177524, upload-time = "2026-07-10T06:31:59.563Z" }, + { url = "https://files.pythonhosted.org/packages/4a/33/abd966074b34a51e4f134e0aaed80f5a4a0a35163ea5ac58a1bc5a076d23/websockets-16.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:98ab58a4faa72b46da0127ccc1931dcbfc0985b0778892300a092185910c4cbe", size = 177743, upload-time = "2026-07-10T06:32:00.959Z" }, + { url = "https://files.pythonhosted.org/packages/ea/30/646e47b8a8dff04e227bdab512e6dde60663a647eeac7bbd6edddd92bbc5/websockets-16.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e9c4e369fc181b2d41a99e01477215cecdc8546a39f7d41a59cc0a7065a0b09", size = 187474, upload-time = "2026-07-10T06:32:02.54Z" }, + { url = "https://files.pythonhosted.org/packages/d2/72/890ab9d77494af93ea65268230bfbc0a90ba789401ed7a44356a44785644/websockets-16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0704df094b2d5fa7f6f410925a594c2a5c9a09167731a76292e5410934208209", size = 188717, upload-time = "2026-07-10T06:32:04.156Z" }, + { url = "https://files.pythonhosted.org/packages/d5/aa/baedbbaa6bf9ed6029617ed5e8976535bd805f483ca9b3484e7ad9ee08bf/websockets-16.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b22b1f4950f6ab7126623329c3b47b3b90a14c05db517f2db2a026ad6c928352", size = 190090, upload-time = "2026-07-10T06:32:05.822Z" }, + { url = "https://files.pythonhosted.org/packages/52/4f/d813ec94e18002571ef4959d87a630eff6e01b72a51bcb0832b75ae8c51a/websockets-16.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1ae4a686a662964a6671069f84f7f908cc3475e782227726b0c622c715962105", size = 189320, upload-time = "2026-07-10T06:32:07.223Z" }, + { url = "https://files.pythonhosted.org/packages/b8/3c/8ec52a6662f3df64090fba28cd521d405d54759268d8e820477037e8c80d/websockets-16.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:856bdd638f8277f86465057bfdd4da097c73058fb0f9d2bd5baea29e2bf2d367", size = 188068, upload-time = "2026-07-10T06:32:08.586Z" }, + { url = "https://files.pythonhosted.org/packages/96/7f/f0ae6042b14f86fa5f996c6563ea4cf107adc036ccbedc9d4f418d0095f9/websockets-16.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9003a1fde1c21a322a3ca3fa0c4bda8c639da81dbc925162766086643b05ba87", size = 185493, upload-time = "2026-07-10T06:32:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/89/ad/5ffc53af9939c49fd653d147fa5b8f78ced1f6bce6c49a7446860945b0ce/websockets-16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39e947b1f5fdab045174306e3916785bf3ed537648acc1549827c08c33b10953", size = 188141, upload-time = "2026-07-10T06:32:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/67/62/729206c0ee577a4db8eae6dd06e0eef725a1287c6df11b2ef831d003df31/websockets-16.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5dd0e666b5931c0509cf65714686a1c5126771e663a79ac5d40da4f58b1f9502", size = 186653, upload-time = "2026-07-10T06:32:12.845Z" }, + { url = "https://files.pythonhosted.org/packages/1b/86/e8806a99ec4589914f255e6b658853fe537bf359c05e6ba5762ad9c27917/websockets-16.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a0285df7925657ad65a65fb8dc330808bce082827538fd50ef45fa12d1fc5bca", size = 188614, upload-time = "2026-07-10T06:32:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/89/38/ac554e2fc6ff0b8deeff9798b92e7abd8f99e2bd9731532e7033de208220/websockets-16.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:82d1c2cab3c133e9d059b3a5420bed9376bd30e21c185c63dda4ddadf6ddda47", size = 186165, upload-time = "2026-07-10T06:32:15.626Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c5/4ef4d8e53342f94f3c49e1ae089b32c1e8b3878e15e0022c7708c647f351/websockets-16.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c39907f1eaf11f6277def65aa02d68f30576b693d0c1ca332aafa3caa723ac6d", size = 187119, upload-time = "2026-07-10T06:32:17.114Z" }, + { url = "https://files.pythonhosted.org/packages/3a/33/4788b1dd417bd97eeb2698af3b9df6775ac656f96e9987da0419a067602f/websockets-16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:45c5ea55446171949eb99fd34b771ceddd511ca21958d40d0197ced33159e5ee", size = 187411, upload-time = "2026-07-10T06:32:18.629Z" }, + { url = "https://files.pythonhosted.org/packages/30/38/00d37aad6dc3244ce349e2864815362e50b3cfc00cac28d216db20efe40f/websockets-16.1-cp314-cp314-win32.whl", hash = "sha256:b8ef8b1c8d6bd029a475ac432e730fba2dfd456715d26c473e2a82291024b99c", size = 179822, upload-time = "2026-07-10T06:32:20.233Z" }, + { url = "https://files.pythonhosted.org/packages/9d/37/2a8cb0eaddee5eaebda47a90a3ba0898d1ce3d866b02a4857fea17d82e5b/websockets-16.1-cp314-cp314-win_amd64.whl", hash = "sha256:7358ff21632b5d062707f73e859c824f1c3807e73d8ca25e71caca7c4cdcf145", size = 180167, upload-time = "2026-07-10T06:32:21.749Z" }, + { url = "https://files.pythonhosted.org/packages/07/5a/262ad5fcaef4198997b165060f09a63f861e76939b1786ab546ccc3f8120/websockets-16.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d0f38f4c3e9b359e257c339c2cc1967ccaeedb102e57c1c986bdce4bf4f32268", size = 180166, upload-time = "2026-07-10T06:32:23.278Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c7/36377db690f4292826e4501a6dec2801dc55fd1cf0405923b04937e478df/websockets-16.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:3c3d2cbd1602593bad49bd86fa3fbb25407d87a3b4bf8857c0ac5ac4914e1901", size = 177697, upload-time = "2026-07-10T06:32:25.164Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c7/07171abce1e39799a76f473608580fe98bd43a1230f5146159622c02bccf/websockets-16.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:36069b74671e7e667f48a7484249f84c45a825a134c8b1bdc01875d0daa10d79", size = 177902, upload-time = "2026-07-10T06:32:26.564Z" }, + { url = "https://files.pythonhosted.org/packages/14/17/c831f48e250bc4749f57c00dcce73337c41cd32f6d59a64567b84e782601/websockets-16.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:587f83c2ce8a5d628e166384d77fa7f0ac69b9007d515ab442123e6615aa8da3", size = 187766, upload-time = "2026-07-10T06:32:27.981Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2e/4dfe63e245b0ecfaf470cf082d25c6ce35808159135fd88c82653a6b11ab/websockets-16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6db7972d52bc1b66cefe2246902e256cbaebc9ba8a45eac09343d7eb6671b2", size = 188939, upload-time = "2026-07-10T06:32:29.365Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e5/5faf65aebd9562f6b4bc473d24ce38cc56f84eb5f5bee66ed9b86733f93c/websockets-16.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e7d6014888a0632e1ed7a4095248bb3095232999447f2d83bfb1900987dd9ed9", size = 191081, upload-time = "2026-07-10T06:32:30.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/cd/2634f2f2c0556c1aae6501ed6840019cc569dd6fdbcac6494378daea4dc0/websockets-16.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9cb074d150e4ad2a77aa8a332c2be85f3f64f2681519d2570c1225c12c9821ff", size = 189513, upload-time = "2026-07-10T06:32:32.399Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/2c700b51196104f09715b326b1f092ed25326bdf79a03e00a4842e503743/websockets-16.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d19c9067e1fe9490f974bffbc0e443b80a7674c5efb4980c429cc00771f07c5a", size = 188240, upload-time = "2026-07-10T06:32:33.897Z" }, + { url = "https://files.pythonhosted.org/packages/f1/20/86283636e499a1a357fa9441f690ba34f255e731f2fea174132b3b762b57/websockets-16.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d440ff0c6c7469ad59c0a412c383c235935b43635e89425e3f6a0c36de90c31b", size = 185955, upload-time = "2026-07-10T06:32:35.279Z" }, + { url = "https://files.pythonhosted.org/packages/91/23/d7fb734b0095d43bc7f1c9f68afd50adb4176e7e513403e8c70ad7daa4fa/websockets-16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8613129a2533f08de24505e69a3e403cedaadae49abdb043c4d170ca71b7e4bd", size = 188491, upload-time = "2026-07-10T06:32:36.673Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5e/168a192689db468405ecf3b8e4a2c18811936b0724d017ad7e6d252734f0/websockets-16.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:a5bf9c23f197b4ec88290fd5463f33db67362a1bb10f85fc2e8e7627f0ddab97", size = 186983, upload-time = "2026-07-10T06:32:38.207Z" }, + { url = "https://files.pythonhosted.org/packages/7e/9b/66795fa91ebe49019ebe4fa910282172252e37046b80e08fc52e0c365150/websockets-16.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:520b0fd0395f075febb283c76755af724ab9fd19dffa4f3bfd18cb4e622790a3", size = 188890, upload-time = "2026-07-10T06:32:39.545Z" }, + { url = "https://files.pythonhosted.org/packages/5a/32/126bbc844be5afb3613fd43211dac10a9645f4cf39741d04acaa2ec7030c/websockets-16.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:7143aa09a67e1c013be44e81a88dfe90fc6244198ab86c7edd064152cf619805", size = 186583, upload-time = "2026-07-10T06:32:41.038Z" }, + { url = "https://files.pythonhosted.org/packages/22/b9/0b5db9cbcf6e4970db4496893244a8d92e07f71a8ef27cf34b08aa02fef1/websockets-16.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:7acb811fad08e611755800d1560e395c67e11a6bd563598ea6abb319afb86938", size = 187353, upload-time = "2026-07-10T06:32:42.501Z" }, + { url = "https://files.pythonhosted.org/packages/99/2e/254b2131a10d831b76e2c18dfe7add9729c6292c674a8085bf8de01ad151/websockets-16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c5cf88e3faa2f7931bc6baeee7599c97656a3f6ac7f831f4fccba233e141783a", size = 187784, upload-time = "2026-07-10T06:32:43.929Z" }, + { url = "https://files.pythonhosted.org/packages/21/dc/e7288aa8e3ac5a88a0924619984d663c1abf2a87d0ea98290c66fdaee0ec/websockets-16.1-cp314-cp314t-win32.whl", hash = "sha256:589f8842521c8307684ce0b40ce4ad70c5e0aa46484c6f1225a94ef4b8970341", size = 179947, upload-time = "2026-07-10T06:32:45.495Z" }, + { url = "https://files.pythonhosted.org/packages/d3/de/37edf1260ff0fbbd2f82433489c4cfbe799ac2ff21355331609879329fe6/websockets-16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c0e0857c30bbbc2bb5c30687508f0b7ec19aa026cd9f2ff8424d0fee42dcc07", size = 180291, upload-time = "2026-07-10T06:32:47.119Z" }, + { url = "https://files.pythonhosted.org/packages/66/58/bd83247f39ddc26ffc2c24eb05087a3b749e00cb4509fc6d19daa23c8495/websockets-16.1-py3-none-any.whl", hash = "sha256:c5149dfe490ec7e5ee5dbf624c642fb725f93a5575c7f00ab594ca9eddb8dd81", size = 174031, upload-time = "2026-07-10T06:32:56.079Z" }, +] + +[[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 = "xblock" +version = "6.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "edx-opaque-keys" }, + { name = "fs" }, + { name = "lxml" }, + { name = "mako" }, + { name = "markupsafe" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "simplejson" }, + { name = "webob" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/0a/70f58314d7521c869b86bd7a782175454a3de8fd3004f7472264f77e3651/xblock-6.3.1.tar.gz", hash = "sha256:76145cae4f5d9a97b23b1f3ac8eb7bc2faa02eb85020b8bcf3612cbf68dd26c2", size = 1192789, upload-time = "2026-07-08T12:56:36.292Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/d1/7a1a2ce6535f04bec3379e9c1e18698d28ad4dd83c34a979719787c3b772/xblock-6.3.1-py3-none-any.whl", hash = "sha256:60f015d67da48f501ae96af9b02f7763afd811f118225e3bcd4d20f3f01f8663", size = 160349, upload-time = "2026-07-08T12:56:34.995Z" }, +] + +[[package]] +name = "xblock-sdk" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cookiecutter" }, + { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-django42'" }, + { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-4-ora2-dev' or extra != 'group-4-ora2-django42' or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-doc') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-quality') or (extra == 'group-4-ora2-django42' and extra == 'group-4-ora2-test')" }, + { name = "fs-s3fs" }, + { name = "lxml" }, + { name = "pypng" }, + { name = "requests" }, + { name = "simplejson" }, + { name = "web-fragments" }, + { name = "webob" }, + { name = "xblock" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/1b/b09720b739d71ecb3021b8220726697db310cd6146f024f05f2ab53d8d08/xblock_sdk-0.14.0.tar.gz", hash = "sha256:fa62dd5e0c23539030edfb4b86c509a7c6d5fa84923a97836b141f20bdd8f62d", size = 233295, upload-time = "2026-03-27T12:16:59.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/5b/83c6b25840a180eaea0658e5a8d5e604d81eb6fc2f06f036c57a970af99e/xblock_sdk-0.14.0-py2.py3-none-any.whl", hash = "sha256:0ec0d3bd6ebdbde4893941ea3c7252df0227353c329749e70baac6e9dc5622fc", size = 242343, upload-time = "2026-03-27T12:16:58.048Z" }, +] + +[[package]] +name = "xmltodict" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/70/80f3b7c10d2630aa66414bf23d210386700aa390547278c789afa994fd7e/xmltodict-1.0.4.tar.gz", hash = "sha256:6d94c9f834dd9e44514162799d344d815a3a4faec913717a9ecbfa5be1bb8e61", size = 26124, upload-time = "2026-02-22T02:21:22.074Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/34/98a2f52245f4d47be93b580dae5f9861ef58977d73a79eb47c58f1ad1f3a/xmltodict-1.0.4-py3-none-any.whl", hash = "sha256:a4a00d300b0e1c59fc2bfccb53d7b2e88c32f200df138a0dd2229f842497026a", size = 13580, upload-time = "2026-02-22T02:21:21.039Z" }, +] diff --git a/webpack.dev.config.js b/webpack.dev.config.js index 4a50231823..d9b32596a3 100644 --- a/webpack.dev.config.js +++ b/webpack.dev.config.js @@ -88,15 +88,15 @@ config = mergeWithRules({ Object.assign(config, { entry: { - 'openassessment-lms': path.resolve(process.cwd(), 'openassessment/xblock/static/js/src/lms_index.js'), - 'openassessment-studio': path.resolve(process.cwd(), 'openassessment/xblock/static/js/src/studio_index.js'), - 'openassessment-rtl': path.resolve(process.cwd(), 'openassessment/xblock/static/sass/openassessment-rtl.scss'), - 'openassessment-ltr': path.resolve(process.cwd(), 'openassessment/xblock/static/sass/openassessment-ltr.scss'), - 'openassessment-editor-textarea': path.resolve(process.cwd(), 'openassessment/xblock/static/js/src/lms/editors/oa_editor_textarea.js'), - 'openassessment-editor-tinymce': path.resolve(process.cwd(), 'openassessment/xblock/static/js/src/lms/editors/oa_editor_tinymce.js'), + 'openassessment-lms': path.resolve(process.cwd(), 'src/openassessment/xblock/static/js/src/lms_index.js'), + 'openassessment-studio': path.resolve(process.cwd(), 'src/openassessment/xblock/static/js/src/studio_index.js'), + 'openassessment-rtl': path.resolve(process.cwd(), 'src/openassessment/xblock/static/sass/openassessment-rtl.scss'), + 'openassessment-ltr': path.resolve(process.cwd(), 'src/openassessment/xblock/static/sass/openassessment-ltr.scss'), + 'openassessment-editor-textarea': path.resolve(process.cwd(), 'src/openassessment/xblock/static/js/src/lms/editors/oa_editor_textarea.js'), + 'openassessment-editor-tinymce': path.resolve(process.cwd(), 'src/openassessment/xblock/static/js/src/lms/editors/oa_editor_tinymce.js'), }, output: { - path: path.resolve(process.cwd(), 'openassessment/xblock/static/dist'), + path: path.resolve(process.cwd(), 'src/openassessment/xblock/static/dist'), }, optimization: {}, plugins: [ @@ -110,7 +110,7 @@ Object.assign(config, { filename: '[name].css', }), new webpack.ProvidePlugin({ - Backgrid: path.resolve(path.join(__dirname, 'openassessment/xblock/static/js/lib/backgrid/backgrid')), + Backgrid: path.resolve(path.join(__dirname, 'src/openassessment/xblock/static/js/lib/backgrid/backgrid')), }), ...process.env.WEBPACK_SERVE ? [new WebpackManifestPlugin({ seed: { @@ -122,6 +122,6 @@ Object.assign(config, { ], }); -config.resolve.modules = ['node_modules', path.resolve(__dirname, 'openassessment/xblock/static/js/src')]; +config.resolve.modules = ['node_modules', path.resolve(__dirname, 'src/openassessment/xblock/static/js/src')]; module.exports = config; diff --git a/webpack.prod.config.js b/webpack.prod.config.js index 1ac5c9e957..2ea7f4208b 100644 --- a/webpack.prod.config.js +++ b/webpack.prod.config.js @@ -88,12 +88,12 @@ config = mergeWithRules({ Object.assign(config, { entry: { - 'openassessment-lms': path.resolve(process.cwd(), 'openassessment/xblock/static/js/src/lms_index.js'), - 'openassessment-studio': path.resolve(process.cwd(), 'openassessment/xblock/static/js/src/studio_index.js'), - 'openassessment-rtl': path.resolve(process.cwd(), 'openassessment/xblock/static/sass/openassessment-rtl.scss'), - 'openassessment-ltr': path.resolve(process.cwd(), 'openassessment/xblock/static/sass/openassessment-ltr.scss'), - 'openassessment-editor-textarea': path.resolve(process.cwd(), 'openassessment/xblock/static/js/src/lms/editors/oa_editor_textarea.js'), - 'openassessment-editor-tinymce': path.resolve(process.cwd(), 'openassessment/xblock/static/js/src/lms/editors/oa_editor_tinymce.js'), + 'openassessment-lms': path.resolve(process.cwd(), 'src/openassessment/xblock/static/js/src/lms_index.js'), + 'openassessment-studio': path.resolve(process.cwd(), 'src/openassessment/xblock/static/js/src/studio_index.js'), + 'openassessment-rtl': path.resolve(process.cwd(), 'src/openassessment/xblock/static/sass/openassessment-rtl.scss'), + 'openassessment-ltr': path.resolve(process.cwd(), 'src/openassessment/xblock/static/sass/openassessment-ltr.scss'), + 'openassessment-editor-textarea': path.resolve(process.cwd(), 'src/openassessment/xblock/static/js/src/lms/editors/oa_editor_textarea.js'), + 'openassessment-editor-tinymce': path.resolve(process.cwd(), 'src/openassessment/xblock/static/js/src/lms/editors/oa_editor_tinymce.js'), }, optimization: {}, plugins: [ @@ -107,7 +107,7 @@ Object.assign(config, { filename: '[name].[chunkhash].css', }), new webpack.ProvidePlugin({ - Backgrid: path.resolve(path.join(__dirname, 'openassessment/xblock/static/js/lib/backgrid/backgrid')), + Backgrid: path.resolve(path.join(__dirname, 'src/openassessment/xblock/static/js/lib/backgrid/backgrid')), }), new WebpackManifestPlugin({ seed: { @@ -117,7 +117,7 @@ Object.assign(config, { ], }); -config.resolve.modules = ['node_modules', path.resolve(__dirname, 'openassessment/xblock/static/js/src')]; -config.output.path = path.resolve(process.cwd(), 'openassessment/xblock/static/dist'); +config.resolve.modules = ['node_modules', path.resolve(__dirname, 'src/openassessment/xblock/static/js/src')]; +config.output.path = path.resolve(process.cwd(), 'src/openassessment/xblock/static/dist'); module.exports = config; From 75c4e0a230ff5e7c70053f78bcfc1496461852f0 Mon Sep 17 00:00:00 2001 From: salmannawaz Date: Thu, 17 Sep 2026 16:39:04 +0500 Subject: [PATCH 2/7] fix: fix coverage omit path for runtime_imports in src layout The omit pattern 'openassessment/runtime_imports/*' no longer matches 'src/openassessment/runtime_imports/*' after the src layout migration. Use '*/runtime_imports/*' to match regardless of path prefix. Co-Authored-By: Claude Sonnet 4.6 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f65f84cd65..c7ab241347 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,7 +89,7 @@ omit = [ "*/migrations/*", "*/__pycache__/*", "*/settings.py", - "openassessment/runtime_imports/*", + "*/runtime_imports/*", ] [tool.coverage.report] From 45c183817d37517add360b43dd365d2fd64a7b90 Mon Sep 17 00:00:00 2001 From: salmannawaz Date: Thu, 17 Sep 2026 16:54:38 +0500 Subject: [PATCH 3/7] fix: fix pytest coverage path and omit patterns for src layout - Change --cov target from 'openassessment' to 'src/openassessment' so pytest-cov finds the package after the src layout migration - Add 'build' to norecursedirs to prevent stale build artifacts from being collected by pytest - Remove */tests/*, */__pycache__/*, */settings.py from coverage omit to match original .coveragerc behaviour; omitting in-package test files (100% covered) was artificially lowering the project coverage % Co-Authored-By: Claude Sonnet 4.6 --- pyproject.toml | 3 --- pytest.ini | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c7ab241347..8f57d3b983 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,10 +85,7 @@ exclude = ["*.tests", "*.tests.*"] branch = true source_pkgs = ["openassessment"] omit = [ - "*/tests/*", "*/migrations/*", - "*/__pycache__/*", - "*/settings.py", "*/runtime_imports/*", ] diff --git a/pytest.ini b/pytest.ini index 0d1541bac5..6ea822e186 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,6 +1,6 @@ [pytest] -addopts = --ds=settings.base --cov openassessment --cov-report term-missing --cov-report xml -norecursedirs = .* docs requirements edx-ora2 +addopts = --ds=settings.base --cov src/openassessment --cov-report term-missing --cov-report xml +norecursedirs = .* build docs requirements edx-ora2 filterwarnings = ignore:.*Passing an id_generator directly is deprecated in favor of constructing the Runtime with the id_generator.* ignore::xblock.fields.ModifyingEnforceTypeWarning From 51a001446a35faa8754a6fc4f1bd4e5926cd94a1 Mon Sep 17 00:00:00 2001 From: salmannawaz Date: Thu, 17 Sep 2026 16:55:27 +0500 Subject: [PATCH 4/7] build: update uv.lock with new doc dependency group packages Adds lock entries for build, doc8, twine and their transitive dependencies introduced in the doc dependency group. Co-Authored-By: Claude Sonnet 4.6 --- uv.lock | 250 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 247 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 7b1f5afd24..aa72b4437b 100644 --- a/uv.lock +++ b/uv.lock @@ -212,6 +212,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/32/405d01c0bcd9deab0d3744894a328ce12899824d284480f7b3f4c6cdfe40/botocore-1.43.50-py3-none-any.whl", hash = "sha256:4a57a1e0dd4a8be855c29183fc0e029c18e9ec84cd4ac172869f3e800f972528", size = 15394880, upload-time = "2026-07-16T19:33:02.097Z" }, ] +[[package]] +name = "build" +version = "1.6.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/bd/67/4898a44ea4f3f8e213b0954ec0aa0a16971d62a6212d6ea3931e97115b99/build-1.6.1.tar.gz", hash = "sha256:51cc11666391ab6f092070437ac747002ff46f3e4113a3622177ee6b488bfc53", size = 113427, upload-time = "2026-09-10T07:56:00.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/9b/9fb3585dabcd73a1b2a6267f63f62649347c9e6d072c9fde365b105abb2c/build-1.6.1-py3-none-any.whl", hash = "sha256:ecd351a4be9d35a9eaaba244a7687143c9c7d4aea6ac964e7e7ddab20cbcf4e7", size = 31179, upload-time = "2026-09-10T07:55:59.148Z" }, +] + [[package]] name = "cachetools" version = "7.1.4" @@ -780,13 +794,28 @@ 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.22.4" +version = "0.21.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +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/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, + { 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]] @@ -1056,6 +1085,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173, upload-time = "2020-06-22T23:32:36.781Z" }, ] +[[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" @@ -1092,6 +1133,48 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3e/95/c7c34aa53c16353c56d0b802fba48d5f5caa2cdee7958acbcb795c830416/isort-8.0.1-py3-none-any.whl", hash = "sha256:28b89bc70f751b559aeca209e6120393d43fbe2490de0559662be7a9787e3d75", size = 89733, upload-time = "2026-02-28T10:08:19.466Z" }, ] +[[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-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.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/1f/c23395957d41ccf27c4e535c3d334c4051e5395b3752057ba4cbaec35c56/jaraco_functools-4.6.0.tar.gz", hash = "sha256:880c577ec9720b3a052d5bc611fb9f2269b3d87902ef42440df443b88e443280", size = 20837, upload-time = "2026-07-14T01:28:02.544Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/36/ecc85bc96c273dc8a11273ed4782272975e6338d4a3e9228621175edf0e3/jaraco_functools-4.6.0-py3-none-any.whl", hash = "sha256:99e3dc0060c5cbe8fcd1cdb36258e2a65ca40f1566b2033b12abb1bb44dd3c30", size = 11677, upload-time = "2026-07-14T01:28:01.59Z" }, +] + +[[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" @@ -1126,6 +1209,23 @@ 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 = "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" @@ -1399,6 +1499,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/51/0f/ef410e6660d381e04cb6f33065d03b3aefd3444d558fcdd41ef235a1802c/moto-4.2.14-py2.py3-none-any.whl", hash = "sha256:6d242dbbabe925bb385ddb6958449e5c827670b13b8e153ed63f91dbdb50372c", size = 3312702, upload-time = "2024-01-27T12:34:36.602Z" }, ] +[[package]] +name = "nh3" +version = "0.3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/2f/022b27146d52d24b1b353b003359134788ecbcd6fcdf6283adbd57c0fbc8/nh3-0.3.7.tar.gz", hash = "sha256:71860d01c16f4d8c72e334e0674beb2b0899dbd0bf760de18932ef4390303848", size = 25662, upload-time = "2026-08-23T14:26:30.728Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/88/b594f0e86856b37e182fb663283da419eea6424972506e640e890885467f/nh3-0.3.7-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:91a4dab4e94d9fc54b9f67b1adfb23e81fab7ab43f33c3b8c97be9aa38f789ba", size = 1471147, upload-time = "2026-08-23T14:25:55.259Z" }, + { url = "https://files.pythonhosted.org/packages/1e/60/847a21339f095c4d4c655af31fa2d18b174585bcc210709facacc7ce205c/nh3-0.3.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae64328e46a25785535afcb6885b6f182ecaf5ee8c88f8c075422db8aacc65b", size = 820463, upload-time = "2026-08-23T14:25:56.803Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7f/1a103e00aaf5e59f2dee4c2709aac609bb2d4bb74fddaf0dcfade11ed87b/nh3-0.3.7-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4968fe8d2db97c6f047659bf46a449fd8ec377f44ebf3e0a1b96c0d3a333ae32", size = 861456, upload-time = "2026-08-23T14:25:58.087Z" }, + { url = "https://files.pythonhosted.org/packages/d8/4a/e9c436089a0c80b928011ead0efd156aa7639a19b6064ef58dcedcab8369/nh3-0.3.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:be53a4825585f701955cb9baf49f478f56eb81e20294329fe4bc689dd5dd81fa", size = 1023930, upload-time = "2026-08-23T14:25:59.465Z" }, + { url = "https://files.pythonhosted.org/packages/04/5c/aa1468e3e281e78d2b3b7d762ccba59f681af355e971dbd255d5903f7b86/nh3-0.3.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:94fd6e59553fbb9ffd8ba71bbd5a54e3126ba01799a097ae30d5341d750bc6ac", size = 1102614, upload-time = "2026-08-23T14:26:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/57d186d9d3dd38905dc12dddb3484406cdf6aa0b1ce33639a2d277d4ee1c/nh3-0.3.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:18f4278ecd157d43cb35acd5aae9f35cfa79f546b4922bd86536adc0f6312102", size = 1059915, upload-time = "2026-08-23T14:26:02.388Z" }, + { url = "https://files.pythonhosted.org/packages/6b/53/097a5ad0b34b15d67a472ef849165a54209fa5fbd3e639801c6fe439ba28/nh3-0.3.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:808def0c8c07843e6e50dc84f532457bfa2cfd17417b219a5d9e7c773709331a", size = 1047402, upload-time = "2026-08-23T14:26:03.897Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/c57a2c70534418310889a65ccfac3525e62f0bc0a8613225903403755ce7/nh3-0.3.7-cp314-cp314t-win32.whl", hash = "sha256:874b7d67a067bd29a59223f6270fc30da4edd8e6d87fd219fc93bcbaa662c946", size = 619895, upload-time = "2026-08-23T14:26:05.105Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b7/efda1d0a611d940bdfde6893bde1ea6b7b7d48c31273aea48e35b822fd58/nh3-0.3.7-cp314-cp314t-win_amd64.whl", hash = "sha256:614dac4a4c36ad084e78447d16fe898dedd762e354a7ab9cda2984e82f67883d", size = 633456, upload-time = "2026-08-23T14:26:06.661Z" }, + { url = "https://files.pythonhosted.org/packages/1d/18/3ab564595cb88196f50d26e163ed0fd2acc731ab26ac615df91981885887/nh3-0.3.7-cp314-cp314t-win_arm64.whl", hash = "sha256:157ec1eb7a62f3d9a7badb8d82d89aa810e3e24e097eedfa481a25d0c8a99877", size = 611003, upload-time = "2026-08-23T14:26:07.813Z" }, + { url = "https://files.pythonhosted.org/packages/94/0d/c257754bf57f829f307aa226bbe136d3a1356b5a0d08324c7b6bd2a8aacd/nh3-0.3.7-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6c3aa50eb26e9228238271db9f983cbc3b006dfbfeca2d4dc34c33ddc6ac5ea5", size = 1493959, upload-time = "2026-08-23T14:26:09.025Z" }, + { url = "https://files.pythonhosted.org/packages/07/42/a687e7091928806e514f89fa2666f25ec9bfe0a902fc4402b25e51ce408b/nh3-0.3.7-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f266d3f1b3647449923a8e406524632220dd5d8b647078dfe45b885d33d10479", size = 859615, upload-time = "2026-08-23T14:26:10.606Z" }, + { url = "https://files.pythonhosted.org/packages/85/05/b0e6bef633549a23347d5462aa288fcc42381e7918482062ca3cb456242a/nh3-0.3.7-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8fd1ab205258b29254f72db377d99e2c96aa7653ef3b015ccab0420b094b506", size = 839872, upload-time = "2026-08-23T14:26:12.037Z" }, + { url = "https://files.pythonhosted.org/packages/17/40/2a0921d45b20828708bcb56887e47dcf8cae13818de5bf9a01308d348712/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:19f288c938ec6eef1f5d2c6cab47838e71fef8097e1c1233802be5a6230ba086", size = 1091325, upload-time = "2026-08-23T14:26:13.34Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d1/9d70e0e418a48280ec0ddc6c1b08b4b1136ebcc31a1625e57ff5c665fa51/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de2b2aab32ea303405debefdcfc58043d3e635fa3f67b9eb140d2b0e0c0d2563", size = 1042482, upload-time = "2026-08-23T14:26:14.667Z" }, + { url = "https://files.pythonhosted.org/packages/93/a7/02dd159d4e71f98607d8d4249cddb7561e77be1a8e4dec77d76e1b68fc99/nh3-0.3.7-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7279d43323a25225df23576af6594a16693f61431170848b8b2ac21ad4f174", size = 946868, upload-time = "2026-08-23T14:26:16.094Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ed/c5510c615dce55b6fcc364aa1838142f938beed64f5e4927490dfcaf4405/nh3-0.3.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70f5ac8626e899a4bab0ef74ca2f5bd602f49c7b739e6e5026b4afc6d63dac42", size = 832161, upload-time = "2026-08-23T14:26:17.272Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e3/3212c1a5b5745245d7f18885207bbddb34c56075f34dd682bd539aad55cc/nh3-0.3.7-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:5ffdfcb9a686ffb12765376bcfb6b5b55728516d3c0ee317d29982381ded3df8", size = 849791, upload-time = "2026-08-23T14:26:18.498Z" }, + { url = "https://files.pythonhosted.org/packages/20/64/9e36594efad6c290de4240d02cb2bd80c339a4ab1c4de66e599ffa6d9d81/nh3-0.3.7-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bc42bb1193c1e28a1e74c2cabaca178e118a7103e8832699fef8a2b3e2496493", size = 875473, upload-time = "2026-08-23T14:26:19.908Z" }, + { url = "https://files.pythonhosted.org/packages/00/0c/1a8985fd43fea5530c0ac890b6f0b423770ee72f111b70b7a77f2dec243a/nh3-0.3.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d56e76bd3cadb09b6b0cef364850811663734b348a25f5f587a2819c495367bd", size = 1036463, upload-time = "2026-08-23T14:26:21.536Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5d/891e533b716cf00df76ad0ba6485dcfd14d59a6430a3cc99057c4c04004e/nh3-0.3.7-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fd4a70efb45d5372174f718878eb7a35c12677626a63b2f103b23b833457dcac", size = 1116029, upload-time = "2026-08-23T14:26:22.907Z" }, + { url = "https://files.pythonhosted.org/packages/42/e5/ae8c0782fce74fb6fcf7234bb3d4017f37ce181b4f9d29369eab21c50a04/nh3-0.3.7-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:15f5fbf090f5c88d61c820e1fc1fceecb6520cca9fe85649c06b57ef9dc9ff62", size = 1076589, upload-time = "2026-08-23T14:26:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/26/a4/c3423351e8d864ad756e85e15f0c01433361f14d34e4ed156482c0518f2a/nh3-0.3.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6698a822132beedab80f131c08d8d0ac5a178ddeb488d02ca4b67716ecfac7af", size = 1058871, upload-time = "2026-08-23T14:26:25.674Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6a/478f153f1d7c0baaa3d1e8bb5fdcee3a6235f90fe44ea969a9d4e2b8c47a/nh3-0.3.7-cp38-abi3-win32.whl", hash = "sha256:6e4280115d44c3b278eef712a86748c1a723105cd79feec46952383117ab4e59", size = 630729, upload-time = "2026-08-23T14:26:26.932Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b9/34433ccb1f0fe6968dabbb7d4bf5721c6221878ef07832748c06655a6a80/nh3-0.3.7-cp38-abi3-win_amd64.whl", hash = "sha256:618e3059caf41ccdf5dcccb3fa9df4cf6e4efe23d1382a8bbfca272a8a4f8bfc", size = 644462, upload-time = "2026-08-23T14:26:28.294Z" }, + { url = "https://files.pythonhosted.org/packages/f9/70/e140dffff6e808dc6343598df76e7e2407fd0f581de3524c75fba2e0cf24/nh3-0.3.7-cp38-abi3-win_arm64.whl", hash = "sha256:f04b7d333b27f13ca439da3cf1c75c2fba34f104969f6ce4ac8e7079699c2f4a", size = 621867, upload-time = "2026-08-23T14:26:29.547Z" }, +] + [[package]] name = "openedx-events" version = "11.2.0" @@ -1470,11 +1604,13 @@ ci = [ { name = "tox-uv" }, ] dev = [ + { name = "build" }, { name = "celery" }, { name = "coverage" }, { name = "coveralls" }, { name = "ddt" }, { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" } }, + { name = "doc8" }, { name = "edx-lint" }, { name = "factory-boy" }, { name = "freezegun" }, @@ -1494,6 +1630,7 @@ dev = [ { name = "testfixtures" }, { name = "tox" }, { name = "tox-uv" }, + { name = "twine" }, { name = "xblock-sdk" }, ] django42 = [ @@ -1513,10 +1650,12 @@ django42 = [ { name = "xblock-sdk" }, ] doc = [ + { name = "build" }, { name = "celery" }, { name = "coverage" }, { name = "ddt" }, { name = "django", version = "5.2.16", source = { registry = "https://pypi.org/simple" } }, + { name = "doc8" }, { name = "factory-boy" }, { name = "freezegun" }, { name = "mock" }, @@ -1531,6 +1670,7 @@ doc = [ { name = "sphinx-copybutton" }, { name = "sphinxcontrib-mermaid" }, { name = "testfixtures" }, + { name = "twine" }, { name = "xblock-sdk" }, ] quality = [ @@ -1618,11 +1758,13 @@ ci = [ { name = "tox-uv", specifier = ">=1" }, ] dev = [ + { name = "build" }, { name = "celery" }, { name = "coverage" }, { name = "coveralls" }, { name = "ddt" }, { name = "django", specifier = ">=5.2,<6.0" }, + { name = "doc8" }, { name = "edx-lint" }, { name = "factory-boy" }, { name = "freezegun" }, @@ -1642,6 +1784,7 @@ dev = [ { name = "testfixtures" }, { name = "tox" }, { name = "tox-uv", specifier = ">=1" }, + { name = "twine" }, { name = "xblock-sdk" }, ] django42 = [ @@ -1661,10 +1804,12 @@ django42 = [ { name = "xblock-sdk" }, ] doc = [ + { name = "build" }, { name = "celery" }, { name = "coverage" }, { name = "ddt" }, { name = "django", specifier = ">=5.2,<6.0" }, + { name = "doc8" }, { name = "factory-boy" }, { name = "freezegun" }, { name = "mock" }, @@ -1679,6 +1824,7 @@ doc = [ { name = "sphinx-copybutton" }, { name = "sphinxcontrib-mermaid" }, { name = "testfixtures" }, + { name = "twine" }, { name = "xblock-sdk" }, ] quality = [ @@ -2075,6 +2221,15 @@ 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.3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/5d/f2ddeef4a855a102aaae5e97826a0260007522ab504421b75addfdb1517c/pyproject_hooks-1.3.3.tar.gz", hash = "sha256:defda19b854fa0d3bd4f76ea4ddcba8abd7dcfcdd585a6690ade050744fc5f43", size = 21013, upload-time = "2026-09-16T08:58:03.999Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/11/044d1ae1b4ec0d7af88ee5bc91e081be1022533032b906a7bdabdbb60977/pyproject_hooks-1.3.3-py3-none-any.whl", hash = "sha256:5fc53fdac9f7bd63fbcdc868fb5f90b4784d78a53a3d3388cd738b807441a20b", size = 10724, upload-time = "2026-09-16T08:58:02.96Z" }, +] + [[package]] name = "pytest" version = "9.1.1" @@ -2175,6 +2330,15 @@ 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 = "6.0.3" @@ -2221,6 +2385,20 @@ wheels = [ { 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 = "46.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "nh3" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/d7/9309494fad74ee831d4546f69325b5519f37c6dfb2d9ba495db8c6d4f4ca/readme_renderer-46.0.tar.gz", hash = "sha256:af3e964914f6310a33ff67b72a4bdd940bed8d7c3bdecd2d14f40edf284bfe90", size = 38382, upload-time = "2026-08-28T15:18:32.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/72/ac5ca81fe9121fcaa9d828d21017cba00a16a98e4ea5fb60c878f93dda4f/readme_renderer-46.0-py3-none-any.whl", hash = "sha256:d0dae1f74bb273b534770cb4cccb6bb78735540afdb03c2146f4e19dcd412560", size = 14239, upload-time = "2026-08-28T15:18:31.132Z" }, +] + [[package]] name = "requests" version = "2.34.2" @@ -2236,6 +2414,18 @@ 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-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" @@ -2250,6 +2440,27 @@ 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" @@ -2284,6 +2495,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/24/23/e84c64ad0e8bc59cd1b2ef98def848deff0ef3456c542afe74d51e9e8c85/s3transfer-0.19.1-py3-none-any.whl", hash = "sha256:d5fd7005ee39307455ad5f310b5ea67f4b1960d7fed5b3671ee50c249de675de", size = 90072, upload-time = "2026-07-10T19:32:03.673Z" }, ] +[[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 = "setuptools" version = "83.0.0" @@ -2636,6 +2860,26 @@ 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 = "twine" +version = "7.0.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/92/3c/58f808a359700f39a967dffede33efeac809262c03303fa3eec6afff8f49/twine-7.0.0.tar.gz", hash = "sha256:85cdb29c518efef867360ae4acd4b0dfd61c8654a22fca08e6f8539f05022177", size = 215032, upload-time = "2026-07-27T15:59:00.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/08/ddcdc06225eaad6de0e48e1002b06d919dbde20582d0662c7af51308e5d6/twine-7.0.0-py3-none-any.whl", hash = "sha256:b854164df26db268af05f49aa5c0344b10e27a494343ff05b1e0bad3b135f5a7", size = 43204, upload-time = "2026-07-27T15:58:59.26Z" }, +] + [[package]] name = "typer" version = "0.27.0" From e7c0692c1e305b57e9beece7f04769bf7c02f946 Mon Sep 17 00:00:00 2001 From: salmannawaz Date: Tue, 6 Oct 2026 15:44:35 +0500 Subject: [PATCH 5/7] fix: stop ora2 wheel from crashing on the locale symlink and shipping extra files Setuptools' include-package-data default of true, combined with setuptools-scm's git-tracked-file finder, pulled every git-tracked path under openassessment/ into the wheel: the bare src/openassessment/locale symlink crashed `python -m build --wheel` ("can't copy ... doesn't exist or not a regular file"), and test/spec packages, duplicate locale files, sass sources, static/xml fixtures, and font-awesome fonts all shipped alongside it. Set include-package-data = false so package-data/exclude-package-data fully control wheel contents again, replace the conf/locale/** package data (which only duplicated the real locale files) with explicit locale/**/*.po and *.mo globs matching MANIFEST.in, and extend the packages.find exclude to also match singular "test" packages (some subpackages use "test", others "tests"). Verified the resulting wheel is file-list-identical to the published 7.1.1 release. Co-Authored-By: Claude Sonnet 5 --- pyproject.toml | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8f57d3b983..0dafce1f66 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,23 +64,32 @@ local_scheme = "no-local-version" # This happens, for example, when bind-mounting into a Docker image. fallback_version = "0.0.0.dev0" +[tool.setuptools] +# Without this, setuptools-scm's git-tracked-file list makes every file under +# openassessment/ package data by default, bypassing package-data/exclude-package-data +# below and crashing the build on the openassessment/locale symlink (can't copy a +# symlinked directory as a regular file). +include-package-data = false + [tool.setuptools.packages.find] where = ["src"] include = ["openassessment*"] -exclude = ["*.tests", "*.tests.*"] +exclude = ["*.test", "*.test.*", "*.tests", "*.tests.*"] [tool.setuptools.package-data] -# locale/ is a symlink to conf/locale/ — include the real path instead -# (setuptools cannot copy symlinked directories into the wheel) "openassessment" = [ - "conf/locale/**", - "templates/**", - "xblock/static/**", + "locale/**/*.po", + "locale/**/*.mo", + "templates/**/*.html", + "templates/**/*.underscore", + "xblock/static/css/lib/backgrid/*.css", + "xblock/static/js/lib/backgrid/*.js", + "xblock/static/js/src/**/*.js", + "xblock/static/dist/manifest.json", + "xblock/static/dist/*.js", + "xblock/static/dist/*.css", ] -[tool.setuptools.exclude-package-data] -"*" = ["tests*", "*.tests*", "spec*", "*.spec*"] - [tool.coverage.run] branch = true source_pkgs = ["openassessment"] From 9cfb66b998c1331490d2be61f1d3fd7dd6018531 Mon Sep 17 00:00:00 2001 From: salmannawaz Date: Tue, 6 Oct 2026 15:44:58 +0500 Subject: [PATCH 6/7] build: add docs env to CI matrix and fix doc8 violations The docs tox env (doc8, wheel build + twine check, Sphinx build) was never wired into CI, so it had drifted to 105 doc8 violations - trailing whitespace and lines over the 79-char limit - across 7 rst files, plus a couple of RST list/indentation issues. Reflow the long prose lines and strip trailing whitespace without changing content, add docs to the CI matrix, and gitignore the generated docs/_build/ output so it doesn't get swept into local doc8 runs. Verified `tox -e docs` passes end-to-end. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/ci.yml | 2 +- .gitignore | 3 + docs/decisions/0001-feature-toggling.rst | 51 +++++---- ...0002-increase-allowed-file-upload-size.rst | 24 ++-- .../0003-lightweight-extension-points.rst | 91 ++++++++++++--- docs/developers_guide.rst | 88 ++++++++++----- docs/ora_reminders.rst | 6 +- docs/ora_team_submissions.rst | 106 +++++++++++++----- 8 files changed, 265 insertions(+), 106 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66d138d756..290faf922e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: matrix: os: [ubuntu-latest] python-version: ["3.12"] - toxenv: [quality, js, django42, django52] + toxenv: [quality, js, django42, django52, docs] steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 diff --git a/.gitignore b/.gitignore index 753edf7de6..bda3b72bdb 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,9 @@ test_ora2db test_ora2db-journal test/logs/ +# Sphinx build output +docs/_build/ + # Mr Developer .mr.developer.cfg .project diff --git a/docs/decisions/0001-feature-toggling.rst b/docs/decisions/0001-feature-toggling.rst index a514fd46e8..191c09cdca 100644 --- a/docs/decisions/0001-feature-toggling.rst +++ b/docs/decisions/0001-feature-toggling.rst @@ -11,38 +11,49 @@ Context The introduction of remote config (see https://openedx.atlassian.net/wiki/spaces/EdxOps/pages/987202032/How-To+Use+Remote+Config) -allows us to quickly change values of items in Django settings. A benefit of this approach is that -it is much easier to reason about the differences in feature state between environments -(for example, between staging and production) from Django settings that it is via Django Waffle models. -Lastly, tracking feature state via settings allows us to record "data as code" - that is, -there is a pull request in our configuration repositories corresponding to each state change of a feature toggle. +allows us to quickly change values of items in Django settings. A benefit +of this approach is that it is much easier to reason about the +differences in feature state between environments (for example, between +staging and production) from Django settings that it is via Django Waffle +models. Lastly, tracking feature state via settings allows us to record +"data as code" - that is, there is a pull request in our configuration +repositories corresponding to each state change of a feature toggle. Decisions ========= #. **Application-wide feature gating** - a. We will being to use the Django Settings ``FEATURES`` dictionary to toggle application-wide (that is, - the feature is enabled/disabled for all courses in an environment) feature state. + a. We will being to use the Django Settings ``FEATURES`` dictionary to + toggle application-wide (that is, the feature is enabled/disabled + for all courses in an environment) feature state. - b. We will deprecate the use of the ``WaffleSwitch`` model for enabling application-wide features. During - the deprecation period, our feature gating logic will look at both the ``WaffleSwitch`` model state - and the Django settings ``FEATURES`` state of a feature's name. Upon removal of all ORA ``WaffleSwitches``, - our feature gating logic will only consider state as defined in ``FEATURES``. + b. We will deprecate the use of the ``WaffleSwitch`` model for + enabling application-wide features. During the deprecation period, + our feature gating logic will look at both the ``WaffleSwitch`` + model state and the Django settings ``FEATURES`` state of a + feature's name. Upon removal of all ORA ``WaffleSwitches``, our + feature gating logic will only consider state as defined in + ``FEATURES``. - c. We will store "sane defaults" for feature state in the Django settings files of both the edx-ora2 repository - and the edx-platform repository. The definitions that live in edx-platform will contain toggle annotations - that provide definitions, use cases, historical context, and so forth. + c. We will store "sane defaults" for feature state in the Django + settings files of both the edx-ora2 repository and the + edx-platform repository. The definitions that live in edx-platform + will contain toggle annotations that provide definitions, use + cases, historical context, and so forth. #. **Course-specific feature gating** - a. We will continue to use the ``CourseWaffleFlag`` model to allow for course-specific feature gating. We may - re-assess this in the future if outside guidance is given on better ways to toggle features at the course-level - via Django Settings. + a. We will continue to use the ``CourseWaffleFlag`` model to allow for + course-specific feature gating. We may re-assess this in the + future if outside guidance is given on better ways to toggle + features at the course-level via Django Settings. Consequences ============ -The primary consequence of these decisions have to do with the benefits mentioned above under "Context" - we -will be able to more easily reason about the state of different application environments (with respect to ORA), -and we will be able to capture feature toggle state change via code pull requests. +The primary consequence of these decisions have to do with the benefits +mentioned above under "Context" - we will be able to more easily reason +about the state of different application environments (with respect to +ORA), and we will be able to capture feature toggle state change via +code pull requests. diff --git a/docs/decisions/0002-increase-allowed-file-upload-size.rst b/docs/decisions/0002-increase-allowed-file-upload-size.rst index ae590e3ef6..9f7acd2ead 100644 --- a/docs/decisions/0002-increase-allowed-file-upload-size.rst +++ b/docs/decisions/0002-increase-allowed-file-upload-size.rst @@ -16,22 +16,24 @@ and team submissions. Decisions ========= -We will increase the maximum allowed file size that can be uploaded via ORA XBlocks to 500MB -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Increase the maximum allowed file size uploaded via ORA XBlocks to 500MB +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Note that this constraint is enforced only via client-side code. How can we detect/stop misuse? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -We will add a management command that measure file size usage by course in the edx-submissions library. -We will run this command periodically via Jenkins, and it will alert some subset of the -Master's development team. +We will add a management command that measure file size usage by course +in the edx-submissions library. We will run this command periodically +via Jenkins, and it will alert some subset of the Master's development +team. How long will files be retained? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#. **We will apply a bucket-level retention policy on all ORA uploads in S3, as follows:** +#. **We will apply a bucket-level retention policy on all ORA uploads in + S3, as follows:** a. Standard storage for the first 6-months. b. Standard_IA class storage for months 7 through 60. @@ -42,7 +44,9 @@ See https://openedx.atlassian.net/browse/EDUCATOR-4743 for implementation. Consequences ============ -Similar to the current situation, ORA files will never truly be deleted from a storage backend. -We will have to change the user experience to handle the case where learners try to view files -older than 60 months (for example, they'll need to trigger some sort of job that fetches old -files out of Glacier storage and sends a notification when the file is ready for download). +Similar to the current situation, ORA files will never truly be deleted +from a storage backend. We will have to change the user experience to +handle the case where learners try to view files older than 60 months +(for example, they'll need to trigger some sort of job that fetches old +files out of Glacier storage and sends a notification when the file is +ready for download). diff --git a/docs/decisions/0003-lightweight-extension-points.rst b/docs/decisions/0003-lightweight-extension-points.rst index b56c271802..32f50b8a6e 100644 --- a/docs/decisions/0003-lightweight-extension-points.rst +++ b/docs/decisions/0003-lightweight-extension-points.rst @@ -9,34 +9,93 @@ Status Context ******* -Open Responses are commonly used in education for assessment purposes and the flexibility of ORA has made it a key feature of the Open edX platform. However, as developers, it is tough to accommodate the needs of educators and other stakeholders in the teaching process when they want to enhance the learner's experience with other tools such as plagiarism detection, AI grading, coding graders, and others. - -As the code is open, it is always possible to modify it. Still, it might result in a technical maintenance debt, which usually prevents educators from experimenting or installations from upgrading to newer versions once the changes to ORA become important in the teaching process. +Open Responses are commonly used in education for assessment purposes +and the flexibility of ORA has made it a key feature of the Open edX +platform. However, as developers, it is tough to accommodate the needs +of educators and other stakeholders in the teaching process when they +want to enhance the learner's experience with other tools such as +plagiarism detection, AI grading, coding graders, and others. + +As the code is open, it is always possible to modify it. Still, it might +result in a technical maintenance debt, which usually prevents educators +from experimenting or installations from upgrading to newer versions +once the changes to ORA become important in the teaching process. Decisions ********* -As the first step towards making implementing new use cases during the ORA user's lifecycle more flexible, we will introduce two extension points in the ORA codebase. These extension points will be built on top of the `Hooks Extensions Framework`_. The definitions for these extension points will reside in `openedx-filters`_ and `openedx-events`_. These definitions will be imported into the edx-ora2 repository and triggered in two places during the learners' lifecycle, resulting in minimal modifications to the ORA implementation. - -The first extension point we will implement is an `Open edX Filter`_ that will be executed before `rendering the submission HTML section of the block for the legacy view`_, with input arguments ``context`` and ``template path``. This implementation will allow us to modify what's rendered to the student, via the view ``context`` and ``template``, for cases when needed. - -The second extension point to be implemented is an `Open edX Event`_. It will be sent `after a student submits a response to the assessment`_ with the student's submission key data, like the ORA submission ID and files uploaded in the submission, as the event's payload. This event (that works like a notification) will allow us to take action after a submission is made based on the data sent. +As the first step towards making implementing new use cases during the +ORA user's lifecycle more flexible, we will introduce two extension +points in the ORA codebase. These extension points will be built on top +of the `Hooks Extensions Framework`_. The definitions for these +extension points will reside in `openedx-filters`_ and `openedx-events`_. +These definitions will be imported into the edx-ora2 repository and +triggered in two places during the learners' lifecycle, resulting in +minimal modifications to the ORA implementation. + +The first extension point we will implement is an `Open edX Filter`_ +that will be executed before `rendering the submission HTML section of +the block for the legacy view`_, with input arguments ``context`` and +``template path``. This implementation will allow us to modify what's +rendered to the student, via the view ``context`` and ``template``, for +cases when needed. + +The second extension point to be implemented is an `Open edX Event`_. It +will be sent `after a student submits a response to the assessment`_ +with the student's submission key data, like the ORA submission ID and +files uploaded in the submission, as the event's payload. This event +(that works like a notification) will allow us to take action after a +submission is made based on the data sent. Consequences ************ -Extension developers often use those extension points in Open edX plugins to enhance the functionality of an existing application. When installing edx-ora2, developers can implement more use cases out-of-the-box by configuring it with plugins that use these extension points. These use cases include modify the context passed to ``legacy/response/oa_response.html`` , changing the template that is rendered to the student, and sending students' submission data to another service. - -For instance, if a developer wants to add an acknowledgment notice to the submission template, they can implement a `pipeline step`_ for the filter that modifies the ``oa_response.html`` template for an ``oa_response_ack_modified.html`` template with its custom context. See `how to implement pipeline steps`_ for more information. To act on the submission-created notification, the developer can listen to the Open edX event since the event payload has enough information to get the student's submissions, including files, enabling the event receiver to obtain and send the submission to another service for analysis. See `how to listen for Open edX Events`_ for more information. - -These changes allow extension developers to interact with a crucial part of the student's assessment lifecycle. However, when none of these extension points are configured, ORA assessments will behave as usual. This first step sets a precedent for ORA developers to implement more extension points during the ORA users' lifecycle, enabling additional use cases to be built on top of them. - -The extension points proposed in this PR are intended to facilitate the integration with tools for students' response analysis like Turnitin.These two extensions are designed to share information, not to give feedback to the user; other hooks and mechanisms might be implemented to do so. For more information on this use case, please refer to the `Platform Plugin Turnitin`_ documentation. +Extension developers often use those extension points in Open edX +plugins to enhance the functionality of an existing application. When +installing edx-ora2, developers can implement more use cases +out-of-the-box by configuring it with plugins that use these extension +points. These use cases include modify the context passed to +``legacy/response/oa_response.html``, changing the template that is +rendered to the student, and sending students' submission data to +another service. + +For instance, if a developer wants to add an acknowledgment notice to +the submission template, they can implement a `pipeline step`_ for the +filter that modifies the ``oa_response.html`` template for an +``oa_response_ack_modified.html`` template with its custom context. See +`how to implement pipeline steps`_ for more information. To act on the +submission-created notification, the developer can listen to the Open +edX event since the event payload has enough information to get the +student's submissions, including files, enabling the event receiver to +obtain and send the submission to another service for analysis. See +`how to listen for Open edX Events`_ for more information. + +These changes allow extension developers to interact with a crucial +part of the student's assessment lifecycle. However, when none of these +extension points are configured, ORA assessments will behave as usual. +This first step sets a precedent for ORA developers to implement more +extension points during the ORA users' lifecycle, enabling additional +use cases to be built on top of them. + +The extension points proposed in this PR are intended to facilitate the +integration with tools for students' response analysis like Turnitin. +These two extensions are designed to share information, not to give +feedback to the user; other hooks and mechanisms might be implemented +to do so. For more information on this use case, please refer to the +`Platform Plugin Turnitin`_ documentation. Rejected Alternatives ********************* -As suggested in the `platform roadmap GH ticket`_ for this feature, the team who wrote this ADR researched the feasibility of adding a new `External Tool Step`. Although this was considered the best option since ORA design entertained extension via customization and addition of workflow steps, it was rejected due to time constraints. Therefore, in this ADR, we only commit to implementing a lightweight extension mechanism because we understand the required effort. However, there is no technical limit on this proposal's growth into more support of a broad array of extension use cases. +As suggested in the `platform roadmap GH ticket`_ for this feature, the +team who wrote this ADR researched the feasibility of adding a new +`External Tool Step`. Although this was considered the best option +since ORA design entertained extension via customization and addition +of workflow steps, it was rejected due to time constraints. Therefore, +in this ADR, we only commit to implementing a lightweight extension +mechanism because we understand the required effort. However, there is +no technical limit on this proposal's growth into more support of a +broad array of extension use cases. .. _Hooks Extensions Framework: https://open-edx-proposals.readthedocs.io/en/latest/architectural-decisions/oep-0050-hooks-extension-framework.html .. _rendering the submission HTML section of the block for the legacy view: https://github.com/openedx/edx-ora2/blob/master/openassessment/xblock/ui_mixins/legacy/views/submission.py#L19 diff --git a/docs/developers_guide.rst b/docs/developers_guide.rst index eefa89b166..82330de332 100644 --- a/docs/developers_guide.rst +++ b/docs/developers_guide.rst @@ -13,77 +13,97 @@ ORA is broken into two separate repositories: Using ORA with docker devstack ------------------------------ -Note - "from inside the lms", means you've run ``make lms-shell`` from the devstack directory and are on a command prompt inside the lms container. +Note - "from inside the lms", means you've run ``make lms-shell`` from the +devstack directory and are on a command prompt inside the lms container. -1. Clone edx-ora2 repo into ../src/ directory (relative to your 'devstack' repo location). +1. Clone edx-ora2 repo into ../src/ directory (relative to your 'devstack' + repo location). -2. From the src directory, run the following command to install ora2 in the lms's and studio's virtual environments: +2. From the src directory, run the following command to install ora2 in + the lms's and studio's virtual environments: - ``make install-local-ora`` -Alternatively, one can log into either lms (``make lms-shell``) or studio (``make studio-shell``) and execute the following commands to uninstall ora2 and reinstall your local copy: +Alternatively, one can log into either lms (``make lms-shell``) or studio +(``make studio-shell``) and execute the following commands to uninstall +ora2 and reinstall your local copy: - ``pip uninstall ora2 -y; pip install -e /edx/src/edx-ora2/`` -3. Now, get your edx-ora2 development environment set up: (the virtual environment MUST be named **edx-ora2**) +3. Now, get your edx-ora2 development environment set up: (the virtual + environment MUST be named **edx-ora2**) + This must be done from inside either lms or studio docker container. - ``cd /edx/src/edx-ora2`` - ``virtualenv edx-ora2`` - ``source edx-ora2/bin/activate`` - ``make install`` -- ensure that your virtual environment is named **edx-ora2**. Using a different name will cause errors when trying to generate translations. +- ensure that your virtual environment is named **edx-ora2**. Using a + different name will cause errors when trying to generate translations. 4. Now, in the devstack directory on your host, run: - ``make lms-restart lms-logs`` -5. That's it, you're good to go! See Makefile for all the available commands, most are fairly self-explanatory -In order to simulate a given tox environment (django18, django111, quality, js), run tox -e for the env in question (after re-activating your edx-ora2 virtual environment). -Usually, you can just run the underlying make commands for quicker tests, as requirements aren't re-installed. +5. That's it, you're good to go! See Makefile for all the available + commands, most are fairly self-explanatory. + +In order to simulate a given tox environment (django42, django52, quality, +js), run tox -e for the env in question (after re-activating your +edx-ora2 virtual environment). +Usually, you can just run the underlying make commands for quicker tests, +as requirements aren't re-installed. Enabling/disabling features --------------------------------------- -ORA code observes several feature toggles for enabling/disabling functionality. For -development purposes, these can be enabled locally in your ``edx-platform`` instance -or in ``/settings/base.py``. See ``settings/base.py`` for ORA-specific toggles and -linked documentation. +ORA code observes several feature toggles for enabling/disabling +functionality. For development purposes, these can be enabled locally in +your ``edx-platform`` instance or in ``/settings/base.py``. See +``settings/base.py`` for ORA-specific toggles and linked documentation. Working with submission dependencies ------------------------------------ -ORA code also depends on edx-submissions. As a result, anytime a new version of edx-submissions is released, ORA code must be updated as follows. +ORA code also depends on edx-submissions. As a result, anytime a new +version of edx-submissions is released, ORA code must be updated as +follows. For devstack: - ``make lms-shell`` # get into docker container - ``cd /edx/src/edx-ora2`` # goto into ora2 folder - ``source edx-ora2/bin/activate`` # activate ora2 virtual environment -- ``pip install -U edx-submissions`` # installs latest version of submissions from pypi -- ``pip install -e /edx/src/edx-submissions`` # installs latest local version of submissions +- ``pip install -U edx-submissions`` # installs latest version from pypi +- ``pip install -e /edx/src/edx-submissions`` # installs latest local copy Available make commands ----------------------- -- ``make install-local-ora`` - installs your local ORA2 code into the LMS and Studio python virtualenvs +- ``make install-local-ora`` - installs your local ORA2 code into the LMS + and Studio python virtualenvs - ``make static`` - builds static JS/SASS files for LMS and Studio - ``make quality`` - run the JSHint quality tests - ``make test`` - run all the tests - ``make test`` - acceptance - run the acceptance tests - ``make test-a11y`` - run the accessibility tests - ``make test-js`` - run the JavaScript tests -- ``make test-js-debug`` - run the JavaScript tests in debug mode in Chrome +- ``make test-js-debug`` - run the JavaScript tests in debug mode in + Chrome - ``make test-python`` - run the Python tests -- ``make test-sandbox`` - run all the sandbox tests (currently acceptance and a11y) +- ``make test-sandbox`` - run all the sandbox tests (currently acceptance + and a11y) Making Translations ------------------- -If any changes are made to the .html files, it is necessary to re-do the translations: +If any changes are made to the .html files, it is necessary to re-do the +translations: - be inside the shell - ``cd /edx/src/edx-ora2`` - ``source edx-ora2/bin/activate`` - ``make check_translations_up_to_date`` -The above command will generate translations files which will have to be checked into git. +The above command will generate translations files which will have to be +checked into git. Building Static Files --------------------- @@ -114,21 +134,31 @@ ORA2 supports pytest. In order to run unit tests, do the following: Debugging with PDB ------------------ -The simplest way to debug ORA2 code is with PDB - Python's built in debugger. -One caveat: Since ORA2 has code that executes either in studio or lms context, one must be attached to the corret shell -in order for the breakpoints to be hit. +The simplest way to debug ORA2 code is with PDB - Python's built in +debugger. One caveat: Since ORA2 has code that executes either in studio +or lms context, one must be attached to the corret shell in order for the +breakpoints to be hit. Debugging JavaScript -------------------- -For debugging JS in Devstack, first follow the instructions for "Hot Reload JS". This enables source maps and allows for placing breakpoints in source-mapped files from the browser dev tools. +For debugging JS in Devstack, first follow the instructions for "Hot +Reload JS". This enables source maps and allows for placing breakpoints +in source-mapped files from the browser dev tools. + + - Locate code by browsing to + ``webpack:///./openassessment/xblock/static/js/src/``. - - Locate code by browsing to ``webpack:///./openassessment/xblock/static/js/src/``. - **NOTE** The path should be within ``iframe`` for ``lms``. - - **TIP** Use ``CTRL + P`` or ``Command + P`` to find the file through chrome dev tools. + - **TIP** Use ``CTRL + P`` or ``Command + P`` to find the file + through chrome dev tools. + - breakpoints should toggle with hot-reloading. Other Resources --------------- -`ORA user documentation `_ +`ORA user documentation +`_ -`ORA analytics documentation `_ - note this is specific to the edx.org research data package. +`ORA analytics documentation +`_ +- note this is specific to the edx.org research data package. diff --git a/docs/ora_reminders.rst b/docs/ora_reminders.rst index 4c2984e3e3..f5332b06ba 100644 --- a/docs/ora_reminders.rst +++ b/docs/ora_reminders.rst @@ -17,9 +17,9 @@ Set ``ENABLE_ORA_REMINDERS`` to ``True`` in your Django settings: ENABLE_ORA_REMINDERS = True -The notification type ``ora_reminder`` must also be registered in edx-platform's -``openedx.core.djangoapps.notifications.base_notification`` (already included -in edx-platform ≥ the version that ships this feature). +The notification type ``ora_reminder`` must also be registered in +edx-platform's ``openedx.core.djangoapps.notifications.base_notification`` +(already included in edx-platform ≥ the version that ships this feature). Configuration Settings ---------------------- diff --git a/docs/ora_team_submissions.rst b/docs/ora_team_submissions.rst index 3bb822ea4b..8d4fb97da3 100644 --- a/docs/ora_team_submissions.rst +++ b/docs/ora_team_submissions.rst @@ -6,59 +6,99 @@ ORA2 Team Submissions Workflows --------- -There’s an AssessmentWorkflow model that has a workflow app label, which means that the table name is prefixed with `workflow_` and not `assessment_` like everything else (I’m sure it’s to help resolve a name collision). `See for reference: `_. In fact, each of the AssessmentWorkflow, AssessmentWorkflowStep, and AssessmentWorkflowCancellation models live under the workflow app label. +There's an AssessmentWorkflow model that has a workflow app label, which +means that the table name is prefixed with `workflow_` and not `assessment_` +like everything else (I'm sure it's to help resolve a name collision). +`See for reference: +`_. +In fact, each of the AssessmentWorkflow, AssessmentWorkflowStep, and +AssessmentWorkflowCancellation models live under the workflow app label. -- The ``SubmissionMixin.create_submission()`` method calls the ``workflow_api.create_workflow()`` method (it stops at ``WorkflowMixin.create_workflow()`` along the way). This is the entry point to workflow management in ORA. +- The ``SubmissionMixin.create_submission()`` method calls the + ``workflow_api.create_workflow()`` method (it stops at + ``WorkflowMixin.create_workflow()`` along the way). This is the entry + point to workflow management in ORA. -- ``create_workflow()`` calls ``AssessmentWorkflow.start_workflow()`` +- ``create_workflow()`` calls ``AssessmentWorkflow.start_workflow()`` - - …which calls the ``on_init()`` method of each specific type of step (e.g. self, peer, staff). + - …which calls the ``on_init()`` method of each specific type of step + (e.g. self, peer, staff). - - The ``on_init()`` method of e.g. StaffWorkflow is what creates a StaffWorkflow record associated with a given course, item, and submission (and eventually, a scorer and an assessment). + - The ``on_init()`` method of e.g. StaffWorkflow is what creates a + StaffWorkflow record associated with a given course, item, and + submission (and eventually, a scorer and an assessment). Staff Workflows --------------- -These should be the only workflow type that we care about for team submissions. +These should be the only workflow type that we care about for team +submissions. -`Python API for managing StaffWorkflow data: `_: +`Python API for managing StaffWorkflow data: +`_: - **on_init(submission_uuid)** - - Looks up submission record from Submissions API. Then creates a StaffWorkflow associated with it. + - Looks up submission record from Submissions API. Then creates a + StaffWorkflow associated with it. **For teams:** -- We will have one workflow per team - there’s no value in creating e.g. 5 workflows for a team of 5 learners when we only want 1 of those 5 workflows to be acted on by course staff. +- We will have one workflow per team - there's no value in creating e.g. + 5 workflows for a team of 5 learners when we only want 1 of those 5 + workflows to be acted on by course staff. -- From the perspective of grading, it doesn’t matter, as long as we end up in a state where there is one Score per learner. +- From the perspective of grading, it doesn't matter, as long as we end up + in a state where there is one Score per learner. Data Models Design ------------------ Motivation ^^^^^^^^^^ -- For course staff to grade learners' team-based submissions, we have to allow staff to “pull” from a pool of team-based submissions in a different manner from how submissions are pulled for individual submissions. +- For course staff to grade learners' team-based submissions, we have to + allow staff to "pull" from a pool of team-based submissions in a + different manner from how submissions are pulled for individual + submissions. -- The ``StaffWorkflow`` model contains a ``get_submission_for_review()`` method that returns a new submission for staff to review. +- The ``StaffWorkflow`` model contains a ``get_submission_for_review()`` + method that returns a new submission for staff to review. -- At the completion of the assessment, we need each team member’s submission record to have a corresponding ``Score`` (and each score within the team-assignment should be identical). +- At the completion of the assessment, we need each team member's + submission record to have a corresponding ``Score`` (and each score + within the team-assignment should be identical). New Models, sublcass StaffWorkflow ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -- Create a new ``TeamStaffWorkflow`` model that inherits from ``StaffWorkflow``. +- Create a new ``TeamStaffWorkflow`` model that inherits from + ``StaffWorkflow``. -- Create a new ``TeamSubmission`` model with a many to many relationship to ``Submission``. The ``TeamStaffWorkflow`` now references a ``TeamSubmission``. +- Create a new ``TeamSubmission`` model with a many to many relationship to + ``Submission``. The ``TeamStaffWorkflow`` now references a + ``TeamSubmission``. -- The TeamSubmission model also records who submitted on behalf of the team. +- The TeamSubmission model also records who submitted on behalf of the + team. -- We’ll actually also need a new, team-centric version of the ``workflow.AssessmentWorkflow`` model, so that we can pass a ``team_submission_uuid`` to the ``start_workflow()`` method. It will follow the same flow of logic of creating a workflow record and associated steps. +- We'll actually also need a new, team-centric version of the + ``workflow.AssessmentWorkflow`` model, so that we can pass a + ``team_submission_uuid`` to the ``start_workflow()`` method. It will + follow the same flow of logic of creating a workflow record and + associated steps. - - ``AssessmentWorkflow.start_workflow()`` calls the ``on_init()`` function of each `assessment type’s API, e.g. `_ In fact, pretty much all of the functions provided by assessment API’s require a ``submission_uuid`` parameter. So we’ll likely want some new API like ``assessment.api.team`` that provides the same functionality, but takes a ``team_submission_uuid`` as the first parameter. + - ``AssessmentWorkflow.start_workflow()`` calls the ``on_init()`` + function of each `assessment type's API, e.g. + `_ + In fact, pretty much all of the functions provided by assessment + API's require a ``submission_uuid`` parameter. So we'll likely want + some new API like ``assessment.api.team`` that provides the same + functionality, but takes a ``team_submission_uuid`` as the first + parameter. -No new team-based AssessmentWorkflowStep model. All that the steps care about are their types and the corresponding workflow instance. +No new team-based AssessmentWorkflowStep model. All that the steps care +about are their types and the corresponding workflow instance. Diagrams -------- @@ -69,18 +109,30 @@ Diagrams Behavior on Submit ------------------ -- For team ORA submissions, only staff assessment types are allowed (or no assessment types at all, in the case of practice assignments). +- For team ORA submissions, only staff assessment types are allowed (or no + assessment types at all, in the case of practice assignments). + - Peers should not see Team Submissions in their workflows. - - “Selves” should not see Team Submissions in their workflows. + - "Selves" should not see Team Submissions in their workflows. + - A ``Submission`` record should be created for each member of the team. - One ``TeamSubmission`` record should be created for the team. - One ``TeamAssessmentWorkflow`` should be created for the team. - - Because this inherits from ``AssessmentWorkflow``, we can use ``AssessmentWorkflowCancellation`` for team workflows, too, without any model changes. - - There will be one “content reference” submission that points to the ``AssessmentWorkflow`` that’s associated with the ``TeamAssessmentWorkflow`` - this is the submission that’s used to show text/file content to instructors while the team submission is being assessed. - -- If the `staff` assessment step (which is the only valid assessment type for team-based ORAs) is selected for the block, one ``TeamStaffWorkflow`` record is created for the team. - -- One ``Assessment`` record and (eventually, after grading) one ``Score`` record **per team member** is/are created. + - Because this inherits from ``AssessmentWorkflow``, we can use + ``AssessmentWorkflowCancellation`` for team workflows, too, without + any model changes. + - There will be one "content reference" submission that points to the + ``AssessmentWorkflow`` that's associated with the + ``TeamAssessmentWorkflow`` - this is the submission that's used to + show text/file content to instructors while the team submission is + being assessed. + +- If the `staff` assessment step (which is the only valid assessment type + for team-based ORAs) is selected for the block, one + ``TeamStaffWorkflow`` record is created for the team. + +- One ``Assessment`` record and (eventually, after grading) one ``Score`` + record **per team member** is/are created. From cbf13005050e7df8a06d8ec274e54255ba727676 Mon Sep 17 00:00:00 2001 From: salmannawaz Date: Tue, 6 Oct 2026 15:45:06 +0500 Subject: [PATCH 7/7] docs: update release process docs for semantic-release automation Both release_process docs still described bumping the version by hand in openassessment/__init__.py and package.json, then manually tagging a GitHub release. That path no longer exists: python-semantic-release now reads Conventional Commits messages to pick the next version, tags it, and publishes it via .github/workflows/release.yml. Update both docs to describe that flow instead. Co-Authored-By: Claude Sonnet 5 --- .github/release_process.md | 12 ++--- docs/release_process.rst | 95 ++++++++++++++++++++++++++------------ 2 files changed, 72 insertions(+), 35 deletions(-) diff --git a/.github/release_process.md b/.github/release_process.md index 12c3e583fe..ed7416304e 100644 --- a/.github/release_process.md +++ b/.github/release_process.md @@ -4,19 +4,19 @@ Before Merging a pull request: - [ ] If any user-facing text has changed, run `make check_translations_up_to_date` to recompile translation files - [ ] If your changes include JS/CSS changes, run `make static` to rebuild static assets -- [ ] Get a green Travis build for this PR +- [ ] Get a green CI build for this PR - [ ] Address PR comments - [ ] Get approving review from code owner -- [ ] Bump version number in [openassessment/\_\_init\_\_.py](../openassessment/__init__.py) and [package.json](../package.json) following [semantic versioning](https://semver.org/) conventions +- [ ] Use a [Conventional Commits](https://www.conventionalcommits.org/) commit message (checked by the `commitlint` workflow) so [python-semantic-release](https://python-semantic-release.readthedocs.io/) can determine the next version automatically — there is no version number to bump by hand ## Publish to PyPi -When a PR is ready to release, do the following to publish a new version of ORA: +Publishing happens automatically; there's nothing to do by hand: - [ ] Merge to `master` -- [ ] Create a [release tag on GitHub](https://github.com/openedx/edx-ora2/releases) matching version number in `openassessment/__init__.py`/`package.json` -- [ ] Grab a coffee while our automated process submits the build to PyPi -- [ ] Confirm new version appears in [PyPi: ora2](https://pypi.org/project/ora2) +- [ ] The [Semantic Release workflow](workflows/release.yml) re-runs CI, and if it passes, python-semantic-release inspects the commit messages since the last release to compute the next version, creates the git tag and GitHub release, and builds the distributions +- [ ] The workflow's `publish_to_pypi` job uploads those distributions to PyPI +- [ ] Confirm the new version appears in [PyPi: ora2](https://pypi.org/project/ora2) ## Release to Production diff --git a/docs/release_process.rst b/docs/release_process.rst index cf3f6c99a6..918720fa25 100644 --- a/docs/release_process.rst +++ b/docs/release_process.rst @@ -5,67 +5,104 @@ ORA2 Release Processs Github Checklist ---------------- -- create a PR on edx-ora2 containing the version bump. This needs to happen in `setup.py `_ and `package.json `_ -- get a green Travis build on said PR +- Use a `Conventional Commits `_ + commit message so `python-semantic-release + `_ can determine the + next version automatically; there is no version file to bump by hand. +- get a green CI build on said PR - merge to master - green build on master -- create a release `tag on GitHub `_ -- ORA2 is a dependency in platform. If immediate release is needed, create PR to update `requirements files` in `edx-platform`. See `PR for reference `_ . Otherwise, a bot will automatically update the requirements in platform. -- If manual testing of the changes against edx-platform is desired, create a sandbox. +- The `Semantic Release workflow + `_ + re-runs CI, and if it passes, python-semantic-release inspects the + commit messages since the last release to compute the next version, + creates the git tag and GitHub release, builds the distributions, and + publishes them to PyPI -- all without manual steps. +- ORA2 is a dependency in platform. If immediate release is needed, + create PR to update `requirements files` in `edx-platform`. See `PR + for reference `_. + Otherwise, a bot will automatically update the requirements in + platform. +- If manual testing of the changes against edx-platform is desired, + create a sandbox. - get green build on the edx-platform PR, merge - manually test changes on stage Updating translations --------------------- -If you change any text that is ultimately wrapped by ugettext (in a python, JS, or HTML file), you'll have to update translations. +If you change any text that is ultimately wrapped by ugettext (in a +python, JS, or HTML file), you'll have to update translations. -Do the following inside **your docker container**, with the **virtual env activated**: +Do the following inside **your docker container**, with the **virtual +env activated**: +- Run make ``check_translations_up_to_date`` - this extracts and + compiles translations, and checks if the resulting files are + up-to-date -- Run make ``check_translations_up_to_date`` - this extracts and compiles translations, and checks if the resulting files are up-to-date +- Because the detect_changed_source_translations make target looks at + your remote branch for determining the up-to-datedness of your files, + you'll have to: -- Because the detect_changed_source_translations make target looks at your remote branch for determining the up-to-datedness of your files, you'll have to: + - commit your changed translation files (git diff for a quick sanity + check first) - - commit your changed translation files (git diff for a quick sanity check first) - - push these changes to your remote branch - -- The translations quality check on travis should now pass. - - To verify that you're in a good state, you can again run ``make check_translations_up_to_date`` from your container. It should pass. It will also modify the POT timestamps of some files - you can discard these by doing git checkout . (this just resets your locally changed files to their remote branch state). - +- The translations quality check in CI should now pass. + + - To verify that you're in a good state, you can again run ``make + check_translations_up_to_date`` from your container. It should + pass. It will also modify the POT timestamps of some files - you + can discard these by doing git checkout . (this just resets your + locally changed files to their remote branch state). + Releasing edx-submissions ------------------------- - ensure that the release number has been bumped in setup.py -- create a corresponding release in `edx submissions on GitHub: `_ +- create a corresponding release in `edx submissions on GitHub: + `_ - generate a diff between the new tag and the old one - - e.g. https://github.com/openedx/edx-submissions/compare/0.1.2...0.1.3 - - verify that only the expected changes are included + - e.g. https://github.com/openedx/edx-submissions/compare/0.1.2...0.1.3 + - verify that only the expected changes are included - ask anyone with commits to verify their changes on stage - + - create a PR to update edx-platform to refer to the new release: - - modify the edx-submissions line in requirements files in edx platform - - Once the PR has been merged, edx-submissions will release with the next edx-platform release - - Note: this means that it should be tested on stage as with any other platform change - + - modify the edx-submissions line in requirements files in edx + platform + - Once the PR has been merged, edx-submissions will release with the + next edx-platform release + - Note: this means that it should be tested on stage as with any + other platform change + Releasing edx-ora2 ------------------ -- smoke test the current state of ORA on the `nightly stage of master sandbox `_. This sandbox is built automatically once a day by a `Jenkins job `_ which is also used for running automated tests +- smoke test the current state of ORA on the `nightly stage of master + sandbox `_. This sandbox is built + automatically once a day by a `Jenkins job + `_ which is also used for + running automated tests -- ensure that the release number has been bumped in setup.py +- merge your changes to master using a Conventional Commits message; + python-semantic-release computes and tags the next version and + publishes it to PyPI automatically -- see the Github Checklist above -- create a corresponding release on GitHub: https://github.com/openedx/edx-ora2/releases +- create a corresponding release on GitHub: + https://github.com/openedx/edx-ora2/releases - generate a diff between the new tag and the old one - e.g. https://github.com/openedx/edx-ora2/compare/0.2.2...0.2.3 - verify that only the expected changes are included - ask anyone with commits to verify their changes on stage - -- create a PR to update edx-platform to refer to the new release if immediate release is needed. Otherwise an automated job will auto-update the edx-platform version around 5am EST -- Once the PR has been merged, ORA will release with the next edx-platform release +- create a PR to update edx-platform to refer to the new release if + immediate release is needed. Otherwise an automated job will + auto-update the edx-platform version around 5am EST + +- Once the PR has been merged, ORA will release with the next + edx-platform release