email: Optional[str]
def __init__(self, config: "Config", identifier: str,
+ output_markdown_file: str,
aliases: Optional[Set[str]] = None,
email: Optional[str] = None):
self.config = config
self.identifier = identifier
+ self.output_markdown_file = output_markdown_file
if aliases is None:
aliases = set()
self.aliases = aliases
return hash(self.identifier)
def __repr__(self):
- return f"Person(config=..., identifier={self.identifier!r}, " \
- f"aliases={self.aliases!r}, email={self.email!r})"
+ return (f"Person(config=..., identifier={self.identifier!r}, "
+ f"output_markdown_file={self.output_markdown_file!r}, "
+ f"aliases={self.aliases!r}, email={self.email!r})")
class Milestone:
f"people={self.people!r}, " \
f"milestones={self.milestones!r})"
+ @cached_property
+ def bugzilla_url_stripped(self):
+ return self.bugzilla_url.rstrip('/')
+
@cached_property
def all_names(self) -> Dict[str, Person]:
# also checks for any name clashes and raises
f"person entry for {identifier!r} must be a table")
aliases = set()
email = None
+ output_markdown_file = None
for k, v in value.items():
assert isinstance(k, str)
if k == "aliases":
f"`email` field in person entry for {identifier!r} "
f"must be a string")
email = v
+ elif k == "output_markdown_file":
+ if not isinstance(v, str):
+ raise ConfigParseError(
+ f"`output_markdown_file` field in person entry for "
+ f"{identifier!r} must be a string")
+ output_markdown_file = v
else:
raise ConfigParseError(
f"unknown field in person entry for {identifier!r}: `{k}`")
+ if output_markdown_file is None:
+ raise ConfigParseError(f"`output_markdown_file` field is missing in "
+ f"person entry for {identifier!r}")
return Person(config=self, identifier=identifier,
+ output_markdown_file=output_markdown_file,
aliases=aliases, email=email)
def _parse_people(self, people: Any):