Test for ability to open a DB in an arbitrary Unicode path with a Unicode name.

And fix a couple of bugs that made the test fail.
This commit is contained in:
John Ralls 2014-04-03 14:16:16 -07:00
parent 80f9a3a5c8
commit bb8d29dea9
3 changed files with 46 additions and 6 deletions

View File

@ -37,6 +37,7 @@ from __future__ import print_function
import os
import sys
import time
import io
if sys.version_info[0] < 3:
from urlparse import urlparse
from urllib2 import urlopen, url2pathname
@ -242,7 +243,7 @@ class CLIDbManager(object):
dirpath = os.path.join(dbdir, dpath)
path_name = os.path.join(dirpath, NAME_FILE)
if os.path.isfile(path_name):
file = open(path_name)
file = io.open(path_name, 'r', encoding='utf8')
name = file.readline().strip()
file.close()
@ -299,8 +300,8 @@ class CLIDbManager(object):
if title is None:
name_list = [ name[0] for name in self.current_names ]
title = find_next_db_name(name_list)
name_file = open(path_name, "w")
name_file = io.open(path_name, "w", encoding='utf8')
name_file.write(title)
name_file.close()
@ -408,10 +409,10 @@ class CLIDbManager(object):
"""
try:
filepath = conv_to_unicode(filepath, 'utf8')
name_file = open(filepath, "r")
name_file = io.open(filepath, "r", encoding='utf8')
old_text=name_file.read()
name_file.close()
name_file = open(filepath, "w")
name_file = io.open(filepath, "w", encoding='utf8')
name_file.write(new_text)
name_file.close()
except (OSError, IOError) as msg:

View File

@ -25,6 +25,7 @@
import os
import unittest
import re
import io
test_ged = """0 HEAD
1 SOUR min1r.ged min 1-rec
@ -102,6 +103,40 @@ class Test(unittest.TestCase):
for fn in bogofiles:
self.assertFalse(os.path.exists(fn))
class UnicodeTest(unittest.TestCase):
@unittest.skipIf(sys.version_info[0] < 3 and sys.platform == 'win32')
def setUp(self):
from gramps.cli.clidbman import CLIDbManager
from gramps.gen.config import set as setconfig
from gramps.gen.dbstate import DbState
self.newpath = os.path.join(os.path.dirname(__file__),
u'\u0393\u03c1\u03b1\u03bc\u03c3\u03c0')
self.newtitle = u'Gr\u00e4mps T\u00e9st'
os.makedirs(self.newpath)
setconfig('behavior.database-path', self.newpath)
self.cli = CLIDbManager(DbState())
def tearDown(self):
for (dirpath, dirnames, filenames) in os.walk(self.newpath, False):
for afile in filenames:
os.remove(os.path.join(dirpath, afile))
for adir in dirnames:
os.rmdir(os.path.join(dirpath, adir))
os.rmdir(self.newpath)
# Test that clidbman will open files in a path containing
# arbitrary Unicode characters.
def test4_arbitrary_uncode_path(self):
(dbpath, title) = self.cli.create_new_db_cli(self.newtitle)
self.assertEquals(self.newpath, os.path.dirname(dbpath),
"Compare paths %s and %s" % (repr(self.newpath),
repr(dbpath)))
self.assertEquals(self.newtitle, title, "Compare titles %s and %s" %
(repr(self.newtitle), repr(title)))
if __name__ == "__main__":
unittest.main()

View File

@ -86,6 +86,10 @@ _ = glocale.translation.gettext
_LOG = logging.getLogger(DBLOGNAME)
LOG = logging.getLogger(".citation")
#_LOG.setLevel(logging.DEBUG)
#_hdlr = logging.StreamHandler()
#_hdlr.setFormatter(logging.Formatter(fmt="%(name)s.%(levelname)s: %(message)s"))
#_LOG.addHandler(_hdlr)
_MINVERSION = 9
_DBVERSION = 16
@ -202,7 +206,7 @@ def _encode(path):
"""
Conditionally return the unicode string encoded to sys.filesystem.encoding
"""
if not (isinstance(path, UNITYPE) and win() and sys.version_info[0] < 3):
if not (isinstance(path, UNITYPE) and sys.version_info[0] < 3):
_LOG.debug("Didn't Encode %s", repr(path))
return path
_LOG.debug("Encoding %s", repr(path))