T7: Final validation + README update
- pytest: 67/67 pass - Manual CLI test: init, forecast, scenario, whatif, compare, info, analyze all work; Excel round-trip (export → init → import) preserves data - README.md: обновлён под новую архитектуру domain/application/infrastructure с описанием слоёв, pydantic, Decimal, Repository, DI, schema versioning и расширенным списком команд (config sub-typer с account/transaction/etc) Tests: 67/67 pass. Project: refactor complete — все 5 направлений реализованы.
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
# CashFlow Forecast
|
# CashFlow Forecast
|
||||||
|
|
||||||
Личная финансовая модель с прогнозом денежных потоков, сценарным анализом и AI-ассистентом.
|
Личная финансовая модель с прогнозом денежных потоков, сценарным анализом.
|
||||||
|
|
||||||
Python + JSON + Excel + AI.
|
Python + Pydantic + JSON + Excel.
|
||||||
|
|
||||||
## Установка
|
## Установка
|
||||||
|
|
||||||
@@ -35,12 +35,17 @@ cf whatif --income 1.2 --expense 0.9 --growth 1.0 --months 12
|
|||||||
# Сравнение всех сценариев
|
# Сравнение всех сценариев
|
||||||
cf compare --months 12
|
cf compare --months 12
|
||||||
|
|
||||||
# Импорт/экспорт Excel
|
# Сводка модели
|
||||||
cf import data.xlsx
|
cf info
|
||||||
cf export exports/report.xlsx
|
|
||||||
|
|
||||||
# AI-анализ (заглушка, генерация промпта)
|
# Редактирование модели
|
||||||
cf analyze
|
cf config account-add --name "Main" --balance 5000
|
||||||
|
cf config transaction-add --account Main --amount -1200 --category rent
|
||||||
|
cf config rate-set USD RUB 80.0
|
||||||
|
|
||||||
|
# Импорт/экспорт Excel
|
||||||
|
cf import-xlsx data.xlsx
|
||||||
|
cf export-xlsx exports/report.xlsx
|
||||||
```
|
```
|
||||||
|
|
||||||
### Пример: создание тестовых данных
|
### Пример: создание тестовых данных
|
||||||
@@ -48,43 +53,86 @@ cf analyze
|
|||||||
Подготовьте Excel-файл с листами: `Accounts`, `Transactions`, `Recurring`, `Assets`, `Liabilities`. Заголовки колонок соответствуют полям моделей. Затем импортируйте:
|
Подготовьте Excel-файл с листами: `Accounts`, `Transactions`, `Recurring`, `Assets`, `Liabilities`. Заголовки колонок соответствуют полям моделей. Затем импортируйте:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cf import my_finances.xlsx
|
cf import-xlsx my_finances.xlsx
|
||||||
cf forecast --months 12
|
cf forecast --months 12
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Архитектура
|
||||||
|
|
||||||
|
Проект разделён на три слоя по принципам Clean Architecture:
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────┐
|
||||||
|
│ domain/ — бизнес-модели │
|
||||||
|
│ Account, Transaction, Asset, Liability, │
|
||||||
|
│ Recurring, Scenario, FinancialModel, │
|
||||||
|
│ ExchangeRate, CurrencyConverter │
|
||||||
|
│ (pydantic.BaseModel, Decimal) │
|
||||||
|
└──────────────────┬──────────────────────────┘
|
||||||
|
│
|
||||||
|
┌──────────────────▼──────────────────────────┐
|
||||||
|
│ application/ — прикладные сервисы │
|
||||||
|
│ ForecastService, ScenarioService, │
|
||||||
|
│ ModelRepository (Protocol) │
|
||||||
|
└──────────────────┬──────────────────────────┘
|
||||||
|
│
|
||||||
|
┌──────────────────▼──────────────────────────┐
|
||||||
|
│ infrastructure/ — внешний мир │
|
||||||
|
│ cli/ (Typer), ai/ (Assistant), │
|
||||||
|
│ repositories/ (JsonFile, Excel) │
|
||||||
|
└─────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
## Структура проекта
|
## Структура проекта
|
||||||
|
|
||||||
```
|
```
|
||||||
├── cashflow_model/ # Модели данных (dataclass + JSON)
|
cashflow-forecast/
|
||||||
|
├── domain/ # Бизнес-модели (pydantic + Decimal)
|
||||||
│ ├── account.py # Account
|
│ ├── account.py # Account
|
||||||
│ ├── transaction.py # Transaction
|
│ ├── transaction.py # Transaction
|
||||||
│ ├── recurring.py # RecurringCashflow
|
│ ├── recurring.py # RecurringCashflow
|
||||||
│ ├── asset.py # Asset
|
│ ├── asset.py # Asset
|
||||||
│ ├── liability.py # Liability
|
│ ├── liability.py # Liability
|
||||||
│ ├── scenario.py # ForecastScenario
|
│ ├── scenario.py # ForecastScenario
|
||||||
│ └── model.py # FinancialModel (корень, save/load JSON)
|
│ ├── currency.py # ExchangeRate + CurrencyConverter
|
||||||
├── engine/ # Вычислительное ядро
|
│ └── model.py # FinancialModel (корень)
|
||||||
|
│
|
||||||
|
├── application/ # Прикладные сервисы
|
||||||
│ ├── forecast.py # ForecastService — прогноз
|
│ ├── forecast.py # ForecastService — прогноз
|
||||||
│ └── scenarios.py # ScenarioService — сценарии + what-if
|
│ ├── scenarios.py # ScenarioService — сценарии + what-if
|
||||||
├── sync/ # Синхронизация с Excel
|
│ └── repositories/
|
||||||
│ └── excel_sync.py # ExcelSync — import/export .xlsx
|
│ └── model_repository.py # ModelRepository Protocol
|
||||||
├── ai/ # AI-ассистент
|
│
|
||||||
│ ├── prompts.py # Шаблоны промптов
|
├── infrastructure/ # Адаптеры к внешнему миру
|
||||||
│ └── assistant.py # AssistantService (заглушка)
|
│ ├── cli/ # Typer CLI (cf ...)
|
||||||
├── cli/ # CLI (Typer)
|
│ │ ├── app.py # Entry point
|
||||||
│ └── main.py # Команды: cf init/forecast/scenario/...
|
│ │ ├── commands/ # 9 файлов команд + config sub-typer
|
||||||
├── tests/ # Тесты pytest
|
│ │ ├── paths.py # DATA_DIR, MODEL_PATH
|
||||||
│ ├── conftest.py # Фикстуры
|
│ │ ├── services.py # Composition root + helpers
|
||||||
|
│ │ └── i18n.py # ru/en переводы
|
||||||
|
│ ├── ai/ # AI-ассистент (заглушка)
|
||||||
|
│ │ ├── prompts.py
|
||||||
|
│ │ └── assistant.py # AssistantService
|
||||||
|
│ └── repositories/ # Реализации ModelRepository
|
||||||
|
│ ├── json_file_repository.py
|
||||||
|
│ └── excel_repository.py
|
||||||
|
│
|
||||||
|
├── tests/ # pytest, 67 тестов
|
||||||
|
│ ├── conftest.py
|
||||||
│ ├── test_model.py
|
│ ├── test_model.py
|
||||||
│ ├── test_forecast.py
|
│ ├── test_forecast.py
|
||||||
│ ├── test_scenarios.py
|
│ ├── test_scenarios.py
|
||||||
│ ├── test_excel_sync.py
|
│ ├── test_currency.py
|
||||||
│ ├── test_ai.py
|
│ ├── test_ai.py
|
||||||
│ └── test_cli.py
|
│ ├── test_cli.py
|
||||||
├── data/ # JSON-модели
|
│ ├── test_excel_sync.py # Тесты ExcelRepository
|
||||||
|
│ ├── test_i18n.py
|
||||||
|
│ └── test_repositories.py # Тесты репозиториев
|
||||||
|
│
|
||||||
|
├── data/ # JSON-модели (runtime, версионируется SCHEMA_VERSION=1)
|
||||||
├── exports/ # Экспортированные .xlsx
|
├── exports/ # Экспортированные .xlsx
|
||||||
├── .agent/ # Артефакты MetaAgent (планирование)
|
├── .agent/ # Артефакты MetaAgent v3.0
|
||||||
├── pyproject.toml # Зависимости и конфигурация
|
├── pyproject.toml # Зависимости + entry point `cf`
|
||||||
└── README.arch.md # Оригинальная архитектурная концепция
|
└── README.arch.md # Оригинальная архитектурная концепция
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -94,7 +142,7 @@ cf forecast --months 12
|
|||||||
# Тесты
|
# Тесты
|
||||||
pytest
|
pytest
|
||||||
|
|
||||||
# Линтер
|
# Линтер (если доступен ruff)
|
||||||
ruff check .
|
ruff check .
|
||||||
|
|
||||||
# Автоформат
|
# Автоформат
|
||||||
@@ -107,12 +155,24 @@ ruff format .
|
|||||||
- openpyxl — работа с Excel
|
- openpyxl — работа с Excel
|
||||||
- typer — CLI
|
- typer — CLI
|
||||||
- rich — форматирование вывода
|
- rich — форматирование вывода
|
||||||
|
- pydantic >= 2.0 — валидация моделей
|
||||||
- pytest — тесты
|
- pytest — тесты
|
||||||
- ruff — линтер
|
- ruff — линтер (опционально)
|
||||||
|
|
||||||
|
## Архитектурные решения
|
||||||
|
|
||||||
|
- **Слои**: `domain/` (модели), `application/` (сервисы), `infrastructure/` (адаптеры).
|
||||||
|
- **Pydantic v2**: все модели — `pydantic.BaseModel` с валидацией (balance >= 0, amount != 0, и т.п.).
|
||||||
|
- **Decimal**: все денежные поля — `Decimal`, арифметика без потери точности.
|
||||||
|
- **Repository pattern**: `ModelRepository` Protocol, реализации `JsonFileRepository` и `ExcelRepository`.
|
||||||
|
- **DI**: Composition root в `infrastructure/cli/services.py:build_services()`.
|
||||||
|
- **Schema versioning**: `FinancialModel.to_dict()` пишет `version: 1`; `from_dict()` поддерживает legacy v0.
|
||||||
|
- **i18n**: `infrastructure/cli/i18n.py`, ru (default) + en (fallback).
|
||||||
|
|
||||||
## Известные ограничения (MVP)
|
## Известные ограничения (MVP)
|
||||||
|
|
||||||
- **AI-ассистент** — заглушка. Промпты готовы, но не подключены к API.
|
- **AI-ассистент** — заглушка (`ai_response: None`). Промпты готовы, но не подключены к API.
|
||||||
- **База данных** — JSON-файлы (не подходит для многопользовательской работы).
|
- **Хранилище** — JSON-файлы (не подходит для многопользовательской работы).
|
||||||
- **Excel** — только `.xlsx` через openpyxl.
|
- **Excel** — только `.xlsx` через openpyxl.
|
||||||
- **Лицензия** — не выбрана.
|
- **Лицензия** — не выбрана.
|
||||||
|
- **CI/CD** — не настроен.
|
||||||
|
|||||||
Reference in New Issue
Block a user