Публичный репозиторий. Сторонние модули из pypi
Git: публичный репозиотрий
Цикл разработки:
Создание или выбор удалёного репозитория и clone
- Синхронизация (pull) = fetch + merge
- Стандартный цикл разработки (следующие три пункта могут повторяться по кругу):
- Изменение
- Оформление коммита (add и т. п.)
- Коммит (commit)
- Публикация (push)
Ответственная публикация и переписывание локальной истории
- Правила оформления коммитов
- Одно изменение = один коммит
«Изменение» — это решение какой-то одной задачи (багфикс, новая фича, редизайн и т. п.)
- Если задача слишком большая, её следует разбить на подзадачи в отдельных коммитах
- (если ещё больше или одновременно с другими задачами — работа с отдельными ветками, об это позже)
- Коммит не ломает уже имеющихся свойств (например, приложение продолжает работать не хуже, чем раньше)
- Если для восстановления свойств требуется последовательность коммитов, стоит использовать ветки
- Формат коммит-сообщения:
Какая задача решена (одна строка) Более подробное описание проделанной работы в нескольких строках (дисциплина оформления бывает разная)
- Одно изменение = один коммит
Правила публикации:
Можно переписывать историю в диапазоне между HEAD и origin (т. е. всё, что не опубликовано)
- Перед публикацией стоит убедиться, что и файлы, и сообщения соответствуют принятой дисциплине (даже если изменить только текст коммит сообщения, это будет новый коммит)
Исправить последний коммит можно с помощью git commit --amend, при этом время коммита сохранится, а его ID и всё, что вы исправили, поменяется
Более общий метод — git rebase -i начиная_с_какого_коммита (например, git rebase -i HEAD^` — это исправление трёх последних коммитов)
⇒ проблема «удалённого init»
Pip
TODO пока тут только план
- структура дистрибутива python
- pypi
- куда ставить сторонние модули? (туда же, /usr/local, пользователю в $HOME)
как ставить: pip install
- Зависимости
- Невозможность полного удаления дерева зависимостей)
- Модули на Си и др. языках?
- относительная ненадёжность бинарных компонентов
- ⇒ мода на pure python реализации
локальная установка модулей в ~/.local/lib/python№
бонус:~/.local/bin
Работа с venv
- Проблемы системной и локальной пользовательской установок
- Зоопарк
- Определение актуальных для проекта зависимостей
- Разноверсица
Невозможность удаления ненужных модулей по отсутствию зависимостей
модуль venv
создание и activate
- …
- Структура каталогов
Никакой «виртуализации». Достаточно запускать python или pip из некоторого отдельного подкаталога, чтобы он не заметил системных модулей. А для этого достаточно поставить этот подкаталог первым в $PATH.
(надо постараться впихнуть) Пакеты
- Модуль vs. пакет
__init__.py
- Подпакеты
__main__.py
Д/З
Написать пакет figdate, который предоставляет всего одну функцию — date(формат, шрифт). Функция возвращает строку — текущую дату в виде pyfiglet
Формат совпадает с форматом time.strftime() (является им ☺), по умолчанию — "%Y %d %b, %A"
Шрифт — строка, обозначающая шрифт в модуле pyfiglet, по умолчанию — "graceful" (в нём есть кириллица)
Пакет также должен поддерживать запуск вида python3 -m figdate без параметров, с одним параметром (форматом) или двумя (форматом и шрифтом), вызывать функцию с этими параметрами и выводить результат
В этом случае следует выставлять русскую локаль
Пакет пишется в расчёте на то, что figdate будет доступен
Написать программу-обвязку figdate_wrapper.py, которая:
Создаёт чистое venv-окружение во временном каталоге, с pip-ом (параметр with_pip)
Если у вас проблемы с развёртыванием pip и setuptools, вам, гм…, повезло и вы получите ещё больше опыта! Вот здесь есть про то, как и откуда их скачивать автоматом
Ставит с помощью pip-а в это окружение pyfiglet
NB! Pip принципиально не предоставляет никакого публичного API — это только сценарий. Так что придётся с помощью subprocess.run() запустить что-то вроде /временное/env/окружение/bin/pip install pyfiglet.
Запускает python3 -m figdate переданные параметры
Таким образом даже в отсутствие пакета pyfiglet вся эта конструкция должна работать так:
$ python3 figdate_wrapper.py ____ __ ____ ____ __ ___ ____ ____ ____ (___ \ / \(___ \(___ \ / \ / __) / __ \( __)( _ \ _ / __/( 0 )/ __/ / __/ (_/ /( _ \ \_ _/ ) _) ) _ (( ) (____) \__/(____)(____) (__) \___/ (__) (____)(____/(/ ___ ____ ____ ____ __ / __)( _ \( __)/ __ \ / _\ ( (__ ) __/ ) _) \_ _// \ \___)(__) (____)(_)(_)\_/\_/
Причём если pyfiglet-а не было, то он и не появляется (сгинет вместе с временным venv-окружением)
Содзать в репозитории с домашним заданием подкаталог 02_PushPip (имя совпадает с URL этой страницы), и положить туда
(как минимум, одним отдельным коммитом) каталог figdate
(как минимум, одним отдельным коммитом) обвязку figdate_wrapper.py
Ничего другого в этом подкаталоге (в частности, __pycache__) не должно быть (используем .gitignore, его как раз в репозиторий класть можно☺)