diff --git a/gramps/plugins/test/test_tools.py b/gramps/plugins/test/test_tools.py index 7fea5d362..0d38c1785 100644 --- a/gramps/plugins/test/test_tools.py +++ b/gramps/plugins/test/test_tools.py @@ -124,10 +124,10 @@ class ToolControl(unittest.TestCase): self.assertEqual(out, "") out, err = call("-O", TREE_NAME, "-y", "-q", "-a", "tool", "-p", - "name=testcasegenerator,bugs=1,persons=0," - "add_linebreak=0,add_serial=0," - "long_names=0,lowlevel=0,person_count=20," - "specialchars=0") + "name=testcasegenerator,bugs=1,persons=1," + "add_linebreak=1,add_serial=1," + "long_names=1,lowlevel=0,person_count=50," + "specialchars=1") expect = ["Opened successfully!", "Performing action: tool.", "Using options string: name=testcasegenerator,bugs=1", @@ -146,8 +146,8 @@ class ToolControl(unittest.TestCase): "1 invalid birth event name was fixed", "1 invalid death event name was fixed", "2 places were referenced, but not found", - "13 citations were referenced, but not found", - "16 sources were referenced, but not found", + "11 citations were referenced, but not found", + "14 sources were referenced, but not found", "7 empty objects removed", "1 person objects", "1 family objects", diff --git a/gramps/plugins/tool/check.py b/gramps/plugins/tool/check.py index d1ac4f827..27976cb83 100644 --- a/gramps/plugins/tool/check.py +++ b/gramps/plugins/tool/check.py @@ -23,39 +23,41 @@ # """Tools/Database Repair/Check and Repair Database""" - -#------------------------------------------------------------------------- +# pylint: disable=too-many-statements,too-many-locals,too-many-branches +# pylint: disable=wrong-import-position,too-many-public-methods,no-self-use +# pylint: disable=too-many-arguments +# ------------------------------------------------------------------------- # # python modules # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------- import os from io import StringIO -import time from collections import defaultdict +import time -#------------------------------------------------------------------------ +# ------------------------------------------------------------------------ # # Set up logging # -#------------------------------------------------------------------------ +# ------------------------------------------------------------------------ import logging -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------- # # gtk modules # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------- from gi.repository import Gtk -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------- # # Gramps modules # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------- from gramps.gen.const import GRAMPS_LOCALE as glocale _ = glocale.translation.gettext -ngettext = glocale.translation.ngettext # else "nearby" comments are ignored +ngettext = glocale.translation.ngettext # else "nearby" comments are ignored from gramps.gen.lib import (Citation, Event, EventType, Family, Media, Name, Note, Person, Place, Repository, Source, StyledText, Tag) @@ -75,19 +77,29 @@ from gramps.gen.errors import HandleError # table for handling control chars in notes. # All except 09, 0A, 0D are replaced with space. -strip_dict = dict.fromkeys(list(range(9))+list(range(11,13))+list(range(14, 32)), " ") +strip_dict = dict.fromkeys(list(range(9)) + list(range(11, 13)) + + list(range(14, 32)), " ") + class ProgressMeter: - def __init__(self, *args, **kwargs): pass - def set_pass(self, *args): pass - def step(self): pass - def close(self): pass + def __init__(self, *args, **kwargs): + pass -#------------------------------------------------------------------------- + def set_pass(self, *args): + pass + + def step(self): + pass + + def close(self): + pass + + +# ------------------------------------------------------------------------- # # Low Level repair # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------- def cross_table_duplicates(db, uistate): """ Function to find the presence of identical handles that occur in different @@ -110,8 +122,8 @@ def cross_table_duplicates(db, uistate): total_nr_handles = 0 all_handles = set([]) for the_map in [db.person_map, db.family_map, db.event_map, db.place_map, - db.source_map, db.citation_map, db.media_map, db.repository_map, - db.note_map]: + db.source_map, db.citation_map, db.media_map, + db.repository_map, db.note_map]: handle_list = list(the_map.keys()) total_nr_handles += len(handle_list) all_handles.update(handle_list) @@ -121,15 +133,16 @@ def cross_table_duplicates(db, uistate): if num_errors == 0: logging.info(' OK: No cross table duplicates') else: - logging.warning(' FAIL: Found %d cross table duplicates' % - num_errors) + logging.warning(' FAIL: Found %d cross table duplicates', + num_errors) return total_nr_handles > len(all_handles) -#------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- # # runTool # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------- class Check(tool.BatchTool): def __init__(self, dbstate, user, options_class, name, callback=None): uistate = user.uistate @@ -155,10 +168,13 @@ class Check(tool.BatchTool): if self.db.__class__.__name__ == 'DbBsddb': if cross_table_duplicates(self.db, uistate): Report(uistate, _( - "Your Family Tree contains cross table duplicate handles.\n " + "Your Family Tree contains cross table duplicate handles." + "\n " "This is bad and can be fixed by making a backup of your\n" - "Family Tree and importing that backup in an empty family\n" - "tree. The rest of the checking is skipped, the Check and\n" + "Family Tree and importing that backup in an empty family" + "\n" + "tree. The rest of the checking is skipped, the Check and" + "\n" "Repair tool should be run anew on this new Family Tree."), cli) return @@ -208,11 +224,12 @@ class Check(tool.BatchTool): if errs: Report(uistate, checker.text.getvalue(), cli) -#------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- # # # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------- class CheckIntegrity: def __init__(self, dbstate, uistate, trans): @@ -248,21 +265,22 @@ class CheckIntegrity: self.empty_objects = defaultdict(list) self.replaced_sourceref = [] self.place_errors = 0 + self.text = StringIO() self.last_img_dir = config.get('behavior.addmedia-image-dir') self.progress = ProgressMeter(_('Checking Database'), '', parent=self.parent_window) - self.explanation = Note(_('Objects referenced by this note ' - 'were referenced but missing so that is why they have been created ' + self.explanation = Note(_( + 'Objects referenced by this note were referenced but ' + 'missing so that is why they have been created ' 'when you ran Check and Repair on %s.') % - time.strftime('%x %X', time.localtime())) + time.strftime('%x %X', time.localtime())) self.explanation.set_handle(create_id()) def family_errors(self): return (len(self.broken_parent_links) + - len(self.broken_links) + - len(self.empty_family) + - len(self.duplicate_links) - ) + len(self.broken_links) + + len(self.empty_family) + + len(self.duplicate_links)) def cleanup_deleted_name_formats(self): """ @@ -270,14 +288,15 @@ class CheckIntegrity: When user deletes custom name format those are not removed only marked as "inactive". This method does the cleanup of the name format table, - as well as fixes the display_as, sort_as values for each Name in the db. + as well as fixes the display_as, sort_as values for each Name in the + db. """ self.progress.set_pass(_('Looking for invalid name format references'), self.db.get_number_of_people()) logging.info('Looking for invalid name format references') - deleted_name_formats = [number for (number, name, fmt_str,act) + deleted_name_formats = [number for (number, name, dummy, act) in self.db.name_formats if not act] # remove the invalid references from all Name objects @@ -318,7 +337,7 @@ class CheckIntegrity: for number in deleted_name_formats: _nd.del_name_format(number) self.db.name_formats = _nd.get_name_format(only_custom=True, - only_active=False) + only_active=False) if len(self.removed_name_format) == 0: logging.info(' OK: no invalid name formats found found') @@ -333,16 +352,16 @@ class CheckIntegrity: for bhandle in self.db.person_map.keys(): handle = bhandle.decode('utf-8') value = self.db.person_map[bhandle] - p = Person(value) - splist = p.get_family_handle_list() + pers = Person(value) + splist = pers.get_family_handle_list() if len(splist) != len(set(splist)): new_list = [] for value in splist: if value not in new_list: new_list.append(value) self.duplicate_links.append((handle, value)) - p.set_family_handle_list(new_list) - self.db.commit_person(p, self.trans) + pers.set_family_handle_list(new_list) + self.db.commit_person(pers, self.trans) self.progress.step() if previous_errors == len(self.duplicate_links): @@ -361,13 +380,13 @@ class CheckIntegrity: if not isinstance(data[2], str): obj.path = obj.path.decode('utf-8') logging.warning(' FAIL: encoding error on media object ' - '"%(gid)s" path "%(path)s"' % - {'gid' : obj.gramps_id, 'path' : obj.path}) + '"%(gid)s" path "%(path)s"', + {'gid': obj.gramps_id, 'path': obj.path}) if not isinstance(data[4], str): obj.desc = obj.desc.decode('utf-8') logging.warning(' FAIL: encoding error on media object ' - '"%(gid)s" description "%(desc)s"' % - {'gid' : obj.gramps_id, 'desc' : obj.desc}) + '"%(gid)s" description "%(desc)s"', + {'gid': obj.gramps_id, 'desc': obj.desc}) self.db.commit_media(obj, self.trans) error_count += 1 # Once we are here, fix the mime string if not str @@ -382,8 +401,8 @@ class CheckIntegrity: obj.mime = "" self.db.commit_media(obj, self.trans) logging.warning(' FAIL: encoding error on media object ' - '"%(desc)s" mime "%(mime)s"' % - {'desc' : obj.desc, 'mime' : obj.mime}) + '"%(desc)s" mime "%(mime)s"', + {'desc': obj.desc, 'mime': obj.mime}) error_count += 1 self.progress.step() if error_count == 0: @@ -401,8 +420,8 @@ class CheckIntegrity: old_text = str(stext) new_text = old_text.translate(strip_dict) if old_text != new_text: - logging.warning(' FAIL: control characters found in note "%s"' % - self.db.note_map[bhandle][1]) + logging.warning(' FAIL: control characters found in note' + ' "%s"', self.db.note_map[bhandle][1]) error_count += 1 # Commit only if ctrl char found. note.set_styledtext(StyledText(text=new_text, @@ -469,11 +488,12 @@ class CheckIntegrity: # "Broken6" family.set_father_handle(None) self.db.commit_family(family, self.trans) - self.broken_parent_links.append((father_handle, family_handle)) + self.broken_parent_links.append((father_handle, + family_handle)) logging.warning(" FAIL: family '%(fam_gid)s' " - "father handle '%(hand)s' does not exist" % - {'fam_gid' : family.gramps_id, - 'hand' : father_handle}) + "father handle '%(hand)s' does not exist", + {'fam_gid': family.gramps_id, + 'hand': father_handle}) father_handle = None if mother_handle: try: @@ -485,11 +505,12 @@ class CheckIntegrity: # "Broken7" family.set_mother_handle(None) self.db.commit_family(family, self.trans) - self.broken_parent_links.append((mother_handle, family_handle)) + self.broken_parent_links.append((mother_handle, + family_handle)) logging.warning(" FAIL: family '%(fam_gid)s' " - "mother handle '%(hand)s' does not exist" % - {'fam_gid' : family.gramps_id, - 'hand' : mother_handle}) + "mother handle '%(hand)s' does not exist", + {'fam_gid': family.gramps_id, + 'hand': mother_handle}) mother_handle = None if father_handle and father and \ @@ -501,9 +522,9 @@ class CheckIntegrity: father.add_family_handle(family_handle) self.db.commit_person(father, self.trans) logging.warning(" FAIL: family '%(fam_gid)s' father " - "'%(hand)s' does not refer back to the family" % - {'fam_gid' : family.gramps_id, - 'hand' : father_handle}) + "'%(hand)s' does not refer back to the family", + {'fam_gid': family.gramps_id, + 'hand': father_handle}) if mother_handle and mother and \ family_handle not in mother.get_family_handle_list(): @@ -514,9 +535,9 @@ class CheckIntegrity: mother.add_family_handle(family_handle) self.db.commit_person(mother, self.trans) logging.warning(" FAIL: family '%(fam_gid)s' mother " - "'%(hand)s' does not refer back to the family" % - {'fam_gid' : family.gramps_id, - 'hand' : mother_handle}) + "'%(hand)s' does not refer back to the family", + {'fam_gid': family.gramps_id, + 'hand': mother_handle}) for child_ref in family.get_child_ref_list(): child_handle = child_ref.ref @@ -528,9 +549,10 @@ class CheckIntegrity: # This is tested by TestcaseGenerator where the father # is "Broken20" logging.warning(" FAIL: family '%(fam_gid)s' child " - "'%(hand)s' does not exist in the database" % - {'fam_gid' : family.gramps_id, - 'hand' : child_handle}) + "'%(hand)s' does not exist in the " + "database", + {'fam_gid': family.gramps_id, + 'hand': child_handle}) family.remove_child_ref(child_ref) self.db.commit_family(family, self.trans) self.broken_links.append((child_handle, family_handle)) @@ -542,9 +564,9 @@ class CheckIntegrity: # is "Broken19" logging.warning(" FAIL: family '%(fam_gid)s' " "child '%(child_gid)s' is one of the " - "parents" % - {'fam_gid' : family.gramps_id, - 'child_gid' : child.gramps_id}) + "parents", + {'fam_gid': family.gramps_id, + 'child_gid': child.gramps_id}) family.remove_child_ref(child_ref) self.db.commit_family(family, self.trans) self.broken_links.append((child_handle, family_handle)) @@ -552,15 +574,16 @@ class CheckIntegrity: if family_handle == child.get_main_parents_family_handle(): continue if family_handle not in \ - child.get_parent_family_handle_list(): + child.get_parent_family_handle_list(): # The referenced child has no reference to the family # This is tested by TestcaseGenerator where the father # is "Broken8" - logging.warning(" FAIL: family '%(fam_gid)s' " - "child '%(child_gid)s' has no reference" - " to the family. Reference added" % - {'fam_gid' : family.gramps_id, - 'child_gid' : child.gramps_id}) + logging.warning( + " FAIL: family '%(fam_gid)s' " + "child '%(child_gid)s' has no reference" + " to the family. Reference added", + {'fam_gid': family.gramps_id, + 'child_gid': child.gramps_id}) child.add_parent_family_handle(family_handle) self.db.commit_person(child, self.trans) @@ -609,9 +632,9 @@ class CheckIntegrity: # is "Broken9" logging.warning(" FAIL: family '%(fam_gid)s' person " "'%(pers_gid)s' is not a child in the " - "referenced parent family" % - {'fam_gid' : family.gramps_id, - 'pers_gid' :person.gramps_id}) + "referenced parent family", + {'fam_gid': family.gramps_id, + 'pers_gid': person.gramps_id}) person.remove_parent_family_handle(par_family_handle) self.db.commit_person(person, self.trans) self.broken_links.append((person_handle, family_handle)) @@ -622,11 +645,11 @@ class CheckIntegrity: # The referenced family does not exist in database # This is tested by TestcaseGenerator where the father # is "Broken20" - logging.warning(" FAIL: person '%(pers_gid)s' refers to " - "family '%(hand)s' which is not in the " - "database" % - {'pers_gid' : person.gramps_id, - 'hand' : family_handle}) + logging.warning(" FAIL: person '%(pers_gid)s' refers " + "to family '%(hand)s' which is not in the " + "database", + {'pers_gid': person.gramps_id, + 'hand': family_handle}) person.remove_family_handle(family_handle) self.db.commit_person(person, self.trans) self.broken_links.append((person_handle, family_handle)) @@ -641,99 +664,103 @@ class CheckIntegrity: # where the mother is "Broken3" and the family misses the link # to the mother logging.warning(" FAIL: family '%(fam_gid)s' person " - "'%(pers_gid)s' is not member of the referenced" - " family" % - {'fam_gid' : family.gramps_id, - 'pers_gid' : person.gramps_id}) + "'%(pers_gid)s' is not member of the " + "referenced family", + {'fam_gid': family.gramps_id, + 'pers_gid': person.gramps_id}) person.remove_family_handle(family_handle) self.db.commit_person(person, self.trans) self.broken_links.append((person_handle, family_handle)) self.progress.step() - if previous_errors == len(self.broken_parent_links + self.broken_links): + if previous_errors == len(self.broken_parent_links + + self.broken_links): logging.info(' OK: no broken family links found') - def cleanup_missing_photos(self, cl=0): + def cleanup_missing_photos(self, cli=0): self.progress.set_pass(_('Looking for unused objects'), len(self.db.get_media_handles())) logging.info('Looking for missing photos') missmedia_action = 0 - #------------------------------------------------------------------------- + + # --------------------------------------------------------------------- def remove_clicked(): # File is lost => remove all references and the object itself for handle in self.db.get_person_handles(sort_handles=False): person = self.db.get_person_from_handle(handle) - if person.has_media_reference(ObjectId): - person.remove_media_references([ObjectId]) + if person.has_media_reference(objectid): + person.remove_media_references([objectid]) self.db.commit_person(person, self.trans) for handle in self.db.get_family_handles(): family = self.db.get_family_from_handle(handle) - if family.has_media_reference(ObjectId): - family.remove_media_references([ObjectId]) + if family.has_media_reference(objectid): + family.remove_media_references([objectid]) self.db.commit_family(family, self.trans) for handle in self.db.get_event_handles(): event = self.db.get_event_from_handle(handle) - if event.has_media_reference(ObjectId): - event.remove_media_references([ObjectId]) + if event.has_media_reference(objectid): + event.remove_media_references([objectid]) self.db.commit_event(event, self.trans) for handle in self.db.get_source_handles(): source = self.db.get_source_from_handle(handle) - if source.has_media_reference(ObjectId): - source.remove_media_references([ObjectId]) + if source.has_media_reference(objectid): + source.remove_media_references([objectid]) self.db.commit_source(source, self.trans) for handle in self.db.get_citation_handles(): citation = self.db.get_citation_from_handle(handle) - if citation.has_media_reference(ObjectId): - citation.remove_media_references([ObjectId]) + if citation.has_media_reference(objectid): + citation.remove_media_references([objectid]) self.db.commit_citation(citation, self.trans) for handle in self.db.get_place_handles(): place = self.db.get_place_from_handle(handle) - if place.has_media_reference(ObjectId): - place.remove_media_references([ObjectId]) + if place.has_media_reference(objectid): + place.remove_media_references([objectid]) self.db.commit_place(place, self.trans) - self.removed_photo.append(ObjectId) - self.db.remove_media(ObjectId,self.trans) + self.removed_photo.append(objectid) + self.db.remove_media(objectid, self.trans) logging.warning(' FAIL: media object and all references to ' 'it removed') def leave_clicked(): - self.bad_photo.append(ObjectId) + self.bad_photo.append(objectid) logging.warning(' FAIL: references to missing file kept') def select_clicked(): # File is lost => select a file to replace the lost one - def fs_close_window(obj): - self.bad_photo.append(ObjectId) - logging.warning(' FAIL: references to missing file kept') + def fs_close_window(dummy): + self.bad_photo.append(objectid) + logging.warning(' FAIL: references to missing file ' + 'kept') def fs_ok_clicked(obj): name = fs_top.get_filename() if os.path.isfile(name): - obj = self.db.get_media_from_handle(ObjectId) + obj = self.db.get_media_from_handle(objectid) obj.set_path(name) self.db.commit_media(obj, self.trans) - self.replaced_photo.append(ObjectId) + self.replaced_photo.append(objectid) self.last_img_dir = os.path.dirname(name) logging.warning(' FAIL: media object reselected to ' - '"%s"' % name) + '"%s"', name) else: - self.bad_photo.append(ObjectId) - logging.warning(' FAIL: references to missing file kept') + self.bad_photo.append(objectid) + logging.warning(' FAIL: references to missing file ' + 'kept') - fs_top = Gtk.FileChooserDialog("%s - Gramps" % _("Select file"), - parent=self.parent_window, - buttons=(_('_Cancel'), Gtk.ResponseType.CANCEL, - _('_OK'), Gtk.ResponseType.OK) - ) + fs_top = Gtk.FileChooserDialog( + "%s - Gramps" % _("Select file"), + parent=self.parent_window, + buttons=(_('_Cancel'), Gtk.ResponseType.CANCEL, + _('_OK'), Gtk.ResponseType.OK)) fs_top.set_current_folder(self.last_img_dir) response = fs_top.run() if response == Gtk.ResponseType.OK: @@ -742,25 +769,26 @@ class CheckIntegrity: fs_close_window(fs_top) fs_top.destroy() - #------------------------------------------------------------------------- + # -------------------------------------------------------------------- - for bObjectId in self.db.get_media_handles(): - ObjectId = bObjectId.decode('utf-8') - obj = self.db.get_media_from_handle(ObjectId) + for bobjectid in self.db.get_media_handles(): + objectid = bobjectid.decode('utf-8') + obj = self.db.get_media_from_handle(objectid) photo_name = media_path_full(self.db, obj.get_path()) photo_desc = obj.get_description() - if photo_name is not None and photo_name != "" and not find_file(photo_name): - if cl: - logging.warning(" FAIL: media file %s was not found." % + if photo_name is not None and photo_name != "" \ + and not find_file(photo_name): + if cli: + logging.warning(" FAIL: media file %s was not found.", photo_name) - self.bad_photo.append(ObjectId) + self.bad_photo.append(objectid) else: if missmedia_action == 0: logging.warning(' FAIL: media object "%(desc)s" ' 'reference to missing file "%(name)s" ' - 'found' % - {'desc' : photo_desc, - 'name' : photo_name}) + 'found', + {'desc': photo_desc, + 'name': photo_name}) mmd = MissingMediaDialog( _("Media object could not be found"), _("The file:\n%(file_name)s\nis referenced in " @@ -770,47 +798,47 @@ class CheckIntegrity: "You may choose to either remove the " "reference from the database,\n" "keep the reference to the missing file, " - "or select a new file." - ) % {'file_name' : '%s' % photo_name}, + "or select a new file.") + % {'file_name': '%s' % photo_name}, remove_clicked, leave_clicked, select_clicked, parent=self.uistate.window) missmedia_action = mmd.default_action elif missmedia_action == 1: logging.warning(' FAIL: media object "%(desc)s" ' 'reference to missing file "%(name)s" ' - 'found' % - {'desc' : photo_desc, - 'name' : photo_name}) + 'found', + {'desc': photo_desc, + 'name': photo_name}) remove_clicked() elif missmedia_action == 2: logging.warning(' FAIL: media object "%(desc)s" ' 'reference to missing file "%(name)s" ' - 'found' % - {'desc' : photo_desc, - 'name' : photo_name}) + 'found', + {'desc': photo_desc, + 'name': photo_name}) leave_clicked() elif missmedia_action == 3: logging.warning(' FAIL: media object "%(desc)s" ' 'reference to missing file "%(name)s" ' - 'found' % - {'desc' : photo_desc, - 'name' : photo_name}) + 'found', + {'desc': photo_desc, + 'name': photo_name}) select_clicked() self.progress.step() if len(self.bad_photo + self.removed_photo) == 0: logging.info(' OK: no missing photos found') def cleanup_empty_objects(self): - #the position of the change column in the primary objects + # the position of the change column in the primary objects CHANGE_PERSON = 17 CHANGE_FAMILY = 12 - CHANGE_EVENT = 10 + CHANGE_EVENT = 10 CHANGE_SOURCE = 8 CHANGE_CITATION = 9 - CHANGE_PLACE = 11 - CHANGE_MEDIA = 8 - CHANGE_REPOS = 7 - CHANGE_NOTE = 5 + CHANGE_PLACE = 11 + CHANGE_MEDIA = 8 + CHANGE_REPOS = 7 + CHANGE_NOTE = 5 empty_person_data = Person().serialize() empty_family_data = Family().serialize() @@ -823,11 +851,12 @@ class CheckIntegrity: empty_note_data = Note().serialize() _db = self.db + def _empty(empty, flag): ''' Closure for dispatch table, below ''' - def _f(value): + def _fx(value): return self._check_empty(value, empty, flag) - return _f + return _fx table = ( @@ -842,82 +871,73 @@ class CheckIntegrity: # 6. function to remove the object, if empty ('persons', - _db.get_person_from_handle, - _db.get_person_cursor, - _db.get_number_of_people, - _('Looking for empty people records'), - _empty(empty_person_data, CHANGE_PERSON), - _db.remove_person, - ), + _db.get_person_from_handle, + _db.get_person_cursor, + _db.get_number_of_people, + _('Looking for empty people records'), + _empty(empty_person_data, CHANGE_PERSON), + _db.remove_person), ('families', - _db.get_family_from_handle, - _db.get_family_cursor, - _db.get_number_of_families, - _('Looking for empty family records'), - _empty(empty_family_data, CHANGE_FAMILY), - _db.remove_family, - ), + _db.get_family_from_handle, + _db.get_family_cursor, + _db.get_number_of_families, + _('Looking for empty family records'), + _empty(empty_family_data, CHANGE_FAMILY), + _db.remove_family), ('events', - _db.get_event_from_handle, - _db.get_event_cursor, - _db.get_number_of_events, - _('Looking for empty event records'), - _empty(empty_event_data, CHANGE_EVENT), - _db.remove_event, - ), + _db.get_event_from_handle, + _db.get_event_cursor, + _db.get_number_of_events, + _('Looking for empty event records'), + _empty(empty_event_data, CHANGE_EVENT), + _db.remove_event), ('sources', - _db.get_source_from_handle, - _db.get_source_cursor, - _db.get_number_of_sources, - _('Looking for empty source records'), - _empty(empty_source_data, CHANGE_SOURCE), - _db.remove_source, - ), + _db.get_source_from_handle, + _db.get_source_cursor, + _db.get_number_of_sources, + _('Looking for empty source records'), + _empty(empty_source_data, CHANGE_SOURCE), + _db.remove_source), ('citations', - _db.get_citation_from_handle, - _db.get_citation_cursor, - _db.get_number_of_citations, - _('Looking for empty citation records'), - _empty(empty_citation_data, CHANGE_CITATION), - _db.remove_citation, - ), + _db.get_citation_from_handle, + _db.get_citation_cursor, + _db.get_number_of_citations, + _('Looking for empty citation records'), + _empty(empty_citation_data, CHANGE_CITATION), + _db.remove_citation), ('places', - _db.get_place_from_handle, - _db.get_place_cursor, - _db.get_number_of_places, - _('Looking for empty place records'), - _empty(empty_place_data, CHANGE_PLACE), - _db.remove_place, - ), + _db.get_place_from_handle, + _db.get_place_cursor, + _db.get_number_of_places, + _('Looking for empty place records'), + _empty(empty_place_data, CHANGE_PLACE), + _db.remove_place), ('media', - _db.get_media_from_handle, - _db.get_media_cursor, - _db.get_number_of_media, - _('Looking for empty media records'), - _empty(empty_media_data, CHANGE_MEDIA), - _db.remove_media, - ), + _db.get_media_from_handle, + _db.get_media_cursor, + _db.get_number_of_media, + _('Looking for empty media records'), + _empty(empty_media_data, CHANGE_MEDIA), + _db.remove_media), ('repos', - _db.get_repository_from_handle, - _db.get_repository_cursor, - _db.get_number_of_repositories, - _('Looking for empty repository records'), - _empty(empty_repos_data, CHANGE_REPOS), - _db.remove_repository, - ), + _db.get_repository_from_handle, + _db.get_repository_cursor, + _db.get_number_of_repositories, + _('Looking for empty repository records'), + _empty(empty_repos_data, CHANGE_REPOS), + _db.remove_repository), ('notes', - _db.get_note_from_handle, - _db.get_note_cursor, - _db.get_number_of_notes, - _('Looking for empty note records'), - _empty(empty_note_data, CHANGE_NOTE), - _db.remove_note, - ), + _db.get_note_from_handle, + _db.get_note_cursor, + _db.get_number_of_notes, + _('Looking for empty note records'), + _empty(empty_note_data, CHANGE_NOTE), + _db.remove_note), ) # Now, iterate over the table, dispatching the functions - for (the_type, get_func, cursor_func, total_func, + for (the_type, dummy, cursor_func, total_func, text, check_func, remove_func) in table: with cursor_func() as cursor: @@ -931,27 +951,26 @@ class CheckIntegrity: # we cannot remove here as that would destroy cursor # so save the handles for later removal logging.warning(' FAIL: empty %(type)s record with ' - 'handle "%(hand)s" was found' % - {'type' : the_type, 'hand' : handle}) + 'handle "%(hand)s" was found', + {'type': the_type, 'hand': handle}) self.empty_objects[the_type].append(handle) - #now remove + # now remove for handle in self.empty_objects[the_type]: remove_func(handle, self.trans) if len(self.empty_objects[the_type]) == 0: - logging.info(' OK: no empty %s found' % the_type) + logging.info(' OK: no empty %s found', the_type) def _check_empty(self, data, empty_data, changepos): """compare the data with the data of an empty object change, handle and gramps_id are not compared """ if changepos is not None: return (data[2:changepos] == empty_data[2:changepos] and - data[changepos+1:] == empty_data[changepos+1:] - ) - else : + data[changepos + 1:] == empty_data[changepos + 1:]) + else: return data[2:] == empty_data[2:] - def cleanup_empty_families(self, automatic): + def cleanup_empty_families(self, dummy): fhandle_list = self.db.get_family_handles() @@ -969,7 +988,7 @@ class CheckIntegrity: mother_handle = family.get_mother_handle() if not father_handle and not mother_handle and \ - len(family.get_child_ref_list()) == 0: + len(family.get_child_ref_list()) == 0: self.empty_family.append(family_id) self.delete_empty_family(family_handle) @@ -1003,23 +1022,24 @@ class CheckIntegrity: father_handle = family.get_father_handle() if father_handle: - fgender = self.db.get_person_from_handle(father_handle - ).get_gender() + fgender = self.db.get_person_from_handle( + father_handle).get_gender() else: fgender = None mother_handle = family.get_mother_handle() if mother_handle: - mgender = self.db.get_person_from_handle(mother_handle - ).get_gender() + mgender = self.db.get_person_from_handle( + mother_handle).get_gender() else: mgender = None - if (fgender == Person.FEMALE - or mgender == Person.MALE) and fgender != mgender: + if (fgender == Person.FEMALE or + mgender == Person.MALE) and fgender != mgender: # swap. note: (at most) one handle may be None - logging.warning(' FAIL: the family "%s" has a father=female or ' - ' mother=male in a different sex family' % family.gramps_id) + logging.warning(' FAIL: the family "%s" has a father=female' + ' or mother=male in a different sex family', + family.gramps_id) family.set_father_handle(mother_handle) family.set_mother_handle(father_handle) self.db.commit_family(family, self.trans) @@ -1029,9 +1049,10 @@ class CheckIntegrity: logging.info(' OK: no broken parent relationships found') def check_events(self): + '''Looking for event problems''' self.progress.set_pass(_('Looking for event problems'), - self.db.get_number_of_people() - +self.db.get_number_of_families()) + self.db.get_number_of_people() + + self.db.get_number_of_families()) logging.info('Looking for event problems') for bkey in self.db.get_person_handles(sort_handles=False): @@ -1054,23 +1075,23 @@ class CheckIntegrity: # does not exist in the database # This is tested by TestcaseGenerator person "Broken11" make_unknown(birth_handle, self.explanation.handle, - self.class_event, self.commit_event, self.trans, - type=EventType.BIRTH) + self.class_event, self.commit_event, + self.trans, type=EventType.BIRTH) logging.warning(' FAIL: the person "%(gid)s" refers to ' 'a birth event "%(hand)s" which does not ' - 'exist in the database' % - {'gid' : person.gramps_id, - 'hand' : birth_handle}) + 'exist in the database', + {'gid': person.gramps_id, + 'hand': birth_handle}) self.invalid_events.add(key) else: if int(birth.get_type()) != EventType.BIRTH: # Birth event was not of the type "Birth" # This is tested by TestcaseGenerator person "Broken14" - logging.warning(' FAIL: the person "%(gid)s" refers ' - 'to a birth event which is of type ' - '"%(type)s" instead of Birth' % - {'gid' : person.gramps_id, - 'type' : int(birth.get_type())}) + logging.warning(' FAIL: the person "%(gid)s" refers' + ' to a birth event which is of type ' + '"%(type)s" instead of Birth', + {'gid': person.gramps_id, + 'type': int(birth.get_type())}) birth.set_type(EventType(EventType.BIRTH)) self.db.commit_event(birth, self.trans) self.invalid_birth_events.add(key) @@ -1094,22 +1115,23 @@ class CheckIntegrity: # This is tested by TestcaseGenerator person "Broken12" logging.warning(' FAIL: the person "%(gid)s" refers to ' 'a death event "%(hand)s" which does not ' - 'exist in the database' % - {'gid' : person.gramps_id, - 'hand' : death_handle}) + 'exist in the database', + {'gid': person.gramps_id, + 'hand': death_handle}) make_unknown(death_handle, self.explanation.handle, - self.class_event, self.commit_event, self.trans, - type=EventType.DEATH) + self.class_event, self.commit_event, + self.trans, type=EventType.DEATH) self.invalid_events.add(key) else: if int(death.get_type()) != EventType.DEATH: # Death event was not of the type "Death" # This is tested by TestcaseGenerator person "Broken15" - logging.warning(' FAIL: the person "%(gid)s" refers ' - 'to a death event which is of type ' - '"%(type)s" instead of Death' % - {'gid' : person.gramps_id, - 'type' : int(death.get_type())}) + logging.warning( + ' FAIL: the person "%(gid)s" refers to a death ' + 'event which is of type "%(type)s" instead of ' + 'Death', + {'gid': person.gramps_id, + 'type': int(death.get_type())}) death.set_type(EventType(EventType.DEATH)) self.db.commit_event(death, self.trans) self.invalid_death_events.add(key) @@ -1127,30 +1149,30 @@ class CheckIntegrity: event_ref.ref = create_id() event_handle = event_ref.ref try: - event = self.db.get_event_from_handle(event_handle) + self.db.get_event_from_handle(event_handle) except HandleError: # The event referenced by the person # does not exist in the database - #TODO: There is no better way? + # TODO: There is no better way? # This is tested by TestcaseGenerator person "Broken11" # This is tested by TestcaseGenerator person "Broken12" # This is tested by TestcaseGenerator person "Broken13" - logging.warning(' FAIL: the person "%(gid)s" refers ' - 'to an event "%(hand)s" which does not ' - 'exist in the database' % - { 'gid' : person.gramps_id, - 'hand' : event_handle}) - make_unknown(event_handle, - self.explanation.handle, self.class_event, - self.commit_event, self.trans) + logging.warning( + ' FAIL: the person "%(gid)s" refers to an event' + ' "%(hand)s" which does not exist in the database', + {'gid': person.gramps_id, + 'hand': event_handle}) + make_unknown(event_handle, self.explanation.handle, + self.class_event, + self.commit_event, self.trans) self.invalid_events.add(key) if none_handle: person.set_event_ref_list(newlist) self.db.commit_person(person, self.trans) elif not isinstance(person.get_event_ref_list(), list): # event_list is None or other garbage - logging.warning(' FAIL: the person "%s" has an event ref list' - ' which is invalid' % (person.gramps_id)) + logging.warning(' FAIL: the person "%s" has an event ref ' + 'list which is invalid', (person.gramps_id)) person.set_event_ref_list([]) self.db.commit_person(person, self.trans) self.invalid_events.add(key) @@ -1169,34 +1191,36 @@ class CheckIntegrity: event_ref.ref = create_id() event_handle = event_ref.ref try: - event = self.db.get_event_from_handle(event_handle) + self.db.get_event_from_handle(event_handle) except HandleError: # The event referenced by the family # does not exist in the database - logging.warning(' FAIL: the family "%(gid)s" refers ' - 'to an event "%(hand)s" which does not ' - 'exist in the database' % - {'gid' : family.gramps_id, - 'hand' : event_handle}) + logging.warning(' FAIL: the family "%(gid)s" refers' + ' to an event "%(hand)s" which does ' + 'not exist in the database', + {'gid': family.gramps_id, + 'hand': event_handle}) make_unknown(event_handle, self.explanation.handle, - self.class_event, self.commit_event, self.trans) + self.class_event, self.commit_event, + self.trans) self.invalid_events.add(key) if none_handle: family.set_event_ref_list(newlist) self.db.commit_family(family, self.trans) elif not isinstance(family.get_event_ref_list(), list): # event_list is None or other garbage - logging.warning(' FAIL: the family "%s" has an event ref list' - ' which is invalid' % (family.gramps_id)) + logging.warning(' FAIL: the family "%s" has an event ref ' + 'list which is invalid', (family.gramps_id)) family.set_event_ref_list([]) self.db.commit_family(family, self.trans) self.invalid_events.add(key) - if len (self.invalid_birth_events) + len(self.invalid_death_events) +\ + if len(self.invalid_birth_events) + len(self.invalid_death_events) + \ len(self.invalid_events) == 0: logging.info(' OK: no event problems found') def check_person_references(self): + '''Looking for person reference problems''' plist = self.db.get_person_handles() self.progress.set_pass(_('Looking for person reference problems'), @@ -1215,20 +1239,22 @@ class CheckIntegrity: none_handle = True pref.ref = create_id() try: - p = self.db.get_person_from_handle( pref.ref) + self.db.get_person_from_handle(pref.ref) except HandleError: # The referenced person does not exist in the database make_unknown(pref.ref, self.explanation.handle, - self.class_person, self.commit_person, self.trans) + self.class_person, self.commit_person, + self.trans) self.invalid_person_references.add(key) if none_handle: person.set_person_ref_list(newlist) self.db.commit_person(person, self.trans) - if len (self.invalid_person_references) == 0: + if len(self.invalid_person_references) == 0: logging.info(' OK: no event problems found') def check_family_references(self): + '''Looking for family reference problems''' plist = self.db.get_person_handles() self.progress.set_pass(_('Looking for family reference problems'), @@ -1243,18 +1269,19 @@ class CheckIntegrity: family_handle = ordinance.get_family_handle() if family_handle: try: - family = self.db.get_family_from_handle(family_handle) + self.db.get_family_from_handle(family_handle) except HandleError: # The referenced family does not exist in the database - make_unknown(family_handle, - self.explanation.handle, self.class_family, - self.commit_family, self.trans, db=self.db) + make_unknown(family_handle, self.explanation.handle, + self.class_family, self.commit_family, + self.trans, db=self.db) self.invalid_family_references.add(key) - if len (self.invalid_family_references) == 0: + if len(self.invalid_family_references) == 0: logging.info(' OK: no event problems found') def check_repo_references(self): + '''Looking for repository reference problems''' slist = self.db.get_source_handles() self.progress.set_pass(_('Looking for repository reference problems'), @@ -1273,26 +1300,28 @@ class CheckIntegrity: none_handle = True reporef.ref = create_id() try: - r = self.db.get_repository_from_handle(reporef.ref) + self.db.get_repository_from_handle(reporef.ref) except HandleError: # The referenced repository does not exist in the database make_unknown(reporef.ref, self.explanation.handle, - self.class_repo, self.commit_repo, self.trans) + self.class_repo, self.commit_repo, self.trans) self.invalid_repo_references.add(key) if none_handle: - source.set_reporef_list(newlist); + source.set_reporef_list(newlist) self.db.commit_source(source, self.trans) - if len (self.invalid_repo_references) == 0: + if len(self.invalid_repo_references) == 0: logging.info(' OK: no repository reference problems found') def check_place_references(self): + '''Looking for place reference problems''' plist = self.db.get_person_handles() flist = self.db.get_family_handles() elist = self.db.get_event_handles() llist = self.db.get_place_handles() - self.progress.set_pass(_('Looking for place reference problems'), - len(elist)+len(plist)+len(flist)+len(llist)) + self.progress.set_pass( + _('Looking for place reference problems'), + len(elist) + len(plist) + len(flist) + len(llist)) logging.info('Looking for place reference problems') for bkey in llist: @@ -1307,20 +1336,20 @@ class CheckIntegrity: none_handle = True placeref.ref = create_id() try: - parent_place = self.db.get_place_from_handle(placeref.ref) + self.db.get_place_from_handle(placeref.ref) except HandleError: # The referenced place does not exist in the database - make_unknown(placeref.ref, - self.explanation.handle, self.class_place, - self.commit_place, self.trans) + make_unknown(placeref.ref, self.explanation.handle, + self.class_place, self.commit_place, + self.trans) logging.warning(' FAIL: the place "%(gid)s" refers ' 'to a parent place "%(hand)s" which ' - 'does not exist in the database' % - {'gid' : place.gramps_id, - 'hand' : placeref.ref}) + 'does not exist in the database', + {'gid': place.gramps_id, + 'hand': placeref.ref}) self.invalid_place_references.add(key) if none_handle: - place.set_placeref_list(newlist); + place.set_placeref_list(newlist) self.db.commit_place(place, self.trans) # check persons -> the LdsOrd references a place @@ -1337,14 +1366,14 @@ class CheckIntegrity: # The referenced place does not exist in the database # This is tested by TestcaseGenerator person "Broken17" # This is tested by TestcaseGenerator person "Broken18" - make_unknown(place_handle, - self.explanation.handle, self.class_place, - self.commit_place, self.trans) - logging.warning(' FAIL: the person "%(gid)s" refers ' - 'to an LdsOrd place "%(hand)s" which ' - 'does not exist in the database' % - {'gid' : person.gramps_id, - 'hand' : place_handle}) + make_unknown(place_handle, self.explanation.handle, + self.class_place, self.commit_place, + self.trans) + logging.warning(' FAIL: the person "%(gid)s" refers' + ' to an LdsOrd place "%(hand)s" which ' + 'does not exist in the database', + {'gid': person.gramps_id, + 'hand': place_handle}) self.invalid_place_references.add(key) # check families -> the LdsOrd references a place for bkey in flist: @@ -1358,14 +1387,14 @@ class CheckIntegrity: place = self.db.get_place_from_handle(place_handle) except HandleError: # The referenced place does not exist in the database - make_unknown(place_handle, - self.explanation.handle, self.class_place, - self.commit_place, self.trans) - logging.warning(' FAIL: the family "%(gid)s" refers ' - 'to an LdsOrd place "%(hand)s" which ' - 'does not exist in the database' % - {'gid' : family.gramps_id, - 'hand' : place_handle}) + make_unknown(place_handle, self.explanation.handle, + self.class_place, self.commit_place, + self.trans) + logging.warning(' FAIL: the family "%(gid)s" refers' + ' to an LdsOrd place "%(hand)s" which ' + 'does not exist in the database', + {'gid': family.gramps_id, + 'hand': place_handle}) self.invalid_place_references.add(key) # check events for bkey in elist: @@ -1378,40 +1407,40 @@ class CheckIntegrity: place = self.db.get_place_from_handle(place_handle) except HandleError: # The referenced place does not exist in the database - make_unknown(place_handle, - self.explanation.handle, self.class_place, - self.commit_place, self.trans) + make_unknown(place_handle, self.explanation.handle, + self.class_place, self.commit_place, + self.trans) logging.warning(' FAIL: the event "%(gid)s" refers ' 'to an LdsOrd place "%(hand)s" which ' - 'does not exist in the database' % - {'gid' : event.gramps_id, - 'hand' : place_handle}) + 'does not exist in the database', + {'gid': event.gramps_id, + 'hand': place_handle}) self.invalid_place_references.add(key) - if len (self.invalid_place_references) == 0: + if len(self.invalid_place_references) == 0: logging.info(' OK: no place reference problems found') def check_citation_references(self): + '''Looking for citation reference problems''' known_handles = [key.decode('utf-8') for key in - self.db.get_citation_handles()] + self.db.get_citation_handles()] total = ( - self.db.get_number_of_people() + - self.db.get_number_of_families() + - self.db.get_number_of_events() + - self.db.get_number_of_places() + - self.db.get_number_of_citations() + - self.db.get_number_of_sources() + - self.db.get_number_of_media() + - self.db.get_number_of_repositories() - ) + self.db.get_number_of_people() + + self.db.get_number_of_families() + + self.db.get_number_of_events() + + self.db.get_number_of_places() + + self.db.get_number_of_citations() + + self.db.get_number_of_sources() + + self.db.get_number_of_media() + + self.db.get_number_of_repositories() + ) self.progress.set_pass(_('Looking for citation reference problems'), total) logging.info('Looking for citation reference problems') for bhandle in self.db.person_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.person_map[bhandle] person = Person() @@ -1428,7 +1457,6 @@ class CheckIntegrity: self.invalid_citation_references.add(item[1]) for bhandle in self.db.family_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.family_map[bhandle] family = Family() @@ -1445,7 +1473,6 @@ class CheckIntegrity: self.invalid_citation_references.add(item[1]) for bhandle in self.db.place_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.place_map[bhandle] place = Place() @@ -1462,7 +1489,6 @@ class CheckIntegrity: self.invalid_citation_references.add(item[1]) for bhandle in self.db.citation_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.citation_map[bhandle] citation = Citation() @@ -1479,7 +1505,6 @@ class CheckIntegrity: self.invalid_citation_references.add(item[1]) for bhandle in self.db.repository_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.repository_map[bhandle] repository = Repository() @@ -1489,14 +1514,14 @@ class CheckIntegrity: if item[0] == 'Citation': if item[1] is None: new_handle = create_id() - repository.replace_citation_references(None, new_handle) + repository.replace_citation_references(None, + new_handle) self.db.commit_repository(repository, self.trans) self.invalid_citation_references.add(new_handle) elif item[1] not in known_handles: self.invalid_citation_references.add(item[1]) for bhandle in self.db.media_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.media_map[bhandle] obj = Media() @@ -1513,7 +1538,6 @@ class CheckIntegrity: self.invalid_citation_references.add(item[1]) for bhandle in self.db.event_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.event_map[bhandle] event = Event() @@ -1531,16 +1555,18 @@ class CheckIntegrity: for bad_handle in self.invalid_citation_references: created = make_unknown(bad_handle, self.explanation.handle, - self.class_citation, self.commit_citation, self.trans, - source_class_func=self.class_source, - source_commit_func=self.commit_source, - source_class_arg=create_id()) + self.class_citation, self.commit_citation, + self.trans, + source_class_func=self.class_source, + source_commit_func=self.commit_source, + source_class_arg=create_id()) self.invalid_source_references.add(created[0].handle) if len(self.invalid_citation_references) == 0: logging.info(' OK: no citation reference problems found') def check_source_references(self): + '''Looking for source reference problems''' clist = self.db.get_citation_handles() self.progress.set_pass(_('Looking for source reference problems'), len(clist)) @@ -1557,39 +1583,40 @@ class CheckIntegrity: self.db.commit_citation(citation, self.trans) if source_handle: try: - source = self.db.get_source_from_handle(source_handle) + self.db.get_source_from_handle(source_handle) except HandleError: # The referenced source does not exist in the database make_unknown(source_handle, self.explanation.handle, - self.class_source, self.commit_source, self.trans) + self.class_source, self.commit_source, + self.trans) logging.warning(' FAIL: the citation "%(gid)s" refers ' - 'to source "%(hand)s" which does not exist ' - 'in the database' % - {'gid' : citation.gramps_id, - 'hand' : source_handle}) + 'to source "%(hand)s" which does not exist' + ' in the database', + {'gid': citation.gramps_id, + 'hand': source_handle}) self.invalid_source_references.add(key) if len(self.invalid_source_references) == 0: logging.info(' OK: no source reference problems found') def check_media_references(self): + '''Looking for media object reference problems''' known_handles = [key.decode('utf-8') for key in - self.db.get_media_handles(False)] + self.db.get_media_handles(False)] total = ( - self.db.get_number_of_people() + - self.db.get_number_of_families() + - self.db.get_number_of_events() + - self.db.get_number_of_places() + - self.db.get_number_of_citations() + - self.db.get_number_of_sources() - ) + self.db.get_number_of_people() + + self.db.get_number_of_families() + + self.db.get_number_of_events() + + self.db.get_number_of_places() + + self.db.get_number_of_citations() + + self.db.get_number_of_sources() + ) - self.progress.set_pass(_('Looking for media object reference problems'), - total) + self.progress.set_pass(_('Looking for media object reference ' + 'problems'), total) logging.info('Looking for media object reference problems') for bhandle in self.db.person_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.person_map[bhandle] person = Person() @@ -1606,7 +1633,6 @@ class CheckIntegrity: self.invalid_media_references.add(item[1]) for bhandle in self.db.family_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.family_map[bhandle] family = Family() @@ -1623,7 +1649,6 @@ class CheckIntegrity: self.invalid_media_references.add(item[1]) for bhandle in self.db.place_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.place_map[bhandle] place = Place() @@ -1640,7 +1665,6 @@ class CheckIntegrity: self.invalid_media_references.add(item[1]) for bhandle in self.db.event_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.event_map[bhandle] event = Event() @@ -1657,7 +1681,6 @@ class CheckIntegrity: self.invalid_media_references.add(item[1]) for bhandle in self.db.citation_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.citation_map[bhandle] citation = Citation() @@ -1674,7 +1697,6 @@ class CheckIntegrity: self.invalid_media_references.add(item[1]) for bhandle in self.db.source_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.source_map[bhandle] source = Source() @@ -1691,48 +1713,45 @@ class CheckIntegrity: self.invalid_media_references.add(item[1]) for bad_handle in self.invalid_media_references: - make_unknown(bad_handle, self.explanation.handle, - self.class_media, self.commit_media, self.trans) + make_unknown(bad_handle, self.explanation.handle, self.class_media, + self.commit_media, self.trans) - if len (self.invalid_media_references) == 0: + if len(self.invalid_media_references) == 0: logging.info(' OK: no media reference problems found') def check_note_references(self): + '''Looking for note reference problems''' # Here I assume check note_references runs after all the next checks. missing_references = (len(self.invalid_person_references) + - len(self.invalid_family_references) + - len(self.invalid_birth_events) + - len(self.invalid_death_events) + - len(self.invalid_events) + - len(self.invalid_place_references) + - len(self.invalid_citation_references) + - len(self.invalid_source_references) + - len(self.invalid_repo_references) + - len(self.invalid_media_references)) + len(self.invalid_family_references) + + len(self.invalid_birth_events) + + len(self.invalid_death_events) + + len(self.invalid_events) + + len(self.invalid_place_references) + + len(self.invalid_citation_references) + + len(self.invalid_source_references) + + len(self.invalid_repo_references) + + len(self.invalid_media_references)) if missing_references: self.db.add_note(self.explanation, self.trans, set_gid=True) known_handles = [key.decode('utf-8') for key in - self.db.get_note_handles()] - bad_handles = [] + self.db.get_note_handles()] - total = ( - self.db.get_number_of_people() + - self.db.get_number_of_families() + - self.db.get_number_of_events() + - self.db.get_number_of_places() + - self.db.get_number_of_media() + - self.db.get_number_of_citations() + - self.db.get_number_of_sources() + - self.db.get_number_of_repositories() - ) + total = (self.db.get_number_of_people() + + self.db.get_number_of_families() + + self.db.get_number_of_events() + + self.db.get_number_of_places() + + self.db.get_number_of_media() + + self.db.get_number_of_citations() + + self.db.get_number_of_sources() + + self.db.get_number_of_repositories()) self.progress.set_pass(_('Looking for note reference problems'), total) logging.info('Looking for note reference problems') for bhandle in self.db.person_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.person_map[bhandle] person = Person() @@ -1749,7 +1768,6 @@ class CheckIntegrity: self.invalid_note_references.add(item[1]) for bhandle in self.db.family_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.family_map[bhandle] family = Family() @@ -1766,7 +1784,6 @@ class CheckIntegrity: self.invalid_note_references.add(item[1]) for bhandle in self.db.place_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.place_map[bhandle] place = Place() @@ -1783,7 +1800,6 @@ class CheckIntegrity: self.invalid_note_references.add(item[1]) for bhandle in self.db.citation_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.citation_map[bhandle] citation = Citation() @@ -1800,7 +1816,6 @@ class CheckIntegrity: self.invalid_note_references.add(item[1]) for bhandle in self.db.source_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.source_map[bhandle] source = Source() @@ -1817,7 +1832,6 @@ class CheckIntegrity: self.invalid_note_references.add(item[1]) for bhandle in self.db.media_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.media_map[bhandle] obj = Media() @@ -1834,7 +1848,6 @@ class CheckIntegrity: self.invalid_note_references.add(item[1]) for bhandle in self.db.event_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.event_map[bhandle] event = Event() @@ -1851,7 +1864,6 @@ class CheckIntegrity: self.invalid_note_references.add(item[1]) for bhandle in self.db.repository_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.repository_map[bhandle] repo = Repository() @@ -1869,21 +1881,22 @@ class CheckIntegrity: for bad_handle in self.invalid_note_references: make_unknown(bad_handle, self.explanation.handle, - self.class_note, self.commit_note, self.trans) + self.class_note, self.commit_note, self.trans) - if len (self.invalid_note_references) == 0: + if len(self.invalid_note_references) == 0: logging.info(' OK: no note reference problems found') else: if not missing_references: self.db.add_note(self.explanation, self.trans, set_gid=True) def check_checksum(self): + ''' fix media checksums ''' self.progress.set_pass(_('Updating checksums on media'), len(self.db.get_media_handles())) - for bObjectId in self.db.get_media_handles(): + for bobjectid in self.db.get_media_handles(): self.progress.step() - ObjectId = bObjectId.decode('utf-8') - obj = self.db.get_media_from_handle(ObjectId) + objectid = bobjectid.decode('utf-8') + obj = self.db.get_media_from_handle(objectid) full_path = media_path_full(self.db, obj.get_path()) new_checksum = create_checksum(full_path) if new_checksum != obj.checksum: @@ -1892,22 +1905,20 @@ class CheckIntegrity: self.db.commit_media(obj, self.trans) def check_tag_references(self): + '''Looking for tag reference problems''' known_handles = [key.decode('utf-8') for key in - self.db.get_tag_handles()] + self.db.get_tag_handles()] - total = ( - self.db.get_number_of_people() + - self.db.get_number_of_families() + - self.db.get_number_of_media() + - self.db.get_number_of_notes() - ) + total = (self.db.get_number_of_people() + + self.db.get_number_of_families() + + self.db.get_number_of_media() + + self.db.get_number_of_notes()) self.progress.set_pass(_('Looking for tag reference problems'), total) logging.info('Looking for tag reference problems') for bhandle in self.db.person_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.person_map[bhandle] person = Person() @@ -1924,7 +1935,6 @@ class CheckIntegrity: self.invalid_tag_references.add(item[1]) for bhandle in self.db.family_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.family_map[bhandle] family = Family() @@ -1941,7 +1951,6 @@ class CheckIntegrity: self.invalid_tag_references.add(item[1]) for bhandle in self.db.media_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.media_map[bhandle] obj = Media() @@ -1958,7 +1967,6 @@ class CheckIntegrity: self.invalid_tag_references.add(item[1]) for bhandle in self.db.note_map.keys(): - handle = bhandle.decode('utf-8') self.progress.step() info = self.db.note_map[bhandle] note = Note() @@ -1976,7 +1984,7 @@ class CheckIntegrity: for bad_handle in self.invalid_tag_references: make_unknown(bad_handle, None, self.class_tag, - self.commit_tag, self.trans) + self.commit_tag, self.trans) if len(self.invalid_tag_references) == 0: logging.info(' OK: no tag reference problems found') @@ -1987,12 +1995,10 @@ class CheckIntegrity: version 15 to 16. Mediarefs on source primary objects can contain sourcerefs, and these were not converted to citations. """ - total = ( - self.db.get_number_of_sources() - ) + total = (self.db.get_number_of_sources()) - self.progress.set_pass(_('Looking for media source reference problems'), - total) + self.progress.set_pass(_('Looking for media source reference ' + 'problems'), total) logging.info('Looking for media source reference problems') for handle in self.db.source_map.keys(): @@ -2023,9 +2029,9 @@ class CheckIntegrity: citation_handle = create_id() new_citation.set_handle(citation_handle) self.replaced_sourceref.append(handle) - logging.warning(' FAIL: the source "%s" has a media ' - 'reference with a source citation ' - 'which is invalid' % (source.gramps_id)) + logging.warning(' FAIL: the source "%s" has a media' + ' reference with a source citation ' + 'which is invalid', (source.gramps_id)) self.db.add_citation(new_citation, self.trans) new_citation_list.append(citation_handle) @@ -2037,14 +2043,15 @@ class CheckIntegrity: self.db.commit_source(source, self.trans) if len(self.replaced_sourceref) > 0: - logging.info(' OK: no broken source citations on mediarefs found') + logging.info(' OK: no broken source citations on mediarefs ' + 'found') def class_person(self, handle): person = Person() person.set_handle(handle) return person - def commit_person(self, person, trans, change): + def commit_person(self, person, trans, dummy): self.db.add_person(person, trans, set_gid=True) def class_family(self, handle): @@ -2052,7 +2059,7 @@ class CheckIntegrity: family.set_handle(handle) return family - def commit_family(self, family, trans, change): + def commit_family(self, family, trans, dummy): self.db.add_family(family, trans, set_gid=True) def class_event(self, handle): @@ -2060,7 +2067,7 @@ class CheckIntegrity: event.set_handle(handle) return event - def commit_event(self, event, trans, change): + def commit_event(self, event, trans, dummy): self.db.add_event(event, trans, set_gid=True) def class_place(self, handle): @@ -2068,7 +2075,7 @@ class CheckIntegrity: place.set_handle(handle) return place - def commit_place(self, place, trans, change): + def commit_place(self, place, trans, dummy): self.db.add_place(place, trans, set_gid=True) def class_source(self, handle): @@ -2076,7 +2083,7 @@ class CheckIntegrity: source.set_handle(handle) return source - def commit_source(self, source, trans, change): + def commit_source(self, source, trans, dummy): self.db.add_source(source, trans, set_gid=True) def class_citation(self, handle): @@ -2084,7 +2091,7 @@ class CheckIntegrity: citation.set_handle(handle) return citation - def commit_citation(self, citation, trans, change): + def commit_citation(self, citation, trans, dummy): self.db.add_citation(citation, trans, set_gid=True) def class_repo(self, handle): @@ -2092,23 +2099,23 @@ class CheckIntegrity: repo.set_handle(handle) return repo - def commit_repo(self, repo, trans, change): + def commit_repo(self, repo, trans, dummy): self.db.add_repository(repo, trans, set_gid=True) def class_media(self, handle): - object = Media() - object.set_handle(handle) - return object + obj = Media() + obj.set_handle(handle) + return obj - def commit_media(self, object, trans, change): - self.db.add_media(object, trans, set_gid=True) + def commit_media(self, obj, trans, dummy): + self.db.add_media(obj, trans, set_gid=True) def class_note(self, handle): note = Note() note.set_handle(handle) return note - def commit_note(self, note, trans, change): + def commit_note(self, note, trans, dummy): self.db.add_note(note, trans, set_gid=True) def class_tag(self, handle): @@ -2116,10 +2123,11 @@ class CheckIntegrity: tag.set_handle(handle) return tag - def commit_tag(self, tag, trans, change): + def commit_tag(self, tag, trans, dummy): self.db.add_tag(tag, trans) def build_report(self, uistate=None): + ''' build the report from various counters''' self.progress.close() bad_photos = len(self.bad_photo) replaced_photos = len(self.replaced_photo) @@ -2150,11 +2158,10 @@ class CheckIntegrity: errors = (photos + efam + blink + plink + slink + rel + event_invalid + person + self.place_errors + - person_references + family_references + place_references + - citation_references + repo_references + media_references + + person_references + family_references + place_references + + citation_references + repo_references + media_references + note_references + tag_references + name_format + empty_objs + - invalid_dates + source_references - ) + invalid_dates + source_references) if errors == 0: if uistate: @@ -2162,10 +2169,10 @@ class CheckIntegrity: _('The database has passed internal checks'), parent=uistate.window) else: - print(_("No errors were found: the database has passed internal checks.")) + print(_("No errors were found: the database has passed " + "internal checks.")) return 0 - self.text = StringIO() if blink > 0: self.text.write( # translators: leave all/any {...} untranslated @@ -2177,19 +2184,19 @@ class CheckIntegrity: try: person = self.db.get_person_from_handle(person_handle) except HandleError: - cn = _("Non existing child") + cname = _("Non existing child") else: - cn = person.get_primary_name().get_name() + cname = person.get_primary_name().get_name() try: family = self.db.get_family_from_handle(family_handle) except HandleError: - pn = _("Unknown") + pname = _("Unknown") else: - pn = family_name(family, self.db) + pname = family_name(family, self.db) self.text.write('\t') self.text.write( _("%(person)s was removed from the family of %(family)s\n") - % {'person': cn, 'family': pn} + % {'person': cname, 'family': pname} ) if plink > 0: @@ -2203,56 +2210,56 @@ class CheckIntegrity: try: person = self.db.get_person_from_handle(person_handle) except HandleError: - cn = _("Non existing person") + cname = _("Non existing person") else: - cn = person.get_primary_name().get_name() + cname = person.get_primary_name().get_name() try: family = self.db.get_family_from_handle(family_handle) except HandleError: - pn = _("Unknown") + pname = _("Unknown") else: - pn = family_name(family, self.db) + pname = family_name(family, self.db) self.text.write('\t') self.text.write( _("%(person)s was restored to the family of %(family)s\n") - % {'person': cn, 'family': pn} + % {'person': cname, 'family': pname} ) if slink > 0: self.text.write( # translators: leave all/any {...} untranslated ngettext("{quantity} duplicate " - "spouse/family link was found\n", + "spouse/family link was found\n", "{quantity} duplicate " - "spouse/family links were found\n", + "spouse/family links were found\n", slink).format(quantity=slink) ) for (person_handle, family_handle) in self.broken_parent_links: try: person = self.db.get_person_from_handle(person_handle) except HandleError: - cn = _("Non existing person") + cname = _("Non existing person") else: - cn = person.get_primary_name().get_name() + cname = person.get_primary_name().get_name() try: family = self.db.get_family_from_handle(family_handle) except HandleError: - pn = _("None") + pname = _("None") else: - pn = family_name(family, self.db) + pname = family_name(family, self.db) self.text.write('\t') self.text.write( _("%(person)s was restored to the family of %(family)s\n") - % {'person': cn, 'family': pn} + % {'person': cname, 'family': pname} ) if efam: self.text.write( # translators: leave all/any {...} untranslated ngettext("{quantity} family " - "with no parents or children found, removed.\n", + "with no parents or children found, removed.\n", "{quantity} families " - "with no parents or children found, removed.\n", + "with no parents or children found, removed.\n", efam).format(quantity=efam) ) if efam == 1: @@ -2287,9 +2294,9 @@ class CheckIntegrity: self.text.write( # translators: leave all/any {...} untranslated ngettext("{quantity} family was " - "referenced but not found\n", + "referenced but not found\n", "{quantity} families were " - "referenced, but not found\n", + "referenced, but not found\n", family_references).format(quantity=family_references) ) @@ -2306,9 +2313,9 @@ class CheckIntegrity: # translators: leave all/any {...} untranslated ngettext( "{quantity} repository was " - "referenced but not found\n", + "referenced but not found\n", "{quantity} repositories were " - "referenced, but not found\n", + "referenced, but not found\n", repo_references).format(quantity=repo_references) ) @@ -2316,9 +2323,9 @@ class CheckIntegrity: self.text.write( # translators: leave all/any {...} untranslated ngettext("{quantity} media object was " - "referenced but not found\n", + "referenced but not found\n", "{quantity} media objects were " - "referenced, but not found\n", + "referenced, but not found\n", photos).format(quantity=photos) ) @@ -2382,41 +2389,39 @@ class CheckIntegrity: if citation_references: self.text.write( # translators: leave all/any {...} untranslated - ngettext("{quantity} citation was " - "referenced but not found\n", - "{quantity} citations were " - "referenced, but not found\n", - citation_references - ).format(quantity=citation_references) + ngettext( + "{quantity} citation was referenced but not found\n", + "{quantity} citations were referenced, but not found\n", + citation_references + ).format(quantity=citation_references) ) if source_references: self.text.write( # translators: leave all/any {...} untranslated - ngettext("{quantity} source was " - "referenced but not found\n", - "{quantity} sources were " - "referenced, but not found\n", - source_references).format(quantity=source_references) + ngettext( + "{quantity} source was referenced but not found\n", + "{quantity} sources were referenced, but not found\n", + source_references).format(quantity=source_references) ) if media_references: self.text.write( # translators: leave all/any {...} untranslated - ngettext("{quantity} media object was " - "referenced but not found\n", - "{quantity} media objects were " - "referenced, but not found\n", - media_references).format(quantity=media_references) + ngettext( + "{quantity} media object was referenced but not found\n", + "{quantity} media objects were referenced," + " but not found\n", + media_references).format(quantity=media_references) ) if note_references: self.text.write( # translators: leave all/any {...} untranslated ngettext("{quantity} note object was " - "referenced but not found\n", + "referenced but not found\n", "{quantity} note objects were " - "referenced, but not found\n", + "referenced, but not found\n", note_references).format(quantity=note_references) ) @@ -2424,9 +2429,9 @@ class CheckIntegrity: self.text.write( # translators: leave all/any {...} untranslated ngettext("{quantity} tag object was " - "referenced but not found\n", + "referenced but not found\n", "{quantity} tag objects were " - "referenced, but not found\n", + "referenced, but not found\n", tag_references).format(quantity=tag_references) ) @@ -2434,9 +2439,9 @@ class CheckIntegrity: self.text.write( # translators: leave all/any {...} untranslated ngettext("{quantity} tag object was " - "referenced but not found\n", + "referenced but not found\n", "{quantity} tag objects were " - "referenced, but not found\n", + "referenced, but not found\n", tag_references).format(quantity=tag_references) ) @@ -2444,68 +2449,71 @@ class CheckIntegrity: self.text.write( # translators: leave all/any {...} untranslated ngettext("{quantity} invalid name format " - "reference was removed\n", + "reference was removed\n", "{quantity} invalid name format " - "references were removed\n", + "references were removed\n", name_format).format(quantity=name_format) ) if replaced_sourcerefs: self.text.write( # translators: leave all/any {...} untranslated - ngettext("{quantity} invalid source citation was fixed\n", - "{quantity} invalid source citations were fixed\n", - replaced_sourcerefs - ).format(quantity=replaced_sourcerefs) + ngettext( + "{quantity} invalid source citation was fixed\n", + "{quantity} invalid source citations were fixed\n", + replaced_sourcerefs + ).format(quantity=replaced_sourcerefs) ) - if empty_objs > 0 : - self.text.write(_("%(empty_obj)d empty objects removed:\n" - " %(person)d person objects\n" - " %(family)d family objects\n" - " %(event)d event objects\n" - " %(source)d source objects\n" - " %(media)d media objects\n" - " %(place)d place objects\n" - " %(repo)d repository objects\n" - " %(note)d note objects\n") % { - 'empty_obj' : empty_objs, - 'person' : len(self.empty_objects['persons']), - 'family' : len(self.empty_objects['families']), - 'event' : len(self.empty_objects['events']), - 'source' : len(self.empty_objects['sources']), - 'media' : len(self.empty_objects['media']), - 'place' : len(self.empty_objects['places']), - 'repo' : len(self.empty_objects['repos']), - 'note' : len(self.empty_objects['notes']) - } - ) + if empty_objs > 0: + self.text.write(_( + "%(empty_obj)d empty objects removed:\n" + " %(person)d person objects\n" + " %(family)d family objects\n" + " %(event)d event objects\n" + " %(source)d source objects\n" + " %(media)d media objects\n" + " %(place)d place objects\n" + " %(repo)d repository objects\n" + " %(note)d note objects\n") % { + 'empty_obj': empty_objs, + 'person': len(self.empty_objects['persons']), + 'family': len(self.empty_objects['families']), + 'event': len(self.empty_objects['events']), + 'source': len(self.empty_objects['sources']), + 'media': len(self.empty_objects['media']), + 'place': len(self.empty_objects['places']), + 'repo': len(self.empty_objects['repos']), + 'note': len(self.empty_objects['notes']) + } + ) return errors -#------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- # # Display the results # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------- class Report(ManagedWindow): - - def __init__(self, uistate, text, cl=0): - if cl: - print (text) + """ Report out the results """ + def __init__(self, uistate, text, cli=0): + if cli: + print(text) if uistate: ManagedWindow.__init__(self, uistate, [], self) - topDialog = Glade() - topDialog.get_object("close").connect('clicked', self.close) - window = topDialog.toplevel - textwindow = topDialog.get_object("textwindow") + topdialog = Glade() + topdialog.get_object("close").connect('clicked', self.close) + window = topdialog.toplevel + textwindow = topdialog.get_object("textwindow") textwindow.get_buffer().set_text(text) self.set_window(window, - #topDialog.get_widget("title"), - topDialog.get_object("title"), + # topdialog.get_widget("title"), + topdialog.get_object("title"), _("Integrity Check Results")) self.show() @@ -2513,11 +2521,12 @@ class Report(ManagedWindow): def build_menu_names(self, obj): return (_('Check and Repair'), None) -#------------------------------------------------------------------------ + +# ------------------------------------------------------------------------ # # # -#------------------------------------------------------------------------ +# ------------------------------------------------------------------------ class CheckOptions(tool.ToolOptions): """ Defines options and provides handling interface. diff --git a/gramps/plugins/tool/testcasegenerator.py b/gramps/plugins/tool/testcasegenerator.py index 72ee17856..69c20f9b1 100644 --- a/gramps/plugins/tool/testcasegenerator.py +++ b/gramps/plugins/tool/testcasegenerator.py @@ -23,37 +23,40 @@ # """Tools/Debug/Generate Testcases for Persons and Families""" - -#------------------------------------------------------------------------- +# pylint: disable=too-many-statements,too-many-locals,too-many-branches +# pylint: disable=wrong-import-position,too-many-public-methods,no-self-use +# pylint: disable=too-many-arguments +# ------------------------------------------------------------------------ # # standard python modules # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------ import sys import os import random from gramps.gen.const import GRAMPS_LOCALE as glocale _ = glocale.translation.gettext -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------ # # GNOME libraries # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------ from gi.repository import Gtk -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------ # # Gramps modules # -#------------------------------------------------------------------------- -from gramps.gen.lib import (Address, Attribute, AttributeType, ChildRef, - ChildRefType, Citation, Date, Event, EventRef, EventRoleType, - EventType, Family, FamilyRelType, GrampsType, LdsOrd, Location, - Media, MediaRef, Name, NameOriginType, NameType, Note, - NoteType, Person, PersonRef, Place, PlaceType, PlaceRef, PlaceName, - RepoRef, Repository, RepositoryType, Source, SourceMediaType, - SrcAttribute, SrcAttributeType, Surname, Tag, Url, UrlType) +# ------------------------------------------------------------------------ +from gramps.gen.lib import ( + Address, Attribute, AttributeType, ChildRef, + ChildRefType, Citation, Date, Event, EventRef, EventRoleType, + EventType, Family, FamilyRelType, GrampsType, LdsOrd, Location, + Media, MediaRef, Name, NameOriginType, NameType, Note, + NoteType, Person, PersonRef, Place, PlaceType, PlaceRef, PlaceName, + RepoRef, Repository, RepositoryType, Source, SourceMediaType, + SrcAttribute, SrcAttributeType, Surname, Tag, Url, UrlType) from gramps.gen.lib.addressbase import AddressBase from gramps.gen.lib.attrbase import AttributeBase from gramps.gen.lib.primaryobj import BasicPrimaryObject @@ -79,11 +82,11 @@ from gramps.gen.const import ICON, LOGO, SPLASH from gramps.gui.display import display_help from gramps.gen.const import URL_MANUAL_PAGE -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------ # # Constants # -#------------------------------------------------------------------------- +# ------------------------------------------------------------------------ WIKI_HELP_PAGE = '%s_-_Tools' % URL_MANUAL_PAGE WIKI_HELP_SEC = _('Generate_Testcases_for_Persons_and_Families') @@ -103,52 +106,53 @@ _randint = myrand.randint LDS_ORD_BAPT_STATUS = ( - LdsOrd.STATUS_NONE, - LdsOrd.STATUS_CHILD, LdsOrd.STATUS_CLEARED, - LdsOrd.STATUS_COMPLETED, LdsOrd.STATUS_INFANT, - LdsOrd.STATUS_PRE_1970, LdsOrd.STATUS_QUALIFIED, - LdsOrd.STATUS_STILLBORN, LdsOrd.STATUS_SUBMITTED, - LdsOrd.STATUS_UNCLEARED) + LdsOrd.STATUS_NONE, + LdsOrd.STATUS_CHILD, LdsOrd.STATUS_CLEARED, + LdsOrd.STATUS_COMPLETED, LdsOrd.STATUS_INFANT, + LdsOrd.STATUS_PRE_1970, LdsOrd.STATUS_QUALIFIED, + LdsOrd.STATUS_STILLBORN, LdsOrd.STATUS_SUBMITTED, + LdsOrd.STATUS_UNCLEARED) LDS_ORD_CHILD_SEALING_STATUS = ( - LdsOrd.STATUS_NONE, - LdsOrd.STATUS_BIC, LdsOrd.STATUS_CLEARED, - LdsOrd.STATUS_COMPLETED,LdsOrd.STATUS_DNS, - LdsOrd.STATUS_PRE_1970, LdsOrd.STATUS_QUALIFIED, - LdsOrd.STATUS_STILLBORN, LdsOrd.STATUS_SUBMITTED, - LdsOrd.STATUS_UNCLEARED) + LdsOrd.STATUS_NONE, + LdsOrd.STATUS_BIC, LdsOrd.STATUS_CLEARED, + LdsOrd.STATUS_COMPLETED, LdsOrd.STATUS_DNS, + LdsOrd.STATUS_PRE_1970, LdsOrd.STATUS_QUALIFIED, + LdsOrd.STATUS_STILLBORN, LdsOrd.STATUS_SUBMITTED, + LdsOrd.STATUS_UNCLEARED) LDS_ENDOWMENT_DATE_STATUS = ( - LdsOrd.STATUS_NONE, - LdsOrd.STATUS_CHILD, LdsOrd.STATUS_CLEARED, - LdsOrd.STATUS_COMPLETED, LdsOrd.STATUS_INFANT, - LdsOrd.STATUS_PRE_1970, LdsOrd.STATUS_QUALIFIED, - LdsOrd.STATUS_STILLBORN, LdsOrd.STATUS_SUBMITTED, - LdsOrd.STATUS_UNCLEARED) + LdsOrd.STATUS_NONE, + LdsOrd.STATUS_CHILD, LdsOrd.STATUS_CLEARED, + LdsOrd.STATUS_COMPLETED, LdsOrd.STATUS_INFANT, + LdsOrd.STATUS_PRE_1970, LdsOrd.STATUS_QUALIFIED, + LdsOrd.STATUS_STILLBORN, LdsOrd.STATUS_SUBMITTED, + LdsOrd.STATUS_UNCLEARED) LDS_SPOUSE_SEALING_DATE_STATUS = ( - LdsOrd.STATUS_NONE, - LdsOrd.STATUS_CANCELED, LdsOrd.STATUS_CLEARED, - LdsOrd.STATUS_COMPLETED, LdsOrd.STATUS_DNS, - LdsOrd.STATUS_DNS_CAN, LdsOrd.STATUS_PRE_1970, - LdsOrd.STATUS_QUALIFIED, LdsOrd.STATUS_SUBMITTED, - LdsOrd.STATUS_UNCLEARED) + LdsOrd.STATUS_NONE, + LdsOrd.STATUS_CANCELED, LdsOrd.STATUS_CLEARED, + LdsOrd.STATUS_COMPLETED, LdsOrd.STATUS_DNS, + LdsOrd.STATUS_DNS_CAN, LdsOrd.STATUS_PRE_1970, + LdsOrd.STATUS_QUALIFIED, LdsOrd.STATUS_SUBMITTED, + LdsOrd.STATUS_UNCLEARED) LDS_INDIVIDUAL_ORD = [(LdsOrd.BAPTISM, LDS_ORD_BAPT_STATUS), (LdsOrd.CONFIRMATION, LDS_ORD_BAPT_STATUS), (LdsOrd.ENDOWMENT, LDS_ENDOWMENT_DATE_STATUS), - (LdsOrd.SEAL_TO_PARENTS, - LDS_ORD_CHILD_SEALING_STATUS)] + (LdsOrd.SEAL_TO_PARENTS, LDS_ORD_CHILD_SEALING_STATUS)] LDS_SPOUSE_SEALING = [(LdsOrd.SEAL_TO_SPOUSE, - LDS_SPOUSE_SEALING_DATE_STATUS)] + LDS_SPOUSE_SEALING_DATE_STATUS)] + + +# ------------------------------------------------------------------------ -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- class TestcaseGenerator(tool.BatchTool): + ''' + This tool generates various test cases for problems that have occured. + The issues it generates can be corrected via the 'Check and Repair' tool. + ''' NUMERIC = 0 FIRSTNAME = 1 FIRSTNAME_FEMALE = 2 @@ -178,17 +182,17 @@ class TestcaseGenerator(tool.BatchTool): # ] FAMILY_EVENTS = set([ - EventType.ANNULMENT, - EventType.CENSUS, - EventType.DIVORCE, - EventType.DIV_FILING, - EventType.ENGAGEMENT, - EventType.MARRIAGE, - EventType.MARR_BANNS, - EventType.MARR_CONTR, - EventType.MARR_LIC, - EventType.MARR_SETTL, - EventType.CUSTOM ]) + EventType.ANNULMENT, + EventType.CENSUS, + EventType.DIVORCE, + EventType.DIV_FILING, + EventType.ENGAGEMENT, + EventType.MARRIAGE, + EventType.MARR_BANNS, + EventType.MARR_CONTR, + EventType.MARR_LIC, + EventType.MARR_SETTL, + EventType.CUSTOM]) def __init__(self, dbstate, user, options_class, name, callback=None): uistate = user.uistate @@ -197,7 +201,10 @@ class TestcaseGenerator(tool.BatchTool): else: parent_window = None self.progress = user.progress + +# ******** This ensures that a chunk of code below never executes!!!! self.person = None + if dbstate.db.readonly: return @@ -207,7 +214,9 @@ class TestcaseGenerator(tool.BatchTool): if self.fail: return + self.options_dict = self.options.handler.options_dict self.person_count = 0 + self.max_person_count = self.options_dict['person_count'] self.persons_todo = [] self.parents_todo = [] self.person_dates = {} @@ -221,26 +230,28 @@ class TestcaseGenerator(tool.BatchTool): self.generated_notes = [] self.generated_tags = [] self.text_serial_number = 1 + self.trans = None self.parent_places = {} for type_num in range(1, 8): self.parent_places[type_num] = [] - # If an active persons exists the generated tree is connected to that person + # If an active persons exists the generated tree is connected to that + # person if self.person: # try to get birth and death year try: - bh = self.person.get_birth_handle() - b = self.db.get_event_from_handle( bh) - do = b.get_date_object() - birth = do.get_year() + birth_h = self.person.get_birth_handle() + birth_e = self.db.get_event_from_handle(birth_h) + dat_o = birth_e.get_date_object() + birth = dat_o.get_year() except AttributeError: birth = None try: - dh = self.person.get_death_handle() - b = self.db.get_event_from_handle( dh) - do = b.get_date_object() - death = do.get_year() + death_h = self.person.get_death_handle() + death_e = self.db.get_event_from_handle(death_h) + dat_o = death_e.get_date_object() + death = dat_o.get_year() except AttributeError: death = None if not birth and not death: @@ -249,7 +260,7 @@ class TestcaseGenerator(tool.BatchTool): death = birth + _randint(20, 90) if death and not birth: birth = death - _randint(20, 90) - self.person_dates[self.person.get_handle()] = (birth,death) + self.person_dates[self.person.get_handle()] = (birth, death) self.persons_todo.append(self.person.get_handle()) self.parents_todo.append(self.person.get_handle()) @@ -259,56 +270,59 @@ class TestcaseGenerator(tool.BatchTool): else: self.run_tool(cli=True) - def init_gui(self,uistate): + def init_gui(self, uistate): title = "%s - Gramps" % _("Generate testcases") self.top = Gtk.Dialog(title, parent=uistate.window) self.window = uistate.window - self.top.set_default_size(400,150) + self.top.set_default_size(400, 150) self.top.vbox.set_spacing(5) - label = Gtk.Label(label='%s' % _("Generate testcases")) + label = Gtk.Label(label='%s' + % _("Generate testcases")) label.set_use_markup(True) - self.top.vbox.pack_start(label,0,0,5) + self.top.vbox.pack_start(label, 0, 0, 5) - self.check_lowlevel = Gtk.CheckButton(label=_("Generate low level database " - "errors\nCorrection needs database reload")) - self.check_lowlevel.set_active( self.options.handler.options_dict['lowlevel']) - self.top.vbox.pack_start(self.check_lowlevel,0,0,5) + self.check_lowlevel = Gtk.CheckButton(label=_( + "Generate low level database " + "errors\nCorrection needs database reload")) + self.check_lowlevel.set_active(self.options_dict['lowlevel']) + self.top.vbox.pack_start(self.check_lowlevel, 0, 0, 5) self.check_bugs = Gtk.CheckButton(label=_("Generate database errors")) - self.check_bugs.set_active( self.options.handler.options_dict['bugs']) - self.top.vbox.pack_start(self.check_bugs,0,0,5) + self.check_bugs.set_active(self.options_dict['bugs']) + self.top.vbox.pack_start(self.check_bugs, 0, 0, 5) self.check_persons = Gtk.CheckButton(label=_("Generate dummy data")) - self.check_persons.set_active( self.options.handler.options_dict['persons']) + self.check_persons.set_active(self.options_dict['persons']) self.check_persons.connect('clicked', self.on_dummy_data_clicked) - self.top.vbox.pack_start(self.check_persons,0,0,5) + self.top.vbox.pack_start(self.check_persons, 0, 0, 5) self.check_longnames = Gtk.CheckButton(label=_("Generate long names")) - self.check_longnames.set_active( self.options.handler.options_dict['long_names']) - self.top.vbox.pack_start(self.check_longnames,0,0,5) + self.check_longnames.set_active(self.options_dict['long_names']) + self.top.vbox.pack_start(self.check_longnames, 0, 0, 5) - self.check_specialchars = Gtk.CheckButton(label=_("Add special characters")) - self.check_specialchars.set_active( self.options.handler.options_dict['specialchars']) - self.top.vbox.pack_start(self.check_specialchars,0,0,5) + self.check_specialchars = Gtk.CheckButton(label=_( + "Add special characters")) + self.check_specialchars.set_active(self.options_dict['specialchars']) + self.top.vbox.pack_start(self.check_specialchars, 0, 0, 5) self.check_serial = Gtk.CheckButton(label=_("Add serial number")) - self.check_serial.set_active( self.options.handler.options_dict['add_serial']) - self.top.vbox.pack_start(self.check_serial,0,0,5) + self.check_serial.set_active(self.options_dict['add_serial']) + self.top.vbox.pack_start(self.check_serial, 0, 0, 5) self.check_linebreak = Gtk.CheckButton(label=_("Add line break")) - self.check_linebreak.set_active( self.options.handler.options_dict['add_linebreak']) - self.top.vbox.pack_start(self.check_linebreak,0,0,5) + self.check_linebreak.set_active(self.options_dict['add_linebreak']) + self.top.vbox.pack_start(self.check_linebreak, 0, 0, 5) - self.label = Gtk.Label(label=_("Number of people to generate\n" - "(Number is approximate because families " - "are generated)")) + self.label = Gtk.Label(label=_( + "Number of people to generate\n" + "(Number is approximate because families are generated)")) self.label.set_halign(Gtk.Align.START) - self.top.vbox.pack_start(self.label,0,0,5) + self.top.vbox.pack_start(self.label, 0, 0, 5) self.entry_count = Gtk.Entry() - self.entry_count.set_text(str( self.options.handler.options_dict['person_count'])) + self.entry_count.set_text(str(self.max_person_count)) self.on_dummy_data_clicked(self.check_persons) - self.top.vbox.pack_start(self.entry_count,0,0,5) + self.top.vbox.pack_start(self.entry_count, 0, 0, 5) self.top.add_button(_('_Cancel'), Gtk.ResponseType.CANCEL) self.top.add_button(_('_OK'), Gtk.ResponseType.OK) @@ -316,30 +330,30 @@ class TestcaseGenerator(tool.BatchTool): self.top.show_all() response = self.top.run() - self.options.handler.options_dict['lowlevel'] = int( + self.options_dict['lowlevel'] = int( self.check_lowlevel.get_active()) - self.options.handler.options_dict['bugs'] = int( + self.options_dict['bugs'] = int( self.check_bugs.get_active()) - self.options.handler.options_dict['persons'] = int( + self.options_dict['persons'] = int( self.check_persons.get_active()) - self.options.handler.options_dict['long_names'] = int( + self.options_dict['long_names'] = int( self.check_longnames.get_active()) - self.options.handler.options_dict['specialchars'] = int( + self.options_dict['specialchars'] = int( self.check_specialchars.get_active()) - self.options.handler.options_dict['add_serial'] = int( + self.options_dict['add_serial'] = int( self.check_serial.get_active()) - self.options.handler.options_dict['add_linebreak'] = int( + self.options_dict['add_linebreak'] = int( self.check_linebreak.get_active()) - self.options.handler.options_dict['person_count'] = int( + self.options_dict['person_count'] = int( self.entry_count.get_text()) self.top.destroy() if response == Gtk.ResponseType.HELP: display_help(webpage=WIKI_HELP_PAGE, - section=WIKI_HELP_SEC) + section=WIKI_HELP_SEC) else: if response == Gtk.ResponseType.OK: - self.run_tool( cli=False) + self.run_tool(cli=False) # Save options self.options.handler.save_options() @@ -349,57 +363,56 @@ class TestcaseGenerator(tool.BatchTool): def run_tool(self, cli=False): self.cli = cli - if (not cli): + if not cli: while Gtk.events_pending(): Gtk.main_iteration() else: self.window = None - self.transaction_count = 0; + self.transaction_count = 0 - if self.options.handler.options_dict['lowlevel']: + if self.options_dict['lowlevel']: with self.progress(_('Generating testcases'), _('Generating low level database errors'), 1) as step: self.test_low_level() step() - if self.options.handler.options_dict['bugs'] or \ - self.options.handler.options_dict['persons']: + if self.options_dict['bugs'] or self.options_dict['persons']: self.generate_tags() - if self.options.handler.options_dict['bugs']: + if self.options_dict['bugs']: with self.progress(_('Generating testcases'), _('Generating database errors'), 19) as step: self.generate_data_errors(step) - if self.options.handler.options_dict['persons']: + if self.options_dict['persons']: with self.progress(_('Generating testcases'), _('Generating families'), - self.options.handler.options_dict['person_count']) \ + self.max_person_count) \ as self.progress_step: self.person_count = 0 while True: if not self.persons_todo: - ph = self.generate_person(0) - self.persons_todo.append( ph) - self.parents_todo.append( ph) + pers_h = self.generate_person(0) + self.persons_todo.append(pers_h) + self.parents_todo.append(pers_h) person_h = self.persons_todo.pop(0) self.generate_family(person_h) if _randint(0, 3) == 0: self.generate_family(person_h) if _randint(0, 7) == 0: self.generate_family(person_h) - if self.person_count > self.options.handler.options_dict['person_count']: + if self.person_count > self.max_person_count: break for child_h in self.parents_todo: self.generate_parents(child_h) - if self.person_count > self.options.handler.options_dict['person_count']: + if self.person_count > self.max_person_count: break - if( not cli): + if not cli: self.top.destroy() def generate_data_errors(self, step): @@ -407,121 +420,143 @@ class TestcaseGenerator(tool.BatchTool): The module names correspond to the checking methods in src/plugins/tool/Check.CheckIntegrity """ # The progress meter is normally stepped every time a person is - # generated by generate_person. However in this case, generate_person is - # called by some of the constituent functions, but we only want the + # generated by generate_person. However in this case, generate_person + # is called by some of the constituent functions, but we only want the # meter to be stepped every time a test function has been completed. self.progress_step = lambda: None - self.test_fix_encoding(); step() - self.test_fix_ctrlchars_in_notes(); step() - self.test_fix_alt_place_names(); step() - self.test_cleanup_deleted_name_formats(); step() - self.test_cleanup_empty_objects(); step() - self.test_check_for_broken_family_links(); step() - self.test_check_parent_relationships(); step() - self.test_cleanup_empty_families(); step() - self.test_cleanup_duplicate_spouses(); step() - self.test_check_events(); step() - self.test_check_person_references(); step() - self.test_check_family_references(); step() - self.test_check_place_references(); step() - self.test_check_source_references(); step() - self.test_check_citation_references(); step() - self.test_check_media_references(); step() - self.test_check_repo_references(); step() - self.test_check_note_references(); step() + self.test_fix_encoding() + step() + self.test_fix_ctrlchars_in_notes() + step() + self.test_fix_alt_place_names() + step() + self.test_clean_deleted_name_format() + step() + self.test_cleanup_empty_objects() + step() + self.test_chk_for_broke_family_link() + step() + self.test_check_parent_relationships() + step() + self.test_cleanup_empty_families() + step() + self.test_cleanup_duplicate_spouses() + step() + self.test_check_events() + step() + self.test_check_person_references() + step() + self.test_check_family_references() + step() + self.test_check_place_references() + step() + self.test_check_source_references() + step() + self.test_check_citation_references() + step() + self.test_check_media_references() + step() + self.test_check_repo_references() + step() + self.test_check_note_references() + step() def test_low_level(self): with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - o = Note() - o.set("dup 1" + self.rand_text(self.NOTE)) - o.set_format(_choice((Note.FLOWED, Note.FORMATTED))) - o.set_type( self.rand_type(NoteType())) - h = self.db.add_note(o, self.trans) - print("object %s, handle %s, Gramps_Id %s" % (o, o.handle, - o.gramps_id)) + obj = Note() + obj.set("dup 1" + self.rand_text(self.NOTE)) + obj.set_format(_choice((Note.FLOWED, Note.FORMATTED))) + obj.set_type(self.rand_type(NoteType())) + self.db.add_note(obj, self.trans) + print("object %s, handle %s, Gramps_Id %s" % (obj, obj.handle, + obj.gramps_id)) - handle = o.get_handle() + handle = obj.get_handle() - o = Source() - o.set_title("dup 2" + self.rand_text(self.SHORT)) + src = Source() + src.set_title("dup 2" + self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_author( self.rand_text(self.SHORT)) + src.set_author(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_publication_info( self.rand_text(self.LONG)) + src.set_publication_info(self.rand_text(self.LONG)) if _randint(0, 1) == 1: - o.set_abbreviation( self.rand_text(self.SHORT)) + src.set_abbreviation(self.rand_text(self.SHORT)) while _randint(0, 1) == 1: sattr = SrcAttribute() sattr.set_type(self.rand_text(self.SHORT)) sattr.set_value(self.rand_text(self.SHORT)) - o.add_attribute(sattr) - o.set_handle(handle) - self.db.add_source(o, self.trans) - print("object %s, handle %s, Gramps_Id %s" % (o, o.handle, - o.gramps_id)) + src.add_attribute(sattr) + src.set_handle(handle) + self.db.add_source(src, self.trans) + print("object %s, handle %s, Gramps_Id %s" % (src, src.handle, + src.gramps_id)) def test_fix_encoding(self): - # Creates a media object with character encoding errors. This tests - # Check.fix_encoding() and also cleanup_missing_photos + """ Creates a media object with character encoding errors. This tests + Check.fix_encoding() and also cleanup_missing_photos + """ with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - m = Media() - self.fill_object(m) - m.set_description("leave this media object invalid description\x9f") - m.set_path("/tmp/click_on_keep_reference.png\x9f") - m.set_mime_type("image/png\x9f") - self.db.add_media(m, self.trans) + med = Media() + self.fill_object(med) + med.set_description("leave this media object invalid description" + "\x9f") + med.set_path("/tmp/click_on_keep_reference.png\x9f") + med.set_mime_type("image/png\x9f") + self.db.add_media(med, self.trans) - m = Media() - self.fill_object(m) - m.set_description("reselect this media object invalid description\x9f") - m.set_path("/tmp/click_on_select_file.png\x9f") - m.set_mime_type("image/png\x9f") - self.db.add_media(m, self.trans) + med = Media() + self.fill_object(med) + med.set_description("reselect this media object invalid " + "description\x9f") + med.set_path("/tmp/click_on_select_file.png\x9f") + med.set_mime_type("image/png\x9f") + self.db.add_media(med, self.trans) # setup media attached to Source and Citation to be removed - m = Media() - self.fill_object(m) - m.set_description('remove this media object') - m.set_path("/tmp/click_on_remove_object.png") - m.set_mime_type("image/png") - self.db.add_media(m, self.trans) + med = Media() + self.fill_object(med) + med.set_description('remove this media object') + med.set_path("/tmp/click_on_remove_object.png") + med.set_mime_type("image/png") + self.db.add_media(med, self.trans) - s = Source() - s.set_title('media should be removed from this source') - r = MediaRef() - r.set_reference_handle(m.handle) - s.add_media_reference(r) - self.db.add_source( s, self.trans) + src = Source() + src.set_title('media should be removed from this source') + ref = MediaRef() + ref.set_reference_handle(med.handle) + src.add_media_reference(ref) + self.db.add_source(src, self.trans) - c = Citation() - self.fill_object(c) - c.set_reference_handle(s.handle) - c.set_page('media should be removed from this citation') - r = MediaRef() - r.set_reference_handle(m.handle) - c.add_media_reference(r) - self.db.add_citation(c, self.trans) + cit = Citation() + self.fill_object(cit) + cit.set_reference_handle(src.handle) + cit.set_page('media should be removed from this citation') + ref = MediaRef() + ref.set_reference_handle(med.handle) + cit.add_media_reference(ref) + self.db.add_citation(cit, self.trans) def test_fix_ctrlchars_in_notes(self): - # Creates a note with control characters. This tests - # Check.fix_ctrlchars_in_notes() + """ Creates a note with control characters. This tests + Check.fix_ctrlchars_in_notes() + """ with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - o = Note() - o.set("This is a text note with a \x03 control character") - o.set_format(_choice((Note.FLOWED, Note.FORMATTED))) - o.set_type(self.rand_type(NoteType())) - self.db.add_note(o, self.trans) + obj = Note() + obj.set("This is a text note with a \x03 control character") + obj.set_format(_choice((Note.FLOWED, Note.FORMATTED))) + obj.set_type(self.rand_type(NoteType())) + self.db.add_note(obj, self.trans) def test_fix_alt_place_names(self): """ @@ -554,275 +589,281 @@ class TestcaseGenerator(tool.BatchTool): def test_cleanup_missing_photos(self): pass - def test_cleanup_deleted_name_formats(self): + def test_clean_deleted_name_format(self): pass def test_cleanup_empty_objects(self): - # Generate empty objects to test their deletion + """ Generate empty objects to test their deletion """ with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - p = Person() - self.db.add_person( p, self.trans) + pers = Person() + self.db.add_person(pers, self.trans) - f = Family() - self.db.add_family( f, self.trans) + fam = Family() + self.db.add_family(fam, self.trans) - e = Event() - self.db.add_event( e, self.trans) + evt = Event() + self.db.add_event(evt, self.trans) - p = Place() - self.db.add_place( p, self.trans) + place = Place() + self.db.add_place(place, self.trans) - s = Source() - self.db.add_source( s, self.trans) + src = Source() + self.db.add_source(src, self.trans) - c = Citation() - self.db.add_citation( c, self.trans) + cit = Citation() + self.db.add_citation(cit, self.trans) - m = Media() - self.db.add_media( m, self.trans) + med = Media() + self.db.add_media(med, self.trans) - r = Repository() - self.db.add_repository( r, self.trans) + ref = Repository() + self.db.add_repository(ref, self.trans) - n = Note() - self.db.add_note( n, self.trans) + note = Note() + self.db.add_note(note, self.trans) - def test_check_for_broken_family_links(self): + def test_chk_for_broke_family_link(self): + """ Create various family related errors """ # Create a family, that links to father and mother, but father does not # link back with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken1","Family links to this person, but person does not link back") - person2_h = self.generate_person(Person.FEMALE,"Broken1",None) + person1_h = self.generate_person( + Person.MALE, "Broken1", + "Family links to this person, but person does not link back") + person2_h = self.generate_person(Person.FEMALE, "Broken1", None) fam = Family() fam.set_father_handle(person1_h) fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) - fam_h = self.db.add_family(fam,self.trans) - #person1 = self.db.get_person_from_handle(person1_h) - #person1.add_family_handle(fam_h) - #self.db.commit_person(person1,self.trans) + fam.set_relationship((FamilyRelType.MARRIED, '')) + fam_h = self.db.add_family(fam, self.trans) + # person1 = self.db.get_person_from_handle(person1_h) + # person1.add_family_handle(fam_h) + # self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) # Create a family, that misses the link to the father with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken2",None) - person2_h = self.generate_person(Person.FEMALE,"Broken2",None) + person1_h = self.generate_person(Person.MALE, "Broken2", None) + person2_h = self.generate_person(Person.FEMALE, "Broken2", None) fam = Family() - #fam.set_father_handle(person1_h) + # fam.set_father_handle(person1_h) fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) - fam_h = self.db.add_family(fam,self.trans) + fam.set_relationship((FamilyRelType.MARRIED, '')) + fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) + self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) # Create a family, that misses the link to the mother with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken3",None) - person2_h = self.generate_person(Person.FEMALE,"Broken3",None) + person1_h = self.generate_person(Person.MALE, "Broken3", None) + person2_h = self.generate_person(Person.FEMALE, "Broken3", None) fam = Family() fam.set_father_handle(person1_h) - #fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) - fam_h = self.db.add_family(fam,self.trans) + # fam.set_mother_handle(person2_h) + fam.set_relationship((FamilyRelType.MARRIED, '')) + fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) + self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) # Create a family, that links to father and mother, but mother does not # link back with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken4",None) - person2_h = self.generate_person(Person.FEMALE,"Broken4","Family links to this person, but person does not link back") + person1_h = self.generate_person(Person.MALE, "Broken4", None) + person2_h = self.generate_person( + Person.FEMALE, "Broken4", + "Family links to this person, but person does not link back") fam = Family() fam.set_father_handle(person1_h) fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) - fam_h = self.db.add_family(fam,self.trans) + fam.set_relationship((FamilyRelType.MARRIED, '')) + fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) - #person2 = self.db.get_person_from_handle(person2_h) - #person2.add_family_handle(fam_h) - #self.db.commit_person(person2,self.trans) + self.db.commit_person(person1, self.trans) + # person2 = self.db.get_person_from_handle(person2_h) + # person2.add_family_handle(fam_h) + # self.db.commit_person(person2, self.trans) # Create two married people of same sex. # This is NOT detected as an error by plugins/tool/Check.py with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken5",None) - person2_h = self.generate_person(Person.MALE,"Broken5",None) + person1_h = self.generate_person(Person.MALE, "Broken5", None) + person2_h = self.generate_person(Person.MALE, "Broken5", None) fam = Family() fam.set_father_handle(person1_h) fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) - fam_h = self.db.add_family(fam,self.trans) + fam.set_relationship((FamilyRelType.MARRIED, '')) + fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) + self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) # Create a family, that contains an invalid handle to for the father with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - #person1_h = self.generate_person(Person.MALE,"Broken6",None) - person2_h = self.generate_person(Person.FEMALE,"Broken6",None) + # person1_h = self.generate_person(Person.MALE, "Broken6", None) + person2_h = self.generate_person(Person.FEMALE, "Broken6", None) fam = Family() fam.set_father_handle("InvalidHandle1") fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) - fam_h = self.db.add_family(fam,self.trans) - #person1 = self.db.get_person_from_handle(person1_h) - #person1.add_family_handle(fam_h) - #self.db.commit_person(person1,self.trans) + fam.set_relationship((FamilyRelType.MARRIED, '')) + fam_h = self.db.add_family(fam, self.trans) + # person1 = self.db.get_person_from_handle(person1_h) + # person1.add_family_handle(fam_h) + # self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) # Create a family, that contains an invalid handle to for the mother with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken7",None) - #person2_h = self.generate_person(Person.FEMALE,"Broken7",None) + person1_h = self.generate_person(Person.MALE, "Broken7", None) + # person2_h = self.generate_person(Person.FEMALE, "Broken7", None) fam = Family() fam.set_father_handle(person1_h) fam.set_mother_handle("InvalidHandle2") - fam.set_relationship((FamilyRelType.MARRIED,'')) - fam_h = self.db.add_family(fam,self.trans) + fam.set_relationship((FamilyRelType.MARRIED, '')) + fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) - #person2 = self.db.get_person_from_handle(person2_h) - #person2.add_family_handle(fam_h) - #self.db.commit_person(person2,self.trans) + self.db.commit_person(person1, self.trans) + # person2 = self.db.get_person_from_handle(person2_h) + # person2.add_family_handle(fam_h) + # self.db.commit_person(person2, self.trans) # Creates a family where the child does not link back to the family with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken8",None) - person2_h = self.generate_person(Person.FEMALE,"Broken8",None) - child_h = self.generate_person(None,"Broken8",None) + person1_h = self.generate_person(Person.MALE, "Broken8", None) + person2_h = self.generate_person(Person.FEMALE, "Broken8", None) + child_h = self.generate_person(None, "Broken8", None) fam = Family() fam.set_father_handle(person1_h) fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) + fam.set_relationship((FamilyRelType.MARRIED, '')) child_ref = ChildRef() child_ref.set_reference_handle(child_h) self.fill_object(child_ref) fam.add_child_ref(child_ref) - fam_h = self.db.add_family(fam,self.trans) + fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) + self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) - #child = self.db.get_person_from_handle(child_h) - #person2.add_parent_family_handle(fam_h) - #self.db.commit_person(child,self.trans) + self.db.commit_person(person2, self.trans) + # child = self.db.get_person_from_handle(child_h) + # person2.add_parent_family_handle(fam_h) + # self.db.commit_person(child, self.trans) - # Creates a family where the child is not linked, but the child links to the family + # Creates a family where the child is not linked, but the child links + # to the family with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken9",None) - person2_h = self.generate_person(Person.FEMALE,"Broken9",None) - child_h = self.generate_person(None,"Broken9",None) + person1_h = self.generate_person(Person.MALE, "Broken9", None) + person2_h = self.generate_person(Person.FEMALE, "Broken9", None) + child_h = self.generate_person(None, "Broken9", None) fam = Family() fam.set_father_handle(person1_h) fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) + fam.set_relationship((FamilyRelType.MARRIED, '')) # child_ref = ChildRef() # child_ref.set_reference_handle(child_h) # self.fill_object(child_ref) # fam.add_child_ref(child_ref) - fam_h = self.db.add_family(fam,self.trans) + fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) + self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) child = self.db.get_person_from_handle(child_h) child.add_parent_family_handle(fam_h) - self.db.commit_person(child,self.trans) + self.db.commit_person(child, self.trans) # Creates a family where the child is one of the parents with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken19",None) - person2_h = self.generate_person(Person.FEMALE,"Broken19",None) + person1_h = self.generate_person(Person.MALE, "Broken19", None) + person2_h = self.generate_person(Person.FEMALE, "Broken19", None) child_h = person2_h fam = Family() fam.set_father_handle(person1_h) fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) + fam.set_relationship((FamilyRelType.MARRIED, '')) child_ref = ChildRef() child_ref.set_reference_handle(child_h) self.fill_object(child_ref) fam.add_child_ref(child_ref) - fam_h = self.db.add_family(fam,self.trans) + fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) + self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) child = self.db.get_person_from_handle(child_h) child.add_parent_family_handle(fam_h) - self.db.commit_person(child,self.trans) + self.db.commit_person(child, self.trans) # Creates a couple that refer to a family that does not exist in the # database. with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person1_h = self.generate_person(Person.MALE,"Broken20",None) - person2_h = self.generate_person(Person.FEMALE,"Broken20",None) + person1_h = self.generate_person(Person.MALE, "Broken20", None) + person2_h = self.generate_person(Person.FEMALE, "Broken20", None) # fam = Family() # fam.set_father_handle(person1_h) # fam.set_mother_handle(person2_h) -# fam.set_relationship((FamilyRelType.MARRIED,'')) +# fam.set_relationship((FamilyRelType.MARRIED, '')) # child_ref = ChildRef() # # child_ref.set_reference_handle(child_h) # # self.fill_object(child_ref) # # fam.add_child_ref(child_ref) -# fam_h = self.db.add_family(fam,self.trans) +# fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle("InvalidHandle3") - self.db.commit_person(person1,self.trans) + self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle("InvalidHandle3") - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) # child = self.db.get_person_from_handle(child_h) # child.add_parent_family_handle(fam_h) -# self.db.commit_person(child,self.trans) +# self.db.commit_person(child, self.trans) def test_check_parent_relationships(self): pass @@ -834,87 +875,88 @@ class TestcaseGenerator(tool.BatchTool): pass def test_check_events(self): + """ Various event related tests """ # Creates a person having a non existing birth event handle set with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person_h = self.generate_person(None,"Broken11",None) + person_h = self.generate_person(None, "Broken11", None) person = self.db.get_person_from_handle(person_h) event_ref = EventRef() event_ref.set_reference_handle("InvalidHandle4") person.set_birth_ref(event_ref) - self.db.commit_person(person,self.trans) + self.db.commit_person(person, self.trans) # Creates a person having a non existing death event handle set with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person_h = self.generate_person(None,"Broken12",None) + person_h = self.generate_person(None, "Broken12", None) person = self.db.get_person_from_handle(person_h) event_ref = EventRef() event_ref.set_reference_handle("InvalidHandle5") person.set_death_ref(event_ref) - self.db.commit_person(person,self.trans) + self.db.commit_person(person, self.trans) # Creates a person having a non existing event handle set with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person_h = self.generate_person(None,"Broken13",None) + person_h = self.generate_person(None, "Broken13", None) person = self.db.get_person_from_handle(person_h) event_ref = EventRef() event_ref.set_reference_handle("InvalidHandle6") person.add_event_ref(event_ref) - self.db.commit_person(person,self.trans) + self.db.commit_person(person, self.trans) # Creates a person with a birth event having an empty type with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person_h = self.generate_person(None,"Broken14",None) + person_h = self.generate_person(None, "Broken14", None) event = Event() # The default type _DEFAULT = BIRTH is set in eventtype event.set_type('') event.set_description("Test for Broken14") - event_h = self.db.add_event(event,self.trans) + event_h = self.db.add_event(event, self.trans) event_ref = EventRef() event_ref.set_reference_handle(event_h) person = self.db.get_person_from_handle(person_h) person.set_birth_ref(event_ref) - self.db.commit_person(person,self.trans) + self.db.commit_person(person, self.trans) # Creates a person with a death event having an empty type with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person_h = self.generate_person(None,"Broken15",None) + person_h = self.generate_person(None, "Broken15", None) event = Event() # The default type _DEFAULT = BIRTH is set in eventtype event.set_type('') event.set_description("Test for Broken15") - event_h = self.db.add_event(event,self.trans) + event_h = self.db.add_event(event, self.trans) event_ref = EventRef() event_ref.set_reference_handle(event_h) person = self.db.get_person_from_handle(person_h) person.set_death_ref(event_ref) - self.db.commit_person(person,self.trans) + self.db.commit_person(person, self.trans) # Creates a person with an event having an empty type # This is NOT detected as an error by plugins/tool/Check.py with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person_h = self.generate_person(None,"Broken16",None) + person_h = self.generate_person(None, "Broken16", None) event = Event() # The default type _DEFAULT = BIRTH is set in eventtype event.set_type('') event.set_description("Test for Broken16") - event_h = self.db.add_event(event,self.trans) + event_h = self.db.add_event(event, self.trans) event_ref = EventRef() event_ref.set_reference_handle(event_h) person = self.db.get_person_from_handle(person_h) person.add_event_ref(event_ref) - self.db.commit_person(person,self.trans) + self.db.commit_person(person, self.trans) def test_check_person_references(self): pass @@ -923,73 +965,74 @@ class TestcaseGenerator(tool.BatchTool): pass def test_check_place_references(self): + """ Tests various place reference errors """ # Creates a person with a birth event pointing to nonexisting place with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person_h = self.generate_person(None,"Broken17",None) + person_h = self.generate_person(None, "Broken17", None) event = Event() event.set_type(EventType.BIRTH) event.set_place_handle("InvalidHandle7") event.set_description("Test for Broken17") - event_h = self.db.add_event(event,self.trans) + event_h = self.db.add_event(event, self.trans) event_ref = EventRef() event_ref.set_reference_handle(event_h) person = self.db.get_person_from_handle(person_h) person.set_birth_ref(event_ref) - self.db.commit_person(person,self.trans) + self.db.commit_person(person, self.trans) # Creates a person with an event pointing to nonexisting place with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - person_h = self.generate_person(None,"Broken18",None) + person_h = self.generate_person(None, "Broken18", None) event = Event() event.set_type(EventType.BIRTH) event.set_place_handle("InvalidHandle8") event.set_description("Test for Broken18") - event_h = self.db.add_event(event,self.trans) + event_h = self.db.add_event(event, self.trans) event_ref = EventRef() event_ref.set_reference_handle(event_h) person = self.db.get_person_from_handle(person_h) person.add_event_ref(event_ref) - self.db.commit_person(person,self.trans) + self.db.commit_person(person, self.trans) def test_check_source_references(self): - + """ Tests various source reference errors """ with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - c = Citation() - self.fill_object(c) - c.set_reference_handle("unknownsourcehandle") - c.set_page('unreferenced citation with invalid source ref') - self.db.add_citation(c, self.trans) + cit = Citation() + self.fill_object(cit) + cit.set_reference_handle("unknownsourcehandle") + cit.set_page('unreferenced citation with invalid source ref') + self.db.add_citation(cit, self.trans) - c = Citation() - self.fill_object(c) - c.set_reference_handle(None) - c.set_page('unreferenced citation with invalid source ref') - self.db.add_citation(c, self.trans) + cit = Citation() + self.fill_object(cit) + cit.set_reference_handle(None) + cit.set_page('unreferenced citation with invalid source ref') + self.db.add_citation(cit, self.trans) - c = Citation() - self.fill_object(c) - c.set_reference_handle("unknownsourcehandle") - c.set_page('citation and references to it should be removed') - c_h1 = self.db.add_citation(c, self.trans) + cit = Citation() + self.fill_object(cit) + cit.set_reference_handle("unknownsourcehandle") + cit.set_page('citation and references to it should be removed') + c_h1 = self.db.add_citation(cit, self.trans) - c = Citation() - self.fill_object(c) - c.set_reference_handle(None) - c.set_page('citation and references to it should be removed') - c_h2 = self.db.add_citation(c, self.trans) + cit = Citation() + self.fill_object(cit) + cit.set_reference_handle(None) + cit.set_page('citation and references to it should be removed') + c_h2 = self.db.add_citation(cit, self.trans) self.create_all_possible_citations([c_h1, c_h2], "Broken21", 'non-existent source') def test_check_citation_references(self): - # Generate objects that refer to non-existant citations + """ Generate objects that refer to non-existant citations """ with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 @@ -999,65 +1042,66 @@ class TestcaseGenerator(tool.BatchTool): 'non-existent citation') def create_all_possible_citations(self, c_h_list, name, message): - # Create citations attached to each of the following objects: - # Person - # Name - # Address - # Attribute - # PersonRef - # MediaRef - # Attribute - # LdsOrd - # - # Family - # Attribute - # ChildRef - # MediaRef - # Attribute - # LdsOrd - # - # Event - # Attribute - # MediaRef - # Attribute - # - # Media - # Attribute - # - # Place - # MediaRef - # Attribute - # - # Repository (Repositories themselves do not have SourceRefs) - # Address - m = Media() - m.set_description(message) - m.set_path(os.path.abspath(str(ICON))) - m.set_mime_type(get_type(m.get_path())) - m.add_citation(_choice(c_h_list)) - # Media : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(message) - a.add_citation(_choice(c_h_list)) - m.add_attribute(a) - self.db.add_media(m, self.trans) + """ Create citations attached to each of the following objects: + Person + Name + Address + Attribute + PersonRef + MediaRef + Attribute + LdsOrd - person1_h = self.generate_person(Person.MALE,name,None) - person2_h = self.generate_person(Person.FEMALE,name,None) - child_h = self.generate_person(None,name,None) + Family + Attribute + ChildRef + MediaRef + Attribute + LdsOrd + + Event + Attribute + MediaRef + Attribute + + Media + Attribute + + Place + MediaRef + Attribute + + Repository (Repositories themselves do not have SourceRefs) + Address + """ + med = Media() + med.set_description(message) + med.set_path(os.path.abspath(str(ICON))) + med.set_mime_type(get_type(med.get_path())) + med.add_citation(_choice(c_h_list)) + # Media : Attribute + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(message) + att.add_citation(_choice(c_h_list)) + med.add_attribute(att) + self.db.add_media(med, self.trans) + + person1_h = self.generate_person(Person.MALE, name, None) + person2_h = self.generate_person(Person.FEMALE, name, None) + child_h = self.generate_person(None, name, None) fam = Family() fam.set_father_handle(person1_h) fam.set_mother_handle(person2_h) - fam.set_relationship((FamilyRelType.MARRIED,'')) + fam.set_relationship((FamilyRelType.MARRIED, '')) # Family fam.add_citation(_choice(c_h_list)) # Family : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(message) - a.add_citation(_choice(c_h_list)) - fam.add_attribute(a) + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(message) + att.add_citation(_choice(c_h_list)) + fam.add_attribute(att) # Family : ChildRef child_ref = ChildRef() child_ref.set_reference_handle(child_h) @@ -1065,44 +1109,45 @@ class TestcaseGenerator(tool.BatchTool): child_ref.add_citation(_choice(c_h_list)) fam.add_child_ref(child_ref) # Family : MediaRef - mr = MediaRef() - mr.set_reference_handle(m.handle) - mr.add_citation(_choice(c_h_list)) + mref = MediaRef() + mref.set_reference_handle(med.handle) + mref.add_citation(_choice(c_h_list)) # Family : MediaRef : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(message) - a.add_citation(_choice(c_h_list)) - mr.add_attribute(a) - fam.add_media_reference(mr) + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(message) + att.add_citation(_choice(c_h_list)) + mref.add_attribute(att) + fam.add_media_reference(mref) # Family : LDSORD ldsord = LdsOrd() - self.fill_object( ldsord) + self.fill_object(ldsord) # TODO: adapt type and status to family/person - #if isinstance(o,Person): - #if isinstance(o,Family): + # if isinstance(obj, Person): + # if isinstance(obj, Family): + # pylint: disable=protected-access ldsord.set_type(_choice([item[0] for item in LdsOrd._TYPE_MAP])) - ldsord.set_status(_randint(0, len(LdsOrd._STATUS_MAP)-1)) + ldsord.set_status(_randint(0, len(LdsOrd._STATUS_MAP) - 1)) ldsord.add_citation(_choice(c_h_list)) fam.add_lds_ord(ldsord) # Family : EventRef - e = Event() - e.set_type(EventType.MARRIAGE) - (year, d) = self.rand_date() - e.set_date_object(d) - e.set_description(message) - event_h = self.db.add_event(e, self.trans) - er = EventRef() - er.set_reference_handle(event_h) - er.set_role(self.rand_type(EventRoleType())) + evt = Event() + evt.set_type(EventType.MARRIAGE) + (dummy, date) = self.rand_date() + evt.set_date_object(date) + evt.set_description(message) + event_h = self.db.add_event(evt, self.trans) + eref = EventRef() + eref.set_reference_handle(event_h) + eref.set_role(self.rand_type(EventRoleType())) # Family : EventRef : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(message) - a.add_citation(_choice(c_h_list)) - er.add_attribute(a) - fam.add_event_ref(er) - fam_h = self.db.add_family(fam,self.trans) + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(message) + att.add_citation(_choice(c_h_list)) + eref.add_attribute(att) + fam.add_event_ref(eref) + fam_h = self.db.add_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) # Person @@ -1113,16 +1158,16 @@ class TestcaseGenerator(tool.BatchTool): alt_name.add_citation(_choice(c_h_list)) person1.add_alternate_name(alt_name) # Person : Address - a = Address() - a.set_street(message) - a.add_citation(_choice(c_h_list)) - person1.add_address(a) + add = Address() + add.set_street(message) + add.add_citation(_choice(c_h_list)) + person1.add_address(add) # Person : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(message) - a.add_citation(_choice(c_h_list)) - person1.add_attribute(a) + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(message) + att.add_citation(_choice(c_h_list)) + person1.add_attribute(att) # Person : PersonRef asso_h = self.generate_person() asso = PersonRef() @@ -1132,98 +1177,98 @@ class TestcaseGenerator(tool.BatchTool): asso.add_citation(_choice(c_h_list)) person1.add_person_ref(asso) # Person : MediaRef - mr = MediaRef() - mr.set_reference_handle(m.handle) - mr.add_citation(_choice(c_h_list)) + mref = MediaRef() + mref.set_reference_handle(med.handle) + mref.add_citation(_choice(c_h_list)) # Person : MediaRef : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(self.rand_text(self.SHORT)) - a.add_citation(_choice(c_h_list)) - mr.add_attribute(a) - person1.add_media_reference(mr) + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(self.rand_text(self.SHORT)) + att.add_citation(_choice(c_h_list)) + mref.add_attribute(att) + person1.add_media_reference(mref) # Person : LDSORD ldsord = LdsOrd() - self.fill_object( ldsord) + self.fill_object(ldsord) # TODO: adapt type and status to family/person - #if isinstance(o,Person): - #if isinstance(o,Family): + # if isinstance(obj, Person): + # if isinstance(obj, Family): ldsord.set_type(_choice( - [item[0] for item in LdsOrd._TYPE_MAP] )) - ldsord.set_status(_randint(0, len(LdsOrd._STATUS_MAP)-1)) + [item[0] for item in LdsOrd._TYPE_MAP])) + ldsord.set_status(_randint(0, len(LdsOrd._STATUS_MAP) - 1)) ldsord.add_citation(_choice(c_h_list)) person1.add_lds_ord(ldsord) # Person : EventRef - e = Event() - e.set_type(EventType.ELECTED) - (year, d) = self.rand_date() - e.set_date_object(d) - e.set_description(message) - event_h = self.db.add_event(e, self.trans) - er = EventRef() - er.set_reference_handle(event_h) - er.set_role(self.rand_type(EventRoleType())) + evt = Event() + evt.set_type(EventType.ELECTED) + (dummy, dat) = self.rand_date() + evt.set_date_object(dat) + evt.set_description(message) + event_h = self.db.add_event(evt, self.trans) + eref = EventRef() + eref.set_reference_handle(event_h) + eref.set_role(self.rand_type(EventRoleType())) # Person : EventRef : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(message) - a.add_citation(_choice(c_h_list)) - er.add_attribute(a) - person1.add_event_ref(er) - self.db.commit_person(person1,self.trans) + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(message) + att.add_citation(_choice(c_h_list)) + eref.add_attribute(att) + person1.add_event_ref(eref) + self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) - e = Event() - e.set_description(message) - e.set_type(EventType.MARRIAGE) + evt = Event() + evt.set_description(message) + evt.set_type(EventType.MARRIAGE) # Event - e.add_citation(_choice(c_h_list)) + evt.add_citation(_choice(c_h_list)) # Event : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(message) - a.add_citation(_choice(c_h_list)) - e.add_attribute(a) + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(message) + att.add_citation(_choice(c_h_list)) + evt.add_attribute(att) # Event : MediaRef - mr = MediaRef() - mr.set_reference_handle(m.handle) - mr.add_citation(_choice(c_h_list)) + mref = MediaRef() + mref.set_reference_handle(med.handle) + mref.add_citation(_choice(c_h_list)) # Event : MediaRef : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(self.rand_text(self.SHORT)) - a.add_citation(_choice(c_h_list)) - mr.add_attribute(a) - e.add_media_reference(mr) - self.db.add_event(e, self.trans) + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(self.rand_text(self.SHORT)) + att.add_citation(_choice(c_h_list)) + mref.add_attribute(att) + evt.add_media_reference(mref) + self.db.add_event(evt, self.trans) - p = Place() - p.set_title(message) - p.add_citation(_choice(c_h_list)) + place = Place() + place.set_title(message) + place.add_citation(_choice(c_h_list)) # Place : MediaRef - mr = MediaRef() - mr.set_reference_handle(m.handle) - mr.add_citation(_choice(c_h_list)) + mref = MediaRef() + mref.set_reference_handle(med.handle) + mref.add_citation(_choice(c_h_list)) # Place : MediaRef : Attribute - a = Attribute() - a.set_type(self.rand_type(AttributeType())) - a.set_value(self.rand_text(self.SHORT)) - a.add_citation(_choice(c_h_list)) - mr.add_attribute(a) - p.add_media_reference(mr) - self.db.add_place(p, self.trans) + att = Attribute() + att.set_type(self.rand_type(AttributeType())) + att.set_value(self.rand_text(self.SHORT)) + att.add_citation(_choice(c_h_list)) + mref.add_attribute(att) + place.add_media_reference(mref) + self.db.add_place(place, self.trans) - r = Repository() - r.set_name(message) - r.set_type(RepositoryType.LIBRARY) + ref = Repository() + ref.set_name(message) + ref.set_type(RepositoryType.LIBRARY) # Repository : Address - a = Address() - a.set_street(message) - a.add_citation(_choice(c_h_list)) - r.add_address(a) - self.db.add_repository(r, self.trans) + add = Address() + add.set_street(message) + add.add_citation(_choice(c_h_list)) + ref.add_address(add) + self.db.add_repository(ref, self.trans) def test_check_media_references(self): pass @@ -1234,39 +1279,41 @@ class TestcaseGenerator(tool.BatchTool): def test_check_note_references(self): pass - - def generate_person(self,gender=None,lastname=None, note=None, alive_in_year=None): + def generate_person(self, gender=None, lastname=None, note=None, + alive_in_year=None): + """ This generates a person with lots of attachments """ if not self.cli: if self.person_count % 10 == 0: while Gtk.events_pending(): Gtk.main_iteration() - np = Person() - self.fill_object(np) + pers = Person() + self.fill_object(pers) # Gender if gender is None: gender = _randint(0, 1) if _randint(0, 10) == 1: # Set some persons to unknown gender - np.set_gender(Person.UNKNOWN) + pers.set_gender(Person.UNKNOWN) else: - np.set_gender(gender) + pers.set_gender(gender) # Name name = Name() - (firstname,lastname) = self.rand_name(lastname, gender) + (firstname, lastname) = self.rand_name(lastname, gender) name.set_first_name(firstname) surname = Surname() surname.set_surname(lastname) name.add_surname(surname) - self.fill_object( name) - np.set_primary_name(name) + self.fill_object(name) + pers.set_primary_name(name) # generate some slightly different alternate name - firstname2 = firstname.replace("m", "n").replace("l", "i").replace("b", "d") + firstname2 = \ + firstname.replace("m", "n").replace("l", "i").replace("b", "d") if firstname2 != firstname: alt_name = Name(name) - self.fill_object( alt_name) + self.fill_object(alt_name) if _randint(0, 2) == 1: surname = Surname() surname.set_surname(self.rand_text(self.LASTNAME)) @@ -1276,135 +1323,145 @@ class TestcaseGenerator(tool.BatchTool): surname.set_surname(lastname) alt_name.add_surname(surname) if _randint(0, 1) == 1: - alt_name.set_first_name( firstname2) + alt_name.set_first_name(firstname2) if _randint(0, 1) == 1: - alt_name.set_title( self.rand_text(self.SHORT)) - if _randint(0, 1) == 1: - patronymic = Surname() - patronymic.set_surname( self.rand_text(self.FIRSTNAME_MALE)) - patronymic.set_origintype(NameOriginType.PATRONYMIC) - alt_name.add_surname(patronymic) - if _randint(0, 1) == 1: - alt_name.get_primary_surname().set_prefix( self.rand_text(self.SHORT)) - if _randint(0, 1) == 1: - alt_name.set_suffix( self.rand_text(self.SHORT)) - if _randint(0, 1) == 1: - alt_name.set_call_name( self.rand_text(self.FIRSTNAME)) - np.add_alternate_name( alt_name) - firstname2 = firstname.replace("a", "e").replace("o", "u").replace("r", "p") - if firstname2 != firstname: - alt_name = Name(name) - self.fill_object( alt_name) - if _randint(0, 2) == 1: - surname = Surname() - surname.set_surname(self.rand_text(self.LASTNAME)) - alt_name.add_surname(surname) - elif _randint(0, 2) == 1: - surname = Surname() - surname.set_surname(lastname) - alt_name.add_surname(surname) - if _randint(0, 1) == 1: - alt_name.set_first_name( firstname2) - if _randint(0, 1) == 1: - alt_name.set_title( self.rand_text(self.SHORT)) + alt_name.set_title(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: patronymic = Surname() patronymic.set_surname(self.rand_text(self.FIRSTNAME_MALE)) patronymic.set_origintype(NameOriginType.PATRONYMIC) alt_name.add_surname(patronymic) if _randint(0, 1) == 1: - alt_name.get_primary_surname().set_prefix( self.rand_text(self.SHORT)) + alt_name.get_primary_surname().set_prefix( + self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - alt_name.set_suffix( self.rand_text(self.SHORT)) + alt_name.set_suffix(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - alt_name.set_call_name( self.rand_text(self.FIRSTNAME)) - np.add_alternate_name( alt_name) + alt_name.set_call_name(self.rand_text(self.FIRSTNAME)) + pers.add_alternate_name(alt_name) + firstname2 = \ + firstname.replace("a", "e").replace("o", "u").replace("r", "p") + if firstname2 != firstname: + alt_name = Name(name) + self.fill_object(alt_name) + if _randint(0, 2) == 1: + surname = Surname() + surname.set_surname(self.rand_text(self.LASTNAME)) + alt_name.add_surname(surname) + elif _randint(0, 2) == 1: + surname = Surname() + surname.set_surname(lastname) + alt_name.add_surname(surname) + if _randint(0, 1) == 1: + alt_name.set_first_name(firstname2) + if _randint(0, 1) == 1: + alt_name.set_title(self.rand_text(self.SHORT)) + if _randint(0, 1) == 1: + patronymic = Surname() + patronymic.set_surname(self.rand_text(self.FIRSTNAME_MALE)) + patronymic.set_origintype(NameOriginType.PATRONYMIC) + alt_name.add_surname(patronymic) + if _randint(0, 1) == 1: + alt_name.get_primary_surname().set_prefix( + self.rand_text(self.SHORT)) + if _randint(0, 1) == 1: + alt_name.set_suffix(self.rand_text(self.SHORT)) + if _randint(0, 1) == 1: + alt_name.set_call_name(self.rand_text(self.FIRSTNAME)) + pers.add_alternate_name(alt_name) if not alive_in_year: alive_in_year = _randint(1700, 2000) - by = alive_in_year - _randint(0, 60) - dy = alive_in_year + _randint(0, 60) + b_y = alive_in_year - _randint(0, 60) + d_y = alive_in_year + _randint(0, 60) # birth if _randint(0, 1) == 1: - (birth_year, eref) = self.rand_personal_event( EventType.BIRTH, by,by) - np.set_birth_ref(eref) + (dummy, eref) = self.rand_personal_event(EventType.BIRTH, b_y, b_y) + pers.set_birth_ref(eref) # baptism if _randint(0, 1) == 1: - (bapt_year, eref) = self.rand_personal_event( - _choice((EventType.BAPTISM, EventType.CHRISTEN)), by, by+2) - np.add_event_ref(eref) + (dummy, eref) = self.rand_personal_event( + _choice((EventType.BAPTISM, EventType.CHRISTEN)), b_y, b_y + 2) + pers.add_event_ref(eref) # death - death_year = None if _randint(0, 1) == 1: - (death_year, eref) = self.rand_personal_event( EventType.DEATH, dy,dy) - np.set_death_ref(eref) + (dummy, eref) = self.rand_personal_event(EventType.DEATH, d_y, d_y) + pers.set_death_ref(eref) # burial if _randint(0, 1) == 1: - (bur_year, eref) = self.rand_personal_event( - _choice((EventType.BURIAL, EventType.CREMATION)), dy, dy+2) - np.add_event_ref(eref) + (dummy, eref) = self.rand_personal_event( + _choice((EventType.BURIAL, EventType.CREMATION)), d_y, d_y + 2) + pers.add_event_ref(eref) # some other events while _randint(0, 5) == 1: - (birth_year, eref) = self.rand_personal_event( None, by,dy) - np.add_event_ref(eref) + (dummy, eref) = self.rand_personal_event(None, b_y, d_y) + pers.add_event_ref(eref) # some shared events if self.generated_events: while _randint(0, 5) == 1: e_h = _choice(self.generated_events) eref = EventRef() - self.fill_object( eref) + self.fill_object(eref) eref.set_reference_handle(e_h) - np.add_event_ref(eref) + pers.add_event_ref(eref) # PersonRef if _randint(0, 3) == 1: - for i in range(0, _randint(1, 2)): - if self.person_count > self.options.handler.options_dict['person_count']: + for dummy in range(0, _randint(1, 2)): + if self.person_count > self.max_person_count: break if alive_in_year: - asso_h = self.generate_person(None, None, alive_in_year = alive_in_year) + asso_h = self.generate_person(None, None, + alive_in_year=alive_in_year) else: asso_h = self.generate_person() asso = PersonRef() asso.set_reference_handle(asso_h) asso.set_relation(self.rand_text(self.SHORT)) self.fill_object(asso) - np.add_person_ref(asso) + pers.add_person_ref(asso) if _randint(0, 2) == 0: self.persons_todo.append(asso_h) - person_handle = self.db.add_person(np,self.trans) + # Note + if note: + pass # Add later? - self.person_count = self.person_count+1 + person_handle = self.db.add_person(pers, self.trans) + + self.person_count = self.person_count + 1 self.progress_step() if self.person_count % 10 == 1: print("person count", self.person_count) - self.person_dates[person_handle] = (by,dy) + self.person_dates[person_handle] = (b_y, d_y) - return( person_handle) + return person_handle - def generate_family(self,person1_h): + def generate_family(self, person1_h): + """ Make up a family """ person1 = self.db.get_person_from_handle(person1_h) if not person1: return alive_in_year = None if person1_h in self.person_dates: (born, died) = self.person_dates[person1_h] - alive_in_year = min(born+_randint(10, 50), died+_randint(-10, 10)) + alive_in_year = min(born + _randint(10, 50), + died + _randint(-10, 10)) if person1.get_gender() == 1: if _randint(0, 7) == 1: person2_h = None else: if alive_in_year: - person2_h = self.generate_person(0, alive_in_year = alive_in_year) + person2_h = \ + self.generate_person(0, alive_in_year=alive_in_year) else: person2_h = self.generate_person(0) else: @@ -1413,7 +1470,8 @@ class TestcaseGenerator(tool.BatchTool): person1_h = None else: if alive_in_year: - person1_h = self.generate_person(1, alive_in_year = alive_in_year) + person1_h = \ + self.generate_person(1, alive_in_year=alive_in_year) else: person1_h = self.generate_person(1) @@ -1437,13 +1495,13 @@ class TestcaseGenerator(tool.BatchTool): # Generate at least one family event with a probability of 75% if _randint(0, 3) > 0: - (birth_year, eref) = self.rand_family_event(None) + (dummy, eref) = self.rand_family_event(None) fam.add_event_ref(eref) event_set.add(eref.get_reference_handle()) # generate some more events with a lower probability while _randint(0, 3) == 1: - (birth_year, eref) = self.rand_family_event(None) + (dummy, eref) = self.rand_family_event(None) if eref.get_reference_handle() in event_set: continue fam.add_event_ref(eref) @@ -1459,64 +1517,68 @@ class TestcaseGenerator(tool.BatchTool): if e_h in event_set: break eref = EventRef() - self.fill_object( eref) + self.fill_object(eref) eref.set_reference_handle(e_h) fam.add_event_ref(eref) event_set.add(e_h) - fam_h = self.db.add_family(fam,self.trans) + fam_h = self.db.add_family(fam, self.trans) self.generated_families.append(fam_h) - fam = self.db.commit_family(fam,self.trans) + fam = self.db.commit_family(fam, self.trans) if person1_h: person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) + self.db.commit_person(person1, self.trans) if person2_h: person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) lastname = person1.get_primary_name().get_surname() for i in range(0, _randint(1, 10)): - if self.person_count > self.options.handler.options_dict['person_count']: + if self.person_count > self.max_person_count: break if alive_in_year: - child_h = self.generate_person(None, lastname, - alive_in_year=alive_in_year + _randint(16+2*i, 30+2*i)) + child_h = self.generate_person( + None, lastname, + alive_in_year=alive_in_year + + _randint(16 + 2 * i, 30 + 2 * i)) else: child_h = self.generate_person(None, lastname) - (born,died) = self.person_dates[child_h] + (born, died) = self.person_dates[child_h] alive_in_year = born fam = self.db.get_family_from_handle(fam_h) child_ref = ChildRef() child_ref.set_reference_handle(child_h) self.fill_object(child_ref) fam.add_child_ref(child_ref) - self.db.commit_family(fam,self.trans) + self.db.commit_family(fam, self.trans) child = self.db.get_person_from_handle(child_h) child.add_parent_family_handle(fam_h) - self.db.commit_person(child,self.trans) + self.db.commit_person(child, self.trans) if _randint(0, 3) > 0: self.persons_todo.append(child_h) - def generate_parents(self,child_h): + def generate_parents(self, child_h): + """ Add parents to a person, if not present already""" if not child_h: return child = self.db.get_person_from_handle(child_h) if not child: - print("ERROR: Person handle %s does not exist in database" % child_h) + print("ERROR: Person handle %s does not exist in database" % + child_h) return if child.get_parent_family_handle_list(): return lastname = child.get_primary_name().get_surname() if child_h in self.person_dates: - (born,died) = self.person_dates[child_h] - person1_h = self.generate_person(1,lastname, alive_in_year=born) + (born, dummy) = self.person_dates[child_h] + person1_h = self.generate_person(1, lastname, alive_in_year=born) person2_h = self.generate_person(0, alive_in_year=born) else: - person1_h = self.generate_person(1,lastname) + person1_h = self.generate_person(1, lastname) person2_h = self.generate_person(0) if _randint(0, 2) > 1: @@ -1535,23 +1597,24 @@ class TestcaseGenerator(tool.BatchTool): child_ref.set_reference_handle(child_h) self.fill_object(child_ref) fam.add_child_ref(child_ref) - fam_h = self.db.add_family(fam,self.trans) + fam_h = self.db.add_family(fam, self.trans) self.generated_families.append(fam_h) - fam = self.db.commit_family(fam,self.trans) + fam = self.db.commit_family(fam, self.trans) person1 = self.db.get_person_from_handle(person1_h) person1.add_family_handle(fam_h) - self.db.commit_person(person1,self.trans) + self.db.commit_person(person1, self.trans) person2 = self.db.get_person_from_handle(person2_h) person2.add_family_handle(fam_h) - self.db.commit_person(person2,self.trans) + self.db.commit_person(person2, self.trans) child.add_parent_family_handle(fam_h) - self.db.commit_person(child,self.trans) + self.db.commit_person(child, self.trans) def generate_tags(self): + """ Make up some odd tags """ with DbTxn(_("Testcase generator step %d") % self.transaction_count, self.db) as self.trans: self.transaction_count += 1 - for counter in range(10): + for dummy in range(10): tag = Tag() tag.set_name(self.rand_text(self.TAG)) tag.set_color(self.rand_color()) @@ -1559,21 +1622,22 @@ class TestcaseGenerator(tool.BatchTool): tag_handle = self.db.add_tag(tag, self.trans) self.generated_tags.append(tag_handle) - def add_defaults(self, object): - self.fill_object( object) + def add_defaults(self, obj): + self.fill_object(obj) - def rand_name( self, lastname=None, gender=None): + def rand_name(self, lastname=None, gender=None): + """ Create a name pair (first, last)""" if gender == Person.MALE: - firstname = self.rand_text( self.FIRSTNAME_MALE) + firstname = self.rand_text(self.FIRSTNAME_MALE) elif gender == Person.FEMALE: - firstname = self.rand_text( self.FIRSTNAME_FEMALE) + firstname = self.rand_text(self.FIRSTNAME_FEMALE) else: - firstname = self.rand_text( self.FIRSTNAME) + firstname = self.rand_text(self.FIRSTNAME) if not lastname: - lastname = self.rand_text( self.LASTNAME) - return (firstname,lastname) + lastname = self.rand_text(self.LASTNAME) + return (firstname, lastname) - def rand_date( self, start=None, end=None): + def rand_date(self, start=None, end=None): """ Generates a random date object between the given years start and end """ @@ -1602,12 +1666,12 @@ class TestcaseGenerator(tool.BatchTool): Date.QUAL_CALCULATED)) modifier = _choice((Date.MOD_NONE, Date.MOD_BEFORE, - Date.MOD_AFTER,\ + Date.MOD_AFTER, Date.MOD_ABOUT, Date.MOD_RANGE, Date.MOD_SPAN)) day = _randint(0, 28) - if day > 0: # avoid days without month + if day > 0: # avoid days without month month = _randint(1, 12) else: month = _randint(0, 12) @@ -1619,66 +1683,69 @@ class TestcaseGenerator(tool.BatchTool): else: month2 = _randint(0, 12) year2 = year + _randint(1, 5) - ndate.set(quality,modifier,calendar,(day,month,year,False,day2,month2,year2,False),"") + ndate.set(quality, modifier, calendar, + (day, month, year, False, day2, month2, year2, + False), "") else: - ndate.set(quality,modifier,calendar,(day,month,year,False),"") + ndate.set(quality, modifier, calendar, + (day, month, year, False), "") return (year, ndate) - def fill_object( self, o): + def fill_object(self, obj): + ''' Generic object fill routine ''' - - if issubclass(o.__class__, AddressBase): + if issubclass(obj.__class__, AddressBase): while _randint(0, 1) == 1: - a = Address() - self.fill_object(a) - o.add_address( a) + addr = Address() + self.fill_object(addr) + obj.add_address(addr) - if isinstance(o,Attribute): - o.set_type( self.rand_type(AttributeType())) - o.set_value( self.rand_text(self.SHORT)) + if isinstance(obj, Attribute): + obj.set_type(self.rand_type(AttributeType())) + obj.set_value(self.rand_text(self.SHORT)) - if issubclass(o.__class__, AttributeBase): + if issubclass(obj.__class__, AttributeBase): while _randint(0, 1) == 1: - a = Attribute() - self.fill_object(a) - o.add_attribute( a) + att = Attribute() + self.fill_object(att) + obj.add_attribute(att) - if isinstance(o,ChildRef): + if isinstance(obj, ChildRef): if _randint(0, 3) == 1: - o.set_mother_relation( self.rand_type( ChildRefType())) + obj.set_mother_relation(self.rand_type(ChildRefType())) if _randint(0, 3) == 1: - o.set_father_relation( self.rand_type( ChildRefType())) + obj.set_father_relation(self.rand_type(ChildRefType())) - if issubclass(o.__class__, DateBase): + if issubclass(obj.__class__, DateBase): if _randint(0, 1) == 1: - (y,d) = self.rand_date() - o.set_date_object( d) + (dummy, dat) = self.rand_date() + obj.set_date_object(dat) - if isinstance(o,Event): + if isinstance(obj, Event): if _randint(0, 1) == 1: - o.set_description( self.rand_text(self.LONG)) + obj.set_description(self.rand_text(self.LONG)) - if issubclass(o.__class__, EventRef): - o.set_role( self.rand_type(EventRoleType())) + if issubclass(obj.__class__, EventRef): + obj.set_role(self.rand_type(EventRoleType())) - if isinstance(o,Family): + if isinstance(obj, Family): if _randint(0, 2) == 1: - o.set_relationship( self.rand_type(FamilyRelType())) + obj.set_relationship(self.rand_type(FamilyRelType())) else: - o.set_relationship(FamilyRelType(FamilyRelType.MARRIED)) + obj.set_relationship(FamilyRelType(FamilyRelType.MARRIED)) - if isinstance(o,LdsOrd): + if isinstance(obj, LdsOrd): if _randint(0, 1) == 1: - o.set_temple(_choice(TEMPLES.name_code_data())[1]) + obj.set_temple(_choice(TEMPLES.name_code_data())[1]) - if issubclass(o.__class__, LdsOrdBase): + if issubclass(obj.__class__, LdsOrdBase): while _randint(0, 1) == 1: ldsord = LdsOrd() - self.fill_object( ldsord) - if isinstance(o,Person): + self.fill_object(ldsord) + if isinstance(obj, Person): lds_type = _choice([item for item in LDS_INDIVIDUAL_ORD]) - if isinstance(o,Family): + if isinstance(obj, Family): lds_type = LDS_SPOUSE_SEALING[0] if self.generated_families: ldsord.set_family_handle( @@ -1687,222 +1754,227 @@ class TestcaseGenerator(tool.BatchTool): status = _choice(lds_type[1]) if status != LdsOrd.STATUS_NONE: ldsord.set_status(status) - o.add_lds_ord( ldsord) + obj.add_lds_ord(ldsord) - if isinstance(o,Location): + if isinstance(obj, Location): if _randint(0, 1) == 1: - o.set_parish( self.rand_text(self.SHORT)) + obj.set_parish(self.rand_text(self.SHORT)) - if issubclass(o.__class__, LocationBase): + if issubclass(obj.__class__, LocationBase): if _randint(0, 1) == 1: - o.set_street( self.rand_text(self.SHORT)) + obj.set_street(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_city( self.rand_text(self.SHORT)) + obj.set_city(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_postal_code( self.rand_text(self.SHORT)) + obj.set_postal_code(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_phone( self.rand_text(self.SHORT)) + obj.set_phone(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_state( self.rand_text(self.SHORT)) + obj.set_state(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_country( self.rand_text(self.SHORT)) + obj.set_country(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_county( self.rand_text(self.SHORT)) + obj.set_county(self.rand_text(self.SHORT)) - if issubclass(o.__class__, MediaBase): + if issubclass(obj.__class__, MediaBase): # FIXME: frequency changed to prevent recursion while _randint(0, 10) == 1: - o.add_media_reference( self.fill_object( MediaRef())) + obj.add_media_reference(self.fill_object(MediaRef())) - if isinstance(o,Media): + if isinstance(obj, Media): if _randint(0, 3) == 1: - o.set_description(str(self.rand_text(self.LONG))) + obj.set_description(str(self.rand_text(self.LONG))) path = os.path.abspath(_choice((ICON, LOGO, SPLASH))) - o.set_path(str(path)) + obj.set_path(str(path)) mime = get_type(path) - o.set_mime_type(mime) + obj.set_mime_type(mime) else: - o.set_description(str(self.rand_text(self.SHORT))) - o.set_path(os.path.abspath(str(ICON))) - o.set_mime_type("image/png") + obj.set_description(str(self.rand_text(self.SHORT))) + obj.set_path(os.path.abspath(str(ICON))) + obj.set_mime_type("image/png") - if isinstance(o,MediaRef): + if isinstance(obj, MediaRef): if not self.generated_media or _randint(0, 10) == 1: - m = Media() - self.fill_object(m) - self.db.add_media( m, self.trans) - self.generated_media.append( m.get_handle()) - o.set_reference_handle(_choice(self.generated_media)) + med = Media() + self.fill_object(med) + self.db.add_media(med, self.trans) + self.generated_media.append(med.get_handle()) + obj.set_reference_handle(_choice(self.generated_media)) if _randint(0, 1) == 1: - o.set_rectangle((_randint(0, 200), _randint(0, 200), - _randint(0, 200), _randint(0, 200))) + obj.set_rectangle((_randint(0, 200), _randint(0, 200), + _randint(0, 200), _randint(0, 200))) - if isinstance(o,Name): - o.set_type( self.rand_type( NameType())) + if isinstance(obj, Name): + obj.set_type(self.rand_type(NameType())) if _randint(0, 1) == 1: - o.set_title( self.rand_text(self.SHORT)) + obj.set_title(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: patronymic = Surname() patronymic.set_surname(self.rand_text(self.FIRSTNAME_MALE)) patronymic.set_origintype(NameOriginType.PATRONYMIC) - o.add_surname(patronymic) + obj.add_surname(patronymic) if _randint(0, 1) == 1: - o.get_primary_surname().set_prefix( self.rand_text(self.SHORT)) + obj.get_primary_surname().set_prefix( + self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_suffix( self.rand_text(self.SHORT)) + obj.set_suffix(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_call_name( self.rand_text(self.FIRSTNAME)) + obj.set_call_name(self.rand_text(self.FIRSTNAME)) if _randint(0, 1) == 1: - o.set_group_as( o.get_surname()[:1]) - # o.set_display_as() - # o.set_sort_as() + obj.set_group_as(obj.get_surname()[:1]) + # obj.set_display_as() + # obj.set_sort_as() - if isinstance(o,Note): - type = self.rand_type(NoteType()) - if type == NoteType.HTML_CODE: - o.set( self.rand_text(self.NOTE)) + if isinstance(obj, Note): + n_type = self.rand_type(NoteType()) + if n_type == NoteType.HTML_CODE: + obj.set(self.rand_text(self.NOTE)) else: - o.set_styledtext(self.rand_text(self.STYLED_TEXT)) - o.set_format(_choice((Note.FLOWED, Note.FORMATTED))) - o.set_type(type) + obj.set_styledtext(self.rand_text(self.STYLED_TEXT)) + obj.set_format(_choice((Note.FLOWED, Note.FORMATTED))) + obj.set_type(n_type) - if issubclass(o.__class__, NoteBase): + if issubclass(obj.__class__, NoteBase): while _randint(0, 1) == 1: if not self.generated_notes or _randint(0, 10) == 1: - n = Note() - self.fill_object(n) - self.db.add_note( n, self.trans) - self.generated_notes.append( n.get_handle()) + note = Note() + self.fill_object(note) + self.db.add_note(note, self.trans) + self.generated_notes.append(note.get_handle()) n_h = _choice(self.generated_notes) - o.add_note(n_h) + obj.add_note(n_h) - if isinstance(o, Place): - o.set_title(self.rand_text(self.LONG)) - o.set_name(PlaceName(value=self.rand_text(self.SHORT))) - o.set_code(self.rand_text(self.SHORT)) + if isinstance(obj, Place): + obj.set_title(self.rand_text(self.LONG)) + obj.set_name(PlaceName(value=self.rand_text(self.SHORT))) + obj.set_code(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: if _randint(0, 4) == 1: - o.set_longitude(self.rand_text(self.SHORT)) + obj.set_longitude(self.rand_text(self.SHORT)) else: - o.set_longitude(str(_random() * 360.0 - 180.0)) + obj.set_longitude(str(_random() * 360.0 - 180.0)) if _randint(0, 1) == 1: if _randint(0, 4) == 1: - o.set_latitude( self.rand_text(self.SHORT)) + obj.set_latitude(self.rand_text(self.SHORT)) else: - o.set_latitude(str(_random() * 180.0 - 90.0)) + obj.set_latitude(str(_random() * 180.0 - 90.0)) while _randint(0, 1) == 1: - o.add_alternate_locations(self.fill_object(Location())) + obj.add_alternate_locations(self.fill_object(Location())) - if issubclass(o.__class__, PlaceBase): + if issubclass(obj.__class__, PlaceBase): if _randint(0, 1) == 1: - o.set_place_handle(self.rand_place()) + obj.set_place_handle(self.rand_place()) - if issubclass(o.__class__, BasicPrimaryObject): + if issubclass(obj.__class__, BasicPrimaryObject): if _randint(0, 1) == 1: - o.set_gramps_id( self.rand_text(self.SHORT)) + obj.set_gramps_id(self.rand_text(self.SHORT)) - if issubclass(o.__class__, PrivacyBase): - o.set_privacy( _randint(0, 5) == 1) + if issubclass(obj.__class__, PrivacyBase): + obj.set_privacy(_randint(0, 5) == 1) - if isinstance(o,RepoRef): + if isinstance(obj, RepoRef): if not self.generated_repos or _randint(0, 10) == 1: - r = Repository() - self.fill_object(r) - self.db.add_repository( r, self.trans) - self.generated_repos.append(r.get_handle()) - o.set_reference_handle(_choice(self.generated_repos)) + rep = Repository() + self.fill_object(rep) + self.db.add_repository(rep, self.trans) + self.generated_repos.append(rep.get_handle()) + obj.set_reference_handle(_choice(self.generated_repos)) if _randint(0, 1) == 1: - o.set_call_number( self.rand_text(self.SHORT)) - o.set_media_type( self.rand_type(SourceMediaType())) + obj.set_call_number(self.rand_text(self.SHORT)) + obj.set_media_type(self.rand_type(SourceMediaType())) - if isinstance(o,Repository): - o.set_type( self.rand_type(RepositoryType())) - o.set_name( self.rand_text(self.SHORT)) + if isinstance(obj, Repository): + obj.set_type(self.rand_type(RepositoryType())) + obj.set_name(self.rand_text(self.SHORT)) - if isinstance(o,Source): - o.set_title( self.rand_text(self.SHORT)) + if isinstance(obj, Source): + obj.set_title(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_author( self.rand_text(self.SHORT)) + obj.set_author(self.rand_text(self.SHORT)) if _randint(0, 1) == 1: - o.set_publication_info( self.rand_text(self.LONG)) + obj.set_publication_info(self.rand_text(self.LONG)) if _randint(0, 1) == 1: - o.set_abbreviation( self.rand_text(self.SHORT)) + obj.set_abbreviation(self.rand_text(self.SHORT)) while _randint(0, 1) == 1: sattr = SrcAttribute() sattr.set_type(self.rand_text(self.SHORT)) sattr.set_value(self.rand_text(self.SHORT)) - o.add_attribute(sattr) + obj.add_attribute(sattr) while _randint(0, 1) == 1: - r = RepoRef() - self.fill_object(r) - o.add_repo_reference( r) + rep_ref = RepoRef() + self.fill_object(rep_ref) + obj.add_repo_reference(rep_ref) - if issubclass(o.__class__, CitationBase): + if issubclass(obj.__class__, CitationBase): while _randint(0, 1) == 1: if not self.generated_citations or _randint(1, 10) == 1: - s = Citation() - self.fill_object(s) - self.db.add_citation( s, self.trans) - self.generated_citations.append(s.get_handle()) + cit = Citation() + self.fill_object(cit) + self.db.add_citation(cit, self.trans) + self.generated_citations.append(cit.get_handle()) s_h = _choice(self.generated_citations) - o.add_citation(s_h) + obj.add_citation(s_h) - if isinstance(o,Citation): + if isinstance(obj, Citation): if not self.generated_sources or _randint(0, 10) == 1: - s = Source() - self.fill_object(s) - self.db.add_source( s, self.trans) - self.generated_sources.append( s.get_handle()) - o.set_reference_handle(_choice(self.generated_sources)) + src = Source() + self.fill_object(src) + self.db.add_source(src, self.trans) + self.generated_sources.append(src.get_handle()) + obj.set_reference_handle(_choice(self.generated_sources)) if _randint(0, 1) == 1: - o.set_page( self.rand_text(self.NUMERIC)) - #if _randint(0, 1) == 1: - # o.set_text( self.rand_text(self.SHORT)) - #if _randint(0, 1) == 1: - # (year, d) = self.rand_date( ) - # o.set_date_object( d) - o.set_confidence_level(_choice(list(conf_strings.keys()))) + obj.set_page(self.rand_text(self.NUMERIC)) + # if _randint(0, 1) == 1: + # obj.set_text( self.rand_text(self.SHORT)) + # if _randint(0, 1) == 1: + # (year, dat) = self.rand_date( ) + # obj.set_date_object( dat) + obj.set_confidence_level(_choice(list(conf_strings.keys()))) - if issubclass(o.__class__, TagBase): + if issubclass(obj.__class__, TagBase): if _randint(0, 1) == 1: - o.set_tag_list(self.rand_tags()) + obj.set_tag_list(self.rand_tags()) - if issubclass(o.__class__, UrlBase): + if issubclass(obj.__class__, UrlBase): while _randint(0, 1) == 1: - u = Url() - self.fill_object(u) - o.add_url(u) + url = Url() + self.fill_object(url) + obj.add_url(url) - if isinstance(o,Url): - o.set_path("http://www.gramps-project.org/?test=%s" % self.rand_text(self.SHORT)) - o.set_description( self.rand_text(self.SHORT)) - o.set_type( self.rand_type(UrlType())) + if isinstance(obj, Url): + obj.set_path("http://www.gramps-project.org/?test=%s" % + self.rand_text(self.SHORT)) + obj.set_description(self.rand_text(self.SHORT)) + obj.set_type(self.rand_type(UrlType())) - return o + return obj - def rand_personal_event( self, type=None, start=None, end=None): - if type: - typeval = EventType(type) + def rand_personal_event(self, e_type=None, start=None, end=None): + """ Random personal event """ + if e_type: + typeval = EventType(e_type) else: typeval = self.rand_type(EventType()) - return self._rand_event( typeval, start, end) + return self._rand_event(typeval, start, end) - def rand_family_event( self, type=None, start=None, end=None): - if type: - typeval = EventType(type) + def rand_family_event(self, e_type=None, start=None, end=None): + """ Random family event """ + if e_type: + EventType(e_type) else: typeval = EventType.UNKNOWN while int(typeval) not in self.FAMILY_EVENTS: typeval = self.rand_type(EventType()) - return self._rand_event( typeval, start, end) + return self._rand_event(typeval, start, end) - def _rand_event( self, type, start, end): - e = Event() - self.fill_object(e) - e.set_type( type) - (year, d) = self.rand_date( start, end) - e.set_date_object( d) - event_h = self.db.add_event(e, self.trans) + def _rand_event(self, e_type, start, end): + """ Random general event """ + evt = Event() + self.fill_object(evt) + evt.set_type(e_type) + (year, dat) = self.rand_date(start, end) + evt.set_date_object(dat) + event_h = self.db.add_event(evt, self.trans) self.generated_events.append(event_h) event_ref = EventRef() self.fill_object(event_ref) @@ -1911,8 +1983,8 @@ class TestcaseGenerator(tool.BatchTool): def rand_type(self, gtype): if issubclass(gtype.__class__, GrampsType): - map = gtype.get_map() - key = _choice(list(map.keys())) + gmap = gtype.get_map() + key = _choice(list(gmap.keys())) if key == gtype.get_custom(): value = self.rand_text(self.SHORT) else: @@ -1955,98 +2027,103 @@ class TestcaseGenerator(tool.BatchTool): def add_parent_place(self, place, handle): place_ref = PlaceRef() place_ref.ref = handle - year, random_date = self.rand_date() + dummy, random_date = self.rand_date() place_ref.set_date_object(random_date) place.add_placeref(place_ref) - def rand_text(self, type=None): + def rand_text(self, t_type=None): + """ make random text strings according to desired type """ # for lastnamesnames - syllables1 = ["sa","li","na","ma","no","re","mi","cha","ki","du","ba","ku","el"] + syllables1 = ["sa", "li", "na", "ma", "no", "re", "mi", + "cha", "ki", "du", "ba", "ku", "el"] # for firstnames - syllables2 = ["as","il","an","am","on","er","im","ach","ik","ud","ab","ul","le"] + syllables2 = ["as", "il", "an", "am", "on", "er", "im", + "ach", "ik", "ud", "ab", "ul", "le"] # others - syllables3 = ["ka", "po", "lo", "chi", "she", "di", "fa", "go", "ja", "ne", "pe"] + syllables3 = ["ka", "po", "lo", "chi", "she", "di", "fa", + "go", "ja", "ne", "pe"] - syllables = syllables1 + syllables2 +syllables3 + syllables = syllables1 + syllables2 + syllables3 minwords = 5 maxwords = 8 minsyllables = 2 maxsyllables = 5 - if type == self.STYLED_TEXT: + # result = "" if t_type != self.STYLED_TEXT else StyledText("") + if t_type == self.STYLED_TEXT: result = StyledText("") else: result = "" - if self.options.handler.options_dict['specialchars']: + if self.options_dict['specialchars']: result = result + "ä<ö&ü%ß'\"" - if self.options.handler.options_dict['add_serial'] and type != self.TAG: + if self.options_dict['add_serial'] and t_type != self.TAG: result = result + "#+#%06d#-#" % self.text_serial_number self.text_serial_number = self.text_serial_number + 1 - if not type: - type = self.SHORT + if not t_type: + t_type = self.SHORT - if type == self.SHORT or type == self.TAG: + if t_type == self.SHORT or t_type == self.TAG: minwords = 1 maxwords = 3 minsyllables = 2 maxsyllables = 4 - if type == self.LONG: + if t_type == self.LONG: minwords = 5 maxwords = 8 minsyllables = 2 maxsyllables = 5 - if type == self.FIRSTNAME: - type = _choice((self.FIRSTNAME_MALE, self.FIRSTNAME_FEMALE)) + if t_type == self.FIRSTNAME: + t_type = _choice((self.FIRSTNAME_MALE, self.FIRSTNAME_FEMALE)) - if type == self.FIRSTNAME_MALE or type == self.FIRSTNAME_FEMALE: + if t_type == self.FIRSTNAME_MALE or t_type == self.FIRSTNAME_FEMALE: syllables = syllables2 minwords = 1 maxwords = 5 minsyllables = 2 maxsyllables = 5 - if not self.options.handler.options_dict['long_names']: + if not self.options_dict['long_names']: maxwords = 2 maxsyllables = 3 - if type == self.LASTNAME: + if t_type == self.LASTNAME: syllables = syllables1 minwords = 1 maxwords = 1 minsyllables = 2 maxsyllables = 5 - if not self.options.handler.options_dict['long_names']: + if not self.options_dict['long_names']: maxsyllables = 3 - if type == self.NOTE or type == self.STYLED_TEXT: + if t_type == self.NOTE or t_type == self.STYLED_TEXT: result = result + "Generated by TestcaseGenerator." minwords = 20 maxwords = 100 - if type == self.NUMERIC: + if t_type == self.NUMERIC: if _randint(0, 1) == 1: return "%d %s" % (_randint(1, 100), result) if _randint(0, 1) == 1: return "%d, %d %s" % (_randint(1, 100), _randint(100, 1000), result) - m = _randint(100, 1000) - return "%d - %d %s" % (m, m+_randint(1, 5), result) + med = _randint(100, 1000) + return "%d - %d %s" % (med, med + _randint(1, 5), result) - for i in range(0, _randint(minwords, maxwords)): + for dummy in range(0, _randint(minwords, maxwords)): if result: result = result + " " word = "" for j in range(0, _randint(minsyllables, maxsyllables)): word = word + _choice(syllables) - if type == self.FIRSTNAME_MALE: + if t_type == self.FIRSTNAME_MALE: word = word + _choice(("a", "e", "i", "o", "u")) if _randint(0, 3) == 1: word = word.title() - if type == self.NOTE: + if t_type == self.NOTE: if _randint(0, 10) == 1: word = "%s" % word elif _randint(0, 10) == 1: @@ -2057,36 +2134,35 @@ class TestcaseGenerator(tool.BatchTool): word = word + "." elif _randint(0, 30) == 1: word = word + ".\n" - if type == self.STYLED_TEXT: + if t_type == self.STYLED_TEXT: tags = [] if _randint(0, 10) == 1: tags += [StyledTextTag(StyledTextTagType.BOLD, True, - [(0, len(word))])] + [(0, len(word))])] elif _randint(0, 10) == 1: tags += [StyledTextTag(StyledTextTagType.ITALIC, True, - [(0, len(word))])] + [(0, len(word))])] elif _randint(0, 10) == 1: tags += [StyledTextTag(StyledTextTagType.UNDERLINE, True, - [(0, len(word))])] - word = StyledText(word, tags) + [(0, len(word))])] + sword = StyledText(word, tags) if _randint(0, 20) == 1: - word = word + "." + sword = sword + "." elif _randint(0, 30) == 1: - word = word + ".\n" - if type == self.STYLED_TEXT: - result = StyledText("").join((result, word)) + sword = sword + ".\n" + result = StyledText("").join((result, sword)) else: result += word - if type == self.LASTNAME: - n = _randint(0, 2) - if n == 0: + if t_type == self.LASTNAME: + case = _randint(0, 2) + if case == 0: result = result.title() - elif n == 1: + elif case == 1: result = result.upper() - if self.options.handler.options_dict['add_linebreak'] and \ - type != self.TAG: + if self.options_dict['add_linebreak'] and \ + t_type != self.TAG: result = result + "\nNEWLINE" return result @@ -2097,66 +2173,73 @@ class TestcaseGenerator(tool.BatchTool): def rand_tags(self): maxtags = 5 taglist = [] - for counter in range(0, _randint(1, maxtags)): + for dummy in range(0, _randint(1, maxtags)): tag = _choice(self.generated_tags) if tag not in taglist: taglist.append(tag) return taglist -#------------------------------------------------------------------------ + +# ----------------------------------------------------------------------- # +# The options class for the tool # -# -#------------------------------------------------------------------------ +# ----------------------------------------------------------------------- class TestcaseGeneratorOptions(tool.ToolOptions): """ Defines options and provides handling interface. """ - def __init__(self, name,person_id=None): - tool.ToolOptions.__init__(self, name,person_id) + def __init__(self, name, person_id=None): + tool.ToolOptions.__init__(self, name, person_id) # Options specific for this report self.options_dict = { - 'lowlevel' : 0, - 'bugs' : 0, - 'persons' : 1, - 'person_count' : 2000, - 'long_names' : 0, - 'specialchars' : 0, - 'add_serial' : 0, - 'add_linebreak' : 0, + 'lowlevel': 0, + 'bugs': 0, + 'persons': 1, + 'person_count': 2000, + 'long_names': 0, + 'specialchars': 0, + 'add_serial': 0, + 'add_linebreak': 0, } self.options_help = { - 'lowlevel' : ("=0/1", - "Whether to create low level database errors.", - ["Skip test","Create low level database errors"], - True), - 'bugs' : ("=0/1", - "Whether to create invalid database references.", - ["Skip test","Create invalid Database references"], - True), - 'persons' : ("=0/1", - "Whether to create a bunch of dummy persons", - ["Dont create persons","Create dummy persons"], - True), - 'person_count' : ("=int", - "Number of dummy persons to generate", - "Number of persons"), - 'long_names' : ("=0/1", - "Whether to create short or long names", - ["Short names","Long names"], - True), - 'specialchars' : ("=0/1", - "Whether to ass some special characters to every text field", - ["No special characters","Add special characters"], - True), - 'add_serial' : ("=0/1", - "Whether to add a serial number to every text field", - ["No serial","Add serial number"], - True), - 'add_linebreak' : ("=0/1", - "Whether to add a line break to every text field", - ["No linebreak","Add line break"], - True), + 'lowlevel': ("=0/1", + "Whether to create low level database errors.", + ["Skip test", + "Create low level database errors"], + True), + 'bugs': ("=0/1", + "Whether to create invalid database references.", + ["Skip test", + "Create invalid Database references"], + True), + 'persons': ("=0/1", + "Whether to create a bunch of dummy persons", + ["Dont create persons", "Create dummy persons"], + True), + 'person_count': ("=int", + "Number of dummy persons to generate", + "Number of persons"), + 'long_names': ("=0/1", + "Whether to create short or long names", + ["Short names", "Long names"], + True), + 'specialchars': ("=0/1", + "Whether to ass some special characters to every" + " text field", + ["No special characters", + "Add special characters"], + True), + 'add_serial': ("=0/1", + "Whether to add a serial number to every text " + "field", + ["No serial", "Add serial number"], + True), + 'add_linebreak': ("=0/1", + "Whether to add a line break to every text " + "field", + ["No linebreak", "Add line break"], + True), }