comparison planemo/lib/python3.7/site-packages/requests_toolbelt/utils/formdata.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
comparison
equal deleted inserted replaced
0:d30785e31577 1:56ad4e20f292
1 # -*- coding: utf-8 -*-
2 """Implementation of nested form-data encoding function(s)."""
3 from .._compat import basestring
4 from .._compat import urlencode as _urlencode
5
6
7 __all__ = ('urlencode',)
8
9
10 def urlencode(query, *args, **kwargs):
11 """Handle nested form-data queries and serialize them appropriately.
12
13 There are times when a website expects a nested form data query to be sent
14 but, the standard library's urlencode function does not appropriately
15 handle the nested structures. In that case, you need this function which
16 will flatten the structure first and then properly encode it for you.
17
18 When using this to send data in the body of a request, make sure you
19 specify the appropriate Content-Type header for the request.
20
21 .. code-block:: python
22
23 import requests
24 from requests_toolbelt.utils import formdata
25
26 query = {
27 'my_dict': {
28 'foo': 'bar',
29 'biz': 'baz",
30 },
31 'a': 'b',
32 }
33
34 resp = requests.get(url, params=formdata.urlencode(query))
35 # or
36 resp = requests.post(
37 url,
38 data=formdata.urlencode(query),
39 headers={
40 'Content-Type': 'application/x-www-form-urlencoded'
41 },
42 )
43
44 Similarly, you can specify a list of nested tuples, e.g.,
45
46 .. code-block:: python
47
48 import requests
49 from requests_toolbelt.utils import formdata
50
51 query = [
52 ('my_list', [
53 ('foo', 'bar'),
54 ('biz', 'baz'),
55 ]),
56 ('a', 'b'),
57 ]
58
59 resp = requests.get(url, params=formdata.urlencode(query))
60 # or
61 resp = requests.post(
62 url,
63 data=formdata.urlencode(query),
64 headers={
65 'Content-Type': 'application/x-www-form-urlencoded'
66 },
67 )
68
69 For additional parameter and return information, see the official
70 `urlencode`_ documentation.
71
72 .. _urlencode:
73 https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
74 """
75 expand_classes = (dict, list, tuple)
76 original_query_list = _to_kv_list(query)
77
78 if not all(_is_two_tuple(i) for i in original_query_list):
79 raise ValueError("Expected query to be able to be converted to a "
80 "list comprised of length 2 tuples.")
81
82 query_list = original_query_list
83 while any(isinstance(v, expand_classes) for _, v in query_list):
84 query_list = _expand_query_values(query_list)
85
86 return _urlencode(query_list, *args, **kwargs)
87
88
89 def _to_kv_list(dict_or_list):
90 if hasattr(dict_or_list, 'items'):
91 return list(dict_or_list.items())
92 return dict_or_list
93
94
95 def _is_two_tuple(item):
96 return isinstance(item, (list, tuple)) and len(item) == 2
97
98
99 def _expand_query_values(original_query_list):
100 query_list = []
101 for key, value in original_query_list:
102 if isinstance(value, basestring):
103 query_list.append((key, value))
104 else:
105 key_fmt = key + '[%s]'
106 value_list = _to_kv_list(value)
107 query_list.extend((key_fmt % k, v) for k, v in value_list)
108 return query_list