diff --git a/openedx_events/event_bus/avro/custom_serializers.py b/openedx_events/event_bus/avro/custom_serializers.py index 37a8a150..d41616c2 100644 --- a/openedx_events/event_bus/avro/custom_serializers.py +++ b/openedx_events/event_bus/avro/custom_serializers.py @@ -5,6 +5,7 @@ from abc import ABC, abstractmethod from datetime import datetime +from ccx_keys.locator import CCXLocator from opaque_keys.edx.keys import CourseKey, UsageKey from opaque_keys.edx.locator import LibraryLocatorV2, LibraryUsageLocatorV2 @@ -49,6 +50,25 @@ def deserialize(data: str): return CourseKey.from_string(data) +class CcxCourseLocatorAvroSerializer(BaseCustomTypeAvroSerializer): + """ + CustomTypeAvroSerializer for CCXLocator class. + """ + + cls = CCXLocator + field_type = PYTHON_TYPE_TO_AVRO_MAPPING[str] + + @staticmethod + def serialize(obj) -> str: + """Serialize obj into string.""" + return str(obj) + + @staticmethod + def deserialize(data: str): + """Deserialize string into obj.""" + return CCXLocator.from_string(data) + + class DatetimeAvroSerializer(BaseCustomTypeAvroSerializer): """ CustomTypeAvroSerializer for datetime class. @@ -131,6 +151,7 @@ def deserialize(data: str): DEFAULT_CUSTOM_SERIALIZERS = [ CourseKeyAvroSerializer, + CcxCourseLocatorAvroSerializer, DatetimeAvroSerializer, LibraryLocatorV2AvroSerializer, LibraryUsageLocatorV2AvroSerializer, diff --git a/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+badge+awarded+v1_schema.avsc b/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+badge+awarded+v1_schema.avsc new file mode 100644 index 00000000..6bac2197 --- /dev/null +++ b/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+badge+awarded+v1_schema.avsc @@ -0,0 +1,100 @@ +{ + "name": "CloudEvent", + "type": "record", + "doc": "Avro Event Format for CloudEvents created with openedx_events/schema", + "fields": [ + { + "name": "badge", + "type": { + "name": "BadgeData", + "type": "record", + "fields": [ + { + "name": "uuid", + "type": "string" + }, + { + "name": "user", + "type": { + "name": "UserData", + "type": "record", + "fields": [ + { + "name": "id", + "type": "long" + }, + { + "name": "is_active", + "type": "boolean" + }, + { + "name": "pii", + "type": { + "name": "UserPersonalData", + "type": "record", + "fields": [ + { + "name": "username", + "type": "string" + }, + { + "name": "email", + "type": "string" + }, + { + "name": "name", + "type": "string" + } + ] + } + } + ] + } + }, + { + "name": "template", + "type": { + "name": "BadgeTemplateData", + "type": "record", + "fields": [ + { + "name": "uuid", + "type": "string" + }, + { + "name": "origin", + "type": "string" + }, + { + "name": "name", + "type": [ + "null", + "string" + ], + "default": null + }, + { + "name": "description", + "type": [ + "null", + "string" + ], + "default": null + }, + { + "name": "image_url", + "type": [ + "null", + "string" + ], + "default": null + } + ] + } + } + ] + } + } + ], + "namespace": "org.openedx.learning.badge.awarded.v1" +} \ No newline at end of file diff --git a/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+badge+revoked+v1_schema.avsc b/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+badge+revoked+v1_schema.avsc new file mode 100644 index 00000000..0cb96323 --- /dev/null +++ b/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+badge+revoked+v1_schema.avsc @@ -0,0 +1,100 @@ +{ + "name": "CloudEvent", + "type": "record", + "doc": "Avro Event Format for CloudEvents created with openedx_events/schema", + "fields": [ + { + "name": "badge", + "type": { + "name": "BadgeData", + "type": "record", + "fields": [ + { + "name": "uuid", + "type": "string" + }, + { + "name": "user", + "type": { + "name": "UserData", + "type": "record", + "fields": [ + { + "name": "id", + "type": "long" + }, + { + "name": "is_active", + "type": "boolean" + }, + { + "name": "pii", + "type": { + "name": "UserPersonalData", + "type": "record", + "fields": [ + { + "name": "username", + "type": "string" + }, + { + "name": "email", + "type": "string" + }, + { + "name": "name", + "type": "string" + } + ] + } + } + ] + } + }, + { + "name": "template", + "type": { + "name": "BadgeTemplateData", + "type": "record", + "fields": [ + { + "name": "uuid", + "type": "string" + }, + { + "name": "origin", + "type": "string" + }, + { + "name": "name", + "type": [ + "null", + "string" + ], + "default": null + }, + { + "name": "description", + "type": [ + "null", + "string" + ], + "default": null + }, + { + "name": "image_url", + "type": [ + "null", + "string" + ], + "default": null + } + ] + } + } + ] + } + } + ], + "namespace": "org.openedx.learning.badge.revoked.v1" +} \ No newline at end of file diff --git a/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+ccx+course+passing+status+v1_schema.avsc b/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+ccx+course+passing+status+v1_schema.avsc new file mode 100644 index 00000000..2f0056aa --- /dev/null +++ b/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+ccx+course+passing+status+v1_schema.avsc @@ -0,0 +1,108 @@ +{ + "name": "CloudEvent", + "type": "record", + "doc": "Avro Event Format for CloudEvents created with openedx_events/schema", + "fields": [ + { + "name": "course_passing_status", + "type": { + "name": "CcxCoursePassingStatusData", + "type": "record", + "fields": [ + { + "name": "status", + "type": "string" + }, + { + "name": "user", + "type": { + "name": "UserData", + "type": "record", + "fields": [ + { + "name": "id", + "type": "long" + }, + { + "name": "is_active", + "type": "boolean" + }, + { + "name": "pii", + "type": { + "name": "UserPersonalData", + "type": "record", + "fields": [ + { + "name": "username", + "type": "string" + }, + { + "name": "email", + "type": "string" + }, + { + "name": "name", + "type": "string" + } + ] + } + } + ] + } + }, + { + "name": "course", + "type": { + "name": "CcxCourseData", + "type": "record", + "fields": [ + { + "name": "ccx_course_key", + "type": "string" + }, + { + "name": "master_course_key", + "type": "string" + }, + { + "name": "display_name", + "type": "string" + }, + { + "name": "coach_email", + "type": "string" + }, + { + "name": "start", + "type": [ + "null", + "string" + ], + "default": null + }, + { + "name": "end", + "type": [ + "null", + "string" + ], + "default": null + }, + { + "name": "max_students_allowed", + "type": [ + "null", + "long" + ], + "default": null + } + ] + } + } + ] + } + } + ], + "namespace": "org.openedx.learning.ccx.course.passing.status.v1" +} \ No newline at end of file diff --git a/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+course+passing+status+v1_schema.avsc b/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+course+passing+status+v1_schema.avsc new file mode 100644 index 00000000..085c11c1 --- /dev/null +++ b/openedx_events/event_bus/avro/tests/schemas/org+openedx+learning+course+passing+status+v1_schema.avsc @@ -0,0 +1,92 @@ +{ + "name": "CloudEvent", + "type": "record", + "doc": "Avro Event Format for CloudEvents created with openedx_events/schema", + "fields": [ + { + "name": "course_passing_status", + "type": { + "name": "CoursePassingStatusData", + "type": "record", + "fields": [ + { + "name": "status", + "type": "string" + }, + { + "name": "course", + "type": { + "name": "CourseData", + "type": "record", + "fields": [ + { + "name": "course_key", + "type": "string" + }, + { + "name": "display_name", + "type": "string" + }, + { + "name": "start", + "type": [ + "null", + "string" + ], + "default": null + }, + { + "name": "end", + "type": [ + "null", + "string" + ], + "default": null + } + ] + } + }, + { + "name": "user", + "type": { + "name": "UserData", + "type": "record", + "fields": [ + { + "name": "id", + "type": "long" + }, + { + "name": "is_active", + "type": "boolean" + }, + { + "name": "pii", + "type": { + "name": "UserPersonalData", + "type": "record", + "fields": [ + { + "name": "username", + "type": "string" + }, + { + "name": "email", + "type": "string" + }, + { + "name": "name", + "type": "string" + } + ] + } + } + ] + } + } + ] + } + } + ], + "namespace": "org.openedx.learning.course.passing.status.v1" +} \ No newline at end of file diff --git a/openedx_events/learning/data.py b/openedx_events/learning/data.py index 2aa03baf..9595dbf1 100644 --- a/openedx_events/learning/data.py +++ b/openedx_events/learning/data.py @@ -8,6 +8,8 @@ from typing import List, Optional import attr +from attr.validators import in_ +from ccx_keys.locator import CCXLocator from opaque_keys.edx.keys import CourseKey, UsageKey @@ -74,6 +76,30 @@ class CourseData: end = attr.ib(type=datetime, default=None) +@attr.s(frozen=True) +class CcxCourseData: + """ + Represents data for a CCX (Custom Courses for edX) course. + + Attributes: + ccx_course_key (CCXLocator): The unique identifier for the CCX course. + master_course_key (CourseKey): The unique identifier for the original course from which the CCX is derived. + display_name (str): The name of the CCX course as it should appear to users. + coach_email (str): The email address of the coach (instructor) for the CCX course. + start (str, optional): The start date of the CCX course. Defaults to None, indicating no specific start date. + end (str, optional): The end date of the CCX course. Defaults to None, indicating no specific end date. + max_students_allowed (int, optional): The maximum number of students that can enroll in the CCX course. Defaults to None, indicating no limit. + """ + + ccx_course_key = attr.ib(type=CCXLocator) + master_course_key = attr.ib(type=CourseKey) + display_name = attr.ib(type=str, factory=str) + coach_email = attr.ib(type=str, factory=str) + start = attr.ib(type=str, default=None) + end = attr.ib(type=str, default=None) + max_students_allowed = attr.ib(type=int, default=None) + + @attr.s(frozen=True) class CourseEnrollmentData: """ @@ -476,3 +502,73 @@ class ORASubmissionData: id = attr.ib(type=str) file_downloads = attr.ib(type=List[ORAFileDownloadsData], factory=list) + + +@attr.s(frozen=True) +class CoursePassingStatusData: + """ + Represents the event data when a user's grade is updated, indicates if current grade is enough for course passing. + + Attributes: + status (str): A string containing information about user's current course grade value in comparison to the grading policy threshold. + user (UserData): An instance of UserData containing information about the user whose grade was updated. + course (CourseData): An instance of CourseData containing details about the course in which the grade was updated. + """ + PASSING = 'passing' + FAILING = 'failing' + STATUSES = [PASSING, FAILING] + + status = attr.ib(type=str, validator=in_(STATUSES)) + course = attr.ib(type=CourseData) + user = attr.ib(type=UserData) + + +@attr.s(frozen=True) +class CcxCoursePassingStatusData(CoursePassingStatusData): + """ + Extends CoursePassingStatusData for CCX courses, specifying CCX course data. + + This class is used for events where a user's grade crosses a threshold specifically in a CCX course, + providing a custom course attribute suited for CCX course instances. + + Attributes: + course (CcxCourseData): An instance of CcxCourseData containing details about the CCX course in which the grade threshold was crossed. + All other attributes are inherited from CoursePassingStatusData. + """ + course = attr.ib(type=CcxCourseData) + + +@attr.s(frozen=True) +class BadgeTemplateData: + """ + Attributes defined for Open edX badge template data object. + + Arguments: + uuid (str): UUID of the badge template + origin (str): type of badge template + name (str): badge name + description (str): badge description + image_url (str): badge image url + """ + + uuid = attr.ib(type=str) + origin = attr.ib(type=str) + name = attr.ib(type=str, default=None) + description = attr.ib(type=str, default=None) + image_url = attr.ib(type=str, default=None) + + +@attr.s(frozen=True) +class BadgeData: + """ + Attributes defined for the Open edX badge data object. + + Arguments: + uuid (str): the UUID of the badge + user (UserData): user associated with the badge + template (BadgeTemplateData): badge template data + """ + + uuid = attr.ib(type=str) + user = attr.ib(type=UserData) + template = attr.ib(type=BadgeTemplateData) diff --git a/openedx_events/learning/signals.py b/openedx_events/learning/signals.py index 9459d891..78025633 100644 --- a/openedx_events/learning/signals.py +++ b/openedx_events/learning/signals.py @@ -9,11 +9,14 @@ """ from openedx_events.learning.data import ( + BadgeData, + CcxCoursePassingStatusData, CertificateData, CohortData, CourseAccessRoleData, CourseDiscussionConfigurationData, CourseEnrollmentData, + CoursePassingStatusData, CourseNotificationData, DiscussionThreadData, ExamAttemptData, @@ -350,3 +353,65 @@ "submission": ORASubmissionData, }, ) + + +# .. event_type: org.openedx.learning.ora.submission.created.v1 +# .. event_name: ORA_SUBMISSION_CREATED +# .. event_description: Emitted when a new ORA submission is created +# .. event_data: ORASubmissionData +# Warning: This event is currently incompatible with the event bus, list/dict cannot be serialized yet +ORA_SUBMISSION_CREATED = OpenEdxPublicSignal( + event_type="org.openedx.learning.ora.submission.created.v1", + data={ + "submission": ORASubmissionData, + }, +) + + + +# .. event_type: org.openedx.learning.course.passing.status.updated.v1 +# .. event_name: COURSE_PASSING_STATUS_UPDATED +# .. event_description: Emitted when course grade updates. +# .. event_data: CoursePassingStatusData +COURSE_PASSING_STATUS_UPDATED = OpenEdxPublicSignal( + event_type="org.openedx.learning.course.passing.status.updated.v1", + data={ + "course_passing_status": CoursePassingStatusData, + } +) + + +# .. event_type: org.openedx.learning.ccx.course.passing.status.updated.v1 +# .. event_name: CCX_COURSE_PASSING_STATUS_UPDATED +# .. event_description: Emitted when a CCX course grade updates. +# .. event_data: CcxCoursePassingStatusData +CCX_COURSE_PASSING_STATUS_UPDATED = OpenEdxPublicSignal( + event_type="org.openedx.learning.ccx.course.passing.status.updated.v1", + data={ + "course_passing_status": CcxCoursePassingStatusData, + } +) + + +# .. event_type: org.openedx.learning.badge.awarded.v1 +# .. event_name: BADGE_AWARDED +# .. event_description: Emit when a badge is awarded to a learner +# .. event_data: BadgeData +BADGE_AWARDED = OpenEdxPublicSignal( + event_type="org.openedx.learning.badge.awarded.v1", + data={ + "badge": BadgeData, + } +) + + +# .. event_type: org.openedx.learning.badge.revoked.v1 +# .. event_name: BADGE_REVOKED +# .. event_description: Emit when a badge is revoked for a learner +# .. event_data: BadgeData +BADGE_REVOKED = OpenEdxPublicSignal( + event_type="org.openedx.learning.badge.revoked.v1", + data={ + "badge": BadgeData, + } +) \ No newline at end of file diff --git a/requirements/base.in b/requirements/base.in index 5afd59f7..3eb50114 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -6,3 +6,4 @@ django attrs fastavro edx-opaque-keys[django] +edx-ccx-keys \ No newline at end of file diff --git a/requirements/base.txt b/requirements/base.txt index 6e35e604..743280a1 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -29,8 +29,12 @@ django-waffle==4.1.0 # via edx-django-utils edx-django-utils==5.12.0 # via -r requirements/base.in -edx-opaque-keys[django]==2.5.1 +edx-ccx-keys==1.2.1 # via -r requirements/base.in +edx-opaque-keys[django]==2.5.1 + # via + # -r requirements/base.in + # edx-ccx-keys fastavro==1.9.4 # via -r requirements/base.in newrelic==9.8.0 @@ -45,6 +49,8 @@ pymongo==3.13.0 # via edx-opaque-keys pynacl==1.5.0 # via edx-django-utils +six==1.16.0 + # via edx-ccx-keys sqlparse==0.4.4 # via django stevedore==5.2.0 diff --git a/requirements/ci.txt b/requirements/ci.txt index 641296fb..202b59eb 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade diff --git a/requirements/dev.txt b/requirements/dev.txt index 50519892..89288598 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -111,16 +111,16 @@ docutils==0.20.1 # via # -r requirements/quality.txt # readme-renderer +edx-ccx-keys==1.2.1 + # via -r requirements/quality.txt edx-django-utils==5.12.0 # via -r requirements/quality.txt edx-lint==5.3.6 # via -r requirements/quality.txt edx-opaque-keys[django]==2.5.1 - # via -r requirements/quality.txt -exceptiongroup==1.2.0 # via # -r requirements/quality.txt - # pytest + # edx-ccx-keys fastavro==1.9.4 # via -r requirements/quality.txt filelock==3.13.4 @@ -135,10 +135,7 @@ idna==3.6 importlib-metadata==6.11.0 # via # -c https://raw.githubusercontent.com/openedx/edx-lint/master/edx_lint/files/common_constraints.txt - # -r requirements/pip-tools.txt # -r requirements/quality.txt - # build - # keyring # twine importlib-resources==6.4.0 # via @@ -344,6 +341,7 @@ secretstorage==3.3.3 six==1.16.0 # via # -r requirements/quality.txt + # edx-ccx-keys # edx-lint snowballstemmer==2.2.0 # via @@ -363,19 +361,6 @@ text-unidecode==1.3 # via # -r requirements/quality.txt # python-slugify -tomli==2.0.1 - # via - # -r requirements/ci.txt - # -r requirements/pip-tools.txt - # -r requirements/quality.txt - # build - # coverage - # pip-tools - # pylint - # pyproject-api - # pyproject-hooks - # pytest - # tox tomlkit==0.12.4 # via # -r requirements/quality.txt @@ -387,11 +372,7 @@ twine==5.0.0 typing-extensions==4.11.0 # via # -r requirements/quality.txt - # asgiref - # astroid # edx-opaque-keys - # pylint - # rich urllib3==2.2.1 # via # -r requirements/quality.txt @@ -411,10 +392,8 @@ wrapt==1.16.0 # astroid zipp==3.18.1 # via - # -r requirements/pip-tools.txt # -r requirements/quality.txt # importlib-metadata - # importlib-resources # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/doc.txt b/requirements/doc.txt index 06a3a454..2493ab8d 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,12 +1,12 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # accessible-pygments==0.0.4 # via pydata-sphinx-theme -alabaster==0.7.13 +alabaster==0.7.16 # via sphinx asgiref==3.8.1 # via @@ -72,21 +72,21 @@ django-waffle==4.1.0 # edx-django-utils doc8==1.1.1 # via -r requirements/doc.in -docutils==0.19 +docutils==0.20.1 # via # doc8 # pydata-sphinx-theme # readme-renderer # restructuredtext-lint # sphinx +edx-ccx-keys==1.2.1 + # via -r requirements/test.txt edx-django-utils==5.12.0 # via -r requirements/test.txt edx-opaque-keys[django]==2.5.1 - # via -r requirements/test.txt -exceptiongroup==1.2.0 # via # -r requirements/test.txt - # pytest + # edx-ccx-keys fastavro==1.9.4 # via -r requirements/test.txt idna==3.6 @@ -96,9 +96,6 @@ imagesize==1.4.1 importlib-metadata==6.11.0 # via # -c https://raw.githubusercontent.com/openedx/edx-lint/master/edx_lint/files/common_constraints.txt - # build - # keyring - # sphinx # twine importlib-resources==6.4.0 # via keyring @@ -168,7 +165,7 @@ pycparser==2.22 # via # -r requirements/test.txt # cffi -pydata-sphinx-theme==0.14.4 +pydata-sphinx-theme==0.15.2 # via sphinx-book-theme pygments==2.17.2 # via @@ -201,8 +198,6 @@ python-slugify==8.0.4 # via # -r requirements/test.txt # code-annotations -pytz==2024.1 - # via babel pyyaml==6.0.1 # via # -r requirements/test.txt @@ -225,12 +220,15 @@ rich==13.7.1 secretstorage==3.3.3 # via keyring six==1.16.0 - # via livereload + # via + # -r requirements/test.txt + # edx-ccx-keys + # livereload snowballstemmer==2.2.0 # via sphinx soupsieve==2.5 # via beautifulsoup4 -sphinx==6.2.1 +sphinx==7.2.6 # via # -r requirements/doc.in # pydata-sphinx-theme @@ -238,27 +236,27 @@ sphinx==6.2.1 # sphinx-book-theme # sphinx-copybutton # sphinxcontrib-contentui -sphinx-autobuild==2021.3.14 +sphinx-autobuild==2024.2.4 # via -r requirements/doc.in -sphinx-book-theme==1.0.1 +sphinx-book-theme==1.1.2 # via -r requirements/doc.in sphinx-copybutton==0.5.2 # via -r requirements/doc.in -sphinxcontrib-applehelp==1.0.4 +sphinxcontrib-applehelp==1.0.8 # via sphinx sphinxcontrib-contentui==0.2.5 # via -r requirements/doc.in -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==1.0.6 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-htmlhelp==2.0.5 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-mermaid==0.9.2 # via -r requirements/doc.in -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==1.0.7 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==1.1.10 # via sphinx sqlparse==0.4.4 # via @@ -275,14 +273,6 @@ text-unidecode==1.3 # via # -r requirements/test.txt # python-slugify -tomli==2.0.1 - # via - # -r requirements/test.txt - # build - # coverage - # doc8 - # pyproject-hooks - # pytest tornado==6.4 # via livereload twine==5.0.0 @@ -290,10 +280,8 @@ twine==5.0.0 typing-extensions==4.11.0 # via # -r requirements/test.txt - # asgiref # edx-opaque-keys # pydata-sphinx-theme - # rich urllib3==2.2.1 # via # requests diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 8ea29a86..18ca69b3 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -8,10 +8,6 @@ build==1.2.1 # via pip-tools click==8.1.7 # via pip-tools -importlib-metadata==6.11.0 - # via - # -c https://raw.githubusercontent.com/openedx/edx-lint/master/edx_lint/files/common_constraints.txt - # build packaging==24.0 # via build pip-tools==7.4.1 @@ -20,11 +16,6 @@ pyproject-hooks==1.0.0 # via # build # pip-tools -tomli==2.0.1 - # via - # build - # pip-tools - # pyproject-hooks wheel==0.43.0 # via pip-tools zipp==3.18.1 diff --git a/requirements/pip.txt b/requirements/pip.txt index cf449024..8d1b8fef 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade diff --git a/requirements/quality.txt b/requirements/quality.txt index 3080054f..fca776ae 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -71,16 +71,16 @@ django-waffle==4.1.0 # edx-django-utils docutils==0.20.1 # via readme-renderer +edx-ccx-keys==1.2.1 + # via -r requirements/test.txt edx-django-utils==5.12.0 # via -r requirements/test.txt edx-lint==5.3.6 # via -r requirements/quality.in edx-opaque-keys[django]==2.5.1 - # via -r requirements/test.txt -exceptiongroup==1.2.0 # via # -r requirements/test.txt - # pytest + # edx-ccx-keys fastavro==1.9.4 # via -r requirements/test.txt idna==3.6 @@ -88,7 +88,6 @@ idna==3.6 importlib-metadata==6.11.0 # via # -c https://raw.githubusercontent.com/openedx/edx-lint/master/edx_lint/files/common_constraints.txt - # keyring # twine importlib-resources==6.4.0 # via keyring @@ -224,7 +223,10 @@ rich==13.7.1 secretstorage==3.3.3 # via keyring six==1.16.0 - # via edx-lint + # via + # -r requirements/test.txt + # edx-ccx-keys + # edx-lint snowballstemmer==2.2.0 # via pydocstyle sqlparse==0.4.4 @@ -241,12 +243,6 @@ text-unidecode==1.3 # via # -r requirements/test.txt # python-slugify -tomli==2.0.1 - # via - # -r requirements/test.txt - # coverage - # pylint - # pytest tomlkit==0.12.4 # via pylint twine==5.0.0 @@ -254,11 +250,7 @@ twine==5.0.0 typing-extensions==4.11.0 # via # -r requirements/test.txt - # asgiref - # astroid # edx-opaque-keys - # pylint - # rich urllib3==2.2.1 # via # requests diff --git a/requirements/test.txt b/requirements/test.txt index 52f4b9bc..1d6e94f3 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade @@ -44,12 +44,14 @@ django-waffle==4.1.0 # via # -r requirements/base.txt # edx-django-utils +edx-ccx-keys==1.2.1 + # via -r requirements/base.txt edx-django-utils==5.12.0 # via -r requirements/base.txt edx-opaque-keys[django]==2.5.1 - # via -r requirements/base.txt -exceptiongroup==1.2.0 - # via pytest + # via + # -r requirements/base.txt + # edx-ccx-keys fastavro==1.9.4 # via -r requirements/base.txt iniconfig==2.0.0 @@ -98,6 +100,10 @@ python-slugify==8.0.4 # via code-annotations pyyaml==6.0.1 # via code-annotations +six==1.16.0 + # via + # -r requirements/base.txt + # edx-ccx-keys sqlparse==0.4.4 # via # -r requirements/base.txt @@ -117,5 +123,4 @@ tomli==2.0.1 typing-extensions==4.11.0 # via # -r requirements/base.txt - # asgiref # edx-opaque-keys