Source code for compass.utilities.location

"""COMPASS Ordinance jurisdiction specification utilities"""

from functools import cached_property


JURISDICTION_TYPES_AS_PREFIXES = {
    "town",
    "township",
    "city",
    "borough",
    "village",
    "unorganized territory",
}


[docs] class Jurisdiction: """Class representing a jurisdiction""" def __init__( self, subdivision_type, state, county=None, subdivision_name=None, code=None, ): """ Parameters ---------- subdivision_type : str Type of subdivision that this jurisdiction represents. Typical values are "state", "county", "town", "city", "borough", "parish", "township", etc. state : str Name of the state containing the jurisdiction. county : str, optional Name of the county containing the jurisdiction, if applicable. If the jurisdiction represents a state, leave this input unspecified. If the jurisdiction represents a county or a subdivision within a county, provide the county name here. .. IMPORTANT:: Make sure this input is capitalized properly! By default, ``None``. subdivision_name : str, optional Name of the subdivision that the jurisdiction represents, if applicable. If the jurisdiction represents a state or county, leave this input unspecified. Otherwise, provide the jurisdiction name here. .. IMPORTANT:: Make sure this input is capitalized properly! By default, ``None``. code : int or str, optional Optional jurisdiction code (typically FIPS or similar). By default, ``None``. """ self.type = subdivision_type.title() self.state = state.title() self.county = county self.subdivision_name = subdivision_name self.code = code @cached_property def full_name(self): """str: Full jurisdiction name""" name_parts = [ self.full_subdivision_phrase, self.full_county_phrase, self.state, ] return ", ".join(filter(None, name_parts)) @cached_property def full_name_the_prefixed(self): """str: Full jurisdiction name with `the` prefix if needed""" if self.type.casefold() == "state": return f"the state of {self.state}" if self.type.casefold() in JURISDICTION_TYPES_AS_PREFIXES: return f"the {self.full_name}" return self.full_name @cached_property def full_subdivision_phrase(self): """str: Full jurisdiction subdivision phrase, or empty str""" if not self.subdivision_name: return "" if self.type.casefold() in JURISDICTION_TYPES_AS_PREFIXES: return f"{self.type} of {self.subdivision_name}" return f"{self.subdivision_name} {self.type}" @cached_property def full_subdivision_phrase_the_prefixed(self): """str: Full jurisdiction subdivision phrase, or empty str""" if self.type.casefold() in JURISDICTION_TYPES_AS_PREFIXES: return f"the {self.full_subdivision_phrase}" return self.full_subdivision_phrase @cached_property def full_county_phrase(self): """str: Full jurisdiction county phrase, or empty str""" if not self.county: return "" if not self.subdivision_name: return f"{self.county} {self.type}" return f"{self.county} County" def __repr__(self): return str(self) def __str__(self): return self.full_name def __eq__(self, other): if isinstance(other, self.__class__): return ( self.type.casefold() == other.type.casefold() and self.state.casefold() == other.state.casefold() and self.county == other.county and self.subdivision_name == other.subdivision_name ) if isinstance(other, str): return self.full_name.casefold() == other.casefold() return False def __hash__(self): return hash(self.full_name.casefold())