Improve pylint score of some new files
The programming guidelines require that new files have a pylint score of 9.0 or greater.
This commit is contained in:
		@@ -19,6 +19,10 @@
 | 
			
		||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
Rule that checks for a family that is an ancestor of a specified family.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# Gramps modules
 | 
			
		||||
@@ -37,9 +41,9 @@ class IsAncestorOf(Rule):
 | 
			
		||||
    """
 | 
			
		||||
    Rule that checks for a family that is an ancestor of a specified family.
 | 
			
		||||
    """
 | 
			
		||||
    labels      = [ _('ID:'), _('Inclusive:') ]
 | 
			
		||||
    name        = _('Ancestor families of <family>')
 | 
			
		||||
    category    = _('General filters')
 | 
			
		||||
    labels = [_('ID:'), _('Inclusive:')]
 | 
			
		||||
    name = _('Ancestor families of <family>')
 | 
			
		||||
    category = _('General filters')
 | 
			
		||||
    description = _('Matches ancestor families of the specified family')
 | 
			
		||||
 | 
			
		||||
    def prepare(self, db):
 | 
			
		||||
@@ -55,6 +59,9 @@ class IsAncestorOf(Rule):
 | 
			
		||||
        return family.handle in self.map
 | 
			
		||||
 | 
			
		||||
    def init_list(self, db, family, first):
 | 
			
		||||
        """
 | 
			
		||||
        Initialise family handle list.
 | 
			
		||||
        """
 | 
			
		||||
        if not family:
 | 
			
		||||
            return
 | 
			
		||||
        if family.handle in self.map:
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,10 @@
 | 
			
		||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
Rule that checks for a family that is a descendant of a specified family.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# Gramps modules
 | 
			
		||||
@@ -37,9 +41,9 @@ class IsDescendantOf(Rule):
 | 
			
		||||
    """
 | 
			
		||||
    Rule that checks for a family that is a descendant of a specified family.
 | 
			
		||||
    """
 | 
			
		||||
    labels      = [ _('ID:'), _('Inclusive:') ]
 | 
			
		||||
    name        = _('Descendant families of <family>')
 | 
			
		||||
    category    = _('General filters')
 | 
			
		||||
    labels = [_('ID:'), _('Inclusive:')]
 | 
			
		||||
    name = _('Descendant families of <family>')
 | 
			
		||||
    category = _('General filters')
 | 
			
		||||
    description = _('Matches descendant families of the specified family')
 | 
			
		||||
 | 
			
		||||
    def prepare(self, db):
 | 
			
		||||
@@ -55,6 +59,9 @@ class IsDescendantOf(Rule):
 | 
			
		||||
        return family.handle in self.map
 | 
			
		||||
 | 
			
		||||
    def init_list(self, db, family, first):
 | 
			
		||||
        """
 | 
			
		||||
        Initialise family handle list.
 | 
			
		||||
        """
 | 
			
		||||
        if not family:
 | 
			
		||||
            return
 | 
			
		||||
        if not first:
 | 
			
		||||
 
 | 
			
		||||
@@ -27,42 +27,70 @@ from gramps.gen.merge.diff import import_as_dict
 | 
			
		||||
from gramps.cli.user import User
 | 
			
		||||
from gramps.gen.filters import GenericFilterFactory
 | 
			
		||||
 | 
			
		||||
from gramps.gen.filters.rules.event import *
 | 
			
		||||
from gramps.gen.filters.rules.event import (
 | 
			
		||||
    AllEvents, HasType, HasIdOf, HasGallery, RegExpIdOf, HasCitation, HasNote,
 | 
			
		||||
    HasNoteRegexp, HasReferenceCountOf, HasSourceCount, EventPrivate,
 | 
			
		||||
    MatchesSourceConfidence, HasAttribute, HasData, ChangedSince, HasTag,
 | 
			
		||||
    HasDayOfWeek)
 | 
			
		||||
 | 
			
		||||
GenericEventFilter = GenericFilterFactory('Event')
 | 
			
		||||
 | 
			
		||||
class BaseTest(unittest.TestCase):
 | 
			
		||||
    """
 | 
			
		||||
    Event rule tests.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def setUpClass(cls):
 | 
			
		||||
        """
 | 
			
		||||
        Import example database.
 | 
			
		||||
        """
 | 
			
		||||
        cls.db = import_as_dict("example/gramps/example.gramps", User())
 | 
			
		||||
 | 
			
		||||
    def filter_with_rule(self, rule):
 | 
			
		||||
        """
 | 
			
		||||
        Apply a filter with the given rule.
 | 
			
		||||
        """
 | 
			
		||||
        filter_ = GenericEventFilter()
 | 
			
		||||
        filter_.add_rule(rule)
 | 
			
		||||
        results = filter_.apply(self.db)
 | 
			
		||||
        return set(results)
 | 
			
		||||
 | 
			
		||||
    def test_AllEvents(self):
 | 
			
		||||
    def test_allevents(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test AllEvents rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = AllEvents([])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)),
 | 
			
		||||
                         self.db.get_number_of_events())
 | 
			
		||||
 | 
			
		||||
    def test_HasType(self):
 | 
			
		||||
    def test_hastype(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasType rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasType(['Burial'])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 296)
 | 
			
		||||
 | 
			
		||||
    def test_HasIdOf(self):
 | 
			
		||||
    def test_hasidof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasIdOf(['E0001'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'a5af0eb696917232725']))
 | 
			
		||||
 | 
			
		||||
    def test_HasGallery(self):
 | 
			
		||||
    def test_hasgallery(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasGallery rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasGallery(['0', 'greater than'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'a5af0ecb107303354a0']))
 | 
			
		||||
 | 
			
		||||
    def test_RegExpIdOf(self):
 | 
			
		||||
    def test_regexpidof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test RegExpIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = RegExpIdOf(['E000.'], use_regex=True)
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'a5af0eb69cf2d3fb615', b'a5af0eb667015e355db',
 | 
			
		||||
@@ -71,63 +99,99 @@ class BaseTest(unittest.TestCase):
 | 
			
		||||
            b'a5af0eb69f41bfb5a6a', b'a5af0eb69c40c179441',
 | 
			
		||||
            b'a5af0eb6a3229544ba2', b'a5af0eb696917232725']))
 | 
			
		||||
 | 
			
		||||
    def test_HasCitation(self):
 | 
			
		||||
    def test_hascitation(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasCitation rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasCitation(['page 1', '', ''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'a5af0ecb107303354a0']))
 | 
			
		||||
 | 
			
		||||
    def test_HasNote(self):
 | 
			
		||||
    def test_hasnote(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasNote rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasNote([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'a5af0ecb11f5ac3110e']))
 | 
			
		||||
 | 
			
		||||
    def test_HasNoteRegexp(self):
 | 
			
		||||
    def test_hasnoteregexp(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasNoteRegexp rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasNoteRegexp(['.'], use_regex=True)
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'a5af0ecb11f5ac3110e']))
 | 
			
		||||
 | 
			
		||||
    def test_HasReferenceCountOf(self):
 | 
			
		||||
    def test_hasreferencecountof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasReferenceCountOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasReferenceCountOf(['greater than', '1'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'cc8205d86fc4e9706a5', b'a5af0ed60de7a612b9e',
 | 
			
		||||
            b'cc820604ef05cb67907']))
 | 
			
		||||
 | 
			
		||||
    def test_HasSourceCount(self):
 | 
			
		||||
    def test_hassourcecount(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasSourceCount rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasSourceCount(['1', 'greater than'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'a5af0ecb107303354a0']))
 | 
			
		||||
 | 
			
		||||
    def test_EventPrivate(self):
 | 
			
		||||
    def test_eventprivate(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test EventPrivate rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = EventPrivate([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([]))
 | 
			
		||||
 | 
			
		||||
    def test_MatchesSourceConfidence(self):
 | 
			
		||||
    def test_matchessourceconfidence(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test MatchesSourceConfidence rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = MatchesSourceConfidence(['2'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'a5af0ecb107303354a0']))
 | 
			
		||||
 | 
			
		||||
    def test_HasAttribute(self):
 | 
			
		||||
    def test_hasattribute(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasAttribute rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasAttribute(['Cause', ''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'a5af0ecb11f5ac3110e']))
 | 
			
		||||
 | 
			
		||||
    def test_HasData(self):
 | 
			
		||||
    def test_hasdata(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasData rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasData(['Burial', 'before 1800', 'USA', ''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'a5af0ed4211095487d2', b'a5af0ed36793c1d3e05',
 | 
			
		||||
            b'a5af0ecfcc16ce7a96a']))
 | 
			
		||||
 | 
			
		||||
    def test_ChangedSince(self):
 | 
			
		||||
    def test_changedsince(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test ChangedSince rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = ChangedSince(['2011-01-01', '2014-01-01'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'a5af0ecb107303354a0', b'a5af0ecb11f5ac3110e',
 | 
			
		||||
            b'a5af0ed5df832ee65c1']))
 | 
			
		||||
 | 
			
		||||
    def test_HasTag(self):
 | 
			
		||||
    def test_hastag(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasTag rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasTag(['ToDo'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([]))
 | 
			
		||||
 | 
			
		||||
    def test_HasDayOfWeek(self):
 | 
			
		||||
    def test_hasdayofweek(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasDayOfWeek rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasDayOfWeek(['2'])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 177)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,52 +27,88 @@ from gramps.gen.merge.diff import import_as_dict
 | 
			
		||||
from gramps.cli.user import User
 | 
			
		||||
from gramps.gen.filters import GenericFilterFactory
 | 
			
		||||
 | 
			
		||||
from gramps.gen.filters.rules.family import *
 | 
			
		||||
from gramps.gen.filters.rules.family import (
 | 
			
		||||
    AllFamilies, HasRelType, HasGallery, HasIdOf, HasLDS, HasNote, RegExpIdOf,
 | 
			
		||||
    HasNoteRegexp, HasReferenceCountOf, HasSourceCount, HasSourceOf,
 | 
			
		||||
    HasCitation, FamilyPrivate, HasEvent, HasAttribute, IsBookmarked,
 | 
			
		||||
    MatchesSourceConfidence, FatherHasNameOf, FatherHasIdOf, MotherHasNameOf,
 | 
			
		||||
    MotherHasIdOf, ChildHasNameOf, ChildHasIdOf, ChangedSince, HasTag,
 | 
			
		||||
    HasTwins, IsAncestorOf, IsDescendantOf)
 | 
			
		||||
 | 
			
		||||
GenericFamilyFilter = GenericFilterFactory('Family')
 | 
			
		||||
 | 
			
		||||
class BaseTest(unittest.TestCase):
 | 
			
		||||
    """
 | 
			
		||||
    Family rule tests.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def setUpClass(cls):
 | 
			
		||||
        """
 | 
			
		||||
        Import example database.
 | 
			
		||||
        """
 | 
			
		||||
        cls.db = import_as_dict("example/gramps/example.gramps", User())
 | 
			
		||||
 | 
			
		||||
    def filter_with_rule(self, rule):
 | 
			
		||||
        """
 | 
			
		||||
        Apply a filter with the given rule.
 | 
			
		||||
        """
 | 
			
		||||
        filter_ = GenericFamilyFilter()
 | 
			
		||||
        filter_.add_rule(rule)
 | 
			
		||||
        results = filter_.apply(self.db)
 | 
			
		||||
        return set(results)
 | 
			
		||||
 | 
			
		||||
    def test_AllFamilies(self):
 | 
			
		||||
    def test_allfamilies(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test AllFamilies rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = AllFamilies([])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)),
 | 
			
		||||
                         self.db.get_number_of_families())
 | 
			
		||||
 | 
			
		||||
    def test_HasRelType(self):
 | 
			
		||||
    def test_hasreltype(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasRelType rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasRelType(['Married'])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 738)
 | 
			
		||||
 | 
			
		||||
    def test_HasGallery(self):
 | 
			
		||||
    def test_hasgallery(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasGallery rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasGallery(['0', 'greater than'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_HasIdOf(self):
 | 
			
		||||
    def test_hasidof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasIdOf(['F0001'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'48TJQCGNNIR5SJRCAK']))
 | 
			
		||||
 | 
			
		||||
    def test_HasLDS(self):
 | 
			
		||||
    def test_haslds(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasLDS rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasLDS(['0', 'greater than'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_HasNote(self):
 | 
			
		||||
    def test_hasnote(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasNote rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasNote([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_RegExpIdOf(self):
 | 
			
		||||
    def test_regexpidof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test RegExpIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = RegExpIdOf(['F000.'], use_regex=True)
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'LOTJQC78O5B4WQGJRP', b'UPTJQC4VPCABZUDB75', b'NBTJQCIX49EKOCIHBP',
 | 
			
		||||
@@ -80,12 +116,18 @@ class BaseTest(unittest.TestCase):
 | 
			
		||||
            b'48TJQCGNNIR5SJRCAK', b'4YTJQCTEH7PQUU4AD', b'MTTJQC05LKVFFLN01A',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasNoteRegexp(self):
 | 
			
		||||
    def test_hasnoteregexp(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasNoteRegexp rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasNoteRegexp(['.'], use_regex=True)
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_HasReferenceCountOf(self):
 | 
			
		||||
    def test_hasreferencecountof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasReferenceCountOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasReferenceCountOf(['greater than', '12'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'29IKQCMUNFTIBV653N', b'8OUJQCUVZ0XML7BQLF', b'UPTJQC4VPCABZUDB75',
 | 
			
		||||
@@ -93,69 +135,108 @@ class BaseTest(unittest.TestCase):
 | 
			
		||||
            b'MTTJQC05LKVFFLN01A', b'C2VJQC71TNHO7RBBMX', b'QIDKQCJQ37SIUQ3UFU',
 | 
			
		||||
            b'DV4KQCX9OBVQ74H77F']))
 | 
			
		||||
 | 
			
		||||
    def test_HasSourceCount(self):
 | 
			
		||||
    def test_hassourcecount(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasSourceCount rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasSourceCount(['1', 'greater than'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_HasSourceOf(self):
 | 
			
		||||
    def test_hassourceof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasSourceOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasSourceOf(['S0001'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                        set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_HasCitation(self):
 | 
			
		||||
    def test_hascitation(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasCitation rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasCitation(['page 10', '', '2'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_FamilyPrivate(self):
 | 
			
		||||
    def test_familyprivate(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test FamilyPrivate rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = FamilyPrivate([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([]))
 | 
			
		||||
 | 
			
		||||
    def test_HasEvent(self):
 | 
			
		||||
    def test_hasevent(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasEvent rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasEvent(['Marriage', 'before 1900', 'USA', '', 'Garner'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'KSFKQCP4V0YXGM1LR9', b'8ZFKQC3FRSHACOJBOU', b'3XFKQCE7QUDJ99AVNV',
 | 
			
		||||
            b'OVFKQC51DX0OQUV3JB', b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_HasAttribute(self):
 | 
			
		||||
    def test_hasattribute(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasAttribute rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasAttribute(['Number of Children', ''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_IsBookmarked(self):
 | 
			
		||||
    def test_isbookmarked(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test IsBookmarked rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsBookmarked([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_MatchesSourceConfidence(self):
 | 
			
		||||
    def test_matchessourceconfidence(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test MatchesSourceConfidence rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = MatchesSourceConfidence(['0'])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 734)
 | 
			
		||||
 | 
			
		||||
    def test_FatherHasNameOf(self):
 | 
			
		||||
    def test_fatherhasnameof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test FatherHasNameOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = FatherHasNameOf(['', '', 'Dr.', '', '', '', '', '', '', '',
 | 
			
		||||
                                ''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_FatherHasIdOf(self):
 | 
			
		||||
    def test_fatherhasidof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test FatherHasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = FatherHasIdOf(['I0106'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'8OUJQCUVZ0XML7BQLF']))
 | 
			
		||||
 | 
			
		||||
    def test_MotherHasNameOf(self):
 | 
			
		||||
    def test_motherhasnameof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test MotherHasNameOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = MotherHasNameOf(['', 'Alvarado', '', '', '', '', '', '', '', '',
 | 
			
		||||
                                ''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'EM3KQC48HFLA02TF8D', b'K9NKQCBG105ECXZ48D',
 | 
			
		||||
            b'2QMKQC5YWNAWZMG6VO', b'6JUJQCCAXGENRX990K']))
 | 
			
		||||
 | 
			
		||||
    def test_MotherHasIdOf(self):
 | 
			
		||||
    def test_motherhasidof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test MotherHasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = MotherHasIdOf(['I0107'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'8OUJQCUVZ0XML7BQLF']))
 | 
			
		||||
 | 
			
		||||
    def test_ChildHasNameOf(self):
 | 
			
		||||
    def test_childhasnameof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test ChildHasNameOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = ChildHasNameOf(['Eugene', '', '', '', '', '', '', '', '', '',
 | 
			
		||||
                               ''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
@@ -163,29 +244,44 @@ class BaseTest(unittest.TestCase):
 | 
			
		||||
            b'7CTJQCFJVBQSY076A6', b'9OUJQCBOHW9UEK9CNV', b'9IXJQCX18AHUFPQHEZ',
 | 
			
		||||
            b'9NWJQCJGLXUR3AQSFJ']))
 | 
			
		||||
 | 
			
		||||
    def test_ChildHasIdOf(self):
 | 
			
		||||
    def test_childhasidof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test ChildHasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = ChildHasIdOf(['I0001'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'48TJQCGNNIR5SJRCAK']))
 | 
			
		||||
 | 
			
		||||
    def test_ChangedSince(self):
 | 
			
		||||
    def test_changedsince(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test ChangedSince rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = ChangedSince(['2008-01-01', '2014-01-01'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_HasTag(self):
 | 
			
		||||
    def test_hastag(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasTag rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasTag(['ToDo'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'9OUJQCBOHW9UEK9CNV']))
 | 
			
		||||
 | 
			
		||||
    def test_HasTwins(self):
 | 
			
		||||
    def test_hastwins(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasTwins rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasTwins([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'SD6KQC7LB8MYGA7F5W', b'8OUJQCUVZ0XML7BQLF', b'1BVJQCNTFAGS8273LJ',
 | 
			
		||||
            b'5IUJQCRJY47YQ8PU7N', b'ZLUJQCPDV93OR8KHB7', b'4U2KQCBXG2VTPH6U1F',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsAncestorOf(self):
 | 
			
		||||
    def test_isancestorof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test IsAncestorOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsAncestorOf(['F0031', '0'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'4AXJQC96KTN3WGPTVE', b'1RUJQCYX9QL1V45YLD', b'5GTJQCXVYVAIQTBVKA',
 | 
			
		||||
@@ -194,7 +290,10 @@ class BaseTest(unittest.TestCase):
 | 
			
		||||
            b'57WJQCTBJKR5QYPS6K', b'8OUJQCUVZ0XML7BQLF', b'7PUJQC4PPS4EDIVMYE'
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsDescendantOf(self):
 | 
			
		||||
    def test_isdescendantof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test IsDescendantOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsDescendantOf(['F0031', '0'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'SFXJQCLE8PIG7PH38J', b'UCXJQCC5HS8VXDKWBM', b'IIEKQCRX89WYBHKB7R',
 | 
			
		||||
 
 | 
			
		||||
@@ -27,337 +27,520 @@ from gramps.gen.merge.diff import import_as_dict
 | 
			
		||||
from gramps.cli.user import User
 | 
			
		||||
from gramps.gen.filters import GenericFilter
 | 
			
		||||
 | 
			
		||||
from gramps.gen.filters.rules.person import *
 | 
			
		||||
from gramps.gen.filters.rules.person import (
 | 
			
		||||
    Disconnected, Everyone, FamilyWithIncompleteEvent, HasAlternateName,
 | 
			
		||||
    HasCommonAncestorWith, HasNickname, HasUnknownGender, HasSourceOf,
 | 
			
		||||
    HaveAltFamilies, HaveChildren, IncompleteNames, IsBookmarked,
 | 
			
		||||
    IsDuplicatedAncestorOf, IsRelatedWith, HasIdOf, IsDefaultPerson, IsFemale,
 | 
			
		||||
    IsMale, MissingParent, MultipleMarriages, NeverMarried, NoBirthdate,
 | 
			
		||||
    NoDeathdate, PeoplePrivate, PeoplePublic, PersonWithIncompleteEvent,
 | 
			
		||||
    RelationshipPathBetweenBookmarks)
 | 
			
		||||
 | 
			
		||||
class BaseTest(unittest.TestCase):
 | 
			
		||||
    """
 | 
			
		||||
    Person rule tests.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def setUpClass(cls):
 | 
			
		||||
        """
 | 
			
		||||
        Import example database.
 | 
			
		||||
        """
 | 
			
		||||
        cls.db = import_as_dict("example/gramps/example.gramps", User())
 | 
			
		||||
 | 
			
		||||
    def filter_with_rule(self, rule):
 | 
			
		||||
        """
 | 
			
		||||
        Apply a filter with the given rule.
 | 
			
		||||
        """
 | 
			
		||||
        filter_ = GenericFilter()
 | 
			
		||||
        filter_.add_rule(rule)
 | 
			
		||||
        results = filter_.apply(self.db)
 | 
			
		||||
        return set(results)
 | 
			
		||||
 | 
			
		||||
    def test_Disconnected(self):
 | 
			
		||||
    def test_disconnected(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test Disconnected rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = Disconnected([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'0PBKQCXHLAEIB46ZIA', b'QEVJQC04YO01UAWJ2N', b'UT0KQCMN7PC9XURRXJ', b'MZAKQCKAQLIQYWP5IW',
 | 
			
		||||
            b'Y7BKQC9CUXWQLGLPQM', b'OBBKQC8NJM5UYBO849', b'NPBKQCKEF0G7T4H312', b'423KQCGLT8UISDUM1Q',
 | 
			
		||||
            b'8S0KQCNORIWDL0X8SB', b'AP5KQC0LBXPM727OWB', b'AREKQC0VPBHNZ5R3IO', b'KU0KQCJ0RUTJTIUKSA',
 | 
			
		||||
            b'VC4KQC7L7KKH9RLHXN', b'0P3KQCRSIVL1A4VJ19', b'PK6KQCGEL4PTE720BL', b'YIKKQCSD2Z85UHJ8LX',
 | 
			
		||||
            b'KY8KQCMIH2HUUGLA3R', b'RD7KQCQ24B1N3OEC5X', b'NV0KQC7SIEH3SVDPP1', b'KIKKQCU2CJ543TLM5J',
 | 
			
		||||
            b'AT0KQC4P3MMUCHI3BK', b'J6BKQC1PMNBAYSLM9U', b'IXXJQCLKOUAJ5RSQY4', b'U4ZJQC5VR0QBIE8DU',
 | 
			
		||||
            b'F7BKQC4NXO9R7XOG2W', b'7U0KQC6PGZBNQATNOT', b'78AKQCI05U36T3E82O', b'H1GKQCWOUJHFSHXABA',
 | 
			
		||||
            b'ZWGKQCRFZAPC5PYJZ1', b'EZ0KQCF3LSM9PRSG0K', b'FHKKQC963NGSY18ZDZ', b'FJ9KQCRJ3RGHNBWW4S',
 | 
			
		||||
            b'S2EKQC9F4UR4R71IC3', b'1XBKQCX019BKJ0M9IH', b'Z62KQC706L0B0WTN3Q', b'O7EKQCEVZ7FBEWMNWE',
 | 
			
		||||
            b'XY8KQCULFPN4SR915Q', b'WQDKQCEULSD5G9XNFI', b'2Z0KQCSWKVFG7RPFD8', b'26BKQC0SJIJOH02H2A',
 | 
			
		||||
            b'262KQCH2RQKN0CBRLF', b'P5ZJQCMKO7EYV4HFCL', b'KXBKQC52JO3AP4GMLF', b'9IFKQC60JTDBV57N6S',
 | 
			
		||||
            b'TQ0KQCZ8LA7X9DIEAN', b'BAXJQCORQA5Q46FCDG', b'VR0KQC7LVANO83AL35', b'75CKQC4T617U2E5T5Y',
 | 
			
		||||
            b'LCTKQCZU3F94CEFSOM', b'WJYJQCPNJJI5JN07SD', b'3N6KQC6BE5EIXTRMDL', b'CM5KQCD57I15GKLAMB',
 | 
			
		||||
            b'cccbffffd3e69819cd8', b'BJKKQCVDA66528PDAU', b'QS0KQCLMIZFI8ZDLM3', b'UW0KQCRHBIYMA8LPZD',
 | 
			
		||||
            b'GJ7KQC7APJSAMHEK5Q', b'711KQCDXOQWB3KDWEP', b'PY0KQC77AJ3457A6C2', b'WZ0KQCYVMEJHDR4MV2',
 | 
			
		||||
            b'28EKQCQGM6NLLWFRG7', b'E33KQCRREJALRA715H', b'8HKKQCTEJAOBVH410L', b'IO6KQC70PMBQUDNB3L',
 | 
			
		||||
            b'1YBKQCWRBNB433NEMH', b'M01KQCF7KUWCDY67JD', b'CR0KQCOMV2QPPC90IF', b'85ZJQCMG38N7Q2WKIK',
 | 
			
		||||
            b'I9GKQCERACL8UZF2PY', b'BY0KQCOZUK47R2JZDE', b'7W0KQCYDMD4LTSY5JL', b'A0YJQC3HONEKD1JCPK',
 | 
			
		||||
            b'0PBKQCXHLAEIB46ZIA', b'QEVJQC04YO01UAWJ2N', b'UT0KQCMN7PC9XURRXJ',
 | 
			
		||||
            b'MZAKQCKAQLIQYWP5IW', b'Y7BKQC9CUXWQLGLPQM', b'OBBKQC8NJM5UYBO849',
 | 
			
		||||
            b'NPBKQCKEF0G7T4H312', b'423KQCGLT8UISDUM1Q', b'8S0KQCNORIWDL0X8SB',
 | 
			
		||||
            b'AP5KQC0LBXPM727OWB', b'AREKQC0VPBHNZ5R3IO', b'KU0KQCJ0RUTJTIUKSA',
 | 
			
		||||
            b'VC4KQC7L7KKH9RLHXN', b'0P3KQCRSIVL1A4VJ19', b'PK6KQCGEL4PTE720BL',
 | 
			
		||||
            b'YIKKQCSD2Z85UHJ8LX', b'KY8KQCMIH2HUUGLA3R', b'RD7KQCQ24B1N3OEC5X',
 | 
			
		||||
            b'NV0KQC7SIEH3SVDPP1', b'KIKKQCU2CJ543TLM5J', b'AT0KQC4P3MMUCHI3BK',
 | 
			
		||||
            b'J6BKQC1PMNBAYSLM9U', b'IXXJQCLKOUAJ5RSQY4', b'U4ZJQC5VR0QBIE8DU',
 | 
			
		||||
            b'F7BKQC4NXO9R7XOG2W', b'7U0KQC6PGZBNQATNOT', b'78AKQCI05U36T3E82O',
 | 
			
		||||
            b'H1GKQCWOUJHFSHXABA', b'ZWGKQCRFZAPC5PYJZ1', b'EZ0KQCF3LSM9PRSG0K',
 | 
			
		||||
            b'FHKKQC963NGSY18ZDZ', b'FJ9KQCRJ3RGHNBWW4S', b'S2EKQC9F4UR4R71IC3',
 | 
			
		||||
            b'1XBKQCX019BKJ0M9IH', b'Z62KQC706L0B0WTN3Q', b'O7EKQCEVZ7FBEWMNWE',
 | 
			
		||||
            b'XY8KQCULFPN4SR915Q', b'WQDKQCEULSD5G9XNFI', b'2Z0KQCSWKVFG7RPFD8',
 | 
			
		||||
            b'26BKQC0SJIJOH02H2A', b'262KQCH2RQKN0CBRLF', b'P5ZJQCMKO7EYV4HFCL',
 | 
			
		||||
            b'KXBKQC52JO3AP4GMLF', b'9IFKQC60JTDBV57N6S', b'TQ0KQCZ8LA7X9DIEAN',
 | 
			
		||||
            b'BAXJQCORQA5Q46FCDG', b'VR0KQC7LVANO83AL35', b'75CKQC4T617U2E5T5Y',
 | 
			
		||||
            b'LCTKQCZU3F94CEFSOM', b'WJYJQCPNJJI5JN07SD', b'3N6KQC6BE5EIXTRMDL',
 | 
			
		||||
            b'CM5KQCD57I15GKLAMB', b'cccbffffd3e69819cd8',
 | 
			
		||||
            b'BJKKQCVDA66528PDAU', b'QS0KQCLMIZFI8ZDLM3', b'UW0KQCRHBIYMA8LPZD',
 | 
			
		||||
            b'GJ7KQC7APJSAMHEK5Q', b'711KQCDXOQWB3KDWEP', b'PY0KQC77AJ3457A6C2',
 | 
			
		||||
            b'WZ0KQCYVMEJHDR4MV2', b'28EKQCQGM6NLLWFRG7', b'E33KQCRREJALRA715H',
 | 
			
		||||
            b'8HKKQCTEJAOBVH410L', b'IO6KQC70PMBQUDNB3L', b'1YBKQCWRBNB433NEMH',
 | 
			
		||||
            b'M01KQCF7KUWCDY67JD', b'CR0KQCOMV2QPPC90IF', b'85ZJQCMG38N7Q2WKIK',
 | 
			
		||||
            b'I9GKQCERACL8UZF2PY', b'BY0KQCOZUK47R2JZDE', b'7W0KQCYDMD4LTSY5JL',
 | 
			
		||||
            b'A0YJQC3HONEKD1JCPK',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_Everyone(self):
 | 
			
		||||
    def test_everyone(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test Everyone rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = Everyone([])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), self.db.get_number_of_people())
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)),
 | 
			
		||||
                         self.db.get_number_of_people())
 | 
			
		||||
 | 
			
		||||
    def test_FamilyWithIncompleteEvent(self):
 | 
			
		||||
    def test_familywithincompleteevent(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test FamilyWithIncompleteEvent rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = FamilyWithIncompleteEvent([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 775)
 | 
			
		||||
 | 
			
		||||
    def test_HasAlternateName(self):
 | 
			
		||||
    def test_hasalternatename(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasAlternateName rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasAlternateName([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'46WJQCIOLQ0KOX2XCC', b'GNUJQCL9MD64AM56OH',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasCommonAncestorWith_empty(self):
 | 
			
		||||
    def test_commonancestor_empty(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test empty HasCommonAncestorWith rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasCommonAncestorWith([''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasCommonAncestorWith_nonmatching(self):
 | 
			
		||||
    def test_commonancestor_nonmatching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test non-matching HasCommonAncestorWith rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasCommonAncestorWith(['I0000'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasCommonAncestorWith_irregular(self):
 | 
			
		||||
    def test_commonancestor_irregular(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test irregular HasCommonAncestorWith rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasCommonAncestorWith(['ABCDEFG'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasCommonAncestorWith_matching(self):
 | 
			
		||||
    def test_commonancestor_matching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test matching HasCommonAncestorWith rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasCommonAncestorWith(['I0044'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'GNUJQCL9MD64AM56OH', b'SOFKQCBYAO18OWC0CS', b'EMEKQC02EOUF8H0SHM', b'3EXJQCVWOSQFGLYB6H',
 | 
			
		||||
            b'EMTJQCQU6TL4WAVSE4', b'QUEKQCZL61S8BJJ388', b'MKEKQCSBQGAVHAPCQT', b'MUFKQCMXUJ07MCDUNI',
 | 
			
		||||
            b'DBXJQCJCEZMO17WZ89', b'ORFKQC4KLWEGTGR19L', b'MG5KQC6ZKSVO4A63G2', b'N26KQCF3ASHMZ0HEW6',
 | 
			
		||||
            b'GNWJQC9NLVF2MZLHU9', b'ZFXJQCHAD8SLZZ7KRP', b'44WJQCLCQIPZUB0UH', b'B8TJQC53HJXOGXK8F7',
 | 
			
		||||
            b'D3WJQCCGV58IP8PNHZ', b'3LEKQCRF3FD2E1H73I', b'F06KQCZY1I4H4IFZM', b'VMTJQC49IGKLG2EQ5',
 | 
			
		||||
            b'9BXKQC1PVLPYFMD6IX', b'H1DKQC4YGZ5A61FGS', b'1GWJQCGOOZ8FJW3YK9', b'S16KQCX8XUO3EEL85N',
 | 
			
		||||
            b'OREKQCF34YE89RL8S6', b'RU5KQCQTPC9SJ5Q1JN', b'GYFKQCPH8Q0JDN94GR', b'9QFKQC54ET79K2SD57',
 | 
			
		||||
            b'MLEKQCH64557K610VR', b'AWFKQCJELLUWDY2PD3', b'ZDWJQC7TMS2AWAVF2Y', b'VJFKQCFO7WESWPNKHE',
 | 
			
		||||
            b'LV5KQCJCCR0S3DN5WW', b'CDTJQCVTVX7CNMY9YU', b'OX5KQCKE3I94MEPDC', b'JF5KQC2L6ABI0MVD3E',
 | 
			
		||||
            b'CH5KQCIEXSN1J5UEHB', b'4JEKQC22K5UTH9QHCU', b'EPFKQCETTDTEL3PYIR', b'D16KQCIZS56HVPW6DA',
 | 
			
		||||
            b'2TEKQCTSCRL4Z2AUHE', b'3WEKQCHXRH61E3CIKB', b'TDTJQCGYRS2RCCGQN3', b'SMWJQCXQ6I2GEXSPK9',
 | 
			
		||||
            b'PXFKQCXEHJX3W1Q1IV', b'Q9TJQCXDL1599L2B2Z', b'BFXJQCF1JBOXPRW2OS', b'6TFKQCUTO94WB2NHN',
 | 
			
		||||
            b'FNEKQCO239QSNK0R78', b'3RFKQCNKMX9HVLNSLW', b'W2DKQCV4H3EZUJ35DX', b'5IEKQCN37EFBK9EBUD',
 | 
			
		||||
            b'LW5KQCXSXRC2XV3T3D', b'ZNEKQCULV911DIXBK3', b'35WJQC1B7T7NPV8OLV', b'MPEKQC6TIP3SP1YF7I',
 | 
			
		||||
            b'DMFKQC5MHGYC6503F2', b'3KEKQC45RL87D4ZG86', b'KLTJQC70XVZJSPQ43U', b'LVEKQCP09W7JNFDAFC',
 | 
			
		||||
            b'DPUJQCUYKKDPT78JJV', b'JDXJQCR5L0NTR21SQA', b'UAXJQC6HC354V7Q6JA', b'XBXJQCS4QY316ZGHRN',
 | 
			
		||||
            b'HCXJQCRKB4K65V1C07', b'66TJQC6CC7ZWL9YZ64', b'XNFKQC6DN59LACS9IU', b'LL5KQCG687Y165GL5P',
 | 
			
		||||
            b'7X5KQC9ABK4T6AW7QF', b'HKTJQCIJD8RK9RJFO1', b'1LTJQCYQI1DXBLG6Z', b'0FWJQCLYEP736P3YZK',
 | 
			
		||||
            b'0DXJQC1T8P3CQKZIUO', b'ISEKQC97YI74A9VKWC', b'KGXJQCBQ39ON9VB37T', b'BZ5KQCD4KFI3BTIMZU',
 | 
			
		||||
            b'0HEKQCLINMQS4RB7B8', b'BBTJQCNT6N1H4X6TL4', b'COFKQCUXC2H4G3QBYT', b'DI5KQC3CLKWQI3I0CC',
 | 
			
		||||
            b'T8TJQCWWI8RY57YNTQ', b'46WJQCIOLQ0KOX2XCC', b'OEXJQCQJHF2BLSAAIS', b'GNFKQCH8AFJRJO9V4Y',
 | 
			
		||||
            b'8LFKQCQWXTJQJR4CXV', b'IGWJQCSVT8NXTFXOFJ', b'3PEKQC8ZDCYTSSIKZ9', b'5UEKQC8N8NEPSWU1QQ',
 | 
			
		||||
            b'NK5KQC1MAOU2BP35ZV', b'UZFKQCIHVT44DC9KGH', b'JJ5KQC83DT7VDMUYRQ', b'626KQC7C08H3UTM38E',
 | 
			
		||||
            b'XIFKQCLQOY645QTGP7', b'HEWJQCWQQ3K4BNRLIO', b'HDWJQCT361VOV2PQLP', b'XFKKQCGA4DVECEB48E',
 | 
			
		||||
            b'GNUJQCL9MD64AM56OH', b'SOFKQCBYAO18OWC0CS', b'EMEKQC02EOUF8H0SHM',
 | 
			
		||||
            b'3EXJQCVWOSQFGLYB6H', b'EMTJQCQU6TL4WAVSE4', b'QUEKQCZL61S8BJJ388',
 | 
			
		||||
            b'MKEKQCSBQGAVHAPCQT', b'MUFKQCMXUJ07MCDUNI', b'DBXJQCJCEZMO17WZ89',
 | 
			
		||||
            b'ORFKQC4KLWEGTGR19L', b'MG5KQC6ZKSVO4A63G2', b'N26KQCF3ASHMZ0HEW6',
 | 
			
		||||
            b'GNWJQC9NLVF2MZLHU9', b'ZFXJQCHAD8SLZZ7KRP', b'44WJQCLCQIPZUB0UH',
 | 
			
		||||
            b'B8TJQC53HJXOGXK8F7', b'D3WJQCCGV58IP8PNHZ', b'3LEKQCRF3FD2E1H73I',
 | 
			
		||||
            b'F06KQCZY1I4H4IFZM', b'VMTJQC49IGKLG2EQ5', b'9BXKQC1PVLPYFMD6IX',
 | 
			
		||||
            b'H1DKQC4YGZ5A61FGS', b'1GWJQCGOOZ8FJW3YK9', b'S16KQCX8XUO3EEL85N',
 | 
			
		||||
            b'OREKQCF34YE89RL8S6', b'RU5KQCQTPC9SJ5Q1JN', b'GYFKQCPH8Q0JDN94GR',
 | 
			
		||||
            b'9QFKQC54ET79K2SD57', b'MLEKQCH64557K610VR', b'AWFKQCJELLUWDY2PD3',
 | 
			
		||||
            b'ZDWJQC7TMS2AWAVF2Y', b'VJFKQCFO7WESWPNKHE', b'LV5KQCJCCR0S3DN5WW',
 | 
			
		||||
            b'CDTJQCVTVX7CNMY9YU', b'OX5KQCKE3I94MEPDC', b'JF5KQC2L6ABI0MVD3E',
 | 
			
		||||
            b'CH5KQCIEXSN1J5UEHB', b'4JEKQC22K5UTH9QHCU', b'EPFKQCETTDTEL3PYIR',
 | 
			
		||||
            b'D16KQCIZS56HVPW6DA', b'2TEKQCTSCRL4Z2AUHE', b'3WEKQCHXRH61E3CIKB',
 | 
			
		||||
            b'TDTJQCGYRS2RCCGQN3', b'SMWJQCXQ6I2GEXSPK9', b'PXFKQCXEHJX3W1Q1IV',
 | 
			
		||||
            b'Q9TJQCXDL1599L2B2Z', b'BFXJQCF1JBOXPRW2OS', b'6TFKQCUTO94WB2NHN',
 | 
			
		||||
            b'FNEKQCO239QSNK0R78', b'3RFKQCNKMX9HVLNSLW', b'W2DKQCV4H3EZUJ35DX',
 | 
			
		||||
            b'5IEKQCN37EFBK9EBUD', b'LW5KQCXSXRC2XV3T3D', b'ZNEKQCULV911DIXBK3',
 | 
			
		||||
            b'35WJQC1B7T7NPV8OLV', b'MPEKQC6TIP3SP1YF7I', b'DMFKQC5MHGYC6503F2',
 | 
			
		||||
            b'3KEKQC45RL87D4ZG86', b'KLTJQC70XVZJSPQ43U', b'LVEKQCP09W7JNFDAFC',
 | 
			
		||||
            b'DPUJQCUYKKDPT78JJV', b'JDXJQCR5L0NTR21SQA', b'UAXJQC6HC354V7Q6JA',
 | 
			
		||||
            b'XBXJQCS4QY316ZGHRN', b'HCXJQCRKB4K65V1C07', b'66TJQC6CC7ZWL9YZ64',
 | 
			
		||||
            b'XNFKQC6DN59LACS9IU', b'LL5KQCG687Y165GL5P', b'7X5KQC9ABK4T6AW7QF',
 | 
			
		||||
            b'HKTJQCIJD8RK9RJFO1', b'1LTJQCYQI1DXBLG6Z', b'0FWJQCLYEP736P3YZK',
 | 
			
		||||
            b'0DXJQC1T8P3CQKZIUO', b'ISEKQC97YI74A9VKWC', b'KGXJQCBQ39ON9VB37T',
 | 
			
		||||
            b'BZ5KQCD4KFI3BTIMZU', b'0HEKQCLINMQS4RB7B8', b'BBTJQCNT6N1H4X6TL4',
 | 
			
		||||
            b'COFKQCUXC2H4G3QBYT', b'DI5KQC3CLKWQI3I0CC', b'T8TJQCWWI8RY57YNTQ',
 | 
			
		||||
            b'46WJQCIOLQ0KOX2XCC', b'OEXJQCQJHF2BLSAAIS', b'GNFKQCH8AFJRJO9V4Y',
 | 
			
		||||
            b'8LFKQCQWXTJQJR4CXV', b'IGWJQCSVT8NXTFXOFJ', b'3PEKQC8ZDCYTSSIKZ9',
 | 
			
		||||
            b'5UEKQC8N8NEPSWU1QQ', b'NK5KQC1MAOU2BP35ZV', b'UZFKQCIHVT44DC9KGH',
 | 
			
		||||
            b'JJ5KQC83DT7VDMUYRQ', b'626KQC7C08H3UTM38E', b'XIFKQCLQOY645QTGP7',
 | 
			
		||||
            b'HEWJQCWQQ3K4BNRLIO', b'HDWJQCT361VOV2PQLP', b'XFKKQCGA4DVECEB48E',
 | 
			
		||||
            b'KWEKQCTNIIV9BROFFG',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasNickname(self):
 | 
			
		||||
    def test_hasnickname(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasNickname rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasNickname([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'cc8205d883763f02abd', b'GNUJQCL9MD64AM56OH', b'Q8HKQC3VMRM1M6M7ES',
 | 
			
		||||
            b'cc8205d883763f02abd', b'GNUJQCL9MD64AM56OH',
 | 
			
		||||
            b'Q8HKQC3VMRM1M6M7ES',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasUnknownGender(self):
 | 
			
		||||
    def test_hasunknowngender(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasUnknownGender rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasUnknownGender([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'OJOKQC83Y1EDBIMLJ6', b'8BHKQCFK9UZFRJYC2Y', b'PGFKQC1TUQMXFAMLMB', b'IHOKQCECRZYQDKW6KF',
 | 
			
		||||
            b'8HKKQCTEJAOBVH410L', b'AGFKQCO358R18LNJYV', b'1ENKQCBPFZTAQJSP4O', b'NUWKQCO7TVAOH0CHLV',
 | 
			
		||||
            b'P5IKQC88STY3FNTFZ3', b'7GXKQCMVFU8WR1LKZL', b'LGXKQCJ5OP6MKF9QLN', b'XNFKQC6DN59LACS9IU',
 | 
			
		||||
            b'7IOKQC1NVGUI1E55CQ', b'57PKQCFAWY7AM3JS4M', b'BNXKQCEBXC1RCOGJNF', b'TFFKQC1RMG8RRADKDH',
 | 
			
		||||
            b'FHKKQC963NGSY18ZDZ', b'WMXKQCDUJ4JKQQYCR7', b'PBHKQCHOAGTECRKT9L', b'OFXKQC8W0N3N6JP6YQ',
 | 
			
		||||
            b'OJOKQC83Y1EDBIMLJ6', b'8BHKQCFK9UZFRJYC2Y', b'PGFKQC1TUQMXFAMLMB',
 | 
			
		||||
            b'IHOKQCECRZYQDKW6KF', b'8HKKQCTEJAOBVH410L', b'AGFKQCO358R18LNJYV',
 | 
			
		||||
            b'1ENKQCBPFZTAQJSP4O', b'NUWKQCO7TVAOH0CHLV', b'P5IKQC88STY3FNTFZ3',
 | 
			
		||||
            b'7GXKQCMVFU8WR1LKZL', b'LGXKQCJ5OP6MKF9QLN', b'XNFKQC6DN59LACS9IU',
 | 
			
		||||
            b'7IOKQC1NVGUI1E55CQ', b'57PKQCFAWY7AM3JS4M', b'BNXKQCEBXC1RCOGJNF',
 | 
			
		||||
            b'TFFKQC1RMG8RRADKDH', b'FHKKQC963NGSY18ZDZ', b'WMXKQCDUJ4JKQQYCR7',
 | 
			
		||||
            b'PBHKQCHOAGTECRKT9L', b'OFXKQC8W0N3N6JP6YQ',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasSourceOf_empty(self):
 | 
			
		||||
        # this rule run with an empty string finds people with no source citations
 | 
			
		||||
    def test_hassourceof_empty(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test empty HasSourceOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        # when run with an empty string finds people with no sourc citations
 | 
			
		||||
        rule = HasSourceOf([''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'cc82060512042f67e2c', b'cc8205d87831c772e87', b'cc82060516c6c141500', b'cc8205d87fd529000ff',
 | 
			
		||||
            b'cc82060504445ab6deb', b'cc8205d887376aacba2', b'cccbffffd3e69819cd8', b'cc8205d87c20350420b',
 | 
			
		||||
            b'cc8206050e541f79f92', b'cc8205d883763f02abd', b'cc8206050980ea622d0', b'cc8205d872f532ab14e',
 | 
			
		||||
            b'cc82060512042f67e2c', b'cc8205d87831c772e87',
 | 
			
		||||
            b'cc82060516c6c141500', b'cc8205d87fd529000ff',
 | 
			
		||||
            b'cc82060504445ab6deb', b'cc8205d887376aacba2',
 | 
			
		||||
            b'cccbffffd3e69819cd8', b'cc8205d87c20350420b',
 | 
			
		||||
            b'cc8206050e541f79f92', b'cc8205d883763f02abd',
 | 
			
		||||
            b'cc8206050980ea622d0', b'cc8205d872f532ab14e',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasSourceOf_nonmatching(self):
 | 
			
		||||
    def test_hassourceof_nonmatching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test non-matching HasSourceOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasSourceOf(['S0004'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasSourceOf_irregular(self):
 | 
			
		||||
    def test_hassourceof_irregular(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test irregular HasSourceOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasSourceOf(['ABCDEFG'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasSourceOf_matching(self):
 | 
			
		||||
    def test_hassourceof_matching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test matching HasSourceOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasSourceOf(['S0000'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'GNUJQCL9MD64AM56OH',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def test_HaveAltFamilies(self):
 | 
			
		||||
    def test_havealtfamilies(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HaveAltFamilies rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HaveAltFamilies([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'CH5KQCIEXSN1J5UEHB', b'MG5KQC6ZKSVO4A63G2',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HaveChildren(self):
 | 
			
		||||
    def test_havechildren(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HaveChildren rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HaveChildren([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 895)
 | 
			
		||||
 | 
			
		||||
    def test_IncompleteNames(self):
 | 
			
		||||
    def test_incompletenames(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test IncompleteNames rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IncompleteNames([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'IHOKQCECRZYQDKW6KF', b'cc82060504445ab6deb', b'LCXKQCQZH5EH56NTCD', b'cc8205d87831c772e87',
 | 
			
		||||
            b'3RFKQCNKMX9HVLNSLW', b'cc8205d87fd529000ff', b'B1UKQCBR49WB3134PN', b'0TTKQCXXY59OCDPLV3',
 | 
			
		||||
            b'F3UKQC7ZV3EYVWTZ8O', b'1MXKQCJ2BR43910ZYX', b'cc8206050e541f79f92', b'FHKKQC963NGSY18ZDZ',
 | 
			
		||||
            b'R5HKQCIEPOY1DMQOWX', b'ZHMKQC50PFVAPI8PZ6', b'T4UKQCYGECXGVNBWMY', b'cc82060516c6c141500',
 | 
			
		||||
            b'UPWKQCYVFH7RZOSZ29', b'2AMKQCE67YOH3TBVYI', b'2CUKQCFDVN3EZE2E4C', b'7IOKQC1NVGUI1E55CQ',
 | 
			
		||||
            b'KSTKQC018GNA7HDCAS', b'WIVKQC4Q4FCQJT5M63', b'A4YKQCRYSI5FT5T38', b'BUNKQCO4HZHZP70F3K',
 | 
			
		||||
            b'YRTKQCNDP343OD5OQJ', b'7VEKQCV05EDK0625KI', b'cc8205d872f532ab14e', b'TPXKQCEGL04KHGMO2X',
 | 
			
		||||
            b'L9LKQCQ8KJRKHM4D2E', b'8QXKQCHJ2EUC7OV8EQ', b'W0XKQCKSFWWJWQ2OSN', b'I6QKQCFRDTV2LDC8M2',
 | 
			
		||||
            b'XTUKQC7WCIVA5F0NC4', b'F4UKQCPK572VWU2YZQ', b'JKDKQCF4ND92A088J2', b'COFKQCUXC2H4G3QBYT',
 | 
			
		||||
            b'BNXKQCEBXC1RCOGJNF', b'Q42KQCKJZGS4IZWHF5', b'P5IKQC88STY3FNTFZ3', b'7CXKQC59NSZFXIG1UE',
 | 
			
		||||
            b'cc8205d87c20350420b', b'FQUKQCWEHOAWUP4QWS', b'3YTKQCK2W63W0MQBJE', b'8HKKQCTEJAOBVH410L',
 | 
			
		||||
            b'HLQKQC0BJIZL0V4EK4', b'B0UKQC9A54F1GUB7NR', b'EPXKQCQRZP2PNPN7BE', b'cc82060512042f67e2c',
 | 
			
		||||
            b'XZLKQCRQA9EHPBNZPT', b'OQXKQC2Y5FVH9PK0JL', b'AXLKQC0YTFAWQ234YD', b'OFXKQC8W0N3N6JP6YQ',
 | 
			
		||||
            b'MWUKQCD2ZSCECQOCLG', b'1ENKQCBPFZTAQJSP4O', b'N7XKQCYD3VSCSZREGJ', b'2LQKQC62GJUQCJIOK8',
 | 
			
		||||
            b'QXXKQC9PT5FWNT140K', b'VAXKQC19HIFPX61J28', b'0PXKQCJ9S1M3NNASET', b'K8XKQCDSVLSK422A3K',
 | 
			
		||||
            b'52UKQCFYXMFTKIGNBS', b'7GXKQCMVFU8WR1LKZL', b'4UMKQCF07KL2K92CI5', b'LGXKQCJ5OP6MKF9QLN',
 | 
			
		||||
            b'FZTKQCSTPIQ3C9JC46', b'WMXKQCDUJ4JKQQYCR7', b'R6UKQC939L9FV62UGE', b'OIUKQCBHUWDGL7DNTI',
 | 
			
		||||
            b'FRTKQC3G6JBJAR2ZPX', b'PIEKQCKUL6OAMS8Q9R', b'cc8205d887376aacba2', b'LGMKQCQP5M5L18FVTN',
 | 
			
		||||
            b'8HUKQCRV8B3J2LLQ3B', b'LOUKQC45HUN532HOOM', b'cc8205d883763f02abd', b'TBXKQC7OHIN28PVCS3',
 | 
			
		||||
            b'IHOKQCECRZYQDKW6KF', b'cc82060504445ab6deb',
 | 
			
		||||
            b'LCXKQCQZH5EH56NTCD', b'cc8205d87831c772e87',
 | 
			
		||||
            b'3RFKQCNKMX9HVLNSLW', b'cc8205d87fd529000ff',
 | 
			
		||||
            b'B1UKQCBR49WB3134PN', b'0TTKQCXXY59OCDPLV3',
 | 
			
		||||
            b'F3UKQC7ZV3EYVWTZ8O', b'1MXKQCJ2BR43910ZYX',
 | 
			
		||||
            b'cc8206050e541f79f92', b'FHKKQC963NGSY18ZDZ',
 | 
			
		||||
            b'R5HKQCIEPOY1DMQOWX', b'ZHMKQC50PFVAPI8PZ6', b'T4UKQCYGECXGVNBWMY',
 | 
			
		||||
            b'cc82060516c6c141500', b'UPWKQCYVFH7RZOSZ29',
 | 
			
		||||
            b'2AMKQCE67YOH3TBVYI', b'2CUKQCFDVN3EZE2E4C', b'7IOKQC1NVGUI1E55CQ',
 | 
			
		||||
            b'KSTKQC018GNA7HDCAS', b'WIVKQC4Q4FCQJT5M63', b'A4YKQCRYSI5FT5T38',
 | 
			
		||||
            b'BUNKQCO4HZHZP70F3K', b'YRTKQCNDP343OD5OQJ', b'7VEKQCV05EDK0625KI',
 | 
			
		||||
            b'cc8205d872f532ab14e', b'TPXKQCEGL04KHGMO2X',
 | 
			
		||||
            b'L9LKQCQ8KJRKHM4D2E', b'8QXKQCHJ2EUC7OV8EQ', b'W0XKQCKSFWWJWQ2OSN',
 | 
			
		||||
            b'I6QKQCFRDTV2LDC8M2', b'XTUKQC7WCIVA5F0NC4', b'F4UKQCPK572VWU2YZQ',
 | 
			
		||||
            b'JKDKQCF4ND92A088J2', b'COFKQCUXC2H4G3QBYT', b'BNXKQCEBXC1RCOGJNF',
 | 
			
		||||
            b'Q42KQCKJZGS4IZWHF5', b'P5IKQC88STY3FNTFZ3', b'7CXKQC59NSZFXIG1UE',
 | 
			
		||||
            b'cc8205d87c20350420b', b'FQUKQCWEHOAWUP4QWS',
 | 
			
		||||
            b'3YTKQCK2W63W0MQBJE', b'8HKKQCTEJAOBVH410L', b'HLQKQC0BJIZL0V4EK4',
 | 
			
		||||
            b'B0UKQC9A54F1GUB7NR', b'EPXKQCQRZP2PNPN7BE',
 | 
			
		||||
            b'cc82060512042f67e2c', b'XZLKQCRQA9EHPBNZPT',
 | 
			
		||||
            b'OQXKQC2Y5FVH9PK0JL', b'AXLKQC0YTFAWQ234YD', b'OFXKQC8W0N3N6JP6YQ',
 | 
			
		||||
            b'MWUKQCD2ZSCECQOCLG', b'1ENKQCBPFZTAQJSP4O', b'N7XKQCYD3VSCSZREGJ',
 | 
			
		||||
            b'2LQKQC62GJUQCJIOK8', b'QXXKQC9PT5FWNT140K', b'VAXKQC19HIFPX61J28',
 | 
			
		||||
            b'0PXKQCJ9S1M3NNASET', b'K8XKQCDSVLSK422A3K', b'52UKQCFYXMFTKIGNBS',
 | 
			
		||||
            b'7GXKQCMVFU8WR1LKZL', b'4UMKQCF07KL2K92CI5', b'LGXKQCJ5OP6MKF9QLN',
 | 
			
		||||
            b'FZTKQCSTPIQ3C9JC46', b'WMXKQCDUJ4JKQQYCR7', b'R6UKQC939L9FV62UGE',
 | 
			
		||||
            b'OIUKQCBHUWDGL7DNTI', b'FRTKQC3G6JBJAR2ZPX', b'PIEKQCKUL6OAMS8Q9R',
 | 
			
		||||
            b'cc8205d887376aacba2', b'LGMKQCQP5M5L18FVTN',
 | 
			
		||||
            b'8HUKQCRV8B3J2LLQ3B', b'LOUKQC45HUN532HOOM',
 | 
			
		||||
            b'cc8205d883763f02abd', b'TBXKQC7OHIN28PVCS3',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsBookmarked(self):
 | 
			
		||||
    def test_isbookmarked(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test IsBookmarked rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsBookmarked([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'35WJQC1B7T7NPV8OLV', b'AWFKQCJELLUWDY2PD3', b'Q8HKQC3VMRM1M6M7ES',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsDuplicatedAncestorOf_empty(self):
 | 
			
		||||
    def test_dupancestor_empty(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test empty IsDuplicatedAncestorOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsDuplicatedAncestorOf([''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsDuplicatedAncestorOf_nonmatching(self):
 | 
			
		||||
    def test_dupancestor_nonmatching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test non-matching IsDuplicatedAncestorOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsDuplicatedAncestorOf(['I0000'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsDuplicatedAncestorOf_irregular(self):
 | 
			
		||||
    def test_dupancestor_irregular(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test irregular IsDuplicatedAncestorOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsDuplicatedAncestorOf(['ABCDEFG'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsDuplicatedAncestorOf_matching(self):
 | 
			
		||||
    def test_dupancestor_matching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test matching IsDuplicatedAncestorOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsDuplicatedAncestorOf(['I1631'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'I3VJQCUY5I6UR92507', b'D4VJQC09STQCWD393E',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsRelatedWith_empty(self):
 | 
			
		||||
    def test_isrelatedwith_empty(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test empty IsRelatedWith rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsRelatedWith([''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsRelatedWith_nonmatching(self):
 | 
			
		||||
    def test_isrelatedwith_nonmatching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test non-matching IsRelatedWith rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsRelatedWith(['I0000'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsRelatedWith_irregular(self):
 | 
			
		||||
    def test_isrelatedwith_irregular(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test irregular IsRelatedWith rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsRelatedWith(['ABCDEFG'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsRelatedWith_matching(self):
 | 
			
		||||
    def test_isrelatedwith_matching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test matching IsRelatedWith rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsRelatedWith(['I1844'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'HWTKQCSM28EI6WFDHP', b'T4UKQCYGECXGVNBWMY', b'YOTKQCEX2PLG03LZQS', b'X8UKQCIDY21QIQBDVI',
 | 
			
		||||
            b'F3UKQC7ZV3EYVWTZ8O', b'0TTKQCXXY59OCDPLV3', b'EVTKQCHV2E2PODFD7C', b'BBUKQC5GPRPDJHJAWU',
 | 
			
		||||
            b'FRTKQC3G6JBJAR2ZPX', b'NDTKQCN95VFLGJ21L', b'SFTKQC26EJ2BYQCRIA', b'MYTKQCVCFOFM32H9GB',
 | 
			
		||||
            b'B0UKQC9A54F1GUB7NR', b'PTTKQCYN0JR3ZZJNWR', b'F4UKQCPK572VWU2YZQ', b'LLTKQCX39KCXFSX0U4',
 | 
			
		||||
            b'IXTKQC1BAU1F1WNXKB', b'3YTKQCK2W63W0MQBJE', b'TQTKQCO897BNA1H93B', b'DOTKQCP1MG3VC8D7V2',
 | 
			
		||||
            b'3NTKQCZKLMIM6HYFE1', b'WUTKQCVQCUPFFOGUT8', b'GETKQCPRC2W5YDUYM6', b'YRTKQCNDP343OD5OQJ',
 | 
			
		||||
            b'U0UKQCBZS0R6WW7LBS', b'J2UKQC897I42M9VHDD', b'7MTKQC1QNE4H5RF35S', b'5FTKQCKT9SDZ8TB03C',
 | 
			
		||||
            b'O1UKQCJD5YHDRW887V', b'EUTKQCFATXRU431YY6', b'UHTKQCORH3NTZ0FYL3', b'2CUKQCFDVN3EZE2E4C',
 | 
			
		||||
            b'RNTKQCMLGRRKQVKDPR', b'CGTKQC4WO8W3WSQRCX', b'WAUKQCOQ91QCJZWQ9U', b'FZTKQCSTPIQ3C9JC46',
 | 
			
		||||
            b'AHTKQCM2YFRW3AGSRL', b'WBTKQCC775IAAGIWZD', b'8KTKQC407A8CN5O68H', b'8QTKQCN8ZKY5OWWJZF',
 | 
			
		||||
            b'UKTKQCSL3AUJIWTD2A', b'HAUKQCM3GYGVTREGZS', b'52UKQCFYXMFTKIGNBS', b'U3UKQCO30PWAK6JQBA',
 | 
			
		||||
            b'R6UKQC939L9FV62UGE', b'TZTKQCR39A060AQ63C', b'X9UKQCFELSDAQ2TDP1', b'B1UKQCBR49WB3134PN',
 | 
			
		||||
            b'KSTKQC018GNA7HDCAS', b'FJTKQCJCMAHJOA9NHI', b'HITKQCWJSCZX2AN6NP', b'WVTKQCZC91I63LHEE7',
 | 
			
		||||
            b'0DTKQC6KBOS69LQJ35',
 | 
			
		||||
            b'HWTKQCSM28EI6WFDHP', b'T4UKQCYGECXGVNBWMY', b'YOTKQCEX2PLG03LZQS',
 | 
			
		||||
            b'X8UKQCIDY21QIQBDVI', b'F3UKQC7ZV3EYVWTZ8O', b'0TTKQCXXY59OCDPLV3',
 | 
			
		||||
            b'EVTKQCHV2E2PODFD7C', b'BBUKQC5GPRPDJHJAWU', b'FRTKQC3G6JBJAR2ZPX',
 | 
			
		||||
            b'NDTKQCN95VFLGJ21L', b'SFTKQC26EJ2BYQCRIA', b'MYTKQCVCFOFM32H9GB',
 | 
			
		||||
            b'B0UKQC9A54F1GUB7NR', b'PTTKQCYN0JR3ZZJNWR', b'F4UKQCPK572VWU2YZQ',
 | 
			
		||||
            b'LLTKQCX39KCXFSX0U4', b'IXTKQC1BAU1F1WNXKB', b'3YTKQCK2W63W0MQBJE',
 | 
			
		||||
            b'TQTKQCO897BNA1H93B', b'DOTKQCP1MG3VC8D7V2', b'3NTKQCZKLMIM6HYFE1',
 | 
			
		||||
            b'WUTKQCVQCUPFFOGUT8', b'GETKQCPRC2W5YDUYM6', b'YRTKQCNDP343OD5OQJ',
 | 
			
		||||
            b'U0UKQCBZS0R6WW7LBS', b'J2UKQC897I42M9VHDD', b'7MTKQC1QNE4H5RF35S',
 | 
			
		||||
            b'5FTKQCKT9SDZ8TB03C', b'O1UKQCJD5YHDRW887V', b'EUTKQCFATXRU431YY6',
 | 
			
		||||
            b'UHTKQCORH3NTZ0FYL3', b'2CUKQCFDVN3EZE2E4C', b'RNTKQCMLGRRKQVKDPR',
 | 
			
		||||
            b'CGTKQC4WO8W3WSQRCX', b'WAUKQCOQ91QCJZWQ9U', b'FZTKQCSTPIQ3C9JC46',
 | 
			
		||||
            b'AHTKQCM2YFRW3AGSRL', b'WBTKQCC775IAAGIWZD', b'8KTKQC407A8CN5O68H',
 | 
			
		||||
            b'8QTKQCN8ZKY5OWWJZF', b'UKTKQCSL3AUJIWTD2A', b'HAUKQCM3GYGVTREGZS',
 | 
			
		||||
            b'52UKQCFYXMFTKIGNBS', b'U3UKQCO30PWAK6JQBA', b'R6UKQC939L9FV62UGE',
 | 
			
		||||
            b'TZTKQCR39A060AQ63C', b'X9UKQCFELSDAQ2TDP1', b'B1UKQCBR49WB3134PN',
 | 
			
		||||
            b'KSTKQC018GNA7HDCAS', b'FJTKQCJCMAHJOA9NHI', b'HITKQCWJSCZX2AN6NP',
 | 
			
		||||
            b'WVTKQCZC91I63LHEE7', b'0DTKQC6KBOS69LQJ35',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasIdOf_empty(self):
 | 
			
		||||
    def test_hasidof_empty(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test empty HasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasIdOf([''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasIdOf_nonmatching(self):
 | 
			
		||||
    def test_hasidof_nonmatching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test non-matching HasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasIdOf(['I0000'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasIdOf_irregular(self):
 | 
			
		||||
    def test_hasidof_irregular(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test irregular HasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasIdOf(['ABCDEFG'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasIdOf_matching(self):
 | 
			
		||||
    def test_hasidof_matching(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test matching HasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasIdOf(['I0044'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'GNUJQCL9MD64AM56OH',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsDefaultPerson(self):
 | 
			
		||||
    def test_isdefaultperson(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test IsDefaultPerson rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsDefaultPerson([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'GNUJQCL9MD64AM56OH',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_IsFemale(self):
 | 
			
		||||
    def test_isfemale(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test IsFemale rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsFemale([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 928)
 | 
			
		||||
 | 
			
		||||
    def test_IsMale(self):
 | 
			
		||||
    def test_ismale(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test IsMale rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsMale([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 1154)
 | 
			
		||||
 | 
			
		||||
    def test_MissingParent(self):
 | 
			
		||||
    def test_missingparent(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test MissingParent rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = MissingParent([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 849)
 | 
			
		||||
 | 
			
		||||
    def test_MultipleMarriages(self):
 | 
			
		||||
    def test_multiplemarriages(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test MultipleMarriages rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = MultipleMarriages([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'R1VKQCJWNP24VN7BO', b'ZTVJQCTSMI85EGMXFM', b'ENTJQCZXQV1IRKJXUL', b'44WJQCLCQIPZUB0UH',
 | 
			
		||||
            b'SMWJQCXQ6I2GEXSPK9', b'DN3KQC1URTED410L3R', b'5FYJQC86G8EZ0L4E4B', b'5F4KQCJRU8ZKL6SILT',
 | 
			
		||||
            b'0YNKQC5U4EQGVNUZD8', b'YRYJQCE3RF4U8A59UB', b'APWKQCI6YXAXBLC33I', b'XSKKQC6GGKLAYANWAF',
 | 
			
		||||
            b'0FQKQCOQD0VRVJPTSD', b'B3UJQCZHDXII99AWW4', b'cc8205d872f532ab14e', b'SS1KQCWWF9488Q330U',
 | 
			
		||||
            b'OCYJQCS8YT7JO8KIMO', b'I6HKQCQF72V2N56JQ5', b'6YWJQC86FBVN0J6JS', b'KYNKQCVA6FE65ONFIQ',
 | 
			
		||||
            b'SHAKQCNY5IXO30GUAB', b'O5XKQC3V6BPJI13J24', b'ZN7KQC3RLB82EXF1QF', b'CIYJQCF3UK12DL0S2Y',
 | 
			
		||||
            b'H3XJQCFJ4FP4U2WGZC', b'cc82060504445ab6deb', b'4E4KQC1K4XUEX29IJO', b'0XVJQCJUNJY40WDSMA',
 | 
			
		||||
            b'1WUJQCHNH76G6YD3A', b'IH3KQCM1VZPRKLBLK7', b'242KQCBALBOD8ZK5VI', b'8G4KQCS6C1AOM6ZGR3',
 | 
			
		||||
            b'I1EKQCGGDSUD8ILUW4', b'X8BKQCSFF4AET5MY23', b'RJWJQCN1XKXRN5KMCP', b'ZWNKQC9DAZ3C6UHUAV',
 | 
			
		||||
            b'9QUJQCCSWRZNSAPCR', b'HI0KQCG9TGT5AAIPU', b'DI4KQC3S1AO27VWOLN', b'QBDKQCH2IU6N8IXMFE',
 | 
			
		||||
            b'DK2KQCJYW14VXUJ85', b'117KQCBB32RMTTV4G6', b'0QLKQCFTQMNVGCV4GM', b'D2OKQCGDNPT3BH4WH',
 | 
			
		||||
            b'CAYJQCKOL49OF7XWB3', b'ZQGKQCGHS67Q4IMHEG', b'OEXJQCQJHF2BLSAAIS', b'UKYJQC70LIZQ11BP89',
 | 
			
		||||
            b'R1VKQCJWNP24VN7BO', b'ZTVJQCTSMI85EGMXFM', b'ENTJQCZXQV1IRKJXUL',
 | 
			
		||||
            b'44WJQCLCQIPZUB0UH', b'SMWJQCXQ6I2GEXSPK9', b'DN3KQC1URTED410L3R',
 | 
			
		||||
            b'5FYJQC86G8EZ0L4E4B', b'5F4KQCJRU8ZKL6SILT', b'0YNKQC5U4EQGVNUZD8',
 | 
			
		||||
            b'YRYJQCE3RF4U8A59UB', b'APWKQCI6YXAXBLC33I', b'XSKKQC6GGKLAYANWAF',
 | 
			
		||||
            b'0FQKQCOQD0VRVJPTSD', b'B3UJQCZHDXII99AWW4',
 | 
			
		||||
            b'cc8205d872f532ab14e', b'SS1KQCWWF9488Q330U',
 | 
			
		||||
            b'OCYJQCS8YT7JO8KIMO', b'I6HKQCQF72V2N56JQ5', b'6YWJQC86FBVN0J6JS',
 | 
			
		||||
            b'KYNKQCVA6FE65ONFIQ', b'SHAKQCNY5IXO30GUAB', b'O5XKQC3V6BPJI13J24',
 | 
			
		||||
            b'ZN7KQC3RLB82EXF1QF', b'CIYJQCF3UK12DL0S2Y', b'H3XJQCFJ4FP4U2WGZC',
 | 
			
		||||
            b'cc82060504445ab6deb', b'4E4KQC1K4XUEX29IJO',
 | 
			
		||||
            b'0XVJQCJUNJY40WDSMA', b'1WUJQCHNH76G6YD3A', b'IH3KQCM1VZPRKLBLK7',
 | 
			
		||||
            b'242KQCBALBOD8ZK5VI', b'8G4KQCS6C1AOM6ZGR3', b'I1EKQCGGDSUD8ILUW4',
 | 
			
		||||
            b'X8BKQCSFF4AET5MY23', b'RJWJQCN1XKXRN5KMCP', b'ZWNKQC9DAZ3C6UHUAV',
 | 
			
		||||
            b'9QUJQCCSWRZNSAPCR', b'HI0KQCG9TGT5AAIPU', b'DI4KQC3S1AO27VWOLN',
 | 
			
		||||
            b'QBDKQCH2IU6N8IXMFE', b'DK2KQCJYW14VXUJ85', b'117KQCBB32RMTTV4G6',
 | 
			
		||||
            b'0QLKQCFTQMNVGCV4GM', b'D2OKQCGDNPT3BH4WH', b'CAYJQCKOL49OF7XWB3',
 | 
			
		||||
            b'ZQGKQCGHS67Q4IMHEG', b'OEXJQCQJHF2BLSAAIS', b'UKYJQC70LIZQ11BP89',
 | 
			
		||||
            b'FF2KQCRBSPCG1QY97', b'L6EKQCO8QYL2UO2MQO',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_NeverMarried(self):
 | 
			
		||||
    def test_nevermarried(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test NeverMarried rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = NeverMarried([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 749)
 | 
			
		||||
 | 
			
		||||
    def test_NoBirthdate(self):
 | 
			
		||||
    def test_nobirthdate(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test NoBirthdate rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = NoBirthdate([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 966)
 | 
			
		||||
 | 
			
		||||
    def test_NoDeathdate(self):
 | 
			
		||||
    def test_nodeathdate(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test NoDeathdate rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = NoDeathdate([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 1581)
 | 
			
		||||
 | 
			
		||||
    def test_PeoplePrivate(self):
 | 
			
		||||
    def test_peopleprivate(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test PeoplePrivate rule.
 | 
			
		||||
        """
 | 
			
		||||
        # TODO: example.gramps has no people marked private
 | 
			
		||||
        rule = PeoplePrivate([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            ]))
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([]))
 | 
			
		||||
 | 
			
		||||
    def test_PeoplePublic(self):
 | 
			
		||||
    def test_peoplepublic(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test PeoplePublic rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = PeoplePublic([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 2102)
 | 
			
		||||
 | 
			
		||||
    def test_PersonWithIncompleteEvent(self):
 | 
			
		||||
    def test_personwithincompleteevent(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test PersonWithIncompleteEvent rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = PersonWithIncompleteEvent([])
 | 
			
		||||
        # too many to list out to test explicitly
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 740)
 | 
			
		||||
 | 
			
		||||
    def test_RelationshipPathBetweenBookmarks(self):
 | 
			
		||||
    def test_relationshipbookmarks(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test RelationshipPathBetweenBookmarks rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = RelationshipPathBetweenBookmarks([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'44WJQCLCQIPZUB0UH', b'35WJQC1B7T7NPV8OLV', b'AWFKQCJELLUWDY2PD3', b'D3WJQCCGV58IP8PNHZ',
 | 
			
		||||
            b'Q8HKQC3VMRM1M6M7ES',
 | 
			
		||||
            b'44WJQCLCQIPZUB0UH', b'35WJQC1B7T7NPV8OLV', b'AWFKQCJELLUWDY2PD3',
 | 
			
		||||
            b'D3WJQCCGV58IP8PNHZ', b'Q8HKQC3VMRM1M6M7ES',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,43 +27,71 @@ from gramps.gen.merge.diff import import_as_dict
 | 
			
		||||
from gramps.cli.user import User
 | 
			
		||||
from gramps.gen.filters import GenericFilterFactory
 | 
			
		||||
 | 
			
		||||
from gramps.gen.filters.rules.place import *
 | 
			
		||||
from gramps.gen.filters.rules.place import (
 | 
			
		||||
    AllPlaces, HasCitation, HasGallery, HasIdOf, RegExpIdOf, HasNote,
 | 
			
		||||
    HasNoteRegexp, HasReferenceCountOf, HasSourceCount, HasSourceOf,
 | 
			
		||||
    PlacePrivate, MatchesSourceConfidence, HasData, HasNoLatOrLon,
 | 
			
		||||
    InLatLonNeighborhood, ChangedSince, HasTag, HasTitle, IsEnclosedBy)
 | 
			
		||||
 | 
			
		||||
GenericPlaceFilter = GenericFilterFactory('Place')
 | 
			
		||||
 | 
			
		||||
class BaseTest(unittest.TestCase):
 | 
			
		||||
    """
 | 
			
		||||
    Place rule tests.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def setUpClass(cls):
 | 
			
		||||
        """
 | 
			
		||||
        Import example database.
 | 
			
		||||
        """
 | 
			
		||||
        cls.db = import_as_dict("example/gramps/example.gramps", User())
 | 
			
		||||
 | 
			
		||||
    def filter_with_rule(self, rule):
 | 
			
		||||
        """
 | 
			
		||||
        Apply a filter with the given rule.
 | 
			
		||||
        """
 | 
			
		||||
        filter_ = GenericPlaceFilter()
 | 
			
		||||
        filter_.add_rule(rule)
 | 
			
		||||
        results = filter_.apply(self.db)
 | 
			
		||||
        return set(results)
 | 
			
		||||
 | 
			
		||||
    def test_AllPlaces(self):
 | 
			
		||||
    def test_allplaces(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test AllPlaces rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = AllPlaces([])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)),
 | 
			
		||||
                         self.db.get_number_of_places())
 | 
			
		||||
 | 
			
		||||
    def test_HasCitation(self):
 | 
			
		||||
    def test_hascitation(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasCitation rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasCitation(['page 23', '', ''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'YNUJQC8YM5EGRG868J']))
 | 
			
		||||
 | 
			
		||||
    def test_HasGallery(self):
 | 
			
		||||
    def test_hasgallery(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasGallery rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasGallery(['0', 'greater than'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'YNUJQC8YM5EGRG868J']))
 | 
			
		||||
 | 
			
		||||
    def test_HasIdOf(self):
 | 
			
		||||
    def test_hasidof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasIdOf(['P0001'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'c96587262e91149933fcea5f20a']))
 | 
			
		||||
 | 
			
		||||
    def test_RegExpIdOf(self):
 | 
			
		||||
    def test_regexpidof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test RegExpIdOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = RegExpIdOf(['P000.'], use_regex=True)
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'c96587262e91149933fcea5f20a', b'c96587262ff262aaac31f6db7af',
 | 
			
		||||
@@ -73,70 +101,112 @@ class BaseTest(unittest.TestCase):
 | 
			
		||||
            b'c96587262f4a44183c65ff1e52', b'c96587262ed43fdb37bf04bdb7f',
 | 
			
		||||
            ]))
 | 
			
		||||
 | 
			
		||||
    def test_HasNote(self):
 | 
			
		||||
    def test_hasnote(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasNote rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasNote([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([]))
 | 
			
		||||
 | 
			
		||||
    def test_HasNoteRegexp(self):
 | 
			
		||||
    def test_hasnoteregexp(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasNoteRegexp rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasNoteRegexp(['.'], use_regex=True)
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([]))
 | 
			
		||||
 | 
			
		||||
    def test_HasReferenceCountOf(self):
 | 
			
		||||
    def test_hasreferencecountof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasReferenceCountOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasReferenceCountOf(['greater than', '35'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'c96587262e566596a225682bf53', b'MATJQCJYH8ULRIRYTH',
 | 
			
		||||
            b'5HTJQCSB91P69HY731', b'4ECKQCWCLO5YIHXEXC',
 | 
			
		||||
            b'c965872630a68ebd32322c4a30a']))
 | 
			
		||||
 | 
			
		||||
    def test_HasSourceCount(self):
 | 
			
		||||
    def test_hassourcecount(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasSourceCount rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasSourceCount(['1', 'equal to'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'YNUJQC8YM5EGRG868J']))
 | 
			
		||||
 | 
			
		||||
    def test_HasSourceOf(self):
 | 
			
		||||
    def test_hassourceof(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasSourceOf rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasSourceOf(['S0001'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'YNUJQC8YM5EGRG868J']))
 | 
			
		||||
 | 
			
		||||
    def test_PlacePrivate(self):
 | 
			
		||||
    def test_placeprivate(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test PlacePrivate rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = PlacePrivate([])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([]))
 | 
			
		||||
 | 
			
		||||
    def test_MatchesSourceConfidence(self):
 | 
			
		||||
    def test_matchessourceconfidence(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test MatchesSourceConfidence rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = MatchesSourceConfidence(['2'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'YNUJQC8YM5EGRG868J']))
 | 
			
		||||
 | 
			
		||||
    def test_HasData(self):
 | 
			
		||||
    def test_hasdata(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasData rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasData(['Albany', 'County', ''])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule),
 | 
			
		||||
                         set([b'c9658726d602acadb74e330116a']))
 | 
			
		||||
 | 
			
		||||
    def test_HasNoLatOrLon(self):
 | 
			
		||||
    def test_hasnolatorlon(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasNoLatOrLon rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasNoLatOrLon([])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 915)
 | 
			
		||||
 | 
			
		||||
    def test_InLatLonNeighborhood(self):
 | 
			
		||||
    def test_inlatlonneighborhood(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test InLatLonNeighborhood rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = InLatLonNeighborhood(['30N', '90W', '2', '2'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'C6WJQC0GDYP3HZDPR3', b'N88LQCRB363ES5WJ83',
 | 
			
		||||
            b'03EKQCC2KTNLHFLDRJ', b'M9VKQCJV91X0M12J8']))
 | 
			
		||||
 | 
			
		||||
    def test_ChangedSince(self):
 | 
			
		||||
    def test_changedsince(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test ChangedSince rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = ChangedSince(['2013-01-01', '2014-01-01'])
 | 
			
		||||
        self.assertEqual(len(self.filter_with_rule(rule)), 435)
 | 
			
		||||
 | 
			
		||||
    def test_HasTag(self):
 | 
			
		||||
    def test_hastag(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasTag rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasTag(['ToDo'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([]))
 | 
			
		||||
 | 
			
		||||
    def test_HasTitle(self):
 | 
			
		||||
    def test_hastitle(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test HasTitle rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = HasTitle(['Albany'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'51VJQCXUP61H9JRL66', b'9XBKQCE1LZ7PMJE56G',
 | 
			
		||||
            b'c9658726d602acadb74e330116a', b'P9MKQCT08Z3YBJV5UB']))
 | 
			
		||||
 | 
			
		||||
    def test_IsEnclosedBy(self):
 | 
			
		||||
    def test_isenclosedby(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test IsEnclosedBy rule.
 | 
			
		||||
        """
 | 
			
		||||
        rule = IsEnclosedBy(['P0001'])
 | 
			
		||||
        self.assertEqual(self.filter_with_rule(rule), set([
 | 
			
		||||
            b'EAFKQCR0ED5QWL87EO', b'S22LQCLUZM135LVKRL', b'VDUJQCFP24ZV3O4ID2',
 | 
			
		||||
 
 | 
			
		||||
@@ -21,13 +21,16 @@
 | 
			
		||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
File tests.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# Standard python modules
 | 
			
		||||
#
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
import os
 | 
			
		||||
import shutil
 | 
			
		||||
import unittest
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
@@ -36,7 +39,6 @@ import unittest
 | 
			
		||||
#
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
from gramps.gen.const import TEMP_DIR, USER_HOME, USER_PLUGINS, VERSION
 | 
			
		||||
from gramps.gen.constfunc import get_env_var
 | 
			
		||||
from gramps.gen.utils.file import media_path, get_empty_tempdir
 | 
			
		||||
from gramps.gen.dbstate import DbState
 | 
			
		||||
 | 
			
		||||
@@ -46,8 +48,14 @@ from gramps.gen.dbstate import DbState
 | 
			
		||||
#
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
class FileTest(unittest.TestCase):
 | 
			
		||||
    """
 | 
			
		||||
    File tests.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def test_mediapath(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test media path variables.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        # Create database
 | 
			
		||||
        dbstate = DbState()
 | 
			
		||||
@@ -58,36 +66,45 @@ class FileTest(unittest.TestCase):
 | 
			
		||||
        dbstate.change_database(db)
 | 
			
		||||
 | 
			
		||||
        # Test without db.mediapath set
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(os.path.abspath(USER_HOME))))
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(
 | 
			
		||||
            os.path.abspath(USER_HOME))))
 | 
			
		||||
        self.assertTrue(os.path.exists(media_path(db)))
 | 
			
		||||
 | 
			
		||||
        # Test with absolute db.mediapath
 | 
			
		||||
        db.set_mediapath(os.path.abspath(USER_HOME) + "/test_abs")
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(os.path.abspath(USER_HOME + "/test_abs"))))
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(
 | 
			
		||||
            os.path.abspath(USER_HOME + "/test_abs"))))
 | 
			
		||||
 | 
			
		||||
        # Test with relative db.mediapath
 | 
			
		||||
        db.set_mediapath("test_rel")
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(os.path.abspath(TEMP_DIR + "/utils_file_test/test_rel"))))
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(
 | 
			
		||||
            os.path.abspath(TEMP_DIR + "/utils_file_test/test_rel"))))
 | 
			
		||||
 | 
			
		||||
        # Test with environment variable
 | 
			
		||||
        db.set_mediapath("/test/{VERSION}/test_var")
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(os.path.abspath("/test/" + VERSION + "/test_var"))))
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(
 | 
			
		||||
            os.path.abspath("/test/" + VERSION + "/test_var"))))
 | 
			
		||||
        db.set_mediapath("{USER_PLUGINS}/test_var")
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(os.path.abspath(USER_PLUGINS + "/test_var"))))
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(
 | 
			
		||||
            os.path.abspath(USER_PLUGINS + "/test_var"))))
 | 
			
		||||
        db.set_mediapath("{VERSION}/test_var")
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(os.path.abspath(TEMP_DIR + "/utils_file_test/" + VERSION + "/test_var"))))
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(
 | 
			
		||||
            os.path.abspath(TEMP_DIR + "/utils_file_test/" + VERSION +
 | 
			
		||||
                            "/test_var"))))
 | 
			
		||||
 | 
			
		||||
        # Test with $GRAMPSHOME environment variable not set
 | 
			
		||||
        old_env = os.environ.copy()
 | 
			
		||||
        if 'GRAMPSHOME' in os.environ:
 | 
			
		||||
            del os.environ['GRAMPSHOME']
 | 
			
		||||
        db.set_mediapath("{GRAMPSHOME}/test_var")
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(os.path.abspath(USER_HOME + "/test_var"))))
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(
 | 
			
		||||
            os.path.abspath(USER_HOME + "/test_var"))))
 | 
			
		||||
 | 
			
		||||
        # Test with $GRAMPSHOME environment variable set
 | 
			
		||||
        os.environ['GRAMPSHOME'] = "/this/is/a/test"
 | 
			
		||||
        db.set_mediapath("{GRAMPSHOME}/test_var")
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(os.path.abspath("/this/is/a/test/test_var"))))
 | 
			
		||||
        self.assertEqual(media_path(db), os.path.normcase(os.path.normpath(
 | 
			
		||||
            os.path.abspath("/this/is/a/test/test_var"))))
 | 
			
		||||
 | 
			
		||||
        # Restore environment
 | 
			
		||||
        os.environ = old_env
 | 
			
		||||
 
 | 
			
		||||
@@ -34,20 +34,18 @@ from gi.repository import GObject
 | 
			
		||||
# Gramps modules
 | 
			
		||||
#
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
 | 
			
		||||
_ = glocale.translation.sgettext
 | 
			
		||||
ngettext = glocale.translation.ngettext # else "nearby" comments are ignored
 | 
			
		||||
from gramps.gen.const import URL_MANUAL_PAGE
 | 
			
		||||
from gramps.gui.plug import tool
 | 
			
		||||
from gramps.gen.plug.report import utils as ReportUtils
 | 
			
		||||
from gramps.gui.editors import EditPerson, EditFamily
 | 
			
		||||
from gramps.gui.editors import EditFamily
 | 
			
		||||
from gramps.gen.errors import WindowActiveError
 | 
			
		||||
from gramps.gui.managedwindow import ManagedWindow
 | 
			
		||||
from gramps.gui.utils import ProgressMeter
 | 
			
		||||
from gramps.gui.display import display_help
 | 
			
		||||
from gramps.gui.glade import Glade
 | 
			
		||||
from gramps.gen.lib import Tag
 | 
			
		||||
from gramps.gen.db import DbTxn
 | 
			
		||||
from gramps.gen.display.name import displayer as _nd
 | 
			
		||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
 | 
			
		||||
_ = glocale.translation.sgettext
 | 
			
		||||
ngettext = glocale.translation.ngettext # else "nearby" comments are ignored
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
@@ -62,8 +60,10 @@ WIKI_HELP_SEC = _('manual|Find_database_loop')
 | 
			
		||||
# FindLoop class
 | 
			
		||||
#
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
class FindLoop(ManagedWindow) :
 | 
			
		||||
 | 
			
		||||
class FindLoop(ManagedWindow):
 | 
			
		||||
    """
 | 
			
		||||
    Find loops in the family tree.
 | 
			
		||||
    """
 | 
			
		||||
    def __init__(self, dbstate, user, options_class, name, callback=None):
 | 
			
		||||
        uistate = user.uistate
 | 
			
		||||
 | 
			
		||||
@@ -73,20 +73,20 @@ class FindLoop(ManagedWindow) :
 | 
			
		||||
        self.uistate = uistate
 | 
			
		||||
        self.db = dbstate.db
 | 
			
		||||
 | 
			
		||||
        topDialog = Glade()
 | 
			
		||||
        top_dialog = Glade()
 | 
			
		||||
 | 
			
		||||
        topDialog.connect_signals({
 | 
			
		||||
        top_dialog.connect_signals({
 | 
			
		||||
            "destroy_passed_object" : self.close,
 | 
			
		||||
            "on_help_clicked"       : self.on_help_clicked,
 | 
			
		||||
            "on_delete_event"       : self.close,
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        window = topDialog.toplevel
 | 
			
		||||
        title = topDialog.get_object("title")
 | 
			
		||||
        window = top_dialog.toplevel
 | 
			
		||||
        title = top_dialog.get_object("title")
 | 
			
		||||
        self.set_window(window, title, self.title)
 | 
			
		||||
 | 
			
		||||
        # start the progress indicator
 | 
			
		||||
        self.progress = ProgressMeter(self.title,_('Starting'),
 | 
			
		||||
        self.progress = ProgressMeter(self.title, _('Starting'),
 | 
			
		||||
                                      parent=self.window)
 | 
			
		||||
        self.progress.set_pass(_('Looking for possible loop for each person'),
 | 
			
		||||
                               self.db.get_number_of_people())
 | 
			
		||||
@@ -98,13 +98,18 @@ class FindLoop(ManagedWindow) :
 | 
			
		||||
            GObject.TYPE_STRING,    # 3==son
 | 
			
		||||
            GObject.TYPE_STRING)    # 4==family gid
 | 
			
		||||
 | 
			
		||||
        self.treeView = topDialog.get_object("treeview")
 | 
			
		||||
        self.treeView.set_model(self.model)
 | 
			
		||||
        col1 = Gtk.TreeViewColumn(_('Gramps ID'),     Gtk.CellRendererText(), text=0)
 | 
			
		||||
        col2 = Gtk.TreeViewColumn(_('Ancestor'),   Gtk.CellRendererText(), text=1)
 | 
			
		||||
        col3 = Gtk.TreeViewColumn(_('Gramps ID'),     Gtk.CellRendererText(), text=2)
 | 
			
		||||
        col4 = Gtk.TreeViewColumn(_('Descendant'),     Gtk.CellRendererText(), text=3)
 | 
			
		||||
        col5 = Gtk.TreeViewColumn(_('Family ID'), Gtk.CellRendererText(), text=4)
 | 
			
		||||
        self.treeview = top_dialog.get_object("treeview")
 | 
			
		||||
        self.treeview.set_model(self.model)
 | 
			
		||||
        col1 = Gtk.TreeViewColumn(_('Gramps ID'),
 | 
			
		||||
                                  Gtk.CellRendererText(), text=0)
 | 
			
		||||
        col2 = Gtk.TreeViewColumn(_('Ancestor'),
 | 
			
		||||
                                  Gtk.CellRendererText(), text=1)
 | 
			
		||||
        col3 = Gtk.TreeViewColumn(_('Gramps ID'),
 | 
			
		||||
                                  Gtk.CellRendererText(), text=2)
 | 
			
		||||
        col4 = Gtk.TreeViewColumn(_('Descendant'),
 | 
			
		||||
                                  Gtk.CellRendererText(), text=3)
 | 
			
		||||
        col5 = Gtk.TreeViewColumn(_('Family ID'),
 | 
			
		||||
                                  Gtk.CellRendererText(), text=4)
 | 
			
		||||
        col1.set_resizable(True)
 | 
			
		||||
        col2.set_resizable(True)
 | 
			
		||||
        col3.set_resizable(True)
 | 
			
		||||
@@ -120,14 +125,15 @@ class FindLoop(ManagedWindow) :
 | 
			
		||||
        col3.set_sort_column_id(2)
 | 
			
		||||
        col4.set_sort_column_id(3)
 | 
			
		||||
        col5.set_sort_column_id(4)
 | 
			
		||||
        self.treeView.append_column(col1)
 | 
			
		||||
        self.treeView.append_column(col2)
 | 
			
		||||
        self.treeView.append_column(col3)
 | 
			
		||||
        self.treeView.append_column(col4)
 | 
			
		||||
        self.treeView.append_column(col5)
 | 
			
		||||
        self.treeSelection = self.treeView.get_selection()
 | 
			
		||||
        self.treeView.connect('row-activated', self.rowactivated)
 | 
			
		||||
        self.treeview.append_column(col1)
 | 
			
		||||
        self.treeview.append_column(col2)
 | 
			
		||||
        self.treeview.append_column(col3)
 | 
			
		||||
        self.treeview.append_column(col4)
 | 
			
		||||
        self.treeview.append_column(col5)
 | 
			
		||||
        self.treeselection = self.treeview.get_selection()
 | 
			
		||||
        self.treeview.connect('row-activated', self.rowactivated_cb)
 | 
			
		||||
 | 
			
		||||
        self.curr_fam = None
 | 
			
		||||
        people = self.db.get_person_handles()
 | 
			
		||||
        count = 0
 | 
			
		||||
        for person_handle in people:
 | 
			
		||||
@@ -145,6 +151,9 @@ class FindLoop(ManagedWindow) :
 | 
			
		||||
        self.show()
 | 
			
		||||
 | 
			
		||||
    def descendants(self, person_handle, new_list):
 | 
			
		||||
        """
 | 
			
		||||
        Find the descendants of a given person.
 | 
			
		||||
        """
 | 
			
		||||
        person = self.db.get_person_from_handle(person_handle)
 | 
			
		||||
        pset = set()
 | 
			
		||||
        for item in new_list:
 | 
			
		||||
@@ -182,13 +191,14 @@ class FindLoop(ManagedWindow) :
 | 
			
		||||
                self.parent = person
 | 
			
		||||
                self.descendants(child_handle, pset)
 | 
			
		||||
 | 
			
		||||
    def rowactivated(self, treeView, path, column) :
 | 
			
		||||
    def rowactivated_cb(self, treeview, path, column):
 | 
			
		||||
        """
 | 
			
		||||
        Called when a row is activated.
 | 
			
		||||
        """
 | 
			
		||||
        # first we need to check that the row corresponds to a person
 | 
			
		||||
        iter = self.model.get_iter(path)
 | 
			
		||||
        From_id = self.model.get_value(iter, 0)
 | 
			
		||||
        To_id = self.model.get_value(iter, 2)
 | 
			
		||||
        Fam_id = self.model.get_value(iter, 4)
 | 
			
		||||
        fam = self.dbstate.db.get_family_from_gramps_id(Fam_id)
 | 
			
		||||
        iter_ = self.model.get_iter(path)
 | 
			
		||||
        fam_id = self.model.get_value(iter_, 4)
 | 
			
		||||
        fam = self.dbstate.db.get_family_from_gramps_id(fam_id)
 | 
			
		||||
        if fam:
 | 
			
		||||
            try:
 | 
			
		||||
                EditFamily(self.dbstate, self.uistate, [], fam)
 | 
			
		||||
@@ -198,11 +208,13 @@ class FindLoop(ManagedWindow) :
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
    def on_help_clicked(self, obj):
 | 
			
		||||
        """Display the relevant portion of GRAMPS manual"""
 | 
			
		||||
        """
 | 
			
		||||
        Display the relevant portion of Gramps manual.
 | 
			
		||||
        """
 | 
			
		||||
        display_help(webpage=WIKI_HELP_PAGE, section=WIKI_HELP_SEC)
 | 
			
		||||
 | 
			
		||||
    def close(self, *obj):
 | 
			
		||||
        ManagedWindow.close(self,*obj)
 | 
			
		||||
        ManagedWindow.close(self, *obj)
 | 
			
		||||
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user