Skip to content

Commit ad89c73

Browse files
authored
Merge pull request #263 from bulkan/cleanup-0.6
Cleanup 0.6
2 parents cc093b2 + 7f16c12 commit ad89c73

File tree

11 files changed

+351
-239
lines changed

11 files changed

+351
-239
lines changed

setup.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,13 @@
5050
},
5151
)
5252

53-
""" From now on use this approach
54-
55-
python setup.py sdist upload
56-
git tag -a 1.2.3 -m 'version 1.2.3'
57-
git push --tags"""
53+
""" Official release from master
54+
# make sure the setup version has been increased
55+
python -m robot.libdoc src/RequestsLibrary doc/RequestsLibrary.html
56+
git add doc/RequestsLibrary.html
57+
git commit -m "Updated documentation"
58+
git tag v1.2.3
59+
git push --tags
60+
python setup.py sdist bdist_wheel
61+
twine upload dist/*
62+
"""

src/RequestsLibrary/RequestsKeywords.py

Lines changed: 15 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import json
22
import copy
3-
import types
43
import sys
54

65
import requests
76
from requests.models import Response
87
from requests.sessions import merge_setting
98
from requests.cookies import merge_cookies
10-
from requests.structures import CaseInsensitiveDict
119
from requests.packages.urllib3.util import Retry
1210
import logging
1311

@@ -16,8 +14,10 @@
1614
from robot.libraries.BuiltIn import BuiltIn
1715
from robot.utils.asserts import assert_equal
1816

19-
from RequestsLibrary import utils
20-
from RequestsLibrary.compat import httplib, urlencode, PY3
17+
from RequestsLibrary import utils, log
18+
from RequestsLibrary.compat import httplib, PY3
19+
from RequestsLibrary.exceptions import InvalidResponse
20+
2121

2222
try:
2323
from requests_ntlm import HttpNtlmAuth
@@ -574,7 +574,7 @@ def to_json(self, content, pretty_print=False):
574574
if isinstance(content, bytes):
575575
content = content.decode(encoding='utf-8')
576576
if pretty_print:
577-
json_ = self._json_pretty_print(content)
577+
json_ = utils.json_pretty_print(content)
578578
else:
579579
json_ = json.loads(content)
580580
logger.info('To JSON using : content=%s ' % (content))
@@ -669,7 +669,7 @@ def post_request(
669669
"""
670670
session = self._cache.switch(alias)
671671
if not files:
672-
data = self._format_data_according_to_header(session, data, headers)
672+
data = utils.format_data_according_to_header(session, data, headers)
673673
redir = True if allow_redirects is None else allow_redirects
674674

675675
response = self._common_request(
@@ -721,7 +721,7 @@ def patch_request(
721721
``timeout`` connection timeout
722722
"""
723723
session = self._cache.switch(alias)
724-
data = self._format_data_according_to_header(session, data, headers)
724+
data = utils.format_data_according_to_header(session, data, headers)
725725
redir = True if allow_redirects is None else allow_redirects
726726

727727
response = self._common_request(
@@ -772,7 +772,7 @@ def put_request(
772772
``timeout`` connection timeout
773773
"""
774774
session = self._cache.switch(alias)
775-
data = self._format_data_according_to_header(session, data, headers)
775+
data = utils.format_data_according_to_header(session, data, headers)
776776
redir = True if allow_redirects is None else allow_redirects
777777

778778
response = self._common_request(
@@ -816,7 +816,7 @@ def delete_request(
816816
``timeout`` connection timeout
817817
"""
818818
session = self._cache.switch(alias)
819-
data = self._format_data_according_to_header(session, data, headers)
819+
data = utils.format_data_according_to_header(session, data, headers)
820820
redir = True if allow_redirects is None else allow_redirects
821821

822822
response = self._common_request(
@@ -920,29 +920,28 @@ def request_should_be_successful(self, response):
920920
"""
921921
self._check_status(None, response, msg=None)
922922

923-
924923
def _common_request(
925924
self,
926925
method,
927926
session,
928927
uri,
929928
**kwargs):
930929

931-
self._log_request(method, session, uri, **kwargs)
930+
log.log_request(method, session, uri, **kwargs)
932931
method_function = getattr(session, method)
933932

934933
self._capture_output()
935934
resp = method_function(
936935
self._get_url(session, uri),
937-
params=self._utf8_urlencode(kwargs.pop('params', None)),
936+
params=utils.utf8_urlencode(kwargs.pop('params', None)),
938937
timeout=self._get_timeout(kwargs.pop('timeout', None)),
939938
cookies=self.cookies,
940939
verify=self.verify,
941940
**kwargs)
942941
self._print_debug()
943942

944943
session.last_resp = resp
945-
self._log_response(method, resp)
944+
log.log_response(method, resp)
946945

947946
return resp
948947

@@ -952,7 +951,7 @@ def _check_status(expected_status, resp, msg=None):
952951
Helper method to check HTTP status
953952
"""
954953
if not isinstance(resp, Response):
955-
raise utils.InvalidResponse(resp)
954+
raise InvalidResponse(resp)
956955
if expected_status is None:
957956
resp.raise_for_status()
958957
else:
@@ -965,7 +964,8 @@ def _check_status(expected_status, resp, msg=None):
965964
msg = "{}Url: {} Expected status".format(msg, resp.url)
966965
assert_equal(resp.status_code, expected_status, msg)
967966

968-
def _get_url(self, session, uri):
967+
@staticmethod
968+
def _get_url(session, uri):
969969
"""
970970
Helper method to get the full url
971971
"""
@@ -1005,139 +1005,3 @@ def _print_debug(self):
10051005
debug_info = "\n".join(
10061006
[ll.rstrip() for ll in debug_info.splitlines() if ll.strip()])
10071007
logger.debug(debug_info)
1008-
1009-
def _json_pretty_print(self, content):
1010-
"""
1011-
Pretty print a JSON object
1012-
1013-
``content`` JSON object to pretty print
1014-
"""
1015-
temp = json.loads(content)
1016-
return json.dumps(
1017-
temp,
1018-
sort_keys=True,
1019-
indent=4,
1020-
separators=(
1021-
',',
1022-
': '))
1023-
1024-
def _utf8_urlencode(self, data):
1025-
if self._is_string_type(data):
1026-
return data.encode('utf-8')
1027-
1028-
if not isinstance(data, dict):
1029-
return data
1030-
1031-
utf8_data = {}
1032-
for k, v in data.items():
1033-
if self._is_string_type(v):
1034-
v = v.encode('utf-8')
1035-
utf8_data[k] = v
1036-
return urlencode(utf8_data)
1037-
1038-
def _format_data_according_to_header(self, session, data, headers):
1039-
# Merged headers are already case insensitive
1040-
headers = self._merge_headers(session, headers)
1041-
1042-
if data is not None and headers is not None and 'Content-Type' in headers and not self._is_json(data):
1043-
if headers['Content-Type'].find("application/json") != -1:
1044-
if not isinstance(data, types.GeneratorType):
1045-
if str(data).strip():
1046-
data = json.dumps(data)
1047-
elif headers['Content-Type'].find("application/x-www-form-urlencoded") != -1:
1048-
data = self._utf8_urlencode(data)
1049-
else:
1050-
data = self._utf8_urlencode(data)
1051-
1052-
return data
1053-
1054-
def _format_data_to_log_string_according_to_headers(self, session, data, headers):
1055-
data_str = None
1056-
# Merged headers are already case insensitive
1057-
headers = self._merge_headers(session, headers)
1058-
1059-
if data is not None and headers is not None and 'Content-Type' in headers:
1060-
if (headers['Content-Type'].find("application/json") != -1) or \
1061-
(headers['Content-Type'].find("application/x-www-form-urlencoded") != -1):
1062-
if isinstance(data, bytes):
1063-
data_str = data.decode('utf-8')
1064-
else:
1065-
data_str = data
1066-
else:
1067-
data_str = "<" + headers['Content-Type'] + ">"
1068-
1069-
return data_str
1070-
1071-
def _log_request(
1072-
self,
1073-
method,
1074-
session,
1075-
uri,
1076-
**kwargs):
1077-
1078-
# TODO would be nice to add also the alias
1079-
# TODO would be nice to pretty format the headers / json / data
1080-
# TODO move in common the data formatting to have this as @staticmethod
1081-
# TODO big requests should be truncated to avoid huge logs
1082-
1083-
# kwargs might include: method, session, uri, params, files, headers,
1084-
# data, json, allow_redirects, timeout
1085-
args = kwargs.copy()
1086-
args.pop('session', None)
1087-
# This will log specific headers merged with session defined headers
1088-
merged_headers = self._merge_headers(session, args.pop('headers', None))
1089-
formatted_data = self._format_data_to_log_string_according_to_headers(session,
1090-
args.pop('data', None),
1091-
merged_headers)
1092-
formatted_json = args.pop('json', None)
1093-
method_log = '%s Request using : ' % method.upper()
1094-
uri_log = 'uri=%s' % uri
1095-
composed_log = method_log + uri_log
1096-
for arg in args:
1097-
composed_log += ', %s=%s' % (arg, kwargs.get(arg, None))
1098-
logger.info(composed_log + '\n' +
1099-
'headers=%s \n' % merged_headers +
1100-
'data=%s \n' % formatted_data +
1101-
'json=%s' % formatted_json)
1102-
1103-
@staticmethod
1104-
def _log_response(method, response):
1105-
# TODO big responses should be truncated to avoid huge logs
1106-
logger.debug('%s Response : status=%s, reason=%s\n' % (method.upper(),
1107-
response.status_code,
1108-
response.reason) +
1109-
response.text)
1110-
1111-
@staticmethod
1112-
def _merge_headers(session, headers):
1113-
if headers is None:
1114-
headers = {}
1115-
if session.headers is None:
1116-
merged_headers = {}
1117-
else:
1118-
# Session headers are the default but local headers
1119-
# have priority and can override values
1120-
merged_headers = session.headers.copy()
1121-
1122-
# Make sure merged_headers are CaseIsensitiveDict
1123-
if not isinstance(merged_headers, CaseInsensitiveDict):
1124-
merged_headers = CaseInsensitiveDict(merged_headers)
1125-
1126-
merged_headers.update(headers)
1127-
return merged_headers
1128-
1129-
@staticmethod
1130-
def _is_json(data):
1131-
try:
1132-
json.loads(data)
1133-
except (TypeError, ValueError):
1134-
return False
1135-
return True
1136-
1137-
@staticmethod
1138-
def _is_string_type(data):
1139-
if PY3 and isinstance(data, str):
1140-
return True
1141-
elif not PY3 and isinstance(data, unicode):
1142-
return True
1143-
return False

src/RequestsLibrary/exceptions.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class UnknownStatusError(Exception):
2+
pass
3+
4+
5+
class InvalidResponse(Exception):
6+
pass

src/RequestsLibrary/log.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from robot.api import logger
2+
3+
from RequestsLibrary import utils
4+
5+
6+
def log_response(method, response):
7+
# TODO big responses should be truncated to avoid huge logs
8+
logger.debug('%s Response : status=%s, reason=%s\n' % (method.upper(),
9+
response.status_code,
10+
response.reason) +
11+
response.text)
12+
13+
14+
def log_request(
15+
method,
16+
session,
17+
uri,
18+
**kwargs):
19+
20+
# TODO would be nice to add also the alias
21+
# TODO would be nice to pretty format the headers / json / data
22+
# TODO move in common the data formatting to have this as @staticmethod
23+
# TODO big requests should be truncated to avoid huge logs
24+
25+
# kwargs might include: method, session, uri, params, files, headers,
26+
# data, json, allow_redirects, timeout
27+
args = kwargs.copy()
28+
args.pop('session', None)
29+
# This will log specific headers merged with session defined headers
30+
merged_headers = utils.merge_headers(session, args.pop('headers', None))
31+
formatted_data = utils.format_data_to_log_string_according_to_headers(session,
32+
args.pop('data', None),
33+
merged_headers)
34+
formatted_json = args.pop('json', None)
35+
method_log = '%s Request using : ' % method.upper()
36+
uri_log = 'uri=%s' % uri
37+
composed_log = method_log + uri_log
38+
for arg in args:
39+
composed_log += ', %s=%s' % (arg, kwargs.get(arg, None))
40+
logger.info(composed_log + '\n' +
41+
'headers=%s \n' % merged_headers +
42+
'data=%s \n' % formatted_data +
43+
'json=%s' % formatted_json)

0 commit comments

Comments
 (0)