Skip to content
GitHub

Core (lexigram)

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

Lexigram demo


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
async with Application.boot(modules=[AppModule]) as app:
# use app.container to resolve services
...

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

application.yaml
app_name: my-app
debug: false
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.build_providers()Provider list for Application.boot(providers=[...])
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.configure()]) 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