From 7e18d97707c0972db56a34ee183aff5834a719ae Mon Sep 17 00:00:00 2001 From: Kamil Pajdzik Date: Tue, 2 Aug 2022 17:05:39 -0700 Subject: [PATCH 1/9] Hotfix incorrect handling of additional request parameters --- stripe/api_resources/abstract/api_resource.py | 32 +++++++++++++++++++ stripe/stripe_object.py | 17 ++++++++++ 2 files changed, 49 insertions(+) diff --git a/stripe/api_resources/abstract/api_resource.py b/stripe/api_resources/abstract/api_resource.py index 664ea1c93..92808aa4a 100644 --- a/stripe/api_resources/abstract/api_resource.py +++ b/stripe/api_resources/abstract/api_resource.py @@ -115,6 +115,22 @@ def _static_request( stripe_account=None, params=None, ): + if api_key is None and 'api_key' in params: + api_key = params['api_key']; + del params['api_key'] + + if idempotency_key is None and 'idempotency_key' in params: + idempotency_key = params['idempotency_key']; + del params['idempotency_key'] + + if stripe_version is None and 'stripe_version' in params: + stripe_version = params['stripe_version']; + del params['stripe_version'] + + if stripe_account is None and 'stripe_account' in params: + stripe_account = params['stripe_account']; + del params['stripe_account'] + requestor = api_requestor.APIRequestor( api_key, api_version=stripe_version, account=stripe_account ) @@ -137,6 +153,22 @@ def _static_request_stream( stripe_account=None, params=None, ): + if api_key is None and 'api_key' in params: + api_key = params['api_key']; + del params['api_key'] + + if idempotency_key is None and 'idempotency_key' in params: + idempotency_key = params['idempotency_key']; + del params['idempotency_key'] + + if stripe_version is None and 'stripe_version' in params: + stripe_version = params['stripe_version']; + del params['stripe_version'] + + if stripe_account is None and 'stripe_account' in params: + stripe_account = params['stripe_account']; + del params['stripe_account'] + requestor = api_requestor.APIRequestor( api_key, api_version=stripe_version, account=stripe_account ) diff --git a/stripe/stripe_object.py b/stripe/stripe_object.py index a06cedd2e..25f939fad 100644 --- a/stripe/stripe_object.py +++ b/stripe/stripe_object.py @@ -250,11 +250,28 @@ def _request( headers=None, params=None, ): + stripe_account = stripe_account or self.stripe_account stripe_version = stripe_version or self.stripe_version api_key = api_key or self.api_key params = params or self._retrieve_params + if api_key is None and 'api_key' in params: + api_key = params['api_key']; + del params['api_key'] + + if idempotency_key is None and 'idempotency_key' in params: + idempotency_key = params['idempotency_key']; + del params['idempotency_key'] + + if stripe_version is None and 'stripe_version' in params: + stripe_version = params['stripe_version']; + del params['stripe_version'] + + if stripe_account is None and 'stripe_account' in params: + stripe_account = params['stripe_account']; + del params['stripe_account'] + requestor = api_requestor.APIRequestor( key=api_key, api_base=self.api_base(), From 378d3840132d7a47f846bfd51b0530315455e84d Mon Sep 17 00:00:00 2001 From: Kamil Pajdzik Date: Tue, 2 Aug 2022 17:08:44 -0700 Subject: [PATCH 2/9] Remove semicolons --- stripe/api_resources/abstract/api_resource.py | 16 ++++++++-------- stripe/stripe_object.py | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/stripe/api_resources/abstract/api_resource.py b/stripe/api_resources/abstract/api_resource.py index 92808aa4a..52e40aeb0 100644 --- a/stripe/api_resources/abstract/api_resource.py +++ b/stripe/api_resources/abstract/api_resource.py @@ -116,19 +116,19 @@ def _static_request( params=None, ): if api_key is None and 'api_key' in params: - api_key = params['api_key']; + api_key = params['api_key'] del params['api_key'] if idempotency_key is None and 'idempotency_key' in params: - idempotency_key = params['idempotency_key']; + idempotency_key = params['idempotency_key'] del params['idempotency_key'] if stripe_version is None and 'stripe_version' in params: - stripe_version = params['stripe_version']; + stripe_version = params['stripe_version'] del params['stripe_version'] if stripe_account is None and 'stripe_account' in params: - stripe_account = params['stripe_account']; + stripe_account = params['stripe_account'] del params['stripe_account'] requestor = api_requestor.APIRequestor( @@ -154,19 +154,19 @@ def _static_request_stream( params=None, ): if api_key is None and 'api_key' in params: - api_key = params['api_key']; + api_key = params['api_key'] del params['api_key'] if idempotency_key is None and 'idempotency_key' in params: - idempotency_key = params['idempotency_key']; + idempotency_key = params['idempotency_key'] del params['idempotency_key'] if stripe_version is None and 'stripe_version' in params: - stripe_version = params['stripe_version']; + stripe_version = params['stripe_version'] del params['stripe_version'] if stripe_account is None and 'stripe_account' in params: - stripe_account = params['stripe_account']; + stripe_account = params['stripe_account'] del params['stripe_account'] requestor = api_requestor.APIRequestor( diff --git a/stripe/stripe_object.py b/stripe/stripe_object.py index 25f939fad..4e6327d73 100644 --- a/stripe/stripe_object.py +++ b/stripe/stripe_object.py @@ -257,19 +257,19 @@ def _request( params = params or self._retrieve_params if api_key is None and 'api_key' in params: - api_key = params['api_key']; + api_key = params['api_key'] del params['api_key'] if idempotency_key is None and 'idempotency_key' in params: - idempotency_key = params['idempotency_key']; + idempotency_key = params['idempotency_key'] del params['idempotency_key'] if stripe_version is None and 'stripe_version' in params: - stripe_version = params['stripe_version']; + stripe_version = params['stripe_version'] del params['stripe_version'] if stripe_account is None and 'stripe_account' in params: - stripe_account = params['stripe_account']; + stripe_account = params['stripe_account'] del params['stripe_account'] requestor = api_requestor.APIRequestor( From 390be290bf7eabf455b7ec78711eb4e7b13c109a Mon Sep 17 00:00:00 2001 From: Kamil Pajdzik Date: Tue, 2 Aug 2022 17:28:48 -0700 Subject: [PATCH 3/9] Check for empty params --- stripe/api_resources/abstract/api_resource.py | 48 +++++++++---------- stripe/stripe_object.py | 24 +++++----- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/stripe/api_resources/abstract/api_resource.py b/stripe/api_resources/abstract/api_resource.py index 52e40aeb0..d28ea0f90 100644 --- a/stripe/api_resources/abstract/api_resource.py +++ b/stripe/api_resources/abstract/api_resource.py @@ -115,21 +115,21 @@ def _static_request( stripe_account=None, params=None, ): - if api_key is None and 'api_key' in params: - api_key = params['api_key'] - del params['api_key'] + if api_key is None and params and "api_key" in params: + api_key = params["api_key"] + del params["api_key"] - if idempotency_key is None and 'idempotency_key' in params: - idempotency_key = params['idempotency_key'] - del params['idempotency_key'] + if idempotency_key is None and params and "idempotency_key" in params: + idempotency_key = params["idempotency_key"] + del params["idempotency_key"] - if stripe_version is None and 'stripe_version' in params: - stripe_version = params['stripe_version'] - del params['stripe_version'] + if stripe_version is None and params and "stripe_version" in params: + stripe_version = params["stripe_version"] + del params["stripe_version"] - if stripe_account is None and 'stripe_account' in params: - stripe_account = params['stripe_account'] - del params['stripe_account'] + if stripe_account is None and params and "stripe_account" in params: + stripe_account = params["stripe_account"] + del params["stripe_account"] requestor = api_requestor.APIRequestor( api_key, api_version=stripe_version, account=stripe_account @@ -153,21 +153,21 @@ def _static_request_stream( stripe_account=None, params=None, ): - if api_key is None and 'api_key' in params: - api_key = params['api_key'] - del params['api_key'] + if api_key is None and params and "api_key" in params: + api_key = params["api_key"] + del params["api_key"] - if idempotency_key is None and 'idempotency_key' in params: - idempotency_key = params['idempotency_key'] - del params['idempotency_key'] + if idempotency_key is None and params and "idempotency_key" in params: + idempotency_key = params["idempotency_key"] + del params["idempotency_key"] - if stripe_version is None and 'stripe_version' in params: - stripe_version = params['stripe_version'] - del params['stripe_version'] + if stripe_version is None and params and "stripe_version" in params: + stripe_version = params["stripe_version"] + del params["stripe_version"] - if stripe_account is None and 'stripe_account' in params: - stripe_account = params['stripe_account'] - del params['stripe_account'] + if stripe_account is None and params and "stripe_account" in params: + stripe_account = params["stripe_account"] + del params["stripe_account"] requestor = api_requestor.APIRequestor( api_key, api_version=stripe_version, account=stripe_account diff --git a/stripe/stripe_object.py b/stripe/stripe_object.py index 4e6327d73..e72a6ec00 100644 --- a/stripe/stripe_object.py +++ b/stripe/stripe_object.py @@ -256,21 +256,21 @@ def _request( api_key = api_key or self.api_key params = params or self._retrieve_params - if api_key is None and 'api_key' in params: - api_key = params['api_key'] - del params['api_key'] + if api_key is None and params and "api_key" in params: + api_key = params["api_key"] + del params["api_key"] - if idempotency_key is None and 'idempotency_key' in params: - idempotency_key = params['idempotency_key'] - del params['idempotency_key'] + if idempotency_key is None and params and "idempotency_key" in params: + idempotency_key = params["idempotency_key"] + del params["idempotency_key"] - if stripe_version is None and 'stripe_version' in params: - stripe_version = params['stripe_version'] - del params['stripe_version'] + if stripe_version is None and params and "stripe_version" in params: + stripe_version = params["stripe_version"] + del params["stripe_version"] - if stripe_account is None and 'stripe_account' in params: - stripe_account = params['stripe_account'] - del params['stripe_account'] + if stripe_account is None and params and "stripe_account" in params: + stripe_account = params["stripe_account"] + del params["stripe_account"] requestor = api_requestor.APIRequestor( key=api_key, From 43f397745a5ed288e220f9864bd0be846b1bff7c Mon Sep 17 00:00:00 2001 From: Kamil Pajdzik Date: Tue, 2 Aug 2022 17:37:52 -0700 Subject: [PATCH 4/9] Add headers parameter to check --- stripe/stripe_object.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stripe/stripe_object.py b/stripe/stripe_object.py index e72a6ec00..f7ad93ce6 100644 --- a/stripe/stripe_object.py +++ b/stripe/stripe_object.py @@ -272,6 +272,10 @@ def _request( stripe_account = params["stripe_account"] del params["stripe_account"] + if headers is None and params and "headers" in params: + headers = params["headers"] + del params["headers"] + requestor = api_requestor.APIRequestor( key=api_key, api_base=self.api_base(), From de9dcaab25e520e3f2d0bac496a5c265beab0f19 Mon Sep 17 00:00:00 2001 From: Kamil Pajdzik Date: Tue, 2 Aug 2022 17:40:08 -0700 Subject: [PATCH 5/9] Remove extra line --- stripe/stripe_object.py | 1 - 1 file changed, 1 deletion(-) diff --git a/stripe/stripe_object.py b/stripe/stripe_object.py index f7ad93ce6..9dc925808 100644 --- a/stripe/stripe_object.py +++ b/stripe/stripe_object.py @@ -250,7 +250,6 @@ def _request( headers=None, params=None, ): - stripe_account = stripe_account or self.stripe_account stripe_version = stripe_version or self.stripe_version api_key = api_key or self.api_key From f06fee533a642f337fae4ed74bf592c42c7d337e Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 2 Aug 2022 21:34:24 -0700 Subject: [PATCH 6/9] some fixes and tests --- stripe/api_resources/abstract/api_resource.py | 26 ++--- stripe/stripe_object.py | 26 +---- stripe/util.py | 15 +++ .../abstract/test_custom_method.py | 107 ++++++++++++++++++ .../abstract/test_deletable_api_resource.py | 24 ++++ .../abstract/test_updateable_api_resource.py | 28 +++++ 6 files changed, 190 insertions(+), 36 deletions(-) diff --git a/stripe/api_resources/abstract/api_resource.py b/stripe/api_resources/abstract/api_resource.py index d28ea0f90..d49db73f6 100644 --- a/stripe/api_resources/abstract/api_resource.py +++ b/stripe/api_resources/abstract/api_resource.py @@ -115,26 +115,20 @@ def _static_request( stripe_account=None, params=None, ): - if api_key is None and params and "api_key" in params: - api_key = params["api_key"] - del params["api_key"] - - if idempotency_key is None and params and "idempotency_key" in params: - idempotency_key = params["idempotency_key"] - del params["idempotency_key"] - - if stripe_version is None and params and "stripe_version" in params: - stripe_version = params["stripe_version"] - del params["stripe_version"] - - if stripe_account is None and params and "stripe_account" in params: - stripe_account = params["stripe_account"] - del params["stripe_account"] + params, api_key = util.read_special_variable(params, "api_key", api_key) + params, idempotency_key = util.read_special_variable(params, "idempotency_key", idempotency_key) + params, stripe_version = util.read_special_variable(params, "stripe_version", stripe_version) + params, stripe_account = util.read_special_variable(params, "stripe_account", stripe_account) + params, headers = util.read_special_variable(params, "headers", None) requestor = api_requestor.APIRequestor( api_key, api_version=stripe_version, account=stripe_account ) - headers = util.populate_headers(idempotency_key) + + if idempotency_key is not None: + headers = {} if headers is None else headers.copy() + headers.update(util.populate_headers(idempotency_key)) + response, api_key = requestor.request(method_, url_, params, headers) return util.convert_to_stripe_object( response, api_key, stripe_version, stripe_account, params diff --git a/stripe/stripe_object.py b/stripe/stripe_object.py index 9dc925808..a51d1e04c 100644 --- a/stripe/stripe_object.py +++ b/stripe/stripe_object.py @@ -250,31 +250,17 @@ def _request( headers=None, params=None, ): + params, api_key = util.read_special_variable(params, "api_key", api_key) + params, idempotency_key = util.read_special_variable(params, "idempotency_key", idempotency_key) + params, stripe_version = util.read_special_variable(params, "stripe_version", stripe_version) + params, stripe_account = util.read_special_variable(params, "stripe_account", stripe_account) + params, headers = util.read_special_variable(params, "headers", headers) + stripe_account = stripe_account or self.stripe_account stripe_version = stripe_version or self.stripe_version api_key = api_key or self.api_key params = params or self._retrieve_params - if api_key is None and params and "api_key" in params: - api_key = params["api_key"] - del params["api_key"] - - if idempotency_key is None and params and "idempotency_key" in params: - idempotency_key = params["idempotency_key"] - del params["idempotency_key"] - - if stripe_version is None and params and "stripe_version" in params: - stripe_version = params["stripe_version"] - del params["stripe_version"] - - if stripe_account is None and params and "stripe_account" in params: - stripe_account = params["stripe_account"] - del params["stripe_account"] - - if headers is None and params and "headers" in params: - headers = params["headers"] - del params["headers"] - requestor = api_requestor.APIRequestor( key=api_key, api_base=self.api_base(), diff --git a/stripe/util.py b/stripe/util.py index 619f9cb1f..d4efcd120 100644 --- a/stripe/util.py +++ b/stripe/util.py @@ -210,6 +210,21 @@ def populate_headers(idempotency_key): return None +def read_special_variable(params, key_name, default_value): + value = default_value + params_value = None + + if params is not None and key_name in params: + params_value = params[key_name] + params = params.copy() + del params[key_name] + + if value is None: + value = params_value + + return params, value + + def merge_dicts(x, y): z = x.copy() z.update(y) diff --git a/tests/api_resources/abstract/test_custom_method.py b/tests/api_resources/abstract/test_custom_method.py index f02a87e9e..b4e329dc0 100644 --- a/tests/api_resources/abstract/test_custom_method.py +++ b/tests/api_resources/abstract/test_custom_method.py @@ -31,6 +31,37 @@ def do_stream_stuff(self, idempotency_key=None, **params): headers = util.populate_headers(idempotency_key) return self.request_stream("post", url, params, headers) + @classmethod + def _cls_do_stuff_new_codegen( + cls, + id, + api_key=None, + stripe_version=None, + stripe_account=None, + **params + ): + return cls._static_request( + "post", + "/v1/myresources/{id}/do_the_thing".format( + id=util.sanitize_id(id) + ), + api_key=api_key, + stripe_version=stripe_version, + stripe_account=stripe_account, + params=params, + ) + + @util.class_method_variant("_cls_do_stuff_new_codegen") + def do_stuff_new_codegen(self, idempotency_key=None, **params): + return self._request( + "post", + "/v1/myresources/{id}/do_the_thing".format( + id=util.sanitize_id(self.get("id")) + ), + idempotency_key=idempotency_key, + params=params, + ) + def test_call_custom_method_class(self, request_mock): request_mock.stub_request( "post", @@ -193,3 +224,79 @@ def test_call_custom_stream_method_instance(self, request_mock): body_content = body_content.decode("utf-8") assert body_content == "response body" + + def test_call_custom_method_class_special_fields(self, request_mock): + request_mock.stub_request( + "post", + "/v1/myresources/mid/do_the_thing", + {"id": "mid", "thing_done": True}, + rheaders={"request-id": "req_id"}, + ) + + self.MyResource.do_stuff("mid", + foo="bar", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc" + ) + + request_mock.assert_requested( + "post", + "/v1/myresources/mid/do_the_thing", + {"foo": "bar"}, + {"Idempotency-Key": "IdempotencyKey"}, + ) + request_mock.assert_api_version("2017-08-15") + + def test_call_custom_method_class_newcodegen_special_fields(self, request_mock): + request_mock.stub_request( + "post", + "/v1/myresources/mid/do_the_thing", + {"id": "mid", "thing_done": True}, + rheaders={"request-id": "req_id"}, + ) + + self.MyResource.do_stuff_new_codegen("mid", + foo="bar", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc" + ) + + request_mock.assert_requested( + "post", + "/v1/myresources/mid/do_the_thing", + {"foo": "bar"}, + {"Idempotency-Key": "IdempotencyKey"}, + ) + request_mock.assert_api_version("2017-08-15") + + def test_call_custom_method_instance_newcodegen_special_fields(self, request_mock): + request_mock.stub_request( + "post", + "/v1/myresources/mid/do_the_thing", + {"id": "mid", "thing_done": True}, + rheaders={"request-id": "req_id"}, + ) + + obj = self.MyResource.construct_from({"id": "mid"}, "mykey") + obj.do_stuff_new_codegen(foo="bar", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc", + headers={"extra_header": "val"}, + ) + + request_mock.assert_requested( + "post", + "/v1/myresources/mid/do_the_thing", + {"foo": "bar"}, + { + "Idempotency-Key": "IdempotencyKey", + "extra_header": "val" + }, + ) + request_mock.assert_api_version("2017-08-15") diff --git a/tests/api_resources/abstract/test_deletable_api_resource.py b/tests/api_resources/abstract/test_deletable_api_resource.py index e8a452c8b..ff5aed680 100644 --- a/tests/api_resources/abstract/test_deletable_api_resource.py +++ b/tests/api_resources/abstract/test_deletable_api_resource.py @@ -60,3 +60,27 @@ def test_delete_instance(self, request_mock): assert obj.last_response is not None assert obj.last_response.request_id == "req_id" + + def test_delete_with_all_special_fields(self, request_mock): + request_mock.stub_request( + "delete", + "/v1/mydeletables/foo", + {"id": "foo", "bobble": "new_scrobble"}, + {"Idempotency-Key": "IdempotencyKey"}, + ) + + self.MyDeletable.delete("foo", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc", + bobble="new_scrobble" + ) + + request_mock.assert_requested( + "delete", + "/v1/mydeletables/foo", + {"bobble": "new_scrobble"}, + {"Idempotency-Key": "IdempotencyKey"}, + ) + request_mock.assert_api_version("2017-08-15") diff --git a/tests/api_resources/abstract/test_updateable_api_resource.py b/tests/api_resources/abstract/test_updateable_api_resource.py index 21c577459..cadcb914d 100644 --- a/tests/api_resources/abstract/test_updateable_api_resource.py +++ b/tests/api_resources/abstract/test_updateable_api_resource.py @@ -346,3 +346,31 @@ def test_retrieve_and_update_with_stripe_version(self, request_mock, obj): res.save() request_mock.assert_api_version("2017-08-15") + + def test_modify_with_all_special_fields(self, request_mock, obj): + request_mock.stub_request( + "post", + "/v1/myupdateables/foo", + {"id": "foo", "bobble": "new_scrobble"}, + {"Idempotency-Key": "IdempotencyKey"}, + ) + + self.MyUpdateable.modify("foo", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc", + bobble="new_scrobble", + headers={"extra_header": "val"}, + ) + + request_mock.assert_requested( + "post", + "/v1/myupdateables/foo", + {"bobble": "new_scrobble"}, + { + "Idempotency-Key": "IdempotencyKey", + "extra_header": "val" + }, + ) + request_mock.assert_api_version("2017-08-15") From ca65d9f0cb6b4278d06cf5a093ff57f0aa45445b Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 2 Aug 2022 21:44:49 -0700 Subject: [PATCH 7/9] fb and lint --- stripe/api_resources/abstract/api_resource.py | 50 +++++++++------- stripe/stripe_object.py | 17 ++++-- stripe/util.py | 3 +- .../abstract/test_custom_method.py | 58 ++++++++++--------- .../abstract/test_deletable_api_resource.py | 15 ++--- .../abstract/test_updateable_api_resource.py | 22 ++++--- 6 files changed, 91 insertions(+), 74 deletions(-) diff --git a/stripe/api_resources/abstract/api_resource.py b/stripe/api_resources/abstract/api_resource.py index d49db73f6..c2bcd8c61 100644 --- a/stripe/api_resources/abstract/api_resource.py +++ b/stripe/api_resources/abstract/api_resource.py @@ -115,11 +115,18 @@ def _static_request( stripe_account=None, params=None, ): - params, api_key = util.read_special_variable(params, "api_key", api_key) - params, idempotency_key = util.read_special_variable(params, "idempotency_key", idempotency_key) - params, stripe_version = util.read_special_variable(params, "stripe_version", stripe_version) - params, stripe_account = util.read_special_variable(params, "stripe_account", stripe_account) - params, headers = util.read_special_variable(params, "headers", None) + params = None if params is None else params.copy() + api_key = util.read_special_variable(params, "api_key", api_key) + idempotency_key = util.read_special_variable( + params, "idempotency_key", idempotency_key + ) + stripe_version = util.read_special_variable( + params, "stripe_version", stripe_version + ) + stripe_account = util.read_special_variable( + params, "stripe_account", stripe_account + ) + headers = util.read_special_variable(params, "headers", None) requestor = api_requestor.APIRequestor( api_key, api_version=stripe_version, account=stripe_account @@ -147,25 +154,26 @@ def _static_request_stream( stripe_account=None, params=None, ): - if api_key is None and params and "api_key" in params: - api_key = params["api_key"] - del params["api_key"] - - if idempotency_key is None and params and "idempotency_key" in params: - idempotency_key = params["idempotency_key"] - del params["idempotency_key"] - - if stripe_version is None and params and "stripe_version" in params: - stripe_version = params["stripe_version"] - del params["stripe_version"] - - if stripe_account is None and params and "stripe_account" in params: - stripe_account = params["stripe_account"] - del params["stripe_account"] + params = None if params is None else params.copy() + api_key = util.read_special_variable(params, "api_key", api_key) + idempotency_key = util.read_special_variable( + params, "idempotency_key", idempotency_key + ) + stripe_version = util.read_special_variable( + params, "stripe_version", stripe_version + ) + stripe_account = util.read_special_variable( + params, "stripe_account", stripe_account + ) + headers = util.read_special_variable(params, "headers", None) requestor = api_requestor.APIRequestor( api_key, api_version=stripe_version, account=stripe_account ) - headers = util.populate_headers(idempotency_key) + + if idempotency_key is not None: + headers = {} if headers is None else headers.copy() + headers.update(util.populate_headers(idempotency_key)) + response, _ = requestor.request_stream(method_, url_, params, headers) return response diff --git a/stripe/stripe_object.py b/stripe/stripe_object.py index a51d1e04c..80ca5d664 100644 --- a/stripe/stripe_object.py +++ b/stripe/stripe_object.py @@ -250,11 +250,18 @@ def _request( headers=None, params=None, ): - params, api_key = util.read_special_variable(params, "api_key", api_key) - params, idempotency_key = util.read_special_variable(params, "idempotency_key", idempotency_key) - params, stripe_version = util.read_special_variable(params, "stripe_version", stripe_version) - params, stripe_account = util.read_special_variable(params, "stripe_account", stripe_account) - params, headers = util.read_special_variable(params, "headers", headers) + params = None if params is None else params.copy() + api_key = util.read_special_variable(params, "api_key", api_key) + idempotency_key = util.read_special_variable( + params, "idempotency_key", idempotency_key + ) + stripe_version = util.read_special_variable( + params, "stripe_version", stripe_version + ) + stripe_account = util.read_special_variable( + params, "stripe_account", stripe_account + ) + headers = util.read_special_variable(params, "headers", headers) stripe_account = stripe_account or self.stripe_account stripe_version = stripe_version or self.stripe_version diff --git a/stripe/util.py b/stripe/util.py index d4efcd120..d4c55392f 100644 --- a/stripe/util.py +++ b/stripe/util.py @@ -216,13 +216,12 @@ def read_special_variable(params, key_name, default_value): if params is not None and key_name in params: params_value = params[key_name] - params = params.copy() del params[key_name] if value is None: value = params_value - return params, value + return value def merge_dicts(x, y): diff --git a/tests/api_resources/abstract/test_custom_method.py b/tests/api_resources/abstract/test_custom_method.py index b4e329dc0..f3471ebf6 100644 --- a/tests/api_resources/abstract/test_custom_method.py +++ b/tests/api_resources/abstract/test_custom_method.py @@ -233,13 +233,14 @@ def test_call_custom_method_class_special_fields(self, request_mock): rheaders={"request-id": "req_id"}, ) - self.MyResource.do_stuff("mid", - foo="bar", - stripe_version="2017-08-15", - api_key="APIKEY", - idempotency_key="IdempotencyKey", - stripe_account="Acc" - ) + self.MyResource.do_stuff( + "mid", + foo="bar", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc", + ) request_mock.assert_requested( "post", @@ -249,7 +250,9 @@ def test_call_custom_method_class_special_fields(self, request_mock): ) request_mock.assert_api_version("2017-08-15") - def test_call_custom_method_class_newcodegen_special_fields(self, request_mock): + def test_call_custom_method_class_newcodegen_special_fields( + self, request_mock + ): request_mock.stub_request( "post", "/v1/myresources/mid/do_the_thing", @@ -257,13 +260,14 @@ def test_call_custom_method_class_newcodegen_special_fields(self, request_mock): rheaders={"request-id": "req_id"}, ) - self.MyResource.do_stuff_new_codegen("mid", - foo="bar", - stripe_version="2017-08-15", - api_key="APIKEY", - idempotency_key="IdempotencyKey", - stripe_account="Acc" - ) + self.MyResource.do_stuff_new_codegen( + "mid", + foo="bar", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc", + ) request_mock.assert_requested( "post", @@ -273,7 +277,9 @@ def test_call_custom_method_class_newcodegen_special_fields(self, request_mock): ) request_mock.assert_api_version("2017-08-15") - def test_call_custom_method_instance_newcodegen_special_fields(self, request_mock): + def test_call_custom_method_instance_newcodegen_special_fields( + self, request_mock + ): request_mock.stub_request( "post", "/v1/myresources/mid/do_the_thing", @@ -282,21 +288,19 @@ def test_call_custom_method_instance_newcodegen_special_fields(self, request_moc ) obj = self.MyResource.construct_from({"id": "mid"}, "mykey") - obj.do_stuff_new_codegen(foo="bar", - stripe_version="2017-08-15", - api_key="APIKEY", - idempotency_key="IdempotencyKey", - stripe_account="Acc", - headers={"extra_header": "val"}, - ) + obj.do_stuff_new_codegen( + foo="bar", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc", + headers={"extra_header": "val"}, + ) request_mock.assert_requested( "post", "/v1/myresources/mid/do_the_thing", {"foo": "bar"}, - { - "Idempotency-Key": "IdempotencyKey", - "extra_header": "val" - }, + {"Idempotency-Key": "IdempotencyKey", "extra_header": "val"}, ) request_mock.assert_api_version("2017-08-15") diff --git a/tests/api_resources/abstract/test_deletable_api_resource.py b/tests/api_resources/abstract/test_deletable_api_resource.py index ff5aed680..532bd493e 100644 --- a/tests/api_resources/abstract/test_deletable_api_resource.py +++ b/tests/api_resources/abstract/test_deletable_api_resource.py @@ -69,13 +69,14 @@ def test_delete_with_all_special_fields(self, request_mock): {"Idempotency-Key": "IdempotencyKey"}, ) - self.MyDeletable.delete("foo", - stripe_version="2017-08-15", - api_key="APIKEY", - idempotency_key="IdempotencyKey", - stripe_account="Acc", - bobble="new_scrobble" - ) + self.MyDeletable.delete( + "foo", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc", + bobble="new_scrobble", + ) request_mock.assert_requested( "delete", diff --git a/tests/api_resources/abstract/test_updateable_api_resource.py b/tests/api_resources/abstract/test_updateable_api_resource.py index cadcb914d..161961562 100644 --- a/tests/api_resources/abstract/test_updateable_api_resource.py +++ b/tests/api_resources/abstract/test_updateable_api_resource.py @@ -355,22 +355,20 @@ def test_modify_with_all_special_fields(self, request_mock, obj): {"Idempotency-Key": "IdempotencyKey"}, ) - self.MyUpdateable.modify("foo", - stripe_version="2017-08-15", - api_key="APIKEY", - idempotency_key="IdempotencyKey", - stripe_account="Acc", - bobble="new_scrobble", - headers={"extra_header": "val"}, - ) + self.MyUpdateable.modify( + "foo", + stripe_version="2017-08-15", + api_key="APIKEY", + idempotency_key="IdempotencyKey", + stripe_account="Acc", + bobble="new_scrobble", + headers={"extra_header": "val"}, + ) request_mock.assert_requested( "post", "/v1/myupdateables/foo", {"bobble": "new_scrobble"}, - { - "Idempotency-Key": "IdempotencyKey", - "extra_header": "val" - }, + {"Idempotency-Key": "IdempotencyKey", "extra_header": "val"}, ) request_mock.assert_api_version("2017-08-15") From efb45112bdcb1e32ed5d9db289d21e1a71f37465 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 2 Aug 2022 21:55:57 -0700 Subject: [PATCH 8/9] param override test --- .../abstract/test_api_resource.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/api_resources/abstract/test_api_resource.py b/tests/api_resources/abstract/test_api_resource.py index 9bed856b9..dcc0c9510 100644 --- a/tests/api_resources/abstract/test_api_resource.py +++ b/tests/api_resources/abstract/test_api_resource.py @@ -38,6 +38,30 @@ def test_retrieve_and_refresh(self, request_mock): with pytest.raises(KeyError): res["bobble"] + def test_request_with_special_fields_prefers_explicit(self, request_mock): + url = "/v1/myresources/foo" + request_mock.stub_request( + "get", + url, + {"id": "foo2", "bobble": "scrobble"}, + ) + + self.MyResource._static_request( + "get", + "/v1/myresources/foo", + idempotency_key="explicit", + params={ + "idempotency_key": "params", + "bobble": "scrobble" + } + ) + + request_mock.assert_requested( + "get", + url, + {"bobble": "scrobble"}, + {"Idempotency-Key": "explicit"}) + def test_convert_to_stripe_object(self): sample = { "foo": "bar", From d688823e1f6d8fb2af996320cfbfae9af870f1b9 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 2 Aug 2022 21:57:09 -0700 Subject: [PATCH 9/9] lint --- tests/api_resources/abstract/test_api_resource.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tests/api_resources/abstract/test_api_resource.py b/tests/api_resources/abstract/test_api_resource.py index dcc0c9510..13794611d 100644 --- a/tests/api_resources/abstract/test_api_resource.py +++ b/tests/api_resources/abstract/test_api_resource.py @@ -50,17 +50,12 @@ def test_request_with_special_fields_prefers_explicit(self, request_mock): "get", "/v1/myresources/foo", idempotency_key="explicit", - params={ - "idempotency_key": "params", - "bobble": "scrobble" - } + params={"idempotency_key": "params", "bobble": "scrobble"}, ) request_mock.assert_requested( - "get", - url, - {"bobble": "scrobble"}, - {"Idempotency-Key": "explicit"}) + "get", url, {"bobble": "scrobble"}, {"Idempotency-Key": "explicit"} + ) def test_convert_to_stripe_object(self): sample = {