From 7f6803f9f6391f8f6c84695ab9e1249f62f779fd Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Sun, 22 May 2016 12:42:32 -0400 Subject: [PATCH 01/12] 8466: [Performance] Handling many Events on a person --- gramps/plugins/gramplet/events.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gramps/plugins/gramplet/events.py b/gramps/plugins/gramplet/events.py index 4a9ec8ce0..8c371559c 100644 --- a/gramps/plugins/gramplet/events.py +++ b/gramps/plugins/gramplet/events.py @@ -93,7 +93,7 @@ class Events(Gramplet, DbGUIElement): event = self.dbstate.db.get_event_from_handle(event_ref.ref) event_date = get_date(event) event_sort = '%012d' % event.get_date_object().get_sort_value() - person_age = self.column_age(event) + person_age = self.column_age(event) person_age_sort = self.column_sort_age(event) place = place_displayer.display_event(self.dbstate.db, event) @@ -118,7 +118,7 @@ class Events(Gramplet, DbGUIElement): month, days" """ date = event.get_date_object() - start_date = self.get_start_date() + start_date = self.cached_start_date if date and start_date: return (date - start_date).format(precision=age_precision) else: @@ -129,7 +129,7 @@ class Events(Gramplet, DbGUIElement): Returns a string version of number of days of age. """ date = event.get_date_object() - start_date = self.get_start_date() + start_date = self.cached_start_date if date and start_date: return "%09d" % int(date - start_date) else: @@ -171,6 +171,7 @@ class PersonEvents(Events): Return True if the gramplet has data, else return False. """ if active_person: + self.cached_start_date = self.get_start_date() if active_person.get_event_ref_list(): return True for family_handle in active_person.get_family_handle_list(): @@ -178,6 +179,8 @@ class PersonEvents(Events): if family: for event_ref in family.get_event_ref_list(): return True + else: + self.cached_start_date = None return False def main(self): # return false finishes From 75d4f05185dd1253a602925dc806d033095b721e Mon Sep 17 00:00:00 2001 From: Nick Hall Date: Sun, 22 May 2016 17:54:23 +0100 Subject: [PATCH 02/12] 8785: Expand tree in selectors automatically --- gramps/gui/selectors/baseselector.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/gramps/gui/selectors/baseselector.py b/gramps/gui/selectors/baseselector.py index ac6601301..59014af40 100644 --- a/gramps/gui/selectors/baseselector.py +++ b/gramps/gui/selectors/baseselector.py @@ -132,18 +132,6 @@ class BaseSelector(ManagedWindow): """ iter_ = self.model.get_iter_from_handle(handle) if iter_: - if not (self.model.get_flags() & Gtk.TreeModelFlags.LIST_ONLY): - # Expand tree - parent_iter = self.model.iter_parent(iter_) - if parent_iter: - parent_path = self.model.get_path(parent_iter) - if parent_path: - parent_path_list = parent_path.get_indices() - for i in range(len(parent_path_list)): - expand_path = Gtk.TreePath( - tuple([x for x in parent_path_list[:i+1]])) - self.tree.expand_row(expand_path, False) - # Select active object path = self.model.get_path(iter_) self.selection.unselect_all() @@ -300,6 +288,9 @@ class BaseSelector(ManagedWindow): self.setupcols = False + if not (self.model.get_flags() & Gtk.TreeModelFlags.LIST_ONLY): + self.tree.expand_all() + def column_clicked(self, obj, data): if self.sort_col != data: self.sortorder = Gtk.SortType.ASCENDING From 3ea4b0d10943132b1be5cd06b62b548ae7921af7 Mon Sep 17 00:00:00 2001 From: Nick Hall Date: Sun, 22 May 2016 18:26:34 +0100 Subject: [PATCH 03/12] 9314: Allow place selection both individually and by filter Add the places selected individually to the list generated by the filter. --- gramps/plugins/textreport/placereport.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gramps/plugins/textreport/placereport.py b/gramps/plugins/textreport/placereport.py index 7090179c9..97d39d304 100644 --- a/gramps/plugins/textreport/placereport.py +++ b/gramps/plugins/textreport/placereport.py @@ -107,13 +107,15 @@ class PlaceReport(Report): self.sort = Sort(self.database) + self.place_handles = [] if self.filter.get_name() != '': # Use the selected filter to provide a list of place handles plist = self.database.iter_place_handles() self.place_handles = self.filter.apply(self.database, plist) - else: - # Use the place handles selected without a filter - self.place_handles = self.__get_place_handles(places) + + if places: + # Add places selected individually + self.place_handles += self.__get_place_handles(places) if not self.place_handles: raise ReportError(_('Place Report'), From 9ab27bf83bbc999dcaa24c4e68035ada9c94fc41 Mon Sep 17 00:00:00 2001 From: Nick Hall Date: Sun, 22 May 2016 19:07:35 +0100 Subject: [PATCH 04/12] 9466: Include all place types in place report --- gramps/plugins/textreport/placereport.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/gramps/plugins/textreport/placereport.py b/gramps/plugins/textreport/placereport.py index 97d39d304..b1ff09b67 100644 --- a/gramps/plugins/textreport/placereport.py +++ b/gramps/plugins/textreport/placereport.py @@ -46,7 +46,7 @@ from gramps.gen.plug.docgen import (IndexMark, FontStyle, ParagraphStyle, FONT_SANS_SERIF, FONT_SERIF, INDEX_TYPE_TOC, PARA_ALIGN_CENTER) from gramps.gen.sort import Sort -from gramps.gen.utils.location import get_main_location +from gramps.gen.utils.location import get_location_list from gramps.gen.display.place import displayer as place_displayer from gramps.gen.lib import PlaceType from gramps.gen.errors import ReportError @@ -171,17 +171,12 @@ class PlaceReport(Report): This procedure writes out the details of a single place """ place = self.database.get_place_from_handle(handle) - location = get_main_location(self.database, place) - place_details = [ - self._("Gramps ID: %s ") % place.get_gramps_id(), - self._("Street: %s ") % location.get(PlaceType.STREET, ''), - self._("Parish: %s ") % location.get(PlaceType.PARISH, ''), - self._("Locality: %s ") % location.get(PlaceType.LOCALITY, ''), - self._("City: %s ") % location.get(PlaceType.CITY, ''), - self._("County: %s ") % location.get(PlaceType.COUNTY, ''), - self._("State: %s") % location.get(PlaceType.STATE, ''), - self._("Country: %s ") % location.get(PlaceType.COUNTRY, '')] + place_details = [self._("Gramps ID: %s ") % place.get_gramps_id()] + for level in get_location_list(self.database, place): + place_details.append("%(type)s: %(name)s " % + {'type': str(level[1]), 'name': level[0]}) + place_names = '' all_names = place.get_all_names() if len(all_names) > 1 or __debug__: From ca1863984b51086ed98de2299e70c5b3463b89d9 Mon Sep 17 00:00:00 2001 From: Nick Hall Date: Sun, 22 May 2016 22:50:19 +0100 Subject: [PATCH 05/12] Fix to allow deferred translation of place type --- gramps/plugins/textreport/placereport.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gramps/plugins/textreport/placereport.py b/gramps/plugins/textreport/placereport.py index b1ff09b67..4a6ef880d 100644 --- a/gramps/plugins/textreport/placereport.py +++ b/gramps/plugins/textreport/placereport.py @@ -175,7 +175,8 @@ class PlaceReport(Report): place_details = [self._("Gramps ID: %s ") % place.get_gramps_id()] for level in get_location_list(self.database, place): place_details.append("%(type)s: %(name)s " % - {'type': str(level[1]), 'name': level[0]}) + {'type': self._(level[1].xml_str()), + 'name': level[0]}) place_names = '' all_names = place.get_all_names() From 50708d4097880ceb3291a17c8b855e9dc506a55c Mon Sep 17 00:00:00 2001 From: SNoiraud Date: Mon, 23 May 2016 11:06:54 +0200 Subject: [PATCH 06/12] 9075: Saving/closing new person window with Alt-o does not find gender --- gramps/gui/editors/editperson.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gramps/gui/editors/editperson.py b/gramps/gui/editors/editperson.py index 8f16d47fb..9fa3a6336 100644 --- a/gramps/gui/editors/editperson.py +++ b/gramps/gui/editors/editperson.py @@ -245,7 +245,7 @@ class EditPerson(EditPrimary): WIKI_HELP_PAGE, _('manual|Editing_information_about_people')) - self.given.connect("focus_out_event", self._given_focus_out_event) + self.given.connect("focus-out-event", self._given_focus_out_event) self.top.get_object("editnamebtn").connect("clicked", self._edit_name_clicked) self.top.get_object("multsurnamebtn").connect("clicked", From 23a0a492d4892de6143c0da6b3b5e94d1a5edd90 Mon Sep 17 00:00:00 2001 From: Nick Hall Date: Mon, 23 May 2016 15:20:37 +0100 Subject: [PATCH 07/12] 9427: Add inclusive option to IsEnclosedBy rule --- gramps/gen/filters/_filterparser.py | 3 +++ gramps/gen/filters/rules/place/_isenclosedby.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gramps/gen/filters/_filterparser.py b/gramps/gen/filters/_filterparser.py index 42cdd4212..a59b55cf8 100644 --- a/gramps/gen/filters/_filterparser.py +++ b/gramps/gen/filters/_filterparser.py @@ -166,6 +166,9 @@ class FilterParser(handler.ContentHandler): # HasEvent rule has extra primary role field in v3.4.7 if self.r == rules.person.HasEvent and len(self.a) == 5: self.a.append('1') + # IsEnclosedBy rule has extra inclusive field in v4.2.4 + if self.r == rules.place.IsEnclosedBy and len(self.a) == 1: + self.a.append('0') #------------------------------------------------------------------------- # diff --git a/gramps/gen/filters/rules/place/_isenclosedby.py b/gramps/gen/filters/rules/place/_isenclosedby.py index 6c445ebf0..c6408b1ed 100644 --- a/gramps/gen/filters/rules/place/_isenclosedby.py +++ b/gramps/gen/filters/rules/place/_isenclosedby.py @@ -45,7 +45,7 @@ class IsEnclosedBy(Rule): Rule that checks for a place enclosed by another place """ - labels = [_('ID:')] + labels = [_('ID:'), _('Inclusive:')] name = _('Places enclosed by another place') description = _('Matches a place enclosed by a particular place') category = _('General filters') @@ -59,6 +59,8 @@ class IsEnclosedBy(Rule): def apply(self, db, place): if self.handle is None: return False + if self.list[1] == '1' and place.handle == self.handle: + return True if located_in(db, place.handle, self.handle): return True return False From 7a33b08185e7d9b54b87c82da33a670d4d38a3d3 Mon Sep 17 00:00:00 2001 From: prculley Date: Mon, 23 May 2016 15:34:47 -0500 Subject: [PATCH 08/12] Prototype of test imports module and associated tests --- gramps/gen/utils/id.py | 24 +- .../test/Tstdata/FTM_16dec2015a-mod1.ged | 78 ++ .../test/Tstdata/FTM_16dec2015a-mod1.gramps | Bin 0 -> 1669 bytes .../test/Tstdata/MixInlineXrefNote.ged | 44 + .../test/Tstdata/MixInlineXrefNote.gramps | Bin 0 -> 1036 bytes gramps/plugins/test/Tstdata/Paris.ged | 275 +++++ gramps/plugins/test/Tstdata/bug 8322 test.ged | 173 ++++ .../plugins/test/Tstdata/bug 8322 test.gramps | Bin 0 -> 3161 bytes gramps/plugins/test/Tstdata/paris.gramps | Bin 0 -> 3224 bytes gramps/plugins/test/Tstdata/paris.gramps.bak | Bin 0 -> 3263 bytes gramps/plugins/test/Tstdata/sample.ged | 946 ++++++++++++++++++ gramps/plugins/test/Tstdata/sample.gramps | Bin 0 -> 6473 bytes gramps/plugins/test/Tstdata/test_FTM_CONC.ged | 42 + .../plugins/test/Tstdata/test_FTM_CONC.gramps | Bin 0 -> 1051 bytes gramps/plugins/test/Tstdata/vcard.difs | 5 + gramps/plugins/test/Tstdata/vcard.gramps | Bin 0 -> 1425 bytes gramps/plugins/test/Tstdata/vcard.vcf | 291 ++++++ gramps/plugins/test/test_imports.py | 233 +++++ 18 files changed, 2107 insertions(+), 4 deletions(-) create mode 100644 gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.ged create mode 100644 gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.gramps create mode 100644 gramps/plugins/test/Tstdata/MixInlineXrefNote.ged create mode 100644 gramps/plugins/test/Tstdata/MixInlineXrefNote.gramps create mode 100644 gramps/plugins/test/Tstdata/Paris.ged create mode 100644 gramps/plugins/test/Tstdata/bug 8322 test.ged create mode 100644 gramps/plugins/test/Tstdata/bug 8322 test.gramps create mode 100644 gramps/plugins/test/Tstdata/paris.gramps create mode 100644 gramps/plugins/test/Tstdata/paris.gramps.bak create mode 100644 gramps/plugins/test/Tstdata/sample.ged create mode 100644 gramps/plugins/test/Tstdata/sample.gramps create mode 100644 gramps/plugins/test/Tstdata/test_FTM_CONC.ged create mode 100644 gramps/plugins/test/Tstdata/test_FTM_CONC.gramps create mode 100644 gramps/plugins/test/Tstdata/vcard.difs create mode 100644 gramps/plugins/test/Tstdata/vcard.gramps create mode 100644 gramps/plugins/test/Tstdata/vcard.vcf create mode 100644 gramps/plugins/test/test_imports.py diff --git a/gramps/gen/utils/id.py b/gramps/gen/utils/id.py index f8e8f21b0..06852d3c7 100644 --- a/gramps/gen/utils/id.py +++ b/gramps/gen/utils/id.py @@ -10,7 +10,7 @@ # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. @@ -46,11 +46,19 @@ from ..const import GRAMPS_UUID # create_id # #------------------------------------------------------------------------- -rand = random.Random(time.time()) +_rand = random.Random(time.time()) +_det_id = False + def create_id(): - return "%08x%08x" % (int(time.time()*10000), - rand.randint(0, sys.maxsize)) + global _rand + if _det_id is True: + _rand = _rand + 1 + return "%08x%08x" % (_rand, _rand) + else: + return "%08x%08x" % (int(time.time()*10000), + _rand.randint(0, sys.maxsize)) + def create_uid(self, handle=None): if handle: @@ -59,3 +67,11 @@ def create_uid(self, handle=None): uid = uuid.uuid4() return uid.hex.upper() + +def set_det_id(self, val=True): + global _rand, _det_id + _det_id = val + if _det_id is True: + _rand = 0 + else: + _rand = random.Random(time.time()) diff --git a/gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.ged b/gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.ged new file mode 100644 index 000000000..807b4f87e --- /dev/null +++ b/gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.ged @@ -0,0 +1,78 @@ +0 HEAD +1 SOUR FTM +2 VERS Family Tree Maker (22.2.5) +2 NAME Family Tree Maker for Mac OS X +2 CORP Ancestry.com +3 ADDR 360 W 4800 N +4 CONT Provo, UT 84604 +3 PHON (801) 705-7000 +1 DEST GED55 +1 DATE 16 DEC 2015 +1 CHAR UTF-8 +1 FILE test_FTM_16dec2015-mod.ged +1 SUBM @SUBM@ +1 GEDC +2 VERS 5.5 +2 FORM LINEAGE-LINKED +0 @SUBM@ SUBM +0 @I278@ INDI +1 NAME Andrew /May/ +2 SOUR @S29@ +3 PAGE Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: +4 CONC M432_394; Page: 435B; Image: 248 +3 OBJE @M159@ +1 SEX M +1 BIRT +2 DATE 1816 +2 PLAC Tennessee, USA +2 SOUR @S29@ +3 PAGE Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: +4 CONC M432_394; Page: 435B; Image: 248 +3 OBJE @M159@ +1 RESI +2 DATE 1850 +2 PLAC District 14, Cape Girardeau, Missouri, USA +2 SOUR @S29@ +3 PAGE Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: +4 CONC M432_394; Page: 435B; Image: 248 +3 OBJE @M159@ +1 DEAT +2 DATE 1850/1860 +2 PLAC Bollinger Co. MO +1 FAMS @F73@ +1 FAMS @F74@ +1 FAMC @F73@ +1 FAMC @F73@ +1 FAMC @F74@ +1 FAMC @F74@ +0 @F73@ FAM +1 HUSB @I278@ +1 MARR +2 DATE ABT 1841 +2 PLAC Union Co.?, IL +0 @F74@ FAM +1 HUSB @I278@ +1 MARR +2 DATE AUG 1847 +2 PLAC Wayne, Missouri, United States +0 @S29@ SOUR +1 AUTH Ancestry.com +1 TITL 1850 United States Federal Census +1 PUBL Name: Ancestry.com Operations, Inc.; Location: Provo, UT, USA; Date: +2 CONC 2009; +1 REPO @R1@ +0 @R1@ REPO +1 NAME Ancestry.com +1 ADDR +1 EMAIL +1 PHON +0 @M159@ OBJE +1 FILE 1850 United States Federal Census(11)-1.jpg +2 TITL 1850 United States Federal Census +1 NOTE Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: +2 CONC M432_394; Page: 435B; Image: 248 +0 @M158@ OBJE +1 FILE D:\Users\PRC\Downloads\1850 United States Federal Census(11)-1.jpg +0 @M157@ OBJE +1 FILE http://1.gravatar.com/avatar/77e02a3c8c665155ad1acaac8c2742e0?s=120&d=mm&r=pg +0 TRLR diff --git a/gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.gramps b/gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.gramps new file mode 100644 index 0000000000000000000000000000000000000000..88fdc096ac1eb33dd8b8bac04ea55ab3f3158884 GIT binary patch literal 1669 zcmV;02737)iwFp4BtusM|3*|zUokdhWn(fhF*RW=ZEs{TE@yIKZE$k{?OEGy+c*$? z&sT8uuxNqUv}E~GUlKHS5@ZoKMw(!^K!AdgXq%}d3Y47If4@UfH07HVFS>ndfM7`R zHs^3=IHU*XKf(aLQjsto4K2Igun>(r?z3nqR>YF+F6>}2rA_-^#@WqOHxl9FeV zP&9qKxV;%6tA_ElAYq(fJboA>RYw0zZjoK@)NPC}KUpW%B2D8S#`CPT77PADy|m87 z9K-rp^;C^euluQQ!J_N6;9Hao-!ut~Lujy|#HT_Qq2dWjQtC_9>Ckc-cDvSS)tshf za4W4p-rTj_np=13cFnPHK3vd*65%b@^Wn`e18i0s&{rCzN!~H5paqHi02cn*P=75g zE#yJl9GYym?KbRgqv2SH`9tecwp(fzm?vGu^z4F(bTPnLSvN>TuLSmw1Tab0Zfm8X zEe?oB(IQ~cH?wv}%R)zwr6dIw1f6YnZ)>?G180~@@pZK<$7gThyQc~B!SrZ3##W;W zBhm707(Zxv48~_I%P~4z7{_3U`}QzNg~5mIZo3ksr{ytP&$KMpy1AwGgb2aNykcWq z+d{H^Xpv{WOe+A`4K0rVVB1=j191NvfKCl;wnA-3%ROr6#mxH$G39ZPuLTv6@Mvd0 z)+8K;bJK7-T?1!MBN=HX1Duz1LqtNF)1L(j^a(z!$3ce~6G?jZG4cidKESGGT9c)a zGXPVo0oE1MT;e{imIdZ;ak$#bJtGToP;g1hRIreURbiq-Lkl71*r5f_Jv7u?u)ya# zBYiEayHYKS=0pT&#GlHTrx2jj=3HfZZxg;}Lt_R<9rIFT zyQgSGVv4SrAi}3)d5R`1N%&H*KDy^Y&_ffq>3nT|aQkQqv-XhNY+dxxO_)_2w+jX@ zS6ef~qnXMe&YS@*)N}{_{IZ9*rj`Ygr5YaH)7jC|u&l|e;?m?&rCi#-xvb{WH zj?KP>lph&91-1bBI_hgsGW4q3}yg z;fqfbPp~*uuYOf?6^@{Yr+W?{+tsqVYfDSRqN1miE4!^_DOcTnT#bA9F@bv$p5Bk} z7)&ML#82?gq;TAO%9eP7C7#wxJRP&dQEYUyEM=p!kB$5l)vnJ4c_k?k@&LuEh&vtH za7feZdhK@0ZncPS6ORz6I~~`djq_v({`n^fk~NhM;Bci<|8HKTGZ*OqZ1p z%A-7CDHrAAz^_5ZqO+3+ki6{)X-&l2ek3qgP=bZ^Nwp8N$V{PZ=~5XG)>1)06AV@#t=XSP1!Fx&`o_dR+Jkf`#%9;Lt2eIl8;}>k_>SmqE&E zGBG4bS>Sv9OUTU_$r#={IT`U~;1{MqM??qx6nD!aDrKhue50$I+sk8SDH53F>njKf z(qMMZWw+rTAQpvst${NtM792U!2A Pb9VAC7?gdceHs7&di*`d literal 0 HcmV?d00001 diff --git a/gramps/plugins/test/Tstdata/MixInlineXrefNote.ged b/gramps/plugins/test/Tstdata/MixInlineXrefNote.ged new file mode 100644 index 000000000..679c9ca90 --- /dev/null +++ b/gramps/plugins/test/Tstdata/MixInlineXrefNote.ged @@ -0,0 +1,44 @@ +0 HEAD +1 SOUR RootsMagic +2 NAME RootsMagic +2 VERS 7.0.2.2 +2 CORP RootsMagic, Inc. +3 ADDR PO Box 495 +4 CONT Springville, UT 84663 +4 CONT USA +3 PHON 1-800-ROOTSMAGIC +1 DEST RootsMagic +1 DATE 26 JAN 2015 +1 FILE rm.ged +1 GEDC +2 VERS 5.5.1 +2 FORM LINEAGE-LINKED +1 CHAR UTF-8 +0 @I1@ INDI +1 NAME Living1 +1 SEX M +1 NOTE Inline 0 +1 NOTE @N0@ +1 NOTE Inline 1 +1 SOUR Inline Source 1 +1 OBJE +2 FILE Inline1 +2 FORM jpg +0 @N0@ NOTE +1 CONC XREF N0 +0 @I01@ INDI +1 NAME Living01 +1 SEX M +1 SOUR inline Source 2 +1 OBJE +2 FILE Inline2 +3 FORM jpg +0 @S1@ SOUR +1 TITL Source S1 +0 @S01@ SOUR +1 TITL Source S01 +0 @O1@ OBJE +1 FILE XREF1 +0 @O1@ OBJE +1 FILE XREF2 +0 TRLR diff --git a/gramps/plugins/test/Tstdata/MixInlineXrefNote.gramps b/gramps/plugins/test/Tstdata/MixInlineXrefNote.gramps new file mode 100644 index 0000000000000000000000000000000000000000..eae98ab4a08209c50e92531ad3b1a80d03916855 GIT binary patch literal 1036 zcmV+n1oQhJiwFqPP(xP&|4nIlNp5UuZe>_UoC!W~yteBg$|Dgoz8p9Y^PAR%^D#UNe!HFx=l|S|P)rngBsoQQ4_A}% z5IHT3KS`2iImXxXYh>E!>vV#=cE9amJi2wxoRw19CB{oV+RCJOqLFF~xx|2vO{5tF zza6XC0njZL^znS~szqQPLcxlXn98CFP9!N&G%l#qf#bVgujQV%{Ek!QecpB(pyqq089g1w(LNmJyM$tmbhY4t;>4kb~fJGI`Q}<=>n}1#=li$`_|ghC{Tr>2SR;oPltA_JssM$wiXKYK@?Q& zf$*NS+fv468=Cjz!rJCNaewxnxbNDOM{8fF39~@jdo*SjVr&lHOQN4z{ zdPRaSSPTa%4gCPuJR6XUwTuo`z`3;*eaq_<%_{Ron%>W#`N7)5G%HVwTdre;Hr^ip zD)poM@AYs+Pca3XIp#o)qIzZ9so%@q7Y6uy2L-E0Z0`8O{9;|_}9jUZX3^t-1B z@lIbu3u{k?Zm)OuP@cAJ%Ai=m7D3V8OTM~Ok0yVsOQ5`QK2c63Nh&QAeNpx_a09H} zl2ifMgk4?Ijo4l@cA+o2eIs;r={G|AuS(l{8+NtRjo6(n_UL*znfimv`up$Hzq6yi|LgQOEjWDwZ2x73XWsz}0zlIZ G4*&qAtP67h literal 0 HcmV?d00001 diff --git a/gramps/plugins/test/Tstdata/Paris.ged b/gramps/plugins/test/Tstdata/Paris.ged new file mode 100644 index 000000000..40e77771a --- /dev/null +++ b/gramps/plugins/test/Tstdata/Paris.ged @@ -0,0 +1,275 @@ +0 HEAD +1 SOUR HEREDIS 14 PC +2 VERS 14 +2 NAME HEREDIS PC +2 CORP BSD Concept © +3 ADDR www.heredis.com +1 DATE 9 JAN 2016 +2 TIME 18:28:16 +1 GEDC +2 VERS 5.5 +2 FORM LINEAGE-LINKED +1 CHAR UTF-8 +1 PLAC +2 FORM Town , Area code , County , Region , Country, Subdivision +0 @3I@ INDI +1 NAME Arrondissements/PARIS/ +2 GIVN Arrondissements +2 SURN PARIS +1 SEX M +1 EVEN +2 TYPE Acquisition +2 TYPE Paris +2 PLAC Paris,75056,Paris,Île-de-France,FRANCE, +1 FAMS @181U@ +0 @4I@ INDI +1 NAME Églises/LUTECE/ +2 GIVN Églises +2 SURN LUTECE +1 SEX F +1 ORDN +2 TYPE Notre-Dame-de-Bonne-Nouvelle +2 PLAC Notre-Dame-de-Bonne-Nouvelle,75102,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Benoît +2 PLAC Saint-Benoît,75102,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Christophe-de-Javel +2 PLAC Saint-Christophe-de-Javel,75115,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Eustache +2 PLAC Saint-Eustache,75101,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Germain-des-Prés +2 PLAC Saint-Germain-des-Prés,75114,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Germain-L'Auxerrois +2 PLAC Saint-Germain-L'Auxerrois,75101,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Gervais-et-Protais +2 PLAC Saint-Gervais-et-Protais,75104,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Jacques-du-Haut-Pas +2 PLAC Saint-Jacques-du-Haut-Pas,75105,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Laurent +2 PLAC Saint-Laurent,75110,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Leu-Saint-Gilles +2 PLAC Saint-Leu-Saint-Gilles,75101,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Médard +2 PLAC Saint-Médard,75105,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Merri +2 PLAC Saint-Merri,75104,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Nicolas-de-Chardonnet +2 PLAC Saint-Nicolas-de-Chardonnet,75105,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Nicolas-des-Champs +2 PLAC Saint-Nicolas-des-Champs,75104,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Sauveur +2 PLAC Saint-Sauveur,75102,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Séverin +2 PLAC Saint-Séverin,75105,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Sulpice +2 PLAC Saint-Sulpice,75106,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Catédrale Notre-Dame-de-Paris +2 PLAC Notre-Dame-de-Paris,75104,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Temple Protestant de L'Oratoire du Louvre +2 PLAC Temple Protestant de L'Oratoire du Louvre,75101,Paris,Île-de-France,FRANCE, +1 ORDN +2 TYPE Saint-Paul +2 PLAC Saint-Paul-Saint-Louis,75104,Paris,Île-de-France,FRANCE, +1 FAMS @181U@ +0 @93I@ INDI +1 NAME 01 le Louvre/PARIS/ +2 GIVN 01 le Louvre +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 01,75101,Paris,Ïle-de-France,FRANCE, +1 FAMC @181U@ +0 @95I@ INDI +1 NAME 02 la Bourse/PARIS/ +2 GIVN 02 la Bourse +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 02,75102,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @98I@ INDI +1 NAME 04 Hôtel-de-Ville/PARIS/ +2 GIVN 04 Hôtel-de-Ville +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 04,75104,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @100I@ INDI +1 NAME 09 Opéra/PARIS/ +2 GIVN 09 Opéra +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 09,75109,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @102I@ INDI +1 NAME 05 Panthéon/PARIS/ +2 GIVN 05 Panthéon +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 05,75105,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @104I@ INDI +1 NAME 06 Luxembourg/PARIS/ +2 GIVN 06 Luxembourg +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 06,75106,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @106I@ INDI +1 NAME 07 Palais-Bourbon/PARIS/ +2 GIVN 07 Palais-Bourbon +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 07,75107,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @108I@ INDI +1 NAME 08 Élysée/PARIS/ +2 GIVN 08 Élysée +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 08,75108,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @110I@ INDI +1 NAME 10 Entrepôt/PARIS/ +2 GIVN 10 Entrepôt +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 10,75110,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @112I@ INDI +1 NAME 11 Popincourt/PARIS/ +2 GIVN 11 Popincourt +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 11,75111,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @114I@ INDI +1 NAME 12 Reuilly/PARIS/ +2 GIVN 12 Reuilly +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 12,75112,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @116I@ INDI +1 NAME 13 des Gobelins - la Salpêtrière/PARIS/ +2 GIVN 13 des Gobelins - la Salpêtrière +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 13,75113,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @118I@ INDI +1 NAME 14 L'Observatoire/PARIS/ +2 GIVN 14 L'Observatoire +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 14,75114,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @120I@ INDI +1 NAME 19 Buttes-Chaumont/PARIS/ +2 GIVN 19 Buttes-Chaumont +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 19,75119,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @122I@ INDI +1 NAME 15 Vaugirard/PARIS/ +2 GIVN 15 Vaugirard +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 15,75115,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @124I@ INDI +1 NAME 16 Passy/PARIS/ +2 GIVN 16 Passy +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 16,75116,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @126I@ INDI +1 NAME 17 Batignolles-Monceau/PARIS/ +2 GIVN 17 Batignolles-Monceau +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 17,75117,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @128I@ INDI +1 NAME 18 Buttes-Montmartre/PARIS/ +2 GIVN 18 Buttes-Montmartre +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 18,75118,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @134I@ INDI +1 NAME 03 Temple/PARIS/ +2 GIVN 03 Temple +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 03,75103,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @179I@ INDI +1 NAME 20 Ménilmontant/PARIS/ +2 GIVN 20 Ménilmontant +2 SURN PARIS +1 SEX M +1 BIRT +2 PLAC Paris 20,75120,Paris,Île-de-France,FRANCE, +1 FAMC @181U@ +0 @181U@ FAM +1 HUSB @3I@ +1 WIFE @4I@ +1 CHIL @93I@ +1 CHIL @95I@ +1 CHIL @98I@ +1 CHIL @100I@ +1 CHIL @102I@ +1 CHIL @104I@ +1 CHIL @106I@ +1 CHIL @108I@ +1 CHIL @110I@ +1 CHIL @112I@ +1 CHIL @114I@ +1 CHIL @116I@ +1 CHIL @118I@ +1 CHIL @120I@ +1 CHIL @122I@ +1 CHIL @124I@ +1 CHIL @126I@ +1 CHIL @128I@ +1 CHIL @134I@ +1 CHIL @179I@ +0 TRLR + diff --git a/gramps/plugins/test/Tstdata/bug 8322 test.ged b/gramps/plugins/test/Tstdata/bug 8322 test.ged new file mode 100644 index 000000000..60f5b1cce --- /dev/null +++ b/gramps/plugins/test/Tstdata/bug 8322 test.ged @@ -0,0 +1,173 @@ +0 HEAD +1 SOUR RootsMagic +2 NAME RootsMagic +2 VERS 7.0.2.2 +2 CORP RootsMagic, Inc. +3 ADDR PO Box 495 +4 CONT Springville, UT 84663 +4 CONT USA +3 PHON 1-800-ROOTSMAGIC +1 DEST RootsMagic +1 DATE 26 JAN 2015 +1 FILE rm.ged +1 GEDC +2 VERS 5.5.1 +2 FORM LINEAGE-LINKED +1 CHAR UTF-8 +0 @I310@ INDI +1 NAME Living +1 SEX M +1 _UID B9C4D3F0D254674AA1B9023745BEBFE551C1 +1 CHAN +2 DATE 26 JAN 2015 +1 RESI +2 DATE 1960 +2 PLAC the place +2 ADDR the address +3 NOTE the place created not previously used so changed to add the address; __event_addr(len==0, place is None) +1 RESI +2 DATE 1961 +2 PLAC the place +3 NOTE check that this note is retained when the place is deleted. it should be merged into place +2 ADDR the address +3 NOTE the place created and then deleted and old data reused; __event_addr(len==0, place is not None) +1 RESI +2 DATE 1962 +2 PLAC the place +3 NOTE setup the place +1 RESI +2 DATE 1962 +2 PLAC the place +2 ADDR another address +3 NOTE the place already exists; but now set doesn't match ; __event_addr(len!=0, place is None) +1 RESI +2 DATE 1963 +2 PLAC the place +2 ADDR another address +3 NOTE the place already exists but now set matches; __event_addr(len!=0, place is not None) +1 RESI +2 DATE 1964 +2 ADDR the address +2 PLAC the place +3 NOTE the address created, then destroyed as we find a matching set; __event_addr(no place_handle, create place) +1 RESI +2 DATE 1965 +2 ADDR the address +1 RESI +2 DATE 1966 +2 ADDR the address +2 PLAC the place +3 NOTE address reused, then destroyed as we find a matching set; __event_addr(no place_handle, place found) +1 RESI +2 DATE 1967 +2 PLAC the place +2 ADDR the address +2 ADDR second address +3 NOTE second address ignored +1 RESI +2 DATE 1968 +2 ADDR the address 2 +2 PLAC the place 2 +2 ADDR second address +3 NOTE second address ignored again +2 ADDR a third address ignored again +1 RESI +2 DATE 1971 +2 ADDR address place test +2 PLAC place test +3 NOTE ADDR created; __event_place finds it but place does not match; __event_place(len==0, place is None) +1 RESI +2 DATE 1972 +2 ADDR address place test +3 NOTE this note is stored with the old address and then merged into the matching place +2 PLAC place test +3 NOTE ADDR created; __event_place finds it and now place does match; __event_place(len==0, place is not None) +1 RESI +2 DATE 1973 +2 ADDR address place test +3 NOTE setup address place test +1 RESI +2 DATE 1973 +2 ADDR address place test +2 PLAC place test +3 NOTE address place test found; place exists and can be reused; __event_place(len!=0, place is not None) +1 RESI +2 DATE 1974 +2 ADDR address place test +2 PLAC different place test +3 NOTE address place test found; but matching addr/plac not found; __event_place(len!=0, place is not None) +1 RESI +2 DATE 1975 +2 PLAC the place +2 ADDR address place test +3 NOTE PLAC occurs first; matching entry found; __event_place(no place handle, place is not None) +1 RESI +2 DATE 1976 +2 PLAC a new place +2 ADDR address place test +3 NOTE PLAC occurs first; matching entry not found; __event_place(no place handle, place is None) +2 PLAC a second PLACe ignored +2 PLAC and a third one also ignored +2 ADDR plus an address just for good measure also ignored +1 RESI +2 DATE 1977 +2 ADDR address with no place +3 NOTE note is stashed with a Place, and then merged into the address +1 RESI +2 DATE 1966 +2 PLAC Woerden, Zuid-Holland, Netherlands +3 NOTE Place note +2 ADDR Kromwijkerkade 63 +1 RESI +2 DATE 1969 +2 PLAC Hasselt, Overijssel, Netherlands +2 ADDR Prinsenstraat 69 +3 NOTE ADDR note +1 RESI +2 DATE 1978 +2 PLAC Enschede, Overijssel, Netherlands +2 ADDR Calslaan 26-52 +1 RESI +2 DATE 1979 +2 PLAC Enschede, Overijssel, Netherlands +2 ADDR Calslaan 26-44 +3 NOTE PLAC previously encountered, new ADDR, so new Place +1 RESI +2 DATE 1984 +2 ADDR Calslaan 26-61 +2 PLAC Enschede, Overijssel, Netherlands +3 NOTE ADDR before PLAC (check ADDR is removed) +1 RESI +2 DATE 1984 +2 PLAC Enschede, Overijssel, Netherlands +1 RESI +2 DATE 1984 +2 ADDR Calslaan 26-61 +1 RESI +2 DATE 1984 +2 ADDR Calslaan 26-61 +2 PLAC Enschede, Overijssel, Netherlands +3 NOTE ADDR before PLAC (address matches previous one, then needs to be reassigned) +1 RESI +2 DATE 1988 +2 PLAC Amsterdam, Noord-Holland, Netherlands +2 ADDR Papendrechtstraat 37 +1 RESI +2 DATE 1994 +2 PLAC Amsterdam, Noord-Holland, Netherlands +3 NOTE PLAC and no ADDR +1 RESI +2 DATE 1994 +2 PLAC Amsterdam, Noord-Holland, Netherlands +2 ADDR Olympiaplein 46-2 +3 NOTE PLAC matches previous one, then when ADDR is read need to create a new Place +1 RESI +2 DATE 1988 +2 PLAC Amsterdam, Noord-Holland, Netherlands +2 ADDR Papendrechtstraat 37 +3 NOTE PLAC and ADDR match, use existing one +1 RESI +2 DATE 1994 +2 ADDR remembered address that should be set into place +2 PLAC Amsterdam, Noord-Holland, Netherlands +0 TRLR diff --git a/gramps/plugins/test/Tstdata/bug 8322 test.gramps b/gramps/plugins/test/Tstdata/bug 8322 test.gramps new file mode 100644 index 0000000000000000000000000000000000000000..a8219e5d1e7c9a61ccd7f63e053cf35d7b895824 GIT binary patch literal 3161 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 literal 0 HcmV?d00001 diff --git a/gramps/plugins/test/Tstdata/paris.gramps b/gramps/plugins/test/Tstdata/paris.gramps new file mode 100644 index 0000000000000000000000000000000000000000..1b780e15e9691263c297d526462bb51584e69229 GIT binary patch literal 3224 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 literal 0 HcmV?d00001 diff --git a/gramps/plugins/test/Tstdata/paris.gramps.bak b/gramps/plugins/test/Tstdata/paris.gramps.bak new file mode 100644 index 0000000000000000000000000000000000000000..618b2147b287841271bccae8032f06a9f8d98f88 GIT binary patch literal 3263 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 literal 0 HcmV?d00001 diff --git a/gramps/plugins/test/Tstdata/sample.ged b/gramps/plugins/test/Tstdata/sample.ged new file mode 100644 index 000000000..6c939a488 --- /dev/null +++ b/gramps/plugins/test/Tstdata/sample.ged @@ -0,0 +1,946 @@ +0 HEAD +1 SOUR Gramps +2 VERS 3.3.0 +2 NAME Gramps +1 DATE 27 DEC 2010 +2 TIME 15:35:24 +1 SUBM @SUBM@ +1 FILE gramps33/example/gedcom/sample.ged +1 COPR Copyright (c) 2010 Alex Roitman,,,. +1 GEDC +2 VERS 5.5 +2 FORM LINEAGE-LINKED +1 CHAR UTF-8 +1 LANG French +0 @SUBM@ SUBM +1 NAME Alex Roitman,,, +1 ADDR Not Provided +2 CONT Not Provided +2 ADR1 Not Provided +0 @I0@ INDI +1 NAME Anna /Hansdotter/ +2 GIVN Anna +2 SURN Hansdotter +1 SEX F +1 BIRT +2 TYPE Birth of Anna Hansdotter +2 DATE 2 OCT 1864 +2 PLAC Löderup, Malmöhus Län, Sweden +1 DEAT +2 TYPE Death of Anna Hansdotter +2 DATE 29 SEP 1945 +2 PLAC Sparks, Washoe Co., NV +1 FAMS @F3@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I1@ INDI +1 NAME Keith Lloyd /Smith/ +2 GIVN Keith Lloyd +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Keith Lloyd Smith +2 DATE 11 AUG 1966 +2 PLAC San Francisco, San Francisco Co., CA +1 FAMC @F8@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I10@ INDI +1 NAME Hans Peter /Smith/ +2 GIVN Hans Peter +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Hans Peter Smith +2 DATE 17 APR 1904 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Hans Peter Smith +2 DATE 29 JAN 1977 +2 PLAC San Francisco, San Francisco Co., CA +1 FAMC @F3@ +1 FAMS @F9@ +1 FAMS @F14@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I11@ INDI +1 NAME Hanna /Smith/ +2 GIVN Hanna +2 SURN Smith +1 SEX F +1 BIRT +2 TYPE Birth of Hanna Smith +2 DATE 29 JAN 1821 +2 PLAC Gladsax, Kristianstad Län, Sweden +1 FAMC @F0@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I12@ INDI +1 NAME Herman Julius /Nielsen/ +2 GIVN Herman Julius +2 SURN Nielsen +1 SEX M +1 BIRT +2 TYPE Birth of Herman Julius Nielsen +2 DATE 31 AUG 1889 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Herman Julius Nielsen +2 DATE 1945 +1 FAMS @F5@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I13@ INDI +1 NAME Evelyn /Michaels/ +2 GIVN Evelyn +2 SURN Michaels +1 SEX F +1 BIRT +2 TYPE Birth of Evelyn Michaels +2 DATE ABT 1897 +1 FAMS @F7@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I14@ INDI +1 NAME Marjorie Lee /Smith/ +2 GIVN Marjorie Lee +2 SURN Smith +1 SEX F +1 BIRT +2 TYPE Birth of Marjorie Lee Smith +2 DATE 4 NOV 1934 +2 PLAC Reno, Washoe Co., NV +1 FAMC @F6@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I15@ INDI +1 NAME Gus /Smith/ +2 GIVN Gus +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Gus Smith +2 DATE 11 SEP 1897 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Gus Smith +2 DATE 21 OCT 1963 +2 PLAC San Francisco, San Francisco Co., CA +1 FAMC @F3@ +1 FAMS @F7@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I16@ INDI +1 NAME Jennifer /Anderson/ +2 GIVN Jennifer +2 SURN Anderson +1 SEX F +1 BIRT +2 TYPE Birth of Jennifer Anderson +2 DATE 5 NOV 1907 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Jennifer Anderson +2 DATE 29 MAY 1985 +2 PLAC San Francisco, San Francisco Co., CA +1 FAMS @F14@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I17@ INDI +1 NAME Lillie Harriet /Jones/ +2 GIVN Lillie Harriet +2 SURN Jones +1 SEX F +1 BIRT +2 TYPE Birth of Lillie Harriet Jones +2 DATE 2 MAY 1910 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Lillie Harriet Jones +2 DATE 26 JUN 1990 +1 FAMS @F9@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I18@ INDI +1 NAME John Hjalmar /Smith/ +2 GIVN John Hjalmar +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of John Hjalmar Smith +2 DATE 30 JAN 1932 +2 PLAC San Francisco, San Francisco Co., CA +1 FAMC @F6@ +1 FAMS @F12@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I19@ INDI +1 NAME Eric Lloyd /Smith/ +2 GIVN Eric Lloyd +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Eric Lloyd Smith +2 DATE 28 AUG 1963 +2 PLAC San Francisco, San Francisco Co., CA +1 ADOP Y +2 FAMC @F8@ +3 ADOP BOTH +1 FAMC @F8@ +1 FAMS @F10@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I2@ INDI +1 NAME Amber Marie /Smith/ +2 GIVN Amber Marie +2 SURN Smith +1 SEX F +1 BIRT +2 TYPE Birth of Amber Marie Smith +2 DATE 12 APR 1998 +2 PLAC Hayward, Alameda Co., CA +1 CHR +2 TYPE Christening of Amber Marie Smith +2 DATE 26 APR 1998 +2 PLAC Community Presbyterian Church, Danville, CA +1 FAMC @F13@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I20@ INDI +1 NAME Carl Emil /Smith/ +2 GIVN Carl Emil +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Carl Emil Smith +2 DATE 20 DEC 1899 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Carl Emil Smith +2 DATE 28 JAN 1959 +2 PLAC Reno, Washoe Co., NV +2 CAUS Bad breath +1 FAMC @F3@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I21@ INDI +1 NAME Hjalmar /Smith/ +2 GIVN Hjalmar +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Hjalmar Smith +2 DATE 31 JAN 1893 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Hjalmar Smith +2 DATE 25 SEP 1894 +2 PLAC Rønne, Bornholm, Denmark +1 FAMC @F3@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I22@ INDI +1 NAME Martin /Smith/ +2 GIVN Martin +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Martin Smith +2 DATE 19 NOV 1830 +2 PLAC Gladsax, Kristianstad Län, Sweden +1 DEAT +2 TYPE Death of Martin Smith +2 DATE BET 1899 AND 1905 +2 PLAC Sweden +1 BAPM +2 TYPE Baptism of Martin Smith +2 DATE 23 NOV 1830 +2 PLAC Gladsax, Kristianstad Län, Sweden +1 FAMC @F0@ +1 FAMS @F2@ +1 NOTE @N0002@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I23@ INDI +1 NAME Astrid Shermanna Augusta /Smith/ +2 GIVN Astrid Shermanna Augusta +2 SURN Smith +1 SEX F +1 BIRT +2 TYPE Birth of Astrid Shermanna Augusta Smith +2 DATE 31 JAN 1889 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Astrid Shermanna Augusta Smith +2 DATE 21 DEC 1963 +2 PLAC San Francisco, San Francisco Co., CA +1 FAMC @F3@ +1 FAMS @F5@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I24@ INDI +1 NAME Gustaf /Smith/ Sr. +2 GIVN Gustaf +2 SURN Smith +2 NSFX Sr. +1 SEX M +1 BIRT +2 TYPE Birth of Gustaf Smith, Sr. +2 DATE 28 NOV 1862 +2 PLAC Grostorp, Kristianstad Län, Sweden +1 DEAT +2 TYPE Death of Gustaf Smith, Sr. +2 DATE BEF 23 JUL 1930 +2 PLAC Sparks, Washoe Co., NV +1 EVEN +2 TYPE Immi +2 DATE 21 MAY 1908 +2 PLAC Copenhagen, Denmark +1 CHR +2 TYPE Christening of Gustaf Smith, Sr. +2 DATE 7 DEC 1862 +2 PLAC Gladsax, Kristianstad Län, Sweden +1 FAMC @F2@ +1 FAMS @F3@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I25@ INDI +1 NAME Marta /Ericsdotter/ +2 GIVN Marta +2 SURN Ericsdotter +1 SEX F +1 BIRT +2 TYPE Birth of Marta Ericsdotter +2 DATE ABT 1775 +2 PLAC Sweden +1 FAMS @F1@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I26@ INDI +1 NAME Kirsti Marie /Smith/ +2 GIVN Kirsti Marie +2 SURN Smith +1 SEX F +1 BIRT +2 TYPE Birth of Kirsti Marie Smith +2 DATE 15 DEC 1886 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Kirsti Marie Smith +2 DATE 18 JUL 1966 +2 PLAC San Francisco, San Francisco Co., CA +1 FAMC @F3@ +1 FAMS @F4@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I27@ INDI +1 NAME Ingeman /Smith/ +2 GIVN Ingeman +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Ingeman Smith +2 DATE ABT 1770 +2 PLAC Sweden +1 FAMS @F1@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I28@ INDI +1 NAME Anna /Streiffert/ +2 GIVN Anna +2 SURN Streiffert +1 SEX F +1 BIRT +2 TYPE Birth of Anna Streiffert +2 DATE 23 SEP 1860 +2 PLAC Hoya/Jona/Hoia, Sweden +1 DEAT +2 TYPE Death of Anna Streiffert +2 DATE 2 FEB 1927 +2 PLAC Rønne, Bornholm, Denmark +1 FAMS @F11@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I29@ INDI +1 NAME Craig Peter /Smith/ +2 GIVN Craig Peter +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Craig Peter Smith +2 DATE AFT 1966 +2 PLAC San Francisco, San Francisco Co., CA +1 CENS +2 TYPE Census of Craig Peter Smith +2 NOTE @N0000@ +1 FAMC @F8@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I3@ INDI +1 NAME Magnes /Smith/ +2 GIVN Magnes +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Magnes Smith +2 DATE 6 OCT 1858 +2 PLAC Simrishamn, Kristianstad Län, Sweden +1 DEAT +2 TYPE Death of Magnes Smith +2 DATE 20 FEB 1910 +2 PLAC Rønne, Bornholm, Denmark +1 FAMC @F2@ +1 FAMS @F11@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I30@ INDI +1 NAME Janice Ann /Adams/ +2 GIVN Janice Ann +2 SURN Adams +1 SEX F +1 BIRT +2 TYPE Birth of Janice Ann Adams +2 DATE 26 AUG 1965 +2 PLAC Fremont, Alameda Co., CA +1 OCCU Retail Manager +1 _DEG +2 TYPE Business Management +2 DATE 1988 +1 FAMS @F13@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I31@ INDI +1 NAME Marjorie /Ohman/ +2 GIVN Marjorie +2 SURN Ohman +1 SEX F +1 BIRT +2 TYPE Birth of Marjorie Ohman +2 DATE 3 JUN 1903 +2 PLAC Denver, Denver Co., CO +1 DEAT +2 TYPE Death of Marjorie Ohman +2 DATE 22 JUN 1980 +2 PLAC Reno, Washoe Co., NV +1 FAMS @F6@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I32@ INDI +1 NAME Darcy /Horne/ +2 GIVN Darcy +2 SURN Horne +1 SEX F +1 BIRT +2 TYPE Birth of Darcy Horne +2 DATE 2 JUL 1966 +2 PLAC Sacramento, Sacramento Co., CA +1 FAMS @F10@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I33@ INDI +1 NAME Lloyd /Smith/ +2 GIVN Lloyd +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Lloyd Smith +2 DATE 13 MAR 1935 +2 PLAC San Francisco, San Francisco Co., CA +1 FAMC @F9@ +1 FAMS @F8@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I34@ INDI +1 NAME Alice Paula /Perkins/ +2 GIVN Alice Paula +2 SURN Perkins +1 SEX F +1 BIRT +2 TYPE Birth of Alice Paula Perkins +2 DATE 22 NOV 1933 +2 PLAC Sparks, Washoe Co., NV +1 FAMS @F12@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I35@ INDI +1 NAME Lars Peter /Smith/ +2 GIVN Lars Peter +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Lars Peter Smith +2 DATE 16 SEP 1991 +2 PLAC Santa Rosa, Sonoma Co., CA +1 ADOP Y +2 FAMC @F10@ +3 ADOP BOTH +1 FAMC @F10@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I36@ INDI +1 NAME Elna /Jefferson/ +2 GIVN Elna +2 SURN Jefferson +1 SEX F +1 BIRT +2 TYPE Birth of Elna Jefferson +2 DATE 14 SEP 1800 +2 PLAC Gladsax, Kristianstad Län, Sweden +1 DEAT +2 TYPE Death of Elna Jefferson +2 PLAC Sweden +1 CHR +2 TYPE Christening of Elna Jefferson +2 DATE 16 SEP 1800 +2 PLAC Gladsax, Kristianstad Län, Sweden +1 FAMS @F0@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I37@ INDI +1 NAME Edwin Michael /Smith/ +2 GIVN Edwin Michael +2 SURN Smith +2 SOUR @S1@ +1 SEX M +1 BIRT +2 TYPE Birth of Edwin Michael Smith +2 DATE 24 MAY 1961 +2 PLAC San Jose, Santa Clara Co., CA +2 SOUR @S3@ +1 OCCU Software Engineer +2 AGE 23 +2 NOTE @N0001@ +1 EDUC Education of Edwin Michael Smith +2 DATE BET 1979 AND 1984 +2 PLAC UC Berkeley +1 _DEG +2 TYPE B.S.E.E. +2 DATE 1984 +1 FAMC @F12@ +1 FAMS @F13@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I38@ INDI +1 NAME Kerstina /Hansdotter/ +2 GIVN Kerstina +2 SURN Hansdotter +1 SEX F +1 BIRT +2 TYPE Birth of Kerstina Hansdotter +2 DATE 29 NOV 1832 +2 PLAC Smestorp, Kristianstad Län, Sweden +1 DEAT +2 TYPE Death of Kerstina Hansdotter +2 DATE BEF 1908 +2 PLAC Sweden +1 FAMS @F2@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I39@ INDI +1 NAME Martin /Smith/ +2 GIVN Martin +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Martin Smith +2 DATE BET 1794 AND 1796 +2 PLAC Tommarp, Kristianstad Län, Sweden +1 DEAT +2 TYPE Death of Martin Smith +2 PLAC Sweden +1 FAMC @F1@ +1 FAMS @F0@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I4@ INDI +1 NAME Ingeman /Smith/ +2 GIVN Ingeman +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Ingeman Smith +2 DATE 29 JAN 1826 +2 PLAC Gladsax, Kristianstad Län, Sweden +1 FAMC @F0@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I40@ INDI +1 NAME Marjorie Alice /Smith/ +2 GIVN Marjorie Alice +2 SURN Smith +1 SEX F +1 BIRT +2 TYPE Birth of Marjorie Alice Smith +2 DATE 5 FEB 1960 +2 PLAC San Jose, Santa Clara Co., CA +1 FAMC @F12@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I41@ INDI +1 NAME Janis Elaine /Green/ +2 GIVN Janis Elaine +2 SURN Green +1 SEX F +1 BIRT +2 TYPE Birth of Janis Elaine Green +2 DATE 2 DEC 1935 +1 FAMS @F8@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I5@ INDI +1 NAME Mason Michael /Smith/ +2 GIVN Mason Michael +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Mason Michael Smith +2 DATE 26 JUN 1996 +2 PLAC Hayward, Alameda Co., CA +1 CHR +2 TYPE Christening of Mason Michael Smith +2 DATE 10 JUL 1996 +2 PLAC Community Presbyterian Church, Danville, CA +1 FAMC @F13@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I6@ INDI +1 NAME Edwin /Willard/ +2 GIVN Edwin +2 SURN Willard +1 SEX M +1 BIRT +2 TYPE Birth of Edwin Willard +2 DATE ABT 1886 +1 FAMS @F4@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I7@ INDI +1 NAME Ingar /Smith/ +2 GIVN Ingar +2 SURN Smith +1 SEX F +1 BIRT +2 TYPE Birth of Ingar Smith +2 DATE AFT 1823 +2 PLAC Gladsax, Kristianstad Län, Sweden +1 FAMC @F0@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I8@ INDI +1 NAME Hjalmar /Smith/ +2 GIVN Hjalmar +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Hjalmar Smith +2 DATE 7 APR 1895 +2 PLAC Rønne, Bornholm, Denmark +1 DEAT +2 TYPE Death of Hjalmar Smith +2 DATE 26 JUN 1975 +2 PLAC Reno, Washoe Co., NV +1 BAPM +2 TYPE Baptism of Hjalmar Smith +2 DATE 3 JUN 1895 +2 PLAC Rønne Bornholm, Denmark +1 EVEN +2 TYPE Immi +2 DATE 14 NOV 1912 +2 PLAC Copenhagen, Denmark +1 FAMC @F3@ +1 FAMS @F6@ +1 NOTE @N0003@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @I9@ INDI +1 NAME Emil /Smith/ +2 GIVN Emil +2 SURN Smith +1 SEX M +1 BIRT +2 TYPE Birth of Emil Smith +2 DATE 27 SEP 1860 +2 PLAC Simrishamn, Kristianstad Län, Sweden +1 FAMC @F2@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F0@ FAM +1 HUSB @I39@ +1 WIFE @I36@ +1 MARR +2 TYPE Marriage of Martin Smith and Elna Jefferson +2 DATE ABT 1816 +2 PLAC Gladsax, Kristianstad Län, Sweden +1 CHIL @I11@ +1 CHIL @I7@ +1 CHIL @I4@ +1 CHIL @I22@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F1@ FAM +1 HUSB @I27@ +1 WIFE @I25@ +1 MARR +2 TYPE Marriage of Ingeman Smith and Marta Ericsdotter +2 DATE ABT 1790 +2 PLAC Sweden +1 CHIL @I39@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F10@ FAM +1 HUSB @I19@ +1 WIFE @I32@ +1 MARR +2 TYPE Marriage of Eric Lloyd Smith and Darcy Horne +2 DATE 12 JUL 1986 +2 PLAC Woodland, Yolo Co., CA +1 CHIL @I35@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F11@ FAM +1 HUSB @I3@ +1 WIFE @I28@ +1 MARR +2 TYPE Marriage of Magnes Smith and Anna Streiffert +2 DATE 24 AUG 1884 +2 PLAC Rønne, Bornholm, Denmark +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F12@ FAM +1 HUSB @I18@ +1 WIFE @I34@ +1 MARR +2 TYPE Marriage of John Hjalmar Smith and Alice Paula Perkins +2 DATE 4 JUN 1954 +2 PLAC Sparks, Washoe Co., NV +2 SOUR @S0@ +1 CHIL @I40@ +1 CHIL @I37@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F13@ FAM +1 HUSB @I37@ +1 WIFE @I30@ +1 MARR +2 TYPE Marriage of Edwin Michael Smith and Janice Ann Adams +2 DATE 27 MAY 1995 +2 PLAC San Ramon, Conta Costa Co., CA +1 ENGA +2 TYPE Engagement of Edwin Michael Smith and Janice Ann Adams +2 DATE 5 OCT 1994 +2 PLAC San Francisco, San Francisco Co., CA +1 CHIL @I5@ +1 CHIL @I2@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F14@ FAM +1 HUSB @I10@ +1 WIFE @I16@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F2@ FAM +1 HUSB @I22@ +1 WIFE @I38@ +1 MARR +2 TYPE Marriage of Martin Smith and Kerstina Hansdotter +2 DATE ABT 1856 +1 CHIL @I3@ +1 CHIL @I9@ +1 CHIL @I24@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F3@ FAM +1 HUSB @I24@ +1 WIFE @I0@ +1 MARR +2 TYPE Marriage of Gustaf Smith, Sr. and Anna Hansdotter +2 DATE 27 NOV 1885 +2 PLAC Rønne, Bornholm, Denmark +1 CHIL @I26@ +1 CHIL @I23@ +1 CHIL @I21@ +1 CHIL @I8@ +1 CHIL @I15@ +1 CHIL @I20@ +1 CHIL @I10@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F4@ FAM +1 HUSB @I6@ +1 WIFE @I26@ +1 MARR +2 TYPE Marriage of Edwin Willard and Kirsti Marie Smith +2 DATE ABT 1910 +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F5@ FAM +1 HUSB @I12@ +1 WIFE @I23@ +1 MARR +2 TYPE Marriage of Herman Julius Nielsen and Astrid Shermanna Augusta Smith +2 DATE 30 NOV 1912 +2 PLAC Rønne, Bornholm, Denmark +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F6@ FAM +1 HUSB @I8@ +1 WIFE @I31@ +1 MARR +2 TYPE Marriage of Hjalmar Smith and Marjorie Ohman +2 DATE 31 OCT 1927 +2 PLAC Reno, Washoe Co., NV +1 CHIL @I18@ +1 CHIL @I14@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F7@ FAM +1 HUSB @I15@ +1 WIFE @I13@ +1 MARR +2 TYPE Marriage of Gus Smith and Evelyn Michaels +2 DATE ABT 1920 +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F8@ FAM +1 HUSB @I33@ +1 WIFE @I41@ +1 MARR +2 TYPE Marriage of Lloyd Smith and Janis Elaine Green +2 DATE 10 AUG 1958 +2 PLAC San Francisco, San Francisco Co., CA +1 CHIL @I19@ +1 CHIL @I1@ +1 CHIL @I29@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @F9@ FAM +1 HUSB @I10@ +1 WIFE @I17@ +1 CHIL @I33@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @S0@ SOUR +1 TITL Marriage Certificae +1 REPO @R0002@ +2 CALN what-321-ever +3 MEDI Photo +1 NOTE @N0004@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @S1@ SOUR +1 TITL Birth Certificate +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @S2@ SOUR +1 TITL Birth Records +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @S3@ SOUR +1 TITL Birth, Death and Marriage Records +1 REPO @R0002@ +2 CALN CA-123-LL-456_Num/ber +3 MEDI Film +1 NOTE @N0005@ +1 CHAN +2 DATE 21 DEC 2007 +3 TIME 01:35:26 +0 @R0002@ REPO +1 NAME New York Public Library +1 ADDR 5th Ave at 42 street +2 ADR1 5th Ave at 42 street +2 CITY New York +2 STAE New York +2 POST 11111 +2 CTRY USA +0 @R0003@ REPO +1 NAME Aunt Martha's Attic +1 ADDR 123 Main St +2 ADR1 123 Main St +2 CITY Someville +2 STAE ST +2 CTRY USA +1 WWW http://library.gramps-project.org +1 NOTE @N0006@ +0 @N0000@ NOTE Witness name: John Doe +1 CONT Witness comment: This is a simple test. +0 @N0001@ NOTE Witness name: No Name +0 @N0002@ NOTE BIOGRAPHY +1 CONT Martin was listed as being a Husman, (owning a house as opposed to a far +1 CONC m) in the house records of Gladsax. +0 @N0003@ NOTE BIOGRAPHY +1 CONT +1 CONT Hjalmar sailed from Copenhagen, Denmark on the OSCAR II, 14 November 191 +1 CONC 2 arriving in New York 27 November 1912. He was seventeen years old. O +1 CONC n the ship passenger list his trade was listed as a Blacksmith. He cam +1 CONC e to Reno, Nevada and lived with his sister Marie for a time before sett +1 CONC ling in Sparks. He worked for Southern Pacific Railroad as a car inspect +1 CONC or for a time, then went to work for Standard Oil +1 CONT Company. He enlisted in the army at Sparks 7 December 1917 and served a +1 CONC s a Corporal in the Medical Corp until his discharge 12 August 1919 at t +1 CONC he Presidio in San Francisco, California. Both he and Marjorie are burie +1 CONC d in the Masonic Memorial Gardens Mausoleum in Reno, he the 30th June 19 +1 CONC 75, and she the 25th of June 1980. +0 @N0004@ NOTE But Aunt Martha still keeps the original! +0 @N0005@ NOTE The repository reference from the source is important +0 @N0006@ NOTE Some note on the repo +0 TRLR diff --git a/gramps/plugins/test/Tstdata/sample.gramps b/gramps/plugins/test/Tstdata/sample.gramps new file mode 100644 index 0000000000000000000000000000000000000000..d585fdb3b79dd9fd3b65e7f73bd054de723ee04d GIT binary patch literal 6473 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 literal 0 HcmV?d00001 diff --git a/gramps/plugins/test/Tstdata/test_FTM_CONC.ged b/gramps/plugins/test/Tstdata/test_FTM_CONC.ged new file mode 100644 index 000000000..4baf739dc --- /dev/null +++ b/gramps/plugins/test/Tstdata/test_FTM_CONC.ged @@ -0,0 +1,42 @@ +0 HEAD +1 SOUR FTM +2 VERS Family Tree Maker (22.2.5) +2 NAME Family Tree Maker for Mac OS X +2 CORP Ancestry.com +3 ADDR 360 W 4800 N +4 CONT Provo, UT 84604 +3 PHON (801) 705-7000 +1 DEST GED55 +1 DATE 16 DEC 2015 +1 CHAR UTF-8 +1 FILE test_FTM_CONC.ged +1 SUBM @SUBM@ +1 GEDC +2 VERS 5.5 +2 FORM LINEAGE-LINKED +0 @SUBM@ SUBM +1 NAME Paul Culley +0 @I278@ INDI +1 NAME Andrew /May/ +2 NOTE The FTM way to do a CONC line with space at end --> +3 CONC <-- +2 NOTE The GEDCOM spec way to do CONC line, with space at beginning --> +3 CONC <-- +2 NOTE Be nice if we supported FTM way to do CONC so +3 CONC users would not have to spell check and edit their whole +3 CONC database for these kind of errors. +2 SOUR @S29@ +3 PAGE Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: +4 CONC M432_394; Page: 435B; Image: 248 +0 @S29@ SOUR +1 AUTH Ancestry.com +1 TITL 1850 United States Federal Census +1 PUBL Name: Ancestry.com Operations, Inc.; Location: Provo, UT, USA; Date: +2 CONC 2009; +1 REPO @R1@ +0 @R1@ REPO +1 NAME Ancestry.com +1 ADDR I'm sure someone knows +1 EMAIL ancestry@ancestry.com +1 PHON 1-234-567-8901 +0 TRLR diff --git a/gramps/plugins/test/Tstdata/test_FTM_CONC.gramps b/gramps/plugins/test/Tstdata/test_FTM_CONC.gramps new file mode 100644 index 0000000000000000000000000000000000000000..98d329aa0fd35caadd1826c1181887106d2be281 GIT binary patch literal 1051 zcmV+$1myc4iwFp%EJIfU|8!+@bYDhPOA)cRre zCB_(>8yL?fkVHr!K@%d)JdHYbfqP@zR(Cs0{(j3g?S|ZTq=^*urK+n=ow}It>#ubN z&nOia`N;7*T?a6aMZ)vd$az>?xu?$8=pg)SayMT5m|sG|G<#$UVg7J&GaZBDdfv5U z>q2?nWHEte58r1u;CD_szUN)uItNawbusX~RV{T3DgMP+cZ6JdrA z{P|{eAST(0M1F7_bP2vs$aykyrrqAjsndd5VO}|S2)*sj2r5*dUkWmD!KF^&mM+?N zq_E^t>F7L9ByK{lIa#SHWgXXyQIO_f#ktTZaS3V0^CyeHXI8`GXUcuE{*H2B);;Bz zYo;le?>sm*t9=l9yQykY(4@)crZuTd9c|BVa%CNSn5%Imx4A0V3ZoxX9|Q1DkGew` zW3EaC^NhtffC*Px@>qi(9Kx6t2-jRPnIJ0M4CLzu4XLoYa`m@03^bu98FPpHQ+>V@9U$tYCDw_3 z$3QiMu;DbwRYBtdn5Iv50_!IQ@gYYT(-sk8q5OPka_!2f$k!3+0S`C-|6x5L@0i~jE z25dx`B|xAE(=%2o6nK^q42++EU;=fq2Av|8ut`OR_V?3L$Vx!FCr*lD2`HtIs`GyE V&5p`0^o)t<;6D;*9Spt+004Rs1y}$8 literal 0 HcmV?d00001 diff --git a/gramps/plugins/test/Tstdata/vcard.difs b/gramps/plugins/test/Tstdata/vcard.difs new file mode 100644 index 000000000..b8b8bf512 --- /dev/null +++ b/gramps/plugins/test/Tstdata/vcard.difs @@ -0,0 +1,5 @@ +Mismatch on file: vcard.vcf +Person: I0019 + Diff on: Person, primary_name, surname list #2, primary + : True + : False diff --git a/gramps/plugins/test/Tstdata/vcard.gramps b/gramps/plugins/test/Tstdata/vcard.gramps new file mode 100644 index 0000000000000000000000000000000000000000..04ec7a637bb5cc3250e2a1d4fa89944baa5ba3e5 GIT binary patch literal 1425 zcmV;C1#bEuiwFpGmONJi|8`?xa%3)Na$#+7a{%32U2~&06n)=cq4Ls~wPgt~xP#es zve`DBe9bhO={|L2kYgGQ9)aWJ-&X=(hosp%N$fZz`;a5)O7c1Pii;3z@a1Nfl544o zB+rHx>-H=nvnY>~>~d&boPY25)|c>8@XNQ;{qrAZ2P77y7>h!Zvx~i>!+m0PDE(cD z*}S0i+xa(Am&xD9M}&2~E~E6|#QJ1S%X0o3rI(epGgtY)GAg^dx}^H|Y2C9n>UuXW zV@v<&`nPmjRt%psi5^EtFqI;f$`o}aQc{#MHq_y^xO{ftvlT{>(Sw9-|0AA z-enzb(baGz3n^4Ih572HOw43>CKf5#U!^VqUzBY5hdkqc%IM3B2B9fRYRjgQEC<8`Auc4E6w5gA}iHxc=6Y$9=)nJy3BJu zDh)l)_S~w^s-e+E&P0-ib1hDB&-cDwntC_NXI1~&TKk6HcTPa>93RMQnU%$=V^twj zk;SQw!9TtFp9^S_NZT&8i8+1S^?k?T7D?ivbztn)nq7H2m*HNb%4tBWG8jy7uZ3R9 zA~iAYu}*K$;r=>`v|@m=@d0r*Y&UEKAkK#GhD`*Bv$1!=hI2rijq`xbX%sEyqSROX zLrVHeQOVp`!Xgq%Mk-$hwAuV*ZUaD^oBKph6{V^@wa6wq)5%hf`VSz|z)Q2)7v zOz3n729I!A6|0Lsn9F>guIA7cRpierLXy)6M8+N`H{gjYI3~ee#2G+X?7{WKQpq*XGLo zcq}*|9t*bfSUios4T#g{ty)SiUO+F3umgy@$bN?|`uylMhFwE1@?akj_n`9@9;{NY zk`ppblkDoz&6diIm@}2kgu1=U-%nBQ0piNtmS%?mAWpyEroc7!r5glp42UcD+N8X( z2i`z=42UcD+oZg)-`+sE1jLmO-a`38rG!ki^r1DAU*(N{08gcPn739xbI>sln$HtF z0Yn9}t?VNwi7Lu)MD_w&7aR8*{q!E{_6lD!pRM=JJzOw*Wx=nYi~-`x`1@1F0dZya zR+W+cw_K(+ATHV2qU4=~(gDPEx$jMv3yACLzc*cdKwOvi{*sCZh%58Ar)-amev(o~ zyGSWMATD?}dz(l4@GWQ@0HPXsubmHDOaS8aTY8ej#(+5eZJs2Nx!w>bH$&@MWF-F8 z3P-7&jioBLASVLEuc%Z4VwVs^xx$0rkYTsrKV(|6K6?uW$us_Zey;!&-*{0 z?MaSZpZMcXk=$#)W6#aIz0I7#0C8vd?Yv014T#epwCJ>}`9AmMr(N6uM3vhu-7Rq! z5U0=D@m6L&%`+MH%v;Bf+xPr|7FjiI@LGlU0dW`bmPXJ6#Od2_eB8SFjB2@DcH!7H z%4d*VFS4sFUuMs{^n5^Exzp0X2|%2_+oqh^_|9a5oEZV)%G>lltocF92FhbVT)EfM zB`X1O`di(ljIz9(O0@;{6F{8(;N#xw)}N{1dv2%qfnC4=aTm1oe8}d2IDP(sBWMHS zF0fk~K?e}0-_mW1?E>QT-4DC~`+&F$`Yny12Z+=6T6q_@eL$SO|AE)v01$V>g3<@yuyfWm(X3P1e^m{yGGx- Date: Thu, 26 May 2016 11:22:06 -0500 Subject: [PATCH 09/12] moved test directory, tweaked tests, and fixes --- .../tests}/FTM_16dec2015a-mod1.ged | 0 .../tests}/FTM_16dec2015a-mod1.gramps | Bin .../tests}/MixInlineXrefNote.ged | 10 ------ data/tests/MixInlineXrefNote.gramps | Bin 0 -> 748 bytes .../test/Tstdata => data/tests}/Paris.ged | 1 - .../Tstdata => data/tests}/bug 8322 test.ged | 0 .../tests}/bug 8322 test.gramps | Bin .../test/Tstdata => data/tests}/paris.gramps | Bin .../test/Tstdata => data/tests}/sample.ged | 0 .../test/Tstdata => data/tests}/sample.gramps | Bin data/tests/test_FTM_CONC.difs | 17 ++++++++++ .../Tstdata => data/tests}/test_FTM_CONC.ged | 0 .../tests}/test_FTM_CONC.gramps | Bin .../test/Tstdata => data/tests}/vcard.difs | 2 +- .../test/Tstdata => data/tests}/vcard.gramps | Bin .../test/Tstdata => data/tests}/vcard.vcf | 0 gramps/gen/utils/id.py | 2 +- gramps/plugins/lib/libgedcom.py | 4 +-- .../test/Tstdata/MixInlineXrefNote.gramps | Bin 1036 -> 0 bytes gramps/plugins/test/Tstdata/paris.gramps.bak | Bin 3263 -> 0 bytes gramps/plugins/test/test_imports.py | 31 ++++++++++-------- 21 files changed, 39 insertions(+), 28 deletions(-) rename {gramps/plugins/test/Tstdata => data/tests}/FTM_16dec2015a-mod1.ged (100%) rename {gramps/plugins/test/Tstdata => data/tests}/FTM_16dec2015a-mod1.gramps (100%) rename {gramps/plugins/test/Tstdata => data/tests}/MixInlineXrefNote.ged (81%) create mode 100644 data/tests/MixInlineXrefNote.gramps rename {gramps/plugins/test/Tstdata => data/tests}/Paris.ged (99%) rename {gramps/plugins/test/Tstdata => data/tests}/bug 8322 test.ged (100%) rename {gramps/plugins/test/Tstdata => data/tests}/bug 8322 test.gramps (100%) rename {gramps/plugins/test/Tstdata => data/tests}/paris.gramps (100%) rename {gramps/plugins/test/Tstdata => data/tests}/sample.ged (100%) rename {gramps/plugins/test/Tstdata => data/tests}/sample.gramps (100%) create mode 100644 data/tests/test_FTM_CONC.difs rename {gramps/plugins/test/Tstdata => data/tests}/test_FTM_CONC.ged (100%) rename {gramps/plugins/test/Tstdata => data/tests}/test_FTM_CONC.gramps (100%) rename {gramps/plugins/test/Tstdata => data/tests}/vcard.difs (77%) rename {gramps/plugins/test/Tstdata => data/tests}/vcard.gramps (100%) rename {gramps/plugins/test/Tstdata => data/tests}/vcard.vcf (100%) delete mode 100644 gramps/plugins/test/Tstdata/MixInlineXrefNote.gramps delete mode 100644 gramps/plugins/test/Tstdata/paris.gramps.bak diff --git a/gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.ged b/data/tests/FTM_16dec2015a-mod1.ged similarity index 100% rename from gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.ged rename to data/tests/FTM_16dec2015a-mod1.ged diff --git a/gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.gramps b/data/tests/FTM_16dec2015a-mod1.gramps similarity index 100% rename from gramps/plugins/test/Tstdata/FTM_16dec2015a-mod1.gramps rename to data/tests/FTM_16dec2015a-mod1.gramps diff --git a/gramps/plugins/test/Tstdata/MixInlineXrefNote.ged b/data/tests/MixInlineXrefNote.ged similarity index 81% rename from gramps/plugins/test/Tstdata/MixInlineXrefNote.ged rename to data/tests/MixInlineXrefNote.ged index 679c9ca90..857806f48 100644 --- a/gramps/plugins/test/Tstdata/MixInlineXrefNote.ged +++ b/data/tests/MixInlineXrefNote.ged @@ -21,24 +21,14 @@ 1 NOTE @N0@ 1 NOTE Inline 1 1 SOUR Inline Source 1 -1 OBJE -2 FILE Inline1 -2 FORM jpg 0 @N0@ NOTE 1 CONC XREF N0 0 @I01@ INDI 1 NAME Living01 1 SEX M 1 SOUR inline Source 2 -1 OBJE -2 FILE Inline2 -3 FORM jpg 0 @S1@ SOUR 1 TITL Source S1 0 @S01@ SOUR 1 TITL Source S01 -0 @O1@ OBJE -1 FILE XREF1 -0 @O1@ OBJE -1 FILE XREF2 0 TRLR diff --git a/data/tests/MixInlineXrefNote.gramps b/data/tests/MixInlineXrefNote.gramps new file mode 100644 index 0000000000000000000000000000000000000000..b1367cbd184b81a96cba7e366521f1b493a4a971 GIT binary patch literal 748 zcmV_$RMF2x@fD_6)l27IhDbr5_vQHcYf z8!Xu4MgLugKpjHig3*M@atTf>8C5JPsk6T0d!*O#x*fmk*uJ~22c6@(K(c~S886HU zdW+K~izalHp}{K4*gC{!vynuTL`H=8#6u5R!q9!n75X7o(8P#W6;(!~B2Lvhnu+Bz z&9W+?+Gr#c3V27ew<@TeX1Q2#CD+m8^t-OE{YFYIpel=k;56t~IrT;(g)M2CML9Gl z{op+KHZOfQ7RxGMN3}M1TbvMEsl%L!JgeD(BMZUNg7PE-*?)WbM~rn)46!+c$XV}< zT#()c%wC%GonaN;(3>+}0^EnVUYS6tJyPo&j<`ytTA(p(Z0aE4C6$GWM(HaIGYPSF zO*P)SIxZBG>;)~dl>fDCePhjR98Nto_IT=%Vf;hBU&tYp0J zUc1Ix`i9prnzr*+n&dNRo*TQLru8au>vN3I+S}o8TR+HuT1~vAr&0x%Ipjc&p{YI= zMyKAdiD|fYY}-#Oc6SFm-NN=if=!KW$M$!yYtZS3I({~`9rg4es@DQ**829#C(PV^ zx!&PopU8t;#?=Q_KOlFEGf6W`O|ds+#=r}4<<_K1z&33A=C)#!cI>C0H@9f~pV0OV eZ-w^X)i&9WtyiFah|OQ2=;R-cfEPNl2><}Yb9PJs literal 0 HcmV?d00001 diff --git a/gramps/plugins/test/Tstdata/Paris.ged b/data/tests/Paris.ged similarity index 99% rename from gramps/plugins/test/Tstdata/Paris.ged rename to data/tests/Paris.ged index 40e77771a..02cc9bc89 100644 --- a/gramps/plugins/test/Tstdata/Paris.ged +++ b/data/tests/Paris.ged @@ -272,4 +272,3 @@ 1 CHIL @134I@ 1 CHIL @179I@ 0 TRLR - diff --git a/gramps/plugins/test/Tstdata/bug 8322 test.ged b/data/tests/bug 8322 test.ged similarity index 100% rename from gramps/plugins/test/Tstdata/bug 8322 test.ged rename to data/tests/bug 8322 test.ged diff --git a/gramps/plugins/test/Tstdata/bug 8322 test.gramps b/data/tests/bug 8322 test.gramps similarity index 100% rename from gramps/plugins/test/Tstdata/bug 8322 test.gramps rename to data/tests/bug 8322 test.gramps diff --git a/gramps/plugins/test/Tstdata/paris.gramps b/data/tests/paris.gramps similarity index 100% rename from gramps/plugins/test/Tstdata/paris.gramps rename to data/tests/paris.gramps diff --git a/gramps/plugins/test/Tstdata/sample.ged b/data/tests/sample.ged similarity index 100% rename from gramps/plugins/test/Tstdata/sample.ged rename to data/tests/sample.ged diff --git a/gramps/plugins/test/Tstdata/sample.gramps b/data/tests/sample.gramps similarity index 100% rename from gramps/plugins/test/Tstdata/sample.gramps rename to data/tests/sample.gramps diff --git a/data/tests/test_FTM_CONC.difs b/data/tests/test_FTM_CONC.difs new file mode 100644 index 000000000..c372c4222 --- /dev/null +++ b/data/tests/test_FTM_CONC.difs @@ -0,0 +1,17 @@ +Mismatch on file: test_FTM_CONC.ged +Source: S0029 handle=0000000500000005 + Diff on: Source, pubinfo + 73: Name: Ancestry.com Operations, Inc.; Location: Provo, UT, USA; Date:2009; + 74: Name: Ancestry.com Operations, Inc.; Location: Provo, UT, USA; Date: 2009; +Citation: C0000 handle=0000000600000006 + Diff on: Citation, page + 102: Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll:M432_394; Page: 435B; Image: 248 + 103: Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248 +Note: N0000 handle=0000000200000002 + Diff on: Note, text, string + 54: The FTM way to do a CONC line with space at end --><-- + 55: The FTM way to do a CONC line with space at end --> <-- +Note: N0002 handle=0000000400000004 + Diff on: Note, text, string + 136: Be nice if we supported FTM way to do CONC sousers would not have to spell check and edit their whole database for these kind of errors. + 137: Be nice if we supported FTM way to do CONC so users would not have to spell check and edit their whole database for these kind of errors. diff --git a/gramps/plugins/test/Tstdata/test_FTM_CONC.ged b/data/tests/test_FTM_CONC.ged similarity index 100% rename from gramps/plugins/test/Tstdata/test_FTM_CONC.ged rename to data/tests/test_FTM_CONC.ged diff --git a/gramps/plugins/test/Tstdata/test_FTM_CONC.gramps b/data/tests/test_FTM_CONC.gramps similarity index 100% rename from gramps/plugins/test/Tstdata/test_FTM_CONC.gramps rename to data/tests/test_FTM_CONC.gramps diff --git a/gramps/plugins/test/Tstdata/vcard.difs b/data/tests/vcard.difs similarity index 77% rename from gramps/plugins/test/Tstdata/vcard.difs rename to data/tests/vcard.difs index b8b8bf512..35b0519ee 100644 --- a/gramps/plugins/test/Tstdata/vcard.difs +++ b/data/tests/vcard.difs @@ -1,5 +1,5 @@ Mismatch on file: vcard.vcf -Person: I0019 +Person: I0019 handle=0000001800000018 Diff on: Person, primary_name, surname list #2, primary : True : False diff --git a/gramps/plugins/test/Tstdata/vcard.gramps b/data/tests/vcard.gramps similarity index 100% rename from gramps/plugins/test/Tstdata/vcard.gramps rename to data/tests/vcard.gramps diff --git a/gramps/plugins/test/Tstdata/vcard.vcf b/data/tests/vcard.vcf similarity index 100% rename from gramps/plugins/test/Tstdata/vcard.vcf rename to data/tests/vcard.vcf diff --git a/gramps/gen/utils/id.py b/gramps/gen/utils/id.py index 06852d3c7..d6587fbf5 100644 --- a/gramps/gen/utils/id.py +++ b/gramps/gen/utils/id.py @@ -10,7 +10,7 @@ # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. diff --git a/gramps/plugins/lib/libgedcom.py b/gramps/plugins/lib/libgedcom.py index cfdde921d..d7e2059bb 100755 --- a/gramps/plugins/lib/libgedcom.py +++ b/gramps/plugins/lib/libgedcom.py @@ -92,7 +92,7 @@ import re import time import codecs from xml.parsers.expat import ParserCreate -from collections import defaultdict +from collections import defaultdict, OrderedDict import string from io import StringIO from urllib.parse import urlparse @@ -1896,7 +1896,7 @@ class GedcomParser(UpdateCallback): self.fams_map = stage_one.get_fams_map() self.place_parser = PlaceParser() - self.inline_srcs = {} + self.inline_srcs = OrderedDict() self.media_map = {} self.genby = "" self.genvers = "" diff --git a/gramps/plugins/test/Tstdata/MixInlineXrefNote.gramps b/gramps/plugins/test/Tstdata/MixInlineXrefNote.gramps deleted file mode 100644 index eae98ab4a08209c50e92531ad3b1a80d03916855..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1036 zcmV+n1oQhJiwFqPP(xP&|4nIlNp5UuZe>_UoC!W~yteBg$|Dgoz8p9Y^PAR%^D#UNe!HFx=l|S|P)rngBsoQQ4_A}% z5IHT3KS`2iImXxXYh>E!>vV#=cE9amJi2wxoRw19CB{oV+RCJOqLFF~xx|2vO{5tF zza6XC0njZL^znS~szqQPLcxlXn98CFP9!N&G%l#qf#bVgujQV%{Ek!QecpB(pyqq089g1w(LNmJyM$tmbhY4t;>4kb~fJGI`Q}<=>n}1#=li$`_|ghC{Tr>2SR;oPltA_JssM$wiXKYK@?Q& zf$*NS+fv468=Cjz!rJCNaewxnxbNDOM{8fF39~@jdo*SjVr&lHOQN4z{ zdPRaSSPTa%4gCPuJR6XUwTuo`z`3;*eaq_<%_{Ron%>W#`N7)5G%HVwTdre;Hr^ip zD)poM@AYs+Pca3XIp#o)qIzZ9so%@q7Y6uy2L-E0Z0`8O{9;|_}9jUZX3^t-1B z@lIbu3u{k?Zm)OuP@cAJ%Ai=m7D3V8OTM~Ok0yVsOQ5`QK2c63Nh&QAeNpx_a09H} zl2ifMgk4?Ijo4l@cA+o2eIs;r={G|AuS(l{8+NtRjo6(n_UL*znfimv`up$Hzq6yi|LgQOEjWDwZ2x73XWsz}0zlIZ G4*&qAtP67h diff --git a/gramps/plugins/test/Tstdata/paris.gramps.bak b/gramps/plugins/test/Tstdata/paris.gramps.bak deleted file mode 100644 index 618b2147b287841271bccae8032f06a9f8d98f88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3263 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 diff --git a/gramps/plugins/test/test_imports.py b/gramps/plugins/test/test_imports.py index 49f879550..05e1cf417 100644 --- a/gramps/plugins/test/test_imports.py +++ b/gramps/plugins/test/test_imports.py @@ -30,10 +30,10 @@ from gramps.gen.merge.diff import diff_dbs, import_as_dict from gramps.gen.simple import SimpleAccess from gramps.gen.utils.id import set_det_id from gramps.cli import user -from gramps.gen.const import TEMP_DIR +from gramps.gen.const import TEMP_DIR, DATA_DIR # the following defines where to find the test import and result files -TEST_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "Tstdata")) +TEST_DIR = os.path.abspath(os.path.join(DATA_DIR, "tests")) # ------------------------------------------------------------------ # Local Functions @@ -57,7 +57,9 @@ class CompleteCheck(unittest.TestCase): item2.to_struct()) if msg != "": if hasattr(item1, "gramps_id"): - self.msg += "%s: %s\n" % (obj_type, item1.gramps_id) + self.msg += "%s: %s handle=%s\n" % \ + (obj_type, item1.gramps_id, + getattr(item1, "handle")) else: self.msg += "%s: %s\n" % (obj_type, item1.get_name()) self.msg += msg @@ -153,20 +155,25 @@ class CompleteCheck(unittest.TestCase): # The following make_test_function creates a test function (a method, # to be precise) that compares the import file with the expected # result '.gramps' file. -def make_test_function(tstfile, fname): - def test(self): +def make_tst_function(tstfile, fname): + def tst(self): self._user = user.User(quiet=True) f1 = os.path.join(TEST_DIR, tstfile) f2 = os.path.join(TEST_DIR, (fname + ".gramps")) fres = os.path.join(TEMP_DIR, (fname + ".difs")) + try: + os.remove(fres) + except OSError: + pass + print("\n**** %s ****" % tstfile) set_det_id(True) self.database1 = import_as_dict(f1, self._user) set_det_id(True) self.database2 = import_as_dict(f2, self._user) self.assertIsNotNone(self.database1, - "Unable to import file: %s" % f1) + "Unable to import file: %s" % f1) self.assertIsNotNone(self.database2, - "Unable to import expected result file: %s" % f2) + "Unable to import expected result file: %s" % f2) if self.database2 is None or self.database1 is None: return diffs, added, missing = diff_dbs(self.database1, @@ -191,7 +198,7 @@ def make_test_function(tstfile, fname): # if exception file matches exactly, we are done. if self.msg != msg: self.fail(self.msg) - return test + return tst # let's see if we have a single file to run, example; # "python test_import.py -i sample.ged" @@ -208,7 +215,7 @@ if __name__ == "__main__": # via the modules' globals, taking advantage that they are a dict. if tstfile: # single file mode (fname, ext) = os.path.splitext(os.path.basename(tstfile)) - test_func = make_test_function(tstfile, fname) + test_func = make_tst_function(tstfile, fname) clname = 'Import_{0}'.format(tstfile) globals()[clname] = type(clname, (CompleteCheck,), @@ -216,12 +223,10 @@ if tstfile: # single file mode # {"test:" + fname: test_func}) else: for tstfile in os.listdir(TEST_DIR): - print(tstfile) - (fname, ext) = os.path.splitext(os.path.basename(tstfile)) - if ext == ".gramps" or ext == ".difs": + if ext == ".gramps" or ext == ".difs" or ext == ".bak": continue - test_func = make_test_function(tstfile, fname) + test_func = make_tst_function(tstfile, fname) clname = 'Import_{0}'.format(tstfile) globals()[clname] = type(clname, (CompleteCheck,), From edd9dda7cedacb63cdcc457b6285c12ff8e0f54f Mon Sep 17 00:00:00 2001 From: prculley Date: Thu, 26 May 2016 14:04:15 -0500 Subject: [PATCH 10/12] changed 'print' to 'logging.info' --- gramps/plugins/test/test_imports.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gramps/plugins/test/test_imports.py b/gramps/plugins/test/test_imports.py index 05e1cf417..79d6bb2f6 100644 --- a/gramps/plugins/test/test_imports.py +++ b/gramps/plugins/test/test_imports.py @@ -24,7 +24,7 @@ import os import sys import re import time - +import logging from gramps.gen.merge.diff import diff_dbs, import_as_dict from gramps.gen.simple import SimpleAccess @@ -32,6 +32,8 @@ from gramps.gen.utils.id import set_det_id from gramps.cli import user from gramps.gen.const import TEMP_DIR, DATA_DIR +logger = logging.getLogger(__name__) + # the following defines where to find the test import and result files TEST_DIR = os.path.abspath(os.path.join(DATA_DIR, "tests")) @@ -165,7 +167,7 @@ def make_tst_function(tstfile, fname): os.remove(fres) except OSError: pass - print("\n**** %s ****" % tstfile) + logging.info("\n**** %s ****" % tstfile) set_det_id(True) self.database1 = import_as_dict(f1, self._user) set_det_id(True) @@ -220,7 +222,6 @@ if tstfile: # single file mode globals()[clname] = type(clname, (CompleteCheck,), {"testit": test_func}) -# {"test:" + fname: test_func}) else: for tstfile in os.listdir(TEST_DIR): (fname, ext) = os.path.splitext(os.path.basename(tstfile)) @@ -231,7 +232,6 @@ else: globals()[clname] = type(clname, (CompleteCheck,), {"testit": test_func}) -# {"test:" + fname: test_func}) if __name__ == "__main__": From 4d60d19fd97e029de6d2c859f65541380236ac1a Mon Sep 17 00:00:00 2001 From: prculley Date: Mon, 30 May 2016 08:49:05 -0500 Subject: [PATCH 11/12] improving the pylint score --- data/tests/{paris.gramps => Paris.gramps} | Bin gramps/plugins/test/test_imports.py | 182 ++++++++++++---------- 2 files changed, 96 insertions(+), 86 deletions(-) rename data/tests/{paris.gramps => Paris.gramps} (100%) diff --git a/data/tests/paris.gramps b/data/tests/Paris.gramps similarity index 100% rename from data/tests/paris.gramps rename to data/tests/Paris.gramps diff --git a/gramps/plugins/test/test_imports.py b/gramps/plugins/test/test_imports.py index 79d6bb2f6..84045603a 100644 --- a/gramps/plugins/test/test_imports.py +++ b/gramps/plugins/test/test_imports.py @@ -1,4 +1,5 @@ #! /usr/bin/env python3 +""" Test program for import modules """ # # Gramps - a GTK+/GNOME based genealogy program # @@ -23,13 +24,12 @@ import unittest import os import sys import re -import time import logging from gramps.gen.merge.diff import diff_dbs, import_as_dict from gramps.gen.simple import SimpleAccess from gramps.gen.utils.id import set_det_id -from gramps.cli import user +from gramps.cli.user import User from gramps.gen.const import TEMP_DIR, DATA_DIR logger = logging.getLogger(__name__) @@ -42,21 +42,21 @@ TEST_DIR = os.path.abspath(os.path.join(DATA_DIR, "tests")) # ------------------------------------------------------------------ -def todate(t): - return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(t)) - - class CompleteCheck(unittest.TestCase): """The test class cases will be dynamically created at import time from files to be tested. The following defs are used by the test cases""" def prepare_result(self, diffs, added, missing): + """ Looks through the diffs, added, and missing items and begins + reporting process. Returns True if there were significant errors. """ + # pylint: disable=E1101 + # pylint does not like dynamically created methods deltas = False if diffs: for diff in diffs: obj_type, item1, item2 = diff - msg = self.report_diff(obj_type, item1.to_struct(), - item2.to_struct()) + msg = self._report_diff(obj_type, item1.to_struct(), + item2.to_struct()) if msg != "": if hasattr(item1, "gramps_id"): self.msg += "%s: %s handle=%s\n" % \ @@ -68,63 +68,20 @@ class CompleteCheck(unittest.TestCase): deltas = True if missing: deltas = True - sa = SimpleAccess(self.database1) + sac = SimpleAccess(self.database1) for pair in missing: obj_type, item = pair - self.msg += "Missing %s: %s\n" % (obj_type, sa.describe(item)) + self.msg += "Missing %s: %s\n" % (obj_type, sac.describe(item)) if added: deltas = True - sa = SimpleAccess(self.database2) + sac = SimpleAccess(self.database2) for pair in added: obj_type, item = pair - self.msg += "Added %s: %s\n" % (obj_type, sa.describe(item)) + self.msg += "Added %s: %s\n" % (obj_type, sac.describe(item)) return deltas - def format_struct_path(self, path): - retval = "" - parts = path.split(".") - for part in parts: - if retval: - retval += ", " - if "[" in part and "]" in part: - part, index = re.match("(.*)\[(\d*)\]", part).groups() - retval += "%s #%s" % (part.replace("_", " "), int(index) + 1) - else: - retval += part - return retval - def report_details(self, path, diff1, diff2): - if isinstance(diff1, bool): - desc1 = repr(diff1) - else: - desc1 = str(diff1) if diff1 else "" - if isinstance(diff2, bool): - desc2 = repr(diff2) - else: - desc2 = str(diff2) if diff2 else "" - d1t = type(diff1) - d2t = type(diff2) - # the xml exporter edits the data base by stripping spaces, so - # we have to ignore these differeces - if d1t == str: diff1 = diff1.strip() - if d2t == str: diff2 = diff2.strip() - d1l = len(diff1) if d1t == str else "" - d2l = len(diff2) if d2t == str else "" - # 'change' date is not significant for comparison - if path.endswith(".change"): - return "" - # the xml exporter edits the data base by converting media path - # to unix '/' conventions, so we have to ignore these differences - if path == "Media.path": - diff1 = diff1.replace('\\', '/') - if diff1 != diff2: - msg = " Diff on: %s\n %s%s: %s\n %s%s: %s\n" % \ - (self.format_struct_path(path), d1t, d1l, desc1, - d2t, d2l, desc2) - return msg - return "" - - def report_diff(self, path, struct1, struct2): + def _report_diff(self, path, struct1, struct2): """ Compare two struct objects and report differences. """ @@ -138,7 +95,7 @@ class CompleteCheck(unittest.TestCase): for pos in range(max(len1, len2)): value1 = struct1[pos] if pos < len1 else None value2 = struct2[pos] if pos < len2 else None - msg += self.report_diff(path + ("[%d]" % pos), value1, value2) + msg += self._report_diff(path + ("[%d]" % pos), value1, value2) elif isinstance(struct1, dict) or isinstance(struct2, dict): keys = struct1.keys() if isinstance(struct1, dict)\ else struct2.keys() @@ -146,40 +103,92 @@ class CompleteCheck(unittest.TestCase): value1 = struct1[key] if struct1 is not None else None value2 = struct2[key] if struct2 is not None else None if key == "dict": # a raw dict, not a struct - msg += self.report_details(path, value1, value2) + msg += _report_details(path, value1, value2) else: - msg += self.report_diff(path + "." + key, value1, value2) + msg += self._report_diff(path + "." + key, value1, value2) else: - msg += self.report_details(path, struct1, struct2) + msg += _report_details(path, struct1, struct2) return msg -# The following make_test_function creates a test function (a method, -# to be precise) that compares the import file with the expected -# result '.gramps' file. -def make_tst_function(tstfile, fname): +def _report_details(path, diff1, diff2): + """ Checks if a detail is significant, needs adjusting for xml filter + effects, and returns a string describing the specific difference.""" + if isinstance(diff1, bool): + desc1 = repr(diff1) + else: + desc1 = str(diff1) if diff1 else "" + if isinstance(diff2, bool): + desc2 = repr(diff2) + else: + desc2 = str(diff2) if diff2 else "" + d1t = type(diff1) + d2t = type(diff2) + # the xml exporter edits the data base by stripping spaces, so + # we have to ignore these differences + if d1t == str: + diff1 = diff1.strip() + if d2t == str: + diff2 = diff2.strip() + d1l = len(diff1) if d1t == str else "" + d2l = len(diff2) if d2t == str else "" + # 'change' date is not significant for comparison + if path.endswith(".change"): + return "" + # the xml exporter edits the data base by converting media path + # to unix '/' conventions, so we have to ignore these differences + if path == "Media.path": + diff1 = diff1.replace('\\', '/') + if diff1 != diff2: + msg = " Diff on: %s\n %s%s: %s\n %s%s: %s\n" % \ + (_format_struct_path(path), d1t, d1l, desc1, + d2t, d2l, desc2) + return msg + return "" + + +def _format_struct_path(path): + """ prepares a 'path' string for the report out of the structure. """ + retval = "" + parts = path.split(".") + for part in parts: + if retval: + retval += ", " + if "[" in part and "]" in part: + part, index = re.match(r"(.*)\[(\d*)\]", part).groups() + retval += "%s #%s" % (part.replace("_", " "), int(index) + 1) + else: + retval += part + return retval + + +def make_tst_function(tstfile, file_name): + """ This is here to support the dynamic function creation. This creates + the test function (a method, to be precise). """ def tst(self): - self._user = user.User(quiet=True) - f1 = os.path.join(TEST_DIR, tstfile) - f2 = os.path.join(TEST_DIR, (fname + ".gramps")) - fres = os.path.join(TEMP_DIR, (fname + ".difs")) + """ This compares the import file with the expected result '.gramps' + file. """ + self.user = User(quiet=True) + fn1 = os.path.join(TEST_DIR, tstfile) + fn2 = os.path.join(TEST_DIR, (file_name + ".gramps")) + fres = os.path.join(TEMP_DIR, (file_name + ".difs")) try: os.remove(fres) except OSError: pass - logging.info("\n**** %s ****" % tstfile) + logging.info("\n**** %s ****", tstfile) set_det_id(True) - self.database1 = import_as_dict(f1, self._user) + self.database1 = import_as_dict(fn1, self.user) set_det_id(True) - self.database2 = import_as_dict(f2, self._user) + self.database2 = import_as_dict(fn2, self.user) self.assertIsNotNone(self.database1, - "Unable to import file: %s" % f1) + "Unable to import file: %s" % fn1) self.assertIsNotNone(self.database2, - "Unable to import expected result file: %s" % f2) + "Unable to import expected result file: %s" % fn2) if self.database2 is None or self.database1 is None: return diffs, added, missing = diff_dbs(self.database1, - self.database2, self._user) + self.database2, self.user) self.msg = "Mismatch on file: %s\n" % tstfile deltas = self.prepare_result(diffs, added, missing) # We save a copy of any issues in the users Gramps TEMP_DIR in a file @@ -190,12 +199,12 @@ def make_tst_function(tstfile, fname): hres.write(self.msg) hres.close() # let's see if we have any allowed exception file - fdif = os.path.join(TEST_DIR, (fname + ".difs")) + fdif = os.path.join(TEST_DIR, (file_name + ".difs")) try: hdif = open(fdif) msg = hdif.read() hdif.close() - except: + except (FileNotFoundError, IOError): msg = "" # if exception file matches exactly, we are done. if self.msg != msg: @@ -205,30 +214,31 @@ def make_tst_function(tstfile, fname): # let's see if we have a single file to run, example; # "python test_import.py -i sample.ged" # This only works for files in normal test directory, so don't add a path -tstfile = "" +#pylint: disable=invalid-name +_tstfile = "" if __name__ == "__main__": for i, option in enumerate(sys.argv): if option == '-i': - tstfile = sys.argv[i+1] + _tstfile = sys.argv[i+1] del sys.argv[i] del sys.argv[i] # The following code dynamically creates the methods for each test file. # The methods are inserted at load time into the 'CompleteCheck' class # via the modules' globals, taking advantage that they are a dict. -if tstfile: # single file mode - (fname, ext) = os.path.splitext(os.path.basename(tstfile)) - test_func = make_tst_function(tstfile, fname) - clname = 'Import_{0}'.format(tstfile) +if _tstfile: # single file mode + (fname, ext) = os.path.splitext(os.path.basename(_tstfile)) + test_func = make_tst_function(_tstfile, fname) + clname = 'Import_{0}'.format(_tstfile) globals()[clname] = type(clname, (CompleteCheck,), {"testit": test_func}) else: - for tstfile in os.listdir(TEST_DIR): - (fname, ext) = os.path.splitext(os.path.basename(tstfile)) + for _tstfile in os.listdir(TEST_DIR): + (fname, ext) = os.path.splitext(os.path.basename(_tstfile)) if ext == ".gramps" or ext == ".difs" or ext == ".bak": continue - test_func = make_tst_function(tstfile, fname) - clname = 'Import_{0}'.format(tstfile) + test_func = make_tst_function(_tstfile, fname) + clname = 'Import_{0}'.format(_tstfile) globals()[clname] = type(clname, (CompleteCheck,), {"testit": test_func}) From 84e12210cc16cd9576558dbe6da086f345676305 Mon Sep 17 00:00:00 2001 From: prculley Date: Thu, 2 Jun 2016 11:36:53 -0500 Subject: [PATCH 12/12] more pylint and uncompressed .gramps --- data/tests/FTM_16dec2015a-mod1.gramps | Bin 1669 -> 6781 bytes data/tests/MixInlineXrefNote.gramps | Bin 748 -> 2482 bytes data/tests/Paris.gramps | Bin 3224 -> 30006 bytes data/tests/bug 8322 test.gramps | Bin 3161 -> 22779 bytes data/tests/sample.gramps | Bin 6473 -> 52655 bytes data/tests/test_FTM_CONC.gramps | Bin 1051 -> 2494 bytes data/tests/vcard.gramps | Bin 1425 -> 13498 bytes gramps/gen/utils/id.py | 2 +- gramps/plugins/test/test_imports.py | 21 ++++++++++++++------- 9 files changed, 15 insertions(+), 8 deletions(-) diff --git a/data/tests/FTM_16dec2015a-mod1.gramps b/data/tests/FTM_16dec2015a-mod1.gramps index 88fdc096ac1eb33dd8b8bac04ea55ab3f3158884..2edc28c6b97b77c6780a81f17e07d600de7d27d4 100644 GIT binary patch literal 6781 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 Pb9VAC7?gdceHs7&di*`d diff --git a/data/tests/MixInlineXrefNote.gramps b/data/tests/MixInlineXrefNote.gramps index b1367cbd184b81a96cba7e366521f1b493a4a971..57e91ac0edd8f9cc6e6ffe3f015f24a9a074d8ba 100644 GIT binary patch literal 2482 zcmb_eT~FIE6n*DcczJJ}q#tP~H*6HxkV-*ok=WDZCZ^4nI+5cd`tNt+*f>+0FsAWB zu6?f0x#wP6CFd`@3_UYZra7NFzUw)N@iihi_N~ol3 zS~7J1a52A`A*YA&7eRMLiSgy?64l@6@pg`UH*|fBuNKakvz4;=i19`tdxgk*iB^O0O>0itnqUCSBF3zLS)Nm!bJ56K`a=REUBcksS|kqsOJrP!O*dF z4_yx`$2vi zy{^oLNUdx4TDWaJo!rAC?(`3CaPj@zRC`I=FIiQ0aKx<(Uj9?XYt6duX6?7KR(G_m zSYvwK{pz(dy|2EHI&YuIR`(Z`Tt`3EUl?bCW>%VHFVc*GN3aTY_bWo(`;*-E&F$p& lySX2~U0tKaJE`p(-bo#FQ|sx6Zk#HcVC_D^=BH3}_8Wt>u_$RMF2x@fD_6)l27IhDbr5_vQHcYf z8!Xu4MgLugKpjHig3*M@atTf>8C5JPsk6T0d!*O#x*fmk*uJ~22c6@(K(c~S886HU zdW+K~izalHp}{K4*gC{!vynuTL`H=8#6u5R!q9!n75X7o(8P#W6;(!~B2Lvhnu+Bz z&9W+?+Gr#c3V27ew<@TeX1Q2#CD+m8^t-OE{YFYIpel=k;56t~IrT;(g)M2CML9Gl z{op+KHZOfQ7RxGMN3}M1TbvMEsl%L!JgeD(BMZUNg7PE-*?)WbM~rn)46!+c$XV}< zT#()c%wC%GonaN;(3>+}0^EnVUYS6tJyPo&j<`ytTA(p(Z0aE4C6$GWM(HaIGYPSF zO*P)SIxZBG>;)~dl>fDCePhjR98Nto_IT=%Vf;hBU&tYp0J zUc1Ix`i9prnzr*+n&dNRo*TQLru8au>vN3I+S}o8TR+HuT1~vAr&0x%Ipjc&p{YI= zMyKAdiD|fYY}-#Oc6SFm-NN=if=!KW$M$!yYtZS3I({~`9rg4es@DQ**829#C(PV^ zx!&PopU8t;#?=Q_KOlFEGf6W`O|ds+#=r}4<<_K1z&33A=C)#!cI>C0H@9f~pV0OV eZ-w^X)i&9WtyiFah|OQ2=;R-cfEPNl2><}Yb9PJs diff --git a/data/tests/Paris.gramps b/data/tests/Paris.gramps index 1b780e15e9691263c297d526462bb51584e69229..e32f43b448e6a028ab2e5fbd8b08e7b6eefd9e6c 100644 GIT binary patch literal 30006 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 a?{+Gy`Pey?xO(9+3ivA!_@__Le)vDX#5$z_ literal 3224 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 diff --git a/data/tests/bug 8322 test.gramps b/data/tests/bug 8322 test.gramps index a8219e5d1e7c9a61ccd7f63e053cf35d7b895824..8be3cf23c85e3113ff14282c05f605bca16bf126 100644 GIT binary patch literal 22779 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 m;u0PUfrciWfWZ5Fx8AZamREh+Uu-&!&_&p8dE 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 diff --git a/data/tests/sample.gramps b/data/tests/sample.gramps index d585fdb3b79dd9fd3b65e7f73bd054de723ee04d..e338b91000d678bd927cb323893031ddbc84eb1f 100644 GIT binary patch literal 52655 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 literal 6473 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 diff --git a/data/tests/test_FTM_CONC.gramps b/data/tests/test_FTM_CONC.gramps index 98d329aa0fd35caadd1826c1181887106d2be281..564030f7320cda8717b42026c125e9888a162297 100644 GIT binary patch literal 2494 zcmbtWTW{hz5Pt8kn3IRymxhoKXbT~`EwmL>^IJ@$C!n{O^o@a5+=g%?zsOEI?GPS*kyk&L<6jIGDjjeTx?2~UE*ri;ny`|=uM zX4n(c2+PN-yV(RR+i`9c+h*EvrmHDbYxsM92X5!A<2uguy>((G#$-ds*_4`grsO{u znT}K&hx|L0W_3t%CpNJ~PWQfOPw4S~GD7zNf&^KNs#uZ`DP#uY0y>T@uj>x%Zr}EL zRvUMP`f|1y__p8iIV> z$H1vqB@jYeKn3%fk%=p=Oak|`vA;(OYp%2jFGZ|y7dVwvU#3%?t1{R*qaYihJr>fS z!Zjo*7tbwzug1UUvBY>pxmPRq8qz;f_G@MTH|2;MW~heWfikEs4B88UQ-)Nhs!Bmw zI8K|JpfRbNI;vf~$yMv%Xs#v&hCSy&#x@v!r}`Lzd*1JkV1h#D8kQ-Ga0pYbjpC63 z*FS{`%Mfn4Vk$G zsv(kM&133u486cPkQ#-;c=TRM`!$dKhDW+yQ&Mr)NF`xGWv3yplHO3)+B{0#L$~W) zwA5+C4K+_e8$1eLH1-3f9yQz`)jy+#EV-mwtu*&>vD_q5QJqIf^uBf?xh17~cdwP@ zPh6~JSTxBH4wYd+g;ExoK82ZxIwQD~QMoaMrIIi56dqUfd$=6Ilpqa(y5M3&P8y?) z7loO8r&7;qhR-b6V$Aa`b*z-nE#DQ3725~=(m=|j=0+-x4dMH(*EggexH&dkz7Z0) zCB2#ehh)&aYg>q>L@{5&JN`svN@JpwnqXN>gGJZ4%FZVG5luMzyagI42wHAY3WR4N zce+Sid0gKo<5@zdAr0l8Z}$gh_W4EErLrz}8!yfuZh~B;012@?wpg9=ug#*!y;aY| zYkSLh+H%|ySMj`;Yi@&Lh&3!1>o@$iv+rn8-xrx~5Zt0D3b&=(;7=2-5`>%89Cqv# zjD%PMgURB40yJn5cAN&e&S+c!GxTJ~VB4QIW(1#7GqP<;L1CjLhlU-Ytk>@XZs+fZ zfZcxwe0x2eEan6ZqXXc3*r$Kse!>kGg1$BW5Bl~&_z=DKG5RY6!HG@2h87Mu z!{zrBl#yr&xu$0ub}~<6AWEqOUg(XLMc`>lFfe)sdeMQp*nmlpE7&D6#rFGYEmd(q dUsBJU6y+LFDXDbl{nS-Sq_PW~=Cdd~`31bw&xim3 literal 1051 zcmV+$1myc4iwFp%EJIfU|8!+@bYDhPOA)cRre zCB_(>8yL?fkVHr!K@%d)JdHYbfqP@zR(Cs0{(j3g?S|ZTq=^*urK+n=ow}It>#ubN z&nOia`N;7*T?a6aMZ)vd$az>?xu?$8=pg)SayMT5m|sG|G<#$UVg7J&GaZBDdfv5U z>q2?nWHEte58r1u;CD_szUN)uItNawbusX~RV{T3DgMP+cZ6JdrA z{P|{eAST(0M1F7_bP2vs$aykyrrqAjsndd5VO}|S2)*sj2r5*dUkWmD!KF^&mM+?N zq_E^t>F7L9ByK{lIa#SHWgXXyQIO_f#ktTZaS3V0^CyeHXI8`GXUcuE{*H2B);;Bz zYo;le?>sm*t9=l9yQykY(4@)crZuTd9c|BVa%CNSn5%Imx4A0V3ZoxX9|Q1DkGew` zW3EaC^NhtffC*Px@>qi(9Kx6t2-jRPnIJ0M4CLzu4XLoYa`m@03^bu98FPpHQ+>V@9U$tYCDw_3 z$3QiMu;DbwRYBtdn5Iv50_!IQ@gYYT(-sk8q5OPka_!2f$k!3+0S`C-|6x5L@0i~jE z25dx`B|xAE(=%2o6nK^q42++EU;=fq2Av|8ut`OR_V?3L$Vx!FCr*lD2`HtIs`GyE V&5p`0^o)t<;6D;*9Spt+004Rs1y}$8 diff --git a/data/tests/vcard.gramps b/data/tests/vcard.gramps index 04ec7a637bb5cc3250e2a1d4fa89944baa5ba3e5..1216c48b4d068df6f6c948d20f5fcab217df1fe8 100644 GIT binary patch literal 13498 zcmdU0-&3PV5PsjkVvd)4*@Vo1NxUNLs_Wi)<*HSuRku%91V+P2AO*zee}6qglVCKx z#1P!`B``BU|C+DAZqWJkIE~nYOtUbFM+Wcq3?^eg3BvepWZYbT?F@}i?g!_WFPA6R z->*(t;N{-f%OtzHIX*u-VMfO^e^0&XEHlk7*I!t1%>Mp%&Ukmw<)(RhVSF$qc|QBi zH1G7v&MZy-m44n$(mNBLZx$1;Epg9dsFFNdGm;! z%%ey?Ic7PiA6hK(f*^G{7re(Vqd>B6VVtu+k~x^~Jl0p}6_qReFn@Bdlj+!tBE3Kl zR2F18XyINz>dE4yGV3SvI8UG4o4<~VtMRAG(KKQ3s{2i3P2J>O=4yL%> zw+@Cw+ZF~3gOPEnmT0GHU*=CU=^lq^K5Sk9T^99Wh*b(bN)< z(hN}=2n8HuUF@wr5#`_PWNF1VUhqP=5YqD*M=`2r+n4ZVC0GBcc_>JTiVJ*fe z(3lpezpX%OlYt8kUy;QrcAMV(&P*n=NaD_$L8eLK7eK%Z8GC%QjAv@eO2#`GD}=vs zOgt)qKmjvT&@eKzP1ywuEUyDx&gQ8G?{hE9)q!J{BjqhjJzt(Fh?W@wnFb;7iIllJ zP97O&<1k~#Y2pP7?}>2^cPnP`a+QA+reDYf`<|rtj#))?C5{I4)$}t=S65ddy*ydn z9MSvYI~SJim}_8eJ`*0MwfSjZ;O6QPn@jnk0)s92qMrB`hLS~xQUy0#5+8i|%p28E zdUF6dZ}G5=CbDT0RlxjzW1^3*?y+*)Xj)XBl>7TF7VM)1`?Lis38*~_>J*jATQ-Tp z`2JP0l_rXXU8UjFOP^NwT?ZWosQG}_yprBp(!3rzV0P{i*;#>GB^kCPKA^)U$5nXg z4vs?_&?9Jo(tNN?mCpNXUg5wyXdYn526V^{ehyL<6HCG(slvC;B*4uAbDRR0}6b;gprHNib=@0F)y?$5^a=IQAjnI`nh>z7B zr>i^B2rJo2e27pT=3bP;8_cqRef{-A9QyYzWJvw{N~CUmuj7wE?Kj=6R@^T;{&W>7 z8lgq|HSD!|x3`-yu<(SmL=g*kwcH%+yUle31eRKWvzP;Ne zuowe)rZl&HQnnA=wkv$wQ)aE3_&!b+@m76TfyEer zBB^;J#Az$d>%|=wDuOOltoC^kfti)>Om@IbED8i&6j<*i^jLZLkmVia3+v0=B*cvwpds( z0573fm;ElZr6m-_iU9};X@d6oOT7TZiUC*#DSo3Qq_He+A?pW{K}z2!2dUL5X%7IA ng#%L|P0&7(sTY4(_*it|bI?8ssfw?Ti%-bmlYIR5Blp995J7H} literal 1425 zcmV;C1#bEuiwFpGmONJi|8`?xa%3)Na$#+7a{%32U2~&06n)=cq4Ls~wPgt~xP#es zve`DBe9bhO={|L2kYgGQ9)aWJ-&X=(hosp%N$fZz`;a5)O7c1Pii;3z@a1Nfl544o zB+rHx>-H=nvnY>~>~d&boPY25)|c>8@XNQ;{qrAZ2P77y7>h!Zvx~i>!+m0PDE(cD z*}S0i+xa(Am&xD9M}&2~E~E6|#QJ1S%X0o3rI(epGgtY)GAg^dx}^H|Y2C9n>UuXW zV@v<&`nPmjRt%psi5^EtFqI;f$`o}aQc{#MHq_y^xO{ftvlT{>(Sw9-|0AA z-enzb(baGz3n^4Ih572HOw43>CKf5#U!^VqUzBY5hdkqc%IM3B2B9fRYRjgQEC<8`Auc4E6w5gA}iHxc=6Y$9=)nJy3BJu zDh)l)_S~w^s-e+E&P0-ib1hDB&-cDwntC_NXI1~&TKk6HcTPa>93RMQnU%$=V^twj zk;SQw!9TtFp9^S_NZT&8i8+1S^?k?T7D?ivbztn)nq7H2m*HNb%4tBWG8jy7uZ3R9 zA~iAYu}*K$;r=>`v|@m=@d0r*Y&UEKAkK#GhD`*Bv$1!=hI2rijq`xbX%sEyqSROX zLrVHeQOVp`!Xgq%Mk-$hwAuV*ZUaD^oBKph6{V^@wa6wq)5%hf`VSz|z)Q2)7v zOz3n729I!A6|0Lsn9F>guIA7cRpierLXy)6M8+N`H{gjYI3~ee#2G+X?7{WKQpq*XGLo zcq}*|9t*bfSUios4T#g{ty)SiUO+F3umgy@$bN?|`uylMhFwE1@?akj_n`9@9;{NY zk`ppblkDoz&6diIm@}2kgu1=U-%nBQ0piNtmS%?mAWpyEroc7!r5glp42UcD+N8X( z2i`z=42UcD+oZg)-`+sE1jLmO-a`38rG!ki^r1DAU*(N{08gcPn739xbI>sln$HtF z0Yn9}t?VNwi7Lu)MD_w&7aR8*{q!E{_6lD!pRM=JJzOw*Wx=nYi~-`x`1@1F0dZya zR+W+cw_K(+ATHV2qU4=~(gDPEx$jMv3yACLzc*cdKwOvi{*sCZh%58Ar)-amev(o~ zyGSWMATD?}dz(l4@GWQ@0HPXsubmHDOaS8aTY8ej#(+5eZJs2Nx!w>bH$&@MWF-F8 z3P-7&jioBLASVLEuc%Z4VwVs^xx$0rkYTsrKV(|6K6?uW$us_Zey;!&-*{0 z?MaSZpZMcXk=$#)W6#aIz0I7#0C8vd?Yv014T#epwCJ>}`9AmMr(N6uM3vhu-7Rq! z5U0=D@m6L&%`+MH%v;Bf+xPr|7FjiI@LGlU0dW`bmPXJ6#Od2_eB8SFjB2@DcH!7H z%4d*VFS4sFUuMs{^n5^Exzp0X2|%2_+oqh^_|9a5oEZV)%G>lltocF92FhbVT)EfM zB`X1O`di(ljIz9(O0@;{6F{8(;N#xw)}N{1dv2%qfnC4=aTm1oe8}d2IDP(sBWMHS zF0fk~K?e}0-_mW1?E>QT-4DC~`+&F$`Yny12Z+=6T6q_@eL$SO|AE)v01$V>g3<@yuyfWm(X3P1e^m{yGGx-