1. Фіксаємо назви файлів, рефакторинг та оптимізація під Python, підключаємо Ruff та uv
Урок показує комплексний рефакторинг навчального Playwright-проєкту: виправлення назв Python-файлів, аналіз структури й імпортів, підключення `Ruff`, міграцію з `pip`/`venv` на `uv` і створення `README`. Основний принцип — не переписувати legacy-проєкт одним великим кроком: починати з несправних або малих тестів, перевіряти кожну зміну й використовувати AI лише як прискорювач аналізу, а не як джерело істини.
Примітка: конспект укладено за автоматичними українськими субтитрами; назви інструментів і Python API нормалізовано за контекстом відео.
Після цього уроку ви зможете
Спланувати поступову міграцію legacy-тестів без одночасного переписування всього набору.
Перевірити перейменування Python-модулів разом з імпортами та Git-історією.
Налаштувати Ruff і перенести керування Python-проєктом на uv.
Повне одночасне переписування Selenium-проєкту на Playwright створює надто великий ризик. Практичний порядок інший: спочатку переносити тести, які вже падають або є flaky, потім — короткі ізольовані сценарії, а далі рухатися функціональними зрізами.
Старі й нові інструменти можуть тимчасово співіснувати в одному репозиторії. Окремі pytest suites і CI-команди дозволяють запускати Selenium та Playwright незалежно, тому міграцію можна виконувати без зупинки розвитку наявного набору тестів.
Практика
Малий vertical slice рефакторингу
Оберіть один несправний або короткий тест.
Перейменуйте лише його модулі за PEP 8 та оновіть імпорти.
Запустіть Ruff і один цільовий тест, потім перегляньте diff.
Результат: Один тест проходить, Ruff не знаходить нових помилок, diff не містить сторонніх змін.
Початкова проблема — файли названо з великої літери, хоча Python-конвенція вимагає snake_case і нижнього регістру для модулів. Просте ручне перейменування не гарантує, що динамічні імпорти та всі usages буде знайдено, тому спочатку потрібен аналіз повного графа використання.
AI-агент отримує вузьку технічну задачу: знайти невідповідні PEP 8 назви, скласти план і виконати перейменування разом з оновленням імпортів. Для збереження Git-історії файлів використовується git mv. Після окремої завершеної задачі варто починати нову AI-сесію, щоб старий контекст не впливав на наступний етап.
Термін
PEP 8 module naming
Python-модулі повинні мати короткі назви в нижньому регістрі; underscore доречний, якщо покращує читабельність.
Prompt має описувати конкретні ознаки, які треба знайти: змішані absolute/relative imports, відсутні type hints, невикористаний код, naming conventions, кеші Python. Рольова фраза на кшталт «працюй як інженер із десятьма роками досвіду» не замінює технічних критеріїв.
Згенерований план обов’язково перечитується. У прикладі корисними знахідками є відсутній тип Page, зайві імпорти, непослідовні приватні поля та незаігнорований __pycache__, але частина запропонованих змін є спірною або зайвою. Спочатку важливо отримати корисний робочий тест; узгодженість структури виправляється окремим контрольованим рефакторингом.
Увага
AI-рефакторинг потребує ручного review
Перевіряйте кожен змінений файл і запускайте найменший релевантний тест: у відео автоматична зміна також видалила файли й оголила помилку fixture.
Для великої міграції план доцільно зберегти в окремому Markdown-файлі й виконувати по одному пункту в нових сесіях. Це зменшує ризик, що модель втратить початкові обмеження у довгому контексті або спробує змінити забагато файлів за один раз.
Стабільні правила проєкту — структура, команди, naming, бібліотеки та перевірки — корисно тримати у спільному інструкційному файлі на кшталт AGENTS.md. Тимчасовий migration plan можна не комітити, якщо він потрібен лише для локальної роботи.
Після автоматичного рефакторингу переглядається кожен змінений файл. Демонстрація виявляє як нормальні зміни — типи, constants, імпорти — так і небажане видалення файлів та помилку у fixture, яка створила некоректний стан сторінки.
AI-агент запускає найменший тест, але сам факт запуску не доводить коректність усієї зміни: треба прочитати failure, перевірити fixture lifecycle і повторити сценарій. Результат оформлюється в окремій гілці та коміті, а не змішується з наступною міграцією інструментів.
IDE inspections залежать від локальних налаштувань кожного інженера. Ruff переносить правила у репозиторій: перевіряє naming, невикористані імпорти, частину потенційних помилок і може форматувати код значно швидше за традиційний набір Python-інструментів.
У PyCharm вмикається інтеграція Ruff, а в Actions on Save — reformat та optimize imports. Налаштування зберігаються в ruff.toml або секції pyproject.toml; версія Python у конфігурації має відповідати реальному runtime проєкту.
Що змінилося після запису
Ruff naming rules треба вибирати явно
У відеоУ відео Ruff описано як спільний інструмент перевірки naming і Python style.
АктуальноRuff configuration керує rule selection через lint.select/extend-select; target-version означає мінімальну підтримувану версію Python, а не обов’язково поточний interpreter.
Перевірено 2026-07-31
Термін
Ruff configuration
Ruff читає налаштування з pyproject.toml, ruff.toml або .ruff.toml; правила lint і format зберігаються разом із проєктом.
Замість ручної послідовності створення venv, активації та pip install -r requirements.txt проєкт переходить на uv sync. Залежності й метадані описуються у pyproject.toml, а uv.lock фіксує точні версії, включно з транзитивними залежностями.
Для застосунку або тестового проєкту lock-файл варто комітити: це відтворює однаковий dependency graph локально та в CI й зменшує ризик конфліктів, коли різні бібліотеки вимагають несумісні версії спільної залежності.
Що змінилося після запису
`uv.lock` слід комітити
У відеоУ відео згадано суперечливі рекомендації щодо commit lock-файлів, після чого автор схиляється до commit uv.lock.
АктуальноПоточна документація uv прямо вказує, що uv.lock слід зберігати у version control для узгоджених і відтворюваних установок.
Перевірено 2026-07-31
Термін
uv.lock
uv.lock фіксує точні розв’язані версії для різних Python markers і призначений для version control та відтворюваних установок.
Після міграції тест запускається через команду uv run ... з консолі, бо це ближче до майбутнього CI-запуску, ніж Run Configuration IDE. Треба перевірити, що виконався потрібний тест і що очікуване падіння справді належить тестовій логіці, а не відсутній залежності чи неправильному шляху.
Фінальний крок — створити короткий README з мінімальною версією Python, установкою, командами запуску, структурою та правилами внесення змін. Commit message перевіряється вручну: він має називати реальну міграцію на uv і підключення Ruff, а не перелічувати випадкові деталі diff.