Внедрение HTTPie в docopt
Я пытаюсь реализовать CLI HTTPie с помощью docopt, но по какой-то причине я не могу сделать METHOD необязательным в качестве первого аргумента. Я удалил большинство опций, чтобы изолировать эту проблему.
Кроме того, способ, которым автор HTTPie получает REQUEST ITEM, кажется неправильным с документами docopt, поэтому он задавался вопросом, какова лучшая альтернатива для реализации этой части.
Полные документы по HTTPie: https://github.com/jkbr/httpie
Мой пример документа: https://gist.github.com/dasickis/4711926
1 ответ
Докопт жаден, когда пытается соответствовать шаблону. Так что, если вы шаблон:
usage: http [METHOD] URL [ITEM...]
И ты бежишь $ http google.com bla
тогда документ будет соответствовать google.com
как METHOD
Потому что, это первый позиционный аргумент! Докопт не имеет информации в этом случае, чтобы вычесть, как METHOD
должен выглядеть так. Однако, если у вас есть следующее использование:
usage: http [get|post|put|delete] URL [ITEM...]
Тогда он знает, что если это не так get/post/put/delete
то это должно быть URL
, Однако я вижу, что это не оптимально: 1. httpie использует имена в верхнем регистре (которые интерпретируются как позиционные аргументы, а не команды docopt), 2. Если команд много, использование может стать длинной строкой.
Если вас не интересует совместимость с httpie, я бы пошел с (A) строчными командами, так как по договоренности это строчные буквы. Другое несовместимое проектное решение было бы (B) требовать METHOD
:
usage: http METHOD URL [ITEM...]
Таким образом, вы сделаете шаблон использования не двусмысленным. (C) Что бы я сделал, чтобы сохранить совместимость, я бы сделал следующее использование:
usage: http URL [ITEM...]
http METHOD URL [ITEM...]
В этом случае второй подшаблон никогда не будет совпадать (docopt ничего не знает о URL- адресах и методах, что делает первый шаблон супернабором второго), и тогда я бы разложил аргументы следующим образом:
positional_arguments = [args['URL']] + args['ITEM']
а потом разбирать positional_arguments
вручную, в зависимости от того, выглядит ли первый аргумент как url или как глагол запроса.
Извините, что docopt не справляется с этим делом элегантно, я подумаю больше об этом случае. Если у вас есть какие-либо предложения, пожалуйста, создайте проблему: https://github.com/docopt/docopt/issues
PS Вы правы, что REQUEST ITEM
это неправильно и очень нетрадиционно и запутанно. Это должно было быть либо REQUEST-ITEM
или же REQUEST_ITEM
или просто ITEM
,