|
| 1 | +## Учебный проект: Python 3.12 — дорожная карта задач с тестами |
| 2 | + |
| 3 | +Этот репозиторий — набор практических задач, закрывающих базовые и прикладные навыки Python. Каждая задача размещена в отдельном модуле в `src/tasks/` и снабжена тестами в `tests/`. Запускайте тесты, реализуйте функции, добивайтесь зелёного статуса и покрывайте ключевую логику типами. |
| 4 | + |
| 5 | +### Как начать |
| 6 | + |
| 7 | +#### 1. Настройка окружения |
| 8 | +```bash |
| 9 | +# Создание виртуального окружения |
| 10 | +python -m venv .venv |
| 11 | + |
| 12 | +# Активация окружения (Linux/Mac) |
| 13 | +source .venv/bin/activate |
| 14 | + |
| 15 | +# Активация окружения (Windows) |
| 16 | +.venv\Scripts\activate |
| 17 | + |
| 18 | +# Установка зависимостей |
| 19 | +pip install -e .[dev] |
| 20 | +``` |
| 21 | + |
| 22 | +#### 2. Запуск тестов |
| 23 | +```bash |
| 24 | +# Запуск всех тестов |
| 25 | +pytest -q |
| 26 | + |
| 27 | +# Запуск тестов для конкретного уровня |
| 28 | +pytest tests/l1/ -v |
| 29 | +pytest tests/l2/ -v |
| 30 | +pytest tests/l3/ -v |
| 31 | + |
| 32 | +# Запуск тестов с покрытием |
| 33 | +pytest --cov=src --cov-report=html |
| 34 | +``` |
| 35 | + |
| 36 | +#### 3. Структура проекта |
| 37 | +``` |
| 38 | +src/tasks/ |
| 39 | +├── l1/ # Базовый уровень (7 задач) |
| 40 | +├── l2/ # Средний уровень (10 задач) |
| 41 | +└── l3/ # Продвинутый уровень (17 задач) |
| 42 | +
|
| 43 | +tests/ |
| 44 | +├── l1/ # Тесты для L1 |
| 45 | +├── l2/ # Тесты для L2 |
| 46 | +└── l3/ # Тесты для L3 |
| 47 | +``` |
| 48 | + |
| 49 | +### Цели и навыки |
| 50 | +- Язык и стандартная библиотека: структуры данных, итераторы, исключения, файлы/пути, datetime, regex, ООП, typing/mypy. |
| 51 | +- Инструменты разработчика: формат и линт, тестирование, покрытие, логирование, CLI. |
| 52 | +- Прикладные основы: HTTP-клиент, парсинг HTML, кеширование, SQLite, Pydantic. |
| 53 | +- Асинхронность и конкурентность: asyncio, rate-limiter, планировщики. |
| 54 | +- Контейнеризация (минимум): Dockerfile (задачи класса C — опционально). |
| 55 | + |
| 56 | +### Структура |
| 57 | +``` |
| 58 | +. |
| 59 | +├── src/tasks/ # задачи (каждая — модуль) |
| 60 | +│ ├── l1/ # уровень L1 (база) — 7 задач |
| 61 | +│ ├── l2/ # уровень L2 (средний) — 10 задач |
| 62 | +│ └── l3/ # уровень L3 (продвинутый) — 17 задач |
| 63 | +├── tests/ # тесты к задачам |
| 64 | +│ ├── l1/ # тесты для L1 |
| 65 | +│ ├── l2/ # тесты для L2 |
| 66 | +│ └── l3/ # тесты для L3 |
| 67 | +├── pyproject.toml # конфиги инструментов |
| 68 | +└── README.md |
| 69 | +``` |
| 70 | + |
| 71 | +### Полный индекс задач (1–40) |
| 72 | +1. task01_fizzbuzz — FizzBuzz без if-лестницы. |
| 73 | +2. task02_csv_normalization — Нормализация CSV с локальными числами в JSON. |
| 74 | +3. task03_word_freq — Частоты слов (unicode, топ-10). |
| 75 | +4. task04_merge_dicts — Слияние словарей с on_conflict. |
| 76 | +5. task05_lru_cache — LRU-кэш O(1). |
| 77 | +6. task06_log_parser — Парсер логов regex + группировка. |
| 78 | +7. task07_password_validator — Валидатор паролей (regex). |
| 79 | +8. task08_find_duplicates — Поиск дубликатов файлов по хешу. |
| 80 | +9. task09_timezone_convert — Конвертация расписания (zoneinfo). |
| 81 | +10. task10_retry_decorator — Декоратор retry с backoff. |
| 82 | +11. task11_pipeline_iterators — Мини-pipeline на генераторах. |
| 83 | +12. task12_config_dataclass — Конфиг на dataclass(slots,frozen). |
| 84 | +13. task13_fetch_json — HTTP-клиент с таймаутом/ретраями. |
| 85 | +14. task14_html_parser — H1..H3 и внутренние ссылки. |
| 86 | +15. task15_file_cache — Файловый кеш TTL. |
| 87 | +16. task16_sqlite_crud — SQLite CRUD без ORM. |
| 88 | +17. task17_pydantic_schemas — NoteIn/NoteOut: строгие типы, валидация тегов/длины. |
| 89 | +18. task18_rate_limiter — In-memory RPS на IP/ключ. |
| 90 | +19. task19_pagination_utils — limit/offset, сортировка. |
| 91 | +20. task20_uploader_limits — Проверка размера/мим-типа. |
| 92 | +21. task21_http_cache — Кеширование HTTP-ответов (ключ URL+параметры, TTL). |
| 93 | +22. task22_sqlalchemy_model — SQLAlchemy модель Note и пагинация. |
| 94 | +23. task23_fastapi_notes — Мини-API /notes с TestClient. |
| 95 | +24. task24_api_key_auth — X-API-Key зависимость, 401/403. |
| 96 | +25. task25_rate_limit_fastapi — Простой rate-limit middleware. |
| 97 | +26. task26_pagination_params — Валидация limit/offset. |
| 98 | +27. task27_file_upload_endpoint — POST /upload с лимитами. |
| 99 | +28. task28_token_cli — CLI выпуска API-ключей (uuid4+HMAC). |
| 100 | +29. task29_async_gatherer — Асинхронный сбор URL с Semaphore/таймаутами. |
| 101 | +30. task30_async_token_bucket — Асинхронный rate-limiter (token bucket). |
| 102 | +31. task31_thread_vs_process — Сравнение пулов CPU/I-O. |
| 103 | +32. task32_async_scheduler — Планировщик задач без наложений. |
| 104 | +33. task33_logging_config — dictConfig + ротация файлов. |
| 105 | +34. task34_cli_argparse — Подкоманды scan/report/fix. |
| 106 | +35. task35_precommit_tooling — Настройка pre-commit (black, ruff, isort). |
| 107 | +36. task36_mypy_strict — Довести мини-пакет до mypy --strict. |
| 108 | +37. task37_dockerfile_fastapi — Dockerfile (builder+runtime, non-root, healthcheck). |
| 109 | +38. task38_docker_compose — API + SQLite volume, .env. |
| 110 | +39. task39_env_settings — Pydantic Settings: обязательные/дефолты. |
| 111 | +40. task40_build_dist — Сборка wheel/sdist и консольная точка входа. |
| 112 | + |
| 113 | +На каждую задачу заведён модуль-скелет с `NotImplementedError` и тесты, которые изначально падают. |
| 114 | + |
| 115 | +### Уровни сложности и капстоуны |
| 116 | + |
| 117 | +**L1 — Базовый уровень (7 задач):** |
| 118 | +- `task01_fizzbuzz`, `task02_csv_normalization`, `task03_word_freq`, `task04_merge_dicts` |
| 119 | +- `task07_password_validator`, `task11_pipeline_iterators`, `task12_config_dataclass` |
| 120 | +- **Цель**: Освоить базовый синтаксис Python, структуры данных, типизацию |
| 121 | + |
| 122 | +**L2 — Средний уровень (10 задач):** |
| 123 | +- `task05_lru_cache`, `task06_log_parser`, `task08_find_duplicates`, `task09_timezone_convert` |
| 124 | +- `task10_retry_decorator`, `task14_html_parser`, `task15_file_cache`, `task16_sqlite_crud` |
| 125 | +- `task19_pagination_utils`, `task21_http_cache` |
| 126 | +- **Цель**: Алгоритмы, работа с файлами, базы данных, кеширование |
| 127 | + |
| 128 | +**L3 — Продвинутый уровень (17 задач):** |
| 129 | +- **HTTP и API**: `task13_fetch_json`, `task17_pydantic_schemas`, `task18_rate_limiter`, `task20_uploader_limits` |
| 130 | +- **FastAPI и веб-разработка**: `task22_sqlalchemy_model`, `task23_fastapi_notes`, `task24_api_key_auth` |
| 131 | +- **Middleware и валидация**: `task25_rate_limit_fastapi`, `task26_pagination_params`, `task27_file_upload_endpoint` |
| 132 | +- **CLI и утилиты**: `task28_token_cli` |
| 133 | +- **Асинхронность**: `task29_async_gatherer`, `task30_async_token_bucket`, `task31_thread_vs_process`, `task32_async_scheduler` |
| 134 | +- **Контейнеризация**: `task37_dockerfile_fastapi`, `task38_docker_compose` |
| 135 | +- **Цель**: Создание полноценных веб-приложений, асинхронное программирование, DevOps |
| 136 | + |
| 137 | +**Капстоуны (на выбор 1–2, после прохождения всех уровней):** |
| 138 | +- **REST Notes API на FastAPI**: CRUD, валидация, пагинация, auth по ключу |
| 139 | +- **Телеграм-бот «Хабит-трекер»**: напоминания, простое хранилище, рейт-лимитер |
| 140 | +- **Асинхронный сборщик URL**: gather+Semaphore, таймауты, отмена, отчёт |
| 141 | +- **CLI filesync двух директорий**: dry-run, exclude, отчёты |
| 142 | + |
| 143 | +### Правила приёмки |
| 144 | +- Все тесты для выбранной задачи зелёные. |
| 145 | +- Покрытие ключевой логики по проекту ≥ 85% (`pytest --cov`). |
| 146 | +- `mypy --strict` без ошибок и без `type: ignore`. |
| 147 | +- Код проходит формат и линт: `black`, `ruff`, `isort`. |
| 148 | + |
| 149 | +### Скрытые проверки |
| 150 | +В частном CI присутствуют дополнительные тесты на устойчивость и античит (например, проверка идемпотентности, корректности работы исключений путей, граничных состояний времени/таймаутов). Их описание доступно только наставникам. |
| 151 | + |
| 152 | + |
0 commit comments