From c04fee0eca701370428e912e15772f7b2a1dac50 Mon Sep 17 00:00:00 2001 From: erik1110 Date: Mon, 14 Aug 2023 12:07:42 +0800 Subject: [PATCH 1/8] [feat] add timeout --- tw_invoice/app_client.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tw_invoice/app_client.py b/tw_invoice/app_client.py index d8b7c0a..966e457 100644 --- a/tw_invoice/app_client.py +++ b/tw_invoice/app_client.py @@ -40,6 +40,7 @@ def __init__( ts_tolerance: int = 20, max_retries: int = 20, skip_validation: bool = False, + timeout: tuple = (5, 5), ): self.app_id = app_id self.api_key = api_key @@ -67,6 +68,7 @@ def __init__( ) ), ) + self.timeout = timeout def get_lottery_numbers( self, invoice_term: str @@ -83,7 +85,7 @@ def get_lottery_numbers( "UUID": self.uuid, "appID": self.app_id, } - results = check_api_error(self.session.post(URL, data=data)) + results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) if not self.skip_validation: results = LotteryNumberResponse.parse_obj(results) return results @@ -111,7 +113,7 @@ def get_invoice_header( "UUID": self.uuid, "appID": self.app_id, } - results = check_api_error(self.session.post(URL, data=data)) + results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) if not self.skip_validation: results = InvoiceHeaderResponse.parse_obj(results) return results @@ -183,7 +185,7 @@ def get_invoice_detail( "randomNumber": invoice_random, "appID": self.app_id, } - results = check_api_error(self.session.post(URL, data=data)) + results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) if not self.skip_validation: results = InvoiceDetailResponse.parse_obj(results) return results @@ -199,7 +201,7 @@ def get_love_code(self, query: str) -> dict: "UUID": self.uuid, "appID": self.app_id, } - results = check_api_error(self.session.post(URL, data=data)) + results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) if not self.skip_validation: results = LoveCodeResponse.parse_obj(results) return results @@ -230,7 +232,7 @@ def get_carrier_invoices_header( "appID": self.app_id, "cardEncrypt": card_encrypt, } - results = check_api_error(self.session.post(URL, data=data)) + results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) if not self.skip_validation: results = CarrierInvoicesHeaderResponse.parse_obj(results) return results @@ -265,7 +267,7 @@ def get_carrier_invoices_detail( "appID": self.app_id, "cardEncrypt": card_encrypt, } - results = check_api_error(self.session.post(URL, data=data)) + results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) if not self.skip_validation: results = CarrierInvoicesDetailResponse.parse_obj(results) return results @@ -302,7 +304,7 @@ def carrier_donate_invoice( signature = sign(data, self.api_key) data["signature"] = signature self.serial += 1 - results = check_api_error(self.session.post(URL, data=data)) + results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) if not self.skip_validation: results = CarrierInvoiceDonateResponse.parse_obj(results) return results @@ -330,7 +332,7 @@ def get_aggregate_carrier( signature = sign(data, self.api_key) data["signature"] = signature self.serial += 1 - results = check_api_error(self.session.post(URL, data=data)) + results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) if not self.skip_validation: results = AggregateCarrierResponse.parse_obj(results) return results From 21b74e5026de4d92a8b5d84c63316cd92f7f7137 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 04:19:12 +0000 Subject: [PATCH 2/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tw_invoice/app_client.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/tw_invoice/app_client.py b/tw_invoice/app_client.py index 966e457..01af36f 100644 --- a/tw_invoice/app_client.py +++ b/tw_invoice/app_client.py @@ -85,7 +85,9 @@ def get_lottery_numbers( "UUID": self.uuid, "appID": self.app_id, } - results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) + results = check_api_error( + self.session.post(URL, data=data, timeout=self.timeout) + ) if not self.skip_validation: results = LotteryNumberResponse.parse_obj(results) return results @@ -113,7 +115,9 @@ def get_invoice_header( "UUID": self.uuid, "appID": self.app_id, } - results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) + results = check_api_error( + self.session.post(URL, data=data, timeout=self.timeout) + ) if not self.skip_validation: results = InvoiceHeaderResponse.parse_obj(results) return results @@ -185,7 +189,9 @@ def get_invoice_detail( "randomNumber": invoice_random, "appID": self.app_id, } - results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) + results = check_api_error( + self.session.post(URL, data=data, timeout=self.timeout) + ) if not self.skip_validation: results = InvoiceDetailResponse.parse_obj(results) return results @@ -201,7 +207,9 @@ def get_love_code(self, query: str) -> dict: "UUID": self.uuid, "appID": self.app_id, } - results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) + results = check_api_error( + self.session.post(URL, data=data, timeout=self.timeout) + ) if not self.skip_validation: results = LoveCodeResponse.parse_obj(results) return results @@ -232,7 +240,9 @@ def get_carrier_invoices_header( "appID": self.app_id, "cardEncrypt": card_encrypt, } - results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) + results = check_api_error( + self.session.post(URL, data=data, timeout=self.timeout) + ) if not self.skip_validation: results = CarrierInvoicesHeaderResponse.parse_obj(results) return results @@ -267,7 +277,9 @@ def get_carrier_invoices_detail( "appID": self.app_id, "cardEncrypt": card_encrypt, } - results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) + results = check_api_error( + self.session.post(URL, data=data, timeout=self.timeout) + ) if not self.skip_validation: results = CarrierInvoicesDetailResponse.parse_obj(results) return results @@ -304,7 +316,9 @@ def carrier_donate_invoice( signature = sign(data, self.api_key) data["signature"] = signature self.serial += 1 - results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) + results = check_api_error( + self.session.post(URL, data=data, timeout=self.timeout) + ) if not self.skip_validation: results = CarrierInvoiceDonateResponse.parse_obj(results) return results @@ -332,7 +346,9 @@ def get_aggregate_carrier( signature = sign(data, self.api_key) data["signature"] = signature self.serial += 1 - results = check_api_error(self.session.post(URL, data=data, timeout=self.timeout)) + results = check_api_error( + self.session.post(URL, data=data, timeout=self.timeout) + ) if not self.skip_validation: results = AggregateCarrierResponse.parse_obj(results) return results From 6613ffc280549049b158138eef14478e29d085c6 Mon Sep 17 00:00:00 2001 From: erik1110 Date: Wed, 16 Aug 2023 11:29:02 +0800 Subject: [PATCH 3/8] [feat] change default timeout --- tw_invoice/app_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tw_invoice/app_client.py b/tw_invoice/app_client.py index 966e457..d9ff591 100644 --- a/tw_invoice/app_client.py +++ b/tw_invoice/app_client.py @@ -40,7 +40,7 @@ def __init__( ts_tolerance: int = 20, max_retries: int = 20, skip_validation: bool = False, - timeout: tuple = (5, 5), + timeout: tuple = (3, 1), ): self.app_id = app_id self.api_key = api_key From c360bfb52a199a6f790ac94ebf80bfb814962f38 Mon Sep 17 00:00:00 2001 From: erik1110 Date: Wed, 16 Aug 2023 12:14:08 +0800 Subject: [PATCH 4/8] [feat] add timeout checking and different variants --- tw_invoice/app_client.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tw_invoice/app_client.py b/tw_invoice/app_client.py index d9ff591..127a91e 100644 --- a/tw_invoice/app_client.py +++ b/tw_invoice/app_client.py @@ -1,6 +1,6 @@ from datetime import date from time import time -from typing import Union +from typing import Union, Tuple from uuid import uuid4 try: @@ -40,7 +40,7 @@ def __init__( ts_tolerance: int = 20, max_retries: int = 20, skip_validation: bool = False, - timeout: tuple = (3, 1), + timeout: Union[float, Tuple[float, float], Tuple[float, None]] = (3.0, 1.0), ): self.app_id = app_id self.api_key = api_key @@ -68,6 +68,15 @@ def __init__( ) ), ) + if isinstance(timeout, float) and timeout <= 0: + raise ValueError("For a float timeout, the value must be greater than 0") + if isinstance(timeout, tuple): + if len(timeout) != 2: + raise ValueError("timeout tuple must have 2 elements") + if not (isinstance(timeout[0], float) and (isinstance(timeout[1], float) or timeout[1] is None)): + raise ValueError("For a tuple timeout, the elements must be Tuple[float, float] or Tuple[float, None]") + if timeout[0] <= 0 or (timeout[1] is not None and timeout[1] <= 0): + raise ValueError("For a tuple timeout, both values must be greater than 0 or the second value can be None") self.timeout = timeout def get_lottery_numbers( From 1a07c1b5e4ec871e7ae47f1b6c3c6c5e009316b0 Mon Sep 17 00:00:00 2001 From: erik1110 Date: Wed, 16 Aug 2023 12:20:24 +0800 Subject: [PATCH 5/8] [feat] add test_timeout --- tests/test_app_api_client.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/test_app_api_client.py b/tests/test_app_api_client.py index 9c5c2f6..34d05d3 100644 --- a/tests/test_app_api_client.py +++ b/tests/test_app_api_client.py @@ -21,7 +21,7 @@ TEST_TIME = 1655654400 TEST_TS_TOLERANCE = 30 TEST_UUID = "test_uuid" - +TEST_TIMEOUT = (3.0, 1.0) @pytest.fixture def client(): @@ -86,6 +86,7 @@ def test_get_lottery_numbers(client, mocker): "UUID": TEST_UUID, "appID": TEST_APP_ID, }, + timeout= TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -135,6 +136,7 @@ def test_get_invoice_header(client, mocker): "UUID": TEST_UUID, "appID": TEST_APP_ID, }, + timeout= TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -251,6 +253,7 @@ def test_get_invoice_detail(client, mocker): "randomNumber": TEST_INVOICE_RANDOM, "appID": TEST_APP_ID, }, + timeout= TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -285,6 +288,7 @@ def test_get_invoice_detail(client, mocker): "randomNumber": TEST_INVOICE_RANDOM, "appID": TEST_APP_ID, }, + timeout= TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -306,6 +310,7 @@ def test_get_love_code(client, mocker): "UUID": TEST_UUID, "appID": TEST_APP_ID, }, + timeout= TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -344,6 +349,7 @@ def test_get_carrier_invoices_header(client, mocker): "appID": TEST_APP_ID, "cardEncrypt": TEST_CARD_ENCRYPT, }, + timeout= TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -393,6 +399,7 @@ def test_get_carrier_invoices_detail(client, mocker): "appID": TEST_APP_ID, "cardEncrypt": TEST_CARD_ENCRYPT, }, + timeout= TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -444,6 +451,7 @@ def test_carrier_donate_invoice(client, mocker): "cardEncrypt": TEST_CARD_ENCRYPT, "signature": "Ydmt4alIcCLYG/VBcI+QUdyfgO5Yp8bfX6TPy5xgsVs=", }, + timeout= TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -479,6 +487,7 @@ def test_get_aggregate_carrier(client, mocker): "uuid": TEST_UUID, "signature": "2pWN1GfP6S7oncE56OJetvpxGlE1tFYHeqgNwHmIuw4=", }, + timeout= TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() From 763bce52e9f91b0261eee8217726510c69f78f4f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 04:23:34 +0000 Subject: [PATCH 6/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_app_api_client.py | 19 ++++++++++--------- tw_invoice/app_client.py | 15 +++++++++++---- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/tests/test_app_api_client.py b/tests/test_app_api_client.py index 34d05d3..306aa27 100644 --- a/tests/test_app_api_client.py +++ b/tests/test_app_api_client.py @@ -23,6 +23,7 @@ TEST_UUID = "test_uuid" TEST_TIMEOUT = (3.0, 1.0) + @pytest.fixture def client(): return AppAPIClient(TEST_APP_ID, TEST_API_KEY, TEST_UUID) @@ -86,7 +87,7 @@ def test_get_lottery_numbers(client, mocker): "UUID": TEST_UUID, "appID": TEST_APP_ID, }, - timeout= TEST_TIMEOUT, + timeout=TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -136,7 +137,7 @@ def test_get_invoice_header(client, mocker): "UUID": TEST_UUID, "appID": TEST_APP_ID, }, - timeout= TEST_TIMEOUT, + timeout=TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -253,7 +254,7 @@ def test_get_invoice_detail(client, mocker): "randomNumber": TEST_INVOICE_RANDOM, "appID": TEST_APP_ID, }, - timeout= TEST_TIMEOUT, + timeout=TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -288,7 +289,7 @@ def test_get_invoice_detail(client, mocker): "randomNumber": TEST_INVOICE_RANDOM, "appID": TEST_APP_ID, }, - timeout= TEST_TIMEOUT, + timeout=TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -310,7 +311,7 @@ def test_get_love_code(client, mocker): "UUID": TEST_UUID, "appID": TEST_APP_ID, }, - timeout= TEST_TIMEOUT, + timeout=TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -349,7 +350,7 @@ def test_get_carrier_invoices_header(client, mocker): "appID": TEST_APP_ID, "cardEncrypt": TEST_CARD_ENCRYPT, }, - timeout= TEST_TIMEOUT, + timeout=TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -399,7 +400,7 @@ def test_get_carrier_invoices_detail(client, mocker): "appID": TEST_APP_ID, "cardEncrypt": TEST_CARD_ENCRYPT, }, - timeout= TEST_TIMEOUT, + timeout=TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -451,7 +452,7 @@ def test_carrier_donate_invoice(client, mocker): "cardEncrypt": TEST_CARD_ENCRYPT, "signature": "Ydmt4alIcCLYG/VBcI+QUdyfgO5Yp8bfX6TPy5xgsVs=", }, - timeout= TEST_TIMEOUT, + timeout=TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() @@ -487,7 +488,7 @@ def test_get_aggregate_carrier(client, mocker): "uuid": TEST_UUID, "signature": "2pWN1GfP6S7oncE56OJetvpxGlE1tFYHeqgNwHmIuw4=", }, - timeout= TEST_TIMEOUT, + timeout=TEST_TIMEOUT, ) mocked_check_api_error.assert_called_once() mocked_parse_obj.assert_called_once() diff --git a/tw_invoice/app_client.py b/tw_invoice/app_client.py index 2b402bd..c826c13 100644 --- a/tw_invoice/app_client.py +++ b/tw_invoice/app_client.py @@ -1,6 +1,6 @@ from datetime import date from time import time -from typing import Union, Tuple +from typing import Tuple, Union from uuid import uuid4 try: @@ -73,10 +73,17 @@ def __init__( if isinstance(timeout, tuple): if len(timeout) != 2: raise ValueError("timeout tuple must have 2 elements") - if not (isinstance(timeout[0], float) and (isinstance(timeout[1], float) or timeout[1] is None)): - raise ValueError("For a tuple timeout, the elements must be Tuple[float, float] or Tuple[float, None]") + if not ( + isinstance(timeout[0], float) + and (isinstance(timeout[1], float) or timeout[1] is None) + ): + raise ValueError( + "For a tuple timeout, the elements must be Tuple[float, float] or Tuple[float, None]" + ) if timeout[0] <= 0 or (timeout[1] is not None and timeout[1] <= 0): - raise ValueError("For a tuple timeout, both values must be greater than 0 or the second value can be None") + raise ValueError( + "For a tuple timeout, both values must be greater than 0 or the second value can be None" + ) self.timeout = timeout def get_lottery_numbers( From 5ad8523e9b565b13be03ef9d2cde361d61a761ef Mon Sep 17 00:00:00 2001 From: erik1110 Date: Mon, 21 Aug 2023 15:17:33 +0800 Subject: [PATCH 7/8] [feat] remove validation and change timeout to integer --- tw_invoice/app_client.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/tw_invoice/app_client.py b/tw_invoice/app_client.py index c826c13..09cf539 100644 --- a/tw_invoice/app_client.py +++ b/tw_invoice/app_client.py @@ -40,7 +40,7 @@ def __init__( ts_tolerance: int = 20, max_retries: int = 20, skip_validation: bool = False, - timeout: Union[float, Tuple[float, float], Tuple[float, None]] = (3.0, 1.0), + timeout: Union[float, Tuple[float, float], Tuple[float, None]] = (3, 1), ): self.app_id = app_id self.api_key = api_key @@ -68,22 +68,6 @@ def __init__( ) ), ) - if isinstance(timeout, float) and timeout <= 0: - raise ValueError("For a float timeout, the value must be greater than 0") - if isinstance(timeout, tuple): - if len(timeout) != 2: - raise ValueError("timeout tuple must have 2 elements") - if not ( - isinstance(timeout[0], float) - and (isinstance(timeout[1], float) or timeout[1] is None) - ): - raise ValueError( - "For a tuple timeout, the elements must be Tuple[float, float] or Tuple[float, None]" - ) - if timeout[0] <= 0 or (timeout[1] is not None and timeout[1] <= 0): - raise ValueError( - "For a tuple timeout, both values must be greater than 0 or the second value can be None" - ) self.timeout = timeout def get_lottery_numbers( From 3f3c29bfc887f453aa8fe25eae9609b7e27ec7cc Mon Sep 17 00:00:00 2001 From: erik1110 Date: Mon, 21 Aug 2023 15:20:15 +0800 Subject: [PATCH 8/8] [feat] change timeout to integer --- tests/test_app_api_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_app_api_client.py b/tests/test_app_api_client.py index 306aa27..7b36138 100644 --- a/tests/test_app_api_client.py +++ b/tests/test_app_api_client.py @@ -21,7 +21,7 @@ TEST_TIME = 1655654400 TEST_TS_TOLERANCE = 30 TEST_UUID = "test_uuid" -TEST_TIMEOUT = (3.0, 1.0) +TEST_TIMEOUT = (3, 1) @pytest.fixture