diff --git a/cms/djangoapps/contentstore/management/commands/force_publish.py b/cms/djangoapps/contentstore/management/commands/force_publish.py
index 642e87db21..58e41c2042 100644
--- a/cms/djangoapps/contentstore/management/commands/force_publish.py
+++ b/cms/djangoapps/contentstore/management/commands/force_publish.py
@@ -1,6 +1,7 @@
"""
Script for force publishing a course
"""
+from __future__ import print_function
from django.core.management.base import BaseCommand, CommandError
from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey
diff --git a/cms/djangoapps/contentstore/tests/test_courseware_index.py b/cms/djangoapps/contentstore/tests/test_courseware_index.py
index 035513d869..5fe1f8c323 100644
--- a/cms/djangoapps/contentstore/tests/test_courseware_index.py
+++ b/cms/djangoapps/contentstore/tests/test_courseware_index.py
@@ -1,6 +1,7 @@
"""
Testing indexing of the courseware as it is changed
"""
+from __future__ import print_function
import json
import time
from datetime import datetime
@@ -674,7 +675,7 @@ class TestLargeCourseDeletions(MixedWithOptionsTestCase):
self._do_test_large_course_deletion(store, load_factor)
except: # pylint: disable=bare-except
# Catch any exception here to see when we fail
- print "Failed with load_factor of {}".format(load_factor)
+ print("Failed with load_factor of {}".format(load_factor))
@skip(("This test is to see how we handle very large courses, to ensure that the delete"
"procedure works smoothly - too long to run during the normal course of things"))
diff --git a/cms/djangoapps/contentstore/tests/test_import.py b/cms/djangoapps/contentstore/tests/test_import.py
index eeea1f9d4d..57c3415b12 100644
--- a/cms/djangoapps/contentstore/tests/test_import.py
+++ b/cms/djangoapps/contentstore/tests/test_import.py
@@ -3,6 +3,7 @@
"""
Tests for import_course_from_xml using the mongo modulestore.
"""
+from __future__ import print_function
import copy
from uuid import uuid4
@@ -119,7 +120,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
# make sure we have ONE asset in our contentstore ("should_be_imported.html")
all_assets, count = content_store.get_all_content_for_course(course.id)
- print "len(all_assets)=%d" % len(all_assets)
+ print("len(all_assets)=%d" % len(all_assets))
self.assertEqual(len(all_assets), 1)
self.assertEqual(count, 1)
@@ -133,7 +134,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
self.assertIsNotNone(content)
# make sure course.static_asset_path is correct
- print "static_asset_path = {0}".format(course.static_asset_path)
+ print("static_asset_path = {0}".format(course.static_asset_path))
self.assertEqual(course.static_asset_path, 'test_import_course')
def test_asset_import_nostatic(self):
@@ -172,7 +173,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
def test_tab_name_imports_correctly(self):
_module_store, _content_store, course = self.load_test_import_course()
- print "course tabs = {0}".format(course.tabs)
+ print("course tabs = {0}".format(course.tabs))
self.assertEqual(course.tabs[2]['name'], 'Syllabus')
def test_import_performance_mongo(self):
diff --git a/cms/djangoapps/contentstore/utils.py b/cms/djangoapps/contentstore/utils.py
index ac45a98629..0db09f8f2b 100644
--- a/cms/djangoapps/contentstore/utils.py
+++ b/cms/djangoapps/contentstore/utils.py
@@ -1,6 +1,7 @@
"""
Common utility functions useful throughout the contentstore
"""
+from __future__ import print_function
import logging
from datetime import datetime
@@ -93,7 +94,7 @@ def _remove_instructors(course_key):
"""
In the django layer, remove all the user/groups permissions associated with this course
"""
- print 'removing User permissions from course....'
+ print('removing User permissions from course....')
try:
remove_all_instructors(course_key)
diff --git a/common/djangoapps/student/models.py b/common/djangoapps/student/models.py
index 31a0542bc2..3cb5c21f2c 100644
--- a/common/djangoapps/student/models.py
+++ b/common/djangoapps/student/models.py
@@ -10,6 +10,7 @@ file and check it in at the same time as your model changes. To do that,
2. ./manage.py lms schemamigration student --auto description_of_your_change
3. Add the migration file created in edx-platform/common/djangoapps/student/migrations/
"""
+from __future__ import print_function
import hashlib
import json
import logging
@@ -2148,12 +2149,12 @@ def get_user(email):
def user_info(email):
user, u_prof = get_user(email)
- print "User id", user.id
- print "Username", user.username
- print "E-mail", user.email
- print "Name", u_prof.name
- print "Location", u_prof.location
- print "Language", u_prof.language
+ print("User id", user.id)
+ print("Username", user.username)
+ print("E-mail", user.email)
+ print("Name", u_prof.name)
+ print("Location", u_prof.location)
+ print("Language", u_prof.language)
return user, u_prof
@@ -2170,8 +2171,8 @@ def change_name(email, new_name):
def user_count():
- print "All users", User.objects.all().count()
- print "Active users", User.objects.filter(is_active=True).count()
+ print("All users", User.objects.all().count())
+ print("Active users", User.objects.filter(is_active=True).count())
return User.objects.all().count()
diff --git a/common/djangoapps/terrain/stubs/start.py b/common/djangoapps/terrain/stubs/start.py
index ca8b30b466..c76859fa4d 100644
--- a/common/djangoapps/terrain/stubs/start.py
+++ b/common/djangoapps/terrain/stubs/start.py
@@ -1,6 +1,7 @@
"""
Command-line utility to start a stub service.
"""
+from __future__ import print_function
import logging
import sys
import time
@@ -37,7 +38,7 @@ def get_args():
Exits with a message if arguments are invalid.
"""
if len(sys.argv) < 3:
- print USAGE
+ print(USAGE)
sys.exit(1)
service_name = sys.argv[1]
@@ -45,8 +46,8 @@ def get_args():
config_dict = _parse_config_args(sys.argv[3:])
if service_name not in SERVICES:
- print "Unrecognized service '{0}'. Valid choices are: {1}".format(
- service_name, ", ".join(SERVICES.keys()))
+ print("Unrecognized service '{0}'. Valid choices are: {1}".format(
+ service_name, ", ".join(SERVICES.keys())))
sys.exit(1)
try:
@@ -55,7 +56,7 @@ def get_args():
raise ValueError
except ValueError:
- print "Port '{0}' must be a positive integer".format(port_num)
+ print("Port '{0}' must be a positive integer".format(port_num))
sys.exit(1)
return service_name, port_num, config_dict
@@ -77,7 +78,7 @@ def _parse_config_args(args):
config_dict[components[0]] = "=".join(components[1:])
except:
- print "Warning: could not interpret config value '{0}'".format(config_str)
+ print("Warning: could not interpret config value '{0}'".format(config_str))
return config_dict
@@ -87,7 +88,7 @@ def main():
Start a server; shut down on keyboard interrupt signal.
"""
service_name, port_num, config_dict = get_args()
- print "Starting stub service '{0}' on port {1}...".format(service_name, port_num)
+ print("Starting stub service '{0}' on port {1}...".format(service_name, port_num))
server = SERVICES[service_name](port_num=port_num)
server.config.update(config_dict)
@@ -97,7 +98,7 @@ def main():
time.sleep(1)
except KeyboardInterrupt:
- print "Stopping stub service..."
+ print("Stopping stub service...")
finally:
server.shutdown()
diff --git a/common/djangoapps/xblock_django/management/commands/ensure_indexes.py b/common/djangoapps/xblock_django/management/commands/ensure_indexes.py
index 6a42454935..9c557fd010 100644
--- a/common/djangoapps/xblock_django/management/commands/ensure_indexes.py
+++ b/common/djangoapps/xblock_django/management/commands/ensure_indexes.py
@@ -1,6 +1,7 @@
"""
Creates Indexes on contentstore and modulestore databases.
"""
+from __future__ import print_function
from django.core.management.base import BaseCommand
from xmodule.contentstore.django import contentstore
@@ -17,4 +18,4 @@ class Command(BaseCommand):
def handle(self, *args, **options):
contentstore().ensure_indexes()
modulestore().ensure_indexes()
- print 'contentstore and modulestore indexes created!'
+ print('contentstore and modulestore indexes created!')
diff --git a/common/lib/capa/capa/checker.py b/common/lib/capa/capa/checker.py
index e0cd7c6950..c11aab4650 100755
--- a/common/lib/capa/capa/checker.py
+++ b/common/lib/capa/capa/checker.py
@@ -3,6 +3,7 @@
Commandline tool for doing operations on Problems
"""
from __future__ import unicode_literals
+from __future__ import print_function
import argparse
import logging
@@ -67,7 +68,7 @@ def main():
def command_show(problem):
"""Display the text for this problem"""
- print problem.get_html()
+ print(problem.get_html())
def command_test(problem):
diff --git a/common/lib/capa/capa/tests/test_shuffle.py b/common/lib/capa/capa/tests/test_shuffle.py
index 105f9940b8..563f2169ff 100644
--- a/common/lib/capa/capa/tests/test_shuffle.py
+++ b/common/lib/capa/capa/tests/test_shuffle.py
@@ -1,4 +1,5 @@
"""Tests the capa shuffle and name-masking."""
+from __future__ import print_function
import unittest
import textwrap
@@ -276,7 +277,7 @@ class CapaShuffleTest(unittest.TestCase):
orig_html = problem.get_html()
self.assertEqual(orig_html, problem.get_html(), 'should be able to call get_html() twice')
html = orig_html.replace('\n', ' ') # avoid headaches with .* matching
- print html
+ print(html)
self.assertRegexpMatches(html, r"
.*\[.*'Banana'.*'Apple'.*'Chocolate'.*'Donut'.*\].*
.*" +
r".*\[.*'C'.*'A'.*'D'.*'B'.*\].*
")
# Look at the responses in their authored order
diff --git a/common/lib/chem/chem/tests.py b/common/lib/chem/chem/tests.py
index 7625095aa9..2ed646aea9 100644
--- a/common/lib/chem/chem/tests.py
+++ b/common/lib/chem/chem/tests.py
@@ -1,3 +1,4 @@
+from __future__ import print_function
import codecs
import unittest
from fractions import Fraction
@@ -12,7 +13,7 @@ LOCAL_DEBUG = None
def log(msg, output_type=None):
"""Logging function for tests"""
if LOCAL_DEBUG:
- print msg
+ print(msg)
if output_type == 'html':
f.write(msg + '\n
\n')
diff --git a/common/lib/sandbox-packages/eia.py b/common/lib/sandbox-packages/eia.py
index 53c3f200ff..45f6ea32a5 100644
--- a/common/lib/sandbox-packages/eia.py
+++ b/common/lib/sandbox-packages/eia.py
@@ -7,6 +7,7 @@ values in parameterized problems. For details, see:
http://en.wikipedia.org/wiki/Electronic_color_code
"""
+from __future__ import print_function
# pylint: disable=invalid-name
# r is standard name for a resistor. We would like to use it as such.
@@ -91,21 +92,21 @@ def iseia(r, valid_types=(E6, E12, E24)):
if __name__ == '__main__':
# Test cases. All of these should return True
- print iseia(100) # 100 ohm resistor is EIA
- print not iseia(101) # 101 is not
- print not iseia(100.3) # Floating point close to EIA is not EIA
- print iseia(100.001) # But within floating point error is
- print iseia(1e5) # We handle big numbers well
- print iseia(2200) # We handle middle-of-the-list well
+ print(iseia(100)) # 100 ohm resistor is EIA
+ print(not iseia(101)) # 101 is not
+ print(not iseia(100.3)) # Floating point close to EIA is not EIA
+ print(iseia(100.001)) # But within floating point error is
+ print(iseia(1e5)) # We handle big numbers well
+ print(iseia(2200)) # We handle middle-of-the-list well
# We can handle 1% components correctly; 2.2k is EIA24, but not EIA48.
- print not iseia(2200, (E48, E96, E192))
- print iseia(5490e2, (E48, E96, E192))
- print iseia(2200)
- print not iseia(5490e2)
- print iseia(1e-5) # We handle little numbers well
- print not iseia("Hello") # Junk handled okay
- print not iseia(float('NaN'))
- print not iseia(-1)
- print not iseia(iseia)
- print not iseia(float('Inf'))
- print iseia(0) # Corner case. 0 is a standard resistor value.
+ print(not iseia(2200, (E48, E96, E192)))
+ print(iseia(5490e2, (E48, E96, E192)))
+ print(iseia(2200))
+ print(not iseia(5490e2))
+ print(iseia(1e-5)) # We handle little numbers well
+ print(not iseia("Hello")) # Junk handled okay
+ print(not iseia(float('NaN')))
+ print(not iseia(-1))
+ print(not iseia(iseia))
+ print(not iseia(float('Inf')))
+ print(iseia(0)) # Corner case. 0 is a standard resistor value.
diff --git a/common/lib/xmodule/xmodule/contentstore/utils.py b/common/lib/xmodule/xmodule/contentstore/utils.py
index c9873e3bc2..91beefbee4 100644
--- a/common/lib/xmodule/xmodule/contentstore/utils.py
+++ b/common/lib/xmodule/xmodule/contentstore/utils.py
@@ -1,3 +1,4 @@
+from __future__ import print_function
from xmodule.contentstore.content import StaticContent
from .django import contentstore
@@ -12,13 +13,13 @@ def empty_asset_trashcan(course_locs):
# first delete all of the thumbnails
thumbs = store.get_all_content_thumbnails_for_course(course_loc)
for thumb in thumbs:
- print "Deleting {0}...".format(thumb)
+ print("Deleting {0}...".format(thumb))
store.delete(thumb['_id'])
# then delete all of the assets
assets, __ = store.get_all_content_for_course(course_loc)
for asset in assets:
- print "Deleting {0}...".format(asset)
+ print("Deleting {0}...".format(asset))
store.delete(asset['_id'])
diff --git a/common/lib/xmodule/xmodule/modulestore/perf_tests/generate_asset_xml.py b/common/lib/xmodule/xmodule/modulestore/perf_tests/generate_asset_xml.py
index 2bf4901dd8..21000f90b1 100644
--- a/common/lib/xmodule/xmodule/modulestore/perf_tests/generate_asset_xml.py
+++ b/common/lib/xmodule/xmodule/modulestore/perf_tests/generate_asset_xml.py
@@ -4,6 +4,7 @@
"""
Generates fake XML for asset metadata.
"""
+from __future__ import print_function
import random
from lxml import etree
@@ -233,4 +234,4 @@ if __name__ == '__main__':
if click is not None:
cli() # pylint: disable=no-value-for-parameter
else:
- print "Aborted! Module 'click' is not installed."
+ print("Aborted! Module 'click' is not installed.")
diff --git a/common/lib/xmodule/xmodule/modulestore/perf_tests/generate_report.py b/common/lib/xmodule/xmodule/modulestore/perf_tests/generate_report.py
index 8e35fee7ec..5b01e11e14 100644
--- a/common/lib/xmodule/xmodule/modulestore/perf_tests/generate_report.py
+++ b/common/lib/xmodule/xmodule/modulestore/perf_tests/generate_report.py
@@ -4,6 +4,7 @@ Reads the data generated by performance tests and generates a savable
report which can be viewed over time to examine the performance effects of code changes on
various parts of the system.
"""
+from __future__ import print_function
import sqlite3
from lxml.builder import E
@@ -286,4 +287,4 @@ if __name__ == '__main__':
if click is not None:
cli() # pylint: disable=no-value-for-parameter
else:
- print "Aborted! Module 'click' is not installed."
+ print("Aborted! Module 'click' is not installed.")
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/factories.py b/common/lib/xmodule/xmodule/modulestore/tests/factories.py
index 91baf0dcec..0e757e575e 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/factories.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/factories.py
@@ -1,6 +1,7 @@
"""
Factories for use in tests of XBlocks.
"""
+from __future__ import print_function
import datetime
import functools
@@ -584,7 +585,7 @@ def check_sum_of_calls(object_, methods, maximum_calls, minimum_calls=1, include
messages.append(" args: {}\n".format(args))
messages.append(" kwargs: {}\n\n".format(dict(kwargs)))
- print "".join(messages)
+ print("".join(messages))
# verify the counter actually worked by ensuring we have counted greater than (or equal to) the minimum calls
assert call_count >= minimum_calls
diff --git a/common/lib/xmodule/xmodule/modulestore/xml_importer.py b/common/lib/xmodule/xmodule/modulestore/xml_importer.py
index 27b05776ce..34d021bbd3 100644
--- a/common/lib/xmodule/xmodule/modulestore/xml_importer.py
+++ b/common/lib/xmodule/xmodule/modulestore/xml_importer.py
@@ -20,6 +20,7 @@ Modulestore virtual | XML physical (draft, published)
(a, a) | (a, a) | (x, a) | (x, x) | (x, y) | (a, x)
(a, b) | (a, b) | (x, b) | (x, x) | (x, y) | (a, x)
"""
+from __future__ import print_function
import json
import logging
import mimetypes
@@ -1177,7 +1178,7 @@ def perform_xlint(
for err_log in module_store.errored_courses.itervalues():
for err_log_entry in err_log.errors:
msg = err_log_entry[0]
- print msg
+ print(msg)
if msg.startswith('ERROR:'):
err_cnt += 1
else:
@@ -1220,12 +1221,12 @@ def perform_xlint(
)
warn_cnt += 1
- print "\n"
- print "------------------------------------------"
- print "VALIDATION SUMMARY: {err} Errors {warn} Warnings".format(
+ print("\n")
+ print("------------------------------------------")
+ print("VALIDATION SUMMARY: {err} Errors {warn} Warnings".format(
err=err_cnt,
warn=warn_cnt
- )
+ ))
if err_cnt > 0:
print(
@@ -1239,7 +1240,7 @@ def perform_xlint(
"your courseware before importing"
)
else:
- print "This course can be imported successfully."
+ print("This course can be imported successfully.")
return err_cnt
diff --git a/common/lib/xmodule/xmodule/tests/test_conditional.py b/common/lib/xmodule/xmodule/tests/test_conditional.py
index 7653486207..720303543c 100644
--- a/common/lib/xmodule/xmodule/tests/test_conditional.py
+++ b/common/lib/xmodule/xmodule/tests/test_conditional.py
@@ -1,3 +1,4 @@
+from __future__ import print_function
import json
import unittest
@@ -178,7 +179,7 @@ class ConditionalModuleBasicTest(unittest.TestCase):
modules['cond_module'].save()
modules['source_module'].is_attempted = "false"
ajax = json.loads(modules['cond_module'].handle_ajax('', ''))
- print "ajax: ", ajax
+ print("ajax: ", ajax)
fragments = ajax['fragments']
self.assertFalse(any(['This is a secret' in item['content'] for item in fragments]))
@@ -186,7 +187,7 @@ class ConditionalModuleBasicTest(unittest.TestCase):
modules['source_module'].is_attempted = "true"
ajax = json.loads(modules['cond_module'].handle_ajax('', ''))
modules['cond_module'].save()
- print "post-attempt ajax: ", ajax
+ print("post-attempt ajax: ", ajax)
fragments = ajax['fragments']
self.assertTrue(any(['This is a secret' in item['content'] for item in fragments]))
@@ -232,7 +233,7 @@ class ConditionalModuleXmlTest(unittest.TestCase):
def get_course(self, name):
"""Get a test course by directory name. If there's more than one, error."""
- print "Importing {0}".format(name)
+ print("Importing {0}".format(name))
modulestore = XMLModuleStore(DATA_DIR, source_dirs=[name])
courses = modulestore.get_courses()
@@ -243,11 +244,11 @@ class ConditionalModuleXmlTest(unittest.TestCase):
def test_conditional_module(self):
"""Make sure that conditional module works"""
- print "Starting import"
+ print("Starting import")
course = self.get_course('conditional_and_poll')
- print "Course: ", course
- print "id: ", course.id
+ print("Course: ", course)
+ print("id: ", course.id)
def inner_get_module(descriptor):
if isinstance(descriptor, BlockUsageLocator):
@@ -269,13 +270,13 @@ class ConditionalModuleXmlTest(unittest.TestCase):
self.test_system.get_module = inner_get_module
module = inner_get_module(location)
- print "module: ", module
- print "module children: ", module.get_children()
- print "module display items (children): ", module.get_display_items()
+ print("module: ", module)
+ print("module children: ", module.get_children())
+ print("module display items (children): ", module.get_display_items())
html = module.render(STUDENT_VIEW).content
- print "html type: ", type(html)
- print "html: ", html
+ print("html type: ", type(html))
+ print("html: ", html)
html_expect = module.xmodule_runtime.render_template(
'conditional_ajax.html',
{
@@ -288,11 +289,11 @@ class ConditionalModuleXmlTest(unittest.TestCase):
self.assertEqual(html, html_expect)
gdi = module.get_display_items()
- print "gdi=", gdi
+ print("gdi=", gdi)
ajax = json.loads(module.handle_ajax('', ''))
module.save()
- print "ajax: ", ajax
+ print("ajax: ", ajax)
fragments = ajax['fragments']
self.assertFalse(any(['This is a secret' in item['content'] for item in fragments]))
@@ -304,7 +305,7 @@ class ConditionalModuleXmlTest(unittest.TestCase):
ajax = json.loads(module.handle_ajax('', ''))
module.save()
- print "post-attempt ajax: ", ajax
+ print("post-attempt ajax: ", ajax)
fragments = ajax['fragments']
self.assertTrue(any(['This is a secret' in item['content'] for item in fragments]))
diff --git a/common/lib/xmodule/xmodule/tests/test_course_module.py b/common/lib/xmodule/xmodule/tests/test_course_module.py
index eb00aa57e5..e3fa425666 100644
--- a/common/lib/xmodule/xmodule/tests/test_course_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_course_module.py
@@ -1,4 +1,5 @@
"""Tests the course modules and their functions"""
+from __future__ import print_function
import ddt
import unittest
from datetime import datetime, timedelta
@@ -214,7 +215,7 @@ class IsNewCourseTestCase(unittest.TestCase):
for a, b, assertion in dates:
a_score = get_dummy_course(start=a[0], announcement=a[1], advertised_start=a[2]).sorting_score
b_score = get_dummy_course(start=b[0], announcement=b[1], advertised_start=b[2]).sorting_score
- print "Comparing %s to %s" % (a, b)
+ print("Comparing %s to %s" % (a, b))
assertion(a_score, b_score)
start_advertised_settings = [
diff --git a/common/lib/xmodule/xmodule/tests/test_export.py b/common/lib/xmodule/xmodule/tests/test_export.py
index ae9bfed105..399d535eaa 100644
--- a/common/lib/xmodule/xmodule/tests/test_export.py
+++ b/common/lib/xmodule/xmodule/tests/test_export.py
@@ -2,6 +2,7 @@
"""
Tests of XML export
"""
+from __future__ import print_function
import ddt
import lxml.etree
@@ -33,7 +34,7 @@ def strip_filenames(descriptor):
"""
Recursively strips 'filename' from all children's definitions.
"""
- print "strip filename from {desc}".format(desc=text_type(descriptor.location))
+ print("strip filename from {desc}".format(desc=text_type(descriptor.location)))
if descriptor._field_data.has(descriptor, 'filename'):
descriptor._field_data.delete(descriptor, 'filename')
@@ -95,12 +96,12 @@ class RoundTripTestCase(unittest.TestCase):
""").strip()
root_dir = path(self.temp_dir)
- print "Copying test course to temp dir {0}".format(root_dir)
+ print("Copying test course to temp dir {0}".format(root_dir))
data_dir = path(DATA_DIR)
shutil.copytree(data_dir / course_dir, root_dir / course_dir)
- print "Starting import"
+ print("Starting import")
initial_import = XMLModuleStore(root_dir, source_dirs=[course_dir], xblock_mixins=(XModuleMixin,))
courses = initial_import.get_courses()
@@ -109,7 +110,7 @@ class RoundTripTestCase(unittest.TestCase):
# export to the same directory--that way things like the custom_tags/ folder
# will still be there.
- print "Starting export"
+ print("Starting export")
file_system = OSFS(root_dir)
initial_course.runtime.export_fs = file_system.makedir(course_dir, recreate=True)
root = lxml.etree.Element('root')
@@ -118,14 +119,14 @@ class RoundTripTestCase(unittest.TestCase):
with initial_course.runtime.export_fs.open('course.xml', 'wb') as course_xml:
lxml.etree.ElementTree(root).write(course_xml, encoding='utf-8')
- print "Starting second import"
+ print("Starting second import")
second_import = XMLModuleStore(root_dir, source_dirs=[course_dir], xblock_mixins=(XModuleMixin,))
courses2 = second_import.get_courses()
self.assertEquals(len(courses2), 1)
exported_course = courses2[0]
- print "Checking course equality"
+ print("Checking course equality")
# HACK: filenames change when changing file formats
# during imports from old-style courses. Ignore them.
@@ -136,15 +137,15 @@ class RoundTripTestCase(unittest.TestCase):
self.assertEquals(initial_course.id, exported_course.id)
course_id = initial_course.id
- print "Checking key equality"
+ print("Checking key equality")
self.assertItemsEqual(
initial_import.modules[course_id].keys(),
second_import.modules[course_id].keys()
)
- print "Checking module equality"
+ print("Checking module equality")
for location in initial_import.modules[course_id].keys():
- print("Checking", location)
+ print(("Checking", location))
self.assertTrue(blocks_are_equivalent(
initial_import.modules[course_id][location],
second_import.modules[course_id][location]
diff --git a/common/lib/xmodule/xmodule/tests/test_import.py b/common/lib/xmodule/xmodule/tests/test_import.py
index dc5a4ea36e..d2ee7ad077 100644
--- a/common/lib/xmodule/xmodule/tests/test_import.py
+++ b/common/lib/xmodule/xmodule/tests/test_import.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
+from __future__ import print_function
import datetime
from tempfile import mkdtemp
@@ -73,7 +74,7 @@ class BaseCourseTestCase(TestCase):
def get_course(self, name):
"""Get a test course by directory name. If there's more than one, error."""
- print "Importing {0}".format(name)
+ print("Importing {0}".format(name))
modulestore = XMLModuleStore(
DATA_DIR,
@@ -203,7 +204,7 @@ class ImportTestCase(BaseCourseTestCase):
Checks to make sure that metadata inheritance on a course descriptor is respected.
"""
# pylint: disable=protected-access
- print(descriptor, descriptor._field_data)
+ print((descriptor, descriptor._field_data))
self.assertEqual(descriptor.due, ImportTestCase.date.from_json(from_date_string))
# Check that the child inherits due correctly
@@ -222,7 +223,7 @@ class ImportTestCase(BaseCourseTestCase):
descriptor.add_xml_to_node(node)
# Check that the exported xml is just a pointer
- print("Exported xml:", etree.tostring(node))
+ print(("Exported xml:", etree.tostring(node)))
self.assertTrue(is_pointer_tag(node))
# but it's a special case course pointer
self.assertEqual(node.attrib['course'], COURSE)
@@ -441,22 +442,22 @@ class ImportTestCase(BaseCourseTestCase):
"""]
for xml_str in yes:
- print "should be True for {0}".format(xml_str)
+ print("should be True for {0}".format(xml_str))
self.assertTrue(is_pointer_tag(etree.fromstring(xml_str)))
for xml_str in no:
- print "should be False for {0}".format(xml_str)
+ print("should be False for {0}".format(xml_str))
self.assertFalse(is_pointer_tag(etree.fromstring(xml_str)))
def test_metadata_inherit(self):
"""Make sure that metadata is inherited properly"""
- print "Starting import"
+ print("Starting import")
course = self.get_course('toy')
def check_for_key(key, node, value):
"recursive check for presence of key"
- print "Checking {0}".format(text_type(node.location))
+ print("Checking {0}".format(text_type(node.location)))
self.assertEqual(getattr(node, key), value)
for c in node.get_children():
check_for_key(key, c, value)
@@ -525,17 +526,17 @@ class ImportTestCase(BaseCourseTestCase):
def test_colon_in_url_name(self):
"""Ensure that colons in url_names convert to file paths properly"""
- print "Starting import"
+ print("Starting import")
# Not using get_courses because we need the modulestore object too afterward
modulestore = XMLModuleStore(DATA_DIR, source_dirs=['toy'])
courses = modulestore.get_courses()
self.assertEquals(len(courses), 1)
course = courses[0]
- print "course errors:"
+ print("course errors:")
for (msg, err) in modulestore.get_course_errors(course.id):
- print msg
- print err
+ print(msg)
+ print(err)
chapters = course.get_children()
self.assertEquals(len(chapters), 5)
@@ -543,12 +544,12 @@ class ImportTestCase(BaseCourseTestCase):
ch2 = chapters[1]
self.assertEquals(ch2.url_name, "secret:magic")
- print "Ch2 location: ", ch2.location
+ print("Ch2 location: ", ch2.location)
also_ch2 = modulestore.get_item(ch2.location)
self.assertEquals(ch2, also_ch2)
- print "making sure html loaded"
+ print("making sure html loaded")
loc = course.id.make_usage_key('html', 'secret:toylab')
html = modulestore.get_item(loc)
self.assertEquals(html.display_name, "Toy lab")
@@ -560,13 +561,13 @@ class ImportTestCase(BaseCourseTestCase):
loaded because of unicode filenames, there are appropriate
exceptions/errors to that effect."""
- print "Starting import"
+ print("Starting import")
modulestore = XMLModuleStore(DATA_DIR, source_dirs=['test_unicode'])
courses = modulestore.get_courses()
self.assertEquals(len(courses), 1)
course = courses[0]
- print "course errors:"
+ print("course errors:")
# Expect to find an error/exception about characters in "®esources"
expect = "InvalidKeyError"
@@ -602,7 +603,7 @@ class ImportTestCase(BaseCourseTestCase):
for i in (2, 3):
video = sections[i]
# Name should be 'video_{hash}'
- print "video {0} url_name: {1}".format(i, video.url_name)
+ print("video {0} url_name: {1}".format(i, video.url_name))
self.assertEqual(len(video.url_name), len('video_') + 12)
def test_poll_and_conditional_import(self):
diff --git a/common/lib/xmodule/xmodule/tests/test_stringify.py b/common/lib/xmodule/xmodule/tests/test_stringify.py
index 371dccd25a..8e41d14f95 100644
--- a/common/lib/xmodule/xmodule/tests/test_stringify.py
+++ b/common/lib/xmodule/xmodule/tests/test_stringify.py
@@ -1,6 +1,7 @@
"""
Tests stringify functions used in xmodule html
"""
+from __future__ import print_function
from lxml import etree
from openedx.core.lib.tests import attr
from xmodule.stringify import stringify_children
@@ -38,8 +39,8 @@ def test_stringify_again():
xml = etree.fromstring(html)
out = stringify_children(xml)
- print "output:"
- print out
+ print("output:")
+ print(out)
# Tracking strange content repeating bug
# Should appear once
diff --git a/lms/djangoapps/bulk_email/tests/test_tasks.py b/lms/djangoapps/bulk_email/tests/test_tasks.py
index 4e769520e7..cd658d39d3 100644
--- a/lms/djangoapps/bulk_email/tests/test_tasks.py
+++ b/lms/djangoapps/bulk_email/tests/test_tasks.py
@@ -6,6 +6,7 @@ Runs tasks on answers to course problems to validate that code
paths actually work.
"""
+from __future__ import print_function
import json
from itertools import chain, cycle, repeat
from smtplib import SMTPAuthenticationError, SMTPConnectError, SMTPDataError, SMTPServerDisconnected
@@ -152,7 +153,7 @@ class TestBulkEmailInstructorTask(InstructorTaskCourseTestCase):
self.assertEquals(len(task_id_list), 1)
task_id = task_id_list[0]
subtask_status = subtask_status_info.get(task_id)
- print "Testing subtask status: {}".format(subtask_status)
+ print("Testing subtask status: {}".format(subtask_status))
self.assertEquals(subtask_status.get('task_id'), task_id)
self.assertEquals(subtask_status.get('attempted'), succeeded + failed)
self.assertEquals(subtask_status.get('succeeded'), succeeded)
diff --git a/lms/djangoapps/certificates/management/commands/gen_cert_report.py b/lms/djangoapps/certificates/management/commands/gen_cert_report.py
index a06c66c1f7..c0afd645f1 100644
--- a/lms/djangoapps/certificates/management/commands/gen_cert_report.py
+++ b/lms/djangoapps/certificates/management/commands/gen_cert_report.py
@@ -1,6 +1,7 @@
"""
Generate a report of certificate statuses
"""
+from __future__ import print_function
from django.contrib.auth.models import User
from django.core.management.base import BaseCommand, CommandError
@@ -56,7 +57,7 @@ class Command(BaseCommand):
# find students who are active
# number of enrolled students = downloadable + notpassing
- print "Looking up certificate states for {0}".format(options['course'])
+ print("Looking up certificate states for {0}".format(options['course']))
enrolled_current = User.objects.filter(
courseenrollment__course_id=course_id,
courseenrollment__is_active=True
@@ -113,14 +114,14 @@ class Command(BaseCommand):
)
# print the heading for the report
- print "{:>26}".format("course ID"),
- print ' '.join(["{:>16}".format(heading) for heading in status_headings])
+ print("{:>26}".format("course ID"), end=' ')
+ print(' '.join(["{:>16}".format(heading) for heading in status_headings]))
# print the report
- print "{0:>26}".format(text_type(course_id)),
+ print("{0:>26}".format(text_type(course_id)), end=' ')
for heading in status_headings:
if heading in cert_data[course_id]:
- print "{:>16}".format(cert_data[course_id][heading]),
+ print("{:>16}".format(cert_data[course_id][heading]), end=' ')
else:
- print " " * 16,
- print
+ print(" " * 16, end=' ')
+ print()
diff --git a/lms/djangoapps/discussion/views.py b/lms/djangoapps/discussion/views.py
index d7b190d46a..c51c9552b3 100644
--- a/lms/djangoapps/discussion/views.py
+++ b/lms/djangoapps/discussion/views.py
@@ -1,6 +1,7 @@
"""
Views handling read (GET) requests for the Discussion tab and inline discussions.
"""
+from __future__ import print_function
import logging
from functools import wraps
@@ -633,8 +634,8 @@ def followed_threads(request, course_key, user_id):
query_params['group_id'] = group_id
paginated_results = profiled_user.subscribed_threads(query_params)
- print "\n \n \n paginated results \n \n \n "
- print paginated_results
+ print("\n \n \n paginated results \n \n \n ")
+ print(paginated_results)
query_params['page'] = paginated_results.page
query_params['num_pages'] = paginated_results.num_pages
user_info = cc.User.from_django_user(request.user).to_dict()
diff --git a/lms/djangoapps/django_comment_client/base/views.py b/lms/djangoapps/django_comment_client/base/views.py
index 568ece7c3d..c05825e9aa 100644
--- a/lms/djangoapps/django_comment_client/base/views.py
+++ b/lms/djangoapps/django_comment_client/base/views.py
@@ -1,3 +1,4 @@
+from __future__ import print_function
import functools
import json
import logging
@@ -769,7 +770,7 @@ def upload(request, course_id): # ajax upload file to a question or answer
except exceptions.PermissionDenied, err:
error = unicode(err)
except Exception, err:
- print err
+ print(err)
logging.critical(unicode(err))
error = _('Error uploading file. Please contact the site administrator. Thank you.')
diff --git a/lms/djangoapps/instructor/tests/test_api.py b/lms/djangoapps/instructor/tests/test_api.py
index 870e9e3ac3..d43a3ca5fb 100644
--- a/lms/djangoapps/instructor/tests/test_api.py
+++ b/lms/djangoapps/instructor/tests/test_api.py
@@ -2,6 +2,7 @@
"""
Unit tests for instructor.api methods.
"""
+from __future__ import print_function
import datetime
import functools
import io
@@ -1220,7 +1221,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
url = reverse('students_update_enrollment', kwargs={'course_id': text_type(self.course.id)})
response = self.client.post(url, {'identifiers': self.notenrolled_student.email, 'action': 'enroll',
'email_students': False})
- print "type(self.notenrolled_student.email): {}".format(type(self.notenrolled_student.email))
+ print("type(self.notenrolled_student.email): {}".format(type(self.notenrolled_student.email)))
self.assertEqual(response.status_code, 200)
# test that the user is now enrolled
@@ -1266,7 +1267,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
environ = {'wsgi.url_scheme': protocol}
response = self.client.post(url, params, **environ)
- print "type(self.notenrolled_student.email): {}".format(type(self.notenrolled_student.email))
+ print("type(self.notenrolled_student.email): {}".format(type(self.notenrolled_student.email)))
self.assertEqual(response.status_code, 200)
# test that the user is now enrolled
@@ -1419,7 +1420,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
'auto_enroll': True}
environ = {'wsgi.url_scheme': protocol}
response = self.client.post(url, params, **environ)
- print "type(self.notregistered_email): {}".format(type(self.notregistered_email))
+ print("type(self.notregistered_email): {}".format(type(self.notregistered_email)))
self.assertEqual(response.status_code, 200)
# Check the outbox
@@ -1467,7 +1468,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
url = reverse('students_update_enrollment', kwargs={'course_id': text_type(self.course.id)})
response = self.client.post(url, {'identifiers': self.enrolled_student.email, 'action': 'unenroll',
'email_students': False})
- print "type(self.enrolled_student.email): {}".format(type(self.enrolled_student.email))
+ print("type(self.enrolled_student.email): {}".format(type(self.enrolled_student.email)))
self.assertEqual(response.status_code, 200)
# test that the user is now unenrolled
@@ -1510,7 +1511,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
url = reverse('students_update_enrollment', kwargs={'course_id': text_type(self.course.id)})
response = self.client.post(url, {'identifiers': self.enrolled_student.email, 'action': 'unenroll',
'email_students': True})
- print "type(self.enrolled_student.email): {}".format(type(self.enrolled_student.email))
+ print("type(self.enrolled_student.email): {}".format(type(self.enrolled_student.email)))
self.assertEqual(response.status_code, 200)
# test that the user is now unenrolled
@@ -1571,7 +1572,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
url = reverse('students_update_enrollment', kwargs={'course_id': text_type(self.course.id)})
response = self.client.post(url,
{'identifiers': self.allowed_email, 'action': 'unenroll', 'email_students': True})
- print "type(self.allowed_email): {}".format(type(self.allowed_email))
+ print("type(self.allowed_email): {}".format(type(self.allowed_email)))
self.assertEqual(response.status_code, 200)
# test the response data
@@ -1696,7 +1697,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
'auto_enroll': True}
environ = {'wsgi.url_scheme': protocol}
response = self.client.post(url, params, **environ)
- print "type(self.notregistered_email): {}".format(type(self.notregistered_email))
+ print("type(self.notregistered_email): {}".format(type(self.notregistered_email)))
self.assertEqual(response.status_code, 200)
# Check the outbox
diff --git a/lms/djangoapps/instructor/tests/test_enrollment.py b/lms/djangoapps/instructor/tests/test_enrollment.py
index c505e26127..d56303e6c7 100644
--- a/lms/djangoapps/instructor/tests/test_enrollment.py
+++ b/lms/djangoapps/instructor/tests/test_enrollment.py
@@ -2,6 +2,7 @@
"""
Unit tests for instructor.enrollment methods.
"""
+from __future__ import print_function
import json
from abc import ABCMeta
@@ -92,17 +93,17 @@ class TestEnrollmentChangeBase(CacheIsolationTestCase):
`email` is an email string
"""
# initialize & check before
- print "checking initialization..."
+ print("checking initialization...")
eobjs = before_ideal.create_user(self.course_key)
before = EmailEnrollmentState(self.course_key, eobjs.email)
self.assertEqual(before, before_ideal)
# do action
- print "running action..."
+ print("running action...")
action(eobjs.email)
# check after
- print "checking effects..."
+ print("checking effects...")
after = EmailEnrollmentState(self.course_key, eobjs.email)
self.assertEqual(after, after_ideal)
diff --git a/lms/djangoapps/instructor_analytics/tests/test_distributions.py b/lms/djangoapps/instructor_analytics/tests/test_distributions.py
index ca2f0d0c7e..e0cc777b4c 100644
--- a/lms/djangoapps/instructor_analytics/tests/test_distributions.py
+++ b/lms/djangoapps/instructor_analytics/tests/test_distributions.py
@@ -1,4 +1,5 @@
""" Tests for analytics.distributions """
+from __future__ import print_function
import pytest
from django.test import TestCase
@@ -45,7 +46,7 @@ class TestAnalyticsDistributions(TestCase):
feature = 'year_of_birth'
self.assertIn(feature, AVAILABLE_PROFILE_FEATURES)
distribution = profile_distribution(self.course_id, feature)
- print distribution
+ print(distribution)
self.assertEqual(distribution.type, 'OPEN_CHOICE')
self.assertTrue(hasattr(distribution, 'choices_display_names'))
self.assertEqual(distribution.choices_display_names, None)
@@ -99,7 +100,7 @@ class TestAnalyticsDistributionsNoData(TestCase):
feature = 'gender'
self.assertIn(feature, AVAILABLE_PROFILE_FEATURES)
distribution = profile_distribution(self.course_id, feature)
- print distribution
+ print(distribution)
self.assertEqual(distribution.type, 'EASY_CHOICE')
self.assertTrue(hasattr(distribution, 'choices_display_names'))
self.assertNotEqual(distribution.choices_display_names, None)
@@ -110,7 +111,7 @@ class TestAnalyticsDistributionsNoData(TestCase):
feature = 'year_of_birth'
self.assertIn(feature, AVAILABLE_PROFILE_FEATURES)
distribution = profile_distribution(self.course_id, feature)
- print distribution
+ print(distribution)
self.assertEqual(distribution.type, 'OPEN_CHOICE')
self.assertTrue(hasattr(distribution, 'choices_display_names'))
self.assertEqual(distribution.choices_display_names, None)
diff --git a/lms/djangoapps/rss_proxy/tests/test_views.py b/lms/djangoapps/rss_proxy/tests/test_views.py
index 2d89dccb0f..2b99d70158 100644
--- a/lms/djangoapps/rss_proxy/tests/test_views.py
+++ b/lms/djangoapps/rss_proxy/tests/test_views.py
@@ -1,6 +1,7 @@
"""
Tests for the rss_proxy views
"""
+from __future__ import print_function
from django.urls import reverse
from django.test import TestCase
from mock import Mock, patch
@@ -56,9 +57,9 @@ class RssProxyViewTests(TestCase):
"""
mock_requests_get.return_value = Mock(status_code=404)
resp = self.client.get('%s?url=%s' % (reverse('rss_proxy:proxy'), self.whitelisted_url2))
- print resp.status_code
- print resp.content
- print resp['Content-Type']
+ print(resp.status_code)
+ print(resp.content)
+ print(resp['Content-Type'])
self.assertEqual(resp.status_code, 404)
self.assertEqual(resp['Content-Type'], 'application/xml')
self.assertEqual(resp.content, '')
diff --git a/lms/djangoapps/rss_proxy/views.py b/lms/djangoapps/rss_proxy/views.py
index 15c86988ed..15a2a54dd9 100644
--- a/lms/djangoapps/rss_proxy/views.py
+++ b/lms/djangoapps/rss_proxy/views.py
@@ -1,6 +1,7 @@
"""
Views for the rss_proxy djangoapp.
"""
+from __future__ import print_function
import requests
from django.conf import settings
from django.core.cache import cache
@@ -22,8 +23,8 @@ def proxy(request):
cache_key = CACHE_KEY_RSS.format(url=url)
status_code = 200
rss = cache.get(cache_key, '')
- print cache_key
- print 'Cached rss: %s' % rss
+ print(cache_key)
+ print('Cached rss: %s' % rss)
if not rss:
# Go get the RSS from the URL if it was not cached
resp = requests.get(url)
diff --git a/lms/djangoapps/shoppingcart/management/commands/retire_order.py b/lms/djangoapps/shoppingcart/management/commands/retire_order.py
index 495809bd5f..2113aad885 100644
--- a/lms/djangoapps/shoppingcart/management/commands/retire_order.py
+++ b/lms/djangoapps/shoppingcart/management/commands/retire_order.py
@@ -2,6 +2,7 @@
Script for retiring order that went through cybersource but weren't
marked as "purchased" in the db
"""
+from __future__ import print_function
from django.core.management.base import BaseCommand
from six import text_type
@@ -36,12 +37,12 @@ class Command(BaseCommand):
try:
order.retire()
except (UnexpectedOrderItemStatus, InvalidStatusToRetire) as err:
- print "Did not retire order {order}: {message}".format(
+ print("Did not retire order {order}: {message}".format(
order=order.id, message=text_type(err)
- )
+ ))
else:
- print "retired order {order_id} from status {old_status} to status {new_status}".format(
+ print("retired order {order_id} from status {old_status} to status {new_status}".format(
order_id=order.id,
old_status=old_status,
new_status=order.status,
- )
+ ))
diff --git a/lms/djangoapps/verify_student/management/commands/retry_failed_photo_verifications.py b/lms/djangoapps/verify_student/management/commands/retry_failed_photo_verifications.py
index c28c4e327d..a100a5cf33 100644
--- a/lms/djangoapps/verify_student/management/commands/retry_failed_photo_verifications.py
+++ b/lms/djangoapps/verify_student/management/commands/retry_failed_photo_verifications.py
@@ -1,6 +1,7 @@
"""
Django admin commands related to verify_student
"""
+from __future__ import print_function
from django.core.management.base import BaseCommand
@@ -29,14 +30,14 @@ class Command(BaseCommand):
attempts_to_retry = SoftwareSecurePhotoVerification.objects.filter(status='must_retry')
force_must_retry = False
- print "Attempting to retry {0} failed PhotoVerification submissions".format(len(attempts_to_retry))
+ print("Attempting to retry {0} failed PhotoVerification submissions".format(len(attempts_to_retry)))
for index, attempt in enumerate(attempts_to_retry):
- print "Retrying submission #{0} (ID: {1}, User: {2})".format(index, attempt.id, attempt.user)
+ print("Retrying submission #{0} (ID: {1}, User: {2})".format(index, attempt.id, attempt.user))
# Set the attempts status to 'must_retry' so that we can re-submit it
if force_must_retry:
attempt.status = 'must_retry'
attempt.submit(copy_id_photo_from=attempt.copy_id_photo_from)
- print "Retry result: {0}".format(attempt.status)
- print "Done resubmitting failed photo verifications"
+ print("Retry result: {0}".format(attempt.status))
+ print("Done resubmitting failed photo verifications")
diff --git a/openedx/core/djangoapps/credentials/management/commands/tests/test_notify_credentials.py b/openedx/core/djangoapps/credentials/management/commands/tests/test_notify_credentials.py
index bda2ea290d..3941042600 100644
--- a/openedx/core/djangoapps/credentials/management/commands/tests/test_notify_credentials.py
+++ b/openedx/core/djangoapps/credentials/management/commands/tests/test_notify_credentials.py
@@ -2,6 +2,7 @@
Tests the ``notify_credentials`` management command.
"""
from __future__ import absolute_import, unicode_literals
+from __future__ import print_function
from datetime import datetime
import mock
@@ -39,7 +40,7 @@ class TestNotifyCredentials(TestCase):
self.cert2 = GeneratedCertificateFactory(user=self.user, course_id='course-v1:edX+Test+2')
with freeze_time(datetime(2017, 3, 1)):
self.cert3 = GeneratedCertificateFactory(user=self.user, course_id='course-v1:testX+Test+3')
- print('self.cert1.modified_date', self.cert1.modified_date)
+ print(('self.cert1.modified_date', self.cert1.modified_date))
# No factory for these
with freeze_time(datetime(2017, 1, 1)):
@@ -51,7 +52,7 @@ class TestNotifyCredentials(TestCase):
with freeze_time(datetime(2017, 3, 1)):
self.grade3 = PersistentCourseGrade.objects.create(user_id=self.user.id, course_id='course-v1:testX+Test+3',
percent_grade=1)
- print('self.grade1.modified', self.grade1.modified)
+ print(('self.grade1.modified', self.grade1.modified))
@mock.patch(COMMAND_MODULE + '.Command.send_notifications')
def test_course_args(self, mock_send):
diff --git a/openedx/core/djangoapps/external_auth/tests/test_openid_provider.py b/openedx/core/djangoapps/external_auth/tests/test_openid_provider.py
index 673fbed12e..16c3c2bfd8 100644
--- a/openedx/core/djangoapps/external_auth/tests/test_openid_provider.py
+++ b/openedx/core/djangoapps/external_auth/tests/test_openid_provider.py
@@ -4,6 +4,7 @@ Created on Jan 18, 2013
@author: brian
'''
+from __future__ import print_function
import openid
from openid.fetchers import HTTPFetcher, HTTPResponse
from urlparse import parse_qs, urlparse
@@ -470,4 +471,4 @@ class OpenIdProviderLiveServerTest(LiveServerTestCase):
try:
super(OpenIdProviderLiveServerTest, cls).tearDownClass()
except RuntimeError:
- print "Warning: Could not shut down test server."
+ print("Warning: Could not shut down test server.")
diff --git a/openedx/core/djangoapps/heartbeat/tests/test_heartbeat.py b/openedx/core/djangoapps/heartbeat/tests/test_heartbeat.py
index 1d79916d53..a1282818c9 100644
--- a/openedx/core/djangoapps/heartbeat/tests/test_heartbeat.py
+++ b/openedx/core/djangoapps/heartbeat/tests/test_heartbeat.py
@@ -1,6 +1,7 @@
"""
Test the heartbeat
"""
+from __future__ import print_function
import json
from django.urls import reverse
@@ -24,7 +25,7 @@ class HeartbeatTestCase(ModuleStoreTestCase):
def test_success(self):
response = self.client.get(self.heartbeat_url + '?extended')
- print response
+ print(response)
self.assertEqual(response.status_code, 200)
diff --git a/openedx/core/djangoapps/theming/paver_helpers.py b/openedx/core/djangoapps/theming/paver_helpers.py
index 15eae72368..8b3ed92168 100644
--- a/openedx/core/djangoapps/theming/paver_helpers.py
+++ b/openedx/core/djangoapps/theming/paver_helpers.py
@@ -2,6 +2,7 @@
This file contains helpers for paver commands, Django is not initialized in paver commands.
So, django settings, models etc. can not be used here.
"""
+from __future__ import print_function
import os
from path import Path
@@ -27,13 +28,13 @@ def get_theme_paths(themes, theme_dirs):
for theme in themes:
theme_base_dirs = get_theme_base_dirs(theme, theme_dirs)
if not theme_base_dirs:
- print(
+ print((
"\033[91m\nSkipping '{theme}': \n"
"Theme ({theme}) not found in any of the theme dirs ({theme_dirs}). \033[00m".format(
theme=theme,
theme_dirs=", ".join(theme_dirs)
),
- )
+ ))
theme_paths.extend(theme_base_dirs)
return theme_paths
diff --git a/openedx/core/djangoapps/theming/tests/test_util.py b/openedx/core/djangoapps/theming/tests/test_util.py
index 7e0418ff00..084b8381ab 100644
--- a/openedx/core/djangoapps/theming/tests/test_util.py
+++ b/openedx/core/djangoapps/theming/tests/test_util.py
@@ -1,6 +1,7 @@
"""
Test helpers for Comprehensive Theming.
"""
+from __future__ import print_function
from functools import wraps
import os
@@ -65,16 +66,16 @@ def with_comprehensive_theme_context(theme=None):
def dump_theming_info():
"""Dump a bunch of theming information, for debugging."""
for namespace, lookup in edxmako.LOOKUP.items():
- print "--- %s: %s" % (namespace, lookup.template_args['module_directory'])
+ print("--- %s: %s" % (namespace, lookup.template_args['module_directory']))
for directory in lookup.directories:
- print " %s" % (directory,)
+ print(" %s" % (directory,))
- print "=" * 80
+ print("=" * 80)
for dirname, __, filenames in os.walk(settings.MAKO_MODULE_DIR):
- print "%s ----------------" % (dir,)
+ print("%s ----------------" % (dir,))
for filename in sorted(filenames):
if filename.endswith(".pyc"):
continue
with open(os.path.join(dirname, filename)) as f:
content = len(f.read())
- print " %s: %d" % (filename, content)
+ print(" %s: %d" % (filename, content))
diff --git a/openedx/core/djangoapps/util/management/commands/print_setting.py b/openedx/core/djangoapps/util/management/commands/print_setting.py
index 0ab3dad7cf..c6e82869b3 100644
--- a/openedx/core/djangoapps/util/management/commands/print_setting.py
+++ b/openedx/core/djangoapps/util/management/commands/print_setting.py
@@ -9,6 +9,7 @@ Useful when paver or a shell script needs such a value.
This handles the one specific use case of the "print_settings" command from
django-extensions that we were actually using.
"""
+from __future__ import print_function
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
diff --git a/openedx/core/djangoapps/util/management/commands/reset_db.py b/openedx/core/djangoapps/util/management/commands/reset_db.py
index 6eb678b140..1e08a7f8ea 100644
--- a/openedx/core/djangoapps/util/management/commands/reset_db.py
+++ b/openedx/core/djangoapps/util/management/commands/reset_db.py
@@ -12,6 +12,7 @@ django-extensions that we were actually using.
originally from http://www.djangosnippets.org/snippets/828/ by dnordberg
"""
+from __future__ import print_function
import logging
import django
diff --git a/openedx/core/djangoapps/verified_track_content/management/commands/swap_from_auto_track_cohort_pilot.py b/openedx/core/djangoapps/verified_track_content/management/commands/swap_from_auto_track_cohort_pilot.py
index 63a09eed69..72f079392b 100644
--- a/openedx/core/djangoapps/verified_track_content/management/commands/swap_from_auto_track_cohort_pilot.py
+++ b/openedx/core/djangoapps/verified_track_content/management/commands/swap_from_auto_track_cohort_pilot.py
@@ -1,3 +1,4 @@
+from __future__ import print_function
from contentstore.course_group_config import GroupConfiguration
from django.conf import settings
from course_modes.models import CourseMode
@@ -27,7 +28,7 @@ class Command(BaseCommand):
module_store = modulestore()
- print "Starting Swap from Auto Track Cohort Pilot command"
+ print("Starting Swap from Auto Track Cohort Pilot command")
verified_track_cohorts_setting = self._latest_settings()
@@ -54,8 +55,8 @@ class Command(BaseCommand):
raise CommandError("No audit_cohort_names set for MigrateVerifiedTrackCohortsSetting with ID: '%s'"
% verified_track_cohorts_setting.id)
- print "Running for MigrateVerifiedTrackCohortsSetting with old_course_key='%s' and rerun_course_key='%s'" % \
- (verified_track_cohorts_setting.old_course_key, verified_track_cohorts_setting.rerun_course_key)
+ print("Running for MigrateVerifiedTrackCohortsSetting with old_course_key='%s' and rerun_course_key='%s'" % \
+ (verified_track_cohorts_setting.old_course_key, verified_track_cohorts_setting.rerun_course_key))
# Get the CourseUserGroup IDs for the audit course names from the old course
audit_course_user_group_ids = CourseUserGroup.objects.filter(
@@ -170,7 +171,7 @@ class Command(BaseCommand):
)
if (audit_partition_group_access
and audit_course_user_group_partition_group.group_id in audit_partition_group_access):
- print "Queueing XBlock at location: '%s' for Audit Content Group update " % item.location
+ print("Queueing XBlock at location: '%s' for Audit Content Group update " % item.location)
set_audit_enrollment_track = True
# Check the partition and group IDs for the verified course group, if it exists in
@@ -191,7 +192,7 @@ class Command(BaseCommand):
% (item.location, non_verified_track_access_groups)
)
if verified_course_user_group_partition_group.group_id in verified_partition_group_access:
- print "Queueing XBlock at location: '%s' for Verified Content Group update " % item.location
+ print("Queueing XBlock at location: '%s' for Verified Content Group update " % item.location)
set_verified_enrollment_track = True
# Add the enrollment track ids to a group access array
@@ -223,7 +224,7 @@ class Command(BaseCommand):
for item in items_to_update:
module_store.update_item(item, ModuleStoreEnum.UserID.mgmt_command)
module_store.publish(item.location, ModuleStoreEnum.UserID.mgmt_command)
- print "Updated and published XBlock at location: '%s'" % item.location
+ print("Updated and published XBlock at location: '%s'" % item.location)
# Check if we should delete any partition groups if there are no errors.
# If there are errors, none of the xblock items will have been updated,
@@ -269,7 +270,7 @@ class Command(BaseCommand):
"\t\n".join(errors)
)
- print "Finished for MigrateVerifiedTrackCohortsSetting with ID='%s" % verified_track_cohorts_setting.id
+ print("Finished for MigrateVerifiedTrackCohortsSetting with ID='%s" % verified_track_cohorts_setting.id)
def _latest_settings(self):
"""
diff --git a/openedx/core/lib/xblock_builtin/xblock_discussion/tests.py b/openedx/core/lib/xblock_builtin/xblock_discussion/tests.py
index 77cfed238d..8b69eada12 100644
--- a/openedx/core/lib/xblock_builtin/xblock_discussion/tests.py
+++ b/openedx/core/lib/xblock_builtin/xblock_discussion/tests.py
@@ -1,4 +1,5 @@
""" Tests for DiscussionXBLock"""
+from __future__ import print_function
from collections import namedtuple
import ddt
import itertools
@@ -108,7 +109,7 @@ class DiscussionXBlockImportExportTests(TestCase):
self.assertEqual(block.discussion_category, category_pair.value)
self.assertEqual(block.discussion_target, target_pair.value)
except AssertionError:
- print xblock_xml
+ print(xblock_xml)
raise
@mock.patch(DISCUSSION_XBLOCK_LOCATION + ".load_definition_xml")
@@ -140,7 +141,7 @@ class DiscussionXBlockImportExportTests(TestCase):
self.assertEqual(block.discussion_category, category_pair.value)
self.assertEqual(block.discussion_target, target_pair.value)
except AssertionError:
- print xblock_xml, xblock_definition_xml
+ print(xblock_xml, xblock_definition_xml)
raise
def test_export_default_discussion_id(self):
diff --git a/openedx/tests/xblock_integration/test_external_xblocks.py b/openedx/tests/xblock_integration/test_external_xblocks.py
index ade16d0150..90dd53404c 100644
--- a/openedx/tests/xblock_integration/test_external_xblocks.py
+++ b/openedx/tests/xblock_integration/test_external_xblocks.py
@@ -7,6 +7,7 @@ run v1 tests only.
That be the dragon here.
"""
+from __future__ import print_function
import pkg_resources
@@ -49,5 +50,5 @@ for entrypoint in pkg_resources.iter_entry_points(group="xblock.test.v0"):
if not classname.replace("_", "").isalnum():
raise InvalidTestName("Python variables should be letters, numbers, and underscores: " + classname)
globals()[classname] = plugin
- print "Loading XBlock test: " + classname
+ print("Loading XBlock test: " + classname)
xblock_loaded = True
diff --git a/openedx/tests/xblock_integration/xblock_testcase.py b/openedx/tests/xblock_integration/xblock_testcase.py
index 9ea51c4c2e..5edcc94d45 100644
--- a/openedx/tests/xblock_integration/xblock_testcase.py
+++ b/openedx/tests/xblock_integration/xblock_testcase.py
@@ -34,6 +34,7 @@ Our next steps would be to:
* Move more blocks out of the platform, and more tests into the
blocks themselves.
"""
+from __future__ import print_function
import collections
import HTMLParser
@@ -391,13 +392,13 @@ class XBlockTestCase(XBlockStudentTestCaseMixin,
try:
ajax_response.data = json.loads(resp.content)
except ValueError:
- print "Invalid JSON response"
- print "(Often a redirect if e.g. not logged in)"
- print >>sys.stderr, "Could not load JSON from AJAX call"
- print >>sys.stderr, "Status:", resp.status_code
- print >>sys.stderr, "URL:", url
- print >>sys.stderr, "Block", block_urlname
- print >>sys.stderr, "Response", repr(resp.content)
+ print("Invalid JSON response")
+ print("(Often a redirect if e.g. not logged in)")
+ print("Could not load JSON from AJAX call", file=sys.stderr)
+ print("Status:", resp.status_code, file=sys.stderr)
+ print("URL:", url, file=sys.stderr)
+ print("Block", block_urlname, file=sys.stderr)
+ print("Response", repr(resp.content), file=sys.stderr)
raise
ajax_response.status_code = resp.status_code
return ajax_response
@@ -453,15 +454,15 @@ class XBlockTestCase(XBlockStudentTestCaseMixin,
try:
escaped_html = xblock_html.split('<')[1].split('>')[1]
except IndexError:
- print >>sys.stderr, "XBlock page could not render"
- print >>sys.stderr, "(Often, a redirect if e.g. not logged in)"
- print >>sys.stderr, "URL Name:", repr(urlname)
- print >>sys.stderr, "Usage ID", repr(usage_id)
- print >>sys.stderr, "Content", repr(content)
- print >>sys.stderr, "Split 1", repr(xblock_html.split('<'))
- print >>sys.stderr, "Dice 1:", repr(xblock_html.split('<')[1])
- print >> sys.stderr, "Split 2", repr(xblock_html.split('<')[1].split('>'))
- print >> sys.stderr, "Dice 2", repr(xblock_html.split('<')[1].split('>')[1])
+ print("XBlock page could not render", file=sys.stderr)
+ print("(Often, a redirect if e.g. not logged in)", file=sys.stderr)
+ print("URL Name:", repr(urlname), file=sys.stderr)
+ print("Usage ID", repr(usage_id), file=sys.stderr)
+ print("Content", repr(content), file=sys.stderr)
+ print("Split 1", repr(xblock_html.split('<')), file=sys.stderr)
+ print("Dice 1:", repr(xblock_html.split('<')[1]), file=sys.stderr)
+ print("Split 2", repr(xblock_html.split('<')[1].split('>')), file=sys.stderr)
+ print("Dice 2", repr(xblock_html.split('<')[1].split('>')[1]), file=sys.stderr)
raise
# Finally, we unescape the contents
decoded_html = HTMLParser.HTMLParser().unescape(escaped_html).strip()
diff --git a/pavelib/acceptance_test.py b/pavelib/acceptance_test.py
index 24b976c6fb..68555def6f 100644
--- a/pavelib/acceptance_test.py
+++ b/pavelib/acceptance_test.py
@@ -1,6 +1,7 @@
"""
Acceptance test tasks
"""
+from __future__ import print_function
from optparse import make_option
from paver.easy import cmdopts, needs
@@ -52,13 +53,13 @@ def test_acceptance(options, passthrough_options):
'red',
'No system specified, running tests for both cms and lms.'
)
- print msg
+ print(msg)
if opts['default_store'] not in ['draft', 'split']:
msg = colorize(
'red',
'No modulestore specified, running tests for both draft and split.'
)
- print msg
+ print(msg)
suite = AcceptanceTestSuite('{} acceptance'.format(opts['system']), **opts)
suite.run()
diff --git a/pavelib/bok_choy.py b/pavelib/bok_choy.py
index ca4f2d4577..7ddab963fe 100644
--- a/pavelib/bok_choy.py
+++ b/pavelib/bok_choy.py
@@ -2,6 +2,7 @@
Run acceptance tests that use the bok-choy framework
https://bok-choy.readthedocs.org/en/latest/
"""
+from __future__ import print_function
import os
@@ -146,7 +147,7 @@ def run_bokchoy(options, passthrough_options):
default_store=test_suite.default_store,
)
)
- print msg
+ print(msg)
test_suite.run()
@@ -157,12 +158,12 @@ def parse_coverage(report_dir, coveragerc):
report_dir.makedirs_p()
msg = colorize('green', "Combining coverage reports")
- print msg
+ print(msg)
sh("coverage combine --rcfile={}".format(coveragerc))
msg = colorize('green', "Generating coverage reports")
- print msg
+ print(msg)
sh("coverage html --rcfile={}".format(coveragerc))
sh("coverage xml --rcfile={}".format(coveragerc))
diff --git a/pavelib/i18n.py b/pavelib/i18n.py
index 11af69c1c4..5eb095ce29 100644
--- a/pavelib/i18n.py
+++ b/pavelib/i18n.py
@@ -1,6 +1,7 @@
"""
Internationalization tasks
"""
+from __future__ import print_function
import re
import subprocess
@@ -169,11 +170,11 @@ def i18n_rtl():
"""
sh("i18n_tool transifex rtl")
- print "Now generating langugage files..."
+ print("Now generating langugage files...")
sh("i18n_tool generate --rtl")
- print "Committing translations..."
+ print("Committing translations...")
sh('git clean -fdX conf/locale')
sh('git add conf/locale')
sh('git commit --amend')
@@ -187,11 +188,11 @@ def i18n_ltr():
"""
sh("i18n_tool transifex ltr")
- print "Now generating langugage files..."
+ print("Now generating langugage files...")
sh("i18n_tool generate --ltr")
- print "Committing translations..."
+ print("Committing translations...")
sh('git clean -fdX conf/locale')
sh('git add conf/locale')
sh('git commit --amend')
@@ -216,7 +217,7 @@ def i18n_robot_pull():
# TODO: Validate the recently pulled translations, and give a bail option
sh('git clean -fdX conf/locale/rtl')
sh('git clean -fdX conf/locale/eo')
- print "\n\nValidating translations with `i18n_tool validate`..."
+ print("\n\nValidating translations with `i18n_tool validate`...")
sh("i18n_tool validate")
con = raw_input("Continue with committing these translations (y/n)? ")
diff --git a/pavelib/paver_tests/test_paver_quality.py b/pavelib/paver_tests/test_paver_quality.py
index ba9bb1b762..10cb259d61 100644
--- a/pavelib/paver_tests/test_paver_quality.py
+++ b/pavelib/paver_tests/test_paver_quality.py
@@ -1,6 +1,7 @@
"""
Tests for paver quality tasks
"""
+from __future__ import print_function
import os
import shutil
import tempfile
@@ -319,7 +320,7 @@ class TestPaverRunQuality(PaverTestCase):
with self.assertRaises(SystemExit):
pavelib.quality.run_quality("")
self.assertRaises(BuildFailure)
- print self._mock_paver_sh.mock_calls
+ print(self._mock_paver_sh.mock_calls)
# Test that pylint is called
_mock_pylint_violations.assert_called_once_with(clean=False)
diff --git a/pavelib/prereqs.py b/pavelib/prereqs.py
index e519adb667..9bb6ecb97b 100644
--- a/pavelib/prereqs.py
+++ b/pavelib/prereqs.py
@@ -1,6 +1,7 @@
"""
Install Python and Node prerequisites.
"""
+from __future__ import print_function
import hashlib
import os
@@ -120,7 +121,7 @@ def prereq_cache(cache_name, paths, install_func):
post_install_hash = compute_fingerprint(paths)
cache_file.write(post_install_hash)
else:
- print '{cache} unchanged, skipping...'.format(cache=cache_name)
+ print('{cache} unchanged, skipping...'.format(cache=cache_name))
def node_prereqs_installation():
@@ -151,14 +152,14 @@ def node_prereqs_installation():
proc.wait()
except BuildFailure, error_text:
if cb_error_text in error_text:
- print "npm install error detected. Retrying..."
+ print("npm install error detected. Retrying...")
proc = subprocess.Popen(npm_command, stderr=npm_log_file)
proc.wait()
else:
raise BuildFailure(error_text)
- print "Successfully installed NPM packages. Log found at {}".format(
+ print("Successfully installed NPM packages. Log found at {}".format(
npm_log_file_path
- )
+ ))
def python_prereqs_installation():
@@ -182,7 +183,7 @@ def install_node_prereqs():
Installs Node prerequisites
"""
if no_prereq_install():
- print NO_PREREQ_MESSAGE
+ print(NO_PREREQ_MESSAGE)
return
prereq_cache("Node prereqs", ["package.json"], node_prereqs_installation)
@@ -213,7 +214,7 @@ def uninstall_python_packages():
"""
if no_python_uninstall():
- print NO_PYTHON_UNINSTALL_MESSAGE
+ print(NO_PYTHON_UNINSTALL_MESSAGE)
return
# So that we don't constantly uninstall things, use a hash of the packages
@@ -228,7 +229,7 @@ def uninstall_python_packages():
with io.open(state_file_path) as state_file:
version = state_file.read()
if version == expected_version:
- print 'Python uninstalls unchanged, skipping...'
+ print('Python uninstalls unchanged, skipping...')
return
# Run pip to find the packages we need to get rid of. Believe it or not,
@@ -247,7 +248,7 @@ def uninstall_python_packages():
break
else:
# We tried three times and didn't manage to get rid of the pests.
- print "Couldn't uninstall unwanted Python packages!"
+ print("Couldn't uninstall unwanted Python packages!")
return
# Write our version.
@@ -277,7 +278,7 @@ def package_in_frozen(package_name, frozen_output):
def install_coverage_prereqs():
""" Install python prereqs for measuring coverage. """
if no_prereq_install():
- print NO_PREREQ_MESSAGE
+ print(NO_PREREQ_MESSAGE)
return
pip_install_req_file(COVERAGE_REQ_FILE)
@@ -289,7 +290,7 @@ def install_python_prereqs():
Installs Python prerequisites.
"""
if no_prereq_install():
- print NO_PREREQ_MESSAGE
+ print(NO_PREREQ_MESSAGE)
return
uninstall_python_packages()
@@ -323,7 +324,7 @@ def install_prereqs():
Installs Node and Python prerequisites
"""
if no_prereq_install():
- print NO_PREREQ_MESSAGE
+ print(NO_PREREQ_MESSAGE)
return
if not str2bool(os.environ.get('SKIP_NPM_INSTALL', 'False')):
@@ -341,9 +342,9 @@ def log_installed_python_prereqs():
def print_devstack_warning():
if Env.USING_DOCKER: # pragma: no cover
- print "********************************************************************************"
- print "* WARNING: Mac users should run this from both the lms and studio shells"
- print "* in docker devstack to avoid startup errors that kill your CPU."
- print "* For more details, see:"
- print "* https://github.com/edx/devstack#docker-is-using-lots-of-cpu-time-when-it-should-be-idle"
- print "********************************************************************************"
+ print("********************************************************************************")
+ print("* WARNING: Mac users should run this from both the lms and studio shells")
+ print("* in docker devstack to avoid startup errors that kill your CPU.")
+ print("* For more details, see:")
+ print("* https://github.com/edx/devstack#docker-is-using-lots-of-cpu-time-when-it-should-be-idle")
+ print("********************************************************************************")
diff --git a/pavelib/quality.py b/pavelib/quality.py
index f4f39a0d43..bf43558d49 100644
--- a/pavelib/quality.py
+++ b/pavelib/quality.py
@@ -3,6 +3,7 @@
"""
Check code quality using pycodestyle, pylint, and diff_quality.
"""
+from __future__ import print_function
import json
import os
import re
@@ -109,7 +110,7 @@ def find_fixme(options):
num_fixme += _count_pylint_violations(
"{report_dir}/pylint_fixme.report".format(report_dir=report_dir))
- print "Number of pylint fixmes: " + str(num_fixme)
+ print("Number of pylint fixmes: " + str(num_fixme))
def _get_pylint_violations(systems=ALL_SYSTEMS.split(','), errors_only=False, clean=True):
@@ -177,7 +178,7 @@ def run_pylint(options):
# Print number of violations to log
violations_count_str = "Number of pylint violations: " + str(num_violations)
- print violations_count_str
+ print(violations_count_str)
# Also write the number of violations to a file
with open(Env.METRICS_DIR / "pylint", "w") as f:
@@ -294,8 +295,8 @@ def run_pep8(options): # pylint: disable=unused-argument
# Print number of violations to log
violations_count_str = "Number of PEP 8 violations: {count}".format(count=count)
- print violations_count_str
- print violations_list
+ print(violations_count_str)
+ print(violations_list)
# Also write the number of violations to a file
with open(Env.METRICS_DIR / "pep8", "w") as f:
@@ -327,7 +328,7 @@ def run_complexity():
Env.METRICS_DIR.makedirs_p()
_prepare_report_dir(complexity_report_dir)
- print "--> Calculating cyclomatic complexity of python files..."
+ print("--> Calculating cyclomatic complexity of python files...")
try:
sh(
"radon cc {system_string} --total-average > {complexity_report}".format(
@@ -340,11 +341,11 @@ def run_complexity():
complexity_metric,
(Env.METRICS_DIR / "python_complexity")
)
- print "--> Python cyclomatic complexity report complete."
- print "radon cyclomatic complexity score: {metric}".format(metric=str(complexity_metric))
+ print("--> Python cyclomatic complexity report complete.")
+ print("radon cyclomatic complexity score: {metric}".format(metric=str(complexity_metric)))
except BuildFailure:
- print "FAILURE: Unable to calculate python-only code-complexity."
+ print("FAILURE: Unable to calculate python-only code-complexity.")
@task
@@ -820,7 +821,7 @@ def run_quality(options):
_, upper_violations_limit, _, _ = _parse_pylint_options(options)
# Print total number of violations to log
- print _lint_output('pylint', count, violations_list, limit=upper_violations_limit)
+ print(_lint_output('pylint', count, violations_list, limit=upper_violations_limit))
if count > upper_violations_limit > -1:
diff_quality_pass = False
failure_reasons.append('Too many total violations.')
diff --git a/pavelib/tests.py b/pavelib/tests.py
index 587e793aa6..e4aa17fa82 100644
--- a/pavelib/tests.py
+++ b/pavelib/tests.py
@@ -1,6 +1,7 @@
"""
Unit test tasks
"""
+from __future__ import print_function
import os
import re
import sys
@@ -354,4 +355,4 @@ def diff_coverage(options):
)
)
- print "\n"
+ print("\n")
diff --git a/pavelib/utils/test/bokchoy_utils.py b/pavelib/utils/test/bokchoy_utils.py
index 0cd5015e58..7e478db640 100644
--- a/pavelib/utils/test/bokchoy_utils.py
+++ b/pavelib/utils/test/bokchoy_utils.py
@@ -1,6 +1,7 @@
"""
Helper functions for bok_choy test tasks
"""
+from __future__ import print_function
import httplib
import os
import subprocess
@@ -36,7 +37,7 @@ def start_servers(options):
"""
Starts a single server.
"""
- print cmd, logfile
+ print(cmd, logfile)
run_background_process(cmd, out_log=logfile, err_log=logfile, cwd=cwd)
for service, info in Env.BOK_CHOY_SERVERS.iteritems():
@@ -115,7 +116,7 @@ def wait_for_test_servers():
"red",
"Could not contact {} test server".format(service)
)
- print msg
+ print(msg)
sys.exit(1)
@@ -172,7 +173,7 @@ def check_mongo():
"""
if not is_mongo_running():
msg = colorize('red', "Mongo is not running locally.")
- print msg
+ print(msg)
sys.exit(1)
@@ -184,7 +185,7 @@ def check_memcache():
"""
if not is_memcache_running():
msg = colorize('red', "Memcache is not running locally.")
- print msg
+ print(msg)
sys.exit(1)
@@ -199,7 +200,7 @@ def check_mysql():
return
if not is_mysql_running():
msg = colorize('red', "MySQL is not running locally.")
- print msg
+ print(msg)
sys.exit(1)
diff --git a/pavelib/utils/test/suites/bokchoy_suite.py b/pavelib/utils/test/suites/bokchoy_suite.py
index c14030a206..a44de01710 100644
--- a/pavelib/utils/test/suites/bokchoy_suite.py
+++ b/pavelib/utils/test/suites/bokchoy_suite.py
@@ -1,6 +1,7 @@
"""
Class used for defining and running Bok Choy acceptance test suite
"""
+from __future__ import print_function
import os
from time import sleep
from textwrap import dedent
@@ -45,7 +46,7 @@ def load_bok_choy_data(options):
"""
Loads data into database from db_fixtures
"""
- print 'Loading data from json fixtures in db_fixtures directory'
+ print('Loading data from json fixtures in db_fixtures directory')
sh(
"DEFAULT_STORE={default_store}"
" ./manage.py lms --settings {settings} loaddata --traceback"
@@ -73,7 +74,7 @@ def load_courses(options):
"""
if 'imports_dir' in options:
msg = colorize('green', "Importing courses from {}...".format(options.imports_dir))
- print msg
+ print(msg)
sh(
"DEFAULT_STORE={default_store}"
@@ -84,7 +85,7 @@ def load_courses(options):
)
)
else:
- print colorize('blue', "--imports-dir not set, skipping import")
+ print(colorize('blue', "--imports-dir not set, skipping import"))
@task
@@ -96,7 +97,7 @@ def update_fixtures():
and Jenkins.
"""
msg = colorize('green', "Updating the Site fixture domains...")
- print msg
+ print(msg)
sh(
" ./manage.py lms --settings={settings} update_fixtures".format(
@@ -114,11 +115,11 @@ def get_test_course(options):
"""
if options.get('imports_dir'):
- print colorize("green", "--imports-dir specified, skipping fetch of test course")
+ print(colorize("green", "--imports-dir specified, skipping fetch of test course"))
return
if not options.get('should_fetch_course', False):
- print colorize("green", "--skip-fetch specified, skipping fetch of test course")
+ print(colorize("green", "--skip-fetch specified, skipping fetch of test course"))
return
# Set the imports_dir for use by other tasks
@@ -128,7 +129,7 @@ def get_test_course(options):
zipped_course = options.imports_dir + 'demo_course.tar.gz'
msg = colorize('green', "Fetching the test course from github...")
- print msg
+ print(msg)
sh(
'wget {tar_gz_file} -O {zipped_course}'.format(
@@ -138,7 +139,7 @@ def get_test_course(options):
)
msg = colorize('green', "Uncompressing the test course...")
- print msg
+ print(msg)
sh(
'tar zxf {zipped_course} -C {courses_dir}'.format(
@@ -171,7 +172,7 @@ def prepare_bokchoy_run(options):
"""
if not options.get('fasttest', False):
- print colorize('green', "Generating optimized static assets...")
+ print(colorize('green', "Generating optimized static assets..."))
if options.get('log_dir') is None:
call_task('update_assets', args=['--settings', 'test_static_optimized'])
else:
@@ -182,7 +183,7 @@ def prepare_bokchoy_run(options):
# Ensure the test servers are available
msg = colorize('green', "Confirming servers are running...")
- print msg
+ print(msg)
start_servers() # pylint: disable=no-value-for-parameter
@@ -246,7 +247,7 @@ class BokChoyTestSuite(TestSuite):
test_utils.clean_test_files()
msg = colorize('green', "Checking for mongo, memchache, and mysql...")
- print msg
+ print(msg)
check_services()
if not self.testsonly:
@@ -257,7 +258,7 @@ class BokChoyTestSuite(TestSuite):
update_fixtures()
msg = colorize('green', "Confirming servers have started...")
- print msg
+ print(msg)
wait_for_test_servers()
try:
# Create course in order to seed forum data underneath. This is
@@ -267,7 +268,7 @@ class BokChoyTestSuite(TestSuite):
"Installing course fixture for forums",
CourseFixture('foobar_org', '1117', 'seed_forum', 'seed_foo').install
)
- print 'Forums permissions/roles data has been seeded'
+ print('Forums permissions/roles data has been seeded')
except FixtureError:
# this means it's already been done
pass
@@ -281,11 +282,11 @@ class BokChoyTestSuite(TestSuite):
# Using testsonly will leave all fixtures in place (Note: the db will also be dirtier.)
if self.testsonly:
msg = colorize('green', 'Running in testsonly mode... SKIPPING database cleanup.')
- print msg
+ print(msg)
else:
# Clean up data we created in the databases
msg = colorize('green', "Cleaning up databases...")
- print msg
+ print(msg)
sh("./manage.py lms --settings {settings} flush --traceback --noinput".format(settings=Env.SETTINGS))
clear_mongo()
@@ -315,14 +316,14 @@ class BokChoyTestSuite(TestSuite):
"""
Infinite loop. Servers will continue to run in the current session unless interrupted.
"""
- print 'Bok-choy servers running. Press Ctrl-C to exit...\n'
- print 'Note: pressing Ctrl-C multiple times can corrupt system state. Just press it once.\n'
+ print('Bok-choy servers running. Press Ctrl-C to exit...\n')
+ print('Note: pressing Ctrl-C multiple times can corrupt system state. Just press it once.\n')
while True:
try:
sleep(10000)
except KeyboardInterrupt:
- print "Stopping bok-choy servers.\n"
+ print("Stopping bok-choy servers.\n")
break
@property
diff --git a/pavelib/utils/test/suites/suite.py b/pavelib/utils/test/suites/suite.py
index 91a59eeb41..83be219e04 100644
--- a/pavelib/utils/test/suites/suite.py
+++ b/pavelib/utils/test/suites/suite.py
@@ -1,6 +1,7 @@
"""
A class used for defining and running test suites
"""
+from __future__ import print_function
import sys
import subprocess
@@ -38,7 +39,7 @@ class TestSuite(object):
i.e. Checking for and defining required directories.
"""
- print "\nSetting up for {suite_name}".format(suite_name=self.root)
+ print("\nSetting up for {suite_name}".format(suite_name=self.root))
self.failed_suites = []
def __exit__(self, exc_type, exc_value, traceback):
@@ -51,7 +52,7 @@ class TestSuite(object):
i.e. Cleaning mongo after the lms tests run.
"""
- print "\nCleaning up after {suite_name}".format(suite_name=self.root)
+ print("\nCleaning up after {suite_name}".format(suite_name=self.root))
@property
def cmd(self):
@@ -127,7 +128,7 @@ class TestSuite(object):
else:
msg = colorize('green', "\n\n{bar}\nNo test failures ".format(bar="=" * 48))
- print msg
+ print(msg)
def run(self):
"""
diff --git a/pavelib/utils/test/utils.py b/pavelib/utils/test/utils.py
index 647e20c625..8743ca8187 100644
--- a/pavelib/utils/test/utils.py
+++ b/pavelib/utils/test/utils.py
@@ -1,6 +1,7 @@
"""
Helper functions for test tasks
"""
+from __future__ import print_function
import os
import re
import subprocess
@@ -68,7 +69,7 @@ def clean_reports_dir(options):
Clean coverage files, to ensure that we don't use stale data to generate reports.
"""
if getattr(options, 'skip_clean', False):
- print '--skip-clean is set, skipping...'
+ print('--skip-clean is set, skipping...')
return
# We delete the files but preserve the directory structure
diff --git a/scripts/show_events.py b/scripts/show_events.py
index ed2d833188..698215c1c5 100644
--- a/scripts/show_events.py
+++ b/scripts/show_events.py
@@ -1,3 +1,4 @@
+from __future__ import print_function
import json
import sys
import traceback
@@ -14,12 +15,12 @@ else:
def display(message):
- print '{} - {}'.format(date_string(message['time']), message['event_type'])
+ print('{} - {}'.format(date_string(message['time']), message['event_type']))
if message.get('event'):
event = json.loads(message['event'])
for k in sorted(event):
- print '\t{}: {}'.format(k, event[k])
- print
+ print('\t{}: {}'.format(k, event[k]))
+ print()
while 1:
line = sys.stdin.readline()
diff --git a/scripts/xblock/xblock_counts.py b/scripts/xblock/xblock_counts.py
index 41eb39a46c..bc93c3f6c1 100644
--- a/scripts/xblock/xblock_counts.py
+++ b/scripts/xblock/xblock_counts.py
@@ -1,3 +1,4 @@
+from __future__ import print_function
import argparse
import csv
import json
@@ -104,7 +105,7 @@ def _get_course_data_summary(auth_token, months_restriction, xblock_type_set, ap
# print to update the screen for status
sys.stdout.write('.')
sys.stdout.flush()
- print 'Processed %d courses' % total_courses
+ print('Processed %d courses' % total_courses)
return course_summary_data
@@ -159,15 +160,15 @@ def _get_block_types_from_json_file(xblock_json_file):
set: A set of strings for all the types that are available in the configuration file
"""
if not os.path.isfile(xblock_json_file):
- print 'xBlock configuration file does not exist: %s' % xblock_json_file
+ print('xBlock configuration file does not exist: %s' % xblock_json_file)
sys.exit(2)
with open(xblock_json_file, 'r') as json_file:
type_set = set()
try:
json_data = json.loads(json_file.read())
except ValueError as e:
- print 'xBlock configuration file does not match the expected layout and is ' \
- 'missing "data" list: %s' % xblock_json_file
+ print('xBlock configuration file does not match the expected layout and is ' \
+ 'missing "data" list: %s' % xblock_json_file)
sys.exit(text_type(e))
if 'data' in json_data:
xblock_type_list = json_data['data']
@@ -175,8 +176,8 @@ def _get_block_types_from_json_file(xblock_json_file):
type_set.add(xblock['name'])
return type_set
else:
- print 'xBlock configuration file does not match the expected layout and is ' \
- 'missing "data" list: %s' % xblock_json_file
+ print('xBlock configuration file does not match the expected layout and is ' \
+ 'missing "data" list: %s' % xblock_json_file)
sys.exit(2)
@@ -374,7 +375,7 @@ if __name__ == "__main__":
# Get User access token
token = get_access_token(username, password, oauth2_client_id, api_root)
if token is None:
- print 'Failed to retrieve user token for user: %s ' % username
+ print('Failed to retrieve user token for user: %s ' % username)
sys.exit(2)
# Collect course data and write CSV reports
@@ -384,4 +385,4 @@ if __name__ == "__main__":
if len(course_data) > 0:
write_block_summary_report(course_data)
write_course_block_detail_report(course_data)
- print 'Start time: %s Total run time: %s' % (str(start_time), str(datetime.now() - start_time))
+ print('Start time: %s Total run time: %s' % (str(start_time), str(datetime.now() - start_time)))