From 5dc5615bfd05c150c7214d9c92942f3467b42d5c Mon Sep 17 00:00:00 2001
From: Sam Manzi
Date: Tue, 19 Apr 2016 09:08:21 +1000
Subject: [PATCH 1/3] Prefer with context manager to open files
---
gramps/cli/clidbman.py | 34 ++-
gramps/gen/dbstate.py | 15 +-
gramps/gen/filters/_filterlist.py | 5 +-
gramps/gen/plug/docgen/graphdoc.py | 5 +-
gramps/gen/plug/docgen/stylesheet.py | 42 ++--
gramps/gen/plug/report/_book.py | 113 +++++----
gramps/gen/plug/report/_options.py | 10 +-
gramps/gen/utils/image.py | 5 +-
.../plugins/database/bsddb_support/write.py | 3 +-
gramps/plugins/docgen/htmldoc.py | 6 +-
po/test/po_test.py | 26 +-
po/update_po.py | 228 ++++++++----------
12 files changed, 226 insertions(+), 266 deletions(-)
diff --git a/gramps/cli/clidbman.py b/gramps/cli/clidbman.py
index f32641b3b..3b0a778f5 100644
--- a/gramps/cli/clidbman.py
+++ b/gramps/cli/clidbman.py
@@ -234,9 +234,8 @@ class CLIDbManager(object):
except:
version = (0, 0, 0)
if os.path.isfile(path_name):
- file = open(path_name, 'r', encoding='utf8')
- name = file.readline().strip()
- file.close()
+ with open(path_name, 'r', encoding='utf8') as file:
+ name = file.readline().strip()
(tval, last) = time_val(dirpath)
(enable, stock_id) = self.icon_values(dirpath, self.active,
@@ -293,9 +292,8 @@ class CLIDbManager(object):
name_list = [ name[0] for name in self.current_names ]
title = find_next_db_name(name_list)
- name_file = open(path_name, "w", encoding='utf8')
- name_file.write(title)
- name_file.close()
+ with open(path_name, "w", encoding='utf8') as name_file:
+ name_file.write(title)
if create_db:
# write the version number into metadata
@@ -409,9 +407,8 @@ 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, 'r', encoding='utf8')
- name = file.readline().strip()
- file.close()
+ with open(path_name, 'r', encoding='utf8') as file:
+ name = file.readline().strip()
if re.match("^" + dbname + "$", name):
match_list.append((name, dirpath))
if len(match_list) == 0:
@@ -438,12 +435,10 @@ class CLIDbManager(object):
Returns old_name, new_name if success, None, None if no success
"""
try:
- name_file = open(filepath, "r", encoding='utf8')
- old_text=name_file.read()
- name_file.close()
- name_file = open(filepath, "w", encoding='utf8')
- name_file.write(new_text)
- name_file.close()
+ with open(filepath, "r", encoding='utf8') as name_file:
+ old_text=name_file.read()
+ with open(filepath, "w", encoding='utf8') as name_file:
+ name_file.write(new_text)
except (OSError, IOError) as msg:
CLIDbManager.ERROR(_("Could not rename Family Tree"),
str(msg))
@@ -543,11 +538,10 @@ def find_locker_name(dirpath):
"""
try:
fname = os.path.join(dirpath, "lock")
- ifile = open(fname, 'r', encoding='utf8')
- username = ifile.read().strip()
- # feature request 2356: avoid genitive form
- last = _("Locked by %s") % username
- ifile.close()
+ with open(fname, 'r', encoding='utf8') as ifile:
+ username = ifile.read().strip()
+ # feature request 2356: avoid genitive form
+ last = _("Locked by %s") % username
except (OSError, IOError, UnicodeDecodeError):
last = _("Unknown")
return last
diff --git a/gramps/gen/dbstate.py b/gramps/gen/dbstate.py
index 1d7097d2d..0856e899c 100644
--- a/gramps/gen/dbstate.py
+++ b/gramps/gen/dbstate.py
@@ -203,25 +203,22 @@ class DbState(Callback):
dirpath = os.path.join(dbdir, dpath)
path_name = os.path.join(dirpath, "name.txt")
if os.path.isfile(path_name):
- file = open(path_name, 'r', encoding='utf8')
- name = file.readline().strip()
- file.close()
+ with open(path_name, 'r', encoding='utf8') as file:
+ name = file.readline().strip()
if dbname == name:
locked = False
locked_by = None
backend = None
fname = os.path.join(dirpath, "database.txt")
if os.path.isfile(fname):
- ifile = open(fname, 'r', encoding='utf8')
- backend = ifile.read().strip()
- ifile.close()
+ with open(fname, 'r', encoding='utf8') as ifile:
+ backend = ifile.read().strip()
else:
backend = "bsddb"
try:
fname = os.path.join(dirpath, "lock")
- ifile = open(fname, 'r', encoding='utf8')
- locked_by = ifile.read().strip()
- locked = True
+ with open(fname, 'r', encoding='utf8') as ifile:
+ locked_by = ifile.read().strip()
ifile.close()
except (OSError, IOError):
pass
diff --git a/gramps/gen/filters/_filterlist.py b/gramps/gen/filters/_filterlist.py
index 958016bb0..9e7f8b259 100644
--- a/gramps/gen/filters/_filterlist.py
+++ b/gramps/gen/filters/_filterlist.py
@@ -103,9 +103,8 @@ class FilterList(object):
if os.path.isfile(self.file):
parser = make_parser()
parser.setContentHandler(FilterParser(self))
- the_file = open(self.file, 'r', encoding='utf8')
- parser.parse(the_file)
- the_file.close()
+ with open(self.file, 'r', encoding='utf8') as the_file:
+ parser.parse(the_file)
except (IOError, OSError):
print("IO/OSError in _filterlist.py")
except SAXParseException:
diff --git a/gramps/gen/plug/docgen/graphdoc.py b/gramps/gen/plug/docgen/graphdoc.py
index 38baaedc9..5e2ee7275 100644
--- a/gramps/gen/plug/docgen/graphdoc.py
+++ b/gramps/gen/plug/docgen/graphdoc.py
@@ -603,9 +603,8 @@ class GVDotDoc(GVDocBase):
if self._filename[-3:] != ".gv":
self._filename += ".gv"
- dotfile = open(self._filename, "wb")
- dotfile.write(self._dot.getvalue())
- dotfile.close()
+ with open(self._filename, "wb") as dotfile:
+ dotfile.write(self._dot.getvalue())
#-------------------------------------------------------------------------------
#
diff --git a/gramps/gen/plug/docgen/stylesheet.py b/gramps/gen/plug/docgen/stylesheet.py
index 90de0d6d2..b072da18b 100644
--- a/gramps/gen/plug/docgen/stylesheet.py
+++ b/gramps/gen/plug/docgen/stylesheet.py
@@ -146,31 +146,30 @@ class StyleSheetList(object):
"""
Saves the current StyleSheet definitions to the associated file.
"""
- xml_file = open(self.__file, "w")
- xml_file.write('\n')
- xml_file.write('\n')
+ with open(self.__file, "w") as xml_file:
+ xml_file.write('\n')
+ xml_file.write('\n')
- for name in sorted(self.map.keys()): # enable diff of archived copies
- if name == "default":
- continue
- sheet = self.map[name]
- xml_file.write('\n' % escxml(name))
+ for name in sorted(self.map.keys()): # enable diff of archived copies
+ if name == "default":
+ continue
+ sheet = self.map[name]
+ xml_file.write('\n' % escxml(name))
- for p_name in sheet.get_paragraph_style_names():
- self.write_paragraph_style(xml_file, sheet, p_name)
+ for p_name in sheet.get_paragraph_style_names():
+ self.write_paragraph_style(xml_file, sheet, p_name)
- for t_name in sheet.get_table_style_names():
- self.write_table_style(xml_file, sheet, t_name)
+ for t_name in sheet.get_table_style_names():
+ self.write_table_style(xml_file, sheet, t_name)
- for c_name in sheet.get_cell_style_names():
- self.write_cell_style(xml_file, sheet, c_name)
+ for c_name in sheet.get_cell_style_names():
+ self.write_cell_style(xml_file, sheet, c_name)
- for g_name in sheet.get_draw_style_names():
- self.write_graphics_style(xml_file, sheet, g_name)
+ for g_name in sheet.get_draw_style_names():
+ self.write_graphics_style(xml_file, sheet, g_name)
- xml_file.write('\n')
- xml_file.write('\n')
- xml_file.close()
+ xml_file.write('\n')
+ xml_file.write('\n')
def write_paragraph_style(self, xml_file, sheet, p_name):
@@ -275,9 +274,8 @@ class StyleSheetList(object):
if os.path.isfile(self.__file):
parser = make_parser()
parser.setContentHandler(SheetParser(self))
- the_file = open(self.__file)
- parser.parse(the_file)
- the_file.close()
+ with open(self.__file) as the_file:
+ parser.parse(the_file)
except (IOError, OSError, SAXParseException):
pass
diff --git a/gramps/gen/plug/report/_book.py b/gramps/gen/plug/report/_book.py
index b4073d65b..d01548b16 100644
--- a/gramps/gen/plug/report/_book.py
+++ b/gramps/gen/plug/report/_book.py
@@ -458,68 +458,67 @@ class BookList(object):
"""
Saves the current BookList to the associated file.
"""
- f = open(self.file, "w")
- f.write("\n")
- f.write('\n')
- for name in sorted(self.bookmap): # enable a diff of archived copies
- book = self.get_book(name)
- dbname = book.get_dbname()
- f.write(' \n' % (name, dbname) )
- for item in book.get_item_list():
- f.write(' \n' %
- (item.get_name(), item.get_translated_name() ) )
- options = item.option_class.handler.options_dict
- for option_name in sorted(options.keys()): # enable a diff
- option_value = options[option_name]
- if isinstance(option_value, (list, tuple)):
- f.write(' \n')
- else:
- option_type = type_name(option_value)
- value = escape(str(option_value))
- value = value.replace('"', '"')
- f.write('
\n' % (
- escape(option_name),
- option_type,
- value) )
+ value) )
- f.write(' \n' % item.get_style_name() )
- f.write(' \n')
- if book.get_paper_name():
- f.write(' \n' % book.get_paper_name() )
- if book.get_orientation() is not None: # 0 is legal
- f.write(' \n' %
- book.get_orientation() )
- if book.get_paper_metric() is not None: # 0 is legal
- f.write(' \n' % book.get_paper_metric() )
- if book.get_custom_paper_size():
- size = book.get_custom_paper_size()
- f.write(' \n' % (size[0], size[1]) )
- if book.get_margins():
- for pos in range(len(book.get_margins())):
- f.write(' \n' %
- (pos, book.get_margin(pos)) )
- if book.get_format_name():
- f.write(' \n' % book.get_format_name() )
- if book.get_output():
- f.write(' \n' % book.get_output() )
- f.write(' \n')
+ f.write(' \n' % item.get_style_name() )
+ f.write(' \n')
+ if book.get_paper_name():
+ f.write(' \n' % book.get_paper_name() )
+ if book.get_orientation() is not None: # 0 is legal
+ f.write(' \n' %
+ book.get_orientation() )
+ if book.get_paper_metric() is not None: # 0 is legal
+ f.write(' \n' % book.get_paper_metric() )
+ if book.get_custom_paper_size():
+ size = book.get_custom_paper_size()
+ f.write(' \n' % (size[0], size[1]) )
+ if book.get_margins():
+ for pos in range(len(book.get_margins())):
+ f.write(' \n' %
+ (pos, book.get_margin(pos)) )
+ if book.get_format_name():
+ f.write(' \n' % book.get_format_name() )
+ if book.get_output():
+ f.write(' \n' % book.get_output() )
+ f.write(' \n')
- f.write('\n')
- f.close()
+ f.write('\n')
def parse(self):
"""
diff --git a/gramps/gen/plug/report/_options.py b/gramps/gen/plug/report/_options.py
index d760976b3..35c0aebab 100644
--- a/gramps/gen/plug/report/_options.py
+++ b/gramps/gen/plug/report/_options.py
@@ -504,9 +504,8 @@ class OptionListCollection(_options.OptionListCollection):
if os.path.isfile(self.filename):
p = make_parser()
p.setContentHandler(OptionParser(self))
- the_file = open(self.filename, encoding="utf-8")
- p.parse(the_file)
- the_file.close()
+ with open(self.filename, encoding="utf-8") as the_file:
+ p.parse(the_file)
except (IOError, OSError, SAXParseException):
pass
@@ -1000,9 +999,8 @@ class DocOptionListCollection(_options.OptionListCollection):
if os.path.isfile(self.filename):
p = make_parser()
p.setContentHandler(DocOptionParser(self))
- the_file = open(self.filename, encoding="utf-8")
- p.parse(the_file)
- the_file.close()
+ with open(self.filename, encoding="utf-8") as the_file:
+ p.parse(the_file)
except (IOError, OSError, SAXParseException):
pass
diff --git a/gramps/gen/utils/image.py b/gramps/gen/utils/image.py
index 4cc246b08..46e07a02a 100644
--- a/gramps/gen/utils/image.py
+++ b/gramps/gen/utils/image.py
@@ -279,9 +279,8 @@ def resize_to_jpeg_buffer(source, size, crop=None):
scaled = img.scale_simple(int(size[0]), int(size[1]), GdkPixbuf.InterpType.BILINEAR)
os.close(filed)
scaled.savev(dest, "jpeg", "", "")
- ofile = open(dest, mode='rb')
- data = ofile.read()
- ofile.close()
+ with open(dest, mode='rb') as ofile:
+ data = ofile.read()
try:
os.unlink(dest)
except:
diff --git a/gramps/plugins/database/bsddb_support/write.py b/gramps/plugins/database/bsddb_support/write.py
index 626f4ce62..a916c817f 100644
--- a/gramps/plugins/database/bsddb_support/write.py
+++ b/gramps/plugins/database/bsddb_support/write.py
@@ -436,8 +436,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
def __log_error(self):
mypath = os.path.join(self.get_save_path(),DBRECOVFN)
- ofile = open(mypath, "w")
- ofile.close()
+ with open(mypath, "w") as ofile:
try:
clear_lock_file(self.get_save_path())
except:
diff --git a/gramps/plugins/docgen/htmldoc.py b/gramps/plugins/docgen/htmldoc.py
index e8d83f614..c75892f37 100644
--- a/gramps/plugins/docgen/htmldoc.py
+++ b/gramps/plugins/docgen/htmldoc.py
@@ -285,10 +285,8 @@ class HtmlDoc(BaseDoc, TextDoc):
Copy support files to the datadir that needs to hold them
"""
#css of textdoc styles
- tdfile = open(os.path.join(self._backend.datadirfull(),
- _TEXTDOCSCREEN), 'w')
- tdfile.write(self.style_declaration)
- tdfile.close()
+ with open(os.path.join(self._backend.datadirfull(), _TEXTDOCSCREEN), 'w') as tdfile:
+ tdfile.write(self.style_declaration)
#css file
if self.css_filename:
#we do an extra check in case file does not exist, eg cli call
diff --git a/po/test/po_test.py b/po/test/po_test.py
index 5e5362b0d..2d9e8a0a9 100644
--- a/po/test/po_test.py
+++ b/po/test/po_test.py
@@ -30,12 +30,11 @@ from test import test_util
test_util.path_append_parent()
def get_potfile(filename):
- fp = open(filename, "r")
- retvals = []
- for line in fp:
- if line and line[0] != "#":
- retvals.append(line.strip())
- fp.close()
+ with open(filename, "r") as fp:
+ retvals = []
+ for line in fp:
+ if line and line[0] != "#":
+ retvals.append(line.strip())
return retvals
# POTFILES.skip
@@ -55,9 +54,8 @@ class TestPOT(unittest.TestCase):
realpath = (dir + "/" + file)
pathfile = realpath[3:]
if os.path.exists(realpath):
- fp = open(realpath, "r")
- lines = fp.read()
- fp.close()
+ with open(realpath, "r") as fp:
+ lines = fp.read()
found = False
for search in searches:
if search in lines:
@@ -88,9 +86,8 @@ class TestMake(unittest.TestCase):
if pathfile[3:] in excluded_files:
self.assertTrue(True, "exclude '%s'" % pathfile)
elif os.path.exists(makefile):
- fp = open(makefile, "r")
- lines = fp.read()
- fp.close()
+ with open(makefile, "r") as fp:
+ lines = fp.read()
self.assertTrue(filename in lines, "'%s' not in %s/Makefile.in" %
(filename, path))
else:
@@ -107,9 +104,8 @@ class TestGetText(unittest.TestCase):
def helper(self, pofile, searches):
if not os.path.exists("../../" + pofile):
self.assertTrue(False, "'%s' is in POTFILES.in and does not exist" % pofile)
- fp = open("../../" + pofile, "r")
- lines = fp.read()
- fp.close()
+ with open("../../" + pofile, "r") as fp:
+ lines = fp.read()
found = False
for search in searches:
found = (search in lines) or found
diff --git a/po/update_po.py b/po/update_po.py
index de8079948..e722d81f4 100644
--- a/po/update_po.py
+++ b/po/update_po.py
@@ -166,23 +166,22 @@ def TipsParse(filename, mark):
"Editor."
'''
- tips = open('../data/tips.xml.in.h', 'w')
- marklist = root.iter(mark)
- for key in marklist:
- tip = ElementTree.tostring(key, encoding="UTF-8", method="xml")
- if sys.version_info[0] < 3:
- tip = tip.replace("", "")
- tip = tip.replace('\n<_tip number="%(number)s">' % key.attrib, "")
- else: # python3 support
- tip = tip.decode("utf-8")
- tip = tip.replace('<_tip number="%(number)s">' % key.attrib, "")
- tip = tip.replace(" ", " ")
- #tip = tip.replace("\n\n", "\n") # special case tip 7
- #tip = tip.replace("\n", "") # special case tip 18
- tip = tip.replace("\n\n", "")
- tip = tip.replace('"', '"')
- tips.write('char *s = N_("%s");\n' % tip)
- tips.close()
+ with open('../data/tips.xml.in.h', 'w') as tips:
+ marklist = root.iter(mark)
+ for key in marklist:
+ tip = ElementTree.tostring(key, encoding="UTF-8", method="xml")
+ if sys.version_info[0] < 3:
+ tip = tip.replace("", "")
+ tip = tip.replace('\n<_tip number="%(number)s">' % key.attrib, "")
+ else: # python3 support
+ tip = tip.decode("utf-8")
+ tip = tip.replace('<_tip number="%(number)s">' % key.attrib, "")
+ tip = tip.replace(" ", " ")
+ #tip = tip.replace("\n\n", "\n") # special case tip 7
+ #tip = tip.replace("\n", "") # special case tip 18
+ tip = tip.replace("\n\n", "")
+ tip = tip.replace('"', '"')
+ tips.write('char *s = N_("%s");\n' % tip)
print ('Wrote ../data/tips.xml.in.h')
root.clear()
@@ -215,15 +214,14 @@ def HolidaysParse(filename, mark):
msgid "Yom Kippur"
'''
- holidays = open('../data/holidays.xml.in.h', 'w')
- for key in ellist:
- if key.attrib.get(mark):
- line = key.attrib
- string = line.items
- # mapping via the line dict (_name is the key)
- name = 'char *s = N_("%(_name)s");\n' % line
- holidays.write(name)
- holidays.close()
+ with open('../data/holidays.xml.in.h', 'w') as holidays:
+ for key in ellist:
+ if key.attrib.get(mark):
+ line = key.attrib
+ string = line.items
+ # mapping via the line dict (_name is the key)
+ name = 'char *s = N_("%(_name)s");\n' % line
+ holidays.write(name)
print ('Wrote ../data/holidays.xml.in.h')
root.clear()
@@ -262,20 +260,19 @@ def XmlParse(filename, mark):
'''
- head = open(filename + '.h', 'w')
-
- for key in root.iter():
- if key.tag == '{http://www.freedesktop.org/standards/shared-mime-info}%s' % mark:
- comment = 'char *s = N_("%s");\n' % key.text
- head.write(comment)
-
- if root.tag == 'application':
+ with open(filename + '.h', 'w') as head:
+
for key in root.iter():
- if key.tag == mark:
+ if key.tag == '{http://www.freedesktop.org/standards/shared-mime-info}%s' % mark:
comment = 'char *s = N_("%s");\n' % key.text
head.write(comment)
-
- head.close()
+
+ if root.tag == 'application':
+ for key in root.iter():
+ if key.tag == mark:
+ comment = 'char *s = N_("%s");\n' % key.text
+ head.write(comment)
+
print ('Wrote %s' % filename)
root.clear()
@@ -301,22 +298,19 @@ def DesktopParse(filename):
perform genealogical research and analysis"
'''
- desktop = open('../data/gramps.desktop.in.h', 'w')
-
- f = open(filename)
- lines = [file.strip() for file in f]
- f.close()
-
- for line in lines:
- if line[0] == '_':
- for i in range(len(line)):
- if line[i] == '=':
- val = 'char *s = N_("%s");\n' % line[i+1:len(line)]
- desktop.write(val)
-
- desktop.close()
+ with open('../data/gramps.desktop.in.h', 'w') as desktop:
+
+ with open(filename) as f:
+ lines = [file.strip() for file in f]
+
+ for line in lines:
+ if line[0] == '_':
+ for i in range(len(line)):
+ if line[i] == '=':
+ val = 'char *s = N_("%s");\n' % line[i+1:len(line)]
+ desktop.write(val)
+
print ('Wrote ../data/gramps.desktop.in.h')
-
def KeyParse(filename, mark):
"""
@@ -342,29 +336,26 @@ def KeyParse(filename, mark):
msgid "Gramps XML database"
msgid "GEDCOM"
'''
-
- key = open('../data/gramps.keys.in.h', 'w')
-
- f = open(filename)
- lines = [file for file in f]
- f.close()
-
- temp = []
-
- for line in lines:
- for i in range(len(line)):
- if line[i:i+12] == mark:
- temp.append(line.strip())
-
- for t in temp:
- for i in range(len(t)):
- if t[i] == '=':
- val = 'char *s = N_("%s");\n' % t[i+1:len(t)]
- key.write(val)
-
- key.close()
+
+ with open('../data/gramps.keys.in.h', 'w') as key:
+
+ with open(filename) as f:
+ lines = [file for file in f]
+
+ temp = []
+
+ for line in lines:
+ for i in range(len(line)):
+ if line[i:i+12] == mark:
+ temp.append(line.strip())
+
+ for t in temp:
+ for i in range(len(t)):
+ if t[i] == '=':
+ val = 'char *s = N_("%s");\n' % t[i+1:len(t)]
+ key.write(val)
+
print ('Wrote ../data/gramps.keys.in.h')
-
def main():
"""
@@ -467,15 +458,14 @@ def create_filesfile():
dir = os.getcwd()
topdir = os.path.normpath(os.path.join(dir, '..', 'gramps'))
lentopdir = len(topdir)
- f = open('POTFILES.in')
- infiles = dict(['../' + file.strip(), None] for file in f if file.strip()
- and not file[0]=='#')
- f.close()
- f = open('POTFILES.skip')
- notinfiles = dict(['../' + file.strip(), None] for file in f if file
- and not file[0]=='#')
- f.close()
-
+ with open('POTFILES.in') as f:
+ infiles = dict(['../' + file.strip(), None] for file in f if file.strip()
+ and not file[0]=='#')
+
+ with open('POTFILES.skip') as f:
+ notinfiles = dict(['../' + file.strip(), None] for file in f if file
+ and not file[0]=='#')
+
for (dirpath, dirnames, filenames) in os.walk(topdir):
root, subdir = os.path.split(dirpath)
if subdir.startswith("."):
@@ -499,11 +489,10 @@ def create_filesfile():
if full_filename[lentopdir:] in notinfiles:
infiles['../gramps' + full_filename[lentopdir:]] = None
#now we write out all the files in form ../gramps/filename
- f = open('tmpfiles', 'w')
- for file in sorted(infiles.keys()):
- f.write(file)
- f.write('\n')
- f.close()
+ with open('tmpfiles', 'w') as f:
+ for file in sorted(infiles.keys()):
+ f.write(file)
+ f.write('\n')
def listing(name, extensionlist):
"""
@@ -511,22 +500,19 @@ def listing(name, extensionlist):
Parsing from a textual file (gramps) is faster and easy for maintenance.
Like POTFILES.in and POTFILES.skip
"""
-
- f = open('tmpfiles')
- files = [file.strip() for file in f if file and not file[0]=='#']
- f.close()
-
- temp = open(name, 'w')
-
- for entry in files:
- for ext in extensionlist:
- if entry.endswith(ext):
- temp.write(entry)
- temp.write('\n')
- break
-
- temp.close()
-
+
+ with open('tmpfiles') as f:
+ files = [file.strip() for file in f if file and not file[0]=='#']
+
+ with open(name, 'w') as temp:
+
+ for entry in files:
+ for ext in extensionlist:
+ if entry.endswith(ext):
+ temp.write(entry)
+ temp.write('\n')
+ break
+
def headers():
"""
Look at existing C file format headers.
@@ -565,14 +551,13 @@ def extract_xml():
XmlParse('../data/gramps.appdata.xml.in', '_p')
DesktopParse('../data/gramps.desktop.in')
KeyParse('../data/gramps.keys.in', '_description')
-
+
def create_template():
"""
Create a new file for template, if it does not exist.
"""
- template = open('gramps.pot', 'w')
- template.close()
-
+ with open('gramps.pot', 'w') as template:
+
def extract_glade():
"""
Extract messages from a temp file with all .glade
@@ -622,21 +607,20 @@ def extract_gtkbuilder():
msgid "At least one rule must apply"
msgid "Exactly one rule must apply"
'''
-
+
files = ['../gramps/plugins/importer/importgedcom.glade', '../gramps/gui/glade/rule.glade']
- temp = open('gtklist.h', 'w')
-
- for filename in files:
- tree = ElementTree.parse(filename)
- root = tree.getroot()
- for line in root.iter():
- att = line.attrib
- if att == {'id': '0', 'translatable': 'yes'}:
- col = 'char *s = N_("%s");\n' % line.text
- temp.write(col)
- root.clear()
-
- temp.close()
+ with open('gtklist.h', 'w') as temp:
+
+ for filename in files:
+ tree = ElementTree.parse(filename)
+ root = tree.getroot()
+ for line in root.iter():
+ att = line.attrib
+ if att == {'id': '0', 'translatable': 'yes'}:
+ col = 'char *s = N_("%s");\n' % line.text
+ temp.write(col)
+ root.clear()
+
print ('Wrote gtklist.h')
def retrieve():
From 3f86dd3e25958cd2ea9b1c38041b353c02616352 Mon Sep 17 00:00:00 2001
From: Sam Manzi
Date: Tue, 19 Apr 2016 09:15:05 +1000
Subject: [PATCH 2/3] Editorial changes & Fixes from QuLogic
---
gramps/gen/dbstate.py | 1 -
.../plugins/database/bsddb_support/write.py | 3 +-
po/update_po.py | 165 ++++++++----------
3 files changed, 76 insertions(+), 93 deletions(-)
diff --git a/gramps/gen/dbstate.py b/gramps/gen/dbstate.py
index 0856e899c..e4564a63f 100644
--- a/gramps/gen/dbstate.py
+++ b/gramps/gen/dbstate.py
@@ -219,7 +219,6 @@ class DbState(Callback):
fname = os.path.join(dirpath, "lock")
with open(fname, 'r', encoding='utf8') as ifile:
locked_by = ifile.read().strip()
- ifile.close()
except (OSError, IOError):
pass
return (dirpath, locked, locked_by, backend)
diff --git a/gramps/plugins/database/bsddb_support/write.py b/gramps/plugins/database/bsddb_support/write.py
index a916c817f..626f4ce62 100644
--- a/gramps/plugins/database/bsddb_support/write.py
+++ b/gramps/plugins/database/bsddb_support/write.py
@@ -436,7 +436,8 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
def __log_error(self):
mypath = os.path.join(self.get_save_path(),DBRECOVFN)
- with open(mypath, "w") as ofile:
+ ofile = open(mypath, "w")
+ ofile.close()
try:
clear_lock_file(self.get_save_path())
except:
diff --git a/po/update_po.py b/po/update_po.py
index e722d81f4..edc2cb038 100644
--- a/po/update_po.py
+++ b/po/update_po.py
@@ -37,11 +37,11 @@ Examples:
python update_po.py -p
Generates a new template/catalog (gramps.pot).
-
+
python update_po.py -m de.po
Merges 'de.po' file with 'gramps.pot'.
-
+
python update_po.py -k de.po
Checks 'de.po' file, tests to compile and generates a textual resume.
@@ -55,7 +55,7 @@ from argparse import ArgumentParser
# Windows OS
-if sys.platform == 'win32':
+if sys.platform == 'win32':
# GetText Win 32 obtained from http://gnuwin32.sourceforge.net/packages/gettext.htm
# ....\gettext\bin\msgmerge.exe needs to be on the path
msgmergeCmd = os.path.join('C:', 'Program Files(x86)', 'gettext', 'bin', 'msgmerge.exe')
@@ -96,67 +96,64 @@ def tests():
print ("\n====='msgmerge'=(merge our translation)================\n")
os.system('''%(program)s -V''' % {'program': msgmergeCmd})
except:
- print ('Please, install %(program)s for updating your translation'
+ print ('Please, install %(program)s for updating your translation'
% {'program': msgmergeCmd})
-
+
try:
print ("\n==='msgfmt'=(format our translation for installation)==\n")
os.system('''%(program)s -V''' % {'program': msgfmtCmd})
except:
- print ('Please, install %(program)s for checking your translation'
+ print ('Please, install %(program)s for checking your translation'
% {'program': msgfmtCmd})
-
+
try:
print ("\n===='msgattrib'==(list groups of messages)=============\n")
os.system('''%(program)s -V''' % {'program': msgattribCmd})
except:
- print ('Please, install %(program)s for listing groups of messages'
+ print ('Please, install %(program)s for listing groups of messages'
% {'program': msgattribCmd})
-
-
+
try:
print("\n===='xgettext' =(generate a new template)==============\n")
os.system('''%(program)s -V''' % {'program': xgettextCmd})
except:
- print ('Please, install %(program)s for generating a new template'
+ print ('Please, install %(program)s for generating a new template'
% {'program': xgettextCmd})
-
+
try:
print("\n=================='python'=============================\n")
os.system('''%(program)s -V''' % {'program': pythonCmd})
except:
print ('Please, install python')
-
def TipsParse(filename, mark):
"""
Experimental alternative to 'intltool-extract' for 'tips.xml'.
"""
-
from xml.etree import ElementTree
-
+
tree = ElementTree.parse(filename)
root = tree.getroot()
-
+
'''
<_tip number="1">
Working with Dates
- A range of dates can be given by using the format "between
- January 4, 2000 and March 20, 2003". You can also indicate
- the level of confidence in a date and even choose between seven
+ A range of dates can be given by using the format "between
+ January 4, 2000 and March 20, 2003". You can also indicate
+ the level of confidence in a date and even choose between seven
different calendars. Try the button next to the date field in the
Events Editor.
-
- char *s = N_("Working with Dates A range of dates can be
+
+ char *s = N_("Working with Dates A range of dates can be
given by using the format "between January 4, 2000 and March 20,
- 2003". You can also indicate the level of confidence in a date
- and even choose between seven different calendars. Try the button
+ 2003". You can also indicate the level of confidence in a date
+ and even choose between seven different calendars. Try the button
next to the date field in the Events Editor.");
-
+
gramps.pot:
msgid ""
"Working with Dates A range of dates can be given by using the "
@@ -165,7 +162,7 @@ def TipsParse(filename, mark):
"different calendars. Try the button next to the date field in the Events "
"Editor."
'''
-
+
with open('../data/tips.xml.in.h', 'w') as tips:
marklist = root.iter(mark)
for key in marklist:
@@ -184,14 +181,13 @@ def TipsParse(filename, mark):
tips.write('char *s = N_("%s");\n' % tip)
print ('Wrote ../data/tips.xml.in.h')
root.clear()
-
+
def HolidaysParse(filename, mark):
"""
Experimental alternative to 'intltool-extract' for 'holidays.xml'.
"""
-
from xml.etree import ElementTree
-
+
tree = ElementTree.parse(filename)
root = tree.getroot()
ellist = root.iter()
@@ -203,17 +199,16 @@ def HolidaysParse(filename, mark):
..
-
+
char *s = N_("Bulgaria");
char *s = N_("Jewish Holidays");
char *s = N_("Yom Kippur");
-
+
gramps.pot:
msgid "Bulgaria"
msgid "Jewish Holidays"
msgid "Yom Kippur"
'''
-
with open('../data/holidays.xml.in.h', 'w') as holidays:
for key in ellist:
if key.attrib.get(mark):
@@ -230,12 +225,11 @@ def XmlParse(filename, mark):
"""
Experimental alternative to 'intltool-extract' for 'file.xml.in'.
"""
-
from xml.etree import ElementTree
-
+
tree = ElementTree.parse(filename)
root = tree.getroot()
-
+
'''
@@ -250,18 +244,17 @@ def XmlParse(filename, mark):
-
+
msgid "Gramps database"
msgid "GEDCOM"
-
+
<_p> Gramps is a free software project and community.
We strive to produce a genealogy program that is both intuitive for hobbyists
and feature-complete for professional genealogists.
'''
-
- with open(filename + '.h', 'w') as head:
+ with open(filename + '.h', 'w') as head:
for key in root.iter():
if key.tag == '{http://www.freedesktop.org/standards/shared-mime-info}%s' % mark:
comment = 'char *s = N_("%s");\n' % key.text
@@ -276,20 +269,19 @@ def XmlParse(filename, mark):
print ('Wrote %s' % filename)
root.clear()
-
def DesktopParse(filename):
"""
Experimental alternative to 'intltool-extract' for 'gramps.desktop'.
"""
-
+
'''
[Desktop Entry]
_Name=Gramps
_GenericName=Genealogy System
_X-GNOME-FullName=Gramps Genealogy System
- _Comment=Manage genealogical information,
+ _Comment=Manage genealogical information,
perform genealogical research and analysis
-
+
msgid "Gramps"
msgid "Genealogy System"
msgid "Gramps Genealogy System"
@@ -297,7 +289,6 @@ def DesktopParse(filename):
"Manage genealogical information,
perform genealogical research and analysis"
'''
-
with open('../data/gramps.desktop.in.h', 'w') as desktop:
with open(filename) as f:
@@ -316,7 +307,7 @@ def KeyParse(filename, mark):
"""
Experimental alternative to 'intltool-extract' for 'gramps.keys'.
"""
-
+
'''
application/x-gramps-xml:
_description=Gramps XML database
@@ -332,11 +323,10 @@ def KeyParse(filename, mark):
application/x-gedcom:
_description=GEDCOM
default_action_type=application
-
+
msgid "Gramps XML database"
msgid "GEDCOM"
'''
-
with open('../data/gramps.keys.in.h', 'w') as key:
with open(filename) as f:
@@ -362,15 +352,15 @@ def main():
The utility for handling translation stuff.
What is need by Gramps, nothing more.
"""
-
- parser = ArgumentParser(
+
+ parser = ArgumentParser(
description='This program generates a new template and '
- 'also provides some common features.',
+ 'also provides some common features.',
)
parser.add_argument("-t", "--test",
action="store_true", dest="test", default=True,
help="test if 'python' and 'gettext' are properly installed")
-
+
parser.add_argument("-x", "--xml",
action="store_true", dest="xml", default=False,
help="extract messages from xml based file formats")
@@ -383,76 +373,75 @@ def main():
parser.add_argument("-p", "--pot",
action="store_true", dest="catalog", default=False,
help="create a new catalog")
-
+
update = parser.add_argument_group('Update', 'Maintenance around translations')
-
+
# need at least one argument (sv.po, de.po, etc ...)
- # lang.po files maintenance
+ # lang.po files maintenance
update.add_argument("-m", dest="merge",
choices=LANG,
help="merge lang.po files with last catalog")
-
+
update.add_argument("-k", dest="check",
choices=LANG,
help="check lang.po files")
-
- # testing stage
+
+ # testing stage
trans = parser.add_argument_group('Translation', 'Display content of translations file')
-
+
# need one argument (eg, de.po)
-
- trans.add_argument("-u", dest="untranslated",
+
+ trans.add_argument("-u", dest="untranslated",
choices=[file for file in os.listdir('.') if file.endswith('.po')],
help="list untranslated messages")
trans.add_argument("-f", dest="fuzzy",
choices=[file for file in os.listdir('.') if file.endswith('.po')],
help="list fuzzy messages")
-
-
+
args = parser.parse_args()
namespace, extra = parser.parse_known_args()
if args.test:
tests()
-
+
if args.xml:
extract_xml()
-
+
if args.glade:
create_filesfile()
extract_glade()
if os.path.isfile('tmpfiles'):
os.unlink('tmpfiles')
-
+
if args.catalog:
retrieve()
-
+
if args.clean:
clean()
-
+
if args.merge:
#retrieve() windows os?
if sys.argv[2:] == ['all']:
sys.argv[2:] = LANG
merge(sys.argv[2:])
-
+
if args.check:
#retrieve() windows os?
if sys.argv[2:] == ['all']:
sys.argv[2:] = LANG
check(sys.argv[2:])
-
+
if args.untranslated:
untranslated(sys.argv[2:])
-
+
if args.fuzzy:
fuzzy(sys.argv[2:])
def create_filesfile():
"""
Create a file with all files that we should translate.
- These are all python files not in POTFILES.skip added with those in
+ These are all python files not in POTFILES.skip added with those in
POTFILES.in
"""
dir = os.getcwd()
@@ -480,7 +469,7 @@ def create_filesfile():
# if the directory does not exist or is a link, do nothing
if not os.path.isdir(dirpath) or os.path.islink(dirpath):
continue
-
+
for filename in os.listdir(dirpath):
name = os.path.split(filename)[1]
if name.endswith('.py') or name.endswith('.glade'):
@@ -505,7 +494,6 @@ def listing(name, extensionlist):
files = [file.strip() for file in f if file and not file[0]=='#']
with open(name, 'w') as temp:
-
for entry in files:
for ext in extensionlist:
if entry.endswith(ext):
@@ -516,7 +504,7 @@ def listing(name, extensionlist):
def headers():
"""
Look at existing C file format headers.
- Generated by 'intltool-extract' but want to get rid of this
+ Generated by 'intltool-extract' but want to get rid of this
dependency (perl, just a set of tools).
"""
headers = []
@@ -536,7 +524,7 @@ def headers():
headers.append('''../data/gramps.appdata.xml.in.h''')
if os.path.isfile('''gtklist.h'''):
headers.append('''gtklist.h''')
-
+
return headers
def extract_xml():
@@ -544,7 +532,6 @@ def extract_xml():
Extract translation strings from XML based, keys, mime and desktop
files. Own XML files parsing and custom translation marks.
"""
-
HolidaysParse('../data/holidays.xml.in', '_name')
TipsParse('../data/tips.xml.in', '_tip')
XmlParse('../data/gramps.xml.in', '_comment')
@@ -557,6 +544,7 @@ def create_template():
Create a new file for template, if it does not exist.
"""
with open('gramps.pot', 'w') as template:
+ pass
def extract_glade():
"""
@@ -577,9 +565,9 @@ def extract_gtkbuilder():
https://savannah.gnu.org/bugs/index.php?29216
See bug reports #6595, #5621
"""
-
+
from xml.etree import ElementTree
-
+
'''
@@ -602,7 +590,7 @@ def extract_gtkbuilder():
-
+
msgid "All rules must apply"
msgid "At least one rule must apply"
msgid "Exactly one rule must apply"
@@ -610,7 +598,6 @@ def extract_gtkbuilder():
files = ['../gramps/plugins/importer/importgedcom.glade', '../gramps/gui/glade/rule.glade']
with open('gtklist.h', 'w') as temp:
-
for filename in files:
tree = ElementTree.parse(filename)
root = tree.getroot()
@@ -628,14 +615,14 @@ def retrieve():
Extract messages from all files used by Gramps (python, glade, xml)
"""
extract_xml()
-
+
extract_gtkbuilder()
-
+
create_template()
-
+
create_filesfile()
listing('python.txt', ['.py', '.py.in'])
-
+
# additional keywords must always be kept in sync with those in genpot.sh
os.system('''%(xgettext)s -F -c -j --directory=./ -d gramps '''
'''-L Python -o gramps.pot --files-from=python.txt '''
@@ -643,14 +630,14 @@ def retrieve():
'''--keyword=_T_ --keyword=trans_text '''
'''--keyword=sgettext --from-code=UTF-8''' % {'xgettext': xgettextCmd}
)
-
+
extract_glade()
-
+
# C format header (.h extension)
for h in headers():
print ('xgettext for %s' % h)
os.system('''%(xgettext)s -F --add-comments -j -o gramps.pot '''
- '''--keyword=N_ --from-code=UTF-8 %(head)s'''
+ '''--keyword=N_ --from-code=UTF-8 %(head)s'''
% {'xgettext': xgettextCmd, 'head': h}
)
clean()
@@ -680,10 +667,9 @@ def merge(args):
"""
Merge messages with 'gramps.pot'
"""
-
for arg in args:
if arg == 'all':
- continue
+ continue
print ('Merge %(lang)s with current template' % {'lang': arg})
os.system('''%(msgmerge)s %(lang)s gramps.pot -o updated_%(lang)s''' \
% {'msgmerge': msgmergeCmd, 'lang': arg})
@@ -693,7 +679,6 @@ def check(args):
"""
Check the translation file
"""
-
for arg in args:
if arg == 'all':
continue
@@ -708,14 +693,12 @@ def untranslated(arg):
"""
List untranslated messages
"""
-
os.system('''%(msgattrib)s --untranslated %(lang.po)s''' % {'msgattrib': msgattribCmd, 'lang.po': arg[0]})
def fuzzy(arg):
"""
List fuzzy messages
"""
-
os.system('''%(msgattrib)s --only-fuzzy --no-obsolete %(lang.po)s''' % {'msgattrib': msgattribCmd, 'lang.po': arg[0]})
if __name__ == "__main__":
From 1d805510a7843530e1a24af384634cb6b7f30b45 Mon Sep 17 00:00:00 2001
From: Sam Manzi
Date: Tue, 19 Apr 2016 09:15:56 +1000
Subject: [PATCH 3/3] Add back line as per QuLogic
---
gramps/gen/dbstate.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/gramps/gen/dbstate.py b/gramps/gen/dbstate.py
index e4564a63f..078f4e40f 100644
--- a/gramps/gen/dbstate.py
+++ b/gramps/gen/dbstate.py
@@ -219,6 +219,7 @@ class DbState(Callback):
fname = os.path.join(dirpath, "lock")
with open(fname, 'r', encoding='utf8') as ifile:
locked_by = ifile.read().strip()
+ locked = True
except (OSError, IOError):
pass
return (dirpath, locked, locked_by, backend)