Skip to content

Commit 642f3ec

Browse files
committed
Always specify encoding when opening text files
1 parent f984ce6 commit 642f3ec

24 files changed

+47
-46
lines changed

webware/Admin/View.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ def defaultAction(self):
2424
self.writeError('File cannot be viewed!')
2525

2626
def writeError(self, message):
27-
self.writeln(
28-
f'<h3 style="color:red">Error</h3><p>{message}</p>')
27+
self.writeln(f'<h3 style="color:red">Error</h3><p>{message}</p>')
2928

3029
def writeContent(self):
3130
filename = self.request().field('filename', None)
@@ -41,7 +40,7 @@ def writeContent(self):
4140
self._type = 'text/' + (
4241
'html' if splitext(filename)[1] in ('.htm', '.html') else 'plain')
4342
try:
44-
with open(filename) as f:
43+
with open(filename, encoding='utf-8') as f:
4544
self._data = f.read()
4645
except Exception:
4746
self.writeError(f'The requested file {filename!r} cannot be read.')

webware/Application.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ def __init__(self, path=None, settings=None, development=None):
221221
if '/' not in filename:
222222
filename = os.path.join(self._logDir, filename)
223223
# pylint: disable=consider-using-with
224-
sys.stderr = sys.stdout = open(filename, 'a', buffering=1)
224+
sys.stderr = sys.stdout = open(
225+
filename, 'a', encoding='utf-8', buffering=1)
225226

226227
self.initErrorPage()
227228
self.printStartUpMessage()
@@ -267,7 +268,7 @@ def initErrorPage(self):
267268
os.path.dirname(os.path.abspath(__file__))):
268269
error404file = os.path.join(path, 'error404.html')
269270
try:
270-
with open(error404file) as f:
271+
with open(error404file, encoding='utf-8') as f:
271272
self._error404 = f.read()
272273
except Exception:
273274
continue
@@ -611,7 +612,7 @@ def writeActivityLog(self, trans):
611612
filename = os.path.join(self._logDir, filename)
612613
filename = self.serverSidePath(filename)
613614
mode = 'a' if os.path.exists(filename) else 'w'
614-
with open(filename, mode) as f:
615+
with open(filename, mode, encoding='utf-8') as f:
615616
if mode == 'w':
616617
f.write(','.join(self.setting('ActivityLogColumns')) + '\n')
617618
values = []

webware/Examples/Colorize.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def respond(self, transaction):
5454
filename = req.field('filename')
5555
filename = self.request().serverSidePath(os.path.basename(filename))
5656
try:
57-
with open(filename) as f:
57+
with open(filename, encoding='utf-8') as f:
5858
source = f.read()
5959
except IOError:
6060
source = None

webware/Examples/DBUtilsDemo.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,8 @@ class DBUtilsDemo(ExamplePage):
4444
# Initialize the buttons
4545
_actions = []
4646
_buttons = []
47-
for action in (
48-
'create tables', 'list seminars', 'list attendees',
49-
'add seminar', 'add attendee'):
47+
for action in ('create tables', 'list seminars', 'list attendees',
48+
'add seminar', 'add attendee'):
5049
value = action.capitalize()
5150
action = action.split()
5251
action[1] = action[1].capitalize()

webware/ExceptionHandler.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ def saveErrorPage(self, html):
421421
filename = os.path.join(
422422
self._app._errorMessagesDir, self.errorPageFilename())
423423
try:
424-
with open(filename, 'w') as f:
424+
with open(filename, 'w', encoding='utf-8') as f:
425425
f.write(html)
426426
except IOError:
427427
sys.stderr.write(
@@ -473,10 +473,10 @@ def fixElement(element):
473473
filename = self._app.setting('ErrorLogFilename')
474474
try:
475475
if os.path.exists(filename):
476-
with open(filename, 'a') as f:
476+
with open(filename, 'a', encoding='utf-8') as f:
477477
f.write(logLine)
478478
else:
479-
with open(filename, 'w') as f:
479+
with open(filename, 'w', encoding='utf-8') as f:
480480
f.write(
481481
'time,filename,pathname,exception name,'
482482
'exception data,error report filename\n')

webware/HTTPRequest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def __init__(self, requestDict=None):
7171

7272
# Debugging
7373
if debug:
74-
with open('env.text', 'a') as f:
74+
with open('env.text', 'a', encoding='utf-8') as f:
7575
f.write('>> env for request:\n')
7676
for key in sorted(env):
7777
f.write(f'{key}: {env[key]!r}\n')

webware/MiscUtils/DataTable.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,8 +507,8 @@ def strip(x):
507507
def save(self):
508508
self.writeFileNamed(self._filename)
509509

510-
def writeFileNamed(self, filename):
511-
with open(filename, 'w') as f:
510+
def writeFileNamed(self, filename, encoding='utf-8'):
511+
with open(filename, 'w', encoding=encoding) as f:
512512
self.writeFile(f)
513513

514514
def writeFile(self, file):

webware/MiscUtils/PickleCache.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def read(self, filename,
9292
if not os.path.exists(filename):
9393
if v:
9494
print(f'Cannot find {filename!r}.')
95-
open(filename) # to get a properly constructed IOError
95+
open(filename, 'rb') # to get a properly constructed IOError
9696

9797
shouldDeletePickle = False
9898
data = None

webware/MiscUtils/PropertiesObject.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def loadValues(self, *args, **kwargs):
7171

7272
def readFileNamed(self, filename):
7373
results = {}
74-
with open(filename) as f:
74+
with open(filename, encoding='utf-8') as f:
7575
exec(f.read(), results)
7676
self.update(results)
7777
self.cleanPrivateItems()

webware/MiscUtils/Tests/BenchCSVParser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ def _main(self):
4444
print("Benchmark using", name, "...")
4545
self.benchFileNamed(name)
4646

47-
def benchFileNamed(self, name):
48-
with open(name) as f:
47+
def benchFileNamed(self, name, encoding='utf-8'):
48+
with open(name, encoding=encoding) as f:
4949
lines = f.readlines()
5050
for line in lines:
5151
for _iteration in range(self._iterations):

webware/MiscUtils/Tests/BenchDataTable.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ def _main(self):
4545
print("Benchmark using", name, "...")
4646
self.benchFileNamed(name)
4747

48-
def benchFileNamed(self, name):
49-
with open(name) as f:
48+
def benchFileNamed(self, name, encoding='utf-8'):
49+
with open(name, encoding=encoding) as f:
5050
contents = f.read()
5151
for _iteration in range(self._iterations):
5252
# we duplicate lines to reduce the overhead of the loop

webware/MiscUtils/Tests/TestPickleCache.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def testOneIteration(self):
7070
self.remove(picklePath)
7171

7272
def writeSource(self):
73-
with open(self._sourcePath, 'w') as f:
73+
with open(self._sourcePath, 'w', encoding='ascii') as f:
7474
f.write(str(self._data))
7575

7676
def writePickle(self):

webware/PSP/Examples/View.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def writeContent(self):
2626
self.write('<p style="color:red">'
2727
f'No such file {basename} exists</p>')
2828
return
29-
text = open(filename).read()
29+
text = open(filename, encoding='utf-8').read()
3030
text = self.htmlEncode(text)
3131
text = text.replace('\n', '<br>').replace('\t', ' '*4)
3232
self.write(f'<pre>{text}</pre>')

webware/PSP/Generators.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ def generate(self, writer, phase=None):
303303
# Cut down on those by using a single res.write on the whole
304304
# file, after escaping any triple-double quotes.
305305
if self.static:
306-
with open(self.page) as f:
306+
with open(self.page, encoding='utf-8') as f:
307307
data = f.read()
308308
data = data.replace('"""', r'\"""')
309309
writer.println(f'res.write("""{data}""")')

webware/PSP/ServletWriter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def close(self):
6363
self._file.close()
6464
if os.path.exists(self._pyFilename):
6565
os.remove(self._pyFilename)
66-
with open(self._pyFilename, 'w') as f:
66+
with open(self._pyFilename, 'w', encoding='utf-8') as f:
6767
f.write(pyCode)
6868

6969
def pushIndent(self):

webware/PSP/StreamReader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def pushFile(self, filepath, encoding=None):
9191
if parent is not None and not isAbsolute:
9292
filepath = os.path.join(parent, filepath)
9393
fileId = self.registerSourceFile(filepath)
94-
with open(filepath, 'r') as handle:
94+
with open(filepath, 'r', encoding=encoding) as handle:
9595
stream = handle.read()
9696
handle.seek(0, 0)
9797
if self.current is None:

webware/PSP/Tests/TestCompiler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def compileString(self, pspSource, classname):
5050
modulePath = os.path.join(self.testDir, moduleName)
5151
tmpInName = modulePath + '.psp'
5252
tmpOutName = modulePath + '.py'
53-
with open(tmpInName, 'w') as fp:
53+
with open(tmpInName, 'w', encoding='utf-8') as fp:
5454
fp.write(pspSource)
5555
# Compile PSP into .py file
5656
context = Context.PSPCLContext(tmpInName)

webware/Scripts/MakeAppWorkDir.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ def makeDirectories(self):
116116
self.msg(f"\t{path} already exists.")
117117
else:
118118
os.makedirs(path)
119-
open(os.path.join(path, '__init__.py'), 'w').write('#\n')
119+
open(os.path.join(path, '__init__.py'), 'w',
120+
encoding='ascii').write('#\n')
120121
self.msg(f"\t{path} created.")
121122

122123
def copyConfigFiles(self):
@@ -157,14 +158,14 @@ def setLibDirs(self):
157158
self.msg("Setting the library directories...")
158159
wsgiScript = os.path.join(self._workDir, 'Scripts', 'WSGIScript.py')
159160
if os.path.isfile(wsgiScript):
160-
with open(wsgiScript) as f:
161+
with open(wsgiScript, encoding='utf-8') as f:
161162
script = f.read()
162163
if 'libDirs = []' not in script:
163164
self.msg("\tWarning: Unexpected WSGI script")
164165
else:
165166
script = script.replace(
166167
'libDirs = []', f'libDirs = {self._libraryDirs!r}')
167-
with open(wsgiScript, 'w') as f:
168+
with open(wsgiScript, 'w', encoding='utf-8') as f:
168169
f.write(script)
169170
else:
170171
self.msg("\tWarning: Cannot find WSGI script.")
@@ -192,14 +193,14 @@ def makeDefaultContext(self):
192193
self.msg(f"\t{filename} already exists.")
193194
else:
194195
self.msg(f"\t{filename}")
195-
open(filename, "w").write(exampleContext[name])
196+
open(filename, "w",
197+
encoding='ascii').write(exampleContext[name])
196198
self.msg("Updating config for default context...")
197-
filename = os.path.join(
198-
self._workDir, 'Configs', 'Application.config')
199+
filename = os.path.join(self._workDir, 'Configs', 'Application.config')
199200
self.msg(f"\t{filename}")
200-
content = open(filename).readlines()
201+
content = open(filename, encoding='utf-8').readlines()
201202
foundContext = 0
202-
with open(filename, 'w') as output:
203+
with open(filename, 'w', encoding='utf-8') as output:
203204
for line in content:
204205
contextName = self._contextName
205206
if line.startswith(
@@ -226,7 +227,7 @@ def addGitIgnore(self):
226227
if os.path.exists(filename):
227228
existed = True
228229
else:
229-
with open(filename, 'w') as f:
230+
with open(filename, 'w', encoding='ascii') as f:
230231
f.write(ignore)
231232
if existed:
232233
self.msg("\tDid not change existing .gitignore file.")

webware/Scripts/WaitressServer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def openBrowser():
5454
del environ['WEBWARE_DEVELOPMENT']
5555
try:
5656
# get application from WSGI script
57-
with open(args.wsgi_script) as f:
57+
with open(args.wsgi_script, encoding='utf-8') as f:
5858
script = f.read()
5959
# set development flag in the script
6060
script = script.replace(

webware/ServletFactory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ def _importModuleFromDirectory(
189189
# if it does not exist, make an empty one
190190
print(f"Creating __init__.py file at {packageDir!r}")
191191
try:
192-
with open(initPy, 'w') as initPyFile:
192+
with open(initPy, 'w', encoding='ascii') as initPyFile:
193193
initPyFile.write(
194194
'# Auto-generated by Webware' + os.linesep)
195195
except Exception:

webware/Testing/Main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def readFileNamed(self, filename):
5454
Each of them is a dictionary, as defined the given file.
5555
See TestCases.data for information on the format.
5656
"""
57-
with open(filename) as f:
57+
with open(filename, encoding='utf-8') as f:
5858
cases = self.readFile(f)
5959
return cases
6060

webware/Tests/TestEndToEnd/TestMakeApp.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,14 @@ def testMakeNewApp(self):
6262
appFiles = '.gitignore error404.html Scripts/WSGIScript.py'.split()
6363
for appFile in appFiles:
6464
self.assertTrue(os.path.isfile(appFile), appFile)
65-
with open('Scripts/WSGIScript.py') as f:
65+
with open('Scripts/WSGIScript.py', encoding='utf-8') as f:
6666
wsgiScript = f.read().splitlines()
6767
self.assertEqual(wsgiScript[0], '#!/usr/bin/env python3')
6868
self.assertIn('from Application import Application', wsgiScript)
6969
os.chdir('MyContext')
70-
with open('__init__.py') as f:
70+
with open('__init__.py', encoding='utf-8') as f:
7171
initScript = f.read().splitlines()
7272
self.assertIn('def contextInitialize(application, path):', initScript)
73-
with open('Main.py') as f:
73+
with open('Main.py', encoding='utf-8') as f:
7474
mainServlet = f.read().splitlines()
7575
self.assertIn('class Main(Page):', mainServlet)

webware/URLParser.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ def addContext(self, name, path):
197197
print("Creating __init__.py file"
198198
f" for context {name!r}")
199199
try:
200-
with open(initPy, 'w') as initPyFile:
200+
with open(initPy, 'w',
201+
encoding='ascii') as initPyFile:
201202
initPyFile.write(
202203
'# Auto-generated by Webware' +
203204
os.linesep)

webware/WebUtils/HTMLTag.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,13 +395,13 @@ def __init__(
395395

396396
# region Reading
397397

398-
def readFileNamed(self, filename, retainRootTag=True):
398+
def readFileNamed(self, filename, retainRootTag=True, encoding='utf-8'):
399399
"""Read the given file.
400400
401401
Relies on readString(). See that method for more information.
402402
"""
403403
self._filename = filename
404-
with open(filename) as f:
404+
with open(filename, encoding=encoding) as f:
405405
contents = f.read()
406406
return self.readString(contents, retainRootTag)
407407

0 commit comments

Comments
 (0)