Skip to main content

Parse, normalize and render postal addresses.

Project description

Postal Address

Python module to parse, normalize and render postal addresses.

Last release Unit-tests status Coverage Status Requirements freshness Software license Popularity

Motivation

« What ties us to territory is tax. » – Kevin Deldycke, 2014-11-07

The reason above is why we need fine-grained and meticulous territory management and normalization. This project aims to solve this problem once for all.

Don’t get me wrong, this work is a huge undertaking. Postal address parsing, normalization and rendering is hard. Much harder than you think. Please read the famous Falsehoods programmers believe about addresses pamphlet.

This library is still in its early stages, but is good enough to implement the new European Directives on VAT, which requires all e-commerce shops to guess the locality of their EU customers depending on their billing address.

Stability policy

Here is a bunch of rules we’re trying to follow regarding stability:

  • Patch releases (0.x.n0.x.(n+1) upgrades) are bug-fix only. These releases must not break anything and keeps backward-compatibility with 0.x.* and 0.(x-1).* series.

  • Minor releases (0.n.*0.(n+1).0 upgrades) includes any non-bugfix changes. These releases must be backward-compatible with any 0.n.* version but are allowed to drop compatibility with the 0.(n-1).* series and below.

  • Major releases (n.*.*(n+1).0.0 upgrades) are not planned yet: we’re still in beta and the final feature set of the 1.0.0 release is not decided yet.

Release process

Start from the develop branch:

git clone git@github.com:online-labs/postal-address.git
git checkout develop

Update revision to its release number and update change log:

vi ./postal_address/__init__.py
vi ./CHANGES.rst

Create a release commit, tag it and merge it back to master branch:

git add ./postal_address/__init__.py ./CHANGES.rst
git commit -m "Release vXX.XX.XX"
git tag "vXX.XX.XX"
git push
git push --tags
git checkout master
git pull
git merge "vXX.XX.XX"
git push

Push packaging to the test cheeseshop:

python setup.py register -r testpypi
pip install wheel
rm -rf ./build ./dist
python setup.py sdist bdist_egg bdist_wheel upload -r testpypi

Publish packaging to PyPi:

python setup.py register -r pypi
rm -rf ./build ./dist
python setup.py sdist bdist_egg bdist_wheel upload -r pypi

Bump revision back to its development state:

git checkout develop
vi ./postal_address/__init__.py
vi ./CHANGES.rst
git add ./postal_address/__init__.py ./CHANGES.rst
git commit -m "Post release version bump."

License

This software is licensed under the GNU General Public License v2 or later (GPLv2+).

ChangeLog

0.6.0 (2015-04-02)

  • Add an option to bypass Address’ strict normalization.

0.5.2 (2015-03-30)

  • Always sort fields in error messages to improve reproducibility when unit testing.

  • Deduplicate inconsistent field entries in custom address exception.

0.5.1 (2015-03-30)

  • Fix bad released version.

0.5.0 (2015-03-30)

  • Increase capabilities of alias resolution by country_aliases() method, which in turns increase address normalization efficiency.

  • Remove backward compatibility with 0.3 series.

  • Remove deprecated territory.territory_tree() method which provided backward compatibilityi with the 0.1 series. It should have been removed in the 0.3.0 release.

  • Split-up supported_territory_codes() into supported_country_codes() and supported_subdivision_codes().

0.4.3 (2015-03-26)

  • Fix rendering of subdivision-less addresses.

0.4.2 (2015-03-26)

  • Fix country_code to subdivision_code validation if the latter is not set.

0.4.1 (2015-03-26)

  • Base our custom InvalidAddress exception on ValueError to increase backward compatibility.

0.4.0 (2015-03-25)

  • Show subdivision as-is in rendered address if not already printed by state, country or city.

  • Document stability policy. Closes #8.

  • Change internals to refer to address components as fields.

  • Raise custom exception on address validation a detailed list of invalid fields in one go. Closes #7.

0.3.3 (2015-03-25)

  • Fix bad released version.

0.3.2 (2015-03-25)

  • Add backward compatibility to the 0.2 series following territory utils split out of the address module. See #8 and #9.

0.3.1 (2015-03-05)

  • Fix rendering of state in address.

0.3.0 (2015-03-04)

  • Remove backward compatibility with the 0.1 series.

  • Allow direct import of classes from module root.

  • Split territory utils out to their own file. See #3.

  • Rename normalize_country_code to country_from_subdivision. Mark the former as deprecated.

  • Address normalization is now non-blocking. It simply reset invalid components to None. Only a call to validate method check data consistency.

0.2.1 (2014-12-22)

  • Push a new release to fix cached desynced packages on cheeseshops and clones.

0.2.0 (2014-12-18)

  • Package the whole module for proper distribution.

0.1.1 (2014-12-16)

  • Restore partial backward compatibility with address module from the 0.1 series.

0.1.0 (2014-12-15)

  • First public release.

0.0.0 (2013-12-06)

  • First commit.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

postal-address-0.6.0.tar.gz (28.0 kB view details)

Uploaded Source

Built Distributions

postal_address-0.6.0-py2.7.egg (21.8 kB view details)

Uploaded Source

postal_address-0.6.0-py2-none-any.whl (25.7 kB view details)

Uploaded Python 2

File details

Details for the file postal-address-0.6.0.tar.gz.

File metadata

File hashes

Hashes for postal-address-0.6.0.tar.gz
Algorithm Hash digest
SHA256 e4f16d8ed39fee76451abc5a71cf91dbd30658836f446789ec0f2a3518bc0417
MD5 13f69f2b15631b01f61a21fb6a372aee
BLAKE2b-256 39fd0a08e7fefd8fb7089d37d393759f70328f9e80a4cc4f393799781e8b8471

See more details on using hashes here.

File details

Details for the file postal_address-0.6.0-py2.7.egg.

File metadata

File hashes

Hashes for postal_address-0.6.0-py2.7.egg
Algorithm Hash digest
SHA256 e410dfaa440b45cd7b28f1d8febe3eaa607b022792d9aa156c7731a9fb78a7be
MD5 1a6dffbabc0d5ffbc20309feb3993fea
BLAKE2b-256 08330600bc43b0d58700347cd6fba922f14611f64ded90a55f1349fd16ceef1b

See more details on using hashes here.

File details

Details for the file postal_address-0.6.0-py2-none-any.whl.

File metadata

File hashes

Hashes for postal_address-0.6.0-py2-none-any.whl
Algorithm Hash digest
SHA256 e711c13c7dca16dcc6e7e8c380eb248b674f3d34a2550a952d29cea9d4e7cc53
MD5 0055141bac4fde62c52a0305173ac8cc
BLAKE2b-256 8ae5fd6c1e691d0a8581815ac8d65a8600f13c872144b7bc10294d22285f2fbb

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page