summaryrefslogtreecommitdiffstats
path: root/src/cepis/__init__.py
diff options
context:
space:
mode:
authorMurilo Ijanc <[email protected]>2026-07-26 11:44:58 -0300
committerMurilo Ijanc <[email protected]>2026-07-26 11:44:58 -0300
commita82459630e957a8d94c375394dae66734f3c90c1 (patch)
treed9d1b9e1249ccd8cd1d989f532c6368a70dc9cc2 /src/cepis/__init__.py
downloadpython-a82459630e957a8d94c375394dae66734f3c90c1.tar.gz
Initial importv0.1.0
Diffstat (limited to 'src/cepis/__init__.py')
-rw-r--r--src/cepis/__init__.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/cepis/__init__.py b/src/cepis/__init__.py
new file mode 100644
index 0000000..bc98d29
--- /dev/null
+++ b/src/cepis/__init__.py
@@ -0,0 +1,104 @@
+"""Python client for the public CEP API at `cep.is <https://cep.is>`_.
+
+Quick use — for a script, the module-level functions are enough::
+
+ import cepis
+
+ address = cepis.lookup("01001-000")
+ print(address.localidade, address.uf) # São Paulo SP
+
+In an application — build a :class:`Client` once and reuse it::
+
+ from cepis import Client
+
+ client = Client(timeout=5.0, total_timeout=15.0)
+ address = client.lookup("01001000")
+
+Pointing at a local instance (the API repo brings one up with ``just up``)::
+
+ client = Client(base_url="http://localhost:8080")
+
+Errors are explicit and split by decision — whether retrying helps or not::
+
+ from cepis import CEPNotFound, CepisError
+
+ try:
+ address = cepis.lookup(cep_from_form)
+ except CEPNotFound:
+ ... # the CEP does not exist: ask the user for another
+ except CepisError:
+ ... # network, server, rate limit: retry later
+
+Note on field names: the API surface is English, but the **data fields keep
+the API's own Portuguese names** (``logradouro``, ``bairro``, ``localidade``).
+What you read in the JSON is what you access on the object.
+
+The module-level functions share one default client. It is built once because
+:class:`Client` keeps no state between calls and is thread-safe. Do not mutate
+it: it applies process-wide, including to third-party libraries that also use
+this module. Anyone needing different settings should build their own.
+"""
+
+from __future__ import annotations
+
+__version__ = "0.1.0"
+
+from .client import DEFAULT_URL, MAX_BATCH, Client, normalize_cep
+from .errors import (
+ CepisError,
+ CEPNotFound,
+ InvalidCEP,
+ InvalidResponse,
+ NetworkError,
+ RateLimited,
+ ServerError,
+)
+from .models import Address, Geo, Health
+
+__all__ = [
+ "DEFAULT_URL",
+ "MAX_BATCH",
+ "Address",
+ "CEPNotFound",
+ "CepisError",
+ "Client",
+ "Geo",
+ "Health",
+ "InvalidCEP",
+ "InvalidResponse",
+ "NetworkError",
+ "RateLimited",
+ "ServerError",
+ "__version__",
+ "health",
+ "lookup",
+ "lookup_many",
+ "normalize_cep",
+]
+
+_default = Client()
+
+
+def lookup(cep: str) -> Address:
+ """Look up a CEP using the default configuration.
+
+ Shorthand for ``Client().lookup(cep)``. See :meth:`Client.lookup`.
+ """
+ return _default.lookup(cep)
+
+
+def lookup_many(ceps: list[str]) -> list[Address | None]:
+ """Look up many CEPs in one batch, using the default configuration.
+
+ Shorthand for :meth:`Client.lookup_many` — read that one, especially the
+ warning that batches carry no coordinate.
+ """
+ return _default.lookup_many(ceps)
+
+
+def health() -> Health:
+ """Query the API's health using the default configuration.
+
+ Shorthand for :meth:`Client.health`.
+ """
+ return _default.health()