Современные крупные и сложные проекты на python предназначенные для пользования другими людьми, доступные для общественности, содержат далеко не 2 с половиной кодовых файла в одной единственной папке. Внутри проекта может храниться, кажется, всё, что напрямую к программе не имеет отношения. Это и файлы, описывающие зависимости да еще может так случиться, что не один вид зависимостей: и development, и production и даже test зависимости. Для некоторых проектов пишется документация в формате .rst
, которая затем, как правило, может быть “собрана” на компьютерах интересующихся пользователей посредством Sphinx. В общем и целом, пакеты принадлежат к той или иной лицензии, что ведет к появлению в проекте файликов, описывающих юридическими терминами “что-то”. Ну и уж совсем нельзя упомянуть про файлы, предназначенные для сборки/упаковки python проекта в нечто удобоваримое для дистрибьюции. Иными словами, для создания дистрибутива, который затем можно распространять среди пользователей посредством PyPi или на дискетах.
Итак, в рамках этой статьи, возьмем для рассмотрения не самый большой, не самый сложный и даже не самый известный пакет из Интернета и разберем его на составляющие части. На примере пакета oslo.config я расскажу, зачем нужны те или иные файлы. Сам по себе пакет oslo.config предлагает свое использование в других проектах, в которых он может предоставить удобный способ получения параметров из командной строки или из .ini
конфигурационных файлов.
Директория doc
В этой директории, как следует из названия, находится документация к проекту. Находится она тут по большей части в виде файлов формата .rst
. Внутри doc содержатся поддиректория source и файл requirements.txt
Директория source содержит файлы документации, организованные удобным образом для системы сборки документации Sphinx. Зависимости файла по соседству необходимы, чтобы получилось “собрать документацию”.
Содержимое файла с зависимостями для сборки документации:
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
sphinx>=1.8.0,!=2.1.0 # BSD
sphinxcontrib-apidoc>=0.2.0 # BSD
openstackdocstheme>=1.20.0 # Apache-2.0
reno>=2.5.0 # Apache-2.0
fixtures>=3.0.0 # Apache-2.0/BSD
doc8>=0.6.0 # Apache-2.0
Директория oslo_config
Директория oslo_config содержит непосредственно исходники библиотеки. “Почему часть кодовых файлов содержится в корне директории oslo_config, а другая часть находится внутри поддиректории sources?” - может спросить у меня читатель. “Я не знаю” - отвечу я. Для понимания этого момента необходимо быть в контексте внутреннего устройства библиотеки, а может быть и истории её разработки. В поддиректории tests содержатся кодовые файлы с тестами.
Директория oslo.config.egg-info
Это директория, содержащая метаданные проекта, важные в контексте питоновских яиц. Питоновское яйцо или же “python egg” - это логическая структура, представляющая собой релиз конкретной версии Python проекта. Загадочная “логическая структура” может быть представлена в материальном мире посредством одного из множества способов. Иначе говоря, существует несколько видов питоновских дистрибутивов.
Формат .egg-info
- один из способов представления питоновского яйца в реальном мире. Метаданные, хранящиеся внутри этой директории, позволяют отслеживать pip’у и подобным инструментам, какие пакеты установлены в системе и от чего они зависят.
Тема создания и подготовки своего пакета для дистрибьюции в общем и темя питоновских яиц в частности выходят за рамки этой статьи, поэтому будут рассмотрены в иной раз.
Директория releasenotes
Из названия становится ясно, что в директории находятся файлики, содержащие инфу о релизах библиотеки. В принципе, наличие такой директория не является общеобязательным, команда Openstack (они же и написали рассматриваемую в этой статье библиотеку) избрала такой способ ведения документации о релизах. Они используют для этого свой инструмент под названием reno. Если хотите, можете ознакомиться с этим тут.
Популярные файлы
Эти файлы можно встретить в подавляющем большинстве репозиториев python- пакетов, поэтому они заслуживают внимания.
requirements.txt
Файл описывает зависимости пакета. Как правило для работы в development среде. Использование “больше либо равно” по отношению к версии пакета-зависимости я считаю ошибочным. Спустя время публичный интерфейс пакета, который прописан в requirements.txt, изменится. Что приведет к неработоспособности текущей версии пакета, в данном случае, oslo_config. Ведь обычно никто особо не тестирует старые релизы продукта на совместимость с новыми версиями библиотек, от которых он зависит, если, конечно, это не lts версия.
Ошибка может быть крайне трудноуловимой, а что самое подлое- ошибка будет в файле requirements.txt, который с виду выглядит абсолютно правильным.
Мой совет- необходимо использовать “равно” в файле requirements.txt и по возможности “двигать” версии зависимостей вверх, но обязательно тестируя на совместимость.
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
debtcollector>=1.2.0 # Apache-2.0
netaddr>=0.7.18 # BSD
stevedore>=1.20.0 # Apache-2.0
oslo.i18n>=3.15.3 # Apache-2.0
rfc3986>=1.2.0 # Apache-2.0
PyYAML>=5.1 # MIT
requests>=2.18.0 # Apache-2.0
test-requirements.txt
Зависимости, необходимые для запуска тестов.
setup.py
Этот файл нужен для инструмента setuptools, который предназначен для формирования дистрибутива из python проекта.
import setuptools
setuptools.setup(
setup_requires=['pbr>=2.0.0'],
pbr=True)
setup.cfg
Конфиг для setuptools.
Россыпь оставшихся файлов
.coveragerc
Файл содержит конфигурацию, которую понимает pytest-cov - плагин для pytest.
[run]
branch = True
source = oslo_config
omit = oslo_config/tests/*
[report]
ignore_errors = True
precision = 2
.pre-commit-config.yaml
Один из файликов, специфичных для этого проекта, не интересно. Предназначен для работы одного из инструментов команды Openstack.
.stestr.conf
Конфигурационный файл для инструмента stestr. Он позволяет запускать тесты в параллельном режиме.
[DEFAULT]
test_path=.
top_dir=./
.zuul.yaml
Конфиг для Zuul. Это фреймворк для построения CI/CD конвейера, но специализирующийся на тестировании.
- project:
templates:
- check-requirements
- lib-forward-testing-python3
- openstack-python3-jobs
- periodic-stable-jobs
- publish-openstack-docs-pti
- release-notes-jobs-python3
AUTHORS
Файлик с перечислением авторов проекта. Файл нужен для того, чтобы предоставить список людей, чей вклад в проект оказался ценным в глазах владельца репозитория.
bindep.txt
Файлик для утилиты bindep. Утилита занимается отслеживанием бинарных зависимостей пакета. Её можно отнести к Openstack- line утилитам.
# This is a cross-platform list tracking distribution packages needed by tests;
# see http://docs.openstack.org/infra/bindep/ for additional information.
locales [platform:debian]
python3-all-dev [platform:ubuntu !platform:ubuntu-precise]
python3-dev [platform:dpkg]
python3-devel [platform:fedora]
ChangeLog
Файл хранит историю изменений проекта. Историю изменений можно вести как так, так и иначе.
CONTRIBUTING.rst, HACKING.rst, LICENSE, PKG-INFO, README.rst
Файлы +- Openstack- специфичные, так что не интересно их рассматривать.