Shared foundational types and representation adapters for Money Ex Machina.
Project description
mxm-types
Purpose
mxm-types provides shared foundational types and representation adapters for the Money Ex Machina ecosystem.
It defines a small, stable, representation-focused layer for:
- cross-package type definitions
- canonical data representations
- explicit boundary adapters between representations
The package is intentionally domain-agnostic.
Domain models and business semantics belong in their respective packages.
Installation
pip install mxm-types
Overview
mxm-types defines:
- Strict JSON tree types for configuration, metadata, requests, and portable data structures
- Lightweight aliases for common cross-package patterns such as path-like values and HTTP headers
- Micro-protocols for cross-cutting interfaces
- A canonical MXM timestamp substrate based on
np.datetime64[ns] - Explicit representation bridges from canonical MXM timestamps to:
- integer epoch nanoseconds
- strict canonical UTC strings
- pandas
Timestamp/DatetimeIndex
- PEP 561 typing support (
py.typedincluded in the wheel)
The package is intentionally small and stable, but it is no longer dependency-free:
the pandas boundary adapter layer depends on pandas.
Public API
The following names form the stable public API of mxm-types.
All other names are private and may change across releases.
General Types
| Name | Description |
|---|---|
JSONScalar |
str | int | float | bool | None |
JSONValue |
Strict recursive JSON tree |
JSONLike |
Permissive tree for accepting general inputs |
JSONObj |
Mapping[str, JSONValue] |
JSONMap |
dict[str, JSONValue] |
HeadersLike |
Canonical alias for HTTP header mappings |
StrPath |
str | PathLike[str] |
Protocols and TypedDicts
| Name | Description |
|---|---|
KVReadable |
Minimal protocol for key-value access |
CLIFormatOptions |
CLI output formatting hints |
Canonical Timestamp Substrate
| Name | Description |
|---|---|
TSNSScalar |
Canonical timestamp scalar (np.datetime64[ns]) |
TSNSArray |
Canonical timestamp array |
Int64Array |
Integer array for epoch nanoseconds |
TS_NS_DTYPE |
Canonical timestamp dtype |
INT64_DTYPE |
Canonical integer dtype |
EPOCH_TS_NS |
Unix epoch constant |
NAT_TS_NS |
Canonical NaT sentinel |
Timestamp Predicates and Assertions
| Name | Description |
|---|---|
is_ts_ns |
Predicate for canonical timestamp scalars |
assert_ts_ns |
Assert canonical timestamp scalar |
is_nat |
Predicate for NaT |
assert_not_nat |
Assert not NaT |
is_ts_ns_array |
Predicate for timestamp arrays |
assert_ts_ns_array |
Assert timestamp array |
has_nat |
Detect NaT in array |
assert_no_nat |
Assert no NaT |
assert_monotonic_increasing_ts_ns_array |
Assert monotonic timestamps |
Timestamp Bridges
| Name | Description |
|---|---|
ts_ns_from_int |
From integer epoch nanoseconds |
ts_ns_to_int |
To integer epoch nanoseconds |
ts_ns_from_str |
From canonical string |
ts_ns_to_str |
To canonical string |
Pandas Timestamp Adapters
| Name | Description |
|---|---|
is_pd_timestamp_for_ts_ns |
Predicate for pandas scalar |
assert_pd_timestamp_for_ts_ns |
Assert pandas scalar |
is_pd_datetimeindex_for_ts_ns_array |
Predicate for pandas index |
assert_pd_datetimeindex_for_ts_ns_array |
Assert pandas index |
ts_ns_from_pd_timestamp |
Convert from pandas |
ts_ns_to_pd_timestamp |
Convert to pandas |
ts_ns_array_from_pd_datetimeindex |
Convert index to array |
ts_ns_array_to_pd_datetimeindex |
Convert array to index |
Usage
General shared types
from mxm.types import JSONObj, StrPath
def load_metadata(path: StrPath) -> JSONObj:
...
Canonical timestamp substrate
from mxm.types import TSNSScalar, assert_not_nat, ts_ns_from_str, ts_ns_to_int
def parse_created_ts(text: str) -> int:
ts: TSNSScalar = ts_ns_from_str(text)
ts = assert_not_nat(ts)
return ts_ns_to_int(ts)
Pandas boundary adapter
import pandas as pd
from mxm.types import ts_ns_array_from_pd_datetimeindex, ts_ns_to_pd_timestamp
from mxm.types.timestamps import ts_ns_from_str
idx = pd.DatetimeIndex(
["2026-03-25 10:14:03.123456789", "2026-03-25 10:14:04.123456789"],
tz="Europe/Amsterdam",
)
arr = ts_ns_array_from_pd_datetimeindex(idx)
ts = ts_ns_from_str("2026-03-25T10:14:03.123456789Z")
pd_ts = ts_ns_to_pd_timestamp(ts)
Timestamp Design
MXM adopts a single canonical internal timestamp representation:
np.datetime64[ns]
Canonical timestamps:
- are timezone-naive NumPy timestamps interpreted as UTC
- represent instants on a linear time axis
- have nanosecond precision
- use explicit boundary adapters for external systems
Canonical string format:
YYYY-MM-DDTHH:MM:SS.fffffffffZ
Design Principles
- Single canonical representation
- Explicit boundary adapters
- Representation-focused scope
- Stable cross-package surface
- Strict static typing
Development
make check
License
MIT License. See LICENSE.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mxm_types-0.3.0.tar.gz.
File metadata
- Download URL: mxm_types-0.3.0.tar.gz
- Upload date:
- Size: 12.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ace686f24d817798396622e51d1db954b4e32bb9c46282d11bc53e53b52c838b
|
|
| MD5 |
2d0ba88362e35c4aa274c018ec4ac056
|
|
| BLAKE2b-256 |
fd27645286ded7fa7ea3b6af5f70b2a3f8adb56433a5f3c7046937436397197a
|
Provenance
The following attestation bundles were made for mxm_types-0.3.0.tar.gz:
Publisher:
release.yml on moneyexmachina/mxm-types
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mxm_types-0.3.0.tar.gz -
Subject digest:
ace686f24d817798396622e51d1db954b4e32bb9c46282d11bc53e53b52c838b - Sigstore transparency entry: 1718986483
- Sigstore integration time:
-
Permalink:
moneyexmachina/mxm-types@16954de85b2b3a28bbb1880c2947e45112776191 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/moneyexmachina
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@16954de85b2b3a28bbb1880c2947e45112776191 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mxm_types-0.3.0-py3-none-any.whl.
File metadata
- Download URL: mxm_types-0.3.0-py3-none-any.whl
- Upload date:
- Size: 12.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cda94a4a7402a94320d9832b2a06b9750717028d828a373a10519222e5b8ceab
|
|
| MD5 |
b72bb315776a584dee009e69f8d1569b
|
|
| BLAKE2b-256 |
afcb18b981958c007a1c1f3738b241be4d7c1937bcfb920c697b4a6ee2843149
|
Provenance
The following attestation bundles were made for mxm_types-0.3.0-py3-none-any.whl:
Publisher:
release.yml on moneyexmachina/mxm-types
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mxm_types-0.3.0-py3-none-any.whl -
Subject digest:
cda94a4a7402a94320d9832b2a06b9750717028d828a373a10519222e5b8ceab - Sigstore transparency entry: 1718986745
- Sigstore integration time:
-
Permalink:
moneyexmachina/mxm-types@16954de85b2b3a28bbb1880c2947e45112776191 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/moneyexmachina
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@16954de85b2b3a28bbb1880c2947e45112776191 -
Trigger Event:
push
-
Statement type: