Skip to main content

Xaeian

Python utilities. Zero dependencies for core. Optional extras for time, serial, media, database and more...

Philosophy

Xaeian wraps stdlib boilerplate into intent-level APIs. You read what code does, not how. In real projects this cuts ~35% of code volume.

This follows the Zen of Python:

  • Beautiful over ugly: Time() + "15m" vs datetime.now(tz=...) + timedelta(minutes=15)
  • Simple over complex: db.find_one("users", id=42) vs acquire/try/finally/dict/close
  • Flat over nested: DIR.zip(src, out) vs os.walk + zipfile + os.path.relpath loop
  • Readability counts: code reads like intentions, not implementation
  • One obvious way to do it: crc16_modbus.encode(frame), JSON.load(path), Time(ts).to("iso")
  • Errors should never pass silently: DatabaseError wraps driver exceptions with context
  • Namespaces are one honking great idea: FILE, DIR, PATH, CSV, JSON, CRC as static classes

Trade-offs:

  • Explicit over implicit: PATH.resolve auto-joins with CWD, db.insert auto-serializes dicts to JSON and ISO strings to datetime. Convenient in 95% of cases, surprising in the rest. This is a deliberate choice. Where needed, defaults can be disabled (auto_resolve=False).
  • Performance: extra abstraction layer adds overhead. Path resolution, auto-serialization, placeholder conversion on every call. Negligible for APIs and tools. Not suited for tight loops processing millions of rows.

Type safety comes from Pydantic models and Python type hints on the application layer. Xaeian provides the plumbing underneath. Each layer does one thing and stays out of the way. It works best when you control the stack end-to-end and value compact code over maximum configurability.

Install

pip install xaeian            # core
pip install xaeian[time]      # + pytz, tzlocal
pip install xaeian[serial]    # + pyserial
pip install xaeian[plot]      # + matplotlib
pip install xaeian[dsp]       # + scipy
pip install xaeian[db]        # + pymysql, psycopg2
pip install xaeian[db-async]  # + aiomysql, asyncpg, aiosqlite
pip install xaeian[media]     # + pypdf, PyMuPDF, Pillow
pip install xaeian[eda]       # + sexpdata, pypdf, PyMuPDF
pip install xaeian[sftp]      # + paramiko
pip install xaeian[all]       # everything

Examples

from xaeian import FILE, JSON, CSV, logger, split_str, generate_password
from xaeian.xtime import Time
from xaeian.crc import crc16_modbus
from xaeian.db import Database

# Files: auto extension, context-based paths
JSON.save("config", {"debug": True, "port": 8080})
CSV.save("users", [{"name": "Jan", "age": 30}, {"name": "Anna", "age": 25}])

# Time: parse anything, arithmetic with strings
t = Time("2025-03-01") + "2w 3d"
t.round("w") # Monday 00:00
t.to("iso") # "2025-03-17T00:00:00+01:00"

# CRC: encode/decode with Modbus, ISO, custom
frame = crc16_modbus.encode(b"\x01\x03\x00\x00\x00\x0A")
assert crc16_modbus.decode(frame) is not None

# String tools
split_str('a,"b,c",d', sep=",") # ['a', '"b,c"', 'd']
generate_password(16) # 'aB3$xY9!mN2@pQ7&'

# Database: sqlite/mysql/postgres, sync/async
db = Database("sqlite", "app.db")
db.insert("users", {"name": "Jan", "settings": {"theme": "dark"}})
db.find("users", order="name", limit=10)
async with db.transaction():
  db.update("users", {"verified": True}, "id = ?", 42)

# Serial recorders: threaded read, latest value via .value
from xaeian.serial import Recorder
recs = [Recorder(p, name=n, regex=Recorder.SCI_NORM)
  for n, p in {"U1": "COM7", "I1": "COM8"}.items()]
for r in recs: r.start() # background reader threads
... # app-side reap loop snapshots r.value (CSV, DB, MQTT)
for r in recs: r.stop()

# Plot: fluent, stacked panels, auto datetime
from xaeian.plot import Plot
(Plot(theme="dark")
  .line(t, temp, "Temperature [°C]")
  .panel()
  .line(t, hum, "Humidity [%]")
  .title("Sensors")
  .save("dashboard.png"))

# DSP: immutable signals, filters, FFT, vibration metrics
from xaeian.dsp import Signal
sig = Signal.from_accel(raw_x, fs=6666, bits=16, g_range=2)
clean = sig.highpass(10).lowpass(500)
print(f"RMS:{clean.rms:.4f}  peak_freq:{clean.fft().peak_freq:.0f}Hz")

# Binary structs: C-like encoding with CRC, bitfields, scale/offset
from xaeian.cstruct import Struct, Field, Bitfield, Type, Endian
from xaeian.crc import crc32_iso
pkt = Struct(endian=Endian.little, crc=crc32_iso)
pkt.add(
  Field(Type.uint32, "timestamp", "s"),
  Bitfield("flags", [("enabled", 1), ("error", 1), ("mode", 6)]),
  Field(Type.float, "temperature", "°C"),
)
flags = {"enabled": 1, "error": 0, "mode": 5}
raw = pkt.encode({"timestamp": 1234567890, "flags": flags, "temperature": 23.5})
pkt.decode(raw) # {"timestamp": 1234567890, "flags": {...}, "temperature": 23.5}

# Media: compress, strip metadata
from xaeian.media.min import compress
compress("report.pdf") # → report-min.pdf
compress("photos/", max_px=1280) # → photos-min/ (recursive)

# Logging: colored, rotating
log = logger("app", file="app.log")
log.info("started") # 2025-03-01 14:32:01 INF started

CLI

xn tree .                     # directory tree
xn dupes photos/              # find duplicates
xn wifi                       # saved Wi-Fi passwords
xn min report.pdf             # compress PDF
xn min photo.jpg -f avif      # convert to AVIF
xn min photos/ --max-px 1280  # batch resize
xn meta photo.jpg -i          # strip EXIF in-place
xn ico logo.png -o favicon.ico

Modules

Module Description Docs
files FILE, DIR, PATH, JSON, CSV, INI, YAML, async xaeian/files/readme.md
table Lightweight tabular ops on list[dict] xaeian/readme.md
xstring Split, replace, strip comments, passwords xaeian/readme.md
xtime Datetime parsing, arithmetic, rounding xaeian/readme.md
colors ANSI 256-color terminal codes xaeian/readme.md
log Colored logging with file rotation xaeian/readme.md
crc CRC-8/16/32 with predefined variants xaeian/readme.md
cstruct Binary struct serialization (C-like) xaeian/readme.md
cmd Shell command helpers xaeian/readme.md
serial Port, recorders with CSV logging, embedded shell client xaeian/serial/readme.md
plot Fluent matplotlib wrapper with stacked panels xaeian/readme.md
dsp Signal processing, SOS filters, FFT, vibration xaeian/readme.md
db Database abstraction (SQLite, MySQL, PostgreSQL) xaeian/db/readme.md
media Compress, convert, strip metadata (PDF & images) xaeian/media/readme.md
eda E-series, KiCad export, NgSpice runner xaeian/eda/readme.md
net Network clients (SFTP, FTP) xaeian/net/readme.md
cli tree, dupes, wifi scripts xaeian/cli/readme.md

Download files

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

Source Distribution

xaeian-0.7.5.tar.gz (170.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xaeian-0.7.5-py3-none-any.whl (176.3 kB view details)

Uploaded Python 3

File details

Details for the file xaeian-0.7.5.tar.gz.

File metadata

  • Download URL: xaeian-0.7.5.tar.gz
  • Upload date:
  • Size: 170.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for xaeian-0.7.5.tar.gz
Algorithm Hash digest
SHA256 00978e8a995b333cfd3b2f6a29bb1a1eaf995344bebf9b47802e99a12a68e8f4
MD5 2fb22c3861c871a25a407e1494a303a0
BLAKE2b-256 db0a5ed58900158ee54fa1394152adb3a3aa95a7b026e2fc578442abfc3410e2

See more details on using hashes here.

Provenance

The following attestation bundles were made for xaeian-0.7.5.tar.gz:

Publisher: publish.yml on Xaeian/Python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xaeian-0.7.5-py3-none-any.whl.

File metadata

  • Download URL: xaeian-0.7.5-py3-none-any.whl
  • Upload date:
  • Size: 176.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for xaeian-0.7.5-py3-none-any.whl
Algorithm Hash digest
SHA256 31209791819dd7b5c4a47c67781610941b7fe829f2b1fdfe54c3965c36d48ff6
MD5 191a424650df8210d2eb95cf580de4f0
BLAKE2b-256 b6d61f437bf0f397f576d04cfbbbc6ce0785f65181283d830b0c784cd797ace3

See more details on using hashes here.

Provenance

The following attestation bundles were made for xaeian-0.7.5-py3-none-any.whl:

Publisher: publish.yml on Xaeian/Python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.9.3

2 files

0.9.2

2 files

0.9.1

2 files

0.9.0

2 files

0.8.2

2 files

0.8.1

2 files

0.8.0

2 files

This release

0.7.5 This release

2 files

0.7.4

2 files

0.7.3

2 files

0.7.2

2 files

0.7.1

2 files

0.7.0

2 files

0.6.2

2 files

0.6.1

2 files

0.6.0

2 files

0.5.3

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page