[addresses] moving component dependency graphs to a new module

This commit is contained in:
Al
2016-11-14 16:45:15 -05:00
parent 495b27470e
commit 653b2d09c0
2 changed files with 43 additions and 38 deletions

View File

@@ -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

View File

@@ -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])