Comments 12
Take a look at a simple bash script below.
А почему не сразу на питоне скриптовать? Да и в принципе какой-нибудь простенький менеджер всего этого безобразия консольный написать. crax init, crax serve, crax migrate и прочее в том же духе. Батарейки в комплекте обычно добавляют плюс к размеру комьюнити.
__init__.py
Я же правильно понимаю что проект завязан на Python 3+. Оно вроде с третьей версии не требует скрипта инициализации, если это не фолбэк во вторую версию. Поправьте если не прав.
python3 -m unittest discover
не находит тесты, если на пути до них не будет везде __init__.pyПосмотрел исходники.
Вы никогда не обращали внимание на то, что в других, "взрослых" фреймворках HTTP-заголовки представлены не совсем обычным питонячим словарём? Обычно это нечто называемое, как минимум, MultiDict (а в идеале там ещё и case-insensetive сравнение ключей).
И ведь не просто так ASGI передаёт приложению заголовки в виде списка тюплов. А вы довольно смело берёте и превращаете этот список в самый обычный словарик.
Думается мне, что вас ждёт ещё много открытий на вашем пути. И с каждым новым открытием ваш фреймворк скорее всего будет становиться медленнее и медленнее.
Положа руку на сердце, в проекте достаточно «детских» решений, которые ещё придётся изменять и дополнять.
Касаемо преобразования list of tuples в словарик. Мы, естественно, преобразуем ASGI scope
(https://asgi.readthedocs.io/en/latest/specs/www.html#http-connection-scope). Я, разумеется, читал (https://github.com/encode/starlette/blob/c566fc6c819f0d565f8cff432351fe009e83d866/starlette/datastructures.py#L487). И, несомненно, у этого есть высокая цель. Я даже подозреваю какая: Объект заголовков должен быть неизменяемым на момент всего выполнения запроса каким бы долгим он ни был — это первое. Второе — «Duplicates are possible and must be preserved in the message as received». Именно поэтому Ваше сообщение вызывает уважение. Я размышлял очень много над объектом реквеста (он практически неизменен с первых строк проекта), и я хочу что-то делать не потому что «А у взрослых дяденек так», а потому что так действительно стоит делать. В данном конкретном случае ТАК действительно нужно делать только потому, что так говорит ASGI спецификация. Как именно это выполнить, я пока не знаю.
Что я имею в виду: Объект реквеста, с предоставляемыми атрибутами может быть изменён приложением во время выполнения. При этом объект ASGI scope останется неизменным. Опасность заключается в том, что эти объекты могут не совпадать. Я понимаю риск. Я понимаю, что объект реквеста, который передаётся в течение всего цикла запроса есть желание изменить. Для этих целей, например, у Starlette есть State.
Я не уверен, как делать это в Crax.
Если что, то это не ASGI говорит, это спека на HTTP говорит, что может быть несколько заголовков с одинаковым именем. И это нормальная ситуация.
github.com/nodejs/node/issues/3591
Single man army — это почти гарантия того, что рано или поздно проект будет заброшен.
Мне нравится «почти». «Можете со мной поспорить и переспорить, но это не будет считаться, потому что я сказал волшебное слово „почти“. „
И вывод странный. Все до одного фреймворки в любом языке когда-то были single man army. А вы как хотели, чтобы сразу сообщество выросло в первый месяц-год?
Что-то забросили, а что-то выросло.
Кракс! Миллениалы изобрели Python фреймворк