Skip to content
This repository was archived by the owner on Mar 5, 2024. It is now read-only.

Added support for unknown and unassigned sex/genders. #22

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 29 additions & 13 deletions gedcom/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,8 +242,10 @@ def __init__(self, level=None, tag=None, value=None, id=None, parent_id=None, pa
def __repr__(self):
"""Interal string represation of this object, for debugging purposes."""
return "{classname}({level}, {tag!r}{id}{value}{children})".format(
classname=self.__class__.__name__, level=self.level, tag=self.tag, id=(", " + repr(self.id) if self.id else ""),
value=(", " + repr(self.value) if self.value else ""), children=(", " + repr(self.child_elements) if len(self.child_elements) > 0 else ""))
classname=self.__class__.__name__, level=self.level, tag=self.tag,
id=(", " + repr(self.id) if self.id else ""),
value=(", " + repr(self.value) if self.value else ""),
children=(", " + repr(self.child_elements) if len(self.child_elements) > 0 else ""))

def __getitem__(self, key):
"""
Expand Down Expand Up @@ -322,7 +324,8 @@ def gedcom_lines(self):
:rtype: iterator over string
"""
line_format = re.compile("^(?P<level>[0-9]+) ((?P<id>@[a-zA-Z0-9]+@) )?(?P<tag>[A-Z]+)( (?P<value>.*))?$")
line = u"{level}{id} {tag}{value}".format(level=self.level, id=(" " + self.id if self.id else ""), tag=self.tag, value=(" " + self.value if self.value else ""))
line = u"{level}{id} {tag}{value}".format(level=self.level, id=(" " + self.id if self.id else ""), tag=self.tag,
value=(" " + self.value if self.value else ""))
yield line
for child in self.child_elements:
for line in child.gedcom_lines():
Expand All @@ -346,11 +349,13 @@ def note(self):

def register_tag(tag):
"""Internal class decorator to mark a python class as to be the handler for this tag."""

def classdecorator(klass):
global tags_to_classes
tags_to_classes[tag] = klass
klass.default_tag = tag
return klass

return classdecorator


Expand Down Expand Up @@ -465,24 +470,30 @@ def death(self):
@property
def sex(self):
"""
Return the sex of this person, as the string 'M' or 'F'.
Return the sex of this person, as the string 'M' or 'F', or 'U' if not assigned.

NB: This should probably support more sexes/genders.

:rtype: str
"""
return self['SEX'].value
try:
return self['SEX'].value
except IndexError:
return 'U'

@property
def gender(self):
"""
Return the sex of this person, as the string 'M' or 'F'.
Return the sex of this person, as the string 'M' or 'F', or 'U' if not assigned.

NB: This should probably support more sexes/genders.

:rtype: str
"""
return self['SEX'].value
try:
return self['SEX'].value
except IndexError:
return 'U'

@property
def father(self):
Expand Down Expand Up @@ -532,21 +543,26 @@ def is_male(self):
"""Return True iff this person is recorded as male."""
return self.sex.lower() == 'm'

@property
def is_gender_unknown(self):
"""Return True iff this person is recorded as unknown gendered."""
return self.sex.lower() == 'u'

def set_sex(self, sex):
"""
Set the sex for this person.

:param str sex: 'M' or 'F' for male or female resp.
:param str sex: 'M', 'F', or 'U' for male, female or unknown resp.
:raises TypeError: if `sex` is invalid
"""
sex = sex.upper()
if sex not in ['M', 'F']:
raise TypeError("Currently only support M or F")
if sex not in ['M', 'F', 'U']:
raise TypeError("Currently only support M, F, or U")
try:
sex_node = self['SEX']
sex_node.value = sex
except IndexError:
self.add_child_element(self.gedcom_file.element("SEX", value=sex))
self.add_child_element(self.gedcom_file.element("SEX", level=1, value=sex))

@property
def title(self):
Expand Down Expand Up @@ -591,7 +607,6 @@ def wives(self):
return self.get_list("WIFE")



class Spouse(Element):
"""Generic base class for HUSB/WIFE."""

Expand Down Expand Up @@ -785,7 +800,8 @@ def __parse(lines_iter):
level_to_obj = dict((l, obj) for l, obj in level_to_obj.items() if l < level)
parent = level_to_obj[level - 1]

element = line_to_element(level=level, parent=parent, tag=match.groupdict()['tag'], value=match.groupdict()['value'], id=match.groupdict()['id'])
element = line_to_element(level=level, parent=parent, tag=match.groupdict()['tag'],
value=match.groupdict()['value'], id=match.groupdict()['id'])
level_to_obj[level] = element
element.gedcom_file = gedcom_file
gedcom_file.add_element(element)
Expand Down