17 lines
1.2 KiB
Plaintext
17 lines
1.2 KiB
Plaintext
## Checking commands
|
|
After writing code, always run from `backend/`:
|
|
```shell
|
|
ruff format
|
|
ruff check --fix
|
|
ty check
|
|
```
|
|
|
|
## Imports
|
|
Every service imports only what it needs to start. `make check` runs `scripts/check_imports.py`, which fails when a service loads a heavy package it is not allowed; `SERVICES` there is the contract, extend it on purpose.
|
|
- Package `__init__` files don't re-export clients or SDKs.
|
|
- An SDK used by one function is imported inside it. On an async path load it first with `await preload("<module>")` from `utils.imports`, so the event loop never waits on the import.
|
|
- Types used in Dishka provider signatures and `FromDishka[...]` stay real top-level imports.
|
|
|
|
## Dynamic config
|
|
`config()` returns a copy of an in-process snapshot: no database round-trip per call, changes from any process show up within 5 s through a version number on the config record. Never `save()` a config you read; write through `DynamicConfig.update_config(section=...)` (Mongo) or `ConfigRepository.update(section=...)`/`save(...)` (Postgres), which bump the version atomically. Counters and other hot data don't belong in the config, give them their own collection or table with atomic increments.
|