Source code for buildingmotif.ingresses.naming_convention
from functools import cached_property
from typing import List
from buildingmotif.ingresses.base import Record, RecordIngressHandler
from buildingmotif.label_parsing import (
Parser,
analyze_failures,
parse_list,
results_to_tokens,
)
[docs]class NamingConventionIngress(RecordIngressHandler):
"""
Ingress handler that parses labels using a naming convention parser.
This returns a Record for each input label, with the parsed tokens as a field.
You will need to attach this to a GraphIngressHandler to turn the tokens into a graph.
"""
def __init__(
self,
upstream: RecordIngressHandler,
naming_convention: Parser,
):
"""
Create a new NamingConventionIngress.
:param upstream: The upstream ingress handler to get records from. This should return records with a "label" field.
:type upstream: RecordIngressHandler
:param naming_convention: The naming convention parser to use.
:type naming_convention: Parser
"""
self.upstream = upstream
self.naming_convention = naming_convention
[docs] def dump_failed_labels(self):
sorted_groups = sorted(
analyze_failures(self.failures).items(),
key=lambda x: len(x[1]),
reverse=True,
)
for group, failures in sorted_groups:
print(f"Unparsed label: {group} ({len(failures)} failures)")
for failure in failures:
print(f"\t{failure}")
print()
@cached_property
def records(self) -> List[Record]:
results, failures = parse_list(
self.naming_convention, [x.fields["label"] for x in self.upstream.records]
)
self.failures = failures
self.results = results
tokens = results_to_tokens(results)
return [
Record(
rtype="token",
fields={
"label": t["label"],
"tokens": t["tokens"],
},
)
for t in tokens
]