Skip to content

Commit a4a5e8d

Browse files
author
Markus Bong
authored
Merge pull request #36 from devolo/session
Use request sessions
2 parents 7b09c90 + 7547d31 commit a4a5e8d

File tree

3 files changed

+26
-20
lines changed

3 files changed

+26
-20
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [2.3.1] - 2022/12/02
8+
9+
### Fixed
10+
11+
- Use request sessions to reduce overhead
12+
713
## [2.3.0] - 2022/09/16
814

915
### Added

adaptavist/adaptavist.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import requests
99
import requests_toolbelt
10+
from requests.auth import HTTPBasicAuth
1011

1112
from ._helper import build_folder_names, get_executor, raise_on_kwargs_not_empty, update_field, update_multiline_field
1213
from .const import PRIORITY_NORMAL, STATUS_APPROVED, STATUS_NOT_EXECUTED, STEP_TYPE_BY_STEP, TEST_CASE, TEST_PLAN, TEST_RUN
@@ -26,11 +27,16 @@ def __init__(self, jira_server: str, jira_username: str, jira_password: str):
2627
self.jira_server = jira_server
2728
self.jira_username = jira_username
2829

30+
self._session = requests.Session()
2931
self._adaptavist_api_url = f"{self.jira_server}/rest/atm/1.0"
30-
self._authentication = requests.auth.HTTPBasicAuth(self.jira_username, jira_password)
31-
self._headers = {"Accept": "application/json", "Content-type": "application/json"}
32+
self._session.auth = HTTPBasicAuth(self.jira_username, jira_password)
33+
self._session.headers.update({"Accept": "application/json", "Content-type": "application/json"})
3234
self._logger = logging.getLogger(__name__)
3335

36+
def __del__(self):
37+
"""Close session."""
38+
self._session.close()
39+
3440
def get_users(self) -> List[str]:
3541
"""
3642
Get a list of users known to Adaptavist/Jira.
@@ -990,7 +996,7 @@ def add_test_script_attachment(
990996
def _delete(self, request_url: str) -> Optional[requests.Response]:
991997
"""DELETE data from Jira/Adaptavist."""
992998
try:
993-
request = requests.delete(request_url, auth=self._authentication, headers=self._headers, timeout=60)
999+
request = self._session.delete(request_url, timeout=60)
9941000
request.raise_for_status()
9951001
except (
9961002
requests.exceptions.ConnectionError,
@@ -1004,7 +1010,7 @@ def _delete(self, request_url: str) -> Optional[requests.Response]:
10041010
def _get(self, request_url: str) -> Optional[requests.Response]:
10051011
"""GET data from Jira/Adaptavist."""
10061012
try:
1007-
request = requests.get(request_url, auth=self._authentication, headers=self._headers, timeout=60)
1013+
request = self._session.get(request_url, timeout=60)
10081014
request.raise_for_status()
10091015
except (
10101016
requests.exceptions.ConnectionError,
@@ -1018,9 +1024,7 @@ def _get(self, request_url: str) -> Optional[requests.Response]:
10181024
def _post(self, request_url: str, data: Any) -> Optional[requests.Response]:
10191025
"""POST data to Jira/Adaptavist."""
10201026
try:
1021-
request = requests.post(
1022-
request_url, auth=self._authentication, headers=self._headers, data=json.dumps(data), timeout=60
1023-
)
1027+
request = self._session.post(request_url, data=json.dumps(data), timeout=60)
10241028
request.raise_for_status()
10251029
except requests.exceptions.HTTPError as ex:
10261030
self._logger.error("request failed. %s %s", ex, request.text)
@@ -1033,9 +1037,7 @@ def _post(self, request_url: str, data: Any) -> Optional[requests.Response]:
10331037
def _put(self, request_url: str, data: Any) -> Optional[requests.Response]:
10341038
"""PUT data to Jira/Adaptavist."""
10351039
try:
1036-
request = requests.put(
1037-
request_url, auth=self._authentication, headers=self._headers, data=json.dumps(data), timeout=60
1038-
)
1040+
request = self._session.put(request_url, data=json.dumps(data), timeout=60)
10391041
request.raise_for_status()
10401042
except requests.exceptions.HTTPError as ex:
10411043
self._logger.error("request failed. %s %s", ex, request.text)
@@ -1049,17 +1051,15 @@ def _upload_file(self, request_url: str, attachment: BinaryIO, filename: str) ->
10491051
"""Upload file to Adaptavist."""
10501052
stream = requests_toolbelt.MultipartEncoder(fields={"file": (filename, attachment, "application/octet-stream")})
10511053
headers = {
1052-
**self._headers,
1054+
**self._session.headers,
10531055
"Content-type": stream.content_type,
10541056
"X-Atlassian-Token": "nocheck",
10551057
}
10561058

10571059
filename = filename or attachment.name
10581060

10591061
try:
1060-
request = requests.post(
1061-
request_url, auth=self._authentication, headers=headers, data=stream
1062-
) # pylint: disable=missing-timeout
1062+
request = self._session.post(request_url, headers=headers, data=stream) # pylint: disable=missing-timeout
10631063
request.raise_for_status()
10641064
except (
10651065
requests.exceptions.ConnectionError,

tests/test_adaptavist.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ def test_add_test_result_attachment(self):
536536

537537
with patch("adaptavist.Adaptavist.get_test_result", return_value={"id": 123}), patch(
538538
"builtins.open", mock_open()
539-
), patch("requests_toolbelt.MultipartEncoder"), patch("requests.post"):
539+
), patch("requests_toolbelt.MultipartEncoder"), patch("requests.Session.post"):
540540
assert adaptavist.add_test_result_attachment(
541541
test_run_key="JQA-R123", test_case_key="JQA-T123", attachment="testfile", filename="testfile"
542542
)
@@ -550,7 +550,7 @@ def test_add_test_result_attachment(self):
550550
# Test that we can handle IO objects
551551
with patch("adaptavist.Adaptavist.get_test_result", return_value={"id": 123}), patch(
552552
"requests_toolbelt.MultipartEncoder"
553-
), patch("requests.post"):
553+
), patch("requests.Session.post"):
554554
attachment = BytesIO(b"Testdata")
555555
attachment.name = "testdata.txt"
556556
assert adaptavist.add_test_result_attachment(
@@ -563,7 +563,7 @@ def test_add_test_run_attachment(self):
563563

564564
with patch("adaptavist.Adaptavist.get_test_result", return_value={"id": 123}), patch(
565565
"builtins.open", mock_open()
566-
), patch("requests_toolbelt.MultipartEncoder"), patch("requests.post"):
566+
), patch("requests_toolbelt.MultipartEncoder"), patch("requests.Session.post"):
567567
assert adaptavist.add_test_run_attachment(test_run_key="JQA-R123", attachment="testfile", filename="testfile")
568568

569569
# Test that a file name is needed, if no file handle is given
@@ -573,7 +573,7 @@ def test_add_test_run_attachment(self):
573573
# Test that we can handle IO objects
574574
with patch("adaptavist.Adaptavist.get_test_result", return_value={"id": 123}), patch(
575575
"requests_toolbelt.MultipartEncoder"
576-
), patch("requests.post"):
576+
), patch("requests.Session.post"):
577577
attachment = BytesIO(b"Testdata")
578578
attachment.name = "testdata.txt"
579579
assert adaptavist.add_test_run_attachment(test_run_key="JQA-R123", attachment=attachment)
@@ -645,7 +645,7 @@ def test_add_test_script_attachment(self):
645645

646646
with patch("adaptavist.Adaptavist.get_test_result", return_value={"id": 123}), patch(
647647
"builtins.open", mock_open()
648-
), patch("requests_toolbelt.MultipartEncoder"), patch("requests.post"):
648+
), patch("requests_toolbelt.MultipartEncoder"), patch("requests.Session.post"):
649649
assert adaptavist.add_test_script_attachment(
650650
test_run_key="JQA-R123", test_case_key="JQA-T123", step=1, attachment="testfile", filename="testfile"
651651
)
@@ -659,7 +659,7 @@ def test_add_test_script_attachment(self):
659659
# Test that we can handle IO objects
660660
with patch("adaptavist.Adaptavist.get_test_result", return_value={"id": 123}), patch(
661661
"requests_toolbelt.MultipartEncoder"
662-
), patch("requests.post"):
662+
), patch("requests.Session.post"):
663663
attachment = BytesIO(b"Testdata")
664664
attachment.name = "testdata.txt"
665665
assert adaptavist.add_test_script_attachment(

0 commit comments

Comments
 (0)