From 653b2d09c078743099affd1bef0dd088583d630e Mon Sep 17 00:00:00 2001 From: Al Date: Mon, 14 Nov 2016 16:45:15 -0500 Subject: [PATCH] [addresses] moving component dependency graphs to a new module --- scripts/geodata/addresses/components.py | 39 +-------------------- scripts/geodata/addresses/dependencies.py | 42 +++++++++++++++++++++++ 2 files changed, 43 insertions(+), 38 deletions(-) create mode 100644 scripts/geodata/addresses/dependencies.py diff --git a/scripts/geodata/addresses/components.py b/scripts/geodata/addresses/components.py index c12a1148..5c4e2e35 100644 --- a/scripts/geodata/addresses/components.py +++ b/scripts/geodata/addresses/components.py @@ -15,6 +15,7 @@ from geodata.address_formatting.formatter import AddressFormatter from geodata.address_expansions.abbreviations import abbreviate from geodata.address_expansions.gazetteers import * from geodata.addresses.config import address_config +from geodata.addresses.dependencies import ComponentDependencies from geodata.addresses.floors import Floor from geodata.addresses.entrances import Entrance from geodata.addresses.house_numbers import HouseNumber @@ -47,44 +48,6 @@ PARSER_DEFAULT_CONFIG = os.path.join(this_dir, os.pardir, os.pardir, os.pardir, 'resources', 'parser', 'default.yaml') -class ComponentDependencies(object): - ''' - Declare an address component and its dependencies e.g. - a house_numer cannot be used in the absence of a road name. - ''' - - component_bit_values = {} - - def __init__(self, graph): - self.dependencies = {} - - self.all_values = long('1' * len(graph), 2) - - self.dependency_order = [c for c in topsort(graph)] - - for component, deps in six.iteritems(graph): - self.dependencies[component] = self.component_bitset(deps) if deps else self.all_values - - def __getitem__(self, key): - return self.dependencies.__getitem__(key) - - def __contains__(self, key): - return self.dependencies.__contains__(key) - - @classmethod - def get_component_bit_value(cls, name): - val = cls.component_bit_values.get(name) - if val is None: - num_values = len(cls.component_bit_values) - val = 1 << num_values - cls.component_bit_values[name] = val - return val - - @classmethod - def component_bitset(cls, components): - return reduce(operator.or_, [cls.get_component_bit_value(name) for name in components]) - - class AddressComponents(object): ''' This class, while it has a few dependencies, exposes a simple method diff --git a/scripts/geodata/addresses/dependencies.py b/scripts/geodata/addresses/dependencies.py new file mode 100644 index 00000000..13a6091f --- /dev/null +++ b/scripts/geodata/addresses/dependencies.py @@ -0,0 +1,42 @@ +import operator +import six + +from geodata.graph.topsort import topsort + + +class ComponentDependencies(object): + ''' + Declare an address component and its dependencies e.g. + a house_numer cannot be used in the absence of a road name. + ''' + + component_bit_values = {} + + def __init__(self, graph): + self.dependencies = {} + + self.all_values = long('1' * len(graph), 2) + + self.dependency_order = [c for c in topsort(graph)] + + for component, deps in six.iteritems(graph): + self.dependencies[component] = self.component_bitset(deps) if deps else self.all_values + + def __getitem__(self, key): + return self.dependencies.__getitem__(key) + + def __contains__(self, key): + return self.dependencies.__contains__(key) + + @classmethod + def get_component_bit_value(cls, name): + val = cls.component_bit_values.get(name) + if val is None: + num_values = len(cls.component_bit_values) + val = 1 << num_values + cls.component_bit_values[name] = val + return val + + @classmethod + def component_bitset(cls, components): + return reduce(operator.or_, [cls.get_component_bit_value(name) for name in components])