Fixed #19357 -- Allow non-ASCII chars in filesystem paths

Thanks kujiu for the report and Aymeric Augustin for the review.
This commit is contained in:
Claude Paroz 2012-12-08 11:13:52 +01:00
parent 53b879f045
commit c91667338a
56 changed files with 228 additions and 147 deletions

View File

@ -14,6 +14,7 @@ from django.core import urlresolvers
from django.contrib.admindocs import utils from django.contrib.admindocs import utils
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils._os import upath
from django.utils import six from django.utils import six
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
@ -311,7 +312,7 @@ def load_all_installed_template_libraries():
try: try:
libraries = [ libraries = [
os.path.splitext(p)[0] os.path.splitext(p)[0]
for p in os.listdir(os.path.dirname(mod.__file__)) for p in os.listdir(os.path.dirname(upath(mod.__file__)))
if p.endswith('.py') and p[0].isalpha() if p.endswith('.py') and p[0].isalpha()
] ]
except OSError: except OSError:

View File

@ -9,6 +9,7 @@ from django.contrib.auth.context_processors import PermWrapper, PermLookupDict
from django.db.models import Q from django.db.models import Q
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils._os import upath
class MockUser(object): class MockUser(object):
@ -63,7 +64,7 @@ class PermWrapperTests(TestCase):
@skipIfCustomUser @skipIfCustomUser
@override_settings( @override_settings(
TEMPLATE_DIRS=( TEMPLATE_DIRS=(
os.path.join(os.path.dirname(__file__), 'templates'), os.path.join(os.path.dirname(upath(__file__)), 'templates'),
), ),
USE_TZ=False, # required for loading the fixture USE_TZ=False, # required for loading the fixture
PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',), PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',),

View File

@ -11,6 +11,7 @@ from django.forms.fields import Field, EmailField
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils._os import upath
from django.utils import translation from django.utils import translation
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
@ -331,7 +332,7 @@ class PasswordResetFormTest(TestCase):
self.assertEqual(form.cleaned_data['email'], email) self.assertEqual(form.cleaned_data['email'], email)
def test_custom_email_subject(self): def test_custom_email_subject(self):
template_path = os.path.join(os.path.dirname(__file__), 'templates') template_path = os.path.join(os.path.dirname(upath(__file__)), 'templates')
with self.settings(TEMPLATE_DIRS=(template_path,)): with self.settings(TEMPLATE_DIRS=(template_path,)):
data = {'email': 'testclient@example.com'} data = {'email': 'testclient@example.com'}
form = PasswordResetForm(data) form = PasswordResetForm(data)

View File

@ -11,6 +11,7 @@ from django.http import QueryDict
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.html import escape from django.utils.html import escape
from django.utils.http import urlquote from django.utils.http import urlquote
from django.utils._os import upath
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
@ -27,7 +28,7 @@ from django.contrib.auth.tests.utils import skipIfCustomUser
LANGUAGE_CODE='en', LANGUAGE_CODE='en',
TEMPLATE_LOADERS=global_settings.TEMPLATE_LOADERS, TEMPLATE_LOADERS=global_settings.TEMPLATE_LOADERS,
TEMPLATE_DIRS=( TEMPLATE_DIRS=(
os.path.join(os.path.dirname(__file__), 'templates'), os.path.join(os.path.dirname(upath(__file__)), 'templates'),
), ),
USE_TZ=False, USE_TZ=False,
PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',), PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',),

View File

@ -14,6 +14,7 @@ from django.contrib.formtools.wizard import FormWizard
from django.test import TestCase from django.test import TestCase
from django.test.html import parse_html from django.test.html import parse_html
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils._os import upath
from django.utils import unittest from django.utils import unittest
from django.contrib.formtools.tests.wizard import * from django.contrib.formtools.tests.wizard import *
@ -36,7 +37,7 @@ class TestFormPreview(preview.FormPreview):
@override_settings( @override_settings(
TEMPLATE_DIRS=( TEMPLATE_DIRS=(
os.path.join(os.path.dirname(__file__), 'templates'), os.path.join(os.path.dirname(upath(__file__)), 'templates'),
), ),
) )
class PreviewTests(TestCase): class PreviewTests(TestCase):
@ -214,7 +215,7 @@ class DummyRequest(http.HttpRequest):
@override_settings( @override_settings(
SECRET_KEY="123", SECRET_KEY="123",
TEMPLATE_DIRS=( TEMPLATE_DIRS=(
os.path.join(os.path.dirname(__file__), 'templates'), os.path.join(os.path.dirname(upath(__file__)), 'templates'),
), ),
) )
class WizardTests(TestCase): class WizardTests(TestCase):

View File

@ -9,6 +9,7 @@ from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.formtools.wizard.views import CookieWizardView from django.contrib.formtools.wizard.views import CookieWizardView
from django.contrib.formtools.tests.wizard.forms import UserForm, UserFormSet from django.contrib.formtools.tests.wizard.forms import UserForm, UserFormSet
from django.utils._os import upath
class WizardTests(object): class WizardTests(object):
@ -86,7 +87,7 @@ class WizardTests(object):
self.assertEqual(response.context['wizard']['steps'].current, 'form2') self.assertEqual(response.context['wizard']['steps'].current, 'form2')
post_data = self.wizard_step_data[1] post_data = self.wizard_step_data[1]
post_data['form2-file1'] = open(__file__, 'rb') post_data['form2-file1'] = open(upath(__file__), 'rb')
response = self.client.post(self.wizard_url, post_data) response = self.client.post(self.wizard_url, post_data)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form3') self.assertEqual(response.context['wizard']['steps'].current, 'form3')
@ -99,7 +100,7 @@ class WizardTests(object):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
all_data = response.context['form_list'] all_data = response.context['form_list']
with open(__file__, 'rb') as f: with open(upath(__file__), 'rb') as f:
self.assertEqual(all_data[1]['file1'].read(), f.read()) self.assertEqual(all_data[1]['file1'].read(), f.read())
all_data[1]['file1'].close() all_data[1]['file1'].close()
del all_data[1]['file1'] del all_data[1]['file1']
@ -118,7 +119,7 @@ class WizardTests(object):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
post_data = self.wizard_step_data[1] post_data = self.wizard_step_data[1]
with open(__file__, 'rb') as post_file: with open(upath(__file__), 'rb') as post_file:
post_data['form2-file1'] = post_file post_data['form2-file1'] = post_file
response = self.client.post(self.wizard_url, post_data) response = self.client.post(self.wizard_url, post_data)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@ -130,7 +131,7 @@ class WizardTests(object):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
all_data = response.context['all_cleaned_data'] all_data = response.context['all_cleaned_data']
with open(__file__, 'rb') as f: with open(upath(__file__), 'rb') as f:
self.assertEqual(all_data['file1'].read(), f.read()) self.assertEqual(all_data['file1'].read(), f.read())
all_data['file1'].close() all_data['file1'].close()
del all_data['file1'] del all_data['file1']
@ -150,7 +151,7 @@ class WizardTests(object):
post_data = self.wizard_step_data[1] post_data = self.wizard_step_data[1]
post_data['form2-file1'].close() post_data['form2-file1'].close()
post_data['form2-file1'] = open(__file__, 'rb') post_data['form2-file1'] = open(upath(__file__), 'rb')
response = self.client.post(self.wizard_url, post_data) response = self.client.post(self.wizard_url, post_data)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@ -178,7 +179,7 @@ class WizardTests(object):
post_data = self.wizard_step_data[1] post_data = self.wizard_step_data[1]
post_data['form2-file1'].close() post_data['form2-file1'].close()
post_data['form2-file1'] = open(__file__, 'rb') post_data['form2-file1'] = open(upath(__file__), 'rb')
response = self.client.post(self.wizard_url, post_data) response = self.client.post(self.wizard_url, post_data)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form3') self.assertEqual(response.context['wizard']['steps'].current, 'form3')
@ -291,7 +292,7 @@ class WizardTestKwargs(TestCase):
self.wizard_step_data[0]['form1-user'] = self.testuser.pk self.wizard_step_data[0]['form1-user'] = self.testuser.pk
def test_template(self): def test_template(self):
templates = os.path.join(os.path.dirname(__file__), 'templates') templates = os.path.join(os.path.dirname(upath(__file__)), 'templates')
with self.settings( with self.settings(
TEMPLATE_DIRS=list(settings.TEMPLATE_DIRS) + [templates]): TEMPLATE_DIRS=list(settings.TEMPLATE_DIRS) + [templates]):
response = self.client.get(self.wizard_url) response = self.client.get(self.wizard_url)

View File

@ -7,13 +7,14 @@ import os
from django.contrib import gis from django.contrib import gis
from django.utils import six from django.utils import six
from django.utils._os import upath
# This global used to store reference geometry data. # This global used to store reference geometry data.
GEOMETRIES = None GEOMETRIES = None
# Path where reference test data is located. # Path where reference test data is located.
TEST_DATA = os.path.join(os.path.dirname(gis.__file__), 'tests', 'data') TEST_DATA = os.path.join(os.path.dirname(upath(gis.__file__)), 'tests', 'data')
def tuplize(seq): def tuplize(seq):

View File

@ -7,12 +7,13 @@ from django.contrib.gis.db.models import Union, Extent3D
from django.contrib.gis.geos import GEOSGeometry, LineString, Point, Polygon from django.contrib.gis.geos import GEOSGeometry, LineString, Point, Polygon
from django.contrib.gis.utils import LayerMapping, LayerMapError from django.contrib.gis.utils import LayerMapping, LayerMapError
from django.test import TestCase from django.test import TestCase
from django.utils._os import upath
from .models import (City3D, Interstate2D, Interstate3D, InterstateProj2D, from .models import (City3D, Interstate2D, Interstate3D, InterstateProj2D,
InterstateProj3D, Point2D, Point3D, MultiPoint3D, Polygon2D, Polygon3D) InterstateProj3D, Point2D, Point3D, MultiPoint3D, Polygon2D, Polygon3D)
data_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'data')) data_path = os.path.realpath(os.path.join(os.path.dirname(upath(__file__)), '..', 'data'))
city_file = os.path.join(data_path, 'cities', 'cities.shp') city_file = os.path.join(data_path, 'cities', 'cities.shp')
vrt_file = os.path.join(data_path, 'test_vrt', 'test_vrt.vrt') vrt_file = os.path.join(data_path, 'test_vrt', 'test_vrt.vrt')

View File

@ -8,6 +8,7 @@ import os
from django.contrib.gis import gdal from django.contrib.gis import gdal
from django.contrib.gis.measure import D from django.contrib.gis.measure import D
from django.test import TestCase from django.test import TestCase
from django.utils._os import upath
from .models import City, County, Zipcode from .models import City, County, Zipcode
@ -61,7 +62,7 @@ class GeographyTest(TestCase):
from django.contrib.gis.utils import LayerMapping from django.contrib.gis.utils import LayerMapping
# Getting the shapefile and mapping dictionary. # Getting the shapefile and mapping dictionary.
shp_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'data')) shp_path = os.path.realpath(os.path.join(os.path.dirname(upath(__file__)), '..', 'data'))
co_shp = os.path.join(shp_path, 'counties', 'counties.shp') co_shp = os.path.join(shp_path, 'counties', 'counties.shp')
co_mapping = {'name' : 'Name', co_mapping = {'name' : 'Name',
'state' : 'State', 'state' : 'State',

View File

@ -13,13 +13,14 @@ from django.db import router
from django.conf import settings from django.conf import settings
from django.test import TestCase from django.test import TestCase
from django.utils import unittest from django.utils import unittest
from django.utils._os import upath
from .models import ( from .models import (
City, County, CountyFeat, Interstate, ICity1, ICity2, Invalid, State, City, County, CountyFeat, Interstate, ICity1, ICity2, Invalid, State,
city_mapping, co_mapping, cofeat_mapping, inter_mapping) city_mapping, co_mapping, cofeat_mapping, inter_mapping)
shp_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.pardir, 'data')) shp_path = os.path.realpath(os.path.join(os.path.dirname(upath(__file__)), os.pardir, 'data'))
city_shp = os.path.join(shp_path, 'cities', 'cities.shp') city_shp = os.path.join(shp_path, 'cities', 'cities.shp')
co_shp = os.path.join(shp_path, 'counties', 'counties.shp') co_shp = os.path.join(shp_path, 'counties', 'counties.shp')
inter_shp = os.path.join(shp_path, 'interstates', 'interstates.shp') inter_shp = os.path.join(shp_path, 'interstates', 'interstates.shp')

View File

@ -11,6 +11,7 @@ from django.core.exceptions import ImproperlyConfigured
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.unittest import skipUnless from django.utils.unittest import skipUnless
from django.utils.formats import localize from django.utils.formats import localize
from django.utils._os import upath
from django.utils.translation import activate, deactivate from django.utils.translation import activate, deactivate
from .base import SitemapTestsBase from .base import SitemapTestsBase
@ -29,7 +30,7 @@ class HTTPSitemapTests(SitemapTestsBase):
self.assertXMLEqual(response.content.decode('utf-8'), expected_content) self.assertXMLEqual(response.content.decode('utf-8'), expected_content)
@override_settings( @override_settings(
TEMPLATE_DIRS=(os.path.join(os.path.dirname(__file__), 'templates'),) TEMPLATE_DIRS=(os.path.join(os.path.dirname(upath(__file__)), 'templates'),)
) )
def test_simple_sitemap_custom_index(self): def test_simple_sitemap_custom_index(self):
"A simple sitemap index can be rendered with a custom template" "A simple sitemap index can be rendered with a custom template"
@ -64,7 +65,7 @@ class HTTPSitemapTests(SitemapTestsBase):
self.assertXMLEqual(response.content.decode('utf-8'), expected_content) self.assertXMLEqual(response.content.decode('utf-8'), expected_content)
@override_settings( @override_settings(
TEMPLATE_DIRS=(os.path.join(os.path.dirname(__file__), 'templates'),) TEMPLATE_DIRS=(os.path.join(os.path.dirname(upath(__file__)), 'templates'),)
) )
def test_simple_custom_sitemap(self): def test_simple_custom_sitemap(self):
"A simple sitemap can be rendered with a custom template" "A simple sitemap can be rendered with a custom template"

View File

@ -19,6 +19,7 @@ from django.utils.datastructures import SortedDict
from django.utils.encoding import force_bytes, force_text from django.utils.encoding import force_bytes, force_text
from django.utils.functional import LazyObject from django.utils.functional import LazyObject
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils._os import upath
from django.contrib.staticfiles.utils import check_settings, matches_patterns from django.contrib.staticfiles.utils import check_settings, matches_patterns
@ -296,7 +297,7 @@ class AppStaticStorage(FileSystemStorage):
""" """
# app is the actual app module # app is the actual app module
mod = import_module(app) mod = import_module(app)
mod_path = os.path.dirname(mod.__file__) mod_path = os.path.dirname(upath(mod.__file__))
location = os.path.join(mod_path, self.source_dir) location = os.path.join(mod_path, self.source_dir)
super(AppStaticStorage, self).__init__(location, *args, **kwargs) super(AppStaticStorage, self).__init__(location, *args, **kwargs)

View File

@ -9,6 +9,7 @@ from django.core.exceptions import ImproperlyConfigured
from django.core.management.base import BaseCommand, CommandError, handle_default_options from django.core.management.base import BaseCommand, CommandError, handle_default_options
from django.core.management.color import color_style from django.core.management.color import color_style
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils._os import upath
from django.utils import six from django.utils import six
# For backwards compatibility: get_version() used to be in this module. # For backwards compatibility: get_version() used to be in this module.
@ -410,10 +411,10 @@ def setup_environ(settings_mod, original_settings_path=None):
# Add this project to sys.path so that it's importable in the conventional # Add this project to sys.path so that it's importable in the conventional
# way. For example, if this file (manage.py) lives in a directory # way. For example, if this file (manage.py) lives in a directory
# "myproject", this code would add "/path/to/myproject" to sys.path. # "myproject", this code would add "/path/to/myproject" to sys.path.
if '__init__.py' in settings_mod.__file__: if '__init__.py' in upath(settings_mod.__file__):
p = os.path.dirname(settings_mod.__file__) p = os.path.dirname(upath(settings_mod.__file__))
else: else:
p = settings_mod.__file__ p = upath(settings_mod.__file__)
project_directory, settings_filename = os.path.split(p) project_directory, settings_filename = os.path.split(p)
if project_directory == os.curdir or not project_directory: if project_directory == os.curdir or not project_directory:
project_directory = os.getcwd() project_directory = os.getcwd()

View File

@ -5,6 +5,7 @@ import os
import sys import sys
from optparse import make_option from optparse import make_option
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.utils._os import npath
def has_bom(fn): def has_bom(fn):
with open(fn, 'rb') as f: with open(fn, 'rb') as f:
@ -41,8 +42,8 @@ def compile_messages(stderr, locale=None):
# command, so that we can take advantage of shell quoting, to # command, so that we can take advantage of shell quoting, to
# quote any malicious characters/escaping. # quote any malicious characters/escaping.
# See http://cyberelk.net/tim/articles/cmdline/ar01s02.html # See http://cyberelk.net/tim/articles/cmdline/ar01s02.html
os.environ['djangocompilemo'] = pf + '.mo' os.environ['djangocompilemo'] = npath(pf + '.mo')
os.environ['djangocompilepo'] = pf + '.po' os.environ['djangocompilepo'] = npath(pf + '.po')
if sys.platform == 'win32': # Different shell-variable syntax if sys.platform == 'win32': # Different shell-variable syntax
cmd = 'msgfmt --check-format -o "%djangocompilemo%" "%djangocompilepo%"' cmd = 'msgfmt --check-format -o "%djangocompilemo%" "%djangocompilepo%"'
else: else:

View File

@ -13,6 +13,7 @@ from django.db import (connections, router, transaction, DEFAULT_DB_ALIAS,
IntegrityError, DatabaseError) IntegrityError, DatabaseError)
from django.db.models import get_apps from django.db.models import get_apps
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils._os import upath
from itertools import product from itertools import product
try: try:
@ -97,10 +98,10 @@ class Command(BaseCommand):
if hasattr(app, '__path__'): if hasattr(app, '__path__'):
# It's a 'models/' subpackage # It's a 'models/' subpackage
for path in app.__path__: for path in app.__path__:
app_module_paths.append(path) app_module_paths.append(upath(path))
else: else:
# It's a models.py module # It's a models.py module
app_module_paths.append(app.__file__) app_module_paths.append(upath(app.__file__))
app_fixtures = [os.path.join(os.path.dirname(path), 'fixtures') for path in app_module_paths] app_fixtures = [os.path.join(os.path.dirname(path), 'fixtures') for path in app_module_paths]

View File

@ -301,7 +301,7 @@ def make_messages(locale=None, domain='django', verbosity=1, all=False,
locales = [] locales = []
if locale is not None: if locale is not None:
locales.append(locale) locales.append(str(locale))
elif all: elif all:
locale_dirs = filter(os.path.isdir, glob.glob('%s/*' % localedir)) locale_dirs = filter(os.path.isdir, glob.glob('%s/*' % localedir))
locales = [os.path.basename(l) for l in locale_dirs] locales = [os.path.basename(l) for l in locale_dirs]
@ -316,8 +316,8 @@ def make_messages(locale=None, domain='django', verbosity=1, all=False,
if not os.path.isdir(basedir): if not os.path.isdir(basedir):
os.makedirs(basedir) os.makedirs(basedir)
pofile = os.path.join(basedir, '%s.po' % domain) pofile = os.path.join(basedir, '%s.po' % str(domain))
potfile = os.path.join(basedir, '%s.pot' % domain) potfile = os.path.join(basedir, '%s.pot' % str(domain))
if os.path.exists(potfile): if os.path.exists(potfile):
os.unlink(potfile) os.unlink(potfile)

View File

@ -8,6 +8,7 @@ from django.conf import settings
from django.core.management.base import CommandError from django.core.management.base import CommandError
from django.db import models from django.db import models
from django.db.models import get_models from django.db.models import get_models
from django.utils._os import upath
def sql_create(app, style, connection): def sql_create(app, style, connection):
@ -159,7 +160,7 @@ def _split_statements(content):
def custom_sql_for_model(model, style, connection): def custom_sql_for_model(model, style, connection):
opts = model._meta opts = model._meta
app_dir = os.path.normpath(os.path.join(os.path.dirname(models.get_app(model._meta.app_label).__file__), 'sql')) app_dir = os.path.normpath(os.path.join(os.path.dirname(upath(models.get_app(model._meta.app_label).__file__)), 'sql'))
output = [] output = []
# Post-creation SQL should come before any initial SQL data is loaded. # Post-creation SQL should come before any initial SQL data is loaded.

View File

@ -251,9 +251,9 @@ class RegexURLResolver(LocaleRegexProvider):
urlconf_repr = '<%s list>' % self.urlconf_name[0].__class__.__name__ urlconf_repr = '<%s list>' % self.urlconf_name[0].__class__.__name__
else: else:
urlconf_repr = repr(self.urlconf_name) urlconf_repr = repr(self.urlconf_name)
return force_str('<%s %s (%s:%s) %s>' % ( return str('<%s %s (%s:%s) %s>') % (
self.__class__.__name__, urlconf_repr, self.app_name, self.__class__.__name__, urlconf_repr, self.app_name,
self.namespace, self.regex.pattern)) self.namespace, self.regex.pattern)
def _populate(self): def _populate(self):
lookups = MultiValueDict() lookups = MultiValueDict()

View File

@ -5,6 +5,7 @@ from django.core.exceptions import ImproperlyConfigured
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.module_loading import module_has_submodule from django.utils.module_loading import module_has_submodule
from django.utils._os import upath
from django.utils import six from django.utils import six
import imp import imp
@ -244,8 +245,8 @@ class AppCache(object):
# The same model may be imported via different paths (e.g. # The same model may be imported via different paths (e.g.
# appname.models and project.appname.models). We use the source # appname.models and project.appname.models). We use the source
# filename as a means to detect identity. # filename as a means to detect identity.
fname1 = os.path.abspath(sys.modules[model.__module__].__file__) fname1 = os.path.abspath(upath(sys.modules[model.__module__].__file__))
fname2 = os.path.abspath(sys.modules[model_dict[model_name].__module__].__file__) fname2 = os.path.abspath(upath(sys.modules[model_dict[model_name].__module__].__file__))
# Since the filename extension could be .py the first time and # Since the filename extension could be .py the first time and
# .pyc or .pyo the second time, ignore the extension when # .pyc or .pyo the second time, ignore the extension when
# comparing. # comparing.

View File

@ -5,6 +5,7 @@ from threading import local
from django.conf import settings from django.conf import settings
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils._os import upath
from django.utils import six from django.utils import six
@ -27,7 +28,7 @@ def load_backend(backend_name):
except ImportError as e_user: except ImportError as e_user:
# The database backend wasn't found. Display a helpful error message # The database backend wasn't found. Display a helpful error message
# listing all possible (built-in) database backends. # listing all possible (built-in) database backends.
backend_dir = os.path.join(os.path.dirname(__file__), 'backends') backend_dir = os.path.join(os.path.dirname(upath(__file__)), 'backends')
try: try:
builtin_backends = [ builtin_backends = [
name for _, name, ispkg in pkgutil.iter_modules([backend_dir]) name for _, name, ispkg in pkgutil.iter_modules([backend_dir])

View File

@ -1,6 +1,8 @@
import os import os
import stat import stat
import sys
from os.path import join, normcase, normpath, abspath, isabs, sep, dirname from os.path import join, normcase, normpath, abspath, isabs, sep, dirname
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils import six from django.utils import six
@ -10,6 +12,9 @@ except NameError:
class WindowsError(Exception): class WindowsError(Exception):
pass pass
if not six.PY3:
fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
# Under Python 2, define our own abspath function that can handle joining # Under Python 2, define our own abspath function that can handle joining
# unicode paths to a current working directory that has non-ASCII characters # unicode paths to a current working directory that has non-ASCII characters
@ -29,6 +34,23 @@ else:
path = join(os.getcwdu(), path) path = join(os.getcwdu(), path)
return normpath(path) return normpath(path)
def upath(path):
"""
Always return a unicode path.
"""
if not six.PY3:
return path.decode(fs_encoding)
return path
def npath(path):
"""
Always return a native path, that is unicode on Python 3 and bytestring on
Python 2.
"""
if not six.PY3 and not isinstance(path, bytes):
return path.encode(fs_encoding)
return path
def safe_join(base, *paths): def safe_join(base, *paths):
""" """
Joins one or more path components to the base path component intelligently. Joins one or more path components to the base path component intelligently.
@ -74,4 +96,3 @@ def rmtree_errorhandler(func, path, exc_info):
os.chmod(path, stat.S_IWRITE) os.chmod(path, stat.S_IWRITE)
# use the original function to repeat the operation # use the original function to repeat the operation
func(path) func(path)

View File

@ -10,6 +10,7 @@ from threading import local
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.encoding import force_str, force_text from django.utils.encoding import force_str, force_text
from django.utils._os import upath
from django.utils.safestring import mark_safe, SafeData from django.utils.safestring import mark_safe, SafeData
from django.utils import six from django.utils import six
from django.utils.six import StringIO from django.utils.six import StringIO
@ -109,7 +110,7 @@ def translation(language):
from django.conf import settings from django.conf import settings
globalpath = os.path.join(os.path.dirname(sys.modules[settings.__module__].__file__), 'locale') globalpath = os.path.join(os.path.dirname(upath(sys.modules[settings.__module__].__file__)), 'locale')
def _fetch(lang, fallback=None): def _fetch(lang, fallback=None):
@ -151,7 +152,7 @@ def translation(language):
for appname in reversed(settings.INSTALLED_APPS): for appname in reversed(settings.INSTALLED_APPS):
app = import_module(appname) app = import_module(appname)
apppath = os.path.join(os.path.dirname(app.__file__), 'locale') apppath = os.path.join(os.path.dirname(upath(app.__file__)), 'locale')
if os.path.isdir(apppath): if os.path.isdir(apppath):
res = _merge(apppath) res = _merge(apppath)
@ -337,7 +338,7 @@ def all_locale_paths():
""" """
from django.conf import settings from django.conf import settings
globalpath = os.path.join( globalpath = os.path.join(
os.path.dirname(sys.modules[settings.__module__].__file__), 'locale') os.path.dirname(upath(sys.modules[settings.__module__].__file__)), 'locale')
return [globalpath] + list(settings.LOCALE_PATHS) return [globalpath] + list(settings.LOCALE_PATHS)
def check_for_language(lang_code): def check_for_language(lang_code):

View File

@ -8,6 +8,7 @@ from django.utils.translation import check_for_language, activate, to_locale, ge
from django.utils.text import javascript_quote from django.utils.text import javascript_quote
from django.utils.encoding import smart_text from django.utils.encoding import smart_text
from django.utils.formats import get_format_modules, get_format from django.utils.formats import get_format_modules, get_format
from django.utils._os import upath
from django.utils import six from django.utils import six
def set_language(request): def set_language(request):
@ -197,7 +198,7 @@ def javascript_catalog(request, domain='djangojs', packages=None):
# paths of requested packages # paths of requested packages
for package in packages: for package in packages:
p = importlib.import_module(package) p = importlib.import_module(package)
path = os.path.join(os.path.dirname(p.__file__), 'locale') path = os.path.join(os.path.dirname(upath(p.__file__)), 'locale')
paths.append(path) paths.append(path)
# add the filesystem paths listed in the LOCALE_PATHS setting # add the filesystem paths listed in the LOCALE_PATHS setting
paths.extend(list(reversed(settings.LOCALE_PATHS))) paths.extend(list(reversed(settings.LOCALE_PATHS)))

View File

@ -226,9 +226,9 @@ class FixtureLoadingTests(TestCase):
def test_ambiguous_compressed_fixture(self): def test_ambiguous_compressed_fixture(self):
# The name "fixture5" is ambigous, so loading it will raise an error # The name "fixture5" is ambigous, so loading it will raise an error
with six.assertRaisesRegex(self, management.CommandError, with self.assertRaises(management.CommandError) as cm:
"Multiple fixtures named 'fixture5'"):
management.call_command('loaddata', 'fixture5', verbosity=0, commit=False) management.call_command('loaddata', 'fixture5', verbosity=0, commit=False)
self.assertIn("Multiple fixtures named 'fixture5'", cm.exception.args[0])
def test_db_loading(self): def test_db_loading(self):
# Load db fixtures 1 and 2. These will load using the 'default' database identifier implicitly # Load db fixtures 1 and 2. These will load using the 'default' database identifier implicitly
@ -250,9 +250,9 @@ class FixtureLoadingTests(TestCase):
# is closed at the end of each test. # is closed at the end of each test.
if connection.vendor == 'mysql': if connection.vendor == 'mysql':
connection.cursor().execute("SET sql_mode = 'TRADITIONAL'") connection.cursor().execute("SET sql_mode = 'TRADITIONAL'")
with six.assertRaisesRegex(self, IntegrityError, with self.assertRaises(IntegrityError) as cm:
"Could not load fixtures.Article\(pk=1\): .*$"):
management.call_command('loaddata', 'invalid.json', verbosity=0, commit=False) management.call_command('loaddata', 'invalid.json', verbosity=0, commit=False)
self.assertIn("Could not load fixtures.Article(pk=1):", cm.exception.args[0])
def test_loading_using(self): def test_loading_using(self):
# Load db fixtures 1 and 2. These will load using the 'default' database identifier explicitly # Load db fixtures 1 and 2. These will load using the 'default' database identifier explicitly
@ -308,9 +308,9 @@ class FixtureTransactionTests(TransactionTestCase):
# Try to load fixture 2 using format discovery; this will fail # Try to load fixture 2 using format discovery; this will fail
# because there are two fixture2's in the fixtures directory # because there are two fixture2's in the fixtures directory
with six.assertRaisesRegex(self, management.CommandError, with self.assertRaises(management.CommandError) as cm:
"Multiple fixtures named 'fixture2'"):
management.call_command('loaddata', 'fixture2', verbosity=0) management.call_command('loaddata', 'fixture2', verbosity=0)
self.assertIn("Multiple fixtures named 'fixture2'", cm.exception.args[0])
# object list is unaffected # object list is unaffected
self.assertQuerysetEqual(Article.objects.all(), [ self.assertQuerysetEqual(Article.objects.all(), [

View File

@ -10,6 +10,7 @@ from django.core.validators import ValidationError
from django.db import connection from django.db import connection
from django.db.models.query import EmptyQuerySet from django.db.models.query import EmptyQuerySet
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
from django.utils._os import upath
from django.utils.unittest import skipUnless from django.utils.unittest import skipUnless
from django.test import TestCase from django.test import TestCase
from django.utils import six from django.utils import six
@ -1282,9 +1283,9 @@ class OldFormForXTests(TestCase):
# it comes to validation. This specifically tests that #6302 is fixed for # it comes to validation. This specifically tests that #6302 is fixed for
# both file fields and image fields. # both file fields and image fields.
with open(os.path.join(os.path.dirname(__file__), "test.png"), 'rb') as fp: with open(os.path.join(os.path.dirname(upath(__file__)), "test.png"), 'rb') as fp:
image_data = fp.read() image_data = fp.read()
with open(os.path.join(os.path.dirname(__file__), "test2.png"), 'rb') as fp: with open(os.path.join(os.path.dirname(upath(__file__)), "test2.png"), 'rb') as fp:
image_data2 = fp.read() image_data2 = fp.read()
f = ImageFileForm( f = ImageFileForm(

View File

@ -8,6 +8,7 @@ from django.core.management import call_command
from django.db.models.loading import cache, load_app from django.db.models.loading import cache, load_app
from django.test import TestCase, TransactionTestCase from django.test import TestCase, TransactionTestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils._os import upath
from .models import (ConcreteModel, ConcreteModelSubclass, from .models import (ConcreteModel, ConcreteModelSubclass,
ConcreteModelSubclassProxy) ConcreteModelSubclassProxy)
@ -23,7 +24,7 @@ class ProxyModelInheritanceTests(TransactionTestCase):
def setUp(self): def setUp(self):
self.old_sys_path = sys.path[:] self.old_sys_path = sys.path[:]
sys.path.append(os.path.dirname(os.path.abspath(__file__))) sys.path.append(os.path.dirname(os.path.abspath(upath(__file__))))
for app in settings.INSTALLED_APPS: for app in settings.INSTALLED_APPS:
load_app(app) load_app(app)

View File

@ -19,13 +19,15 @@ from django.conf import settings
from django.db import connection from django.db import connection
from django.test.simple import DjangoTestSuiteRunner from django.test.simple import DjangoTestSuiteRunner
from django.utils import unittest from django.utils import unittest
from django.utils.encoding import force_str, force_text
from django.utils._os import upath
from django.test import LiveServerTestCase from django.test import LiveServerTestCase
test_dir = os.path.dirname(os.path.dirname(__file__)) test_dir = os.path.dirname(os.path.dirname(upath(__file__)))
class AdminScriptTestCase(unittest.TestCase): class AdminScriptTestCase(unittest.TestCase):
def write_settings(self, filename, apps=None, is_dir=False, sdict=None): def write_settings(self, filename, apps=None, is_dir=False, sdict=None):
test_dir = os.path.dirname(os.path.dirname(__file__)) test_dir = os.path.dirname(os.path.dirname(upath(__file__)))
if is_dir: if is_dir:
settings_dir = os.path.join(test_dir, filename) settings_dir = os.path.join(test_dir, filename)
os.mkdir(settings_dir) os.mkdir(settings_dir)
@ -94,6 +96,7 @@ class AdminScriptTestCase(unittest.TestCase):
return paths return paths
def run_test(self, script, args, settings_file=None, apps=None): def run_test(self, script, args, settings_file=None, apps=None):
test_dir = os.path.dirname(os.path.dirname(__file__))
project_dir = os.path.dirname(test_dir) project_dir = os.path.dirname(test_dir)
base_dir = os.path.dirname(project_dir) base_dir = os.path.dirname(project_dir)
ext_backend_base_dirs = self._ext_backend_paths() ext_backend_base_dirs = self._ext_backend_paths()
@ -134,7 +137,7 @@ class AdminScriptTestCase(unittest.TestCase):
return out, err return out, err
def run_django_admin(self, args, settings_file=None): def run_django_admin(self, args, settings_file=None):
bin_dir = os.path.abspath(os.path.dirname(bin.__file__)) bin_dir = os.path.abspath(os.path.dirname(upath(bin.__file__)))
return self.run_test(os.path.join(bin_dir, 'django-admin.py'), args, settings_file) return self.run_test(os.path.join(bin_dir, 'django-admin.py'), args, settings_file)
def run_manage(self, args, settings_file=None): def run_manage(self, args, settings_file=None):
@ -144,7 +147,7 @@ class AdminScriptTestCase(unittest.TestCase):
except OSError: except OSError:
pass pass
conf_dir = os.path.dirname(conf.__file__) conf_dir = os.path.dirname(upath(conf.__file__))
template_manage_py = os.path.join(conf_dir, 'project_template', 'manage.py') template_manage_py = os.path.join(conf_dir, 'project_template', 'manage.py')
test_manage_py = os.path.join(test_dir, 'manage.py') test_manage_py = os.path.join(test_dir, 'manage.py')
@ -166,10 +169,12 @@ class AdminScriptTestCase(unittest.TestCase):
def assertOutput(self, stream, msg): def assertOutput(self, stream, msg):
"Utility assertion: assert that the given message exists in the output" "Utility assertion: assert that the given message exists in the output"
stream = force_text(stream)
self.assertTrue(msg in stream, "'%s' does not match actual output text '%s'" % (msg, stream)) self.assertTrue(msg in stream, "'%s' does not match actual output text '%s'" % (msg, stream))
def assertNotInOutput(self, stream, msg): def assertNotInOutput(self, stream, msg):
"Utility assertion: assert that the given message doesn't exist in the output" "Utility assertion: assert that the given message doesn't exist in the output"
stream = force_text(stream)
self.assertFalse(msg in stream, "'%s' matches actual output text '%s'" % (msg, stream)) self.assertFalse(msg in stream, "'%s' matches actual output text '%s'" % (msg, stream))
########################################################################## ##########################################################################
@ -1553,7 +1558,7 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase):
self.assertNoOutput(err) self.assertNoOutput(err)
test_manage_py = os.path.join(testproject_dir, 'manage.py') test_manage_py = os.path.join(testproject_dir, 'manage.py')
with open(test_manage_py, 'r') as fp: with open(test_manage_py, 'r') as fp:
content = fp.read() content = force_text(fp.read())
self.assertIn("project_name = 'another_project'", content) self.assertIn("project_name = 'another_project'", content)
self.assertIn("project_directory = '%s'" % testproject_dir, content) self.assertIn("project_directory = '%s'" % testproject_dir, content)

View File

@ -1,7 +1,8 @@
import os import os
from django.conf.urls import patterns from django.conf.urls import patterns
from django.utils._os import upath
here = os.path.dirname(__file__) here = os.path.dirname(upath(__file__))
urlpatterns = patterns('', urlpatterns = patterns('',
(r'^custom_templates/(?P<path>.*)$', 'django.views.static.serve', { (r'^custom_templates/(?P<path>.*)$', 'django.views.static.serve', {

View File

@ -33,6 +33,7 @@ from django.utils.cache import get_max_age
from django.utils.encoding import iri_to_uri, force_bytes from django.utils.encoding import iri_to_uri, force_bytes
from django.utils.html import escape from django.utils.html import escape
from django.utils.http import urlencode from django.utils.http import urlencode
from django.utils._os import upath
from django.utils import six from django.utils import six
from django.test.utils import override_settings from django.test.utils import override_settings
@ -633,7 +634,7 @@ class AdminViewFormUrlTest(TestCase):
Refs #17515. Refs #17515.
""" """
template_dirs = settings.TEMPLATE_DIRS + ( template_dirs = settings.TEMPLATE_DIRS + (
os.path.join(os.path.dirname(__file__), 'templates'),) os.path.join(os.path.dirname(upath(__file__)), 'templates'),)
with self.settings(TEMPLATE_DIRS=template_dirs): with self.settings(TEMPLATE_DIRS=template_dirs):
response = self.client.get("/test_admin/admin/admin_views/color2/") response = self.client.get("/test_admin/admin/admin_views/color2/")
self.assertTrue('custom_filter_template.html' in [t.name for t in response.templates]) self.assertTrue('custom_filter_template.html' in [t.name for t in response.templates])

View File

@ -7,13 +7,14 @@ import time
from django.conf import Settings from django.conf import Settings
from django.db.models.loading import cache, load_app, get_model, get_models from django.db.models.loading import cache, load_app, get_model, get_models
from django.utils._os import upath
from django.utils.unittest import TestCase from django.utils.unittest import TestCase
class EggLoadingTest(TestCase): class EggLoadingTest(TestCase):
def setUp(self): def setUp(self):
self.old_path = sys.path[:] self.old_path = sys.path[:]
self.egg_dir = '%s/eggs' % os.path.dirname(__file__) self.egg_dir = '%s/eggs' % os.path.dirname(upath(__file__))
# This test adds dummy applications to the app cache. These # This test adds dummy applications to the app cache. These
# need to be removed in order to prevent bad interactions # need to be removed in order to prevent bad interactions

View File

@ -11,6 +11,7 @@ import shutil
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.utils import unittest from django.utils import unittest
from django.utils._os import upath
from .models import Photo, PhotoForm, temp_storage_dir from .models import Photo, PhotoForm, temp_storage_dir
@ -23,7 +24,7 @@ class Bug639Test(unittest.TestCase):
called. called.
""" """
# Grab an image for testing. # Grab an image for testing.
filename = os.path.join(os.path.dirname(__file__), "test.jpg") filename = os.path.join(os.path.dirname(upath(__file__)), "test.jpg")
with open(filename, "rb") as fp: with open(filename, "rb") as fp:
img = fp.read() img = fp.read()

View File

@ -24,6 +24,7 @@ from django.core.files.uploadedfile import UploadedFile
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.utils import six from django.utils import six
from django.utils import unittest from django.utils import unittest
from django.utils._os import upath
from django.test.utils import override_settings from django.test.utils import override_settings
from ..servers.tests import LiveServerBase from ..servers.tests import LiveServerBase
@ -104,7 +105,7 @@ class FileStorageTests(unittest.TestCase):
""" """
storage = self.storage_class(location='') storage = self.storage_class(location='')
self.assertEqual(storage.base_location, '') self.assertEqual(storage.base_location, '')
self.assertEqual(storage.location, os.getcwd()) self.assertEqual(storage.location, upath(os.getcwd()))
def test_file_access_options(self): def test_file_access_options(self):
""" """
@ -534,7 +535,7 @@ class DimensionClosingBug(unittest.TestCase):
from django.core.files import images from django.core.files import images
images.open = catching_open images.open = catching_open
try: try:
get_image_dimensions(os.path.join(os.path.dirname(__file__), "test1.png")) get_image_dimensions(os.path.join(os.path.dirname(upath(__file__)), "test1.png"))
finally: finally:
del images.open del images.open
self.assertTrue(FileWrapper._closed) self.assertTrue(FileWrapper._closed)
@ -551,7 +552,7 @@ class InconsistentGetImageDimensionsBug(unittest.TestCase):
""" """
from django.core.files.images import ImageFile from django.core.files.images import ImageFile
img_path = os.path.join(os.path.dirname(__file__), "test.png") img_path = os.path.join(os.path.dirname(upath(__file__)), "test.png")
image = ImageFile(open(img_path, 'rb')) image = ImageFile(open(img_path, 'rb'))
image_pil = Image.open(img_path) image_pil = Image.open(img_path)
size_1, size_2 = get_image_dimensions(image), get_image_dimensions(image) size_1, size_2 = get_image_dimensions(image), get_image_dimensions(image)

View File

@ -14,6 +14,8 @@ from django.db.models import signals
from django.test import (TestCase, TransactionTestCase, skipIfDBFeature, from django.test import (TestCase, TransactionTestCase, skipIfDBFeature,
skipUnlessDBFeature) skipUnlessDBFeature)
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.encoding import force_text
from django.utils._os import upath
from django.utils import six from django.utils import six
from django.utils.six import PY3, StringIO from django.utils.six import PY3, StringIO
@ -126,7 +128,7 @@ class TestFixtures(TestCase):
fixture directory. fixture directory.
""" """
load_absolute_path = os.path.join( load_absolute_path = os.path.join(
os.path.dirname(__file__), os.path.dirname(upath(__file__)),
'fixtures', 'fixtures',
'absolute.json' 'absolute.json'
) )
@ -388,7 +390,7 @@ class TestFixtures(TestCase):
commit=False, commit=False,
) )
_cur_dir = os.path.dirname(os.path.abspath(__file__)) _cur_dir = os.path.dirname(os.path.abspath(upath(__file__)))
@override_settings(FIXTURE_DIRS=[os.path.join(_cur_dir, 'fixtures_1'), @override_settings(FIXTURE_DIRS=[os.path.join(_cur_dir, 'fixtures_1'),
os.path.join(_cur_dir, 'fixtures_2')]) os.path.join(_cur_dir, 'fixtures_2')])
@ -430,7 +432,7 @@ class TestFixtures(TestCase):
stdout=stdout_output, stdout=stdout_output,
) )
self.assertTrue("No xml fixture 'this_fixture_doesnt_exist' in" in self.assertTrue("No xml fixture 'this_fixture_doesnt_exist' in" in
stdout_output.getvalue()) force_text(stdout_output.getvalue()))
class NaturalKeyFixtureTests(TestCase): class NaturalKeyFixtureTests(TestCase):

View File

@ -36,6 +36,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile
from django.forms import * from django.forms import *
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.utils import six from django.utils import six
from django.utils._os import upath
def fix_os_paths(x): def fix_os_paths(x):
@ -928,12 +929,12 @@ class FieldsTests(SimpleTestCase):
# FilePathField ############################################################### # FilePathField ###############################################################
def test_filepathfield_1(self): def test_filepathfield_1(self):
path = os.path.abspath(forms.__file__) path = os.path.abspath(upath(forms.__file__))
path = os.path.dirname(path) + '/' path = os.path.dirname(path) + '/'
self.assertTrue(fix_os_paths(path).endswith('/django/forms/')) self.assertTrue(fix_os_paths(path).endswith('/django/forms/'))
def test_filepathfield_2(self): def test_filepathfield_2(self):
path = forms.__file__ path = upath(forms.__file__)
path = os.path.dirname(os.path.abspath(path)) + '/' path = os.path.dirname(os.path.abspath(path)) + '/'
f = FilePathField(path=path) f = FilePathField(path=path)
f.choices = [p for p in f.choices if p[0].endswith('.py')] f.choices = [p for p in f.choices if p[0].endswith('.py')]
@ -954,7 +955,7 @@ class FieldsTests(SimpleTestCase):
assert fix_os_paths(f.clean(path + 'fields.py')).endswith('/django/forms/fields.py') assert fix_os_paths(f.clean(path + 'fields.py')).endswith('/django/forms/fields.py')
def test_filepathfield_3(self): def test_filepathfield_3(self):
path = forms.__file__ path = upath(forms.__file__)
path = os.path.dirname(os.path.abspath(path)) + '/' path = os.path.dirname(os.path.abspath(path)) + '/'
f = FilePathField(path=path, match='^.*?\.py$') f = FilePathField(path=path, match='^.*?\.py$')
f.choices.sort() f.choices.sort()
@ -972,7 +973,7 @@ class FieldsTests(SimpleTestCase):
self.assertTrue(got[0].endswith(exp[0])) self.assertTrue(got[0].endswith(exp[0]))
def test_filepathfield_4(self): def test_filepathfield_4(self):
path = os.path.abspath(forms.__file__) path = os.path.abspath(upath(forms.__file__))
path = os.path.dirname(path) + '/' path = os.path.dirname(path) + '/'
f = FilePathField(path=path, recursive=True, match='^.*?\.py$') f = FilePathField(path=path, recursive=True, match='^.*?\.py$')
f.choices.sort() f.choices.sort()
@ -992,7 +993,7 @@ class FieldsTests(SimpleTestCase):
self.assertTrue(got[0].endswith(exp[0])) self.assertTrue(got[0].endswith(exp[0]))
def test_filepathfield_folders(self): def test_filepathfield_folders(self):
path = os.path.dirname(__file__) + '/filepath_test_files/' path = os.path.dirname(upath(__file__)) + '/filepath_test_files/'
f = FilePathField(path=path, allow_folders=True, allow_files=False) f = FilePathField(path=path, allow_folders=True, allow_files=False)
f.choices.sort() f.choices.sort()
expected = [ expected = [

View File

@ -14,6 +14,7 @@ from django.http import (QueryDict, HttpResponse, HttpResponseRedirect,
parse_cookie) parse_cookie)
from django.test import TestCase from django.test import TestCase
from django.utils.encoding import smart_str from django.utils.encoding import smart_str
from django.utils._os import upath
from django.utils import six from django.utils import six
from django.utils import unittest from django.utils import unittest
@ -483,7 +484,7 @@ class StreamingHttpResponseTests(TestCase):
class FileCloseTests(TestCase): class FileCloseTests(TestCase):
def test_response(self): def test_response(self):
filename = os.path.join(os.path.dirname(__file__), 'abc.txt') filename = os.path.join(os.path.dirname(upath(__file__)), 'abc.txt')
# file isn't closed until we close the response. # file isn't closed until we close the response.
file1 = open(filename) file1 = open(filename)
@ -516,7 +517,7 @@ class FileCloseTests(TestCase):
self.assertTrue(file2.closed) self.assertTrue(file2.closed)
def test_streaming_response(self): def test_streaming_response(self):
filename = os.path.join(os.path.dirname(__file__), 'abc.txt') filename = os.path.join(os.path.dirname(upath(__file__)), 'abc.txt')
# file isn't closed until we close the response. # file isn't closed until we close the response.
file1 = open(filename) file1 = open(filename)

View File

@ -4,9 +4,10 @@ from django.core.management import call_command, CommandError
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils import translation, six from django.utils import translation, six
from django.utils._os import upath
from django.utils.six import StringIO from django.utils.six import StringIO
test_dir = os.path.abspath(os.path.dirname(__file__)) test_dir = os.path.abspath(os.path.dirname(upath(__file__)))
class MessageCompilationTests(TestCase): class MessageCompilationTests(TestCase):
@ -25,9 +26,9 @@ class PoFileTests(MessageCompilationTests):
def test_bom_rejection(self): def test_bom_rejection(self):
os.chdir(test_dir) os.chdir(test_dir)
with six.assertRaisesRegex(self, CommandError, with self.assertRaises(CommandError) as cm:
"file has a BOM \(Byte Order Mark\)"):
call_command('compilemessages', locale=self.LOCALE, stderr=StringIO()) call_command('compilemessages', locale=self.LOCALE, stderr=StringIO())
self.assertIn("file has a BOM (Byte Order Mark)", cm.exception.args[0])
self.assertFalse(os.path.exists(self.MO_FILE)) self.assertFalse(os.path.exists(self.MO_FILE))

View File

@ -1,4 +1,5 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
from __future__ import unicode_literals
import os import os
import re import re
@ -6,6 +7,8 @@ import shutil
from django.core import management from django.core import management
from django.test import TestCase from django.test import TestCase
from django.utils.encoding import force_text
from django.utils._os import upath
from django.utils.six import StringIO from django.utils.six import StringIO
@ -17,7 +20,7 @@ class ExtractorTests(TestCase):
def setUp(self): def setUp(self):
self._cwd = os.getcwd() self._cwd = os.getcwd()
self.test_dir = os.path.abspath(os.path.dirname(__file__)) self.test_dir = os.path.abspath(os.path.dirname(upath(__file__)))
def _rmrf(self, dname): def _rmrf(self, dname):
if os.path.commonprefix([self.test_dir, os.path.abspath(dname)]) != self.test_dir: if os.path.commonprefix([self.test_dir, os.path.abspath(dname)]) != self.test_dir:
@ -55,7 +58,7 @@ class BasicExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0) management.call_command('makemessages', locale=LOCALE, verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
self.assertTrue('#. Translators: This comment should be extracted' in po_contents) self.assertTrue('#. Translators: This comment should be extracted' in po_contents)
self.assertTrue('This comment should not be extracted' not in po_contents) self.assertTrue('This comment should not be extracted' not in po_contents)
# Comments in templates # Comments in templates
@ -83,7 +86,7 @@ class BasicExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0) management.call_command('makemessages', locale=LOCALE, verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
self.assertMsgId('Literal with a percent symbol at the end %%', po_contents) self.assertMsgId('Literal with a percent symbol at the end %%', po_contents)
self.assertMsgId('Literal with a percent %% symbol in the middle', po_contents) self.assertMsgId('Literal with a percent %% symbol in the middle', po_contents)
self.assertMsgId('Completed 50%% of all the tasks', po_contents) self.assertMsgId('Completed 50%% of all the tasks', po_contents)
@ -99,7 +102,7 @@ class BasicExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0) management.call_command('makemessages', locale=LOCALE, verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
self.assertMsgId('I think that 100%% is more that 50%% of anything.', po_contents) self.assertMsgId('I think that 100%% is more that 50%% of anything.', po_contents)
self.assertMsgId('I think that 100%% is more that 50%% of %(obj)s.', po_contents) self.assertMsgId('I think that 100%% is more that 50%% of %(obj)s.', po_contents)
self.assertMsgId("Blocktrans extraction shouldn't double escape this: %%, a=%(a)s", po_contents) self.assertMsgId("Blocktrans extraction shouldn't double escape this: %%, a=%(a)s", po_contents)
@ -123,7 +126,7 @@ class BasicExtractorTests(ExtractorTests):
stdout = StringIO() stdout = StringIO()
management.call_command('makemessages', locale=LOCALE, stdout=stdout) management.call_command('makemessages', locale=LOCALE, stdout=stdout)
os.remove('./code_sample.py') os.remove('./code_sample.py')
self.assertIn("code_sample.py:4", stdout.getvalue()) self.assertIn("code_sample.py:4", force_text(stdout.getvalue()))
def test_template_message_context_extractor(self): def test_template_message_context_extractor(self):
""" """
@ -135,7 +138,7 @@ class BasicExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0) management.call_command('makemessages', locale=LOCALE, verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
# {% trans %} # {% trans %}
self.assertTrue('msgctxt "Special trans context #1"' in po_contents) self.assertTrue('msgctxt "Special trans context #1"' in po_contents)
self.assertTrue("Translatable literal #7a" in po_contents) self.assertTrue("Translatable literal #7a" in po_contents)
@ -161,7 +164,7 @@ class BasicExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0) management.call_command('makemessages', locale=LOCALE, verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
# {% trans %} # {% trans %}
self.assertTrue('msgctxt "Context wrapped in double quotes"' in po_contents) self.assertTrue('msgctxt "Context wrapped in double quotes"' in po_contents)
self.assertTrue('msgctxt "Context wrapped in single quotes"' in po_contents) self.assertTrue('msgctxt "Context wrapped in single quotes"' in po_contents)
@ -216,7 +219,7 @@ class SymlinkExtractorTests(ExtractorTests):
def setUp(self): def setUp(self):
self._cwd = os.getcwd() self._cwd = os.getcwd()
self.test_dir = os.path.abspath(os.path.dirname(__file__)) self.test_dir = os.path.abspath(os.path.dirname(upath(__file__)))
self.symlinked_dir = os.path.join(self.test_dir, 'templates_symlinked') self.symlinked_dir = os.path.join(self.test_dir, 'templates_symlinked')
def tearDown(self): def tearDown(self):
@ -238,7 +241,7 @@ class SymlinkExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0, symlinks=True) management.call_command('makemessages', locale=LOCALE, verbosity=0, symlinks=True)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
self.assertMsgId('This literal should be included.', po_contents) self.assertMsgId('This literal should be included.', po_contents)
self.assertTrue('templates_symlinked/test.html' in po_contents) self.assertTrue('templates_symlinked/test.html' in po_contents)
@ -250,7 +253,7 @@ class CopyPluralFormsExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0) management.call_command('makemessages', locale=LOCALE, verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
self.assertTrue('Plural-Forms: nplurals=2; plural=(n != 1)' in po_contents) self.assertTrue('Plural-Forms: nplurals=2; plural=(n != 1)' in po_contents)
@ -261,7 +264,7 @@ class NoWrapExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0, no_wrap=True) management.call_command('makemessages', locale=LOCALE, verbosity=0, no_wrap=True)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
self.assertMsgId('This literal should also be included wrapped or not wrapped depending on the use of the --no-wrap option.', po_contents) self.assertMsgId('This literal should also be included wrapped or not wrapped depending on the use of the --no-wrap option.', po_contents)
def test_no_wrap_disabled(self): def test_no_wrap_disabled(self):
@ -269,7 +272,7 @@ class NoWrapExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0, no_wrap=False) management.call_command('makemessages', locale=LOCALE, verbosity=0, no_wrap=False)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
self.assertMsgId('""\n"This literal should also be included wrapped or not wrapped depending on the "\n"use of the --no-wrap option."', po_contents, use_quotes=False) self.assertMsgId('""\n"This literal should also be included wrapped or not wrapped depending on the "\n"use of the --no-wrap option."', po_contents, use_quotes=False)
@ -280,7 +283,7 @@ class NoLocationExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0, no_location=True) management.call_command('makemessages', locale=LOCALE, verbosity=0, no_location=True)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
self.assertFalse('#: templates/test.html:55' in po_contents) self.assertFalse('#: templates/test.html:55' in po_contents)
def test_no_location_disabled(self): def test_no_location_disabled(self):
@ -288,5 +291,5 @@ class NoLocationExtractorTests(ExtractorTests):
management.call_command('makemessages', locale=LOCALE, verbosity=0, no_location=False) management.call_command('makemessages', locale=LOCALE, verbosity=0, no_location=False)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with open(self.PO_FILE, 'r') as fp:
po_contents = fp.read() po_contents = force_text(fp.read())
self.assertTrue('#: templates/test.html:55' in po_contents) self.assertTrue('#: templates/test.html:55' in po_contents)

View File

@ -6,6 +6,7 @@ import os
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils._os import upath
from django.utils import six from django.utils import six
from django.utils import translation from django.utils import translation
@ -13,7 +14,7 @@ from django.utils import translation
@override_settings( @override_settings(
USE_I18N=True, USE_I18N=True,
LOCALE_PATHS=( LOCALE_PATHS=(
os.path.join(os.path.dirname(__file__), 'locale'), os.path.join(os.path.dirname(upath(__file__)), 'locale'),
), ),
LANGUAGE_CODE='en', LANGUAGE_CODE='en',
LANGUAGES=( LANGUAGES=(

View File

@ -7,16 +7,17 @@ from django.core.urlresolvers import reverse, clear_url_caches
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.template import Template, Context from django.template import Template, Context
from django.utils._os import upath
from django.utils import translation from django.utils import translation
@override_settings( @override_settings(
USE_I18N=True, USE_I18N=True,
LOCALE_PATHS=( LOCALE_PATHS=(
os.path.join(os.path.dirname(__file__), 'locale'), os.path.join(os.path.dirname(upath(__file__)), 'locale'),
), ),
TEMPLATE_DIRS=( TEMPLATE_DIRS=(
os.path.join(os.path.dirname(__file__), 'templates'), os.path.join(os.path.dirname(upath(__file__)), 'templates'),
), ),
LANGUAGE_CODE='en', LANGUAGE_CODE='en',
LANGUAGES=( LANGUAGES=(

View File

@ -18,6 +18,7 @@ from django.utils.formats import (get_format, date_format, time_format,
number_format) number_format)
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.numberformat import format as nformat from django.utils.numberformat import format as nformat
from django.utils._os import upath
from django.utils.safestring import mark_safe, SafeBytes, SafeString, SafeText from django.utils.safestring import mark_safe, SafeBytes, SafeString, SafeText
from django.utils import six from django.utils import six
from django.utils.six import PY3 from django.utils.six import PY3
@ -44,7 +45,7 @@ from .patterns.tests import (URLRedirectWithoutTrailingSlashTests,
URLPrefixTests, URLResponseTests, URLRedirectTests, PathUnusedTests) URLPrefixTests, URLResponseTests, URLRedirectTests, PathUnusedTests)
here = os.path.dirname(os.path.abspath(__file__)) here = os.path.dirname(os.path.abspath(upath(__file__)))
extended_locale_paths = settings.LOCALE_PATHS + ( extended_locale_paths = settings.LOCALE_PATHS + (
os.path.join(here, 'other', 'locale'), os.path.join(here, 'other', 'locale'),
) )
@ -666,8 +667,8 @@ class FormattingTests(TestCase):
with self.settings(USE_L10N=True, with self.settings(USE_L10N=True,
FORMAT_MODULE_PATH='regressiontests.i18n.other.locale'): FORMAT_MODULE_PATH='regressiontests.i18n.other.locale'):
with translation.override('de', deactivate=True): with translation.override('de', deactivate=True):
old = "%r" % get_format_modules(reverse=True) old = str("%r") % get_format_modules(reverse=True)
new = "%r" % get_format_modules(reverse=True) # second try new = str("%r") % get_format_modules(reverse=True) # second try
self.assertEqual(new, old, 'Value returned by get_formats_modules() must be preserved between calls.') self.assertEqual(new, old, 'Value returned by get_formats_modules() must be preserved between calls.')
def test_localize_templatetag_and_filter(self): def test_localize_templatetag_and_filter(self):

View File

@ -9,6 +9,7 @@ from django.conf import compat_patch_logging_config, LazySettings
from django.core import mail from django.core import mail
from django.test import TestCase, RequestFactory from django.test import TestCase, RequestFactory
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.encoding import force_text
from django.utils.log import CallbackFilter, RequireDebugFalse from django.utils.log import CallbackFilter, RequireDebugFalse
from django.utils.six import StringIO from django.utils.six import StringIO
from django.utils.unittest import skipUnless from django.utils.unittest import skipUnless
@ -154,13 +155,13 @@ class WarningLoggerTests(TestCase):
output = StringIO() output = StringIO()
self.logger.handlers[0].stream = output self.logger.handlers[0].stream = output
warnings.warn('Foo Deprecated', DeprecationWarning) warnings.warn('Foo Deprecated', DeprecationWarning)
self.assertTrue('Foo Deprecated' in output.getvalue()) self.assertTrue('Foo Deprecated' in force_text(output.getvalue()))
def test_warnings_capture_debug_false(self): def test_warnings_capture_debug_false(self):
output = StringIO() output = StringIO()
self.logger.handlers[0].stream = output self.logger.handlers[0].stream = output
warnings.warn('Foo Deprecated', DeprecationWarning) warnings.warn('Foo Deprecated', DeprecationWarning)
self.assertFalse('Foo Deprecated' in output.getvalue()) self.assertFalse('Foo Deprecated' in force_text(output.getvalue()))
class CallbackFilterTest(TestCase): class CallbackFilterTest(TestCase):

View File

@ -6,6 +6,7 @@ import shutil
from django.core.files import File from django.core.files import File
from django.core.files.images import ImageFile from django.core.files.images import ImageFile
from django.test import TestCase from django.test import TestCase
from django.utils._os import upath
from django.utils.unittest import skipIf from django.utils.unittest import skipIf
from .models import Image from .models import Image
@ -43,10 +44,10 @@ class ImageFieldTestMixin(object):
shutil.rmtree(temp_storage_dir) shutil.rmtree(temp_storage_dir)
os.mkdir(temp_storage_dir) os.mkdir(temp_storage_dir)
file_path1 = os.path.join(os.path.dirname(__file__), "4x8.png") file_path1 = os.path.join(os.path.dirname(upath(__file__)), "4x8.png")
self.file1 = self.File(open(file_path1, 'rb')) self.file1 = self.File(open(file_path1, 'rb'))
file_path2 = os.path.join(os.path.dirname(__file__), "8x4.png") file_path2 = os.path.join(os.path.dirname(upath(__file__)), "8x4.png")
self.file2 = self.File(open(file_path2, 'rb')) self.file2 = self.File(open(file_path2, 'rb'))
def tearDown(self): def tearDown(self):

View File

@ -5,6 +5,7 @@ import os
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
from django.utils._os import upath
class Person(models.Model): class Person(models.Model):
@ -19,7 +20,7 @@ class Triple(models.Model):
unique_together = (('left', 'middle'), ('middle', 'right')) unique_together = (('left', 'middle'), ('middle', 'right'))
class FilePathModel(models.Model): class FilePathModel(models.Model):
path = models.FilePathField(path=os.path.dirname(__file__), match=".*\.py$", blank=True) path = models.FilePathField(path=os.path.dirname(upath(__file__)), match=".*\.py$", blank=True)
@python_2_unicode_compatible @python_2_unicode_compatible
class Publication(models.Model): class Publication(models.Model):

View File

@ -15,11 +15,12 @@ from django.test import LiveServerTestCase
from django.core.servers.basehttp import WSGIServerException from django.core.servers.basehttp import WSGIServerException
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.http import urlencode from django.utils.http import urlencode
from django.utils._os import upath
from .models import Person from .models import Person
TEST_ROOT = os.path.dirname(__file__) TEST_ROOT = os.path.dirname(upath(__file__))
TEST_SETTINGS = { TEST_SETTINGS = {
'MEDIA_URL': '/media/', 'MEDIA_URL': '/media/',
'MEDIA_ROOT': os.path.join(TEST_ROOT, 'media'), 'MEDIA_ROOT': os.path.join(TEST_ROOT, 'media'),

View File

@ -15,14 +15,14 @@ from django.core.exceptions import ImproperlyConfigured
from django.core.management import call_command from django.core.management import call_command
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.encoding import smart_text from django.utils.encoding import force_text
from django.utils.functional import empty from django.utils.functional import empty
from django.utils._os import rmtree_errorhandler from django.utils._os import rmtree_errorhandler, upath
from django.utils import six from django.utils import six
from django.contrib.staticfiles import finders, storage from django.contrib.staticfiles import finders, storage
TEST_ROOT = os.path.dirname(__file__) TEST_ROOT = os.path.dirname(upath(__file__))
TEST_SETTINGS = { TEST_SETTINGS = {
'DEBUG': True, 'DEBUG': True,
'MEDIA_URL': '/media/', 'MEDIA_URL': '/media/',
@ -77,7 +77,7 @@ class BaseStaticFilesTestCase(object):
os.unlink(self._backup_filepath) os.unlink(self._backup_filepath)
def assertFileContains(self, filepath, text): def assertFileContains(self, filepath, text):
self.assertIn(text, self._get_file(smart_text(filepath)), self.assertIn(text, self._get_file(force_text(filepath)),
"'%s' not in '%s'" % (text, filepath)) "'%s' not in '%s'" % (text, filepath))
def assertFileNotFound(self, filepath): def assertFileNotFound(self, filepath):
@ -195,7 +195,7 @@ class TestFindStatic(CollectionTestCase, TestDefaults):
call_command('findstatic', filepath, all=False, verbosity=0, stdout=out) call_command('findstatic', filepath, all=False, verbosity=0, stdout=out)
out.seek(0) out.seek(0)
lines = [l.strip() for l in out.readlines()] lines = [l.strip() for l in out.readlines()]
with codecs.open(smart_text(lines[1].strip()), "r", "utf-8") as f: with codecs.open(force_text(lines[1].strip()), "r", "utf-8") as f:
return f.read() return f.read()
def test_all_files(self): def test_all_files(self):
@ -207,8 +207,8 @@ class TestFindStatic(CollectionTestCase, TestDefaults):
out.seek(0) out.seek(0)
lines = [l.strip() for l in out.readlines()] lines = [l.strip() for l in out.readlines()]
self.assertEqual(len(lines), 3) # three because there is also the "Found <file> here" line self.assertEqual(len(lines), 3) # three because there is also the "Found <file> here" line
self.assertIn('project', lines[1]) self.assertIn('project', force_text(lines[1]))
self.assertIn('apps', lines[2]) self.assertIn('apps', force_text(lines[2]))
class TestCollection(CollectionTestCase, TestDefaults): class TestCollection(CollectionTestCase, TestDefaults):

View File

@ -18,6 +18,7 @@ from django.template import TemplateDoesNotExist, Context
from django.template.loaders.eggs import Loader as EggLoader from django.template.loaders.eggs import Loader as EggLoader
from django.template import loader from django.template import loader
from django.utils import unittest, six from django.utils import unittest, six
from django.utils._os import upath
from django.utils.six import StringIO from django.utils.six import StringIO
@ -111,9 +112,9 @@ class CachedLoader(unittest.TestCase):
def test_templatedir_caching(self): def test_templatedir_caching(self):
"Check that the template directories form part of the template cache key. Refs #13573" "Check that the template directories form part of the template cache key. Refs #13573"
# Retrive a template specifying a template directory to check # Retrive a template specifying a template directory to check
t1, name = loader.find_template('test.html', (os.path.join(os.path.dirname(__file__), 'templates', 'first'),)) t1, name = loader.find_template('test.html', (os.path.join(os.path.dirname(upath(__file__)), 'templates', 'first'),))
# Now retrieve the same template name, but from a different directory # Now retrieve the same template name, but from a different directory
t2, name = loader.find_template('test.html', (os.path.join(os.path.dirname(__file__), 'templates', 'second'),)) t2, name = loader.find_template('test.html', (os.path.join(os.path.dirname(upath(__file__)), 'templates', 'second'),))
# The two templates should not have the same content # The two templates should not have the same content
self.assertNotEqual(t1.render(Context({})), t2.render(Context({}))) self.assertNotEqual(t1.render(Context({})), t2.render(Context({})))
@ -123,7 +124,7 @@ class RenderToStringTest(unittest.TestCase):
def setUp(self): def setUp(self):
self._old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS self._old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = ( settings.TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates'), os.path.join(os.path.dirname(upath(__file__)), 'templates'),
) )
def tearDown(self): def tearDown(self):

View File

@ -11,6 +11,7 @@ from django.template import Template, Context
from django.template.response import (TemplateResponse, SimpleTemplateResponse, from django.template.response import (TemplateResponse, SimpleTemplateResponse,
ContentNotRenderedError) ContentNotRenderedError)
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils._os import upath
def test_processor(request): def test_processor(request):
return {'processors': 'yes'} return {'processors': 'yes'}
@ -206,7 +207,7 @@ class SimpleTemplateResponseTest(TestCase):
@override_settings( @override_settings(
TEMPLATE_CONTEXT_PROCESSORS=[test_processor_name], TEMPLATE_CONTEXT_PROCESSORS=[test_processor_name],
TEMPLATE_DIRS=(os.path.join(os.path.dirname(__file__),'templates')), TEMPLATE_DIRS=(os.path.join(os.path.dirname(upath(__file__)), 'templates')),
) )
class TemplateResponseTest(TestCase): class TemplateResponseTest(TestCase):

View File

@ -30,6 +30,7 @@ from django.test.utils import (setup_test_template_loader,
from django.utils import unittest from django.utils import unittest
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
from django.utils.formats import date_format from django.utils.formats import date_format
from django.utils._os import upath
from django.utils.translation import activate, deactivate, ugettext as _ from django.utils.translation import activate, deactivate, ugettext as _
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils import six from django.utils import six
@ -423,7 +424,7 @@ class Templates(TestCase):
# Set ALLOWED_INCLUDE_ROOTS so that ssi works. # Set ALLOWED_INCLUDE_ROOTS so that ssi works.
old_allowed_include_roots = settings.ALLOWED_INCLUDE_ROOTS old_allowed_include_roots = settings.ALLOWED_INCLUDE_ROOTS
settings.ALLOWED_INCLUDE_ROOTS = ( settings.ALLOWED_INCLUDE_ROOTS = (
os.path.dirname(os.path.abspath(__file__)), os.path.dirname(os.path.abspath(upath(__file__))),
) )
# Warm the URL reversing cache. This ensures we don't pay the cost # Warm the URL reversing cache. This ensures we don't pay the cost
@ -514,7 +515,7 @@ class Templates(TestCase):
def get_template_tests(self): def get_template_tests(self):
# SYNTAX -- # SYNTAX --
# 'template_name': ('template contents', 'context dict', 'expected string output' or Exception class) # 'template_name': ('template contents', 'context dict', 'expected string output' or Exception class)
basedir = os.path.dirname(os.path.abspath(__file__)) basedir = os.path.dirname(os.path.abspath(upath(__file__)))
tests = { tests = {
### BASIC SYNTAX ################################################ ### BASIC SYNTAX ################################################
@ -1649,7 +1650,7 @@ class TemplateTagLoading(unittest.TestCase):
def setUp(self): def setUp(self):
self.old_path = sys.path[:] self.old_path = sys.path[:]
self.old_apps = settings.INSTALLED_APPS self.old_apps = settings.INSTALLED_APPS
self.egg_dir = '%s/eggs' % os.path.dirname(__file__) self.egg_dir = '%s/eggs' % os.path.dirname(upath(__file__))
self.old_tag_modules = template_base.templatetags_modules self.old_tag_modules = template_base.templatetags_modules
template_base.templatetags_modules = [] template_base.templatetags_modules = []

View File

@ -16,12 +16,13 @@ from django.test import Client, TestCase
from django.test.client import encode_file, RequestFactory from django.test.client import encode_file, RequestFactory
from django.test.utils import ContextList, override_settings, str_prefix from django.test.utils import ContextList, override_settings, str_prefix
from django.template.response import SimpleTemplateResponse from django.template.response import SimpleTemplateResponse
from django.utils._os import upath
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from django.http import HttpResponse from django.http import HttpResponse
@override_settings( @override_settings(
TEMPLATE_DIRS=(os.path.join(os.path.dirname(__file__), 'templates'),) TEMPLATE_DIRS=(os.path.join(os.path.dirname(upath(__file__)), 'templates'),)
) )
class AssertContainsTests(TestCase): class AssertContainsTests(TestCase):
def test_contains(self): def test_contains(self):
@ -629,7 +630,7 @@ class TemplateExceptionTests(TestCase):
template_loader.reset() template_loader.reset()
@override_settings( @override_settings(
TEMPLATE_DIRS=(os.path.join(os.path.dirname(__file__), 'bad_templates'),) TEMPLATE_DIRS=(os.path.join(os.path.dirname(upath(__file__)), 'bad_templates'),)
) )
def test_bad_404_template(self): def test_bad_404_template(self):
"Errors found when rendering 404 error templates are re-raised" "Errors found when rendering 404 error templates are re-raised"

View File

@ -237,7 +237,7 @@ class ResolverTests(unittest.TestCase):
self.assertEqual(len(e.args[0]['tried']), len(url_types_names), 'Wrong number of tried URLs returned. Expected %s, got %s.' % (len(url_types_names), len(e.args[0]['tried']))) self.assertEqual(len(e.args[0]['tried']), len(url_types_names), 'Wrong number of tried URLs returned. Expected %s, got %s.' % (len(url_types_names), len(e.args[0]['tried'])))
for tried, expected in zip(e.args[0]['tried'], url_types_names): for tried, expected in zip(e.args[0]['tried'], url_types_names):
for t, e in zip(tried, expected): for t, e in zip(tried, expected):
self.assertTrue(isinstance(t, e['type']), '%s is not an instance of %s' % (t, e['type'])) self.assertTrue(isinstance(t, e['type']), str('%s is not an instance of %s') % (t, e['type']))
if 'name' in e: if 'name' in e:
if not e['name']: if not e['name']:
self.assertTrue(t.name is None, 'Expected no URL name but found %s.' % t.name) self.assertTrue(t.name is None, 'Expected no URL name but found %s.' % t.name)

View File

@ -4,9 +4,10 @@ import tempfile
from django.utils import unittest from django.utils import unittest
from django.utils.archive import Archive, extract from django.utils.archive import Archive, extract
from django.utils._os import upath
TEST_DIR = os.path.join(os.path.dirname(__file__), 'archives') TEST_DIR = os.path.join(os.path.dirname(upath(__file__)), 'archives')
class ArchiveTester(object): class ArchiveTester(object):

View File

@ -6,6 +6,7 @@ from zipimport import zipimporter
from django.utils import unittest from django.utils import unittest
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.module_loading import module_has_submodule from django.utils.module_loading import module_has_submodule
from django.utils._os import upath
class DefaultLoader(unittest.TestCase): class DefaultLoader(unittest.TestCase):
@ -50,7 +51,7 @@ class DefaultLoader(unittest.TestCase):
class EggLoader(unittest.TestCase): class EggLoader(unittest.TestCase):
def setUp(self): def setUp(self):
self.old_path = sys.path[:] self.old_path = sys.path[:]
self.egg_dir = '%s/eggs' % os.path.dirname(__file__) self.egg_dir = '%s/eggs' % os.path.dirname(upath(__file__))
def tearDown(self): def tearDown(self):
sys.path = self.old_path sys.path = self.old_path

View File

@ -14,6 +14,7 @@ from django.core.urlresolvers import reverse
from django.test import TestCase, RequestFactory from django.test import TestCase, RequestFactory
from django.test.utils import (override_settings, setup_test_template_loader, from django.test.utils import (override_settings, setup_test_template_loader,
restore_template_loaders) restore_template_loaders)
from django.utils.encoding import force_text
from django.views.debug import ExceptionReporter from django.views.debug import ExceptionReporter
from .. import BrokenException, except_args from .. import BrokenException, except_args
@ -306,15 +307,16 @@ class ExceptionReportTestMixin(object):
self.assertEqual(len(mail.outbox), 1) self.assertEqual(len(mail.outbox), 1)
email = mail.outbox[0] email = mail.outbox[0]
# Frames vars are never shown in plain text email reports. # Frames vars are never shown in plain text email reports.
self.assertNotIn('cooked_eggs', email.body) body = force_text(email.body)
self.assertNotIn('scrambled', email.body) self.assertNotIn('cooked_eggs', body)
self.assertNotIn('sauce', email.body) self.assertNotIn('scrambled', body)
self.assertNotIn('worcestershire', email.body) self.assertNotIn('sauce', body)
self.assertNotIn('worcestershire', body)
if check_for_POST_params: if check_for_POST_params:
for k, v in self.breakfast_data.items(): for k, v in self.breakfast_data.items():
# All POST parameters are shown. # All POST parameters are shown.
self.assertIn(k, email.body) self.assertIn(k, body)
self.assertIn(v, email.body) self.assertIn(v, body)
def verify_safe_email(self, view, check_for_POST_params=True): def verify_safe_email(self, view, check_for_POST_params=True):
""" """
@ -327,20 +329,21 @@ class ExceptionReportTestMixin(object):
self.assertEqual(len(mail.outbox), 1) self.assertEqual(len(mail.outbox), 1)
email = mail.outbox[0] email = mail.outbox[0]
# Frames vars are never shown in plain text email reports. # Frames vars are never shown in plain text email reports.
self.assertNotIn('cooked_eggs', email.body) body = force_text(email.body)
self.assertNotIn('scrambled', email.body) self.assertNotIn('cooked_eggs', body)
self.assertNotIn('sauce', email.body) self.assertNotIn('scrambled', body)
self.assertNotIn('worcestershire', email.body) self.assertNotIn('sauce', body)
self.assertNotIn('worcestershire', body)
if check_for_POST_params: if check_for_POST_params:
for k, v in self.breakfast_data.items(): for k, v in self.breakfast_data.items():
# All POST parameters' names are shown. # All POST parameters' names are shown.
self.assertIn(k, email.body) self.assertIn(k, body)
# Non-sensitive POST parameters' values are shown. # Non-sensitive POST parameters' values are shown.
self.assertIn('baked-beans-value', email.body) self.assertIn('baked-beans-value', body)
self.assertIn('hash-brown-value', email.body) self.assertIn('hash-brown-value', body)
# Sensitive POST parameters' values are not shown. # Sensitive POST parameters' values are not shown.
self.assertNotIn('sausage-value', email.body) self.assertNotIn('sausage-value', body)
self.assertNotIn('bacon-value', email.body) self.assertNotIn('bacon-value', body)
def verify_paranoid_email(self, view): def verify_paranoid_email(self, view):
""" """
@ -353,15 +356,16 @@ class ExceptionReportTestMixin(object):
self.assertEqual(len(mail.outbox), 1) self.assertEqual(len(mail.outbox), 1)
email = mail.outbox[0] email = mail.outbox[0]
# Frames vars are never shown in plain text email reports. # Frames vars are never shown in plain text email reports.
self.assertNotIn('cooked_eggs', email.body) body = force_text(email.body)
self.assertNotIn('scrambled', email.body) self.assertNotIn('cooked_eggs', body)
self.assertNotIn('sauce', email.body) self.assertNotIn('scrambled', body)
self.assertNotIn('worcestershire', email.body) self.assertNotIn('sauce', body)
self.assertNotIn('worcestershire', body)
for k, v in self.breakfast_data.items(): for k, v in self.breakfast_data.items():
# All POST parameters' names are shown. # All POST parameters' names are shown.
self.assertIn(k, email.body) self.assertIn(k, body)
# No POST parameters' values are shown. # No POST parameters' values are shown.
self.assertNotIn(v, email.body) self.assertNotIn(v, body)
class ExceptionReporterFilterTests(TestCase, ExceptionReportTestMixin): class ExceptionReporterFilterTests(TestCase, ExceptionReportTestMixin):

View File

@ -9,6 +9,7 @@ from django.core.urlresolvers import reverse
from django.test import LiveServerTestCase, TestCase from django.test import LiveServerTestCase, TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils import six, unittest from django.utils import six, unittest
from django.utils._os import upath
from django.utils.translation import override from django.utils.translation import override
from django.utils.text import javascript_quote from django.utils.text import javascript_quote
@ -152,7 +153,7 @@ class JsI18NTestsMultiPackage(TestCase):
def testI18NWithLocalePaths(self): def testI18NWithLocalePaths(self):
extended_locale_paths = settings.LOCALE_PATHS + ( extended_locale_paths = settings.LOCALE_PATHS + (
path.join(path.dirname( path.join(path.dirname(
path.dirname(path.abspath(__file__))), 'app3', 'locale'),) path.dirname(path.abspath(upath(__file__)))), 'app3', 'locale'),)
with self.settings(LANGUAGE_CODE='es-ar', LOCALE_PATHS=extended_locale_paths): with self.settings(LANGUAGE_CODE='es-ar', LOCALE_PATHS=extended_locale_paths):
with override('es-ar'): with override('es-ar'):
response = self.client.get('/views/jsi18n/') response = self.client.get('/views/jsi18n/')

View File

@ -4,11 +4,12 @@ from __future__ import absolute_import
from os import path from os import path
from django.conf.urls import patterns, url, include from django.conf.urls import patterns, url, include
from django.utils._os import upath
from . import views from . import views
base_dir = path.dirname(path.abspath(__file__)) base_dir = path.dirname(path.abspath(upath(__file__)))
media_dir = path.join(base_dir, 'media') media_dir = path.join(base_dir, 'media')
locale_dir = path.join(base_dir, 'locale') locale_dir = path.join(base_dir, 'locale')

View File

@ -7,6 +7,7 @@ import tempfile
import warnings import warnings
from django import contrib from django import contrib
from django.utils._os import upath
from django.utils import six from django.utils import six
# databrowse is deprecated, but we still want to run its tests # databrowse is deprecated, but we still want to run its tests
@ -19,8 +20,8 @@ REGRESSION_TESTS_DIR_NAME = 'regressiontests'
TEST_TEMPLATE_DIR = 'templates' TEST_TEMPLATE_DIR = 'templates'
RUNTESTS_DIR = os.path.dirname(__file__) RUNTESTS_DIR = os.path.dirname(upath(__file__))
CONTRIB_DIR = os.path.dirname(contrib.__file__) CONTRIB_DIR = os.path.dirname(upath(contrib.__file__))
MODEL_TEST_DIR = os.path.join(RUNTESTS_DIR, MODEL_TESTS_DIR_NAME) MODEL_TEST_DIR = os.path.join(RUNTESTS_DIR, MODEL_TESTS_DIR_NAME)
REGRESSION_TEST_DIR = os.path.join(RUNTESTS_DIR, REGRESSION_TESTS_DIR_NAME) REGRESSION_TEST_DIR = os.path.join(RUNTESTS_DIR, REGRESSION_TESTS_DIR_NAME)
TEMP_DIR = tempfile.mkdtemp(prefix='django_') TEMP_DIR = tempfile.mkdtemp(prefix='django_')
@ -192,7 +193,7 @@ def bisect_tests(bisection_label, options, test_labels):
pass pass
subprocess_args = [ subprocess_args = [
sys.executable, __file__, '--settings=%s' % options.settings] sys.executable, upath(__file__), '--settings=%s' % options.settings]
if options.failfast: if options.failfast:
subprocess_args.append('--failfast') subprocess_args.append('--failfast')
if options.verbosity: if options.verbosity:
@ -253,7 +254,7 @@ def paired_tests(paired_test, options, test_labels):
pass pass
subprocess_args = [ subprocess_args = [
sys.executable, __file__, '--settings=%s' % options.settings] sys.executable, upath(__file__), '--settings=%s' % options.settings]
if options.failfast: if options.failfast:
subprocess_args.append('--failfast') subprocess_args.append('--failfast')
if options.verbosity: if options.verbosity: