From a9685a64ffb223c9e4df9757bf13252ace3bc355 Mon Sep 17 00:00:00 2001 From: Dale Athanasias Date: Tue, 26 Apr 2016 14:29:40 +1000 Subject: [PATCH 1/7] Missed 'open' statements From: Dale Athanasias Mon, 25 Apr 2016 13:41:18 +1000 Subject: Missed 'open' statements Hi Sam, Here's a few files with missed 'open' statements: gramps/gen/filters/_filterlist.py gramps/plugins/export/exportftree.py gramps/plugins/database/bsddb_support/write.py And some older files which you probably left alone for a reason? windows/nonAIO/builder/build_GrampsWin32.py windows/nonAIO/check_gtk_install.py windows/nonAIO/builder/make_launcher.py windows/nonAIO/builder/check_gtk_install.py windows/nonAIO/nsis/gcheck.py Regards - Dale Re: Prefer with to open files https://github.com/gramps-project/gramps/pull/113 --- gramps/gen/filters/_filterlist.py | 49 +++++----- .../plugins/database/bsddb_support/write.py | 64 ++++++------- gramps/plugins/export/exportftree.py | 95 +++++++++---------- 3 files changed, 102 insertions(+), 106 deletions(-) diff --git a/gramps/gen/filters/_filterlist.py b/gramps/gen/filters/_filterlist.py index 9e7f8b259..c07e20a98 100644 --- a/gramps/gen/filters/_filterlist.py +++ b/gramps/gen/filters/_filterlist.py @@ -118,28 +118,27 @@ class FilterList(object): return l.replace('"', '"') def save(self): - f = open(self.file, 'w', encoding='utf8') - f.write("\n") - f.write('\n') - for namespace in self.filter_namespaces: - f.write('\n' % namespace) - filter_list = self.filter_namespaces[namespace] - for the_filter in filter_list: - f.write(' \n') - for rule in the_filter.get_rules(): - f.write(' \n' - % (rule.__class__.__name__, rule.use_regex)) - for value in list(rule.values()): - f.write(' \n' % self.fix(value)) - f.write(' \n') - f.write(' \n') - f.write('\n') - f.write('\n') - f.close() + with open(self.file, 'w', encoding='utf8') as f: + f.write("\n") + f.write('\n') + for namespace in self.filter_namespaces: + f.write('\n' % namespace) + filter_list = self.filter_namespaces[namespace] + for the_filter in filter_list: + f.write(' \n') + for rule in the_filter.get_rules(): + f.write(' \n' + % (rule.__class__.__name__, rule.use_regex)) + for value in list(rule.values()): + f.write(' \n' % self.fix(value)) + f.write(' \n') + f.write(' \n') + f.write('\n') + f.write('\n') diff --git a/gramps/plugins/database/bsddb_support/write.py b/gramps/plugins/database/bsddb_support/write.py index 49f7f25f8..d9ad26c6d 100644 --- a/gramps/plugins/database/bsddb_support/write.py +++ b/gramps/plugins/database/bsddb_support/write.py @@ -458,8 +458,8 @@ 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: + pass try: clear_lock_file(self.get_save_path()) except: @@ -2591,15 +2591,14 @@ def do_export(database): try: for (base, tbl) in build_tbl_map(database): backup_name = mk_tmp_name(database, base) - backup_table = open(backup_name, 'wb') + with open(backup_name, 'wb') as backup_table: - cursor = tbl.cursor() - data = cursor.first() - while data: - pickle.dump(data, backup_table, 2) - data = cursor.next() - cursor.close() - backup_table.close() + cursor = tbl.cursor() + data = cursor.first() + while data: + pickle.dump(data, backup_table, 2) + data = cursor.next() + cursor.close() except (IOError,OSError): return @@ -2678,29 +2677,28 @@ def clear_lock_file(name): def write_lock_file(name): if not os.path.isdir(name): os.mkdir(name) - f = open(os.path.join(name, DBLOCKFN), "w", encoding='utf8') - if win(): - user = get_env_var('USERNAME') - host = get_env_var('USERDOMAIN') - if host is None: - host = "" - else: - host = os.uname()[1] - # An ugly workaround for os.getlogin() issue with Konsole - try: - user = os.getlogin() - except: - # not win, so don't need get_env_var. - # under cron getlogin() throws and there is no USER. - user = os.environ.get('USER', 'noUSER') - if host: - text = "%s@%s" % (user, host) - else: - text = user - # Save only the username and host, so the massage can be - # printed with correct locale in DbManager.py when a lock is found - f.write(text) - f.close() + with open(os.path.join(name, DBLOCKFN), "w", encoding='utf8') as f: + if win(): + user = get_env_var('USERNAME') + host = get_env_var('USERDOMAIN') + if host is None: + host = "" + else: + host = os.uname()[1] + # An ugly workaround for os.getlogin() issue with Konsole + try: + user = os.getlogin() + except: + # not win, so don't need get_env_var. + # under cron getlogin() throws and there is no USER. + user = os.environ.get('USER', 'noUSER') + if host: + text = "%s@%s" % (user, host) + else: + text = user + # Save only the username and host, so the massage can be + # printed with correct locale in DbManager.py when a lock is found + f.write(text) def upgrade_researcher(owner_data): """ diff --git a/gramps/plugins/export/exportftree.py b/gramps/plugins/export/exportftree.py index d4c9377c2..0d4849af0 100644 --- a/gramps/plugins/export/exportftree.py +++ b/gramps/plugins/export/exportftree.py @@ -121,61 +121,60 @@ class FtreeWriter(object): id_map[key] = n id_name[key] = get_name(pn, sn, count) - f = open(self.filename,"w") + with open(self.filename,"w") as f: - for key in self.plist: - self.update() - p = self.db.get_person_from_handle(key) - name = id_name[key] - father = mother = email = web = "" + for key in self.plist: + self.update() + p = self.db.get_person_from_handle(key) + name = id_name[key] + father = mother = email = web = "" - family_handle = p.get_main_parents_family_handle() - if family_handle: - family = self.db.get_family_from_handle(family_handle) - if family.get_father_handle() and \ - family.get_father_handle() in id_map: - father = id_map[family.get_father_handle()] - if family.get_mother_handle() and \ - family.get_mother_handle() in id_map: - mother = id_map[family.get_mother_handle()] + family_handle = p.get_main_parents_family_handle() + if family_handle: + family = self.db.get_family_from_handle(family_handle) + if family.get_father_handle() and \ + family.get_father_handle() in id_map: + father = id_map[family.get_father_handle()] + if family.get_mother_handle() and \ + family.get_mother_handle() in id_map: + mother = id_map[family.get_mother_handle()] - # - # Calculate Date - # - birth_ref = p.get_birth_ref() - death_ref = p.get_death_ref() - if birth_ref: - birth_event = self.db.get_event_from_handle(birth_ref.ref) - birth = birth_event.get_date_object() - else: - birth = None - if death_ref: - death_event = self.db.get_event_from_handle(death_ref.ref) - death = death_event.get_date_object() - else: - death = None - - #if self.restrict: - # alive = probably_alive(p, self.db) - #else: - # alive = 0 - - if birth: - if death: - dates = "%s-%s" % (fdate(birth), fdate(death)) + # + # Calculate Date + # + birth_ref = p.get_birth_ref() + death_ref = p.get_death_ref() + if birth_ref: + birth_event = self.db.get_event_from_handle(birth_ref.ref) + birth = birth_event.get_date_object() else: - dates = fdate(birth) - else: - if death: - dates = fdate(death) + birth = None + if death_ref: + death_event = self.db.get_event_from_handle(death_ref.ref) + death = death_event.get_date_object() else: - dates = "" + death = None - f.write('%s;%s;%s;%s;%s;%s\n' % (name, father, mother, email, web, - dates)) + #if self.restrict: + # alive = probably_alive(p, self.db) + #else: + # alive = 0 - f.close() - return True + if birth: + if death: + dates = "%s-%s" % (fdate(birth), fdate(death)) + else: + dates = fdate(birth) + else: + if death: + dates = fdate(death) + else: + dates = "" + + f.write('%s;%s;%s;%s;%s;%s\n' % (name, father, mother, email, web, + dates)) + + return True def fdate(val): if val.get_year_valid(): From 35b160ca0b647406988b9a9dfe10ae87ac8462a0 Mon Sep 17 00:00:00 2001 From: Eno Date: Wed, 27 Apr 2016 08:11:58 +1000 Subject: [PATCH 2/7] Fixes for Missed 'open' statements --- gramps/plugins/database/bsddb_support/write.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gramps/plugins/database/bsddb_support/write.py b/gramps/plugins/database/bsddb_support/write.py index d9ad26c6d..5049d684f 100644 --- a/gramps/plugins/database/bsddb_support/write.py +++ b/gramps/plugins/database/bsddb_support/write.py @@ -2537,9 +2537,9 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback): schema_version = self.metadata.get(b'version', default=None) bdbversion_file = os.path.join(self.path, BDBVERSFN) if os.path.isfile(bdbversion_file): - vers_file = open(bdbversion_file) - bsddb_version = vers_file.readline().strip() - bsddb_version = ".".join([str(v) for v in safe_eval(bsddb_version)]) + with open(bdbversion_file) as vers_file: + bsddb_version = vers_file.readline().strip() + bsddb_version = ".".join([str(v) for v in safe_eval(bsddb_version)]) else: bsddb_version = _("Unknown") return { @@ -2619,8 +2619,8 @@ def do_restore(database): """ for (base, tbl) in build_tbl_map(database): backup_name = mk_backup_name(database, base) - backup_table = open(backup_name, 'rb') - load_tbl_txn(database, backup_table, tbl) + with open(backup_name, 'rb') as backup_table: + load_tbl_txn(database, backup_table, tbl) database.rebuild_secondary() From af9baca35e67a984a49617c36fd17ca8c6271261 Mon Sep 17 00:00:00 2001 From: Sam Manzi Date: Wed, 27 Apr 2016 19:28:26 +1000 Subject: [PATCH 3/7] Change Exportgedcoms open --- gramps/plugins/export/exportgedcom.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/gramps/plugins/export/exportgedcom.py b/gramps/plugins/export/exportgedcom.py index 0253ad800..5e5edb7cb 100644 --- a/gramps/plugins/export/exportgedcom.py +++ b/gramps/plugins/export/exportgedcom.py @@ -238,17 +238,17 @@ class GedcomWriter(UpdateCallback): """ self.dirname = os.path.dirname (filename) - self.gedcom_file = open(filename, "w", encoding='utf-8') - self._header(filename) - self._submitter() - self._individuals() - self._families() - self._sources() - self._repos() - self._notes() + with open(filename, "w", encoding='utf-8') as self.gedcom_file: + self._header(filename) + self._submitter() + self._individuals() + self._families() + self._sources() + self._repos() + self._notes() + + self._writeln(0, "TRLR") - self._writeln(0, "TRLR") - self.gedcom_file.close() return True def _writeln(self, level, token, textlines="", limit=72): From 59793536ed6e08e9a83427f2a76071f82df545ba Mon Sep 17 00:00:00 2001 From: Eno Date: Thu, 28 Apr 2016 08:23:21 +1000 Subject: [PATCH 4/7] Fixes for Missed 'open' statements --- gramps/cli/grampscli.py | 5 ++--- gramps/gen/db/generic.py | 10 ++++------ gramps/gen/plug/report/_book.py | 5 ++--- gramps/gen/plug/report/_paper.py | 5 ++--- gramps/gui/aboutdialog.py | 10 ++++------ gramps/gui/dbman.py | 5 ++--- gramps/plugins/database/bsddb_support/read.py | 10 ++++------ gramps/plugins/database/bsddb_support/summary.py | 4 ++-- gramps/plugins/docgen/odfdoc.py | 5 ++--- gramps/plugins/tool/verify.py | 5 ++--- 10 files changed, 26 insertions(+), 38 deletions(-) diff --git a/gramps/cli/grampscli.py b/gramps/cli/grampscli.py index ac66aa9ae..7f665d20d 100644 --- a/gramps/cli/grampscli.py +++ b/gramps/cli/grampscli.py @@ -265,9 +265,8 @@ class CLIManager(object): # Attempt to figure out the database title path = os.path.join(filename, "name.txt") try: - ifile = open(path) - title = ifile.readline().strip() - ifile.close() + with open(path) as ifile: + title = ifile.readline().strip() except: title = filename diff --git a/gramps/gen/db/generic.py b/gramps/gen/db/generic.py index e0ea382ed..55317eaf3 100644 --- a/gramps/gen/db/generic.py +++ b/gramps/gen/db/generic.py @@ -2026,9 +2026,8 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback): """ filepath = os.path.join(self._directory, "name.txt") try: - name_file = open(filepath, "r") - name = name_file.readline().strip() - name_file.close() + with open(filepath, "r") as name_file: + name = name_file.readline().strip() except (OSError, IOError) as msg: LOG.error(str(msg)) name = None @@ -2129,9 +2128,8 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback): if self._directory: filepath = os.path.join(self._directory, "bdbversion.txt") try: - name_file = open(filepath, "r", encoding='utf-8') - version = name_file.readline().strip() - name_file.close() + with open(filepath, "r", encoding='utf-8') as name_file: + version = name_file.readline().strip() except (OSError, IOError) as msg: self.__log_error() version = "(0, 0, 0)" diff --git a/gramps/gen/plug/report/_book.py b/gramps/gen/plug/report/_book.py index d01548b16..8e7c405a2 100644 --- a/gramps/gen/plug/report/_book.py +++ b/gramps/gen/plug/report/_book.py @@ -527,9 +527,8 @@ class BookList(object): try: p = make_parser() p.setContentHandler(BookParser(self, self.dbase)) - the_file = open(self.file) - p.parse(the_file) - the_file.close() + with open(self.file) as the_file: + p.parse(the_file) except (IOError, OSError, ValueError, SAXParseException, KeyError, AttributeError): pass diff --git a/gramps/gen/plug/report/_paper.py b/gramps/gen/plug/report/_paper.py index 277d8a354..ce796b9f2 100644 --- a/gramps/gen/plug/report/_paper.py +++ b/gramps/gen/plug/report/_paper.py @@ -83,9 +83,8 @@ class PageSizeParser(handler.ContentHandler): try: parser = make_parser() parser.setContentHandler(PageSizeParser(paper_sizes)) - the_file = open(PAPERSIZE) - parser.parse(the_file) - the_file.close() + with open(PAPERSIZE) as the_file: + parser.parse(the_file) paper_sizes.append(PaperSize("Custom Size", -1, -1)) # always in English except (IOError, OSError, SAXParseException): paper_sizes = [ diff --git a/gramps/gui/aboutdialog.py b/gramps/gui/aboutdialog.py index c9ddcf795..fe746a014 100644 --- a/gramps/gui/aboutdialog.py +++ b/gramps/gui/aboutdialog.py @@ -96,9 +96,8 @@ class GrampsAboutDialog(Gtk.AboutDialog): self.set_artists(artists.split('\n')) try: - ifile = open(LICENSE_FILE, "r") - self.set_license(ifile.read().replace('\x0c', '')) - ifile.close() + with open(LICENSE_FILE, "r") as ifile: + self.set_license(ifile.read().replace('\x0c', '')) except IOError: self.set_license("License file is missing") @@ -214,9 +213,8 @@ def _get_authors(): parser = make_parser() parser.setContentHandler(AuthorParser(authors, contributors)) - authors_file = open(AUTHORS_FILE, encoding='utf-8') - parser.parse(authors_file) - authors_file.close() + with open(AUTHORS_FILE, encoding='utf-8') as authors_file: + parser.parse(authors_file) authors_text = [authors, contributors] diff --git a/gramps/gui/dbman.py b/gramps/gui/dbman.py index 224dc2d7a..adc7244bc 100644 --- a/gramps/gui/dbman.py +++ b/gramps/gui/dbman.py @@ -663,9 +663,8 @@ class DbManager(CLIDbManager): node = self.model.get_iter(path) filename = self.model.get_value(node, FILE_COL) try: - name_file = open(filename, "r") - file_name_to_delete=name_file.read() - name_file.close() + with open(filename, "r") as name_file: + file_name_to_delete=name_file.read() remove_filename(file_name_to_delete) directory = self.data_to_delete[1] for (top, dirs, files) in os.walk(directory): diff --git a/gramps/plugins/database/bsddb_support/read.py b/gramps/plugins/database/bsddb_support/read.py index 62bf7c02c..656edbe0d 100644 --- a/gramps/plugins/database/bsddb_support/read.py +++ b/gramps/plugins/database/bsddb_support/read.py @@ -2040,9 +2040,8 @@ class DbBsddbRead(DbReadBase, Callback): """ filepath = os.path.join(self.path, "name.txt") try: - name_file = open(filepath, "r", encoding='utf-8') - name = name_file.readline().strip() - name_file.close() + with open(filepath, "r", encoding='utf-8') as name_file: + name = name_file.readline().strip() except (OSError, IOError) as msg: self.__log_error() name = None @@ -2051,9 +2050,8 @@ class DbBsddbRead(DbReadBase, Callback): def get_version(self): filepath = os.path.join(self.path, "bdbversion.txt") try: - name_file = open(filepath, "r", encoding='utf-8') - version = name_file.readline().strip() - name_file.close() + with open(filepath, "r", encoding='utf-8') as name_file: + version = name_file.readline().strip() except (OSError, IOError) as msg: self.__log_error() version = "(0, 0, 0)" diff --git a/gramps/plugins/database/bsddb_support/summary.py b/gramps/plugins/database/bsddb_support/summary.py index 8aefd705d..4548c7525 100644 --- a/gramps/plugins/database/bsddb_support/summary.py +++ b/gramps/plugins/database/bsddb_support/summary.py @@ -16,8 +16,8 @@ def get_dbdir_summary(dirpath, name): bdbversion_file = os.path.join(dirpath, BDBVERSFN) if os.path.isfile(bdbversion_file): - vers_file = open(bdbversion_file) - bsddb_version = vers_file.readline().strip() + with open(bdbversion_file) as vers_file: + bsddb_version = vers_file.readline().strip() else: return "Unknown", "Unknown", "Unknown" diff --git a/gramps/plugins/docgen/odfdoc.py b/gramps/plugins/docgen/odfdoc.py index b3e6a9659..9aa7f567b 100644 --- a/gramps/plugins/docgen/odfdoc.py +++ b/gramps/plugins/docgen/odfdoc.py @@ -1214,9 +1214,8 @@ class ODFDoc(BaseDoc, TextDoc, DrawDoc): for image in self.media_list: try: - ifile = open(image[0], mode='rb') - self._add_zip(zfile, "Pictures/%s" % image[1], ifile.read(), t) - ifile.close() + with open(image[0], mode='rb') as ifile: + self._add_zip(zfile, "Pictures/%s" % image[1], ifile.read(), t) except: errmsg = "%s\n%s" % (_("Could not open %s") % image[0], msg) diff --git a/gramps/plugins/tool/verify.py b/gramps/plugins/tool/verify.py index 1bcb5a72f..ea9e4e475 100644 --- a/gramps/plugins/tool/verify.py +++ b/gramps/plugins/tool/verify.py @@ -572,9 +572,8 @@ class VerifyResults(ManagedWindow): def _save_ignored(self,filename): try: - f = open(filename,'wb') - pickle.dump(self.ignores, f, 1) - f.close() + with open(filename,'wb') as f: + pickle.dump(self.ignores, f, 1) return True except IOError: return False From eb4b4d083f67b3e7d86070ff6bd39879d905d618 Mon Sep 17 00:00:00 2001 From: Sam Manzi Date: Thu, 28 Apr 2016 10:34:22 +1000 Subject: [PATCH 5/7] Fixes for Missed 'open' statements --- gramps/gen/plug/_pluginreg.py | 5 +- gramps/gen/utils/configmanager.py | 50 ++++---- gramps/gui/widgets/grampletbar.py | 81 +++++++------ gramps/gui/widgets/grampletpane.py | 143 +++++++++++------------ gramps/plugins/export/exportgeneweb.py | 30 +++-- gramps/plugins/export/exportvcalendar.py | 40 +++---- gramps/plugins/importer/importgedcom.py | 37 +++--- gramps/plugins/lib/libgedcom.py | 8 +- 8 files changed, 191 insertions(+), 203 deletions(-) diff --git a/gramps/gen/plug/_pluginreg.py b/gramps/gen/plug/_pluginreg.py index ab8474502..3d830e8bf 100644 --- a/gramps/gen/plug/_pluginreg.py +++ b/gramps/gen/plug/_pluginreg.py @@ -1130,14 +1130,13 @@ class PluginRegister(object): lenpd = len(self.__plugindata) full_filename = os.path.join(dir, filename) try: - fd = open(full_filename, "r", encoding='utf-8') + with open(full_filename, "r", encoding='utf-8') as fd: + stream = fd.read() except Exception as msg: print(_('ERROR: Failed reading plugin registration %(filename)s') % \ {'filename' : filename}) print(msg) continue - stream = fd.read() - fd.close() if os.path.exists(os.path.join(os.path.dirname(full_filename), 'locale')): try: diff --git a/gramps/gen/utils/configmanager.py b/gramps/gen/utils/configmanager.py index 6947671f7..96cbb192d 100644 --- a/gramps/gen/utils/configmanager.py +++ b/gramps/gen/utils/configmanager.py @@ -333,35 +333,33 @@ class ConfigManager(object): if exp.errno != errno.EEXIST: raise try: - key_file = open(filename, "w", encoding="utf-8") + with open(filename, "w", encoding="utf-8") as key_file: + key_file.write(";; Gramps key file\n") + key_file.write((";; Automatically created at %s" % + time.strftime("%Y/%m/%d %H:%M:%S")) + "\n\n") + sections = sorted(self.data) + for section in sections: + key_file.write(("[%s]\n") % section) + keys = sorted(self.data[section]) + for key in keys: + value = self.data[section][key] + # If it has a default: + if self.has_default("%s.%s" % (section, key)): + if value == self.get_default("%s.%s" % (section, key)): + default = ";;" + else: + default = "" + if isinstance(value, int): + value = int(value) + key_file.write(("%s%s=%s\n")% (default, + key, + repr(value))) + key_file.write("\n") + # else, no filename given; nothing to save so do nothing quietly except IOError as err: logging.warn("Failed to open %s because %s", filename, str(err)) - return; - - key_file.write(";; Gramps key file\n") - key_file.write((";; Automatically created at %s" % - time.strftime("%Y/%m/%d %H:%M:%S")) + "\n\n") - sections = sorted(self.data) - for section in sections: - key_file.write(("[%s]\n") % section) - keys = sorted(self.data[section]) - for key in keys: - value = self.data[section][key] - # If it has a default: - if self.has_default("%s.%s" % (section, key)): - if value == self.get_default("%s.%s" % (section, key)): - default = ";;" - else: - default = "" - if isinstance(value, int): - value = int(value) - key_file.write(("%s%s=%s\n")% (default, - key, - repr(value))) - key_file.write("\n") - key_file.close() - # else, no filename given; nothing to save so do nothing quietly + return def get(self, key): """ diff --git a/gramps/gui/widgets/grampletbar.py b/gramps/gui/widgets/grampletbar.py index 1abd7b1db..fc57ca272 100644 --- a/gramps/gui/widgets/grampletbar.py +++ b/gramps/gui/widgets/grampletbar.py @@ -218,50 +218,49 @@ class GrampletBar(Gtk.Notebook): """ filename = self.configfile try: - fp = open(filename, "w", encoding='utf-8') + with open(filename, "w", encoding='utf-8') as fp: + fp.write(";; Gramplet bar configuration file" + NL) + fp.write((";; Automatically created at %s" % + time.strftime("%Y/%m/%d %H:%M:%S")) + NL + NL) + fp.write("[Bar Options]" + NL) + fp.write(("visible=%s" + NL) % self.get_property('visible')) + fp.write(("page=%d" + NL) % self.get_current_page()) + fp.write(NL) + + if self.empty: + gramplet_list = [] + else: + gramplet_list = [self.get_nth_page(page_num) + for page_num in range(self.get_n_pages())] + + for page_num, gramplet in enumerate(gramplet_list): + opts = get_gramplet_options_by_name(gramplet.gname) + if opts is not None: + base_opts = opts.copy() + for key in base_opts: + if key in gramplet.__dict__: + base_opts[key] = gramplet.__dict__[key] + fp.write(("[%s]" + NL) % gramplet.gname) + for key in base_opts: + if key in ["content", "title", "tname", "row", "column", + "page", "version", "gramps"]: # don't save + continue + elif key == "data": + if not isinstance(base_opts["data"], (list, tuple)): + fp.write(("data[0]=%s" + NL) % base_opts["data"]) + else: + cnt = 0 + for item in base_opts["data"]: + fp.write(("data[%d]=%s" + NL) % (cnt, item)) + cnt += 1 + else: + fp.write(("%s=%s" + NL)% (key, base_opts[key])) + fp.write(("page=%d" + NL) % page_num) + fp.write(NL) + except IOError: LOG.warning("Failed writing '%s'; gramplets not saved" % filename) return - fp.write(";; Gramplet bar configuration file" + NL) - fp.write((";; Automatically created at %s" % - time.strftime("%Y/%m/%d %H:%M:%S")) + NL + NL) - fp.write("[Bar Options]" + NL) - fp.write(("visible=%s" + NL) % self.get_property('visible')) - fp.write(("page=%d" + NL) % self.get_current_page()) - fp.write(NL) - - if self.empty: - gramplet_list = [] - else: - gramplet_list = [self.get_nth_page(page_num) - for page_num in range(self.get_n_pages())] - - for page_num, gramplet in enumerate(gramplet_list): - opts = get_gramplet_options_by_name(gramplet.gname) - if opts is not None: - base_opts = opts.copy() - for key in base_opts: - if key in gramplet.__dict__: - base_opts[key] = gramplet.__dict__[key] - fp.write(("[%s]" + NL) % gramplet.gname) - for key in base_opts: - if key in ["content", "title", "tname", "row", "column", - "page", "version", "gramps"]: # don't save - continue - elif key == "data": - if not isinstance(base_opts["data"], (list, tuple)): - fp.write(("data[0]=%s" + NL) % base_opts["data"]) - else: - cnt = 0 - for item in base_opts["data"]: - fp.write(("data[%d]=%s" + NL) % (cnt, item)) - cnt += 1 - else: - fp.write(("%s=%s" + NL)% (key, base_opts[key])) - fp.write(("page=%d" + NL) % page_num) - fp.write(NL) - - fp.close() def set_active(self): """ diff --git a/gramps/gui/widgets/grampletpane.py b/gramps/gui/widgets/grampletpane.py index 62cd5fe35..75f55d8a5 100644 --- a/gramps/gui/widgets/grampletpane.py +++ b/gramps/gui/widgets/grampletpane.py @@ -1187,82 +1187,81 @@ class GrampletPane(Gtk.ScrolledWindow): return # something is the matter filename = self.configfile try: - fp = open(filename, "w", encoding='utf-8') + with open(filename, "w", encoding='utf-8') as fp: + fp.write(";; Gramps gramplets file\n") + fp.write(";; Automatically created at %s" % + time.strftime("%Y/%m/%d %H:%M:%S\n\n")) + fp.write("[Gramplet View Options]\n") + fp.write("column_count=%d\n" % self.column_count) + fp.write("pane_position=%d\n" % self.pane_position) + fp.write("pane_orientation=%s\n\n" % self.pane_orientation) + # showing gramplets: + for col in range(self.column_count): + row = 0 + for gframe in self.columns[col]: + gramplet = self.frame_map[str(gframe)] + opts = get_gramplet_options_by_name(gramplet.gname) + if opts is not None: + base_opts = opts.copy() + for key in base_opts: + if key in gramplet.__dict__: + base_opts[key] = gramplet.__dict__[key] + fp.write("[%s]\n" % gramplet.gname) + for key in base_opts: + if key == "content": continue + elif key == "title": + if gramplet.title_override: + fp.write("title=%s\n" % base_opts[key]) + elif key == "tname": continue + elif key == "column": continue + elif key == "row": continue + elif key == "version": continue # code, don't save + elif key == "gramps": continue # code, don't save + elif key == "data": + if not isinstance(base_opts["data"], (list, tuple)): + fp.write("data[0]=%s\n" % base_opts["data"]) + else: + cnt = 0 + for item in base_opts["data"]: + fp.write("data[%d]=%s\n" % (cnt, item)) + cnt += 1 + else: + fp.write("%s=%s\n"% (key, base_opts[key])) + fp.write("column=%d\n" % col) + fp.write("row=%d\n\n" % row) + row += 1 + for gramplet in self.detached_gramplets: + opts = get_gramplet_options_by_name(gramplet.gname) + if opts is not None: + base_opts = opts.copy() + for key in base_opts: + if key in gramplet.__dict__: + base_opts[key] = gramplet.__dict__[key] + fp.write("[%s]\n" % gramplet.title) + for key in base_opts: + if key == "content": continue + elif key == "title": + if "title_override" in base_opts: + base_opts["title"] = base_opts["title_override"] + fp.write("title=%s\n" % base_opts[key]) + elif key == "tname": continue + elif key == "version": continue # code, don't save + elif key == "gramps": continue # code, don't save + elif key == "data": + if not isinstance(base_opts["data"], (list, tuple)): + fp.write("data[0]=%s\n" % base_opts["data"]) + else: + cnt = 0 + for item in base_opts["data"]: + fp.write("data[%d]=%s\n" % (cnt, item)) + cnt += 1 + else: + fp.write("%s=%s\n\n" % (key, base_opts[key])) + except IOError as err: LOG.warn("Failed to open %s because $s; gramplets not saved", filename, str(err)) return - fp.write(";; Gramps gramplets file\n") - fp.write(";; Automatically created at %s" % - time.strftime("%Y/%m/%d %H:%M:%S\n\n")) - fp.write("[Gramplet View Options]\n") - fp.write("column_count=%d\n" % self.column_count) - fp.write("pane_position=%d\n" % self.pane_position) - fp.write("pane_orientation=%s\n\n" % self.pane_orientation) - # showing gramplets: - for col in range(self.column_count): - row = 0 - for gframe in self.columns[col]: - gramplet = self.frame_map[str(gframe)] - opts = get_gramplet_options_by_name(gramplet.gname) - if opts is not None: - base_opts = opts.copy() - for key in base_opts: - if key in gramplet.__dict__: - base_opts[key] = gramplet.__dict__[key] - fp.write("[%s]\n" % gramplet.gname) - for key in base_opts: - if key == "content": continue - elif key == "title": - if gramplet.title_override: - fp.write("title=%s\n" % base_opts[key]) - elif key == "tname": continue - elif key == "column": continue - elif key == "row": continue - elif key == "version": continue # code, don't save - elif key == "gramps": continue # code, don't save - elif key == "data": - if not isinstance(base_opts["data"], (list, tuple)): - fp.write("data[0]=%s\n" % base_opts["data"]) - else: - cnt = 0 - for item in base_opts["data"]: - fp.write("data[%d]=%s\n" % (cnt, item)) - cnt += 1 - else: - fp.write("%s=%s\n"% (key, base_opts[key])) - fp.write("column=%d\n" % col) - fp.write("row=%d\n\n" % row) - row += 1 - for gramplet in self.detached_gramplets: - opts = get_gramplet_options_by_name(gramplet.gname) - if opts is not None: - base_opts = opts.copy() - for key in base_opts: - if key in gramplet.__dict__: - base_opts[key] = gramplet.__dict__[key] - fp.write("[%s]\n" % gramplet.title) - for key in base_opts: - if key == "content": continue - elif key == "title": - if "title_override" in base_opts: - base_opts["title"] = base_opts["title_override"] - fp.write("title=%s\n" % base_opts[key]) - elif key == "tname": continue - elif key == "version": continue # code, don't save - elif key == "gramps": continue # code, don't save - elif key == "data": - if not isinstance(base_opts["data"], (list, tuple)): - fp.write("data[0]=%s\n" % base_opts["data"]) - else: - cnt = 0 - for item in base_opts["data"]: - fp.write("data[%d]=%s\n" % (cnt, item)) - cnt += 1 - else: - fp.write("%s=%s\n\n" % (key, base_opts[key])) - - fp.close() def drop_widget(self, source, context, x, y, timedata): """ diff --git a/gramps/plugins/export/exportgeneweb.py b/gramps/plugins/export/exportgeneweb.py index c77113eb0..64572a019 100644 --- a/gramps/plugins/export/exportgeneweb.py +++ b/gramps/plugins/export/exportgeneweb.py @@ -90,7 +90,20 @@ class GeneWebWriter(object): self.dirname = os.path.dirname (self.filename) try: - self.g = open(self.filename, "wb") + with open(self.filename, "wb") as self.g: + self.flist = [x for x in self.db.iter_family_handles()] + if len(self.flist) < 1: + self.user.notify_error(_("No families matched by selected filter")) + return False + + self.count = 0 + self.oldval = 0 + self.total = len(self.flist) + for key in self.flist: + self.write_family(key) + self.writeln("") + + return True except IOError as msg: msg2 = _("Could not create %s") % self.filename self.user.notify_error(msg2, str(msg)) @@ -99,21 +112,6 @@ class GeneWebWriter(object): self.user.notify_error(_("Could not create %s") % self.filename) return False - self.flist = [x for x in self.db.iter_family_handles()] - if len(self.flist) < 1: - self.user.notify_error(_("No families matched by selected filter")) - return False - - self.count = 0 - self.oldval = 0 - self.total = len(self.flist) - for key in self.flist: - self.write_family(key) - self.writeln("") - - self.g.close() - return True - def write_family(self, family_handle): family = self.db.get_family_from_handle(family_handle) if family: diff --git a/gramps/plugins/export/exportvcalendar.py b/gramps/plugins/export/exportvcalendar.py index bf90d4a06..5d27e245a 100644 --- a/gramps/plugins/export/exportvcalendar.py +++ b/gramps/plugins/export/exportvcalendar.py @@ -96,7 +96,25 @@ class CalendarWriter(object): self.dirname = os.path.dirname (filename) try: - self.g = open(filename,"w") + with open(filename,"w") as self.g: + self.writeln("BEGIN:VCALENDAR") + self.writeln("PRODID:-//GNU//Gramps//EN") + self.writeln("VERSION:1.0") + + self.total = (len([x for x in self.db.iter_person_handles()]) + + len([x for x in self.db.iter_family_handles()])) + for key in self.db.iter_person_handles(): + self.write_person(key) + self.update() + + for key in self.db.iter_family_handles(): + self.write_family(key) + self.update() + + self.writeln("") + self.writeln("END:VCALENDAR") + + return True except IOError as msg: msg2 = _("Could not create %s") % filename self.user.notify_error(msg2, str(msg)) @@ -105,26 +123,6 @@ class CalendarWriter(object): self.user.notify_error(_("Could not create %s") % filename) return False - self.writeln("BEGIN:VCALENDAR") - self.writeln("PRODID:-//GNU//Gramps//EN") - self.writeln("VERSION:1.0") - - self.total = (len([x for x in self.db.iter_person_handles()]) + - len([x for x in self.db.iter_family_handles()])) - for key in self.db.iter_person_handles(): - self.write_person(key) - self.update() - - for key in self.db.iter_family_handles(): - self.write_family(key) - self.update() - - self.writeln("") - self.writeln("END:VCALENDAR") - - self.g.close() - return True - def write_family(self, family_handle): family = self.db.get_family_from_handle(family_handle) if family: diff --git a/gramps/plugins/importer/importgedcom.py b/gramps/plugins/importer/importgedcom.py index cee39d044..4a2b5a1df 100644 --- a/gramps/plugins/importer/importgedcom.py +++ b/gramps/plugins/importer/importgedcom.py @@ -67,28 +67,27 @@ def importData(database, filename, user): database.__class__.__bases__ try: - ifile = open(filename, "rb") + with open(filename, "rb") as ifile: + ansel = False + gramps = False + for index in range(50): + # Treat the file as though it is UTF-8 since this is the more modern + # option; and anyway it doesn't really matter as we are only trying to + # detect a CHAR or SOUR line which is only 7-bit ASCII anyway, and we + # ignore anything that can't be translated. + line = ifile.readline() + line = line.decode(encoding='utf-8', errors='replace') + line = line.split() + if len(line) == 0: + break + if len(line) > 2 and line[1][0:4] == 'CHAR' and line[2] == "ANSEL": + ansel = True + if len(line) > 2 and line[1][0:4] == 'SOUR' and line[2] == "GRAMPS": + gramps = True + except IOError: return - ansel = False - gramps = False - for index in range(50): - # Treat the file as though it is UTF-8 since this is the more modern - # option; and anyway it doesn't really matter as we are only trying to - # detect a CHAR or SOUR line which is only 7-bit ASCII anyway, and we - # ignore anything that can't be translated. - line = ifile.readline() - line = line.decode(encoding='utf-8', errors='replace') - line = line.split() - if len(line) == 0: - break - if len(line) > 2 and line[1][0:4] == 'CHAR' and line[2] == "ANSEL": - ansel = True - if len(line) > 2 and line[1][0:4] == 'SOUR' and line[2] == "GRAMPS": - gramps = True - ifile.close() - if not gramps and ansel: top = Glade() code = top.get_object('codeset') diff --git a/gramps/plugins/lib/libgedcom.py b/gramps/plugins/lib/libgedcom.py index 9fa57825d..4e35fa56c 100644 --- a/gramps/plugins/lib/libgedcom.py +++ b/gramps/plugins/lib/libgedcom.py @@ -1129,14 +1129,12 @@ class GedcomInfoDB(object): try: filepath = os.path.join(DATA_DIR, "gedcom.xml") - ged_file = open(filepath, "rb") + with open(filepath, "rb") as ged_file: + parser = GedInfoParser(self) + parser.parse(ged_file) except: return - parser = GedInfoParser(self) - parser.parse(ged_file) - ged_file.close() - def add_description(self, name, obj): self.map[name] = obj From 1c0823bc233716cfe1c8975562ffb9a744632f09 Mon Sep 17 00:00:00 2001 From: Sam Manzi Date: Sat, 30 Apr 2016 10:02:31 +1000 Subject: [PATCH 6/7] Move Return out of block --- gramps/plugins/export/exportvcalendar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gramps/plugins/export/exportvcalendar.py b/gramps/plugins/export/exportvcalendar.py index 5d27e245a..5d37dfa36 100644 --- a/gramps/plugins/export/exportvcalendar.py +++ b/gramps/plugins/export/exportvcalendar.py @@ -114,7 +114,7 @@ class CalendarWriter(object): self.writeln("") self.writeln("END:VCALENDAR") - return True + return True except IOError as msg: msg2 = _("Could not create %s") % filename self.user.notify_error(msg2, str(msg)) From 820e981012d5db3457503c2f590db51858c2702e Mon Sep 17 00:00:00 2001 From: Sam Manzi Date: Sat, 30 Apr 2016 12:02:30 +1000 Subject: [PATCH 7/7] Check for non-existent files - remove try/except --- gramps/plugins/lib/libgedcom.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gramps/plugins/lib/libgedcom.py b/gramps/plugins/lib/libgedcom.py index 4e35fa56c..4df7b7feb 100644 --- a/gramps/plugins/lib/libgedcom.py +++ b/gramps/plugins/lib/libgedcom.py @@ -1127,14 +1127,14 @@ class GedcomInfoDB(object): self.standard = GedcomDescription("GEDCOM 5.5 standard") self.standard.set_dest("GEDCOM 5.5") - try: - filepath = os.path.join(DATA_DIR, "gedcom.xml") - with open(filepath, "rb") as ged_file: - parser = GedInfoParser(self) - parser.parse(ged_file) - except: + filepath = os.path.join(DATA_DIR, "gedcom.xml") + if not os.path.exists(filepath): return + with open(filepath, "rb") as ged_file: + parser = GedInfoParser(self) + parser.parse(ged_file) + def add_description(self, name, obj): self.map[name] = obj