Skip to main content

Fractal Application

Fractal Application is the top of the Fractal stack: the application context that installs an application's repositories and services, wires its command bus and event publisher, and health-checks them on startup.

PyPI Version Build Status

Installation

pip install fractal-application
pip install fractal-application[fastapi]        # FastAPI ingress
pip install fractal-application[gcp]            # Firestore event store, Pub/Sub projector
pip install fractal-application[processes]      # event → Process mappers

Background

This is the layer that knows about all the others. fractal-core, fractal-commands, fractal-events and fractal-processes are all deliberately ignorant of it, which is what lets any of them be used on their own. Everything that has to know how the pieces fit together lives here.

The application context

from fractal_application import ApplicationContext
from fractal_core import Settings


class AppSettings(Settings):
    def load(self):
        self.EVENT_STORE_BACKEND = os.getenv("EVENT_STORE_BACKEND", "memory")


class Context(ApplicationContext):
    settings = AppSettings()


@ApplicationContext.register_repository("user_repository")
def select_user_repository(settings):
    return MongoUserRepository(settings.MONGO_URL)


@ApplicationContext.register_command_handler
class AddUserCommandHandler(CommandHandler):
    ...


context = Context()          # loads services, repositories, bus, publisher
context.user_repository      # installed and health-checked
context.command_bus          # every registered handler already on it

Construction is the wiring check. load() installs internal services, repositories, egress services, the event publisher, the command bus and ingress services, then asserts every repository and service reports itself healthy. A context that constructed is a context whose adapters answered.

Registration happens through decorators at import time, which means it is a side effect of the import graph — if a module holding handlers is never imported, its handlers are never registered. fractal-commands raises on a command with no handler precisely because that failure is otherwise silent.

Fractal

from fractal_application import Fractal


class MyService(Fractal):
    settings = AppSettings()
    context = Context()

Instantiating it asserts the service was wired: a Fractal without settings or without a context refuses to construct rather than failing later on the first attribute nobody set.

contrib

FastAPI

from fractal_application.contrib.fastapi.install import install_fastapi

app = install_fastapi(context, title="My Service")

Also provides the default REST routers, token/role dependencies, an error response model and a JSON encoder that understands pydantic models.

Google Cloud

FirestoreEventStoreRepository backs the event store with Firestore (selected by EVENT_STORE_BACKEND=firestore), and PubSubEventBusProjector publishes events onto a Pub/Sub topic when GCP_PROJECT_ID is set.

Processes

Event → Process mappers need fractal-processes. The context passes itself to the projector as context_func, so the process engine gets an application context without fractal-events ever importing this package.

Development

make dev-install
make test
make lint
make format

Download files

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

Source Distribution

fractal_application-1.1.0.tar.gz (19.2 kB view details)

Uploaded Source

Built Distribution

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

fractal_application-1.1.0-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

File details

Details for the file fractal_application-1.1.0.tar.gz.

File metadata

  • Download URL: fractal_application-1.1.0.tar.gz
  • Upload date:
  • Size: 19.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.34.2

File hashes

Hashes for fractal_application-1.1.0.tar.gz
Algorithm Hash digest
SHA256 b5d07bef6292f39d900fd935f6fb6ac361f1c6de64f955d055e99944c7a77511
MD5 d4c2c836b9855ef23da004f87b9a3c8b
BLAKE2b-256 cb3f13cd504a9bce01dc0c49d839ac3e0554ee7aea33da2035ec552179063778

See more details on using hashes here.

File details

Details for the file fractal_application-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for fractal_application-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 adc1d454970799bc80d114175326b9b625e02a09421da79ff9585c32dfe6e33a
MD5 2604b529375bc38751af8e83cafcb98b
BLAKE2b-256 97a6a7166e86b8d962a7d71aa0c6cc69abc882ee285dc4b905ec71fc2fa9fcd0

See more details on using hashes here.

Release history Release notifications | RSS feed

2.0.0

2 files

1.2.0

2 files

This release

1.1.0 This release

2 files

1.0.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