Imported from yemeal/andruha-messages-dialogues-service (
AGENTS.md). Install upstream withnpx skills add yemeal/andruha-messages-dialogues-service. Copyright stays with the author.
AGENTS.md β messages-dialogues-service
ΠΠ±ΡΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡΡΡ Ρ docs/agent-guidelines/AGENTS.md Π² Andruha; ΡΡΠΎΡ ΡΠ°ΠΉΠ» ΡΠ°ΠΌΠΎΠ΄ΠΎΡΡΠ°ΡΠΎΡΠ΅Π½ ΠΏΡΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ checkout. ΠΠΎΠ½ΡΠ΅ΠΊΡΡ Π½ΠΈΠΆΠ΅ ΡΡΠΎΡΠ½ΡΠ΅Ρ Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠΉ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ, Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠ°Ρ ΠΌΠ°ΡΡΠΎΠ²ΡΠΉ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³.
Π Π°Π±ΠΎΡΠ° ΠΈ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ
- ΠΡΠ²Π΅ΡΠ°ΠΉ ΠΏΠΎ-ΡΡΡΡΠΊΠΈ: ΡΠ½Π°ΡΠ°Π»Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ. ΠΠ΅ΡΠ΅Π΄ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ Π΄Π°ΠΉ ΠΊΡΠ°ΡΠΊΠΈΠΉ ΠΏΠ»Π°Π½: ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π³ΡΠ°Π½ΠΈΡΡ, ΡΠ°Π³ΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ.
- ΠΠΎ ΠΏΡΠ°Π²ΠΎΠΊ ΠΏΡΠΎΡΠΈΡΠ°ΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, README, ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΡΠ΅ CONTEXT.md/ADR ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡ Git status ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°. Π‘ΠΎΡ ΡΠ°Π½ΡΠΉ ΡΡΠΆΠΈΠ΅ ΠΈ Π½Π΅Π·Π°Π²Π΅ΡΡΡΠ½Π½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ; ΡΠ°Π±ΠΎΡΠ°ΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ.
- ΠΡΡΠΌΠΎΠ΅ ΠΏΠΎΡΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π΅Π³ΠΎ ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ . Π ΡΡΠΈΠ½Π½ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠΈΠΌΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΠΉ ΡΠ°ΠΌ; ΡΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΡΠΎΠ³Π»Π°ΡΠΈΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π½Π΅ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΠΉ.
- Π‘Π½Π°ΡΠ°Π»Π° ΡΠΎΠ³Π»Π°ΡΡΠΉ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ API, ΡΡ Π΅ΠΌ ΠΠ ΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ, Π½ΠΎΠ²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ/ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ², Π΅ΡΠ»ΠΈ ΡΡΠΎ Π΅ΡΡ Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π·Π°Π΄Π°ΡΠ΅ΠΉ.
- ΠΡΠ΄ΠΈΡ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ Π²ΡΠ²ΠΎΠ΄Π°ΠΌΠΈ ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΏΠ»Π°Π½ΠΎΠΌ; ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠΉ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ Π²ΡΠΏΠΎΠ»Π½ΡΠΉ ΠΏΠΎΡΠ»Π΅ ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉ, ΠΏΠΎΠΊΠ° ΠΆΠ΄ΡΡΡ ΠΎΡΠ²Π΅ΡΠ°.
Git ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠ°
- ΠΠ°ΠΆΠ΄Π°Ρ ΡΠΈΡΠ° β ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ Π²Π΅ΡΠΊΠ° Ρ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ; ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
feat/<ΠΊΡΠ°ΡΠΊΠ°Ρ-ΡΡΡΡ>. ΠΡΠ½ΠΎΠ²Π½Π°Ρ Π²Π΅ΡΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· PR. ΠΠ»Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π² β ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ Π²Π΅ΡΠΊΠΈ ΠΈ PR. - ΠΠΎΠΌΠΌΠΈΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½Ρ ΠΈ ΠΈΠ΄ΡΡ Π² Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅: ΠΎΠ΄Π½Π° ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ, ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ½ΠΎΡΡΡΠΈΠ΅ΡΡ ΠΊ Π½Π΅ΠΉ ΡΠ°ΠΉΠ»Ρ, Π±Π΅Π· ΡΠΌΠ΅ΡΠΈ ΡΠΈΡΠΈ ΠΈ ΠΏΠΎΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ ΡΠ±ΠΎΡΠΊΠΈ.
- Conventional Commits:
type(scope): description; scope Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉfeat,fix,refactor,test,docs,chore,build,ci,perf; breaking change ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΠΉ!ΠΈΠ»ΠΈBREAKING CHANGE:. - ΠΠ΅ΡΠ΅Π΄ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠΌ ΠΏΡΠΎΠ²Π΅ΡΡ staged diff. ΠΠ΅ Π²ΠΊΠ»ΡΡΠ°ΠΉ ΡΡΠΆΠΈΠ΅ ΠΏΡΠ°Π²ΠΊΠΈ, ΡΠ΅ΠΊΡΠ΅ΡΡ, ΡΠΎΠΊΠ΅Π½Ρ, ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΈΠ»ΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ΅ΡΡΡ. ΠΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΠΉ ΡΡΠΆΡΡ ΠΈΡΡΠΎΡΠΈΡ ΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠΉ ΡΠ°Π·ΡΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Git-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π±Π΅Π· ΡΠ²Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ.
TDD ΠΈ Π½Π΅ΠΏΡΠΈΠΊΠΎΡΠ½ΠΎΠ²Π΅Π½Π½ΠΎΡΡΡ ΡΠ΅ΡΡΠΎΠ²
- ΠΠ»Ρ ΡΠΈΡΠΈ/Π±Π°Π³ΡΠΈΠΊΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ Π½Π°Π²ΡΠΊΠΈ
tddΠΈpytest-skill, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ Python; ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΡ Π½Π΅ ΠΎΡΠΌΠ΅Π½ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΠ΅ΡΠ΅Π΄ Π½ΠΎΠ²ΡΠΌ ΡΠ΅ΡΡΠΎΠΌ ΡΠΎΠ³Π»Π°ΡΡΠΉ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ Π³ΡΠ°Π½ΠΈΡΡ; ΡΠΆΠ΅ ΡΡΠ²Π΅ΡΠΆΠ΄ΡΠ½Π½ΠΎΠ³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ/ΠΏΠ»Π°Π½Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² Π½ΡΠΌ. - Π Π°Π±ΠΎΡΠ°ΠΉ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΠ°Π³Π°ΠΌΠΈ: ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ β ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ RED β ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ β GREEN. ΠΠΎΡΠ»Π΅ GREEN ΠΏΡΠΎΠ²Π΅ΡΡ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΈ ΡΠ΄Π΅Π»Π°ΠΉ ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΠΎΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅, Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΠΈ Π·Π°ΡΡΠΎΠ½ΡΡΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ. ΠΠ΅ ΠΏΠΈΡΠΈ Π·Π°ΡΠ°Π½Π΅Π΅ Π²Π΅ΡΡ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΡΠΎΠ² ΠΏΠΎΠ΄ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
- Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ°ΠΉ ΡΡΠ°Π·Ρ: ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠ΅ΡΡ, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅/ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΈΠ·Π²Π΅ΡΡΠ½Π°Ρ ΠΏΡΠΈΡΠΈΠ½Π° ΠΈΠ»ΠΈ ΡΠ²Π½ΠΎ ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½Π°Ρ Π³ΠΈΠΏΠΎΡΠ΅Π·Π°.
- ΠΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ RED Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ°, ΠΏΠ°Π΄Π°ΡΡΠ΅Π³ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·-Π·Π° ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ: ΡΠΎΠΎΠ±ΡΠΈ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΠΏΠ»Π°Π½Ρ, Π½Π΅ ΠΌΠ΅Π½ΡΡ ΡΠ΅ΡΡ.
- ΠΠ΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ (Π²ΠΊΠ»ΡΡΠ°Ρ ΠΈΠ½ΠΎΠΉ ΠΏΠΎΠ²ΠΎΠ΄ RED): ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°ΡΡΠΎΠ½ΡΡΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΡ ΠΈ Π·Π°ΠΏΡΠΎΡΠΈ ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. ΠΠΎ ΠΎΡΠ²Π΅ΡΠ° Π΄ΠΎΠΏΡΡΡΠΈΠΌΡ ΡΡΠ΅Π½ΠΈΠ΅/Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠ°Ρ ΡΠ°Π±ΠΎΡΠ°, Π½ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ production-ΠΊΠΎΠ΄Π° ΡΠ°Π΄ΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΠ°Π΄Π΅Π½ΠΈΡ.
- ΠΡΠ±ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΠ΅ΡΡΠΎΠ² β ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ: assertions, fixtures, conftest, helpers, snapshots, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ/ΡΠ΄Π°Π»Π΅Π½ΠΈΡ, skip/xfail ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, ΠΌΠ΅Π½ΡΡΡΠΈΠ΅ Π½Π°Π±ΠΎΡ ΠΈΠ»ΠΈ ΡΠΌΡΡΠ» ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ. ΠΡΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΈ ΠΊ ΡΠ΅ΡΡΡ, ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ Π°Π³Π΅Π½ΡΠΎΠΌ. ΠΠ΅ ΠΎΡΠ»Π°Π±Π»ΡΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ°Π΄ΠΈ GREEN; Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎ ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ RED ΡΠΎΡ ΡΠ°Π½ΡΠΉ.
- Π’Π΅ΡΡΠΈΡΡΠΉ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ: ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π΄ΠΎΠΌΠ΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠΆΠΈΠ΄Π°Π½ΠΈΡ Π±Π΅ΡΠΈ ΠΈΠ· ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ/Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ², Π° Π½Π΅ ΠΈΠ· ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°. ΠΠ΅ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°ΠΉ ΡΠ΅ΡΡ ΠΊ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ ΠΈ ΠΏΠΎΡΡΠ΄ΠΊΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ².
DDD ΠΈ Π³Π΅ΠΊΡΠ°Π³ΠΎΠ½Π°Π»ΡΠ½Π°Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ ΡΠ·ΡΠΊ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ. Rich Domain Model ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π΅ ΠΈΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅; ΡΡΡΠ½ΠΎΡΡΡ/Π°Π³ΡΠ΅Π³Π°Ρ ΡΠ°ΠΌ ΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΡΠ²ΠΎΠΈ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΡ. Application ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΡΠ΅Ρ ΡΡΠ΅Π½Π°ΡΠΈΠΉ, ΠΏΡΠ°Π²Π°, ΠΏΠΎΡΡΡ ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ; Π±ΠΈΠ·Π½Π΅Ρ-ΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π΅ Π΄ΡΠ±Π»ΠΈΡΡΡΡΡΡ Π² handlers, HTTP ΠΈΠ»ΠΈ persistence.
- ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Ρ Π²Π½ΡΡΡΡ:
entrypoints β application β domain;infrastructureΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΏΠΎΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ ΡΠ»ΠΎΡΠ². Domain Π½Π΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅Ρ application, transport, ORM, DI, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈΠ»ΠΈ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ; application Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π°Π΄Π°ΠΏΡΠ΅ΡΠΎΠ². Π‘Π±ΠΎΡΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ β Π² composition root. - Pydantic Π² domain β ΠΎΡΠΎΠ·Π½Π°Π½Π½ΡΠΉ Π²ΡΠ±ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠΎΠΌΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ORM-ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΡΠ΅ ΡΡ Π΅ΠΌΡ ΠΈ application DTO ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠΎΠ»ΠΈ; ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠΉ Π½Π° Π³ΡΠ°Π½ΠΈΡΠ°Ρ . DTO Π±Π΅Π· ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌ, Π°Π½Π΅ΠΌΠΈΡΠ½Π°Ρ ΡΡΡΠ½ΠΎΡΡΡ β Π½Π΅Ρ.
- ΠΠΎΡΠ΅Π½Ρ Π°Π³ΡΠ΅Π³Π°ΡΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ ΡΠ²ΠΎΠ΅ΠΉ Π³ΡΠ°Π½ΠΈΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ. ΠΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π²Ρ ΠΎΠ΄Π΅ Π½Π΅ Π·Π°ΠΌΠ΅Π½ΡΡΡ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΡ; ΠΌΠ΅ΠΆΠ°Π³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΡΠΉ ΡΠ΅ΡΠ΅Π· application/ΠΏΠΎΡΡΡ ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°.
- ΠΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ UoW, ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, policies, dispatch, idempotency ΠΈ outbox. ΠΠ΅ Π²Π²ΠΎΠ΄ΠΈ Π²ΡΠΎΡΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄Π»Ρ ΡΠΆΠ΅ ΡΠ΅ΡΡΠ½Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ; ΠΌΠ΅ΠΆΡΠ΅ΡΠ²ΠΈΡΠ½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ΅Π±ΡΡΡ ΡΠ²Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠ°Π±ΠΎΡ.
- Query Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΠ΅ Π±ΠΈΠ·Π½Π΅Ρ-ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅. Command ΡΠ²Π½ΠΎ Π²ΡΡΠ°ΠΆΠ°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅; Π΄ΠΎΠΏΡΡΡΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ (ID/DTO/ΠΏΡΠΈΠ·Π½Π°ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ). ΠΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠΉ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π° Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ write/read ΡΠ°Π΄ΠΈ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎΠ³ΠΎ CQS.
Python ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ
- Python 3.14+:
T | None,list[T],dict[K, V],tuple[T, ...],Self,Annotated; Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠΉ legacyOptional,Union,List,Dict. Π‘ΠΎΠ±Π»ΡΠ΄Π°ΠΉ ΡΠΈΠΏΡ;Any, cast ΠΈ ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ Π½Π΅ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ. - ΠΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ:
DomainModelβ Π±Π΅Π· ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎΡΡΠΈ (Π²ΠΊΠ»ΡΡΠ°Ρ Value Objects);Entityβid,created_at;MutableEntityβ Π΅ΡΡupdated_at;VersionedMutableEntityβ Π΅ΡΡversionΠ΄Π»Ρ OCC. ΠΡΠΈΠΌΠ΅Π½ΡΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ; ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΎΡΠ»ΠΈΡΠΈΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ°. - ΠΡΠ΅Π³Π΄Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅: ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅, ΡΠ°Π±ΡΠΈΠΊΠΈ, Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΡΡ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΡ. ΠΠ΅ΠΆΠΏΠΎΠ»Π΅Π²ΡΠ΅ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΡ Π²ΡΡΠ°ΠΆΠ°ΠΉ Π²
@model_validator(mode="after"), Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ β ΡΠΈΠΏΠ°ΠΌΠΈ/ΠΏΠΎΠ»ΡΠΌΠΈ; Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΡ Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Ρ, Π±Π΅Π· I/O ΠΈ ΠΏΠΎΠ±ΠΎΡΠ½ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. - ΠΠ·ΠΌΠ΅Π½ΡΠΉ ΡΡΡΠ½ΠΎΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ²Π½ΡΠΌΠΈ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ
_apply_changes(now=..., ...)ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ. Π‘Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ²Π΅ΡΡ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈ Π±ΠΈΠ·Π½Π΅Ρ-ΠΏΠΎΠ»Ρ, Π²ΡΠ΅ΠΌΡ ΠΈ Π²Π΅ΡΡΠΈΡ Π²ΠΌΠ΅ΡΡΠ΅. ΠΡΠΈ Π»ΡΠ±ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎ; Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ rollback Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½ΠΎΡΠΌΠΎΠΉ. - ΠΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: Value Objects β Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ ΡΠ°Π±ΡΠΈΠΊΠ°ΠΌΠΈ
create/from_*; ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ Π·Π°ΠΊΡΡΠ²Π°ΡΡ ΠΏΡΡΠΌΡΡ Π·Π°ΠΏΠΈΡΡ ΠΏΠΎΠ»Π΅ΠΉ.frozen=TrueΠ½Π΅ Π·Π°ΠΌΠΎΡΠ°ΠΆΠΈΠ²Π°Π΅Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ list/dict: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΈ Π·Π°ΡΠΈΡΡΠ½Π½ΡΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ. - ΠΠ΅ ΠΎΠ±Ρ
ΠΎΠ΄ΠΈ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΡ ΡΠ΅ΡΠ΅Π· ΡΡΠΆΠΈΠ΅
_private-ΠΏΠΎΠ»Ρ, reflection, monkey-patching,__dict__ΠΈΠ»ΠΈobject.__setattr__. ΠΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²Π°Ρ Π·Π°ΠΌΠ΅Π½Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠ° ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°; Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄. - ΠΠ±ΡΡΠ½ΡΠ΅
model_construct()ΠΈmodel_copy(update=...)ΠΎΠ±Ρ ΠΎΠ΄ΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ; Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ ΠΈΡ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ/Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π΄ΠΎΠΌΠ΅Π½Π°. ΠΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ override, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠ΅Ρ, Π΄ΠΎΠΏΡΡΡΠΈΠΌ.model_validate(existing_instance)ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ;validate_assignmentΠ½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π°. - Defaults Pydantic ΠΎΠ±ΡΡΠ²Π»ΡΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π·
Field(default=...)ΠΈΠ»ΠΈField(default_factory=...); ΠΎΠ±Π΅ΡΠΏΠ΅ΡΡ ΠΈΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ (validate_default=True).T | NoneΡΠ°ΠΌΠΎ ΠΏΠΎ ΡΠ΅Π±Π΅ Π½Π΅ Π·Π°Π΄Π°ΡΡ default. Π€ΠΎΡΠΌΡ Ρ default Π²Π½ΡΡΡΠΈAnnotatedΠΏΡΠΎΠ²Π΅ΡΡΠΉ Π²ΡΠ±ΡΠ°Π½Π½ΡΠΌ type checker: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΈΡΠ°ΡΡ ΠΏΠΎΠ»Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ. - Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ°Ρ ΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ Π·Π°ΠΏΠΈΡΡ, ΡΠΎΡ
ΡΠ°Π½ΡΡΡΠ°Ρ default Π²Π½ΡΡΡΠΈ Field:
foo: Annotated[str | None, Field(description="...")] = Field(default=None). ΠΡΡ ΠΎΠ΄Π½Π°Ρ ΡΠΎΡΠΌΠ°foo: Annotated[str | None, Field(default=None, description="...")]Π΄ΠΎΠΏΡΡΡΠΈΠΌΠ° ΠΏΡΠΈ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄ΡΠ½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ; ΡΡΠ°ΡΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ°ΡΡΠΎΠ²ΠΎ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΠΉ. - ΠΡΠ΅ΠΌΡ β timezone-aware UTC; naive datetime ΠΎΡΠΊΠ»ΠΎΠ½ΡΠΉ, Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΉ offset Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΡΠΉ Π² UTC Π½Π° Π³ΡΠ°Π½ΠΈΡΠ΅. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ
app.domain.clock.utc_now()Π»ΠΈΠ±ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ clock, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΠΉnowΡΠ²Π½ΠΎ Π΄Π»Ρ Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΠ·ΠΌΠ°; Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°ΠΉ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π²Π½ΡΡΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ². - ΠΠΎΠ²ΡΠ΅ Π±ΠΈΠ·Π½Π΅Ρ-ID β
uuid.uuid7(); Π²Π΅ΡΡΠΈΡ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ UUID ΠΏΡΠΎΠ²Π΅ΡΡΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ. Π‘ΠΎΡ ΡΠ°Π½ΡΠΉ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎΡΡΡ ΠΏΡΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ/replay; Π½Π΅ Π³Π΅Π½Π΅ΡΠΈΡΡΠΉ Π½ΠΎΠ²ΡΠΉ ID Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΠΆΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. - OCC: Π΄ΠΎΠΌΠ΅Π½ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΏΠΎ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΡ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΈ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ. ΠΠ΄ΠΈΠ½ ΡΡΡΡΡΠΈΠΊ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ.
ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ pytest
- ΠΠΎΠ²ΡΠ΅ ΡΠ΅ΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΠΉ ΠΏΠΎ ΡΡΠΎΠ²Π½Ρ ΠΈ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ:
tests/unit/domain/<ΠΎΠ±Π»Π°ΡΡΡ>/,tests/unit/application/<ΡΡΠ΅Π½Π°ΡΠΈΠΉ>/,tests/unit/infrastructure/<Π°Π΄Π°ΠΏΡΠ΅Ρ>/; Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² βtests/integration/<Π³ΡΠ°Π½ΠΈΡΠ°>/, ΡΠΊΠ²ΠΎΠ·Π½ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ βtests/e2e/<ΡΡΠ΅Π½Π°ΡΠΈΠΉ>/, Π΅ΡΠ»ΠΈ ΡΡΠΎΡ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠΆΠ΅ Π²Π²Π΅Π΄ΡΠ½. Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½ΡΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ; ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ΅ΡΡΡ Π±Π΅Π· ΡΠΎΠ³Π»Π°ΡΠΈΡ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΠΉ. - Domain unit ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±Π΅Π· ΠΠ/ΡΠ΅ΡΠΈ; application unit ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΡΠΎΡΡΡΠ΅ fakes ΠΏΠΎΡΡΠΎΠ². Integration ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π½Π°ΡΡΠΎΡΡΠΈΠΉ Π°Π΄Π°ΠΏΡΠ΅Ρ/Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΠΈ. HTTP-ΡΠ΅ΡΡ Ρ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΡΠ½Π½ΡΠΌ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΠΌ Π½Π΅ Π΄ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΠ.
- Fixtures ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΠΉ Π² Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅ΠΌ
conftest.py, Π²ΡΠ±ΠΈΡΠ°ΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ scope ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΠΉ teardown. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉparametrizeΠ΄Π»Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ², ΠΏΠΎΠ½ΡΡΠ½ΡΠ΅ ΠΈΠΌΠ΅Π½Π°/IDs ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ markers; async-ΡΠ΅ΠΆΠΈΠΌ Π±Π΅ΡΠΈ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°. - Π’Π΅ΡΡΡ Π±ΡΡΡΡΡΠ΅, ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΠ΅: ΡΠΈΠΊΡΠΈΡΡΠΉ Π²ΡΠ΅ΠΌΡ/ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΡΡΡ, Π½Π΅ ΠΏΠΎΠ»Π°Π³Π°ΠΉΡΡ Π½Π° ΠΏΠΎΡΡΠ΄ΠΎΠΊ, ΠΎΠ±ΡΠΈΠ΅ Π²Π½Π΅ΡΠ½ΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΈΠ»ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠΎΠΊΠΈ/fakes β Π½Π° Π²Π½Π΅ΡΠ½ΠΈΡ Π³ΡΠ°Π½ΠΈΡΠ°Ρ , Π½Π΅ Π²Π½ΡΡΡΠΈ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ.
- ΠΠ»Ρ Π΄ΠΎΠΌΠ΅Π½Π½ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΡΠΎΠ²Π΅ΡΡΠΉ ΡΡΠΏΠ΅ΡΠ½ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄, ΠΎΡΠΊΠ°Π· ΠΏΡΠΈ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΈ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΡΠΈ ΠΎΡΠΊΠ°Π·Π΅; Π΄Π»Ρ Π·Π½Π°ΡΠΈΠΌΠΎΠ³ΠΎ persistence β ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ/OCC. ΠΠΎΠΊΡΡΡΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΏΠΎΠ»Π½ΠΎΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π², ΠΏΡΠΎΡΠ΅Π½Ρ ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ Π½Π΅ Π΄ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ.
Π§ΠΈΡΠ°Π΅ΠΌΡΠΉ ΠΈ ΠΏΡΠΎΡΡΠΎΠΉ ΠΊΠΎΠ΄
- ΠΠΈΡΠΈ ΠΊΠΎΠ΄ ΠΊΠ°ΠΊ ΡΠ²ΡΠ·Π½ΡΠΉ ΡΠ΅ΠΊΡΡ: ΠΏΠΎΠ½ΡΡΠ½ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π½ΠΎΡΠΈΠΌΡΠ΅ ΠΈΠΌΠ΅Π½Π°, Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΡΡΠΎΠ²Π½Π΅ΠΌ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ (SLAP). Π‘ΠΎΡ ΡΠ°Π½ΡΠΉ ΡΡΠΈΠ»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°; Π½Π΅ Π΄ΡΠΎΠ±ΠΈ ΠΊΠΎΠ΄ ΡΠ°Π΄ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π»ΠΈΠΌΠΈΡΠ° ΡΡΡΠΎΠΊ.
- KISS/YAGNI: ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ, Π±Π΅Π· speculative features, ΠΏΡΠ΅ΠΆΠ΄Π΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ Π»ΠΈΡΠ½Π΅Π³ΠΎ boilerplate. DRY: ΠΎΠ΄ΠΈΠ½ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π±ΠΈΠ·Π½Π΅Ρ-ΠΏΡΠ°Π²ΠΈΠ»Π°; ΠΏΠΎΡ ΠΎΠΆΠΈΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΎΠ΄Π½Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ.
- SOLID: ΠΎΠ΄Π½Π° ΠΏΡΠΈΡΠΈΠ½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ (S); ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΡΡΡΠΎΠΉΡΠΈΠ²ΡΠ΅ ΡΠΎΡΠΊΠΈ Π²Π°ΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΡΡΠΈ (O); ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠ² ΠΏΠΎΠ΄ΡΠΈΠΏΠ°ΠΌΠΈ (L); Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² (I); Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ ΠΏΠΎΡΡΠΎΠ², Π° Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ (D). ΠΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΠΌ, Factory/Strategy/Policy/Adapter ΠΏΡΠΈΠΌΠ΅Π½ΡΠΉ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.
- ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΡΡΠ½ΡΡΡ Π±ΠΈΠ·Π½Π΅Ρ-ΠΏΡΠΈΡΠΈΠ½Ρ, ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΈΠ»ΠΈ Π²Π½Π΅ΡΠ½Π΅Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅. ΠΠ΅ΠΏΠΎΠ½ΡΡΠ½ΠΎΠ΅ Β«ΡΡΠΎΒ» ΠΈΡΠΏΡΠ°Π²Π»ΡΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΡΡΡΡΠΊΡΡΡΠΎΠΉ; docstrings ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠ² ΡΠΎΡ ΡΠ°Π½ΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌΠΈ.
- Boy Scout Rule Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π²Π½ΡΡΡΠΈ Π·Π°Π΄Π°ΡΠΈ ΠΈ ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²: ΡΠ±ΠΈΡΠ°ΠΉ Π²Π½Π΅ΡΡΠ½Π½ΡΠ΅ debug/Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΡ/ΠΌΡΡΡΠ²ΡΠΉ ΠΈ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄, Π½Π΅ ΡΠ°ΡΡΠΈΡΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΈ Π½Π΅ Π½Π°ΡΡΡΠ°Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ².
- Π―Π²Π½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠΎΡ ΡΠ°Π½ΡΠΉ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ»ΠΎΡΠΌΠΈ; Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π΅ ΠΏΡΠΎΠ³Π»Π°ΡΡΠ²Π°ΠΉ ΠΈ Π½Π΅ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΠΉ Π² ΡΡΠΏΠ΅Ρ . ΠΡΠΎΠ²Π΅ΡΡΠΉ Π½Π΅Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π³ΡΠ°Π½ΠΈΡΠ°Ρ ; Π½Π΅ ΡΠ°ΡΠΊΡΡΠ²Π°ΠΉ ΡΠ΅ΠΊΡΠ΅ΡΡ Π² Π»ΠΎΠ³Π°Ρ /ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΡ .
- Make it work β make it right β make it fast: ΡΠ½Π°ΡΠ°Π»Π° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π·Π°ΡΠ΅ΠΌ ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΠΎΠ΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅; ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ β ΠΏΠΎΡΠ»Π΅ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ, Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅
- Π’ΠΎΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ Π²Π΅ΡΡΠΈΠΈ Π±Π΅ΡΠΈ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΈ CI. ΠΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΠΉ ΡΠ΅Π»Π΅Π²ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ; ΠΏΠ΅ΡΠ΅Π΄ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° β formatter/linter, type checker ΠΈ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ unit/integration-ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ»Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΡΠ½ΠΎΡΡΡΠΈΡ ΡΡ ΠΊ Π½Π΅ΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ.
- ΠΠΎΡΠΎΠ²Π½ΠΎΡΡΡ ΠΊΠΎΠ΄Π°: ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΡΠΎΡΠ»ΠΈ, formatter/linter/type checker Π½Π΅ Π²ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ warnings. ΠΡΠΎΠ²Π΅ΡΡΠΉ Π±Π΅Π· Π°Π²ΡΠΎΠΏΡΠ°Π²ΠΊΠΈ Π·Π°ΡΠΈΡΡΠ½Π½ΡΡ ΡΠ΅ΡΡΠΎΠ² ΠΈ ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ; ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎΠΎΠ±ΡΠ°ΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, ΡΠΎΠ±Π»ΡΠ΄Π°Ρ Π³ΡΠ°Π½ΠΈΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ.
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΠΉ Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠΌΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ ΠΈ Π½ΡΠΆΠ½ΡΠΌΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΠΌΠΈ/Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ. ΠΠ΅Π΄ΠΎΡΡΡΠΏΠ½Π°Ρ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°, collection, skip/xfail ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ RED Π½Π΅ ΡΡΠΈΡΠ°ΡΡΡΡ ΠΏΡΠΎΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΡΠΎΠ².
- ΠΠ°Π²Π΅ΡΡΠΈ ΠΎΡΡΡΡΠΎΠΌ: ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΡΠΎΡΠ»ΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΏΠ°Π»ΠΈ/ΠΏΡΠΎΠΏΡΡΠ΅Π½Ρ/Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΈΡΡ ΠΈ ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅. ΠΠ΅ Π·Π°ΡΠ²Π»ΡΠΉ Π·Π΅Π»ΡΠ½ΡΠΉ CI, Π³ΠΎΡΠΎΠ²ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΊΡΡΡΡΠΉ PR Π±Π΅Π· ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°.
ΠΠΎΠ½ΡΠ΅ΠΊΡΡ: messages-dialogues-service
- ΠΡΠ΅Π΄ΠΌΠ΅ΡΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡΡ: Π΄ΠΎΠ»Π³ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ², ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈ receipts. Π£ΡΡΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΏΡΠΎΡΠΈΠ»ΠΈ, Π±Π°ΠΉΡΡ ΠΌΠ΅Π΄ΠΈΠ°, ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, presence/typing ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠ° ΠΎΠ½Π»Π°ΠΉΠ½ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ Π΄ΡΡΠ³ΠΈΠΌ Π³ΡΠ°Π½ΠΈΡΠ°ΠΌ.
- Π’Π΅ΠΊΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ β Python 3.14/FastAPI Ρ Pydantic ΠΈ uv: HTTP health, lifecycle, request ID, logging/settings. ΠΠΎΠΌΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, business use cases ΠΈ persistence Π΅ΡΡ Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ; ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Cassandra ΠΈΠ»ΠΈ Π±ΡΠΎΠΊΠ΅ΡΠ° Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ· Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠ»Π°Π½Π°.
- ΠΠ°ΡΠ½ΠΈ Ρ
README.md,src/app/entrypoints/http/main.py,core/settings.pyΠΈ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°.domain,application/services,application/ports,infrastructureβ Π³ΡΠ°Π½ΠΈΡΡ Π±ΡΠ΄ΡΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ;entrypoints/messagingΠΏΠΎΠΊΠ° ΠΊΠ°ΡΠΊΠ°Ρ. - ΠΠ±ΡΠ°Ρ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ Π΄ΠΎΠΌΠ΅Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ clock β ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ, Π° Π½Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ²ΠΎΠ΄ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½ΡΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ/ΠΏΠΎΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡ; Π½Π΅ ΠΊΠΎΠΏΠΈΡΡΠΉ ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠΎΡΠ΅Π΄Π½Π΅Π³ΠΎ bounded context.
- Π’Π΅ΡΡΡ ΡΠ΅ΠΉΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΡΡ HTTP-ΠΎΡΠ½ΠΎΠ²Ρ:
tests/unitΠΈtests/integration/test_http_bootstrap.py. ΠΠΎΠ²ΡΠ΅ ΡΠ΅ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ/Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ² ΡΠ°ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΠΉ ΠΏΠΎ domain/application/adapter; health200Π½Π΅ Π΄ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠΊΠΈ.
ΠΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ
ΠΠΎΠΌΠ°Π½Π΄Ρ Π½ΠΈΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΈΠ· ΠΊΠΎΡΠ½Ρ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°.
uv sync --frozen
uv run prek run --all-files
uv run pytest tests/unit -q -x
uv run pytest tests/integration -q -x
-
uv sync --frozenβ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ; Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Git hooks ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉuv run prek install. ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄:pyproject.toml,prek.toml,.github/workflows/ci.yml. -
prekΠ²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Ruff, ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ,ty --error-on-warningΠΈ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ΅ΡΠ΅Π΄ ΠΎΠ±ΡΠΈΠΌ ΠΏΡΠΎΠ³ΠΎΠ½ΠΎΠΌ ΠΏΡΠΎΠ²Π΅ΡΡ, ΡΡΠΎ Ρ ΡΠΊΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ Π·Π°ΡΠΈΡΡΠ½Π½ΡΠ΅ ΡΠ΅ΡΡΡ; ΠΏΡΠΈ ΡΠΈΡΠΊΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π±Π΅Π· Π°Π²ΡΠΎΠΏΡΠ°Π²ΠΎΠΊ ΠΈ ΡΠΎΠΎΠ±ΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅. -
CI Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ unit/integration Ρ branch coverage β₯ 80%, Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΡΠ΅ΠΊΡΠ΅ΡΡ ΠΈ Docker smoke. Π‘Π²Π΅ΡΡΠΉ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ workflow; Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΡΡΠΊ pytest Π½Π΅ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ CI.
-
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΠΈΠ· Andruha ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ
scripts/codex-service.pyΠΏΠΎdocs/codex-environment.mdΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ; ΠΏΡΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ checkout β ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΡΡΠ΅. Π‘ΡΠ°ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡpoetry runΠ² ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Ρ Π½Π΅ ΠΌΠ΅Π½ΡΡΡ ΡΠ΅ΠΊΡΡΠΈΠΉ Π²ΡΠ±ΠΎΡ uv. -
Π’Π΅ΠΊΡΡΠΈΠΉ integration bootstrap Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΠ/Π±ΡΠΎΠΊΠ΅ΡΠ°. ΠΠ»Ρ Π±ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π΄Π°ΠΏΡΠ΅ΡΠ° Π΄ΠΎΠ±Π°Π²Π»ΡΠΉ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ persistence.
