From a9bd8dbf47baa6eafe160f249d2e5bd93991fe55 Mon Sep 17 00:00:00 2001 From: Simon Chen Date: Mon, 21 Mar 2022 17:20:29 -0400 Subject: [PATCH] fix: Remove course performance validation report code --- Makefile | 9 +- .../course_validation/__init__.py | 22 -- .../course_validation/mappings.json | 106 ----- .../course_validation/problem_count_stats.py | 41 -- .../course_validation/report_generators.py | 363 ------------------ .../course_validation/report_runner.py | 240 ------------ karma.conf.js | 2 +- package-lock.json | 86 +---- package.json | 4 +- requirements/base.in | 6 +- requirements/base.txt | 76 ++-- requirements/constraints.txt | 6 +- requirements/django.txt | 2 +- requirements/doc.txt | 77 ++-- requirements/github.txt | 12 +- requirements/local.txt | 92 ++--- requirements/optional.txt | 2 +- requirements/pip_tools.txt | 6 +- requirements/production.txt | 75 ++-- requirements/test.in | 1 - requirements/test.txt | 82 ++-- requirements/tox.txt | 6 +- 22 files changed, 241 insertions(+), 1075 deletions(-) delete mode 100644 acceptance_tests/course_validation/__init__.py delete mode 100644 acceptance_tests/course_validation/mappings.json delete mode 100644 acceptance_tests/course_validation/problem_count_stats.py delete mode 100644 acceptance_tests/course_validation/report_generators.py delete mode 100644 acceptance_tests/course_validation/report_runner.py diff --git a/Makefile b/Makefile index 6c1bd0db2..4ab90ab8d 100644 --- a/Makefile +++ b/Makefile @@ -88,14 +88,14 @@ ifeq ("${ENABLE_COURSE_LIST_PASSING}", "True") $(TOX)python ./manage.py waffle_switch enable_course_passing on --create endif $(TOX)python manage.py create_acceptance_test_soapbox_messages - $(TOX)pytest -v acceptance_tests --ignore=acceptance_tests/course_validation + $(TOX)pytest -v acceptance_tests $(TOX)python manage.py delete_acceptance_test_soapbox_messages # local acceptance tests are typically run with by passing in environment variables on the commandline # e.g. API_SERVER_URL="http://localhost:9001/api/v0" API_AUTH_TOKEN="edx" make accept_local accept_local: ./manage.py create_acceptance_test_soapbox_messages - pytest -v acceptance_tests --ignore=acceptance_tests/course_validation + pytest -v acceptance_tests ./manage.py delete_acceptance_test_soapbox_messages accept_devstack: @@ -106,10 +106,7 @@ ifeq ("${DISPLAY_LEARNER_ANALYTICS}", "True") $(TOX)python manage.py waffle_flag enable_learner_analytics --create --everyone endif cat dashboard.log - $(TOX)pytest -v a11y_tests -k 'not NUM_PROCESSES==1' --ignore=acceptance_tests/course_validation - -course_validation: - python -m acceptance_tests.course_validation.generate_report + $(TOX)pytest -v a11y_tests -k 'not NUM_PROCESSES==1' isort_check: ## check that isort has been run $(TOX)isort --check-only --recursive --diff acceptance_tests/ analytics_dashboard/ common/ diff --git a/acceptance_tests/course_validation/__init__.py b/acceptance_tests/course_validation/__init__.py deleted file mode 100644 index b1b2293c7..000000000 --- a/acceptance_tests/course_validation/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -import os - -from acceptance_tests import str2bool - -ENABLE_AUTO_AUTH = str2bool(os.environ.get('ENABLE_AUTO_AUTH', False)) -DASHBOARD_SERVER_URL = os.environ['DASHBOARD_SERVER_URL'].strip('/') -API_SERVER_URL = os.environ['API_SERVER_URL'] -API_AUTH_TOKEN = os.environ['API_AUTH_TOKEN'] - -LMS_URL = os.environ.get('LMS_URL') -LMS_USERNAME = os.environ.get('LMS_USERNAME') -LMS_PASSWORD = os.environ.get('LMS_PASSWORD') - -BASIC_AUTH_USERNAME = os.environ.get('BASIC_AUTH_USERNAME') -BASIC_AUTH_PASSWORD = os.environ.get('BASIC_AUTH_PASSWORD') -BASIC_AUTH_CREDENTIALS = None - -if BASIC_AUTH_USERNAME and BASIC_AUTH_PASSWORD: - BASIC_AUTH_CREDENTIALS = (BASIC_AUTH_USERNAME, BASIC_AUTH_PASSWORD) - -COURSE_API_URL = os.environ.get('COURSE_API_URL') -COURSE_API_KEY = os.environ.get('COURSE_API_KEY') diff --git a/acceptance_tests/course_validation/mappings.json b/acceptance_tests/course_validation/mappings.json deleted file mode 100644 index 92c839ffe..000000000 --- a/acceptance_tests/course_validation/mappings.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "course_performance_screenshot": { - "properties": { - "approved": { - "type": "boolean" - }, - "course_id": { - "type": "string" - }, - "course_valid": { - "type": "boolean" - }, - "error": { - "type": "string" - }, - "pages": { - "properties": { - "filename": { - "type": "string" - }, - "url_path": { - "type": "string" - } - } - }, - "reviewed": { - "type": "boolean" - }, - "start": { - "type": "date", - "format": "dateOptionalTime" - } - } - }, - "course_performance": { - "properties": { - "assignment_types": { - "properties": { - "actual": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "results": { - "properties": { - "actual": { - "type": "integer" - }, - "expected": { - "type": "integer" - }, - "load_time": { - "type": "double" - }, - "name": { - "type": "string" - }, - "problems": { - "properties": { - "number_in_structure": { - "type": "integer" - }, - "number_with_submissions": { - "type": "integer" - }, - "total_submissions": { - "type": "integer" - }, - "valid": { - "type": "boolean" - } - } - }, - "status": { - "type": "integer" - }, - "valid": { - "type": "boolean" - } - } - }, - "valid": { - "type": "boolean" - } - } - }, - "course_id": { - "type": "string" - }, - "course_valid": { - "type": "boolean" - }, - "error": { - "type": "string" - }, - "has_submissions": { - "type": "boolean" - }, - "start": { - "type": "date", - "format": "dateOptionalTime" - } - } - } -} diff --git a/acceptance_tests/course_validation/problem_count_stats.py b/acceptance_tests/course_validation/problem_count_stats.py deleted file mode 100644 index fd5f64e09..000000000 --- a/acceptance_tests/course_validation/problem_count_stats.py +++ /dev/null @@ -1,41 +0,0 @@ -""" -Script that produces min-max-avg for problem counts across all courses. -""" - -from elasticsearch import Elasticsearch - -es = Elasticsearch(retry_on_timeout=True) -index = 'course_reports_stage' - -body = { - 'size': 1000, - 'query': {'match_all': {}}, - "fields": [ - "course_id", - "num_problems" - ], - "script_fields": { - "num_problems": { - "script": "if (_source.assignment_types) { result=0; for (element in _source.assignment_types.results) { " - "result = result + element.problems.number_in_structure; }; result;} else { 0 }", - "type": "number" - } - } -} -res = es.search(index=index, doc_type='course_performance', body=body) - -num_courses = res['hits']['total'] - -print("Courses: %d" % num_courses) - -data = {} -for hit in res['hits']['hits']: - fields = hit['fields'] - data[fields['course_id'][0]] = fields['num_problems'][0] - -sum_counts = sum(data.values()) - -print('Max: %d' % max(data.values())) -print('Avg: %d' % (sum_counts / num_courses)) -print('Min: %d' % min(data.values())) -print('Sum: %d' % sum_counts) diff --git a/acceptance_tests/course_validation/report_generators.py b/acceptance_tests/course_validation/report_generators.py deleted file mode 100644 index ac7a7bd9b..000000000 --- a/acceptance_tests/course_validation/report_generators.py +++ /dev/null @@ -1,363 +0,0 @@ -import datetime -import logging -import traceback -from os.path import join - -import requests -from analyticsclient.client import Client -from selenium import webdriver -from slugify import slugify - -from acceptance_tests.course_validation import ( - API_AUTH_TOKEN, - API_SERVER_URL, - BASIC_AUTH_CREDENTIALS, - COURSE_API_KEY, - COURSE_API_URL, - DASHBOARD_SERVER_URL, - ENABLE_AUTO_AUTH, - LMS_PASSWORD, - LMS_URL, - LMS_USERNAME, -) -from common.clients import CourseStructureApiClient -from common.course_structure import CourseStructure - -logger = logging.getLogger(__name__) - - -class ReportGeneratorBase: - REPORT_NAME = None - course_id = None - - def __init__(self, course_id, http_cookies=None): - self.course_id = course_id - self.analytics_api_client = Client(base_url=API_SERVER_URL, auth_token=API_AUTH_TOKEN, timeout=1000) - self.course_api_client = CourseStructureApiClient(COURSE_API_URL, COURSE_API_KEY, 5) - self.http_client = requests.Session() - self.http_client.cookies = http_cookies - - def get_http_status_and_load_time(self, url): - r = self.http_client.get(url) - elapsed = None - - if r.elapsed: - elapsed = r.elapsed.total_seconds() - - return r.status_code, elapsed - - def build_course_path(self, path): - path = path.strip('/') - return f'/courses/{self.course_id}/{path}/' - - def get_dashboard_url(self, path): - path = path.strip('/') - return f'{DASHBOARD_SERVER_URL}/{path}/' - - def generate_report(self): - """ - Generates a report for a course. - - This method should return a tuple--(valid, report)--where valid is a boolean indicating if the course meets - the reporter's conditions for validity, and report is a JSON-serializable dict containing the output of the - analysis. - """ - raise NotImplementedError - - -# TODO Update this class to inherit from ReporterBase -# -# COURSE_PAGES = ['enrollment/activity', 'enrollment/geography', 'engagement/content', 'performance/graded_content'] -# API_REPORT_KEYS = ['api_enrollment_activity', 'api_enrollment_geography', 'api_activity', 'api_problems'] -# -# class CourseReporter: -# course = None -# course_id = None -# -# def __init__(self, course, logger, cookies=None): -# self.course = course -# self.course_id = course.course_id -# self.http_client = requests.Session() -# self.http_client.cookies = cookies -# self.course_pages = COURSE_PAGES -# self.logger = logger -# -# def _http_status(self, url): -# r = self.http_client.get(url) -# return r.status_code -# -# def _build_course_url(self, path): -# path = path.strip('/') -# return '{0}/courses/{1}/{2}/'.format(DASHBOARD_SERVER_URL, self.course_id, path) -# -# def has_enrollment_activity(self): -# try: -# self.course.enrollment() -# return True -# except ClientError: -# return False -# -# def has_enrollment_geography(self): -# try: -# self.course.enrollment(demographic.LOCATION) -# return True -# except ClientError: -# return False -# -# def has_engagement_activity(self): -# try: -# self.course.activity() -# return True -# except ClientError: -# return False -# -# def has_problem_submissions(self): -# try: -# self.course.problems() -# return True -# except ClientError: -# return False -# -# def report(self): -# report = { -# 'course_id': self.course_id -# } -# -# # Check that the pages load -# for page in self.course_pages: -# report[page] = self._http_status(self._build_course_url(page)) -# -# # Check API for data -# report['api_enrollment_activity'] = self.has_enrollment_activity() -# report['api_enrollment_geography'] = self.has_enrollment_geography() -# report['api_activity'] = self.has_engagement_activity() -# report['api_problems'] = self.has_problem_submissions() -# -# return report - - -class CoursePerformanceReportGenerator(ReportGeneratorBase): - """ - Generates a report on the course performance pages and data. - """ - REPORT_NAME = 'course_performance' - - def _problems(self): - problems = {} - - try: - problem_list = self.analytics_api_client.courses(self.course_id).problems() - for problem in problem_list: - problems[problem['module_id']] = problem - except Exception as e: # pylint: disable=broad-except - logger.error('Failed to retrieve problems for %s: %s\n%s', self.course_id, e, traceback.format_exc()) - - return problems - - def _grading_policy(self): - return self.course_api_client.grading_policies(self.course_id).get() - - def _assignment_types(self): - gp = self._grading_policy() - return [item['assignment_type'] for item in gp] - - def _structure(self): - return self.course_api_client.course_structures(self.course_id).get() - - def _assignments(self, assignment_type=None): - structure = self._structure() - return CourseStructure.course_structure_to_assignments(structure, graded=True, assignment_type=assignment_type) - - def _start_date(self): - info = self.course_api_client.courses(self.course_id).get() - return datetime.datetime.strptime(info['start'], self.course_api_client.DATETIME_FORMAT) - - def generate_report(self): - """ - { - 'course_id': 'edX/DemoX/Demo_Course', - 'start': '2015-01-01 00:00:00Z', - 'course_valid': true, - 'assignment_types': { - 'expected': ['Homework', 'Exam'], - 'actual': ['Homework', 'Exam'], - 'valid': true, - 'results': [ - { - 'name': 'Homework', - 'expected': 3, - 'actual': 3, - 'valid': true, - 'problems': { - 'number_in_structure': 2, - 'valid': true, - 'number_with_submissions': 1, - 'total_submissions': 1 - } - } - ] - } - } - """ - start = self._start_date() - report = {'course_id': self.course_id, 'start': start.strftime(self.course_api_client.DATETIME_FORMAT)} - - if start > datetime.datetime.today(): - logger.info('Course %s has not yet started.', self.course_id) - - assignment_types = sorted(self._assignment_types()) - assignments = self._assignments() - actual_assignment_types = sorted({assignment['assignment_type'] for assignment in assignments}) - - expected = len(assignment_types) - actual = len(actual_assignment_types) - course_valid = expected == 0 or (expected == actual and (None not in actual_assignment_types)) - report['assignment_types'] = { - 'expected': assignment_types, - 'actual': actual_assignment_types, - 'valid': course_valid, - 'results': [] - } - - submissions = self._problems() - has_submissions = len(submissions) > 0 - report['has_submissions'] = has_submissions - - if course_valid: - for item in self._grading_policy(): - assignment_type = item['assignment_type'] - expected = item['count'] - assignments = self._assignments(assignment_type) - actual = len(assignments) - path = 'performance/graded_content/{}'.format(slugify(assignment_type)) - path = self.build_course_path(path) - status, elapsed = self.get_http_status_and_load_time(self.get_dashboard_url(path)) - valid = (status == 200 if has_submissions else True) - course_valid &= valid - - data = { - 'name': assignment_type, - 'status': status, - 'load_time': elapsed, - 'expected': expected, - 'actual': actual, - 'valid': valid - } - - # Problems - problems = [] - for assignment in assignments: - problems += assignment['problems'] - - number_in_structure = len(problems) - problems_with_submissions = [] - _problem_ids = [] # Do not allow duplicates - for problem in problems: - problem_id = problem['id'] - submission = submissions.get(problem_id) - if submission and problem_id not in problems_with_submissions: - problems_with_submissions.append(submission) - _problem_ids.append(problem_id) - - number_with_submissions = len(problems_with_submissions) - total_submissions = sum([problem['total_submissions'] for problem in problems_with_submissions]) - problems_valid = number_in_structure > 0 - # course_valid &= problems_valid - - data['problems'] = { - 'number_in_structure': number_in_structure, - 'valid': problems_valid, - 'number_with_submissions': number_with_submissions, - 'total_submissions': total_submissions - } - - report['assignment_types']['results'].append(data) - - report['course_valid'] = course_valid - return course_valid, report - - -class CoursePerformanceScreenshotReporter(CoursePerformanceReportGenerator): - REPORT_NAME = 'course_performance_screenshot' - - def __init__(self, course_id, http_cookies=None): - super().__init__(course_id, http_cookies) - self.driver = webdriver.Firefox() - - def _take_screenshot(self, url_path): - logger.debug('Screenshotting %s...', url_path) - - # Go fullscreen - self.driver.maximize_window() - - self.driver.get(self.get_dashboard_url(url_path)) - filename = join('screenshots', '{}-{}.png'.format(slugify(self.course_id), slugify(url_path))) - - if self.driver.get_screenshot_as_file(filename): - logger.debug('screenshot saved to %s.', filename) - return filename - - logger.error('Failed to take screenshot of %s!', url_path) - return None - - def _login(self): - if ENABLE_AUTO_AUTH: - self.driver.get(self.get_dashboard_url('/test/auto_auth/')) - else: - url = LMS_URL - if BASIC_AUTH_CREDENTIALS: - username = BASIC_AUTH_CREDENTIALS[0] - password = BASIC_AUTH_CREDENTIALS[1] - url = url.replace('://', f'://{username}:{password}@') - - self.driver.get(f'{url}/login') - self.driver.find_element_by_id('login-email').send_keys(LMS_USERNAME) - self.driver.find_element_by_id('login-password').send_keys(LMS_PASSWORD) - self.driver.find_element_by_css_selector('button.login-button').click() - - def generate_report(self): - report = { - 'course_id': self.course_id, - 'reviewed': False, - 'approved': False, - } - - try: - self._login() - report['start'] = self._start_date().strftime(self.course_api_client.DATETIME_FORMAT) - - url_paths = ['performance/graded_content'] - for assignment_type in self._assignment_types(): - url_paths.append('performance/graded_content/{}'.format(slugify(assignment_type))) - - pages = [] - for url_path in url_paths: - url_path = self.build_course_path(url_path) - pages.append({ - 'url_path': url_path, - 'filename': self._take_screenshot(url_path) - }) - report['pages'] = pages - finally: - self.driver.close() - - return True, report - - -class CourseHasStructureDataReportGenerator(ReportGeneratorBase): - """ - Verifies that the course structure API returns data for the course. - """ - REPORT_NAME = 'course_has_structure_data' - - def generate_report(self): - report = {'course_id': self.course_id} - try: - self.course_api_client.course_structures(self.course_id).get() - valid = True - except Exception as ex: # pylint: disable=broad-except - valid = False - report['error'] = ex.message - - report['has_structure_data'] = valid - return valid, report diff --git a/acceptance_tests/course_validation/report_runner.py b/acceptance_tests/course_validation/report_runner.py deleted file mode 100644 index 8e7f96115..000000000 --- a/acceptance_tests/course_validation/report_runner.py +++ /dev/null @@ -1,240 +0,0 @@ -#! /usr/bin/env python - -""" -This script executes reporters that provide data about course pages. Any reporter inheriting from ReporterBase -can be used. - -All collected data is logged to a local file and indexed in an Elasticsearch index. The local file can be found at --course_report.log. is the time, in UTC, at which this script was initialized. - -Elasticsearch data is written to the index named course_reports. Note that subsequent runs of this script will overwrite -existing data as new data is collected. - -The list of courses on which to report is pulled from the course structure API and saved locally in a file named -courses.json. Subsequent script runs will use this file instead of the API. If you want fresh data, -simply delete the file. - -To execute this script run the following command from the parent directory of acceptance_tests: - - $ python -m acceptance_tests.course_validation.report_runner -""" - -import datetime -import json -import logging -import time -import traceback -from multiprocessing import Pool -from os.path import abspath, dirname, join - -import requests -from elasticsearch import Elasticsearch - -from acceptance_tests.course_validation import ( - BASIC_AUTH_CREDENTIALS, - COURSE_API_KEY, - COURSE_API_URL, - DASHBOARD_SERVER_URL, - ENABLE_AUTO_AUTH, - LMS_PASSWORD, - LMS_URL, - LMS_USERNAME, -) -from acceptance_tests.course_validation.report_generators import ( - CoursePerformanceReportGenerator, -) -from common.clients import CourseStructureApiClient - -NUM_PROCESSES = 8 -TIMESTAMP = datetime.datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S') - -logger = logging.getLogger(__name__) -es = Elasticsearch(retry_on_timeout=True) -index_name = 'course_reports' - -# Add additional reports here to get different information. -# For example, if you want screenshots, add the CoursePerformanceScreenshotReporter. -# Obvious Note: The more reporters you run, the longer the script will run. -reporters = [CoursePerformanceReportGenerator, ] - - -def _setup_logging(): - level = logging.DEBUG - msg_format = '%(asctime)s - %(levelname)s - %(message)s' - - logging.basicConfig( - filename=f'{TIMESTAMP}-course_report.log', - format=msg_format, - level=level) - - # Log to console, in addition to file - ch = logging.StreamHandler() - ch.setLevel(level) - ch.setFormatter(logging.Formatter(msg_format)) - logging.root.addHandler(ch) - - # Disable requests and elasticsearch debug logs - logging.getLogger('requests').setLevel(logging.WARNING) - logging.getLogger('elasticsearch').setLevel(logging.WARNING) - logging.getLogger('elasticsearch.trace').setLevel(logging.WARNING) - - -def check_course(course_id): - """ - Gather info on the given course. - """ - logger.debug('Checking %s...', course_id) - - valid = True - - for reporter_class in reporters: - try: - # Generate a report for each reporter - reporter = reporter_class(course_id, check_course.cookies) - _valid, report = reporter.generate_report() - valid &= _valid - except Exception as e: # pylint: disable=broad-except - logger.error('Validation for course %s failed: %s\n%s', course_id, e, traceback.format_exc()) - valid = False - report = {'course_id': course_id, 'course_valid': False, 'error': str(e)} - - # Dump the info to the log and Elasticsearch - logger.info(json.dumps(report)) - try: - doc_type = reporter_class.REPORT_NAME - es.index(index=index_name, doc_type=doc_type, body=report, id=course_id) - except Exception as e: - logger.error('%s\n%s', e, traceback.format_exc()) - raise - - if valid: - logger.info('Successfully validated %s.', course_id) - else: - logger.error('Course %s is not valid!', course_id) - - -def pool_init(cookies): - """ - Initialize the variables needed by the mapping function. - """ - check_course.cookies = cookies - - -def login(http_client): - failure_msg = 'Login failed!' - - if ENABLE_AUTO_AUTH: - logger.info('Logging into dashboard with auto auth...') - response = http_client.get(f'{DASHBOARD_SERVER_URL}/test/auto_auth/') - - if response.status_code == 200: - logger.info('Login succeeded.') - return - - logger.fatal(failure_msg) - raise Exception(failure_msg) - - logger.info('Logging into LMS...') - - if BASIC_AUTH_CREDENTIALS: - http_client.auth = BASIC_AUTH_CREDENTIALS - - lms_login = f'{LMS_URL}/login' - lms_login_ajax = f'{LMS_URL}/login_ajax' - - # Make a call to the login page to get cookies (esp. CSRF token) - http_client.get(lms_login) - - # Set the headers and data for the actual login request. - headers = { - 'referer': lms_login - } - data = { - 'email': LMS_USERNAME, - 'password': LMS_PASSWORD, - 'csrfmiddlewaretoken': http_client.cookies['csrftoken'] - } - - # Login! - r = http_client.post(lms_login_ajax, data=data, headers=headers) - success = r.json().get('success', False) - - if not success: - msg = failure_msg - logger.error(msg) - raise Exception(msg) - - # Basic auth is no longer needed - http_client.auth = None - - logger.info('Login succeeded.') - - -def get_courses(): - filename = 'courses.json' - - try: - with open(filename, encoding='utf-8') as f: - courses = json.load(f) - except Exception as e: # pylint: disable=broad-except - logger.warning('Failed to read courses from file: %s', e) - courses = [] - - if not courses: - logger.info('Retrieving courses from API...') - client = CourseStructureApiClient(COURSE_API_URL, COURSE_API_KEY, 5) - courses = client.all_courses - courses = [course['id'] for course in courses] - courses.sort(key=lambda course: course.lower()) - - with open(filename, 'w', encoding='utf-8') as f: - f.write(str(json.dumps(courses, ensure_ascii=False))) - - logger.info('Retrieved %s courses.', len(courses)) - - return courses - - -def main(): - start = time.time() - http_client = requests.Session() - - # Log into Insights via LMS or auto auth. - login(http_client) - - # Get courses on which to report - courses = get_courses() - - # Create index to store results - if not es.indices.exists(index_name): - es.indices.create(index_name) - - # Create the mappings - mappings_file = join(dirname(abspath(__file__)), 'mappings.json') - with open(mappings_file, encoding='utf-8') as f: - mappings = json.load(f) - - for doc_type, body in mappings.items(): - es.indices.put_mapping(index=index_name, doc_type=doc_type, body=body) - - def finish(): - end = time.time() - logger.info('Finished in %d seconds.', end - start) - - try: - p = Pool(NUM_PROCESSES, pool_init, [http_client.cookies]) - p.map(check_course, courses) - p.close() - except (KeyboardInterrupt, SystemExit): - p.terminate() - finish() - raise - except Exception as e: # pylint: disable=broad-except - logger.error('Validation failed to finish: %s', e) - - finish() - - -if __name__ == "__main__": - _setup_logging() - main() diff --git a/karma.conf.js b/karma.conf.js index 2222447c4..a20084ae0 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -50,7 +50,7 @@ module.exports = function(config) { // plugins required for running the karma tests plugins: [ 'karma-jasmine', - 'karma-jasmine-jquery', + 'karma-jasmine-jquery-2', 'karma-jasmine-html-reporter', 'karma-phantomjs-launcher', 'karma-coverage', diff --git a/package-lock.json b/package-lock.json index cec04fbdf..91da0f6db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2027,70 +2027,6 @@ "resolved": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz", "integrity": "sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y=" }, - "bower-installer": { - "version": "git://github.com/bessdsv/bower-installer.git#7f9cece1e6fada50f44dc0851e1d85815cd1b4a7", - "from": "git://github.com/bessdsv/bower-installer.git#temp", - "dev": true, - "requires": { - "async": "~0.2.9", - "bower": "~1.3.8", - "colors": "~0.6.0-1", - "glob": "~3.2.7", - "lodash": "~0.9.1", - "mkdirp": "~0.3.5", - "node-fs": "~0.1.7", - "nopt": "~2.1.2" - }, - "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "2", - "minimatch": "0.3" - } - }, - "lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - }, - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", - "dev": true - }, - "nopt": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", - "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=", - "dev": true, - "requires": { - "abbrev": "1" - } - } - } - }, "bower-json": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", @@ -3837,8 +3773,8 @@ } }, "edx-ui-toolkit": { - "version": "git://github.com/edx/edx-ui-toolkit.git#29759050aff2f4f3cb6921432855ad057bd69bb1", - "from": "git://github.com/edx/edx-ui-toolkit.git#29759050aff2f4f3cb6921432855ad057bd69bb1", + "version": "https://github.com/edx/edx-ui-toolkit.git#29759050aff2f4f3cb6921432855ad057bd69bb1", + "from": "https://github.com/edx/edx-ui-toolkit.git#29759050aff2f4f3cb6921432855ad057bd69bb1", "requires": { "backbone": "~1.2.3", "backbone.paginator": "~2.0.3", @@ -8324,15 +8260,11 @@ } } }, - "karma-jasmine-jquery": { + "karma-jasmine-jquery-2": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/karma-jasmine-jquery/-/karma-jasmine-jquery-0.1.1.tgz", - "integrity": "sha1-icG3VP6kElsfiTghOSwRuc5ddFY=", - "dev": true, - "requires": { - "bower": "^1.3.9", - "bower-installer": "git://github.com/bessdsv/bower-installer.git#temp" - } + "resolved": "https://registry.npmjs.org/karma-jasmine-jquery-2/-/karma-jasmine-jquery-2-0.1.1.tgz", + "integrity": "sha1-/6wtvLXPWWqTMUP+I9fLfr7M0Eg=", + "dev": true }, "karma-phantomjs-launcher": { "version": "1.0.4", @@ -9387,12 +9319,6 @@ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, - "node-fs": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", - "integrity": "sha1-MjI8zLRsn78PwRgS1FAhzDHTJbs=", - "dev": true - }, "node-gyp": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", diff --git a/package.json b/package.json index 9af5e52a1..4536efe94 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "datatables": "1.10.13", "datatables-bootstrap3-plugin": "0.6.0", "edx-pattern-library": "0.16.6", - "edx-ui-toolkit": "git://github.com/edx/edx-ui-toolkit.git#29759050aff2f4f3cb6921432855ad057bd69bb1", + "edx-ui-toolkit": "https://github.com/edx/edx-ui-toolkit.git#29759050aff2f4f3cb6921432855ad057bd69bb1", "extract-text-webpack-plugin": "3.0.2", "file-loader": "0.11.2", "font-awesome": "4.6.3", @@ -78,7 +78,7 @@ "karma-coverage": "1.1.2", "karma-jasmine": "2.0.1", "karma-jasmine-html-reporter": "0.2.2", - "karma-jasmine-jquery": "0.1.1", + "karma-jasmine-jquery-2": "0.1.1", "karma-phantomjs-launcher": "1.0.4", "karma-sinon": "1.0.5", "karma-sourcemap-loader": "0.3.7", diff --git a/requirements/base.in b/requirements/base.in index 38892abcb..b784b8640 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -1,6 +1,6 @@ -c constraints.txt -Django # BSD License +django # BSD License django-appconf django-braces # BSD django-countries # MIT @@ -31,6 +31,4 @@ requests # Apache 2.0 stevedore path.py python-slugify - -# This can be removed once an official social-auth-app-django Pypi release with Django 2.2 support is available in the future. --e git+https://github.com/python-social-auth/social-app-django.git@ffa0fb99a80d11479bea2c4eae9a01ee835d52b9#egg=social-auth-app-django +social-auth-app-django diff --git a/requirements/base.txt b/requirements/base.txt index c212742b6..a6b4ec632 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -4,30 +4,29 @@ # # make upgrade # --e git+https://github.com/python-social-auth/social-app-django.git@ffa0fb99a80d11479bea2c4eae9a01ee835d52b9#egg=social-auth-app-django - # via - # -r requirements/base.in - # edx-auth-backends asgiref==3.5.0 # via django certifi==2021.10.8 # via requests cffi==1.15.0 # via cryptography -charset-normalizer==2.0.10 +charset-normalizer==2.0.12 # via requests -click==8.0.3 +click==8.0.4 # via code-annotations -code-annotations==1.2.0 +code-annotations==1.3.0 # via edx-toggles -cryptography==36.0.1 - # via pyjwt +cryptography==36.0.2 + # via + # pyjwt + # social-auth-core defusedxml==0.7.1 # via # python3-openid # social-auth-core -django==3.2.11 +django==3.2.12 # via + # -c requirements/constraints.txt # -r requirements/base.in # django-appconf # django-braces @@ -48,15 +47,15 @@ django-appconf==1.0.5 # via -r requirements/base.in django-braces==1.15.0 # via -r requirements/base.in -django-countries==7.2.1 +django-countries==7.3.2 # via -r requirements/base.in -django-crispy-forms==1.13.0 +django-crispy-forms==1.14.0 # via -r requirements/base.in django-crum==0.7.9 # via # edx-django-utils # edx-toggles -django-lang-pref-middleware==1.1.0 +django-lang-pref-middleware==1.2.0 # via -r requirements/base.in django-model-utils==4.2.0 # via -r requirements/base.in @@ -84,13 +83,13 @@ drf-jwt==1.19.2 # via edx-drf-extensions edx-analytics-data-api-client==0.17.0 # via -r requirements/base.in -edx-auth-backends==4.0.1 +edx-auth-backends==4.1.0 # via -r requirements/base.in edx-ccx-keys==1.2.1 # via -r requirements/base.in -edx-django-release-util==1.1.1 +edx-django-release-util==1.2.0 # via -r requirements/base.in -edx-django-utils==4.4.2 +edx-django-utils==4.6.0 # via # -r requirements/base.in # edx-drf-extensions @@ -98,16 +97,16 @@ edx-django-utils==4.4.2 # edx-toggles edx-drf-extensions==8.0.1 # via -r requirements/base.in -edx-i18n-tools==0.8.1 +edx-i18n-tools==0.9.1 # via -r requirements/base.in -edx-opaque-keys==2.2.2 +edx-opaque-keys==2.3.0 # via # -r requirements/base.in # edx-ccx-keys # edx-drf-extensions edx-rest-api-client==5.5.0 # via -r requirements/base.in -edx-toggles==4.2.0 +edx-toggles==4.3.1 # via -r requirements/base.in future==0.18.2 # via pyjwkest @@ -119,21 +118,21 @@ libsass==0.21.0 # via -r requirements/base.in logutils==0.3.5 # via -r requirements/base.in -markupsafe==2.0.1 +markupsafe==2.1.1 # via jinja2 -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via edx-django-utils -oauthlib==3.1.1 +oauthlib==3.2.0 # via # requests-oauthlib # social-auth-core -path==16.3.0 +path==16.4.0 # via # edx-i18n-tools - # path.py -path.py==12.5.0 + # path-py +path-py==12.5.0 # via -r requirements/base.in -pbr==5.8.0 +pbr==5.8.1 # via stevedore pinax-announcements==4.0.0 # via -r requirements/base.in @@ -143,7 +142,7 @@ psutil==5.9.0 # via edx-django-utils pycparser==2.21 # via cffi -pycryptodomex==3.13.0 +pycryptodomex==3.14.1 # via pyjwkest pyjwkest==1.4.2 # via edx-drf-extensions @@ -154,17 +153,17 @@ pyjwt[crypto]==2.3.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pymongo==4.0.1 +pymongo==3.12.3 # via edx-opaque-keys python-dateutil==2.8.2 # via edx-drf-extensions -python-slugify==5.0.2 +python-slugify==6.1.1 # via # -r requirements/base.in # code-annotations python3-openid==3.2.0 # via social-auth-core -pytz==2021.3 +pytz==2022.1 # via # django # djangorestframework @@ -183,9 +182,9 @@ requests==2.27.1 # requests-oauthlib # slumber # social-auth-core -requests-oauthlib==1.3.0 +requests-oauthlib==1.3.1 # via social-auth-core -semantic-version==2.8.5 +semantic-version==2.9.0 # via edx-drf-extensions six==1.16.0 # via @@ -197,13 +196,16 @@ six==1.16.0 # libsass # pyjwkest # python-dateutil - # social-auth-core slumber==0.7.1 # via edx-rest-api-client -social-auth-core==3.2.0 +social-auth-app-django==5.0.0 + # via + # -r requirements/base.in + # edx-auth-backends +social-auth-core==4.2.0 # via - # -c requirements/constraints.txt # edx-auth-backends + # social-auth-app-django sqlparse==0.4.2 # via django stevedore==3.5.0 @@ -214,7 +216,9 @@ stevedore==3.5.0 # edx-opaque-keys text-unidecode==1.3 # via python-slugify +typing-extensions==4.1.1 + # via django-countries unicodecsv==0.14.1 # via djangorestframework-csv -urllib3==1.26.8 +urllib3==1.26.9 # via requests diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 5e3be8bde..71e401281 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -13,11 +13,11 @@ # Pin to pylint version used in edx-lint pylint==2.4.4 -# 3.3.0 Generate incompatibilities with awesome-slugify. -social-auth-core==3.2.0 - # Newer versions cause build failure on github with `ERROR: Cannot find command 'git' - do you have 'git' installed and in your PATH?` tox==3.14.6 # Newer version of django-webpack-loader is not compatible with npm webpack-bundle-tracker > 0.4.3 django-webpack-loader==0.7.0 + +# Constraint Django to 3.2 LTS +django<3.3 \ No newline at end of file diff --git a/requirements/django.txt b/requirements/django.txt index c93648df5..15d7c60eb 100644 --- a/requirements/django.txt +++ b/requirements/django.txt @@ -1 +1 @@ -django==3.2.11 +django==3.2.12 diff --git a/requirements/doc.txt b/requirements/doc.txt index b4fcf8374..2f6bde3f0 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -4,10 +4,6 @@ # # make upgrade # --e git+https://github.com/python-social-auth/social-app-django.git@ffa0fb99a80d11479bea2c4eae9a01ee835d52b9#egg=social-auth-app-django - # via - # -r requirements/base.txt - # edx-auth-backends alabaster==0.7.12 # via sphinx asgiref==3.5.0 @@ -24,29 +20,31 @@ cffi==1.15.0 # via # -r requirements/base.txt # cryptography -charset-normalizer==2.0.10 +charset-normalizer==2.0.12 # via # -r requirements/base.txt # requests -click==8.0.3 +click==8.0.4 # via # -r requirements/base.txt # code-annotations -code-annotations==1.2.0 +code-annotations==1.3.0 # via # -r requirements/base.txt # edx-toggles -cryptography==36.0.1 +cryptography==36.0.2 # via # -r requirements/base.txt # pyjwt + # social-auth-core defusedxml==0.7.1 # via # -r requirements/base.txt # python3-openid # social-auth-core -django==3.2.11 +django==3.2.12 # via + # -c requirements/constraints.txt # -r requirements/base.txt # django-appconf # django-braces @@ -67,16 +65,16 @@ django-appconf==1.0.5 # via -r requirements/base.txt django-braces==1.15.0 # via -r requirements/base.txt -django-countries==7.2.1 +django-countries==7.3.2 # via -r requirements/base.txt -django-crispy-forms==1.13.0 +django-crispy-forms==1.14.0 # via -r requirements/base.txt django-crum==0.7.9 # via # -r requirements/base.txt # edx-django-utils # edx-toggles -django-lang-pref-middleware==1.1.0 +django-lang-pref-middleware==1.2.0 # via -r requirements/base.txt django-model-utils==4.2.0 # via -r requirements/base.txt @@ -108,13 +106,13 @@ drf-jwt==1.19.2 # edx-drf-extensions edx-analytics-data-api-client==0.17.0 # via -r requirements/base.txt -edx-auth-backends==4.0.1 +edx-auth-backends==4.1.0 # via -r requirements/base.txt edx-ccx-keys==1.2.1 # via -r requirements/base.txt -edx-django-release-util==1.1.1 +edx-django-release-util==1.2.0 # via -r requirements/base.txt -edx-django-utils==4.4.2 +edx-django-utils==4.6.0 # via # -r requirements/base.txt # edx-drf-extensions @@ -122,9 +120,9 @@ edx-django-utils==4.4.2 # edx-toggles edx-drf-extensions==8.0.1 # via -r requirements/base.txt -edx-i18n-tools==0.8.1 +edx-i18n-tools==0.9.1 # via -r requirements/base.txt -edx-opaque-keys==2.2.2 +edx-opaque-keys==2.3.0 # via # -r requirements/base.txt # edx-ccx-keys @@ -133,7 +131,7 @@ edx-rest-api-client==5.5.0 # via -r requirements/base.txt edx-sphinx-theme==3.0.0 # via -r requirements/doc.in -edx-toggles==4.2.0 +edx-toggles==4.3.1 # via -r requirements/base.txt future==0.18.2 # via @@ -145,7 +143,7 @@ idna==3.3 # requests imagesize==1.3.0 # via sphinx -importlib-metadata==4.10.1 +importlib-metadata==4.11.3 # via sphinx jinja2==3.0.3 # via @@ -156,29 +154,29 @@ libsass==0.21.0 # via -r requirements/base.txt logutils==0.3.5 # via -r requirements/base.txt -markupsafe==2.0.1 +markupsafe==2.1.1 # via # -r requirements/base.txt # jinja2 -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via # -r requirements/base.txt # edx-django-utils -oauthlib==3.1.1 +oauthlib==3.2.0 # via # -r requirements/base.txt # requests-oauthlib # social-auth-core packaging==21.3 # via sphinx -path==16.3.0 +path==16.4.0 # via # -r requirements/base.txt # edx-i18n-tools - # path.py -path.py==12.5.0 + # path-py +path-py==12.5.0 # via -r requirements/base.txt -pbr==5.8.0 +pbr==5.8.1 # via # -r requirements/base.txt # stevedore @@ -196,7 +194,7 @@ pycparser==2.21 # via # -r requirements/base.txt # cffi -pycryptodomex==3.13.0 +pycryptodomex==3.14.1 # via # -r requirements/base.txt # pyjwkest @@ -214,7 +212,7 @@ pyjwt[crypto]==2.3.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pymongo==4.0.1 +pymongo==3.12.3 # via # -r requirements/base.txt # edx-opaque-keys @@ -224,7 +222,7 @@ python-dateutil==2.8.2 # via # -r requirements/base.txt # edx-drf-extensions -python-slugify==5.0.2 +python-slugify==6.1.1 # via # -r requirements/base.txt # code-annotations @@ -232,7 +230,7 @@ python3-openid==3.2.0 # via # -r requirements/base.txt # social-auth-core -pytz==2021.3 +pytz==2022.1 # via # -r requirements/base.txt # babel @@ -255,11 +253,11 @@ requests==2.27.1 # slumber # social-auth-core # sphinx -requests-oauthlib==1.3.0 +requests-oauthlib==1.3.1 # via # -r requirements/base.txt # social-auth-core -semantic-version==2.8.5 +semantic-version==2.9.0 # via # -r requirements/base.txt # edx-drf-extensions @@ -275,18 +273,21 @@ six==1.16.0 # libsass # pyjwkest # python-dateutil - # social-auth-core slumber==0.7.1 # via # -r requirements/base.txt # edx-rest-api-client snowballstemmer==2.2.0 # via sphinx -social-auth-core==3.2.0 +social-auth-app-django==5.0.0 + # via + # -r requirements/base.txt + # edx-auth-backends +social-auth-core==4.2.0 # via - # -c requirements/constraints.txt # -r requirements/base.txt # edx-auth-backends + # social-auth-app-django sphinx==4.4.0 # via # -r requirements/doc.in @@ -317,11 +318,15 @@ text-unidecode==1.3 # via # -r requirements/base.txt # python-slugify +typing-extensions==4.1.1 + # via + # -r requirements/base.txt + # django-countries unicodecsv==0.14.1 # via # -r requirements/base.txt # djangorestframework-csv -urllib3==1.26.8 +urllib3==1.26.9 # via # -r requirements/base.txt # requests diff --git a/requirements/github.txt b/requirements/github.txt index d0215d3d4..996703828 100644 --- a/requirements/github.txt +++ b/requirements/github.txt @@ -6,17 +6,17 @@ # certifi==2021.10.8 # via requests -charset-normalizer==2.0.10 +charset-normalizer==2.0.12 # via requests codecov==2.1.12 # via -r requirements/github.in -coverage==6.2 +coverage==6.3.2 # via codecov distlib==0.3.4 # via # -r requirements/tox.txt # virtualenv -filelock==3.4.2 +filelock==3.6.0 # via # -r requirements/tox.txt # tox @@ -27,7 +27,7 @@ packaging==21.3 # via # -r requirements/tox.txt # tox -platformdirs==2.4.1 +platformdirs==2.5.1 # via # -r requirements/tox.txt # virtualenv @@ -61,9 +61,9 @@ tox==3.14.6 # tox-battery tox-battery==0.6.1 # via -r requirements/tox.txt -urllib3==1.26.8 +urllib3==1.26.9 # via requests -virtualenv==20.13.0 +virtualenv==20.13.4 # via # -r requirements/tox.txt # tox diff --git a/requirements/local.txt b/requirements/local.txt index ef1b06b27..95df8352e 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -4,10 +4,6 @@ # # make upgrade # --e git+https://github.com/python-social-auth/social-app-django.git@ffa0fb99a80d11479bea2c4eae9a01ee835d52b9#egg=social-auth-app-django - # via - # -r requirements/test.txt - # edx-auth-backends asgiref==3.5.0 # via # -r requirements/test.txt @@ -30,28 +26,29 @@ cffi==1.15.0 # via # -r requirements/test.txt # cryptography -charset-normalizer==2.0.10 +charset-normalizer==2.0.12 # via # -r requirements/test.txt # requests -click==8.0.3 +click==8.0.4 # via # -r requirements/pip_tools.txt # -r requirements/test.txt # code-annotations # pip-tools -code-annotations==1.2.0 +code-annotations==1.3.0 # via # -r requirements/test.txt # edx-toggles -coverage[toml]==6.2 +coverage[toml]==6.3.2 # via # -r requirements/test.txt # pytest-cov -cryptography==36.0.1 +cryptography==36.0.2 # via # -r requirements/test.txt # pyjwt + # social-auth-core ddt==1.4.4 # via -r requirements/test.txt defusedxml==0.7.1 @@ -63,8 +60,9 @@ distlib==0.3.4 # via # -r requirements/tox.txt # virtualenv -django==3.2.11 +django==3.2.12 # via + # -c requirements/constraints.txt # -r requirements/test.txt # django-appconf # django-braces @@ -86,9 +84,9 @@ django-appconf==1.0.5 # via -r requirements/test.txt django-braces==1.15.0 # via -r requirements/test.txt -django-countries==7.2.1 +django-countries==7.3.2 # via -r requirements/test.txt -django-crispy-forms==1.13.0 +django-crispy-forms==1.14.0 # via -r requirements/test.txt django-crum==0.7.9 # via @@ -99,7 +97,7 @@ django-debug-toolbar==3.2.4 # via -r requirements/local.in django-dynamic-fixture==3.1.2 # via -r requirements/test.txt -django-lang-pref-middleware==1.1.0 +django-lang-pref-middleware==1.2.0 # via -r requirements/test.txt django-model-utils==4.2.0 # via -r requirements/test.txt @@ -129,13 +127,13 @@ drf-jwt==1.19.2 # edx-drf-extensions edx-analytics-data-api-client==0.17.0 # via -r requirements/test.txt -edx-auth-backends==4.0.1 +edx-auth-backends==4.1.0 # via -r requirements/test.txt edx-ccx-keys==1.2.1 # via -r requirements/test.txt -edx-django-release-util==1.1.1 +edx-django-release-util==1.2.0 # via -r requirements/test.txt -edx-django-utils==4.4.2 +edx-django-utils==4.6.0 # via # -r requirements/test.txt # edx-drf-extensions @@ -143,20 +141,18 @@ edx-django-utils==4.4.2 # edx-toggles edx-drf-extensions==8.0.1 # via -r requirements/test.txt -edx-i18n-tools==0.8.1 +edx-i18n-tools==0.9.1 # via -r requirements/test.txt -edx-opaque-keys==2.2.2 +edx-opaque-keys==2.3.0 # via # -r requirements/test.txt # edx-ccx-keys # edx-drf-extensions edx-rest-api-client==5.5.0 # via -r requirements/test.txt -edx-toggles==4.2.0 - # via -r requirements/test.txt -elasticsearch==2.4.1 +edx-toggles==4.3.1 # via -r requirements/test.txt -filelock==3.4.2 +filelock==3.6.0 # via # -r requirements/tox.txt # tox @@ -191,7 +187,7 @@ libsass==0.21.0 # via -r requirements/test.txt logutils==0.3.5 # via -r requirements/test.txt -markupsafe==2.0.1 +markupsafe==2.1.1 # via # -r requirements/test.txt # jinja2 @@ -205,11 +201,11 @@ more-itertools==8.12.0 # pytest mysqlclient==2.1.0 # via -r requirements/local.in -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via # -r requirements/test.txt # edx-django-utils -oauthlib==3.1.1 +oauthlib==3.2.0 # via # -r requirements/test.txt # requests-oauthlib @@ -220,14 +216,14 @@ packaging==21.3 # -r requirements/tox.txt # pytest # tox -path==16.3.0 +path==16.4.0 # via # -r requirements/test.txt # edx-i18n-tools - # path.py -path.py==12.5.0 + # path-py +path-py==12.5.0 # via -r requirements/test.txt -pbr==5.8.0 +pbr==5.8.1 # via # -r requirements/test.txt # stevedore @@ -237,9 +233,9 @@ pep517==0.12.0 # pip-tools pinax-announcements==4.0.0 # via -r requirements/test.txt -pip-tools==6.4.0 +pip-tools==6.5.1 # via -r requirements/pip_tools.txt -platformdirs==2.4.1 +platformdirs==2.5.1 # via # -r requirements/tox.txt # virtualenv @@ -269,7 +265,7 @@ pycparser==2.21 # via # -r requirements/test.txt # cffi -pycryptodomex==3.13.0 +pycryptodomex==3.14.1 # via # -r requirements/test.txt # pyjwkest @@ -291,7 +287,7 @@ pylint==2.4.4 # via # -c requirements/constraints.txt # -r requirements/test.txt -pymongo==4.0.1 +pymongo==3.12.3 # via # -r requirements/test.txt # edx-opaque-keys @@ -313,7 +309,7 @@ python-dateutil==2.8.2 # via # -r requirements/test.txt # edx-drf-extensions -python-slugify==5.0.2 +python-slugify==6.1.1 # via # -r requirements/test.txt # code-annotations @@ -321,7 +317,7 @@ python3-openid==3.2.0 # via # -r requirements/test.txt # social-auth-core -pytz==2021.3 +pytz==2022.1 # via # -r requirements/test.txt # django @@ -342,7 +338,7 @@ requests==2.27.1 # requests-oauthlib # slumber # social-auth-core -requests-oauthlib==1.3.0 +requests-oauthlib==1.3.1 # via # -r requirements/test.txt # social-auth-core @@ -350,7 +346,7 @@ selenium==3.141.0 # via # -r requirements/test.txt # bok-choy -semantic-version==2.8.5 +semantic-version==2.9.0 # via # -r requirements/test.txt # edx-drf-extensions @@ -369,7 +365,6 @@ six==1.16.0 # libsass # pyjwkest # python-dateutil - # social-auth-core # tox # transifex-client # virtualenv @@ -381,11 +376,15 @@ snowballstemmer==2.2.0 # via # -r requirements/test.txt # pydocstyle -social-auth-core==3.2.0 +social-auth-app-django==5.0.0 + # via + # -r requirements/test.txt + # edx-auth-backends +social-auth-core==4.2.0 # via - # -c requirements/constraints.txt # -r requirements/test.txt # edx-auth-backends + # social-auth-app-django sqlparse==0.4.2 # via # -r requirements/test.txt @@ -397,7 +396,7 @@ stevedore==3.5.0 # code-annotations # edx-django-utils # edx-opaque-keys -testfixtures==6.18.3 +testfixtures==6.18.5 # via -r requirements/test.txt text-unidecode==1.3 # via @@ -407,7 +406,7 @@ toml==0.10.2 # via # -r requirements/tox.txt # tox -tomli==2.0.0 +tomli==2.0.1 # via # -r requirements/pip_tools.txt # -r requirements/test.txt @@ -422,18 +421,21 @@ tox-battery==0.6.1 # via -r requirements/tox.txt transifex-client==0.12.4 # via -r requirements/local.in +typing-extensions==4.1.1 + # via + # -r requirements/test.txt + # django-countries unicodecsv==0.14.1 # via # -r requirements/test.txt # djangorestframework-csv -urllib3==1.26.8 +urllib3==1.26.9 # via # -r requirements/test.txt - # elasticsearch # requests # selenium # transifex-client -virtualenv==20.13.0 +virtualenv==20.13.4 # via # -r requirements/tox.txt # tox diff --git a/requirements/optional.txt b/requirements/optional.txt index f98fcd6f8..4685a82dc 100644 --- a/requirements/optional.txt +++ b/requirements/optional.txt @@ -4,5 +4,5 @@ # # make upgrade # -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via -r requirements/optional.in diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index 18c84c841..ffafd7919 100644 --- a/requirements/pip_tools.txt +++ b/requirements/pip_tools.txt @@ -4,13 +4,13 @@ # # make upgrade # -click==8.0.3 +click==8.0.4 # via pip-tools pep517==0.12.0 # via pip-tools -pip-tools==6.4.0 +pip-tools==6.5.1 # via -r requirements/pip_tools.in -tomli==2.0.0 +tomli==2.0.1 # via pep517 wheel==0.37.1 # via pip-tools diff --git a/requirements/production.txt b/requirements/production.txt index 83c705812..9cea93180 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -4,10 +4,6 @@ # # make upgrade # --e git+https://github.com/python-social-auth/social-app-django.git@ffa0fb99a80d11479bea2c4eae9a01ee835d52b9#egg=social-auth-app-django - # via - # -r requirements/base.txt - # edx-auth-backends asgiref==3.5.0 # via # -r requirements/base.txt @@ -20,29 +16,31 @@ cffi==1.15.0 # via # -r requirements/base.txt # cryptography -charset-normalizer==2.0.10 +charset-normalizer==2.0.12 # via # -r requirements/base.txt # requests -click==8.0.3 +click==8.0.4 # via # -r requirements/base.txt # code-annotations -code-annotations==1.2.0 +code-annotations==1.3.0 # via # -r requirements/base.txt # edx-toggles -cryptography==36.0.1 +cryptography==36.0.2 # via # -r requirements/base.txt # pyjwt + # social-auth-core defusedxml==0.7.1 # via # -r requirements/base.txt # python3-openid # social-auth-core -django==3.2.11 +django==3.2.12 # via + # -c requirements/constraints.txt # -r requirements/base.txt # django-appconf # django-braces @@ -63,16 +61,16 @@ django-appconf==1.0.5 # via -r requirements/base.txt django-braces==1.15.0 # via -r requirements/base.txt -django-countries==7.2.1 +django-countries==7.3.2 # via -r requirements/base.txt -django-crispy-forms==1.13.0 +django-crispy-forms==1.14.0 # via -r requirements/base.txt django-crum==0.7.9 # via # -r requirements/base.txt # edx-django-utils # edx-toggles -django-lang-pref-middleware==1.1.0 +django-lang-pref-middleware==1.2.0 # via -r requirements/base.txt django-model-utils==4.2.0 # via -r requirements/base.txt @@ -102,13 +100,13 @@ drf-jwt==1.19.2 # edx-drf-extensions edx-analytics-data-api-client==0.17.0 # via -r requirements/base.txt -edx-auth-backends==4.0.1 +edx-auth-backends==4.1.0 # via -r requirements/base.txt edx-ccx-keys==1.2.1 # via -r requirements/base.txt -edx-django-release-util==1.1.1 +edx-django-release-util==1.2.0 # via -r requirements/base.txt -edx-django-utils==4.4.2 +edx-django-utils==4.6.0 # via # -r requirements/base.txt # edx-drf-extensions @@ -116,16 +114,16 @@ edx-django-utils==4.4.2 # edx-toggles edx-drf-extensions==8.0.1 # via -r requirements/base.txt -edx-i18n-tools==0.8.1 +edx-i18n-tools==0.9.1 # via -r requirements/base.txt -edx-opaque-keys==2.2.2 +edx-opaque-keys==2.3.0 # via # -r requirements/base.txt # edx-ccx-keys # edx-drf-extensions edx-rest-api-client==5.5.0 # via -r requirements/base.txt -edx-toggles==4.2.0 +edx-toggles==4.3.1 # via -r requirements/base.txt future==0.18.2 # via @@ -145,31 +143,31 @@ libsass==0.21.0 # via -r requirements/base.txt logutils==0.3.5 # via -r requirements/base.txt -markupsafe==2.0.1 +markupsafe==2.1.1 # via # -r requirements/base.txt # jinja2 mysqlclient==2.1.0 # via -r requirements/production.in -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via # -r requirements/base.txt # edx-django-utils nodeenv==1.6.0 # via -r requirements/production.in -oauthlib==3.1.1 +oauthlib==3.2.0 # via # -r requirements/base.txt # requests-oauthlib # social-auth-core -path==16.3.0 +path==16.4.0 # via # -r requirements/base.txt # edx-i18n-tools - # path.py -path.py==12.5.0 + # path-py +path-py==12.5.0 # via -r requirements/base.txt -pbr==5.8.0 +pbr==5.8.1 # via # -r requirements/base.txt # stevedore @@ -187,7 +185,7 @@ pycparser==2.21 # via # -r requirements/base.txt # cffi -pycryptodomex==3.13.0 +pycryptodomex==3.14.1 # via # -r requirements/base.txt # pyjwkest @@ -203,7 +201,7 @@ pyjwt[crypto]==2.3.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pymongo==4.0.1 +pymongo==3.12.3 # via # -r requirements/base.txt # edx-opaque-keys @@ -213,7 +211,7 @@ python-dateutil==2.8.2 # edx-drf-extensions python-memcached==1.59 # via -r requirements/production.in -python-slugify==5.0.2 +python-slugify==6.1.1 # via # -r requirements/base.txt # code-annotations @@ -221,7 +219,7 @@ python3-openid==3.2.0 # via # -r requirements/base.txt # social-auth-core -pytz==2021.3 +pytz==2022.1 # via # -r requirements/base.txt # django @@ -243,11 +241,11 @@ requests==2.27.1 # requests-oauthlib # slumber # social-auth-core -requests-oauthlib==1.3.0 +requests-oauthlib==1.3.1 # via # -r requirements/base.txt # social-auth-core -semantic-version==2.8.5 +semantic-version==2.9.0 # via # -r requirements/base.txt # edx-drf-extensions @@ -263,16 +261,19 @@ six==1.16.0 # pyjwkest # python-dateutil # python-memcached - # social-auth-core slumber==0.7.1 # via # -r requirements/base.txt # edx-rest-api-client -social-auth-core==3.2.0 +social-auth-app-django==5.0.0 + # via + # -r requirements/base.txt + # edx-auth-backends +social-auth-core==4.2.0 # via - # -c requirements/constraints.txt # -r requirements/base.txt # edx-auth-backends + # social-auth-app-django sqlparse==0.4.2 # via # -r requirements/base.txt @@ -287,11 +288,15 @@ text-unidecode==1.3 # via # -r requirements/base.txt # python-slugify +typing-extensions==4.1.1 + # via + # -r requirements/base.txt + # django-countries unicodecsv==0.14.1 # via # -r requirements/base.txt # djangorestframework-csv -urllib3==1.26.8 +urllib3==1.26.9 # via # -r requirements/base.txt # requests diff --git a/requirements/test.in b/requirements/test.in index a7672764b..1940b5dc0 100755 --- a/requirements/test.in +++ b/requirements/test.in @@ -8,7 +8,6 @@ bok-choy coverage ddt django-dynamic-fixture -elasticsearch==2.4.1 httpretty pycodestyle pydocstyle diff --git a/requirements/test.txt b/requirements/test.txt index 352f42470..21d314c47 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -4,10 +4,6 @@ # # make upgrade # --e git+https://github.com/python-social-auth/social-app-django.git@ffa0fb99a80d11479bea2c4eae9a01ee835d52b9#egg=social-auth-app-django - # via - # -r requirements/base.txt - # edx-auth-backends asgiref==3.5.0 # via # -r requirements/base.txt @@ -28,26 +24,27 @@ cffi==1.15.0 # via # -r requirements/base.txt # cryptography -charset-normalizer==2.0.10 +charset-normalizer==2.0.12 # via # -r requirements/base.txt # requests -click==8.0.3 +click==8.0.4 # via # -r requirements/base.txt # code-annotations -code-annotations==1.2.0 +code-annotations==1.3.0 # via # -r requirements/base.txt # edx-toggles -coverage[toml]==6.2 +coverage[toml]==6.3.2 # via # -r requirements/test.in # pytest-cov -cryptography==36.0.1 +cryptography==36.0.2 # via # -r requirements/base.txt # pyjwt + # social-auth-core ddt==1.4.4 # via -r requirements/test.in defusedxml==0.7.1 @@ -56,6 +53,7 @@ defusedxml==0.7.1 # python3-openid # social-auth-core # via + # -c requirements/constraints.txt # -r requirements/base.txt # django-appconf # django-braces @@ -76,9 +74,9 @@ django-appconf==1.0.5 # via -r requirements/base.txt django-braces==1.15.0 # via -r requirements/base.txt -django-countries==7.2.1 +django-countries==7.3.2 # via -r requirements/base.txt -django-crispy-forms==1.13.0 +django-crispy-forms==1.14.0 # via -r requirements/base.txt django-crum==0.7.9 # via @@ -87,7 +85,7 @@ django-crum==0.7.9 # edx-toggles django-dynamic-fixture==3.1.2 # via -r requirements/test.in -django-lang-pref-middleware==1.1.0 +django-lang-pref-middleware==1.2.0 # via -r requirements/base.txt django-model-utils==4.2.0 # via -r requirements/base.txt @@ -117,13 +115,13 @@ drf-jwt==1.19.2 # edx-drf-extensions edx-analytics-data-api-client==0.17.0 # via -r requirements/base.txt -edx-auth-backends==4.0.1 +edx-auth-backends==4.1.0 # via -r requirements/base.txt edx-ccx-keys==1.2.1 # via -r requirements/base.txt -edx-django-release-util==1.1.1 +edx-django-release-util==1.2.0 # via -r requirements/base.txt -edx-django-utils==4.4.2 +edx-django-utils==4.6.0 # via # -r requirements/base.txt # edx-drf-extensions @@ -131,19 +129,17 @@ edx-django-utils==4.4.2 # edx-toggles edx-drf-extensions==8.0.1 # via -r requirements/base.txt -edx-i18n-tools==0.8.1 +edx-i18n-tools==0.9.1 # via -r requirements/base.txt -edx-opaque-keys==2.2.2 +edx-opaque-keys==2.3.0 # via # -r requirements/base.txt # edx-ccx-keys # edx-drf-extensions edx-rest-api-client==5.5.0 # via -r requirements/base.txt -edx-toggles==4.2.0 +edx-toggles==4.3.1 # via -r requirements/base.txt -elasticsearch==2.4.1 - # via -r requirements/test.in future==0.18.2 # via # -r requirements/base.txt @@ -168,7 +164,7 @@ libsass==0.21.0 # via -r requirements/base.txt logutils==0.3.5 # via -r requirements/base.txt -markupsafe==2.0.1 +markupsafe==2.1.1 # via # -r requirements/base.txt # jinja2 @@ -176,25 +172,25 @@ mccabe==0.6.1 # via pylint more-itertools==8.12.0 # via pytest -newrelic==7.4.0.172 +newrelic==7.6.0.173 # via # -r requirements/base.txt # edx-django-utils -oauthlib==3.1.1 +oauthlib==3.2.0 # via # -r requirements/base.txt # requests-oauthlib # social-auth-core packaging==21.3 # via pytest -path==16.3.0 +path==16.4.0 # via # -r requirements/base.txt # edx-i18n-tools - # path.py -path.py==12.5.0 + # path-py +path-py==12.5.0 # via -r requirements/base.txt -pbr==5.8.0 +pbr==5.8.1 # via # -r requirements/base.txt # stevedore @@ -218,7 +214,7 @@ pycparser==2.21 # via # -r requirements/base.txt # cffi -pycryptodomex==3.13.0 +pycryptodomex==3.14.1 # via # -r requirements/base.txt # pyjwkest @@ -240,7 +236,7 @@ pylint==2.4.4 # via # -c requirements/constraints.txt # -r requirements/test.in -pymongo==4.0.1 +pymongo==3.12.3 # via # -r requirements/base.txt # edx-opaque-keys @@ -259,7 +255,7 @@ python-dateutil==2.8.2 # via # -r requirements/base.txt # edx-drf-extensions -python-slugify==5.0.2 +python-slugify==6.1.1 # via # -r requirements/base.txt # code-annotations @@ -267,7 +263,7 @@ python3-openid==3.2.0 # via # -r requirements/base.txt # social-auth-core -pytz==2021.3 +pytz==2022.1 # via # -r requirements/base.txt # django @@ -288,7 +284,7 @@ requests==2.27.1 # requests-oauthlib # slumber # social-auth-core -requests-oauthlib==1.3.0 +requests-oauthlib==1.3.1 # via # -r requirements/base.txt # social-auth-core @@ -296,7 +292,7 @@ selenium==3.141.0 # via # -r requirements/test.in # bok-choy -semantic-version==2.8.5 +semantic-version==2.9.0 # via # -r requirements/base.txt # edx-drf-extensions @@ -314,18 +310,21 @@ six==1.16.0 # libsass # pyjwkest # python-dateutil - # social-auth-core slumber==0.7.1 # via # -r requirements/base.txt # edx-rest-api-client snowballstemmer==2.2.0 # via pydocstyle -social-auth-core==3.2.0 +social-auth-app-django==5.0.0 + # via + # -r requirements/base.txt + # edx-auth-backends +social-auth-core==4.2.0 # via - # -c requirements/constraints.txt # -r requirements/base.txt # edx-auth-backends + # social-auth-app-django sqlparse==0.4.2 # via # -r requirements/base.txt @@ -336,22 +335,25 @@ stevedore==3.5.0 # code-annotations # edx-django-utils # edx-opaque-keys -testfixtures==6.18.3 +testfixtures==6.18.5 # via -r requirements/test.in text-unidecode==1.3 # via # -r requirements/base.txt # python-slugify -tomli==2.0.0 +tomli==2.0.1 # via coverage +typing-extensions==4.1.1 + # via + # -r requirements/base.txt + # django-countries unicodecsv==0.14.1 # via # -r requirements/base.txt # djangorestframework-csv -urllib3==1.26.8 +urllib3==1.26.9 # via # -r requirements/base.txt - # elasticsearch # requests # selenium wcwidth==0.2.5 diff --git a/requirements/tox.txt b/requirements/tox.txt index c2b5a2029..b58ac7868 100644 --- a/requirements/tox.txt +++ b/requirements/tox.txt @@ -6,13 +6,13 @@ # distlib==0.3.4 # via virtualenv -filelock==3.4.2 +filelock==3.6.0 # via # tox # virtualenv packaging==21.3 # via tox -platformdirs==2.4.1 +platformdirs==2.5.1 # via virtualenv pluggy==0.13.1 # via tox @@ -33,5 +33,5 @@ tox==3.14.6 # tox-battery tox-battery==0.6.1 # via -r requirements/tox.in -virtualenv==20.13.0 +virtualenv==20.13.4 # via tox