Что: b90947342b209343533a2560b92f80eb76284fe5
Когда: 2021-09-25 19:55:50+03:00
Темы: python
GoCheese 3.0.0 http://www.gocheese.cypherpunks.ru/ Сделал большой пребольшой релиз GoCheese. Самое приятное в Python -- писать для него на Go. Пароли теперь управляются не через текстовый файл, читаемый при запуске и при получения SIGHUP, а полностью динамически через FIFO файл. Плюс теперь он может работать как UCSPI-TCP демон. Это всё сделано "чтобы было". Плюс явно включается поддержка HTTP/2, keepalive-ов и TLS session resumption -- реально заметно как пошустрее он работает при большом количестве запросов с PyPI. А из серьёзных изменений это поддержка метаданных. Теперь используется ещё и (в довесок к Simple API) JSON API, из которого получаются метаданные (автор, описание, и всё в таком духе) и они сохраняются в recfile-е пакета. Из них берётся и created время и оно форсированно используется для выставления mtime файлов на диске. Этот же mtime честно отдаётся и в HTTP заголовках. При загрузке пакета, все метаданные тоже аналогично сохраняются. Сам GoCheese тоже теперь отвечает по JSON API, отдавая аналогичный ответ как и PyPI. Скрипт конвертирования БД PyShop-а тоже учитывает время создания пакетов и его корректно выставляет при миграции. Прежде я уже себе делал полный слепок состояния пакетов с PyPI. Просто curl-ом дёргал /simple/, получал полный список пакетов, а дальше через GNU parallel запускал curl-ы к GoCheese, чтобы он выполнял refresh пакетов: контрольные суммы для каждого пакета сохранялись на диске. Очень нравится --bar опция, которая показывает progress bar с кол-вом выполненных/всего задач, текущей и примерно сколько времени ещё ждать: 69% 227891:101285=1h23m59s pykirara Сейчас вот уже несколько часов снова идёт обновление состояния, дабы обновить mtime-ы и metadata для всех пакетов. GOCHEESE_NO_SYNC=1 переменная окружения отключает fsync, что сильно всё ускоряет. Есть пара моментов которые где-нибудь когда-нибудь могут да выстрелить. Понять версию пакета по его имени -- нетривиальная задача: 1.5.1, 1.5.2b2, 161, 3.10a, 8.02, 3.4j, 1996.07.12, 3.2.pl0, 3.1.1.6, 2g6, 11g, 0.960923, 2.2beta29, 1.13++, 5.5.kw, 2.0b1pl0 -- это всё валидные версии. Плюс названия имён файлов далеко не всегда совпадают с каноничным названием пакета на диске. Фиг с ходу поймёшь где начинается/кончается версия пакета. Я поэтому сделал очень простой парсер, где-то точно наверное не сработающий. Ну и в a251453c84f341e535bfabbce4ed4031cc791854 я увидел что формат JSON API нигде не описан и не стандартизирован, плюс идёт в разрез с некоторыми PEP. Поэтому у меня нормальная PEP-совместимая (вру, одно поле я не обрабатываю из-за противоречивости PEP) схема и урезанная. Нормальная версия отдаётся самим GoCheese по JSON API. Если GoCheese стучится в GoCheese -- то потерь информации не происходит. А если стучится в боевой PyPI, то парсинг упадёт и будет использоваться урезанная версия, с небольшой потерей метаинформации.
Сгенерирован: SGBlog 0.34.0