David Boyd giteaadmin
  • Joined on 2025-07-14

addrkit (0.1.0)

Published 2026-07-04 14:16:11 +00:00 by giteaadmin

Installation

pip install --index-url  addrkit

About this package

Address-validation & business-presence toolkit: Google Address Validation, Experian Aperture (QAS Pro), DC MAR, and Google Places behind one normalized ValidationResult. Framework-agnostic; imported as `addverify`.

addrkit

Reusable address-validation & business-presence toolkit for DOES apps. Four providers sit behind one normalized ValidationResult, so callers can run any subset and compare evidence side by side.

  • Distribution name: addrkit · import name: addverify (same split as azure-ssoazsso).
  • Framework-agnostic core (just requests); no web framework, no database, no secrets.
  • Extracted from the add-verify app so add-verify, add-clean, and emp-360 can share one copy instead of each carrying their own.

Providers

Import Question it answers Notes
addverify.providers.google Is this a deliverable postal address? Google Address Validation; USPS DPV enrichment.
addverify.providers.experian Is this a deliverable address? (+ resolve) Experian Aperture / QAS Pro. resolve=True recovers full addresses from partials.
addverify.providers.mar2 Is this a real DC address? DC Master Address Repository (MAR 2). DC only — non-DC → INVALID.
addverify.providers.places Is a business operating at this address? Google Places (New). verify_business(...).

Every provider returns a ValidationResult with a coarse, cross-provider verdict: VALID · SUSPECT · INVALID · ERROR.

Install (Gitea PyPI registry)

Public PyPI stays primary; the extra index only serves DOES packages. Put the read token in pip.conf rather than inlining it:

# .venv/pip.conf   (chmod 600)
[global]
extra-index-url = https://<gitea-read-token>@gitea.doesworks.net/api/packages/giteaadmin/pypi/simple
pip install "addrkit==0.1.*"

Quickstart

from addverify import config
from addverify.providers import google, experian, mar2, places

config.load_dotenv()  # optional: load keys from a .env

r = google.validate("1350 Pennsylvania Ave NW, Washington, DC 20004",
                    config.google_key())
print(r.verdict, r.formatted, r.components.get("possible_next_action"))

# DC authoritative source
m = mar2.validate("1350 Pennsylvania Ave NW", config.dc_mar_key())

# business-presence
b = places.verify_business("1912 Pike Pl, Seattle WA",
                          config.places_key(), business_name="Starbucks")

The ValidationResult contract

ValidationResult(
    provider,      # 'GOOGLE' | 'QAS' | 'MAR2' | 'PLACES'
    verdict,       # VALID | SUSPECT | INVALID | ERROR
    confidence,    # provider-native confidence/granularity
    input_address,
    formatted,     # standardized/canonical address
    components,    # dict of evidence highlights (DPV, ward, score, next action, …)
    raw,           # full provider response(s)
    error,
)

CLI

The package ships an addverify console script (and python -m addverify):

addverify "1600 Amphitheatre Pkwy, Mountain View, CA 94043" --provider both
addverify "1350 Pennsylvania Ave NW, Washington, DC 20004" --provider all      # Google + QAS + MAR
addverify --input-csv addresses.csv --provider all --resolve                   # batch mode

Configuration

Keys come from the environment (or a .env via config.load_dotenv()); the library never hard-codes them. See .env.example:

Var Used by
GOOGLE_ADDRESS_API_KEY google
GOOGLE_PLACES_API_KEY (falls back to the address/maps key) places
EXPERIAN_QAS_TOKEN experian
DC_MAR_API_KEY mar2

Development

python -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/python -m unittest            # fast, offline
ADDVERIFY_SMOKE=1 .venv/bin/python -m unittest tests.test_pip_install_smoke   # opt-in install test

Releasing

SemVer; bump addverify.__version__ (the dist version is dynamic from it), then build and publish to the Gitea PyPI registry:

.venv/bin/python -m build
.venv/bin/twine upload --repository-url https://gitea.doesworks.net/api/packages/giteaadmin/pypi \
    -u <gitea-user> -p <publish-token> dist/*

Requirements

Requires Python: >=3.8
Details
PyPI
2026-07-04 14:16:11 +00:00
9
Proprietary
48 KiB
Assets (2)
Versions (1) View all
0.1.0 2026-07-04