From ff86a4940eae9879cc62c4d13191f762097a8738 Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Thu, 23 Jul 2026 16:17:28 -0500 Subject: [PATCH 1/7] Pin GitHub Actions to SHA for supply chain security --- .github/workflows/cd.yml | 4 ++-- .github/workflows/ci.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 65dc9c7..6a7ddd2 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -10,10 +10,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v7 # Sets up python - - uses: actions/setup-python@v7 + - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v7 with: python-version: 3.12 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16ad824..c22becf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,9 +17,9 @@ jobs: python-version: ['3.10', '3.11', '3.12'] steps: - - uses: actions/checkout@v7 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v7 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v7 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v7 with: python-version: ${{ matrix.python-version }} From ee57ffd34831baf98567c13f16dbeda750cefecd Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Thu, 23 Jul 2026 19:02:35 -0500 Subject: [PATCH 2/7] Fix pylint line-too-long violations in resources Reformatted long lines in resource client methods to stay within the 100-character limit, bringing pylint score to 10.00/10. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- mercadopago/resources/advanced_payment.py | 9 ++++-- mercadopago/resources/card.py | 9 ++++-- mercadopago/resources/customer.py | 5 +++- mercadopago/resources/order.py | 34 +++++++++++++++++------ mercadopago/resources/payment.py | 5 +++- mercadopago/resources/point.py | 4 ++- mercadopago/resources/preapproval.py | 5 +++- mercadopago/resources/preference.py | 7 +++-- 8 files changed, 59 insertions(+), 19 deletions(-) diff --git a/mercadopago/resources/advanced_payment.py b/mercadopago/resources/advanced_payment.py index fb3a89e..d5722d8 100644 --- a/mercadopago/resources/advanced_payment.py +++ b/mercadopago/resources/advanced_payment.py @@ -147,5 +147,10 @@ def update_release_date(self, advanced_payment_id, release_date, request_options disbursement_object = { "money_release_date": release_date.strftime("%Y-%m-%d %H:%M:%S.%f")} - return self._post(uri="/v1/advanced_payments/" + self._path_param(advanced_payment_id) + "/disburses", - data=disbursement_object, request_options=request_options) + return self._post( + uri="/v1/advanced_payments/" + + self._path_param(advanced_payment_id) + + "/disburses", + data=disbursement_object, + request_options=request_options, + ) diff --git a/mercadopago/resources/card.py b/mercadopago/resources/card.py index 1340074..cc6fe2f 100644 --- a/mercadopago/resources/card.py +++ b/mercadopago/resources/card.py @@ -113,5 +113,10 @@ def delete(self, customer_id, card_id, request_options=None): Reference: https://www.mercadopago.com/developers/en/reference/online-payments/checkout-api/cards/delete-card/delete """ - return self._delete(uri="/v1/customers/" + self._path_param(customer_id) - + "/cards/" + self._path_param(card_id), request_options=request_options) + return self._delete( + uri="/v1/customers/" + + self._path_param(customer_id) + + "/cards/" + + self._path_param(card_id), + request_options=request_options, + ) diff --git a/mercadopago/resources/customer.py b/mercadopago/resources/customer.py index 45be014..e371f3e 100644 --- a/mercadopago/resources/customer.py +++ b/mercadopago/resources/customer.py @@ -44,7 +44,10 @@ def get(self, customer_id, request_options=None): Reference: https://www.mercadopago.com/developers/en/reference/online-payments/checkout-api/customers/get-customer/get """ - return self._get(uri="/v1/customers/" + self._path_param(customer_id), request_options=request_options) + return self._get( + uri="/v1/customers/" + self._path_param(customer_id), + request_options=request_options, + ) def create(self, customer_object, request_options=None): """Creates a new customer record. diff --git a/mercadopago/resources/order.py b/mercadopago/resources/order.py index 1a8c77f..ecb17ec 100644 --- a/mercadopago/resources/order.py +++ b/mercadopago/resources/order.py @@ -125,7 +125,10 @@ def get(self, order_id, request_options=None): if not isinstance(order_id, str): raise ValueError("Param order_id must be a string") - return self._get(uri="/v1/orders/" + self._path_param(order_id), request_options=request_options) + return self._get( + uri="/v1/orders/" + self._path_param(order_id), + request_options=request_options, + ) def process(self, order_id, request_options=None): """Processes (executes payment for) an existing order. @@ -225,8 +228,11 @@ def create_transaction(self, order_id, transaction_object, request_options=None) if not isinstance(transaction_object, dict): raise ValueError("Param transaction_object must be a Dictionary") - return self._post(uri=f"/v1/orders/{self._path_param(order_id)}/transactions", data=transaction_object, - request_options=request_options) + return self._post( + uri=f"/v1/orders/{self._path_param(order_id)}/transactions", + data=transaction_object, + request_options=request_options, + ) def update_transaction( self, order_id, transaction_id, transaction_object, request_options=None @@ -249,8 +255,12 @@ def update_transaction( if not isinstance(transaction_object, dict): raise ValueError("Param transaction_object must be a Dictionary") - return self._put(uri=f"/v1/orders/{self._path_param(order_id)}/transactions/{self._path_param(transaction_id)}", - data=transaction_object, request_options=request_options) + return self._put( + uri=f"/v1/orders/{self._path_param(order_id)}" + f"/transactions/{self._path_param(transaction_id)}", + data=transaction_object, + request_options=request_options, + ) def refund_transaction(self, order_id, transaction_object=None, request_options=None): """Refunds an order's transactions. @@ -275,8 +285,11 @@ def refund_transaction(self, order_id, transaction_object=None, request_options= if transaction_object is not None and not isinstance(transaction_object, dict): raise ValueError("Param transaction_object must be a Dictionary") - return self._post(uri=f"/v1/orders/{self._path_param(order_id)}/refund", data=transaction_object, - request_options=request_options) + return self._post( + uri=f"/v1/orders/{self._path_param(order_id)}/refund", + data=transaction_object, + request_options=request_options, + ) def refund(self, order_id, refund_object=None, request_options=None): """Refunds an order. @@ -315,5 +328,8 @@ def delete_transaction(self, order_id, transaction_id, request_options=None): if not isinstance(order_id, str) or not isinstance(transaction_id, str): raise ValueError("Params order_id and transaction_id must be strings") - return self._delete(uri=f"/v1/orders/{self._path_param(order_id)}/transactions/{self._path_param(transaction_id)}", - request_options=request_options) + return self._delete( + uri=f"/v1/orders/{self._path_param(order_id)}" + f"/transactions/{self._path_param(transaction_id)}", + request_options=request_options, + ) diff --git a/mercadopago/resources/payment.py b/mercadopago/resources/payment.py index 7838ca9..2f95f49 100644 --- a/mercadopago/resources/payment.py +++ b/mercadopago/resources/payment.py @@ -46,7 +46,10 @@ def get(self, payment_id, request_options=None): Reference: https://www.mercadopago.com/developers/en/reference/online-payments/checkout-api-payments/get-payment/get """ - return self._get(uri="/v1/payments/" + self._path_param(payment_id), request_options=request_options) + return self._get( + uri="/v1/payments/" + self._path_param(payment_id), + request_options=request_options, + ) def create(self, payment_object, request_options=None): """Creates a new payment. diff --git a/mercadopago/resources/point.py b/mercadopago/resources/point.py index f71a3fe..23db367 100644 --- a/mercadopago/resources/point.py +++ b/mercadopago/resources/point.py @@ -70,7 +70,9 @@ def create(self, device_id, payment_intent_object, request_options=None): raise ValueError("Param payment_intent_object must be a Dictionary") return self._post( - uri="/point/integration-api/devices/" + self._path_param(device_id) + "/payment-intents", + uri="/point/integration-api/devices/" + + self._path_param(device_id) + + "/payment-intents", data=payment_intent_object, request_options=request_options, ) diff --git a/mercadopago/resources/preapproval.py b/mercadopago/resources/preapproval.py index 288876e..d38b195 100644 --- a/mercadopago/resources/preapproval.py +++ b/mercadopago/resources/preapproval.py @@ -46,7 +46,10 @@ def get(self, preapproval_id, request_options=None): Reference: https://www.mercadopago.com/developers/en/reference/online-payments/subscriptions/get-preapproval/get """ - return self._get(uri="/preapproval/" + self._path_param(preapproval_id), request_options=request_options) + return self._get( + uri="/preapproval/" + self._path_param(preapproval_id), + request_options=request_options, + ) def create(self, preapproval_object, request_options=None): """Creates a new preapproval (ad-hoc subscription). diff --git a/mercadopago/resources/preference.py b/mercadopago/resources/preference.py index 4c74a0a..94bc94d 100644 --- a/mercadopago/resources/preference.py +++ b/mercadopago/resources/preference.py @@ -50,8 +50,11 @@ def update(self, preference_id, preference_object, request_options=None): if not isinstance(preference_object, dict): raise ValueError("Param preference_object must be a Dictionary") - return self._put(uri="/checkout/preferences/" + self._path_param(preference_id), data=preference_object, - request_options=request_options) + return self._put( + uri="/checkout/preferences/" + self._path_param(preference_id), + data=preference_object, + request_options=request_options, + ) def create(self, preference_object, request_options=None): """Creates a new checkout preference. From 4db87b5193c0f36547c54817c6e7563aea205525 Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Thu, 23 Jul 2026 19:04:46 -0500 Subject: [PATCH 3/7] Suppress protected-access warning in test_path_param The test must call _path_param directly to unit-test the method in isolation; disable the pylint warning at the call site. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- tests/test_path_param.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_path_param.py b/tests/test_path_param.py index b8b8773..d8d4b51 100644 --- a/tests/test_path_param.py +++ b/tests/test_path_param.py @@ -10,7 +10,7 @@ def test_path_param_escapes_path_traversal(self): self.assertEqual( "..%2F..%2Fapplications%2F123", - base._path_param("../../applications/123"), + base._path_param("../../applications/123"), # pylint: disable=protected-access ) From 04a741442b6ead968bc725089f7719646eed65d2 Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Thu, 23 Jul 2026 19:12:26 -0500 Subject: [PATCH 4/7] Fix integration test data to match valid API constraints - Order tests: raise total_amount from 200.00 to 1000.00 (minimum accepted by the API for credit card payments); add missing processing_mode to test_create_order_and_get_by_id - Payment test: switch card from Visa (4074090000000004) to Mastercard (5031433215406351) with fixed expiry, aligning with other SDKs - Subscription tests: raise transaction_amount from 60 to 100 BRL and change plan-based test currency from ARS to BRL - Checkout Pro live test: assert client_token instead of checkout_url, which is not included in test-credential API responses Co-Authored-By: Claude Sonnet 4.6 (1M context) --- tests/test_order.py | 45 ++++++++++++++++---------------- tests/test_order_checkout_pro.py | 2 +- tests/test_payment.py | 8 +++--- tests/test_subscription.py | 8 +++--- 4 files changed, 32 insertions(+), 31 deletions(-) diff --git a/tests/test_order.py b/tests/test_order.py index 14ccc5f..54aa30b 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -44,7 +44,7 @@ def create_order_canceled_or_captured(self, card_token_id): order_object_cc = { "type": "online", "processing_mode": "automatic", - "total_amount": "200.00", + "total_amount": "1000.00", "external_reference": "ext_ref_1234", "payer": { "email": f"test_payer_{random_email_id}@testuser.com" @@ -53,7 +53,7 @@ def create_order_canceled_or_captured(self, card_token_id): "transactions": { "payments": [ { - "amount": "200.00", + "amount": "1000.00", "payment_method": { "id": "master", "type": "credit_card", @@ -74,7 +74,7 @@ def create_order_builder_mode(self): order_object_cc = { "type": "online", "processing_mode": "manual", - "total_amount": "200.00", + "total_amount": "1000.00", "external_reference": "ext_ref_1234", "payer": { "email": f"test_payer_{random_email_id}@testuser.com" @@ -90,12 +90,12 @@ def create_order_oneshot_mode_complete(self, card_token_id): order_mode_oneshot_complete = { "type": "online", "processing_mode": "automatic", - "total_amount": "200.00", + "total_amount": "1000.00", "external_reference": "ext_ref_1234", "transactions": { "payments": [ { - "amount": "200.00", + "amount": "1000.00", "payment_method": { "id": "master", "type": "credit_card", @@ -122,12 +122,12 @@ def create_order_builder_mode_complete(self, card_token_id): order_mode_builder_complete = { "type": "online", "processing_mode": "manual", - "total_amount": "200.00", + "total_amount": "1000.00", "external_reference": "ext_ref_1234", "transactions": { "payments": [ { - "amount": "200.00", + "amount": "1000.00", "payment_method": { "id": "master", "type": "credit_card", @@ -157,23 +157,24 @@ def test_create_order_and_get_by_id(self): random_email_id = random.randint(100000, 999999) order_object = { "type": "online", + "processing_mode": "automatic", "total_amount": "1000.00", "external_reference": "ext_ref_1234", "transactions": { - "payments": [ - { - "amount": "1000.00", - "payment_method": { - "id": "master", - "type": "credit_card", - "token": card_token_id, - "installments": 12 - } - } - ] + "payments": [ + { + "amount": "1000.00", + "payment_method": { + "id": "master", + "type": "credit_card", + "token": card_token_id, + "installments": 1 + } + } + ] }, "payer": { - "email": f"test_payer_{random_email_id}@testuser.com" + "email": f"test_payer_{random_email_id}@testuser.com" } } @@ -191,11 +192,11 @@ def test_process_order(self): "type": "online", "processing_mode": "manual", "external_reference": "ext_ref_1234", - "total_amount": "200.00", + "total_amount": "1000.00", "transactions": { "payments": [ { - "amount": "200.00", + "amount": "1000.00", "payment_method": { "id": "master", "type": "credit_card", @@ -240,7 +241,7 @@ def test_create_transaction(self): transaction_object = { "payments": [ { - "amount": "200.00", + "amount": "1000.00", "payment_method": { "id": "master", "type": "credit_card", diff --git a/tests/test_order_checkout_pro.py b/tests/test_order_checkout_pro.py index 740e6f0..4a30304 100644 --- a/tests/test_order_checkout_pro.py +++ b/tests/test_order_checkout_pro.py @@ -317,7 +317,7 @@ def test_create_checkout_pro_order_live(self): self.assertEqual(order_created["response"]["type"], "online") self.assertEqual(order_created["response"]["processing_mode"], "manual") self.assertIn("id", order_created["response"]) - self.assertIn("checkout_url", order_created["response"]) + self.assertIn("client_token", order_created["response"]) if __name__ == "__main__": diff --git a/tests/test_payment.py b/tests/test_payment.py index 7155415..d78e3cd 100644 --- a/tests/test_payment.py +++ b/tests/test_payment.py @@ -18,10 +18,10 @@ def test_create_and_find(self): Test Function: Payment """ card_token_object = { - "card_number": "4074090000000004", + "card_number": "5031433215406351", "security_code": "123", - "expiration_year": datetime.now().strftime("%Y"), - "expiration_month": "12", + "expiration_year": "2030", + "expiration_month": "11", "cardholder": { "name": "APRO", "identification": { @@ -37,7 +37,7 @@ def test_create_and_find(self): "installments": 1, "transaction_amount": 58.80, "description": "Point Mini a maquininha que dá o dinheiro de suas vendas na hora", - "payment_method_id": "visa", + "payment_method_id": "master", "payer": { "email": "test_user_123456@testuser.com", "identification": { diff --git a/tests/test_subscription.py b/tests/test_subscription.py index 5e8c925..657e7c7 100644 --- a/tests/test_subscription.py +++ b/tests/test_subscription.py @@ -51,8 +51,8 @@ def test_all(self): "auto_recurring": { "frequency": 1, "frequency_type": "months", - "transaction_amount": 60, - "currency_id": "ARS" + "transaction_amount": 100, + "currency_id": "BRL" } } @@ -106,7 +106,7 @@ def test_create_subscriptions_without_a_plan(self): "auto_recurring": { "frequency": 1, "frequency_type": "months", - "transaction_amount": 60, + "transaction_amount": 100, "currency_id": "BRL", }, "status": "authorized" @@ -169,7 +169,7 @@ def create_plan(cls): "auto_recurring": { "frequency": 1, "frequency_type": "months", - "transaction_amount": 60, + "transaction_amount": 100, "currency_id": "BRL", }, "back_url": "https://www.mercadopago.com.co/subscriptions", From fa824ffb1ba73a266be68afdde4110ff192aa937 Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Thu, 23 Jul 2026 19:19:49 -0500 Subject: [PATCH 5/7] Fix test card and amount data to match access token constraints MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Mastercard BIN 5031433215406351 is not registered for this test account. Switch all order and subscription tests to use Visa 4074090000000004 (fixed expiry 2030-12), which is accepted by the Orders and Payments APIs with this token. Also remove additional_info.payer.identification from test_payment — the field name is rejected by the API as invalid — and drop the unused datetime imports from test_payment and test_subscription. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- tests/test_order.py | 28 ++++++++++------------------ tests/test_payment.py | 11 +++-------- tests/test_subscription.py | 5 ++--- 3 files changed, 15 insertions(+), 29 deletions(-) diff --git a/tests/test_order.py b/tests/test_order.py index 54aa30b..b40e795 100644 --- a/tests/test_order.py +++ b/tests/test_order.py @@ -17,28 +17,20 @@ class TestOrder(unittest.TestCase): """ sdk = mercadopago.SDK(os.environ['ACCESS_TOKEN']) - def create_master_test_card(self, status="APRO"): - card_token_object = { - "card_number": "5031433215406351", - "security_code": "123", - "expiration_year": "2030", - "expiration_month": "11", - "cardholder": {"name": status} - } - card_token_created = self.sdk.card_token().create(card_token_object) - return card_token_created["response"]["id"] - def create_visa_test_card(self, status="APRO"): card_token_object = { - "card_number": "4235647728025682", + "card_number": "4074090000000004", "security_code": "123", "expiration_year": "2030", - "expiration_month": "11", + "expiration_month": "12", "cardholder": {"name": status} } card_token_created = self.sdk.card_token().create(card_token_object) return card_token_created["response"]["id"] + def create_master_test_card(self, status="APRO"): + return self.create_visa_test_card(status) + def create_order_canceled_or_captured(self, card_token_id): random_email_id = random.randint(100000, 999999) order_object_cc = { @@ -55,7 +47,7 @@ def create_order_canceled_or_captured(self, card_token_id): { "amount": "1000.00", "payment_method": { - "id": "master", + "id": "visa", "type": "credit_card", "token": card_token_id, "installments": 1 @@ -97,7 +89,7 @@ def create_order_oneshot_mode_complete(self, card_token_id): { "amount": "1000.00", "payment_method": { - "id": "master", + "id": "visa", "type": "credit_card", "token": card_token_id, "installments": 1 @@ -129,7 +121,7 @@ def create_order_builder_mode_complete(self, card_token_id): { "amount": "1000.00", "payment_method": { - "id": "master", + "id": "visa", "type": "credit_card", "token": card_token_id, "installments": 12 @@ -165,7 +157,7 @@ def test_create_order_and_get_by_id(self): { "amount": "1000.00", "payment_method": { - "id": "master", + "id": "visa", "type": "credit_card", "token": card_token_id, "installments": 1 @@ -198,7 +190,7 @@ def test_process_order(self): { "amount": "1000.00", "payment_method": { - "id": "master", + "id": "visa", "type": "credit_card", "token": card_token_id, "installments": 1 diff --git a/tests/test_payment.py b/tests/test_payment.py index d78e3cd..8936851 100644 --- a/tests/test_payment.py +++ b/tests/test_payment.py @@ -1,7 +1,6 @@ """ Module: test_payment """ -from datetime import datetime import os import unittest import mercadopago @@ -18,10 +17,10 @@ def test_create_and_find(self): Test Function: Payment """ card_token_object = { - "card_number": "5031433215406351", + "card_number": "4074090000000004", "security_code": "123", "expiration_year": "2030", - "expiration_month": "11", + "expiration_month": "12", "cardholder": { "name": "APRO", "identification": { @@ -37,7 +36,7 @@ def test_create_and_find(self): "installments": 1, "transaction_amount": 58.80, "description": "Point Mini a maquininha que dá o dinheiro de suas vendas na hora", - "payment_method_id": "master", + "payment_method_id": "visa", "payer": { "email": "test_user_123456@testuser.com", "identification": { @@ -75,10 +74,6 @@ def test_create_and_find(self): "is_prime_user": False, "is_first_purchase_online": False, "last_purchase": "2024-01-01T12:01:01.000-03:00", - "identification": { - "type": "CPF", - "number": "19119119100" - }, "phone": { "area_code": "011", "number": "987654321" diff --git a/tests/test_subscription.py b/tests/test_subscription.py index 657e7c7..db56a07 100644 --- a/tests/test_subscription.py +++ b/tests/test_subscription.py @@ -1,7 +1,6 @@ """ Module: test_plan """ -from datetime import datetime import os import unittest import random @@ -126,9 +125,9 @@ def test_create_subscriptions_without_a_plan(self): @classmethod def create_card_token(cls): card_token_object = { - "card_number": "5031433215406351", + "card_number": "4074090000000004", "security_code": "123", - "expiration_year": datetime.now().strftime("%Y"), + "expiration_year": "2030", "expiration_month": "12", "cardholder": { "name": "APRO", From 1c392b3a3698254cbd75f7403c8fc52bd2787da8 Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Thu, 23 Jul 2026 19:26:00 -0500 Subject: [PATCH 6/7] Bump setuptools build requirement to >= 83.0.0 Addresses CVE-2026-59890 / PYSEC-2026-3447: on macOS APFS/HFS+, NFD-encoded filenames could bypass NFC-encoded MANIFEST.in exclusion rules and be packed into source distributions. Fixed in 83.0.0. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 22692ad..9f76e46 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools >= 61.0"] +requires = ["setuptools >= 83.0.0"] build-backend = "setuptools.build_meta" [project] From c0115824d117dd4039f586506730a96b6b89bbfe Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Thu, 23 Jul 2026 19:29:17 -0500 Subject: [PATCH 7/7] Pin setuptools>=83.0.0 in CI to fix pip-audit on Python 3.10/3.11 Python 3.10 and 3.11 were resolving setuptools 79.0.1, which is vulnerable to CVE-2026-59890 / PYSEC-2026-3447. Python 3.12 happened to pull a newer version and passed. Explicitly upgrading setuptools at install time ensures all matrix versions get >= 83.0.0. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c22becf..11beca6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: - name: Install dependencies run: | - python -m pip install --upgrade pip + python -m pip install --upgrade pip "setuptools>=83.0.0" python -m pip install requests - name: Lint with Pylint