Skip to content
GitHubDiscord

Core (lexigram)

Async-first DI/IoC framework for Python — core package.


Lexigram is the foundation package for the wider Lexigram ecosystem. It provides the DI/IoC container, application lifecycle, configuration system, provider protocol, exception hierarchy, and structured logging foundation.

Async-first by design: application boot, provider lifecycle, I/O paths, and resolution workflows are built for async Python. Use Application.boot(...) to assemble modules and providers into a running app.

Terminal window
uv add lexigram
# Optional extras
uv add "lexigram[security]"
from lexigram import Application
from lexigram.di.module import Module, module
from lexigram.app.standard import StandardModule
@module(imports=[StandardModule.configure()])
class AppModule(Module):
pass
app = Application(modules=[AppModule])
if __name__ == "__main__":
app.run()

Zero-config usage: Call StandardModule.configure() with no arguments to use defaults.

application.yaml
lexigram:
# config fields here
Section titled “Option 2 — Profiles + Environment Variables (recommended)”
Terminal window
export LEX_PROFILE=production
# Environment variables for each field
from lexigram.config.main import LexigramConfig
config = LexigramConfig(...)
StandardModule.configure(config_class=LexigramConfig)
MethodDescription
StandardModule.configure(...)Configure with explicit config, sources, or overrides
StandardModule.stub()Minimal config for testing
CoreModule.configure(...)Stripped-down kernel without serialization or concurrency
  • DI Container — register services as singleton, transient, or scoped; resolve via await container.resolve(ServiceType)
  • Provider Lifecycleregister(), boot(), shutdown() hooks with priority ordering
  • Result PatternResult[T, E] for expected domain failures, exceptions for infrastructure errors
  • Module System — compose applications from reusable modules with explicit exports
  • Structured Logging — structlog-based logging via get_logger(__name__)
  • Configuration — Pydantic-based config with YAML, environment variables, and profile support
async with Application.boot(modules=[StandardModule.stub()]) as app:
# your test code
...
FileWhat it contains
src/lexigram/app/base.pyApplication lifecycle and boot flow
src/lexigram/app/standard.pyStandardModule.configure() with all kernel providers
src/lexigram/di/container/container.pyContainer registration, scope, and diagnostics
src/lexigram/result/Result, Ok, Err, and helpers
src/lexigram/config/main.pyLexigramConfig and configuration system