Core API Reference
API reference for myfy-core package.
Application
Application
The myfy application kernel.
Lifecycle: 1. Create application instance 2. Configure modules and providers 3. Initialize (compile DI, discover modules) 4. Start modules 5. Run 6. Stop modules gracefully
Usage
app = Application() app.add_module(WebModule()) await app.run()
Create a new application.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
settings_class
|
type[BaseSettings]
|
Settings class to load |
CoreSettings
|
auto_discover
|
bool
|
Automatically discover modules via entry points |
True
|
Source code in packages/myfy-core/myfy/core/kernel/app.py
add_module
Register a module with the application.
Must be called before initialize().
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
module
|
type[T]
|
The module to add |
required |
Source code in packages/myfy-core/myfy/core/kernel/app.py
get_module
Get a module by type.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
module_type
|
type[T]
|
The module class to find (e.g., WebModule) |
required |
Returns:
| Type | Description |
|---|---|
T
|
The module instance |
Raises:
| Type | Description |
|---|---|
ModuleNotFoundError
|
If module not found |
Example
web_module = app.get_module(WebModule)
Source code in packages/myfy-core/myfy/core/kernel/app.py
has_module
Check if a module type is registered.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
module_type
|
type
|
The module class to check |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True if module is registered, False otherwise |
Example
if app.has_module(FrontendModule): print("Frontend module is loaded")
Source code in packages/myfy-core/myfy/core/kernel/app.py
get_modules_implementing
Get all modules implementing a specific protocol.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
protocol
|
type[T]
|
The protocol type to filter by (e.g., IWebExtension) |
required |
Returns:
| Type | Description |
|---|---|
list[T]
|
List of modules that declare they implement the protocol |
Example
extensions = app.get_modules_implementing(IWebExtension) for ext in extensions: ext.extend_asgi_app(asgi_app)
Source code in packages/myfy-core/myfy/core/kernel/app.py
create_lifespan
Create lifespan context manager.
Returns a lifespan context that starts/stops all modules. This centralizes lifespan creation for use in CLI and factories.
Returns:
| Type | Description |
|---|---|
|
lifespan context manager |
Example
lifespan = app.create_lifespan() asgi_app = web_module.get_asgi_app(container, lifespan=lifespan)
Source code in packages/myfy-core/myfy/core/kernel/app.py
initialize
Initialize the application with multi-phase module setup.
Phases: 1. Discovery - Auto-discover modules via entry points 2. Dependency Validation - Validate module dependency graph 3. Configure - Modules register services in DI 4. Extend - Modules modify service registrations (optional) 5. Compile - DI container builds injection plans 6. Finalize - Modules configure singleton services (optional)
This must be called before start() or run().
Source code in packages/myfy-core/myfy/core/kernel/app.py
start
async
Start the application.
Initializes (if not already done) and starts all modules.
stop
async
run
async
Run the application until shutdown signal.
This is the main entry point for running the application. Sets up signal handlers and manages the full lifecycle.
Usage
app = Application() await app.run()
Source code in packages/myfy-core/myfy/core/kernel/app.py
Dependency Injection
provider
Decorator to register a function as a dependency provider.
The decorated function will be registered in the container during application startup. The return type annotation is used as the provided type.
Usage
@provider(scope=SINGLETON) def database(settings: Settings) -> Database: return Database(settings.db_url)
@provider(scope=REQUEST) def unit_of_work(db: Database) -> UnitOfWork: return UnitOfWork(db)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
scope
|
Scope
|
Lifecycle scope (default: SINGLETON) |
SINGLETON
|
qualifier
|
str | None
|
Optional qualifier for multiple providers of same type |
None
|
name
|
str | None
|
Optional name for resolution |
None
|
reloadable
|
tuple[str, ...]
|
Tuple of settings that can be hot-reloaded |
()
|
Returns:
| Type | Description |
|---|---|
Callable[[Callable[..., T]], Callable[..., T]]
|
Decorator that registers the provider |
Source code in packages/myfy-core/myfy/core/di/provider.py
Container
Dependency injection container with compile-time resolution.
Features: - Type-based resolution with optional qualifiers - Three scopes: singleton, request, task - Cycle detection at compile time - Zero reflection on hot path (all plans compiled at startup) - Test-friendly overrides
Source code in packages/myfy-core/myfy/core/di/container.py
register
Register a provider in the container.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
type_
|
type[T]
|
The type this provider produces |
required |
factory
|
ProviderFactory[T]
|
Callable that creates instances |
required |
scope
|
Scope
|
Lifecycle scope (singleton, request, task) |
SINGLETON
|
qualifier
|
str | None
|
Optional qualifier for multiple providers of same type |
None
|
name
|
str | None
|
Optional name for resolution |
None
|
reloadable
|
tuple[str, ...]
|
Tuple of field names that can be hot-reloaded |
()
|
Raises:
| Type | Description |
|---|---|
ContainerFrozenError
|
If container has been compiled |
DuplicateProviderError
|
If provider already registered |
Source code in packages/myfy-core/myfy/core/di/container.py
compile
Compile all providers - analyze dependencies and build injection plans.
This must be called before resolving dependencies. It: 1. Analyzes all provider factories for dependencies 2. Detects circular dependencies 3. Validates scope compatibility 4. Builds injection plans for fast resolution
Raises:
| Type | Description |
|---|---|
CircularDependencyError
|
If circular dependencies detected |
ScopeMismatchError
|
If scope rules violated |
ProviderNotFoundError
|
If required dependency missing |
Source code in packages/myfy-core/myfy/core/di/container.py
get
Resolve and return an instance of the requested type.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
type_
|
type[T]
|
The type to resolve |
required |
qualifier
|
str | None
|
Optional qualifier to select specific provider |
None
|
Returns:
| Type | Description |
|---|---|
T
|
Instance of the requested type |
Raises:
| Type | Description |
|---|---|
ProviderNotFoundError
|
If no provider found |
Source code in packages/myfy-core/myfy/core/di/container.py
override
Temporarily override providers for testing.
Usage
with container.override({Database: lambda: FakeDB()}): # Tests run with fake database ...
Source code in packages/myfy-core/myfy/core/di/container.py
Modules
BaseModule
Bases: ABC
Base implementation of the Module protocol.
Provides default implementations and helper methods.
Source code in packages/myfy-core/myfy/core/kernel/module.py
requires
property
Module dependencies (default: none).
Override to declare dependencies
@property def requires(self) -> list[type]: return [WebModule, DataModule]
provides
property
Extension protocols this module implements (default: none).
Override to declare protocols
@property def provides(self) -> list[type]: return [IWebExtension]
configure
abstractmethod
Configure the module by registering providers.
Must be implemented by subclasses.
extend
Extend other modules' service registrations (optional).
Default no-op implementation. Override if needed.
finalize
Finalize module configuration after container compilation (optional).
Default no-op implementation. Override if needed.
start
async
Default start implementation (no-op).
Override if your module needs startup logic.
stop
async
Default stop implementation (no-op).
Override if your module needs cleanup logic.
Configuration
BaseSettings
Bases: BaseSettings
Base class for application settings.
Inherit from this to create typed, validated configuration. Supports environment variables and .env files.
Usage
class AppSettings(BaseSettings): app_name: str = "myapp" db_url: str debug: bool = False
model_config = SettingsConfigDict(
env_prefix="MYAPP_",
env_file=".env"
)
model_dump_safe
Dump settings with secrets redacted.
Useful for logging and health check endpoints. Redacts fields containing: password, secret, token, key, api_key, private
Source code in packages/myfy-core/myfy/core/config/settings.py
Scopes
scopes
Scope management for dependency injection.
Scopes control the lifetime of injected dependencies: - SINGLETON: One instance per application - REQUEST: One instance per request (via contextvar) - TASK: One instance per background task (via contextvar)
Scope
Bases: str, Enum
Dependency scope definitions.
ScopeContext
Manages scoped dependency instances via contextvars.
Request and task scopes store instances in contextvar dictionaries, ensuring thread-safe and async-safe isolation.
get_request_bag
staticmethod
Get the request scope bag for the current context.
Raises RuntimeError if bag not initialized. The ASGI adapter should call init_request_scope() before handler execution.
Source code in packages/myfy-core/myfy/core/di/scopes.py
get_task_bag
staticmethod
Get the task scope bag for the current context.
Raises RuntimeError if bag not initialized.
Source code in packages/myfy-core/myfy/core/di/scopes.py
init_request_scope
staticmethod
init_task_scope
staticmethod
clear_request_bag
staticmethod
clear_task_bag
staticmethod
get_bag_for_scope
staticmethod
Get the appropriate bag for the given scope.
Source code in packages/myfy-core/myfy/core/di/scopes.py
clear_scope
staticmethod
Clear the given scope's bag.