1
0
mirror of https://github.com/httpie/cli.git synced 2025-10-30 23:47:52 +02:00

Added RequestItems named tuple for convenience.

This commit is contained in:
Jakub Roztocil
2014-09-05 07:51:35 +02:00
parent ca36f1de04
commit 1035710956
3 changed files with 53 additions and 29 deletions

View File

@@ -8,6 +8,7 @@ import json
import mimetypes import mimetypes
import getpass import getpass
from io import BytesIO from io import BytesIO
from collections import namedtuple
#noinspection PyCompatibility #noinspection PyCompatibility
from argparse import ArgumentParser, ArgumentTypeError, ArgumentError from argparse import ArgumentParser, ArgumentTypeError, ArgumentError
@@ -560,6 +561,10 @@ class ParamDict(OrderedDict):
self[key].append(value) self[key].append(value)
RequestItems = namedtuple('RequestItems',
['headers', 'data', 'files', 'params'])
def parse_items(items, data=None, headers=None, files=None, params=None): def parse_items(items, data=None, headers=None, files=None, params=None):
"""Parse `KeyValue` `items` into `data`, `headers`, `files`, """Parse `KeyValue` `items` into `data`, `headers`, `files`,
and `params`. and `params`.
@@ -617,7 +622,7 @@ def parse_items(items, data=None, headers=None, files=None, params=None):
target[item.key] = value target[item.key] = value
return headers, data, files, params return RequestItems(headers, data, files, params)
def readable_file_arg(filename): def readable_file_arg(filename):

View File

@@ -1,3 +1,5 @@
# This is purely the result of trial and error.
import sys import sys
import codecs import codecs
@@ -26,7 +28,7 @@ class PyTest(TestCommand):
tests_require = [ tests_require = [
# Pytest needs to come last. # Pytest needs to come last.
# <bitbucket.org/pypa/setuptools/issue/196/tests_require-pytest-pytest-cov-breaks> # https://bitbucket.org/pypa/setuptools/issue/196/
'pytest-httpbin', 'pytest-httpbin',
'pytest', 'pytest',
] ]
@@ -36,15 +38,30 @@ install_requires = [
'requests>=2.3.0', 'requests>=2.3.0',
'Pygments>=1.5' 'Pygments>=1.5'
] ]
try:
#noinspection PyUnresolvedReferences
import argparse
except ImportError:
install_requires.append('argparse>=1.2.1')
if 'win32' in str(sys.platform).lower(): ### Conditional dependencies:
# Terminal colors for Windows
install_requires.append('colorama>=0.2.4') # sdist
if not 'bdist_wheel' in sys.argv:
try:
#noinspection PyUnresolvedReferences
import argparse
except ImportError:
install_requires.append('argparse>=1.2.1')
if 'win32' in str(sys.platform).lower():
# Terminal colors for Windows
install_requires.append('colorama>=0.2.4')
# bdist_wheel
extras_require = {
# http://wheel.readthedocs.org/en/latest/#defining-conditional-dependencies
':python_version == "2.6"'
' or python_version == "3.0"'
' or python_version == "3.1" ': ['argparse>=1.2.1'],
':sys_platform == "win32"': ['colorama>=0.2.4'],
}
def long_description(): def long_description():
@@ -67,6 +84,7 @@ setup(
'http = httpie.__main__:main', 'http = httpie.__main__:main',
], ],
}, },
extras_require=extras_require,
install_requires=install_requires, install_requires=install_requires,
tests_require=tests_require, tests_require=tests_require,
cmdclass={'test': PyTest}, cmdclass={'test': PyTest},

View File

@@ -27,32 +27,32 @@ class TestItemParsing:
self.key_value_type, item) self.key_value_type, item)
def test_escape(self): def test_escape(self):
headers, data, files, params = input.parse_items([ items = input.parse_items([
# headers # headers
self.key_value_type('foo\\:bar:baz'), self.key_value_type(r'foo\:bar:baz'),
self.key_value_type('jack\\@jill:hill'), self.key_value_type(r'jack\@jill:hill'),
# data # data
self.key_value_type('baz\\=bar=foo'), self.key_value_type(r'baz\=bar=foo'),
# files # files
self.key_value_type('bar\\@baz@%s' % FILE_PATH_ARG) self.key_value_type(r'bar\@baz@%s' % FILE_PATH_ARG)
]) ])
# `requests.structures.CaseInsensitiveDict` => `dict` # `requests.structures.CaseInsensitiveDict` => `dict`
headers = dict(headers._store.values()) headers = dict(items.headers._store.values())
assert headers == { assert headers == {
'foo:bar': 'baz', 'foo:bar': 'baz',
'jack@jill': 'hill', 'jack@jill': 'hill',
} }
assert data == {'baz=bar': 'foo'} assert items.data == {'baz=bar': 'foo'}
assert 'bar@baz' in files assert 'bar@baz' in items.files
def test_escape_longsep(self): def test_escape_longsep(self):
headers, data, files, params = input.parse_items([ items = input.parse_items([
self.key_value_type('bob\\:==foo'), self.key_value_type(r'bob\:==foo'),
]) ])
assert params == {'bob:': 'foo'} assert items.params == {'bob:': 'foo'}
def test_valid_items(self): def test_valid_items(self):
headers, data, files, params = input.parse_items([ items = input.parse_items([
self.key_value_type('string=value'), self.key_value_type('string=value'),
self.key_value_type('header:value'), self.key_value_type('header:value'),
self.key_value_type('list:=["a", 1, {}, false]'), self.key_value_type('list:=["a", 1, {}, false]'),
@@ -68,14 +68,14 @@ class TestItemParsing:
# Parsed headers # Parsed headers
# `requests.structures.CaseInsensitiveDict` => `dict` # `requests.structures.CaseInsensitiveDict` => `dict`
headers = dict(headers._store.values()) headers = dict(items.headers._store.values())
assert headers == {'header': 'value', 'eh': ''} assert headers == {'header': 'value', 'eh': ''}
# Parsed data # Parsed data
raw_json_embed = data.pop('raw-json-embed') raw_json_embed = items.data.pop('raw-json-embed')
assert raw_json_embed == json.loads(JSON_FILE_CONTENT) assert raw_json_embed == json.loads(JSON_FILE_CONTENT)
data['string-embed'] = data['string-embed'].strip() items.data['string-embed'] = items.data['string-embed'].strip()
assert dict(data) == { assert dict(items.data) == {
"ed": "", "ed": "",
"string": "value", "string": "value",
"bool": True, "bool": True,
@@ -85,11 +85,12 @@ class TestItemParsing:
} }
# Parsed query string parameters # Parsed query string parameters
assert params == {'query': 'value'} assert items.params == {'query': 'value'}
# Parsed file fields # Parsed file fields
assert 'file' in files assert 'file' in items.files
assert files['file'][1].read().strip().decode('utf8') == FILE_CONTENT assert (items.files['file'][1].read().strip().decode('utf8')
== FILE_CONTENT)
class TestQuerystring: class TestQuerystring: