Removed course-run exam rule configuration

This commit is contained in:
Michael Roytman
2018-12-06 16:31:03 -05:00
committed by Dave St.Germain
parent 72a2e191fd
commit 23fcb7e7bb
20 changed files with 228 additions and 438 deletions

View File

@@ -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)

View File

@@ -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),

View File

@@ -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

View File

@@ -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)

View File

@@ -269,4 +269,5 @@ class AdvancedSettingsPage(CoursePage):
'create_zendesk_tickets',
'ccx_connector',
'enable_ccx',
'proctoring_provider',
]

View File

@@ -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 #############################

View File

@@ -37,12 +37,7 @@ XQUEUE_INTERFACE = {
PROCTORING_BACKENDS = {
'DEFAULT': 'mock',
'mock': {
'default_rules': {
'allow_snarfing': True,
'allow_grok': False,
}
},
'mock': {},
'mock_proctoring_without_rules': {},
}

View File

@@ -53,12 +53,7 @@ DATABASES = {
PROCTORING_BACKENDS = {
'DEFAULT': 'mock',
'mock': {
'default_rules': {
'allow_snarfing': True,
'allow_grok': False,
}
},
'mock': {},
'mock_proctoring_without_rules': {},
}

144
package-lock.json generated
View File

@@ -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",

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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