Merge pull request #26643 from edx/jenkins/upgrade-python-requirements-5906bde

Python Requirements Update
This commit is contained in:
Usama Sadiq
2021-02-22 17:04:07 +05:00
committed by GitHub
47 changed files with 93 additions and 106 deletions

View File

@@ -1332,7 +1332,7 @@ def create_xblock_info(xblock, data=None, metadata=None, include_ancestor_info=F
xblock_info['staff_only_message'] = True
elif child_info and child_info['children']:
xblock_info['staff_only_message'] = all(
[child['staff_only_message'] for child in child_info['children']]
child['staff_only_message'] for child in child_info['children']
)
else:
xblock_info['staff_only_message'] = False

View File

@@ -177,7 +177,7 @@ def _course_team_user(request, course_key, email):
role_added = True
else:
return permissions_error_response
elif role.has_user(user, check_user_activation=False):
elif role.has_user(user, check_user_activation=False): # pylint: disable=no-value-for-parameter
# Remove the user from this old role:
old_roles.add(role)

View File

@@ -72,6 +72,6 @@ def should_send_proctoring_requirements_email(username, course_id):
settings={'is_time_limited': True}
)
has_proctored_exam = any([exam.is_proctored_exam for exam in timed_exams])
has_proctored_exam = any(exam.is_proctored_exam for exam in timed_exams)
return has_proctored_exam

View File

@@ -1,9 +1,9 @@
# lint-amnesty, pylint: disable=missing-module-docstring
import unittest
import pytest
from tempfile import NamedTemporaryFile
import pytest
import six
from django.conf import settings
from django.core.files.uploadedfile import SimpleUploadedFile
@@ -13,13 +13,11 @@ from testfixtures import LogCapture
from common.djangoapps.course_modes.models import CourseMode
from common.djangoapps.course_modes.tests.factories import CourseModeFactory
from common.djangoapps.student.models import CourseEnrollment
from common.djangoapps.student.models import BulkChangeEnrollmentConfiguration, CourseEnrollment
from common.djangoapps.student.tests.factories import UserFactory
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
from common.djangoapps.student.models import BulkChangeEnrollmentConfiguration
LOGGER_NAME = 'common.djangoapps.student.management.commands.bulk_change_enrollment_csv'

View File

@@ -52,7 +52,7 @@ class JwtHasTpaProviderFilterForRequestedProvider(BasePermission):
# TODO: Remove ApiKeyHeaderPermission. Check deprecated_api_key_header custom attribute for active usage.
_NOT_JWT_RESTRICTED_TPA_PERMISSIONS = (
C(NotJwtRestrictedApplication) &
(C(IsSuperuser) | ApiKeyHeaderPermission | C(IsStaff))
(C(IsSuperuser) | ApiKeyHeaderPermission | C(IsStaff)) # pylint: disable=unsupported-binary-operation
)
_JWT_RESTRICTED_TPA_PERMISSIONS = (
C(JwtRestrictedApplication) &

View File

@@ -100,21 +100,21 @@ class TransactionManagersTestCase(TransactionTestCase):
if connection.vendor != 'mysql':
raise unittest.SkipTest('Only works on MySQL.')
outer_atomic()(do_nothing)()
outer_atomic()(do_nothing)() # pylint: disable=not-callable
with atomic():
atomic()(do_nothing)()
atomic()(do_nothing)() # pylint: disable=not-callable
with outer_atomic():
atomic()(do_nothing)()
atomic()(do_nothing)() # pylint: disable=not-callable
with self.assertRaisesRegex(TransactionManagementError, 'Cannot be inside an atomic block.'):
with atomic():
outer_atomic()(do_nothing)()
outer_atomic()(do_nothing)() # pylint: disable=not-callable
with self.assertRaisesRegex(TransactionManagementError, 'Cannot be inside an atomic block.'):
with outer_atomic():
outer_atomic()(do_nothing)()
outer_atomic()(do_nothing)() # pylint: disable=not-callable
def test_named_outer_atomic_nesting(self):
"""
@@ -124,44 +124,44 @@ class TransactionManagersTestCase(TransactionTestCase):
if connection.vendor != 'mysql':
raise unittest.SkipTest('Only works on MySQL.')
outer_atomic(name='abc')(do_nothing)()
outer_atomic(name='abc')(do_nothing)() # pylint: disable=not-callable
with atomic():
outer_atomic(name='abc')(do_nothing)()
outer_atomic(name='abc')(do_nothing)() # pylint: disable=not-callable
with enable_named_outer_atomic('abc'):
outer_atomic(name='abc')(do_nothing)() # Not nested.
outer_atomic(name='abc')(do_nothing)() # pylint: disable=not-callable # Not nested.
with atomic():
outer_atomic(name='pqr')(do_nothing)() # Not enabled.
outer_atomic(name='pqr')(do_nothing)() # pylint: disable=not-callable # Not enabled.
with self.assertRaisesRegex(TransactionManagementError, 'Cannot be inside an atomic block.'):
with atomic():
outer_atomic(name='abc')(do_nothing)()
outer_atomic(name='abc')(do_nothing)() # pylint: disable=not-callable
with enable_named_outer_atomic('abc', 'def'):
outer_atomic(name='def')(do_nothing)() # Not nested.
outer_atomic(name='def')(do_nothing)() # pylint: disable=not-callable # Not nested.
with atomic():
outer_atomic(name='pqr')(do_nothing)() # Not enabled.
outer_atomic(name='pqr')(do_nothing)() # pylint: disable=not-callable # Not enabled.
with self.assertRaisesRegex(TransactionManagementError, 'Cannot be inside an atomic block.'):
with atomic():
outer_atomic(name='def')(do_nothing)()
outer_atomic(name='def')(do_nothing)() # pylint: disable=not-callable
with self.assertRaisesRegex(TransactionManagementError, 'Cannot be inside an atomic block.'):
with outer_atomic():
outer_atomic(name='def')(do_nothing)()
outer_atomic(name='def')(do_nothing)() # pylint: disable=not-callable
with self.assertRaisesRegex(TransactionManagementError, 'Cannot be inside an atomic block.'):
with atomic():
outer_atomic(name='abc')(do_nothing)()
outer_atomic(name='abc')(do_nothing)() # pylint: disable=not-callable
with self.assertRaisesRegex(TransactionManagementError, 'Cannot be inside an atomic block.'):
with outer_atomic():
outer_atomic(name='abc')(do_nothing)()
outer_atomic(name='abc')(do_nothing)() # pylint: disable=not-callable
@ddt.ddt

View File

@@ -9,7 +9,6 @@ from datetime import datetime
from io import StringIO
import pytest
import ddt
import six
from django.core import exceptions
from django.core.files.uploadedfile import SimpleUploadedFile
from django.http import HttpRequest

View File

@@ -1284,7 +1284,7 @@ class ChoiceResponseTest(ResponseTest): # pylint: disable=missing-class-docstri
ok0 = c % 2 == 0 # check remainder modulo 2
ok1 = c % 3 == 0 # check remainder modulo 3
ok2 = c % 5 == 0 # check remainder modulo 5
ok3 = not any([ok0, ok1, ok2])
ok3 = not any((ok0, ok1, ok2))
""")
choices = ["$ok0", "$ok1", "$ok2", "$ok3"]
problem = self.build_problem(script=script,

View File

@@ -228,7 +228,7 @@ class LibraryContentBlock(
raise NotImplementedError("Unsupported mode.")
selected_keys |= added_block_keys
if any([invalid_block_keys, overlimit_block_keys, added_block_keys]):
if any((invalid_block_keys, overlimit_block_keys, added_block_keys)):
selected = list(selected_keys)
random.shuffle(selected)

View File

@@ -725,7 +725,7 @@ class MongoModuleStore(ModuleStoreDraftAndPublished, ModuleStoreWriteBase, Mongo
results_by_url[location_url].setdefault('definition', {})['children'] = set(total_children)
else:
results_by_url[location_url] = result
if location.block_type == 'course':
if location.block_type == 'course': # pylint: disable=no-member
root = location_url
# now traverse the tree and compute down the inherited metadata

View File

@@ -679,7 +679,7 @@ class DraftModuleStore(MongoModuleStore):
# fix a bug where dangling pointers should imply a change
if len(xblock.children) > len(xblock.get_children()):
return True
return any([self.has_changes(child) for child in xblock.get_children()])
return any(self.has_changes(child) for child in xblock.get_children())
# otherwise there are no changes
else:
return False

View File

@@ -361,7 +361,7 @@ class DraftVersioningModuleStore(SplitMongoModuleStore, ModuleStoreDraftAndPubli
# check the children in the draft
if 'children' in draft_block.fields:
return any(
[has_changes_subtree(child_block_id) for child_block_id in draft_block.fields['children']]
has_changes_subtree(child_block_id) for child_block_id in draft_block.fields['children']
)
return False

View File

@@ -626,7 +626,7 @@ def mongo_uses_error_check(store):
Does mongo use the error check as a separate message?
"""
if hasattr(store, 'modulestores'):
return any([mongo_uses_error_check(substore) for substore in store.modulestores])
return any(mongo_uses_error_check(substore) for substore in store.modulestores)
return False

View File

@@ -214,9 +214,9 @@ class DirectOnlyCategorySemantics(PureModulestoreTestCase):
def verify_course_summery_fields(course_summary):
""" Verify that every `course_summary` object has all the required fields """
expected_fields = CourseSummary.course_info_fields + ['id', 'location', 'has_ended']
return all([hasattr(course_summary, field) for field in expected_fields])
return all(hasattr(course_summary, field) for field in expected_fields)
assert all((verify_course_summery_fields(course_summary) for course_summary in course_summaries))
assert all(verify_course_summery_fields(course_summary) for course_summary in course_summaries)
def is_detached(self, block_type):
"""
@@ -236,7 +236,7 @@ class DirectOnlyCategorySemantics(PureModulestoreTestCase):
field_data = KvsFieldData(key_store)
aside = AsideTest(scope_ids=scope_ids, runtime=TestRuntime(services={'field-data': field_data}))
aside.fields[self.ASIDE_DATA_FIELD.field_name].write_to(aside, self.ASIDE_DATA_FIELD.initial)
aside.fields[self.ASIDE_DATA_FIELD.field_name].write_to(aside, self.ASIDE_DATA_FIELD.initial) # pylint: disable=unsubscriptable-object
return [aside]
def _get_aside(self, block):

View File

@@ -180,7 +180,7 @@ class ConditionalBlockBasicTest(unittest.TestCase):
ajax = json.loads(modules['cond_module'].handle_ajax('', ''))
print("ajax: ", ajax)
fragments = ajax['fragments']
assert not any([('This is a secret' in item['content']) for item in fragments])
assert not any(('This is a secret' in item['content']) for item in fragments)
# now change state of the capa problem to make it completed
modules['source_module'].is_attempted = "true"
@@ -188,7 +188,7 @@ class ConditionalBlockBasicTest(unittest.TestCase):
modules['cond_module'].save()
print("post-attempt ajax: ", ajax)
fragments = ajax['fragments']
assert any([('This is a secret' in item['content']) for item in fragments])
assert any(('This is a secret' in item['content']) for item in fragments)
def test_error_as_source(self):
'''
@@ -199,7 +199,7 @@ class ConditionalBlockBasicTest(unittest.TestCase):
modules['cond_module'].save()
ajax = json.loads(modules['cond_module'].handle_ajax('', ''))
fragments = ajax['fragments']
assert not any([('This is a secret' in item['content']) for item in fragments])
assert not any(('This is a secret' in item['content']) for item in fragments)
@patch('xmodule.conditional_module.log')
def test_conditional_with_staff_only_source_module(self, mock_log):
@@ -294,7 +294,7 @@ class ConditionalBlockXmlTest(unittest.TestCase):
module.save()
print("ajax: ", ajax)
fragments = ajax['fragments']
assert not any([('This is a secret' in item['content']) for item in fragments])
assert not any(('This is a secret' in item['content']) for item in fragments)
# Now change state of the capa problem to make it completed
inner_module = inner_get_module(location.replace(category="problem", name='choiceprob'))
@@ -306,7 +306,7 @@ class ConditionalBlockXmlTest(unittest.TestCase):
module.save()
print("post-attempt ajax: ", ajax)
fragments = ajax['fragments']
assert any([('This is a secret' in item['content']) for item in fragments])
assert any(('This is a secret' in item['content']) for item in fragments)
maxDiff = None

View File

@@ -18,10 +18,7 @@ class PaginatedMixin(object):
To specify a specific arrow, pass an iterable with a single element, 'next' or 'previous'.
"""
return all([
self.q(css=u'nav.%s * .%s-page-link.is-disabled' % (position, arrow))
for arrow in arrows
])
return all(self.q(css=u'nav.%s * .%s-page-link.is-disabled' % (position, arrow)) for arrow in arrows)
def move_back(self, position):
"""

View File

@@ -56,7 +56,7 @@ def set_input_value_and_save(page, css, value):
page.wait_for_ajax()
def verify_ordering(test_class, page, expected_orderings):
def verify_ordering(test_class, page, expected_orderings): # pylint: disable=unused-argument
"""
Verifies the expected ordering of xblocks on the page.
"""

View File

@@ -159,7 +159,7 @@ class CertificatesListView(APIView):
permissions.JwtHasUserFilterForRequestedUser
)
),
(C(permissions.IsStaff) | IsOwnerOrPublicCertificates),
(C(permissions.IsStaff) | IsOwnerOrPublicCertificates), # pylint: disable=unsupported-binary-operation
)
required_scopes = ['certificates:read']

View File

@@ -491,11 +491,11 @@ class CertificateAvailableDate(DateSummary):
@property
def has_certificate_modes(self):
return any([
return any(
mode.slug for mode in CourseMode.modes_for_course(
course_id=self.course.id, include_expired=True
) if mode.slug != CourseMode.AUDIT
])
)
def register_alerts(self, request, course):
"""

View File

@@ -103,7 +103,7 @@ def _get_course(course_key, user):
# Raise course not found if the user cannot access the course
# since it doesn't make sense to redirect an API.
raise CourseNotFoundError("Course not found.") # lint-amnesty, pylint: disable=raise-missing-from
if not any([tab.type == 'discussion' and tab.is_enabled(course, user) for tab in course.tabs]):
if not any(tab.type == 'discussion' and tab.is_enabled(course, user) for tab in course.tabs):
raise DiscussionDisabledError("Discussion is disabled for the course.")
return course

View File

@@ -293,10 +293,10 @@ class PartialDictMatcher: # lint-amnesty, pylint: disable=missing-class-docstri
self.expected_values = expected_values
def __eq__(self, other):
return all([
return all(
key in other and other[key] == value
for key, value in self.expected_values.items()
])
)
@patch('requests.request', autospec=True)

View File

@@ -9,7 +9,6 @@ from django.conf import settings
from django.db.models import BooleanField, IntegerField, TextField
from django.utils.encoding import python_2_unicode_compatible
from opaque_keys.edx.django.models import CourseKeyField
from six import text_type
from openedx.core.lib.cache_utils import request_cached

View File

@@ -23,7 +23,7 @@ class CourseData:
cache during its lifecycle.
"""
def __init__(self, user, course=None, collected_block_structure=None, structure=None, course_key=None):
if not any([course, collected_block_structure, structure, course_key]):
if not any((course, collected_block_structure, structure, course_key)):
raise ValueError(
"You must specify one of course, collected_block_structure, structure, or course_key to this method."
)

View File

@@ -19,7 +19,6 @@ from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework.views import APIView
from six import text_type
from common.djangoapps.student.auth import has_course_author_access
from common.djangoapps.student.models import CourseEnrollment

View File

@@ -17,7 +17,6 @@ from opaque_keys.edx.locator import BlockUsageLocator
from pytz import UTC
from rest_framework import status
from rest_framework.test import APITestCase
from six import text_type
from common.djangoapps.course_modes.models import CourseMode
from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory

View File

@@ -5,8 +5,6 @@ import json
from unittest import mock
import pytest
import mock
import six
from django.core.exceptions import ObjectDoesNotExist
from opaque_keys import InvalidKeyError

View File

@@ -9,8 +9,6 @@ import unittest
from unittest import mock
import pytest
import mock
import six
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.exceptions import MultipleObjectsReturned
from django.test import TestCase

View File

@@ -120,7 +120,7 @@ def get_task_completion_info(instructor_task): # lint-amnesty, pylint: disable=
if instructor_task.task_state in [FAILURE, REVOKED]:
return (succeeded, task_output.get('message', _('No message provided')))
if any([key not in task_output for key in ['action_name', 'attempted', 'total']]):
if any(key not in task_output for key in ['action_name', 'attempted', 'total']):
fmt = _("Invalid task_output information found for instructor_task {0}: {1}")
log.warning(fmt.format(instructor_task.task_id, instructor_task.task_output))
return (succeeded, _("No progress status information available"))

View File

@@ -43,9 +43,7 @@ class AppVersionConfig(models.Model):
.. no_pii:
"""
PLATFORM_CHOICES = tuple(
[(platform, platform) for platform in sorted(PLATFORM_CLASSES.keys())]
)
PLATFORM_CHOICES = tuple((platform, platform) for platform in sorted(PLATFORM_CLASSES.keys()))
platform = models.CharField(max_length=50, choices=PLATFORM_CHOICES, blank=False)
version = models.CharField(

View File

@@ -159,7 +159,7 @@ class TeamsDashboardView(GenericAPIView):
'organization_protection_status': organization_protection_status
},
)
topics_data["sort_order"] = sort_order
topics_data["sort_order"] = sort_order # pylint: disable=unsupported-assignment-operation
filter_query = {
'membership__user': user,

View File

@@ -69,7 +69,7 @@ class TestGenerateCourseBlocks(ModuleStoreTestCase):
"""
Asserts that the logger was called with the given message.
"""
message_present = any([message in call_args[0][0] for call_args in mock_log.warning.call_args_list])
message_present = any(message in call_args[0][0] for call_args in mock_log.warning.call_args_list)
if expected_presence:
assert message_present
else:

View File

@@ -227,7 +227,7 @@ class DarkLangMiddlewareTests(CacheIsolationTestCase):
self.assertAcceptEquals(
'es-419;q=1.0',
self.process_middleware_request(accept=b'{};q=1.0, pt;q=0.5'.format(latin_america_code))
self.process_middleware_request(accept=b'{};q=1.0, pt;q=0.5'.format(latin_america_code)) # pylint:disable=no-member
)
def assert_session_lang_equals(self, value, session):

View File

@@ -173,7 +173,7 @@ class DiscussionsConfigurationModelTest(TestCase):
assert not configuration.enabled
assert configuration.lti_configuration is None
actual_url = configuration.plugin_configuration.get('url')
expected_url = self.configuration_with_values.plugin_configuration.get('url')
expected_url = self.configuration_with_values.plugin_configuration.get('url') # pylint: disable=no-member
assert actual_url == expected_url
assert configuration.provider_type == self.configuration_with_values.provider_type

View File

@@ -158,7 +158,7 @@ def permission_blacked_out(course, role_names, permission_name):
return (
not course.forum_posts_allowed and
role_names == {FORUM_ROLE_STUDENT} and
any([permission_name.startswith(prefix) for prefix in ['edit', 'update', 'create']])
any(permission_name.startswith(prefix) for prefix in ['edit', 'update', 'create'])
)

View File

@@ -55,7 +55,7 @@ def check_comprehensive_theme_settings(app_configs, **kwargs): # lint-amnesty,
id='openedx.core.djangoapps.theming.E004',
)
)
if not all([isinstance(theme_dir, six.string_types) for theme_dir in theme_dirs]):
if not all(isinstance(theme_dir, six.string_types) for theme_dir in theme_dirs):
errors.append(
Error(
"COMPREHENSIVE_THEME_DIRS must contain only strings.",
@@ -63,7 +63,7 @@ def check_comprehensive_theme_settings(app_configs, **kwargs): # lint-amnesty,
id='openedx.core.djangoapps.theming.E005',
)
)
if not all([theme_dir.startswith("/") for theme_dir in theme_dirs]):
if not all(theme_dir.startswith("/") for theme_dir in theme_dirs):
errors.append(
Error(
"COMPREHENSIVE_THEME_DIRS must contain only absolute paths to themes dirs.",
@@ -71,7 +71,7 @@ def check_comprehensive_theme_settings(app_configs, **kwargs): # lint-amnesty,
id='openedx.core.djangoapps.theming.E006',
)
)
if not all([os.path.isdir(theme_dir) for theme_dir in theme_dirs]):
if not all(os.path.isdir(theme_dir) for theme_dir in theme_dirs):
errors.append(
Error(
"COMPREHENSIVE_THEME_DIRS must contain valid paths.",

View File

@@ -164,7 +164,7 @@ class UserMessageCollection():
"""
Returns the user message type associated with a level.
"""
for __, type in UserMessageType.__members__.items(): # lint-amnesty, pylint: disable=redefined-builtin
for __, type in UserMessageType.__members__.items(): # lint-amnesty, pylint: disable=redefined-builtin, no-member
if type.value is level:
return type
raise Exception(u'Unable to find UserMessageType for level {level}'.format(level=level))

View File

@@ -160,7 +160,7 @@ class DiscussionXBlockImportExportTests(TestCase):
target_node = etree.Element('dummy')
block = DiscussionXBlock(self.runtime_mock, scope_ids=self.keys, field_data=DictFieldData({}))
discussion_id_field = block.fields['discussion_id']
discussion_id_field = block.fields['discussion_id'] # pylint: disable=unsubscriptable-object
# precondition checks - discussion_id does not have a value and uses UNIQUE_ID
self.assertEqual(

View File

@@ -1,4 +1,5 @@
""" # lint-amnesty, pylint: disable=django-not-configured
# lint-amnesty, pylint: disable=django-not-configured
"""
Script to process pytest warnings output by pytest-json-report plugin and output it as a html
"""
@@ -10,9 +11,7 @@ import os
import re
from collections import Counter
from write_to_html import (
HtmlOutlineWriter,
) # noqa pylint: disable=import-error,useless-suppression
from write_to_html import HtmlOutlineWriter # noqa pylint: disable=import-error,useless-suppression
columns = [
"message",

View File

@@ -141,7 +141,7 @@ def get_course_outline_block_tree(request, course_id, user=None, allow_start_dat
is_scored = block.get('has_score', False) and block.get('weight', 1) > 0
# Use a list comprehension to force the recursion over all children, rather than just stopping
# at the first child that is scored.
children_scored = any([recurse_mark_scored(child) for child in block.get('children', [])])
children_scored = any(recurse_mark_scored(child) for child in block.get('children', []))
if is_scored or children_scored:
block['scored'] = True
return True

View File

@@ -40,9 +40,9 @@ class TestPaverPIICheck(unittest.TestCase):
call_task('pavelib.quality.run_pii_check', options={"report_dir": str(self.report_dir)})
mock_calls = [str(call) for call in mock_paver_sh.mock_calls]
assert len(mock_calls) == 2
assert any(['lms.envs.test' in call for call in mock_calls])
assert any(['cms.envs.test' in call for call in mock_calls])
assert all([str(self.report_dir) in call for call in mock_calls])
assert any('lms.envs.test' in call for call in mock_calls)
assert any('cms.envs.test' in call for call in mock_calls)
assert all(str(self.report_dir) in call for call in mock_calls)
metrics_file = Env.METRICS_DIR / 'pii'
assert open(metrics_file, 'r').read() == 'Number of PII Annotation violations: 66\n'
@@ -67,8 +67,8 @@ class TestPaverPIICheck(unittest.TestCase):
self.assertRaises(BuildFailure)
mock_calls = [str(call) for call in mock_paver_sh.mock_calls]
assert len(mock_calls) == 2
assert any(['lms.envs.test' in call for call in mock_calls])
assert any(['cms.envs.test' in call for call in mock_calls])
assert all([str(self.report_dir) in call for call in mock_calls])
assert any('lms.envs.test' in call for call in mock_calls)
assert any('cms.envs.test' in call for call in mock_calls)
assert all(str(self.report_dir) in call for call in mock_calls)
metrics_file = Env.METRICS_DIR / 'pii'
assert open(metrics_file, 'r').read() == 'Number of PII Annotation violations: 66\n'

View File

@@ -123,3 +123,6 @@ edx-bulk-grades<0.8.5
# python3-saml==1.10.0 version started breaking a11y tests
python3-saml<1.10.0
# edx-proctoring>3.5.0 causes test failures
edx-proctoring==3.5.0

View File

@@ -20,7 +20,7 @@ matplotlib==2.2.4 # via -c requirements/edx-sandbox/../constraints.txt,
mpmath==1.2.1 # via sympy
networkx==2.2 # via -r requirements/edx-sandbox/py35.in
nltk==3.5 # via -r requirements/edx-sandbox/shared.txt, chem
numpy==1.16.5 # via -r requirements/edx-sandbox/py35.in, chem, matplotlib, openedx-calc
numpy==1.16.5 # via -r requirements/edx-sandbox/py35.in, chem, matplotlib, openedx-calc, scipy
openedx-calc==1.0.9 # via -r requirements/edx-sandbox/py35.in
pycparser==2.20 # via -r requirements/edx-sandbox/shared.txt, cffi
pyparsing==2.2.0 # via -r requirements/edx-sandbox/py35.in, chem, matplotlib, openedx-calc

View File

@@ -81,7 +81,7 @@ django-storages==1.8 # via -c requirements/edx/../constraints.txt, -r requi
django-user-tasks==1.3.2 # via -r requirements/edx/base.in
django-waffle==2.1.0 # via -r requirements/edx/base.in, edx-django-utils, edx-drf-extensions, edx-enterprise, edx-proctoring, edx-toggles
django-webpack-loader==0.7.0 # via -r requirements/edx/base.in, edx-proctoring
django==2.2.18 # via -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt, -r requirements/edx/base.in, code-annotations, django-appconf, django-classy-tags, django-config-models, django-cors-headers, django-crum, django-fernet-fields, django-filter, django-method-override, django-model-utils, django-mptt, django-multi-email-field, django-mysql, django-oauth-toolkit, django-pyfs, django-ratelimit-backend, django-sekizai, django-ses, django-splash, django-statici18n, django-storages, django-user-tasks, django-wiki, djangorestframework, drf-jwt, drf-yasg, edx-ace, edx-api-doc-tools, edx-bulk-grades, edx-celeryutils, edx-completion, edx-django-release-util, edx-django-sites-extensions, edx-django-utils, edx-drf-extensions, edx-enterprise, edx-event-routing-backends, edx-i18n-tools, edx-milestones, edx-opaque-keys, edx-organizations, edx-proctoring, edx-rbac, edx-search, edx-submissions, edx-toggles, edx-when, edxval, enmerkar, enmerkar-underscore, event-tracking, help-tokens, jsonfield2, lti-consumer-xblock, ora2, rest-condition, super-csv, xss-utils
django==2.2.19 # via -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt, -r requirements/edx/base.in, code-annotations, django-appconf, django-classy-tags, django-config-models, django-cors-headers, django-crum, django-fernet-fields, django-filter, django-method-override, django-model-utils, django-mptt, django-multi-email-field, django-mysql, django-oauth-toolkit, django-pyfs, django-ratelimit-backend, django-sekizai, django-ses, django-splash, django-statici18n, django-storages, django-user-tasks, django-wiki, djangorestframework, drf-jwt, drf-yasg, edx-ace, edx-api-doc-tools, edx-bulk-grades, edx-celeryutils, edx-completion, edx-django-release-util, edx-django-sites-extensions, edx-django-utils, edx-drf-extensions, edx-enterprise, edx-event-routing-backends, edx-i18n-tools, edx-milestones, edx-opaque-keys, edx-organizations, edx-proctoring, edx-rbac, edx-search, edx-submissions, edx-toggles, edx-when, edxval, enmerkar, enmerkar-underscore, event-tracking, help-tokens, jsonfield2, lti-consumer-xblock, ora2, rest-condition, super-csv, xss-utils
djangorestframework-xml==2.0.0 # via edx-enterprise
djangorestframework==3.12.2 # via -r requirements/edx/base.in, django-config-models, django-user-tasks, drf-jwt, drf-yasg, edx-api-doc-tools, edx-completion, edx-drf-extensions, edx-enterprise, edx-organizations, edx-proctoring, edx-submissions, ora2, rest-condition, super-csv
docopt==0.6.2 # via xmodule
@@ -163,7 +163,7 @@ nltk==3.5 # via -r requirements/edx/../edx-sandbox/shared.txt, c
nodeenv==1.5.0 # via -r requirements/edx/base.in
numpy==1.20.1 # via chem, openedx-calc, scipy
oauthlib==3.0.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.in, django-oauth-toolkit, lti-consumer-xblock, requests-oauthlib, social-auth-core
openedx-calc==2.0.0 # via -r requirements/edx/base.in
openedx-calc==2.0.1 # via -r requirements/edx/base.in
ora2==3.1.3 # via -r requirements/edx/base.in
packaging==20.9 # via bleach, drf-yasg
path.py==12.5.0 # via edx-enterprise, edx-i18n-tools, ora2, staff-graded-xblock, xmodule
@@ -208,7 +208,7 @@ ruamel.yaml==0.16.12 # via drf-yasg
rules==2.2 # via -r requirements/edx/base.in, edx-enterprise, edx-proctoring
s3transfer==0.1.13 # via boto3
sailthru-client==2.2.3 # via -r requirements/edx/base.in, edx-ace
scipy==1.6.0 # via chem, openedx-calc
scipy==1.6.1 # via chem, openedx-calc
semantic-version==2.8.5 # via edx-drf-extensions
shapely==1.7.1 # via -r requirements/edx/base.in
simplejson==3.17.2 # via -r requirements/edx/base.in, sailthru-client, super-csv, xblock-utils

View File

@@ -24,7 +24,7 @@ analytics-python==1.2.9 # via -r requirements/edx/testing.txt
aniso8601==9.0.0 # via -r requirements/edx/testing.txt, edx-tincan-py35, tincan
apipkg==1.5 # via -r requirements/edx/testing.txt, execnet
appdirs==1.4.4 # via -r requirements/edx/testing.txt, fs, virtualenv
astroid==2.4.2 # via -r requirements/edx/testing.txt, pylint, pylint-celery
astroid==2.5 # via -r requirements/edx/testing.txt, pylint, pylint-celery
attrs==20.3.0 # via -r requirements/edx/testing.txt, edx-ace, jsonschema, pytest
babel==2.9.0 # via -r requirements/edx/testing.txt, enmerkar, enmerkar-underscore, sphinx
beautifulsoup4==4.9.3 # via -r requirements/edx/testing.txt, pynliner
@@ -92,7 +92,7 @@ django-storages==1.8 # via -c requirements/edx/../constraints.txt, -r requi
django-user-tasks==1.3.2 # via -r requirements/edx/testing.txt
django-waffle==2.1.0 # via -r requirements/edx/testing.txt, edx-django-utils, edx-drf-extensions, edx-enterprise, edx-proctoring, edx-toggles
django-webpack-loader==0.7.0 # via -r requirements/edx/testing.txt, edx-proctoring
django==2.2.18 # via -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt, -r requirements/edx/testing.txt, code-annotations, django-appconf, django-classy-tags, django-config-models, django-cors-headers, django-crum, django-debug-toolbar, django-fernet-fields, django-filter, django-method-override, django-model-utils, django-mptt, django-multi-email-field, django-mysql, django-oauth-toolkit, django-pyfs, django-ratelimit-backend, django-sekizai, django-ses, django-splash, django-statici18n, django-storages, django-user-tasks, django-wiki, djangorestframework, drf-jwt, drf-yasg, edx-ace, edx-api-doc-tools, edx-bulk-grades, edx-celeryutils, edx-completion, edx-django-release-util, edx-django-sites-extensions, edx-django-utils, edx-drf-extensions, edx-enterprise, edx-event-routing-backends, edx-i18n-tools, edx-lint, edx-milestones, edx-opaque-keys, edx-organizations, edx-proctoring, edx-rbac, edx-search, edx-submissions, edx-toggles, edx-when, edxval, enmerkar, enmerkar-underscore, event-tracking, help-tokens, jsonfield2, lti-consumer-xblock, ora2, rest-condition, super-csv, xss-utils
django==2.2.19 # via -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt, -r requirements/edx/testing.txt, code-annotations, django-appconf, django-classy-tags, django-config-models, django-cors-headers, django-crum, django-debug-toolbar, django-fernet-fields, django-filter, django-method-override, django-model-utils, django-mptt, django-multi-email-field, django-mysql, django-oauth-toolkit, django-pyfs, django-ratelimit-backend, django-sekizai, django-ses, django-splash, django-statici18n, django-storages, django-user-tasks, django-wiki, djangorestframework, drf-jwt, drf-yasg, edx-ace, edx-api-doc-tools, edx-bulk-grades, edx-celeryutils, edx-completion, edx-django-release-util, edx-django-sites-extensions, edx-django-utils, edx-drf-extensions, edx-enterprise, edx-event-routing-backends, edx-i18n-tools, edx-lint, edx-milestones, edx-opaque-keys, edx-organizations, edx-proctoring, edx-rbac, edx-search, edx-submissions, edx-toggles, edx-when, edxval, enmerkar, enmerkar-underscore, event-tracking, help-tokens, jsonfield2, lti-consumer-xblock, ora2, rest-condition, super-csv, xss-utils
djangorestframework-xml==2.0.0 # via -r requirements/edx/testing.txt, edx-enterprise
djangorestframework==3.12.2 # via -r requirements/edx/testing.txt, django-config-models, django-user-tasks, drf-jwt, drf-yasg, edx-api-doc-tools, edx-completion, edx-drf-extensions, edx-enterprise, edx-organizations, edx-proctoring, edx-submissions, ora2, rest-condition, super-csv
docopt==0.6.2 # via -r requirements/edx/testing.txt, xmodule
@@ -136,7 +136,7 @@ enmerkar==0.7.1 # via -r requirements/edx/testing.txt, enmerkar-unders
event-tracking==1.0.4 # via -r requirements/edx/testing.txt, edx-event-routing-backends, edx-proctoring, edx-search
execnet==1.8.0 # via -r requirements/edx/testing.txt, pytest-xdist
factory-boy==2.8.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt
faker==6.3.0 # via -r requirements/edx/testing.txt, factory-boy
faker==6.4.1 # via -r requirements/edx/testing.txt, factory-boy
filelock==3.0.12 # via -r requirements/edx/testing.txt, tox, virtualenv
freezegun==0.3.12 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt
fs-s3fs==0.1.8 # via -r requirements/edx/testing.txt, django-pyfs
@@ -170,7 +170,7 @@ jsonfield2==3.0.3 # via -c requirements/edx/../constraints.txt, -r requi
jsonschema==3.2.0 # via sphinxcontrib-openapi
kombu==4.6.11 # via -r requirements/edx/testing.txt, celery
laboratory==1.0.2 # via -r requirements/edx/testing.txt
lazy-object-proxy==1.4.3 # via -r requirements/edx/testing.txt, astroid
lazy-object-proxy==1.5.2 # via -r requirements/edx/testing.txt, astroid
lazy==1.4 # via -r requirements/edx/testing.txt, acid-xblock, bok-choy, lti-consumer-xblock, ora2
libsass==0.10.0 # via -r requirements/edx/testing.txt, ora2
loremipsum==1.0.5 # via -r requirements/edx/testing.txt, ora2
@@ -196,7 +196,7 @@ nltk==3.5 # via -r requirements/edx/testing.txt, chem
nodeenv==1.5.0 # via -r requirements/edx/testing.txt
numpy==1.20.1 # via -r requirements/edx/testing.txt, chem, openedx-calc, scipy
oauthlib==3.0.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt, django-oauth-toolkit, lti-consumer-xblock, requests-oauthlib, social-auth-core
openedx-calc==2.0.0 # via -r requirements/edx/testing.txt
openedx-calc==2.0.1 # via -r requirements/edx/testing.txt
ora2==3.1.3 # via -r requirements/edx/testing.txt
packaging==20.9 # via -r requirements/edx/testing.txt, bleach, drf-yasg, pytest, sphinx, tox
path.py==12.5.0 # via -r requirements/edx/testing.txt, edx-enterprise, edx-i18n-tools, ora2, staff-graded-xblock, xmodule
@@ -222,7 +222,7 @@ pyjwt[crypto]==1.7.1 # via -r requirements/edx/testing.txt, drf-jwt, edx-re
pylint-celery==0.3 # via -r requirements/edx/testing.txt, edx-lint
pylint-django==2.4.2 # via -r requirements/edx/testing.txt, edx-lint
pylint-plugin-utils==0.6 # via -r requirements/edx/testing.txt, pylint-celery, pylint-django
pylint==2.6.2 # via -r requirements/edx/testing.txt, edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
pylint==2.7.0 # via -r requirements/edx/testing.txt, edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
pymongo==3.10.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt, edx-opaque-keys, event-tracking, mongodbproxy, mongoengine
pynliner==0.8.0 # via -r requirements/edx/testing.txt
pyparsing==2.4.7 # via -r requirements/edx/testing.txt, chem, openedx-calc, packaging, pycontracts
@@ -261,13 +261,13 @@ ruamel.yaml==0.16.12 # via -r requirements/edx/testing.txt, drf-yasg
rules==2.2 # via -r requirements/edx/testing.txt, edx-enterprise, edx-proctoring
s3transfer==0.1.13 # via -r requirements/edx/testing.txt, boto3
sailthru-client==2.2.3 # via -r requirements/edx/testing.txt, edx-ace
scipy==1.6.0 # via -r requirements/edx/testing.txt, chem, openedx-calc
scipy==1.6.1 # via -r requirements/edx/testing.txt, chem, openedx-calc
selenium==3.141.0 # via -r requirements/edx/testing.txt, bok-choy
semantic-version==2.8.5 # via -r requirements/edx/testing.txt, edx-drf-extensions
shapely==1.7.1 # via -r requirements/edx/testing.txt
simplejson==3.17.2 # via -r requirements/edx/testing.txt, sailthru-client, super-csv, xblock-utils
singledispatch==3.4.0.3 # via -r requirements/edx/testing.txt
six==1.15.0 # via -r requirements/edx/pip-tools.txt, -r requirements/edx/testing.txt, analytics-python, astroid, bleach, bok-choy, chem, codejail, crowdsourcehinter-xblock, cryptography, django-countries, django-simple-history, edx-ace, edx-bulk-grades, edx-ccx-keys, edx-django-release-util, edx-drf-extensions, edx-enterprise, edx-i18n-tools, edx-lint, edx-milestones, edx-rbac, edx-sphinx-theme, event-tracking, freezegun, fs, fs-s3fs, html5lib, httpretty, isodate, jsonschema, libsass, mock, paver, pip-tools, pycontracts, pyjwkest, python-dateutil, python-memcached, python-swiftclient, singledispatch, social-auth-app-django, social-auth-core, sphinxcontrib-httpdomain, stevedore, tox, transifex-client, virtualenv, xblock
singledispatch==3.6.0 # via -r requirements/edx/testing.txt
six==1.15.0 # via -r requirements/edx/pip-tools.txt, -r requirements/edx/testing.txt, analytics-python, bleach, bok-choy, chem, codejail, crowdsourcehinter-xblock, cryptography, django-countries, django-simple-history, edx-ace, edx-bulk-grades, edx-ccx-keys, edx-django-release-util, edx-drf-extensions, edx-enterprise, edx-i18n-tools, edx-lint, edx-milestones, edx-rbac, edx-sphinx-theme, event-tracking, freezegun, fs, fs-s3fs, html5lib, httpretty, isodate, jsonschema, libsass, mock, paver, pip-tools, pycontracts, pyjwkest, python-dateutil, python-memcached, python-swiftclient, singledispatch, social-auth-app-django, social-auth-core, sphinxcontrib-httpdomain, stevedore, tox, transifex-client, virtualenv, xblock
slumber==0.7.1 # via -r requirements/edx/testing.txt, edx-bulk-grades, edx-enterprise, edx-rest-api-client
smmap==3.0.5 # via -r requirements/edx/testing.txt, gitdb
snowballstemmer==2.1.0 # via sphinx

View File

@@ -1 +1 @@
django==2.2.18 # via -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt, -r requirements/edx/base.in, code-annotations, django-appconf, django-classy-tags, django-config-models, django-cors-headers, django-crum, django-fernet-fields, django-filter, django-method-override, django-model-utils, django-mptt, django-multi-email-field, django-mysql, django-oauth-toolkit, django-pyfs, django-ratelimit-backend, django-sekizai, django-ses, django-splash, django-statici18n, django-storages, django-user-tasks, django-wiki, djangorestframework, drf-jwt, drf-yasg, edx-ace, edx-api-doc-tools, edx-bulk-grades, edx-celeryutils, edx-completion, edx-django-release-util, edx-django-sites-extensions, edx-django-utils, edx-drf-extensions, edx-enterprise, edx-event-routing-backends, edx-i18n-tools, edx-milestones, edx-opaque-keys, edx-organizations, edx-proctoring, edx-rbac, edx-search, edx-submissions, edx-toggles, edx-when, edxval, enmerkar, enmerkar-underscore, event-tracking, help-tokens, jsonfield2, lti-consumer-xblock, ora2, rest-condition, super-csv, xss-utils
django==2.2.19 # via -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt, -r requirements/edx/base.in, code-annotations, django-appconf, django-classy-tags, django-config-models, django-cors-headers, django-crum, django-fernet-fields, django-filter, django-method-override, django-model-utils, django-mptt, django-multi-email-field, django-mysql, django-oauth-toolkit, django-pyfs, django-ratelimit-backend, django-sekizai, django-ses, django-splash, django-statici18n, django-storages, django-user-tasks, django-wiki, djangorestframework, drf-jwt, drf-yasg, edx-ace, edx-api-doc-tools, edx-bulk-grades, edx-celeryutils, edx-completion, edx-django-release-util, edx-django-sites-extensions, edx-django-utils, edx-drf-extensions, edx-enterprise, edx-event-routing-backends, edx-i18n-tools, edx-milestones, edx-opaque-keys, edx-organizations, edx-proctoring, edx-rbac, edx-search, edx-submissions, edx-toggles, edx-when, edxval, enmerkar, enmerkar-underscore, event-tracking, help-tokens, jsonfield2, lti-consumer-xblock, ora2, rest-condition, super-csv, xss-utils

View File

@@ -10,7 +10,7 @@ certifi==2020.12.5 # via requests
chardet==4.0.0 # via requests
click==7.1.2 # via code-annotations
code-annotations==1.1.0 # via -r requirements/edx/doc.in
django==2.2.18 # via -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt, code-annotations
django==2.2.19 # via -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt, code-annotations
docutils==0.16 # via sphinx
edx-sphinx-theme==2.0.0 # via -r requirements/edx/doc.in
gitdb==4.0.5 # via gitpython

View File

@@ -23,7 +23,7 @@ analytics-python==1.2.9 # via -r requirements/edx/base.txt
aniso8601==9.0.0 # via -r requirements/edx/base.txt, edx-tincan-py35, tincan
apipkg==1.5 # via execnet
appdirs==1.4.4 # via -r requirements/edx/base.txt, fs, virtualenv
astroid==2.4.2 # via pylint, pylint-celery
astroid==2.5 # via pylint, pylint-celery
attrs==20.3.0 # via -r requirements/edx/base.txt, edx-ace, pytest
babel==2.9.0 # via -r requirements/edx/base.txt, enmerkar, enmerkar-underscore
beautifulsoup4==4.9.3 # via -r requirements/edx/base.txt, -r requirements/edx/testing.in, pynliner
@@ -132,7 +132,7 @@ enmerkar==0.7.1 # via -r requirements/edx/base.txt, enmerkar-underscor
event-tracking==1.0.4 # via -r requirements/edx/base.txt, edx-event-routing-backends, edx-proctoring, edx-search
execnet==1.8.0 # via pytest-xdist
factory-boy==2.8.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.in
faker==6.3.0 # via factory-boy
faker==6.4.1 # via factory-boy
filelock==3.0.12 # via tox, virtualenv
freezegun==0.3.12 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.in
fs-s3fs==0.1.8 # via -r requirements/edx/base.txt, django-pyfs
@@ -164,7 +164,7 @@ jsondiff==1.2.0 # via -r requirements/edx/base.txt, edx-enterprise
jsonfield2==3.0.3 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt, edx-celeryutils, edx-enterprise, edx-event-routing-backends, edx-proctoring, edx-submissions, lti-consumer-xblock, ora2
kombu==4.6.11 # via -r requirements/edx/base.txt, celery
laboratory==1.0.2 # via -r requirements/edx/base.txt
lazy-object-proxy==1.4.3 # via astroid
lazy-object-proxy==1.5.2 # via astroid
lazy==1.4 # via -r requirements/edx/base.txt, acid-xblock, bok-choy, lti-consumer-xblock, ora2
libsass==0.10.0 # via -r requirements/edx/base.txt, ora2
loremipsum==1.0.5 # via -r requirements/edx/base.txt, ora2
@@ -188,7 +188,7 @@ nltk==3.5 # via -r requirements/edx/base.txt, chem
nodeenv==1.5.0 # via -r requirements/edx/base.txt
numpy==1.20.1 # via -r requirements/edx/base.txt, chem, openedx-calc, scipy
oauthlib==3.0.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt, django-oauth-toolkit, lti-consumer-xblock, requests-oauthlib, social-auth-core
openedx-calc==2.0.0 # via -r requirements/edx/base.txt
openedx-calc==2.0.1 # via -r requirements/edx/base.txt
ora2==3.1.3 # via -r requirements/edx/base.txt
packaging==20.9 # via -r requirements/edx/base.txt, bleach, drf-yasg, pytest, tox
path.py==12.5.0 # via -r requirements/edx/base.txt, edx-enterprise, edx-i18n-tools, ora2, staff-graded-xblock, xmodule
@@ -213,7 +213,7 @@ pyjwt[crypto]==1.7.1 # via -r requirements/edx/base.txt, drf-jwt, edx-rest-
pylint-celery==0.3 # via edx-lint
pylint-django==2.4.2 # via edx-lint
pylint-plugin-utils==0.6 # via pylint-celery, pylint-django
pylint==2.6.2 # via edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
pylint==2.7.0 # via edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
pymongo==3.10.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt, edx-opaque-keys, event-tracking, mongodbproxy, mongoengine
pynliner==0.8.0 # via -r requirements/edx/base.txt
pyparsing==2.4.7 # via -r requirements/edx/base.txt, chem, openedx-calc, packaging, pycontracts
@@ -250,13 +250,13 @@ ruamel.yaml==0.16.12 # via -r requirements/edx/base.txt, drf-yasg
rules==2.2 # via -r requirements/edx/base.txt, edx-enterprise, edx-proctoring
s3transfer==0.1.13 # via -r requirements/edx/base.txt, boto3
sailthru-client==2.2.3 # via -r requirements/edx/base.txt, edx-ace
scipy==1.6.0 # via -r requirements/edx/base.txt, chem, openedx-calc
scipy==1.6.1 # via -r requirements/edx/base.txt, chem, openedx-calc
selenium==3.141.0 # via -r requirements/edx/testing.in, bok-choy
semantic-version==2.8.5 # via -r requirements/edx/base.txt, edx-drf-extensions
shapely==1.7.1 # via -r requirements/edx/base.txt
simplejson==3.17.2 # via -r requirements/edx/base.txt, sailthru-client, super-csv, xblock-utils
singledispatch==3.4.0.3 # via -r requirements/edx/testing.in
six==1.15.0 # via -r requirements/edx/base.txt, analytics-python, astroid, bleach, bok-choy, chem, codejail, crowdsourcehinter-xblock, cryptography, django-countries, django-simple-history, edx-ace, edx-bulk-grades, edx-ccx-keys, edx-django-release-util, edx-drf-extensions, edx-enterprise, edx-i18n-tools, edx-lint, edx-milestones, edx-rbac, event-tracking, freezegun, fs, fs-s3fs, html5lib, httpretty, isodate, libsass, mock, paver, pycontracts, pyjwkest, python-dateutil, python-memcached, python-swiftclient, singledispatch, social-auth-app-django, social-auth-core, stevedore, tox, transifex-client, virtualenv, xblock
singledispatch==3.6.0 # via -r requirements/edx/testing.in
six==1.15.0 # via -r requirements/edx/base.txt, analytics-python, bleach, bok-choy, chem, codejail, crowdsourcehinter-xblock, cryptography, django-countries, django-simple-history, edx-ace, edx-bulk-grades, edx-ccx-keys, edx-django-release-util, edx-drf-extensions, edx-enterprise, edx-i18n-tools, edx-lint, edx-milestones, edx-rbac, event-tracking, freezegun, fs, fs-s3fs, html5lib, httpretty, isodate, libsass, mock, paver, pycontracts, pyjwkest, python-dateutil, python-memcached, python-swiftclient, singledispatch, social-auth-app-django, social-auth-core, stevedore, tox, transifex-client, virtualenv, xblock
slumber==0.7.1 # via -r requirements/edx/base.txt, edx-bulk-grades, edx-enterprise, edx-rest-api-client
smmap==3.0.5 # via gitdb
social-auth-app-django==4.0.0 # via -r requirements/edx/base.txt