Finance Tracker - это десктопное приложение для управления личными финансами, построенное на Flet framework.
- Учет доходов и расходов
- Управление категориями транзакций
- Управление кредитами и займами
- Плановые транзакции с повторениями
- Отложенные платежи
- План-факт анализ
- Прогноз баланса
- Календарь транзакций
- Snapshot экспорт и restore-only импорт данных
- Облачная синхронизация (расширенный функционал через Git submodule)
- Python >= 3.13
Базовая версия (без расширенного функционала синхронизации):
git clone https://github.com/BarykinME/finance-tracker-flet.git
cd finance-tracker-fletПолная версия (с расширенным функционалом синхронизации):
git clone --recurse-submodules https://github.com/BarykinME/finance-tracker-flet.git
cd finance-tracker-fletЕсли вы уже клонировали проект без submodules, можете добавить их позже:
git submodule init
git submodule updatepip install -e .pip install -e ".[dev]"Приложение можно запустить несколькими способами:
python -m finance_trackerpython main.pyПосле установки пакета доступна команда:
finance-trackerВсе пользовательские данные (база данных, логи, настройки, экспорты) хранятся в отдельной директории:
.finance_tracker_data/
├── finance.db # База данных SQLite
├── config.json # Настройки пользователя
├── logs/ # Логи приложения
│ └── finance_tracker.log
└── exports/ # Snapshot-экспорты
Это позволяет:
- Легко найти и удалить пользовательские данные
- Не замусоривать корень проекта
- Сохранять данные при обновлении приложения
- Работать одинаково в режиме разработки и .exe
Важно: Начиная с версии декабря 2024, приложение использует UUID вместо Integer ID для всех записей в базе данных.
Что это означает:
- Все идентификаторы (ID) теперь имеют формат UUID (например,
550e8400-e29b-41d4-a716-446655440000) - Обеспечена глобальная уникальность идентификаторов для будущей синхронизации между устройствами
- Все таблицы теперь имеют колонку
updated_atдля отслеживания изменений
Автоматическая миграция:
- При первом запуске новой версии приложение автоматически обнаружит старую схему БД (Integer ID)
- Старая база данных будет удалена, и создана новая с UUID схемой
- Рекомендация: Сделайте резервную копию файла
.finance_tracker_data/finance.dbперед обновлением
Для разработчиков:
- Все сервисы теперь принимают
str(UUID) вместоintдля параметров ID - Pydantic модели автоматически валидируют формат UUID
- Утилита
validate_uuid_format()доступна вutils/validation.py - Подробная документация миграции:
.kiro/specs/uuid-migration/
Проект использует комплексную стратегию тестирования с pytest, включающую unit-тесты, property-based тесты (Hypothesis), UI-тесты и интеграционные тесты.
Unit тесты - изолированное тестирование отдельных компонентов:
- Сервисы (
test_*_service.py) - UI компоненты (
test_*_view.py,test_*_modal.py) - Утилиты и вспомогательные функции
Property-based тесты - проверка универсальных свойств на случайных данных:
- Инварианты бизнес-логики (
test_*_properties.py) - Корректность алгоритмов
- Обработка граничных случаев
UI тесты - тестирование пользовательского интерфейса:
- Инициализация View компонентов
- Взаимодействие с кнопками и формами
- Открытие модальных окон
- Валидация пользовательского ввода
Интеграционные тесты - проверка взаимодействия компонентов:
- Полные пользовательские сценарии
- Взаимодействие View ↔ Service ↔ Database
- End-to-end тестирование функций
Запуск всех тестов:
pytest tests/Запуск с покрытием кода:
pytest tests/ --cov=src/finance_tracker --cov-report=htmlПросмотр отчета о покрытии:
# Откройте htmlcov/index.html в браузереВсе unit тесты:
pytest tests/test_*_service.py tests/test_*_view.py tests/test_*_modal.pyТесты сервисов (бизнес-логика):
pytest tests/test_*_service.pyТесты UI компонентов:
pytest tests/test_*_view.py tests/test_*_modal.pyКонкретный компонент:
pytest tests/test_home_view.py
pytest tests/test_transaction_modal.py
pytest tests/test_transaction_service.pyВсе property-based тесты:
pytest tests/test_*_properties.pyПо доменам:
pytest tests/test_transaction_properties.py # Транзакции
pytest tests/test_loan_properties.py # Кредиты
pytest tests/test_category_properties.py # Категории
pytest tests/test_balance_forecast_properties.py # Прогноз балансаВсе UI тесты (View + Modal):
pytest tests/test_*_view.py tests/test_*_modal.pyТесты View компонентов:
pytest tests/test_*_view.pyТесты модальных окон:
pytest tests/test_*_modal.pyТесты конкретного UI компонента:
pytest tests/test_home_view.py # Главный экран
pytest tests/test_categories_view.py # Управление категориями
pytest tests/test_loans_view.py # Список кредитов
pytest tests/test_transaction_modal.py # Модальное окно транзакцииВсе интеграционные тесты:
pytest tests/test_integration*.pyКонкретные интеграции:
pytest tests/test_integration.py # Основные интеграции
pytest tests/test_loan_payment_integration.py # Интеграция платежей по кредитам
pytest tests/test_integration_regression.py # Регрессионные тестыПолитика качества: новые сервисы и модули должны сопровождаться тестами; в CI включен минимальный порог покрытия 66%.
Полное покрытие:
pytest tests/ --cov=src/finance_tracker --cov-report=html --cov-report=termПокрытие по компонентам:
# Только View компоненты
pytest tests/test_*_view.py --cov=src/finance_tracker/views --cov-report=html
# Только сервисы
pytest tests/test_*_service.py --cov=src/finance_tracker/services --cov-report=html
# Только модальные окна
pytest tests/test_*_modal.py --cov=src/finance_tracker/components --cov-report=htmlМинимальный порог покрытия:
pytest tests/ --cov=src/finance_tracker --cov-fail-under=66Полный набор тестов для кнопки добавления транзакции:
pytest tests/ -k "add_transaction_button or transaction_modal"Unit тесты кнопки:
pytest tests/test_home_view.py -k "add_transaction"
pytest tests/test_transactions_panel.py -k "add_button"Property-based тесты кнопки:
pytest tests/test_*_properties.py -k "button or modal"Тесты устойчивости к ошибкам:
pytest tests/ -k "error or exception or robustness"Тесты производительности:
pytest tests/test_performance_properties.pyПроверка качества кода:
ruff check src testsАвтоисправление поддерживаемых замечаний:
ruff check src tests --fixПодробный вывод:
pytest tests/ -vОстановка на первой ошибке:
pytest tests/ -xЗапуск конкретного теста:
pytest tests/test_home_view.py::TestHomeView::test_initializationФильтрация по имени теста:
pytest tests/ -k "test_load_data"
pytest tests/ -k "property and transaction"
pytest tests/ -k "not slow" # Исключить медленные тестыПараллельный запуск (требует pytest-xdist):
pytest tests/ -n auto # Автоматическое определение количества процессов
pytest tests/ -n 4 # 4 параллельных процессаПовторный запуск упавших тестов:
pytest tests/ --lf # Только последние упавшие тесты
pytest tests/ --ff # Сначала упавшие, потом остальныеЗапуск с отладчиком:
pytest tests/test_home_view.py --pdbВывод print statements:
pytest tests/ -sПодробная информация о фикстурах:
pytest tests/ --fixturesКоманды для непрерывной интеграции:
Быстрая проверка (smoke tests):
pytest tests/test_*_view.py -x --tb=shortПолная проверка с покрытием:
pytest tests/ --cov=src/finance_tracker --cov-report=xml --cov-fail-under=80 --tb=shortТолько критические тесты:
pytest tests/ -m "not slow" --tb=shortДля добавления новых тестов в проект следуйте этим шагам:
-
Определите тип теста:
test_*_service.py- для тестирования бизнес-логикиtest_*_view.py- для тестирования UI компонентовtest_*_properties.py- для property-based тестовtest_integration*.py- для интеграционных тестов
-
Используйте существующие паттерны:
# Изучите похожие тесты ls tests/test_*_view.py # Скопируйте структуру существующего теста cp tests/test_home_view.py tests/test_new_view.py
-
Проверьте новый тест:
# Запустите изолированно pytest tests/test_new_file.py -v # Проверьте покрытие pytest tests/test_new_file.py --cov=src/finance_tracker/your_module
Подробное руководство: См. .kiro/steering/ui-testing.md → "Adding New Tests to the System"
Проект поддерживает работу с мобильными данными через два уровня функциональности:
ExportService и ImportService реализованы и доступны как публичный API:
from finance_tracker.mobile import ExportService, ImportService
# Экспорт snapshot в JSON (по умолчанию в .finance_tracker_data/exports/)
snapshot_path = ExportService.export_to_file()
# Restore-only импорт: только в пустую пользовательскую БД
# (системные baseline-категории разрешены)
report = ImportService.import_from_file("backup_2024_12_07.json")Ограничение импорта: это restore-only сценарий, импорт разрешен только для пустой пользовательской БД (наличие системных baseline-категорий допустимо).
Fallback-рекомендация для ручного бэкапа остается прежней: копируйте файл
SQLite БД .finance_tracker_data/finance.db (тот же путь, что и settings.db_path).
Облачная синхронизация и real-time обмен данными доступны при установке приватного submodule:
from finance_tracker.mobile import CloudSyncService, RealtimeSyncService, PROPRIETARY_AVAILABLE
if PROPRIETARY_AVAILABLE:
# Облачная синхронизация доступна
sync = CloudSyncService()
sync.sync_to_cloud()
else:
print("Cloud sync недоступен без приватного submodule")Для получения доступа к расширенному функционалу:
- Клонируйте проект с submodules (см. раздел "Установка")
- Или добавьте submodule вручную:
git submodule add https://github.com/BarykinME/finance-tracker-sync-proprietary.git src/finance_tracker/mobile/sync_proprietary
git submodule update --init --recursiveОбновление расширенного функционала:
git submodule update --remote src/finance_tracker/mobile/sync_proprietaryfinance-tracker-flet/
├── src/
│ └── finance_tracker/ # Основной пакет приложения
│ ├── __init__.py
│ ├── __main__.py # Точка входа (python -m finance_tracker)
│ ├── app.py # Главная логика приложения
│ ├── config.py # Конфигурация
│ ├── database.py # Управление БД
│ ├── components/ # UI компоненты (модальные окна, виджеты)
│ │ ├── calendar_legend.py
│ │ ├── calendar_widget.py
│ │ ├── transaction_modal.py
│ │ └── ...
│ ├── models/ # Модели данных (SQLAlchemy)
│ │ ├── enums.py
│ │ └── models.py
│ ├── services/ # Бизнес-логика
│ │ ├── transaction_service.py
│ │ ├── loan_service.py
│ │ └── ...
│ ├── utils/ # Утилиты
│ │ ├── logger.py
│ │ ├── error_handler.py
│ │ └── ...
│ ├── views/ # UI представления (экраны)
│ │ ├── main_window.py
│ │ ├── home_view.py
│ │ └── ...
│ └── mobile/ # Мобильный функционал
│ ├── __init__.py
│ ├── export_service.py # Snapshot экспорт
│ ├── import_service.py # Restore-only импорт
│ └── sync_proprietary/ # Git submodule (приватный)
│ ├── cloud_sync.py
│ └── realtime_sync.py
├── tests/ # Тесты (unit + property-based)
│ ├── conftest.py
│ ├── test_transaction_properties.py
│ ├── test_home_view.py
│ └── ...
├── assets/ # Статические ресурсы
│ ├── icon.ico
│ ├── icon.png
│ └── prompts/
├── .kiro/ # Спецификации Kiro
│ └── specs/
├── .gitmodules # Конфигурация Git submodules
├── main.py # Launcher для разработки
├── pyproject.toml # Конфигурация проекта
├── finance_tracker.spec # Конфигурация PyInstaller
├── .gitignore # Git ignore правила
├── LICENSE # AGPL-3.0 лицензия
└── README.md # Документация
Для создания standalone исполняемого файла используется PyInstaller:
pip install pyinstallerpyinstaller finance_tracker.specГотовый .exe файл будет находиться в директории dist/finance_tracker.exe
- Все пользовательские данные сохраняются в
.finance_tracker_data/рядом с .exe (портативность) - Assets (иконки, изображения) упаковываются в .exe
- Размер файла: ~50-70 MB (включая Python runtime и все зависимости)
- Не требует установленного Python на целевой системе
После сборки рекомендуется протестировать .exe на чистой системе:
- Скопируйте
dist/finance_tracker.exeна другой компьютер - Запустите приложение
- Проверьте создание
.finance_tracker_data/рядом с .exe - Проверьте основные функции (создание транзакций, кредитов, навигация)
Этот проект распространяется под лицензией GNU Affero General Public License v3.0 (AGPL-3.0).
- ✅ Свободное использование: Вы можете свободно использовать, изучать и модифицировать код
- ✅ Открытый исходный код: Все модификации должны оставаться открытыми
- ✅ Network Copyleft: Даже при использовании через сеть (SaaS) исходный код должен быть доступен
⚠️ Обязательное раскрытие: Любые производные работы должны распространяться под той же лицензией⚠️ Сохранение авторства: Необходимо сохранять копирайты и указывать авторство
AGPL-3.0 выбрана для обеспечения того, чтобы:
- Код всегда оставался открытым и доступным сообществу
- Любые улучшения возвращались в проект
- Даже облачные сервисы на базе этого кода делились исходниками
Расширенный функционал синхронизации (sync_proprietary/) находится в отдельном приватном репозитории и не распространяется под AGPL-3.0. Публичный API snapshot экспорта/импорта доступен в основном репозитории.
Полный текст лицензии доступен в файле LICENSE или на gnu.org
Copyright © 2024 BarykinME