Внедрение 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,

Другие вопросы по тегам