[project] name = "informix-db" version = "2026.05.05.7" description = "Pure-Python driver for IBM Informix IDS — speaks the SQLI wire protocol over raw sockets. No CSDK, no JVM, no native libraries." readme = "README.md" license = { text = "MIT" } authors = [{ name = "Ryan Malloy", email = "ryan@supported.systems" }] requires-python = ">=3.10" keywords = ["informix", "database", "sqli", "db-api", "pep-249", "asyncio", "async"] classifiers = [ "Development Status :: 5 - Production/Stable", "Framework :: AsyncIO", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Database", "Topic :: Database :: Front-Ends", "Typing :: Typed", ] dependencies = [] [project.urls] Homepage = "https://github.com/rsp2k/informix-db" Documentation = "https://github.com/rsp2k/informix-db/tree/main/docs" Issues = "https://github.com/rsp2k/informix-db/issues" [project.optional-dependencies] dev = [ "pytest>=8.0", "ruff>=0.6", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/informix_db"] [tool.hatch.build.targets.sdist] # Defense in depth: exclude operator-private and dev-only artifacts from the sdist # (the wheel doesn't ship these by default, but the sdist would). # See ~/.claude/rules/python.md for the full pre-publish PII audit playbook. exclude = [ "CLAUDE.md", # operator-private context ".env", ".env.local", ".env.*", ".mcp.json", # may contain local filesystem paths "build/", # decompiled JDBC, downloaded JARs "audits/", "docs/CAPTURES/", # spike artifacts; tests can re-capture against the dev container "tests/reference/", # Java reference client — spike infra ".pytest_cache/", ".ruff_cache/", ".mypy_cache/", "dist/", "*.egg-info/", ] [tool.ruff] line-length = 100 target-version = "py310" src = ["src", "tests"] [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort (import sorting) "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "SIM", # flake8-simplify "PTH", # flake8-use-pathlib "RUF", # ruff-specific ] ignore = [ "E501", # line too long — handled by formatter ] [tool.ruff.lint.per-file-ignores] "tests/**" = ["B011"] # allow assert False in tests [tool.pytest.ini_options] minversion = "8.0" testpaths = ["tests"] asyncio_mode = "auto" # pytest-asyncio: auto-detect ``async def`` tests addopts = [ "-ra", # short summary for non-passing "--strict-markers", "--strict-config", "-m", "not integration and not benchmark", # default: unit-only. Override with: pytest -m integration / -m benchmark ] markers = [ "integration: requires a running Informix container (docker compose up); skipped by default", "benchmark: pytest-benchmark performance test; skipped by default. Run with `make bench`.", ] [dependency-groups] dev = [ "pytest-asyncio>=1.3.0", "pytest-benchmark>=5.2.3", ]