diff --git a/cms/djangoapps/contentstore/proctoring.py b/cms/djangoapps/contentstore/proctoring.py index a3985f4ac5..7659063f7b 100644 --- a/cms/djangoapps/contentstore/proctoring.py +++ b/cms/djangoapps/contentstore/proctoring.py @@ -79,7 +79,7 @@ def register_special_exams(course_key): 'is_practice_exam': timed_exam.is_practice_exam, 'is_active': True, 'hide_after_due': timed_exam.hide_after_due, - 'backend': course.proctoring_configuration.get('backend', None), + 'backend': course.proctoring_provider, } try: @@ -103,7 +103,6 @@ def register_special_exams(course_key): 'exam_id': exam_id, 'set_by_user_id': timed_exam.edited_by, 'review_policy': timed_exam.exam_review_rules, - 'rules': course.proctoring_configuration.get('rules', None) } # only create/update exam policy for the proctored exams @@ -111,9 +110,7 @@ def register_special_exams(course_key): try: update_review_policy(**exam_review_policy_metadata) except ProctoredExamReviewPolicyNotFoundException: - review_policy_has_rules = exam_review_policy_metadata.get('rules', None) - - if timed_exam.exam_review_rules or review_policy_has_rules: # won't save an empty rule. + if timed_exam.exam_review_rules: # won't save an empty rule. create_exam_review_policy(**exam_review_policy_metadata) msg = 'Created new exam review policy with exam_id {exam_id}'.format(exam_id=exam_id) log.info(msg) diff --git a/cms/djangoapps/contentstore/tests/test_proctoring.py b/cms/djangoapps/contentstore/tests/test_proctoring.py index 492878bc64..f273517c45 100644 --- a/cms/djangoapps/contentstore/tests/test_proctoring.py +++ b/cms/djangoapps/contentstore/tests/test_proctoring.py @@ -28,17 +28,12 @@ class TestProctoredExams(ModuleStoreTestCase): """ super(TestProctoredExams, self).setUp() - default_proctoring_provider = settings.PROCTORING_BACKENDS['DEFAULT'] - self.course = CourseFactory.create( org='edX', course='900', run='test_run', enable_proctored_exams=True, - proctoring_configuration={ - 'backend': default_proctoring_provider, - 'rules': settings.PROCTORING_BACKENDS[default_proctoring_provider]['default_rules'], - } + proctoring_provider=settings.PROCTORING_BACKENDS['DEFAULT'], ) def _verify_exam_data(self, sequence, expected_active): @@ -56,7 +51,6 @@ class TestProctoredExams(ModuleStoreTestCase): # get the review policy object exam_review_policy = get_review_policy_by_exam_id(exam['id']) self.assertEqual(exam_review_policy['review_policy'], sequence.exam_review_rules) - self.assertEqual(exam_review_policy['rules'], self.course.proctoring_configuration['rules']) if not exam['is_proctored'] and not exam['is_practice_exam']: # the hide after due value only applies to timed exams @@ -69,7 +63,7 @@ class TestProctoredExams(ModuleStoreTestCase): self.assertEqual(exam['is_proctored'], sequence.is_proctored_exam) self.assertEqual(exam['is_practice_exam'], sequence.is_practice_exam) self.assertEqual(exam['is_active'], expected_active) - self.assertEqual(exam['backend'], self.course.proctoring_configuration['backend']) + self.assertEqual(exam['backend'], self.course.proctoring_provider) @ddt.data( (True, False, True, False, False), diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index 5f709c5946..c6d39f15a0 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -16,7 +16,7 @@ from openedx.core.djangoapps.video_pipeline.models import VideoUploadsEnabledByD from openedx.core.lib.license import LicenseMixin from path import Path as path from pytz import utc -from six import text_type, iteritems +from six import text_type from xblock.fields import Scope, List, String, Dict, Boolean, Integer, Float from xmodule import course_metadata_utils @@ -183,151 +183,89 @@ class TextbookList(List): return json_data -class ProctoringConfiguration(Dict): +class ProctoringProvider(String): + """ + ProctoringProvider field, which includes validation of the provider + and default that pulls from edx platform settings. + """ def from_json(self, value): """ - Return ProctoringConfiguration as full featured Python type. Perform validation on the backend - and the rules and include any inherited values from the platform default. + Return ProctoringProvider as full featured Python type. Perform validation on the provider + and include any inherited values from the platform default. """ errors = [] - value = super(ProctoringConfiguration, self).from_json(value) - proctoring_backend_settings = getattr( - settings, - 'PROCTORING_BACKENDS', - None - ) + value = super(ProctoringProvider, self).from_json(value) - backend_errors = self._validate_proctoring_backend(value, proctoring_backend_settings) - rules_errors = self._validate_proctoring_rules(value, proctoring_backend_settings) - - errors.extend(backend_errors) - errors.extend(rules_errors) + provider_errors = self._validate_proctoring_provider(value) + errors.extend(provider_errors) if errors: raise ValueError(errors) - value = self._get_proctoring_value(value, proctoring_backend_settings) + value = self._get_proctoring_value(value) return value - def _get_proctoring_value(self, value, proctoring_backend_settings): + def _get_proctoring_value(self, value): """ Return a proctoring value that includes any inherited attributes from the platform defaults - for the backend or rules. + for the provider. """ - proctoring_provider = value.get('backend', None) - proctoring_provider_rules = value.get('rules', None) - - # if both are missing from the value, return the default - if proctoring_provider is None and proctoring_provider_rules is None: + # if provider is missing from the value, return the default + if value is None: return self.default - # if provider is missing, but rules are not, use the default provider - if proctoring_provider is None and proctoring_provider_rules is not None: - value['backend'] = proctoring_backend_settings.get('DEFAULT', None) - - # if rules are missing, but provider is not, use the default rules for the provider - if proctoring_provider is not None and proctoring_provider_rules is None: - value['rules'] = proctoring_backend_settings.get(value['backend'], {}).get('default_rules', {}) - - proctoring_provider_rules_set = ( - proctoring_backend_settings - .get(proctoring_provider, {}) - .get('default_rules', {}) - ) - proctoring_provider_rules = value.get('rules', None) - - # add back in any missing rules for the provider - for default_rule, is_enabled in iteritems(proctoring_provider_rules_set): - if default_rule not in proctoring_provider_rules: - proctoring_provider_rules[default_rule] = is_enabled return value - def _validate_proctoring_backend(self, value, proctoring_backend_settings): + def _validate_proctoring_provider(self, value): """ - Validate the value for the proctoring backend. If the proctoring backend value is - specified, and it is not one of the backends configured at the platform level, return + Validate the value for the proctoring provider. If the proctoring provider value is + specified, and it is not one of the providers configured at the platform level, return a list of error messages to the caller. """ errors = [] - proctoring_provider_whitelist = [provider for provider in proctoring_backend_settings if provider != 'DEFAULT'] - proctoring_provider_whitelist.sort() - proctoring_provider = value.get('backend', None) + available_providers = get_available_providers() - if proctoring_provider and proctoring_provider not in proctoring_provider_whitelist: + if value and value not in available_providers: errors.append( - _('The selected proctoring backend, {proctoring_backend}, is not a valid backend. ' - 'Please select from one of {available_backends}.') + _('The selected proctoring provider, {proctoring_provider}, is not a valid provider. ' + 'Please select from one of {available_providers}.') .format( - proctoring_backend=proctoring_provider, - available_backends=proctoring_provider_whitelist + proctoring_provider=value, + available_providers=available_providers ) ) return errors - def _validate_proctoring_rules(self, value, proctoring_backend_settings): - """ - Validate the value for the proctoring rules. If the proctoring rules value is - specified, and it is not one of the rules configured for the corresponding backend - at the platform level, or if the value for the rule is not a boolean, - return a list of error messages to the caller. - """ - errors = [] - - proctoring_provider = value.get('backend', None) - proctoring_provider_rules = value.get('rules', None) - proctoring_provider_rules_set = ( - proctoring_backend_settings - .get(proctoring_provider, {}) - .get('default_rules', None) - ) - - if proctoring_provider_rules: - for rule, is_enabled in iteritems(proctoring_provider_rules): - if not isinstance(is_enabled, bool): - errors.append( - _('The value for proctoring configuration rule {rule} ' - 'should be either true or false.') - .format(rule=rule) - ) - if not proctoring_provider_rules_set or rule not in proctoring_provider_rules_set: - errors.append( - _('The proctoring configuration rule {rule} ' - 'is not a valid rule for provider {provider}.') - .format( - rule=rule, - provider=proctoring_provider - ) - ) - - return errors - @property def default(self): """ - Return default value for ProctoringConfiguration. + Return default value for ProctoringProvider. """ - default = super(ProctoringConfiguration, self).default + default = super(ProctoringProvider, self).default proctoring_backend_settings = getattr(settings, 'PROCTORING_BACKENDS', None) if proctoring_backend_settings: - default_proctoring_provider = proctoring_backend_settings.get('DEFAULT', None) + return proctoring_backend_settings.get('DEFAULT', None) - try: - default_proctoring_rules = proctoring_backend_settings[default_proctoring_provider]['default_rules'] - except KeyError: - default_proctoring_rules = {} - - return { - 'backend': default_proctoring_provider, - 'rules': default_proctoring_rules, - } return default +def get_available_providers(): + proctoring_backend_settings = getattr( + settings, + 'PROCTORING_BACKENDS', + {} + ) + + available_providers = [provider for provider in proctoring_backend_settings if provider != 'DEFAULT'] + available_providers.sort() + return available_providers + + class CourseFields(object): lti_passports = List( display_name=_("LTI Passports"), @@ -883,9 +821,18 @@ class CourseFields(object): scope=Scope.settings ) - proctoring_configuration = ProctoringConfiguration( - display_name=_("Proctoring Configuration"), - help=_("Enter a proctoring configuration."), + proctoring_provider = ProctoringProvider( + display_name=_("Proctoring Provider"), + help=_( + "Enter the proctoring provider you want to use for this course run. " + "Choose from the following options: {available_providers}."), + help_format_args=dict( + # Put the available providers into a format variable so that translators + # don't translate them. + available_providers=( + ', '.join(get_available_providers()) + ), + ), scope=Scope.settings, ) @@ -1200,7 +1147,7 @@ class CourseDescriptor(CourseFields, SequenceDescriptor, LicenseMixin): def definition_to_xml(self, resource_fs): xml_object = super(CourseDescriptor, self).definition_to_xml(resource_fs) - if len(self.textbooks) > 0: + if self.textbooks: textbook_xml_object = etree.Element('textbook') for textbook in self.textbooks: textbook_xml_object.set('title', textbook.title) @@ -1254,7 +1201,8 @@ class CourseDescriptor(CourseFields, SequenceDescriptor, LicenseMixin): @raw_grader.setter def raw_grader(self, value): - # NOTE WELL: this change will not update the processed graders. If we need that, this needs to call grader_from_conf + # NOTE WELL: this change will not update the processed graders. + # If we need that, this needs to call grader_from_conf. self._grading_policy['RAW_GRADER'] = value self.grading_policy['GRADER'] = value diff --git a/common/lib/xmodule/xmodule/tests/test_course_module.py b/common/lib/xmodule/xmodule/tests/test_course_module.py index dbf0a4d2e9..eb00aa57e5 100644 --- a/common/lib/xmodule/xmodule/tests/test_course_module.py +++ b/common/lib/xmodule/xmodule/tests/test_course_module.py @@ -423,9 +423,9 @@ class CourseDescriptorTestCase(unittest.TestCase): self.assertEqual(expected_certificate_available_date, self.course.certificate_available_date) -class ProctoringConfigurationTestCase(unittest.TestCase): +class ProctoringProviderTestCase(unittest.TestCase): """ - Tests for ProctoringConfiguration, including the default value, validation, and inheritance behavior. + Tests for ProctoringProvider, including the default value, validation, and inheritance behavior. """ shard = 1 @@ -433,64 +433,19 @@ class ProctoringConfigurationTestCase(unittest.TestCase): """ Initialize dummy testing course. """ - super(ProctoringConfigurationTestCase, self).setUp() - self.proctoring_configuration = xmodule.course_module.ProctoringConfiguration() + super(ProctoringProviderTestCase, self).setUp() + self.proctoring_provider = xmodule.course_module.ProctoringProvider() def test_from_json_with_platform_default(self): """ - Test that a proctoring configuration value equivalent to the platform + Test that a proctoring provider value equivalent to the platform default will pass validation. """ default_provider = settings.PROCTORING_BACKENDS.get('DEFAULT') - value = { - 'backend': default_provider, - 'rules': settings.PROCTORING_BACKENDS[default_provider]['default_rules'], - } - # we expect the validated value to be equivalent to the value passed in, # since there are no validation errors or missing data - self.assertEqual(self.proctoring_configuration.from_json(value), value) - - @override_settings( - PROCTORING_BACKENDS={ - 'DEFAULT': 'mock_proctoring_without_rules', - 'mock': { - 'default_rules': { - 'allow_snarfing': True, - 'allow_grok': False - } - }, - 'mock_proctoring_without_rules': {} - } - ) - def test_from_json_with_provider_with_rules(self): - """ - Test that a proctoring provider with rules other than the platform default - passes validation. - """ - provider = 'mock' - value = { - 'backend': provider, - 'rules': settings.PROCTORING_BACKENDS[provider]['default_rules'], - } - - # we expect the validated value to be equivalent to the value passed in, - # since there are no validation errors or missing data - self.assertEqual(self.proctoring_configuration.from_json(value), value) - - def test_from_json_with_provider_without_rules(self): - """ - Test that a proctoring provider without rules passes validation. - """ - value = { - 'backend': 'mock_proctoring_without_rules', - 'rules': {}, - } - - # we expect the validated value to be equivalent to the value passed in, - # since there are no validation errors or missing data - self.assertEqual(self.proctoring_configuration.from_json(value), value) + self.assertEqual(self.proctoring_provider.from_json(default_provider), default_provider) def test_from_json_with_invalid_provider(self): """ @@ -500,145 +455,26 @@ class ProctoringConfigurationTestCase(unittest.TestCase): provider = 'invalid-provider' proctoring_provider_whitelist = [u'mock', u'mock_proctoring_without_rules'] - value = { - 'backend': provider, - 'rules': {}, - } - with self.assertRaises(ValueError) as context_manager: - self.proctoring_configuration.from_json(value) + self.proctoring_provider.from_json(provider) self.assertEqual( context_manager.exception.args[0], - ['The selected proctoring backend, {}, is not a valid backend. Please select from one of {}.' + ['The selected proctoring provider, {}, is not a valid provider. Please select from one of {}.' .format(provider, proctoring_provider_whitelist)] ) - def test_from_json_with_invalid_rules(self): - """ - Test that an invalid rule (i.e. not one configured at the platform level) for a - valid provider throws a ValueError with the correct error message. - """ - provider = 'mock' - rules = settings.PROCTORING_BACKENDS[provider]['default_rules'].copy() - rules['allow_foo'] = True - - value = { - 'backend': provider, - 'rules': rules, - } - - with self.assertRaises(ValueError) as context_manager: - self.proctoring_configuration.from_json(value) - self.assertEqual( - context_manager.exception.args[0], - ['The proctoring configuration rule {} is not a valid rule for provider {}.'. - format('allow_foo', provider)] - ) - - def test_from_json_with_invalid_rule_value(self): - """ - Test that an invalid rule value (i.e. not a boolean) for a valid rule for a - valid provider throws a ValueError with the correct error message. - """ - provider = 'mock' - rules = settings.PROCTORING_BACKENDS[provider]['default_rules'].copy() - rules['allow_grok'] = 'yes' - - value = { - 'backend': provider, - 'rules': rules, - } - - with self.assertRaises(ValueError) as context_manager: - self.proctoring_configuration.from_json(value) - self.assertEqual( - context_manager.exception.args[0], - ['The value for proctoring configuration rule {} should be either true or false.'. - format('allow_grok')] - ) - def test_from_json_adds_platform_default_for_missing_provider(self): """ Test that a value with no provider will inherit the default provider from the platform defaults. """ - provider = 'mock' + default_provider = 'mock' - value = { - 'rules': {} - } - - expected_value = value.copy() - expected_value['backend'] = provider - - self.assertEqual(self.proctoring_configuration.from_json(value), expected_value) - - def test_from_json_adds_platform_defaults_for_missing_rules(self): - """ - Test that a value with no rules will inherit the default rules for - that provider from the platform defaults. - """ - provider = 'mock' - - value = { - 'backend': provider - } - - expected_value = value.copy() - expected_value['rules'] = settings.PROCTORING_BACKENDS[provider]['default_rules'] - - self.assertEqual(self.proctoring_configuration.from_json(value), expected_value) - - def test_from_json_adds_platform_defaults_for_missing_rules_no_rules_as_empty_dict(self): - """ - Test that a value with no rules will inherit an empty dict for - a provider without rules in the platform defaults. - """ - provider = 'mock_proctoring_without_rules' - - value = { - 'backend': provider - } - - expected_value = value.copy() - expected_value['rules'] = {} - - self.assertEqual(self.proctoring_configuration.from_json(value), expected_value) - - def test_from_json_adds_platform_defaults_for_missing_provider_and_rules(self): - """ - Test that a value with no rules and no provider will inherit the platform - defaults. - """ - self.assertEqual(self.proctoring_configuration.from_json({}), self.proctoring_configuration.default) - - def test_from_json_adds_missing_rules_from_platform_default(self): - """ - Test that a value that is missing rules present in the default will - inherit these rules from the platform default. - """ - provider = 'mock' - rules = settings.PROCTORING_BACKENDS[provider]['default_rules'].copy() - del rules['allow_snarfing'] - - value = { - 'backend': provider, - 'rules': rules, - } - - expected_value = value.copy() - expected_value['rules'] = settings.PROCTORING_BACKENDS[provider]['default_rules'] - - self.assertEqual(self.proctoring_configuration.from_json(value), expected_value) + self.assertEqual(self.proctoring_provider.from_json(None), default_provider) @override_settings( PROCTORING_BACKENDS={ - 'mock': { - 'default_rules': { - 'allow_snarfing': True, - 'allow_grok': False - } - }, + 'mock': {}, 'mock_proctoring_without_rules': {} } ) @@ -646,57 +482,12 @@ class ProctoringConfigurationTestCase(unittest.TestCase): """ Test that, when the platform defaults are not set, the default is correct. """ - expected_default = { - 'backend': None, - 'rules': {} - } - - self. assertEqual(self.proctoring_configuration.default, expected_default) - - def test_default_with_platform_default_with_rules(self): - """ - Test that, when the platform default provider with rules is specified, the default is correct. - """ - default_provider = settings.PROCTORING_BACKENDS.get('DEFAULT') - default_rules = settings.PROCTORING_BACKENDS[default_provider]['default_rules'] - - expected_default = { - 'backend': default_provider, - 'rules': default_rules - } - - self.assertEqual(self.proctoring_configuration.default, expected_default) - - @override_settings( - PROCTORING_BACKENDS={ - 'DEFAULT': 'mock_proctoring_without_rules', - 'mock': { - 'default_rules': { - 'allow_snarfing': True, - 'allow_grok': False - } - }, - 'mock_proctoring_without_rules': {} - } - ) - def test_default_with_platform_default_without_rules(self): - """ - Test that, when the platform default provider without rules is specified, the default is correct. - """ - default_provider = 'mock_proctoring_without_rules' - default_rules = {} - - expected_default = { - 'backend': default_provider, - 'rules': default_rules - } - - self.assertEqual(self.proctoring_configuration.default, expected_default) + self. assertEqual(self.proctoring_provider.default, None) @override_settings(PROCTORING_BACKENDS=None) - def test_default_default_with_no_platform_default(self): + def test_default_with_no_platform_configuration(self): """ Test that, when the platform default is not specified, the default is correct. """ - default = self.proctoring_configuration.default - self.assertEqual(default, {}) + default = self.proctoring_provider.default + self.assertEqual(default, None) diff --git a/common/test/acceptance/pages/studio/settings_advanced.py b/common/test/acceptance/pages/studio/settings_advanced.py index 2fd3cf858d..68f7c616eb 100644 --- a/common/test/acceptance/pages/studio/settings_advanced.py +++ b/common/test/acceptance/pages/studio/settings_advanced.py @@ -269,4 +269,5 @@ class AdvancedSettingsPage(CoursePage): 'create_zendesk_tickets', 'ccx_connector', 'enable_ccx', + 'proctoring_provider', ] diff --git a/lms/envs/test.py b/lms/envs/test.py index 95019b3c68..4a420dc923 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -126,13 +126,8 @@ MOCK_PEER_GRADING = True PROCTORING_BACKENDS = { 'DEFAULT': 'mock', - 'mock': { - 'default_rules': { - 'allow_snarfing': True, - 'allow_grok': False - } - }, - 'mock_proctoring_without_rules': {} + 'mock': {}, + 'mock_proctoring_without_rules': {}, } ############################ STATIC FILES ############################# diff --git a/lms/envs/test_static_optimized.py b/lms/envs/test_static_optimized.py index 4cc54b34bf..bf5bf7f6da 100644 --- a/lms/envs/test_static_optimized.py +++ b/lms/envs/test_static_optimized.py @@ -37,12 +37,7 @@ XQUEUE_INTERFACE = { PROCTORING_BACKENDS = { 'DEFAULT': 'mock', - 'mock': { - 'default_rules': { - 'allow_snarfing': True, - 'allow_grok': False, - } - }, + 'mock': {}, 'mock_proctoring_without_rules': {}, } diff --git a/openedx/tests/settings.py b/openedx/tests/settings.py index a1e8306eae..7403435b4f 100644 --- a/openedx/tests/settings.py +++ b/openedx/tests/settings.py @@ -53,12 +53,7 @@ DATABASES = { PROCTORING_BACKENDS = { 'DEFAULT': 'mock', - 'mock': { - 'default_rules': { - 'allow_snarfing': True, - 'allow_grok': False, - } - }, + 'mock': {}, 'mock_proctoring_without_rules': {}, } diff --git a/package-lock.json b/package-lock.json index 14621a7cba..8979a58422 100644 --- a/package-lock.json +++ b/package-lock.json @@ -86,17 +86,13 @@ } }, "@edx/edx-proctoring": { - "version": "1.5.0-rc.1", - "resolved": "https://registry.npmjs.org/@edx/edx-proctoring/-/edx-proctoring-1.5.0-rc.1.tgz", - "integrity": "sha512-ONkLR0jW1REC+Z40FPLP0lhT/TEF1UR2sElrpfmO2gTxYbk/Dw5ah9eYPOhBuQNp4giYDzZeCNfz5pgILDeo9w==" + "version": "git+https://git@github.com/edx/edx-proctoring.git#15a02d817ed755af4614407283a04046489fba1d" }, "@edx/mockprock": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@edx/mockprock/-/mockprock-1.0.1.tgz", - "integrity": "sha512-XUVRpmeBUvNKaKG3lZz9D8HY4Mykw5duW6qAmSQUOWFy2ILaMFjcT5hMApog/xC9rIp2P2EEzha0tOwuiP7P2g==", + "version": "git+https://git@github.com/edx/mockprock.git#c9e4814ace9afad7a778e2af372b3125b3e56588", "dev": true, "requires": { - "@edx/edx-proctoring": "1.5.0-rc.1" + "@edx/edx-proctoring": "git+https://git@github.com/edx/edx-proctoring.git#15a02d817ed755af4614407283a04046489fba1d" } }, "@edx/paragon": { @@ -261,7 +257,7 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { "version": "1.3.3", @@ -523,7 +519,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-union": { "version": "3.1.0", @@ -1537,7 +1533,7 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "backbone": { "version": "1.3.3", @@ -1742,7 +1738,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=" + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { "version": "1.18.2", @@ -1905,7 +1901,7 @@ "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { "pako": "1.0.6" } @@ -2196,7 +2192,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { "inherits": "2.0.3", "safe-buffer": "5.1.1" @@ -2217,7 +2213,7 @@ "clap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "requires": { "chalk": "1.1.3" }, @@ -2415,7 +2411,7 @@ "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { "color-name": "1.1.3" } @@ -2582,7 +2578,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "convert-source-map": { @@ -2622,7 +2618,7 @@ "cosmiconfig": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-3.1.0.tgz", - "integrity": "sha1-ZAqUv5hH8yGABAPNJzr2BmXHM5c=", + "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==", "dev": true, "requires": { "is-directory": "0.3.1", @@ -2634,7 +2630,7 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, "js-yaml": { @@ -2721,7 +2717,7 @@ "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { "browserify-cipher": "1.0.0", "browserify-sign": "4.0.4", @@ -2997,7 +2993,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -3380,7 +3376,7 @@ "edx-proctoring-proctortrack": { "version": "git+https://git@github.com/joshivj/edx-proctoring-proctortrack.git#66650ed6cd39bf489a86723d5ad3593c2ec8992f", "requires": { - "@edx/edx-proctoring": "1.5.0-rc.1" + "@edx/edx-proctoring": "git+https://git@github.com/edx/edx-proctoring.git#15a02d817ed755af4614407283a04046489fba1d" } }, "edx-ui-toolkit": { @@ -3476,7 +3472,7 @@ "emoji-regex": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha1-m66pKbFVVlwR6kHGYm6qZc75ksI=", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", "dev": true }, "emojis-list": { @@ -4004,7 +4000,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -4062,7 +4058,7 @@ "eslint-config-airbnb-base": { "version": "11.3.2", "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz", - "integrity": "sha1-hwOxGr48iKx+wrdFt/31LgCuaAo=", + "integrity": "sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==", "dev": true, "requires": { "eslint-restricted-globals": "0.1.1" @@ -4360,7 +4356,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { "md5.js": "1.3.4", "safe-buffer": "5.1.1" @@ -4567,7 +4563,7 @@ "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { "lodash": "4.17.5" } @@ -4944,7 +4940,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { "version": "1.1.0", @@ -5032,7 +5028,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -5062,7 +5058,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "globby": { "version": "7.1.1", @@ -5615,7 +5611,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -5627,7 +5623,7 @@ "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, "import-local": { @@ -5896,7 +5892,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-builtin-module": { "version": "1.0.0", @@ -6093,7 +6089,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { "isobject": "3.0.1" } @@ -8276,7 +8272,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } @@ -8421,7 +8417,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.11" } @@ -8607,7 +8603,7 @@ "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha1-mA9vcthSEaU0fGsrwYxbhMPrR+8=", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "0.1.12", "is-stream": "1.1.0" @@ -8649,7 +8645,7 @@ "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "requires": { "assert": "1.4.1", "browserify-zlib": "0.2.0", @@ -8820,7 +8816,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", @@ -9248,7 +9244,7 @@ "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=" + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" }, "parse-asn1": { "version": "5.1.0", @@ -9401,7 +9397,7 @@ "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "requires": { "create-hash": "1.1.3", "create-hmac": "1.1.6", @@ -9835,7 +9831,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -9923,7 +9919,7 @@ "postcss-reporter": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", - "integrity": "sha1-oUF3/RNCgp0pFlPyeG79ZxEDMsM=", + "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", "dev": true, "requires": { "chalk": "2.3.1", @@ -9946,7 +9942,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -10009,7 +10005,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -10125,7 +10121,7 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=" + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process": { "version": "0.11.10", @@ -10146,7 +10142,7 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "2.0.6" } @@ -10281,7 +10277,7 @@ "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -10635,7 +10631,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } @@ -10715,7 +10711,7 @@ "redux": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha1-BrcxIyFZAdJdBlvjQusCa8HIU3s=", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { "lodash": "4.17.5", "lodash-es": "4.17.6", @@ -10751,7 +10747,7 @@ "regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "requires": { "babel-runtime": "6.26.0", "babel-types": "6.26.0", @@ -11095,7 +11091,7 @@ "rtlcss": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.2.1.tgz", - "integrity": "sha1-+FN+QVUggWawXhiYAhMZNvzv0p4=", + "integrity": "sha512-JjQ5DlrmwiItAjlmhoxrJq5ihgZcE0wMFxt7S17bIrt4Lw0WwKKFk+viRhvodB/0falyG/5fiO043ZDh6/aqTw==", "requires": { "chalk": "2.3.1", "findup": "0.1.5", @@ -11117,7 +11113,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -11139,7 +11135,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safe-regex": { "version": "1.1.0", @@ -11533,7 +11529,7 @@ "sass-loader": { "version": "6.0.6", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.6.tgz", - "integrity": "sha1-6dXmwfFV+qMqSybXqbcQfCJeQPk=", + "integrity": "sha512-c3/Zc+iW+qqDip6kXPYLEgsAu2lf4xz0EZDplB7EmSUMda12U1sGJPetH55B/j9eu0bTtKzKlNPWWyYC7wFNyQ==", "requires": { "async": "2.6.0", "clone-deep": "0.3.0", @@ -11545,7 +11541,7 @@ "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { "lodash": "4.17.5" } @@ -11815,7 +11811,7 @@ "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" @@ -12091,7 +12087,7 @@ "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=" + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" }, "source-map": { "version": "0.5.7", @@ -12161,7 +12157,7 @@ "specificity": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz", - "integrity": "sha1-meZRHs7vD42bV5JJN6rCyxPRPEI=", + "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", "dev": true }, "split-string": { @@ -12328,7 +12324,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } @@ -12551,7 +12547,7 @@ "style-loader": { "version": "0.18.2", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha1-zDFFmvvNbYC3Ig7lSykan9Zv9es=", + "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", "requires": { "loader-utils": "1.1.0", "schema-utils": "0.3.0" @@ -12662,7 +12658,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -12817,13 +12813,13 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -12868,7 +12864,7 @@ "stylelint-config-recommended-scss": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-2.0.0.tgz", - "integrity": "sha1-P0SzOK+zv1tr2e663UaO7ydxOSI=", + "integrity": "sha512-DUIW3daRl5EAyU4ZR6xfPa+bqV5wDccS7X1je6Enes9edpbmWUBR/5XLfDPnjMJgqOe2QwqwaE/qnG4lXID9rg==", "dev": true, "requires": { "stylelint-config-recommended": "1.0.0" @@ -12877,7 +12873,7 @@ "stylelint-config-standard": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-17.0.0.tgz", - "integrity": "sha1-QhA6CQBU7io93p7K7VXl1NnQWfw=", + "integrity": "sha512-G8jMZ0KsaVH7leur9XLZVhwOBHZ2vdbuJV8Bgy0ta7/PpBhEHo6fjVDaNchyCGXB5sRcWVq6O9rEU/MvY9cQDQ==", "dev": true, "requires": { "stylelint-config-recommended": "1.0.0" @@ -12886,7 +12882,7 @@ "stylelint-formatter-pretty": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stylelint-formatter-pretty/-/stylelint-formatter-pretty-1.0.3.tgz", - "integrity": "sha1-prQ8PzoTIGvft3fQ2ozvxsdsNsM=", + "integrity": "sha512-Jg39kL6kkjUrdKIiHwwz/fbElcF5dOS48ZhvGrEJeWijUbmY1yudclfXv9H61eBqKKu0E33nfez2r0G4EvPtFA==", "dev": true, "requires": { "ansi-escapes": "2.0.0", @@ -12945,7 +12941,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -13000,7 +12996,7 @@ "sugarss": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz", - "integrity": "sha1-voJtkAPg8kdzX5I2XcP9fxuunkQ=", + "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", "dev": true, "requires": { "postcss": "6.0.19" @@ -13020,7 +13016,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -13491,7 +13487,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } @@ -13514,7 +13510,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "1.0.2" @@ -14448,7 +14444,7 @@ "webpack-merge": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", - "integrity": "sha1-8Rl6Cpc+acb77rbWWCGaqMDBNVU=", + "integrity": "sha512-geQsZ86YkXOVOjvPC5yv3JSNnL6/X3Kzh935AQ/gJNEYXEfJDQFu/sdFuktS9OW2JcH/SJec8TGfRdrpHshH7A==", "requires": { "lodash": "4.17.5" } @@ -14465,7 +14461,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -14616,7 +14612,7 @@ "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, "requires": { "sax": "1.2.4", diff --git a/requirements/edx-sandbox/shared.txt b/requirements/edx-sandbox/shared.txt index ccd80c82bd..eb9880c2a5 100644 --- a/requirements/edx-sandbox/shared.txt +++ b/requirements/edx-sandbox/shared.txt @@ -13,10 +13,14 @@ cffi==1.11.5 # via cryptography cryptography==2.4.2 enum34==1.1.6 # via cryptography <<<<<<< HEAD +<<<<<<< HEAD idna==2.8 # via cryptography ======= idna==2.7 >>>>>>> make upgrade +======= +idna==2.8 # via cryptography +>>>>>>> Removed course-run exam rule configuration ipaddress==1.0.22 # via cryptography lxml==3.8.0 markupsafe==1.1.0 diff --git a/requirements/edx/base.in b/requirements/edx/base.in index 476bcd83f2..1e62d7caf5 100644 --- a/requirements/edx/base.in +++ b/requirements/edx/base.in @@ -80,7 +80,7 @@ edx-enterprise edx-milestones edx-oauth2-provider edx-organizations -edx-proctoring>=1.5.0b3 +edx-proctoring==1.5.0rc2 edx-rest-api-client edx-search edx-submissions diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 15a1c6bfcc..c122e1b889 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -119,14 +119,23 @@ edx-django-sites-extensions==2.3.1 edx-django-utils==1.0.3 edx-drf-extensions==2.0.1 <<<<<<< HEAD +<<<<<<< HEAD edx-enterprise==1.2.0 ======= +======= +>>>>>>> Removed course-run exam rule configuration <<<<<<< HEAD edx-enterprise==1.1.2 ======= edx-enterprise==1.1.0 >>>>>>> make upgrade +<<<<<<< HEAD >>>>>>> make upgrade +======= +======= +edx-enterprise==1.1.2 +>>>>>>> Removed course-run exam rule configuration +>>>>>>> Removed course-run exam rule configuration edx-i18n-tools==0.4.6 edx-milestones==0.1.13 edx-oauth2-provider==1.2.2 @@ -135,6 +144,7 @@ edx-organizations==1.0.0 <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD edx-proctoring==1.4.0 ======= edx-proctoring==1.5.0b1 @@ -145,6 +155,9 @@ edx-proctoring==1.5.0b3 ======= edx-proctoring==1.5.0rc1 >>>>>>> Set NPM dependencies more stably +======= +edx-proctoring==1.5.0rc2 +>>>>>>> Removed course-run exam rule configuration edx-rest-api-client==1.9.2 edx-search==1.2.1 edx-submissions==2.0.12 @@ -166,10 +179,14 @@ help-tokens==1.0.3 html5lib==1.0.1 httplib2==0.12.0 # via oauth2, zendesk <<<<<<< HEAD +<<<<<<< HEAD idna==2.8 ======= idna==2.7 >>>>>>> Enable course run level overrides for proctoring configuration. +======= +idna==2.8 +>>>>>>> Removed course-run exam rule configuration ipaddr==2.1.11 ipaddress==1.0.22 isodate==0.6.0 # via python-saml @@ -251,8 +268,12 @@ reportlab==3.5.11 reportlab==3.5.12 >>>>>>> Updated edx-proctoring pre-release requests-oauthlib==1.0.0 +<<<<<<< HEAD requests==2.20.1 >>>>>>> Enable course run level overrides for proctoring configuration. +======= +requests==2.21.0 +>>>>>>> Removed course-run exam rule configuration rest-condition==1.0.3 rfc6266-parser==0.0.5.post2 rules==2.0.1 diff --git a/requirements/edx/coverage.in b/requirements/edx/coverage.in index 26a1299140..a0c036431a 100644 --- a/requirements/edx/coverage.in +++ b/requirements/edx/coverage.in @@ -14,3 +14,4 @@ coverage==4.4 # Code coverage testing for Python diff-cover==0.9.8 # Automatically find diff lines that need test coverage +six==1.11.0 # Pinned because diff-cover needs it, but later transifex-client says ==1.11.0 diff --git a/requirements/edx/coverage.txt b/requirements/edx/coverage.txt index a632cc4a62..2ba0d5d9df 100644 --- a/requirements/edx/coverage.txt +++ b/requirements/edx/coverage.txt @@ -10,5 +10,10 @@ inflect==2.1.0 # via jinja2-pluralize jinja2-pluralize==0.3.0 # via diff-cover jinja2==2.10 # via diff-cover, jinja2-pluralize markupsafe==1.1.0 # via jinja2 +<<<<<<< HEAD pygments==2.3.1 # via diff-cover six==1.11.0 # via diff-cover +======= +pygments==2.3.0 # via diff-cover +six==1.11.0 +>>>>>>> Removed course-run exam rule configuration diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 9fa2393ec7..8a7137be91 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -138,14 +138,23 @@ edx-django-sites-extensions==2.3.1 edx-django-utils==1.0.3 edx-drf-extensions==2.0.1 <<<<<<< HEAD +<<<<<<< HEAD edx-enterprise==1.2.0 ======= +======= +>>>>>>> Removed course-run exam rule configuration <<<<<<< HEAD edx-enterprise==1.1.2 ======= edx-enterprise==1.1.0 >>>>>>> make upgrade +<<<<<<< HEAD >>>>>>> make upgrade +======= +======= +edx-enterprise==1.1.2 +>>>>>>> Removed course-run exam rule configuration +>>>>>>> Removed course-run exam rule configuration edx-i18n-tools==0.4.6 edx-lint==1.0.0 edx-milestones==0.1.13 @@ -155,6 +164,7 @@ edx-organizations==1.0.0 <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD edx-proctoring==1.4.0 ======= edx-proctoring==1.5.0b1 @@ -165,6 +175,9 @@ edx-proctoring==1.5.0b3 ======= edx-proctoring==1.5.0rc1 >>>>>>> Set NPM dependencies more stably +======= +edx-proctoring==1.5.0rc2 +>>>>>>> Removed course-run exam rule configuration edx-rest-api-client==1.9.2 edx-search==1.2.1 edx-sphinx-theme==1.4.0 @@ -326,8 +339,12 @@ reportlab==3.5.11 reportlab==3.5.12 >>>>>>> Updated edx-proctoring pre-release requests-oauthlib==1.0.0 +<<<<<<< HEAD requests==2.20.1 >>>>>>> Enable course run level overrides for proctoring configuration. +======= +requests==2.21.0 +>>>>>>> Removed course-run exam rule configuration rest-condition==1.0.3 rfc6266-parser==0.0.5.post2 rules==2.0.1 diff --git a/requirements/edx/paver.in b/requirements/edx/paver.in index 85b0656b3c..36b1cb4054 100644 --- a/requirements/edx/paver.in +++ b/requirements/edx/paver.in @@ -24,3 +24,5 @@ requests # Simple interface for making HTTP requests stevedore==1.10.0 # via edx-opaque-keys watchdog # Used in paver watch_assets wrapt==1.10.5 # Decorator utilities used in the @timed paver task decorator + +six==1.11.0 # Pinned because a few things here need it, but later transifex-client says ==1.11.0 diff --git a/requirements/edx/paver.txt b/requirements/edx/paver.txt index 6bb5a96311..60933c561a 100644 --- a/requirements/edx/paver.txt +++ b/requirements/edx/paver.txt @@ -23,11 +23,16 @@ pymongo==2.9.1 python-memcached==1.48 pyyaml==3.13 # via watchdog <<<<<<< HEAD +<<<<<<< HEAD requests==2.21.0 ======= requests==2.20.1 >>>>>>> Enable course run level overrides for proctoring configuration. six==1.11.0 # via edx-opaque-keys, libsass, paver, stevedore +======= +requests==2.21.0 +six==1.11.0 +>>>>>>> Removed course-run exam rule configuration stevedore==1.10.0 urllib3==1.23 # via requests watchdog==0.9.0 diff --git a/requirements/edx/pip-tools.in b/requirements/edx/pip-tools.in index 50f3de3e19..098843a697 100644 --- a/requirements/edx/pip-tools.in +++ b/requirements/edx/pip-tools.in @@ -10,3 +10,4 @@ -c ../constraints.txt pip-tools # Contains pip-compile, used to generate pip requirements files +six==1.11.0 # Pinned because pip-tools needs it, but later transifex-client says ==1.11.0 diff --git a/requirements/edx/pip-tools.txt b/requirements/edx/pip-tools.txt index 546f9d2811..d520605ee6 100644 --- a/requirements/edx/pip-tools.txt +++ b/requirements/edx/pip-tools.txt @@ -5,5 +5,10 @@ # make upgrade # click==7.0 # via pip-tools +<<<<<<< HEAD pip-tools==3.2.0 six==1.11.0 # via pip-tools +======= +pip-tools==3.1.0 +six==1.11.0 +>>>>>>> Removed course-run exam rule configuration diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index edc26a17f6..cabc4cd6ab 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -133,14 +133,23 @@ edx-django-sites-extensions==2.3.1 edx-django-utils==1.0.3 edx-drf-extensions==2.0.1 <<<<<<< HEAD +<<<<<<< HEAD edx-enterprise==1.2.0 ======= +======= +>>>>>>> Removed course-run exam rule configuration <<<<<<< HEAD edx-enterprise==1.1.2 ======= edx-enterprise==1.1.0 >>>>>>> make upgrade +<<<<<<< HEAD >>>>>>> make upgrade +======= +======= +edx-enterprise==1.1.2 +>>>>>>> Removed course-run exam rule configuration +>>>>>>> Removed course-run exam rule configuration edx-i18n-tools==0.4.6 edx-lint==1.0.0 edx-milestones==0.1.13 @@ -150,6 +159,7 @@ edx-organizations==1.0.0 <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD edx-proctoring==1.4.0 ======= edx-proctoring==1.5.0b1 @@ -160,6 +170,9 @@ edx-proctoring==1.5.0b3 ======= edx-proctoring==1.5.0rc1 >>>>>>> Set NPM dependencies more stably +======= +edx-proctoring==1.5.0rc2 +>>>>>>> Removed course-run exam rule configuration edx-rest-api-client==1.9.2 edx-search==1.2.1 edx-submissions==2.0.12 @@ -315,8 +328,12 @@ reportlab==3.5.11 reportlab==3.5.12 >>>>>>> Updated edx-proctoring pre-release requests-oauthlib==1.0.0 +<<<<<<< HEAD requests==2.20.1 >>>>>>> Enable course run level overrides for proctoring configuration. +======= +requests==2.21.0 +>>>>>>> Removed course-run exam rule configuration rest-condition==1.0.3 rfc6266-parser==0.0.5.post2 rules==2.0.1