From daae20fef867910d099510d042438a06e1212bc9 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Mon, 16 Jun 2025 15:46:55 +0200 Subject: [PATCH 01/13] feat: add python tests --- pyproject.toml | 5 +++- tests/test_api.py | 17 +++++++++++ uv.lock | 75 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 tests/test_api.py diff --git a/pyproject.toml b/pyproject.toml index b5da507..818a0a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,10 @@ build-backend = "hatchling.build" [tool.uv] managed = true -dev-dependencies = [] +dev-dependencies = [ + "pytest>=8.4.0", + "pytest-mock>=3.14.1", +] [tool.hatch.metadata] allow-direct-references = true diff --git a/tests/test_api.py b/tests/test_api.py new file mode 100644 index 0000000..c3b7af8 --- /dev/null +++ b/tests/test_api.py @@ -0,0 +1,17 @@ +import pytest +from github_rest_cli import api + + +def test_fetch_user(mocker): + mocker.patch("github_rest_cli.api.get_headers", return_value={"Authorization": "token fake"}) + + mock_response = mocker.Mock() + mock_response.status_code = 200 + mock_response.json.return_value = {"login": "test-user"} + mock_response.raise_for_status = lambda: None + + mocker.patch("github_rest_cli.api.request_with_handling", return_value=mock_response) + + result = api.fetch_user() + + assert result == "test-user" diff --git a/uv.lock b/uv.lock index 84e7060..bfc1230 100644 --- a/uv.lock +++ b/uv.lock @@ -50,6 +50,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543, upload-time = "2023-11-01T04:04:58.622Z" }, ] +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + [[package]] name = "dynaconf" version = "3.2.11" @@ -69,6 +78,12 @@ dependencies = [ { name = "rich" }, ] +[package.dev-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-mock" }, +] + [package.metadata] requires-dist = [ { name = "dynaconf", specifier = ">=3.2.11" }, @@ -77,7 +92,10 @@ requires-dist = [ ] [package.metadata.requires-dev] -dev = [] +dev = [ + { name = "pytest", specifier = ">=8.4.0" }, + { name = "pytest-mock", specifier = ">=3.14.1" }, +] [[package]] name = "idna" @@ -88,6 +106,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -109,6 +136,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "pygments" version = "2.18.0" @@ -118,6 +163,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513, upload-time = "2024-05-04T13:41:57.345Z" }, ] +[[package]] +name = "pytest" +version = "8.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/aa/405082ce2749be5398045152251ac69c0f3578c7077efc53431303af97ce/pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6", size = 1515232, upload-time = "2025-06-02T17:36:30.03Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/de/afa024cbe022b1b318a3d224125aa24939e99b4ff6f22e0ba639a2eaee47/pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e", size = 363797, upload-time = "2025-06-02T17:36:27.859Z" }, +] + +[[package]] +name = "pytest-mock" +version = "3.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/28/67172c96ba684058a4d24ffe144d64783d2a270d0af0d9e792737bddc75c/pytest_mock-3.14.1.tar.gz", hash = "sha256:159e9edac4c451ce77a5cdb9fc5d1100708d2dd4ba3c3df572f14097351af80e", size = 33241, upload-time = "2025-05-26T13:58:45.167Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/05/77b60e520511c53d1c1ca75f1930c7dd8e971d0c4379b7f4b3f9644685ba/pytest_mock-3.14.1-py3-none-any.whl", hash = "sha256:178aefcd11307d874b4cd3100344e7e2d888d9791a6a1d9bfe90fbc1b74fd1d0", size = 9923, upload-time = "2025-05-26T13:58:43.487Z" }, +] + [[package]] name = "requests" version = "2.32.3" From b922c9dbc567d65839ef8927ef987cc3bf257fe1 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Mon, 16 Jun 2025 15:51:10 +0200 Subject: [PATCH 02/13] feat(justfile): update test recipe --- justfile | 8 ++++---- tests/test_api.py | 20 ++++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/justfile b/justfile index 7b5181e..0893963 100644 --- a/justfile +++ b/justfile @@ -1,4 +1,4 @@ -# Justfile for Python +# justfile for python set dotenv-load := true @@ -28,6 +28,9 @@ alias dv := dynaconf-validate @lint: ruff check . +@test: + pytest -v + @fmt: ruff format . @@ -36,6 +39,3 @@ alias dv := dynaconf-validate @dynaconf-validate: dynaconf -i github_rest_cli.config.settings validate - -test: - @echo {{ justfile_directory() }} diff --git a/tests/test_api.py b/tests/test_api.py index c3b7af8..0364264 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -3,15 +3,19 @@ def test_fetch_user(mocker): - mocker.patch("github_rest_cli.api.get_headers", return_value={"Authorization": "token fake"}) + mocker.patch( + "github_rest_cli.api.get_headers", return_value={"Authorization": "token fake"} + ) - mock_response = mocker.Mock() - mock_response.status_code = 200 - mock_response.json.return_value = {"login": "test-user"} - mock_response.raise_for_status = lambda: None + mock_response = mocker.Mock() + mock_response.status_code = 200 + mock_response.json.return_value = {"login": "test-user"} + mock_response.raise_for_status = lambda: None - mocker.patch("github_rest_cli.api.request_with_handling", return_value=mock_response) + mocker.patch( + "github_rest_cli.api.request_with_handling", return_value=mock_response + ) - result = api.fetch_user() + result = api.fetch_user() - assert result == "test-user" + assert result == "test-user" From 04cdac48076c813ffd75121f951e1f08f627a1f8 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Mon, 16 Jun 2025 17:23:19 +0200 Subject: [PATCH 03/13] feat: add .vscode directory --- .gitignore | 2 +- .vscode/settings.json | 4 ++++ src/github_rest_cli/api.py | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index aff7987..ca5ee0a 100644 --- a/.gitignore +++ b/.gitignore @@ -169,7 +169,7 @@ cython_debug/ .secrets.* # VScode directories -.vscode +# .vscode # Shell script files *.sh diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d9e0982 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python", + "python.terminal.activateEnvironment": true +} diff --git a/src/github_rest_cli/api.py b/src/github_rest_cli/api.py index b42cc26..6e69537 100644 --- a/src/github_rest_cli/api.py +++ b/src/github_rest_cli/api.py @@ -71,17 +71,17 @@ def get_repository(name: str, org: str = None): def create_repository(name: str, visibility: str, org: str = None, empty: bool = False): - data = { + payload = { "name": name, "visibility": visibility, "auto_init": True, } if visibility == "private": - data["private"] = True + payload["private"] = True if empty: - data["auto_init"] = False + payload["auto_init"] = False owner = fetch_user() headers = get_headers() @@ -91,7 +91,7 @@ def create_repository(name: str, visibility: str, org: str = None, empty: bool = "POST", url, headers=headers, - json=data, + json=payload, success_msg=f"Repository successfully created in {org or owner}/{name}.", error_msg={ 401: "Unauthorized access. Please check your token or credentials.", From a316fe72bffbc8c03346d8ad6898c53bc01ba5f6 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 17 Jun 2025 09:56:38 +0200 Subject: [PATCH 04/13] feat: add create repository tests --- tests/test_api.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/tests/test_api.py b/tests/test_api.py index 0364264..f06f9b4 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,4 +1,3 @@ -import pytest from github_rest_cli import api @@ -19,3 +18,39 @@ def test_fetch_user(mocker): result = api.fetch_user() assert result == "test-user" + + +def test_create_repository_user(mocker): + mocker.patch( + "github_rest_cli.api.get_headers", return_value={"Authorization": "token fake"} + ) + + mocker.patch("github_rest_cli.api.fetch_user", return_value="test-user") + + expected_message = "Repository successfully created in test-user/test-repo." + + mocker.patch( + "github_rest_cli.api.request_with_handling", return_value=expected_message + ) + + result = api.create_repository("test-repo", "public") + + assert result == expected_message + + +def test_create_repository_org(mocker): + mocker.patch( + "github_rest_cli.api.get_headers", return_value={"Authorization": "token fake"} + ) + + mocker.patch("github_rest_cli.api.fetch_user", return_value="test-user") + + expected_message = "Repository successfully created in test-org/test-repo." + + mocker.patch( + "github_rest_cli.api.request_with_handling", return_value=expected_message + ) + + result = api.create_repository("test-repo", "public", "test-org") + + assert result == expected_message From 17b6d7c76c10c77a8b9a013a2e1b4b4925a96bce Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 17 Jun 2025 11:55:15 +0200 Subject: [PATCH 05/13] feat(api): update api functions --- justfile | 3 +++ pyproject.toml | 1 + src/github_rest_cli/api.py | 31 ++++++++++++------------- tests/test_api.py | 2 -- uv.lock | 46 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 19 deletions(-) diff --git a/justfile b/justfile index 0893963..ca42d87 100644 --- a/justfile +++ b/justfile @@ -39,3 +39,6 @@ alias dv := dynaconf-validate @dynaconf-validate: dynaconf -i github_rest_cli.config.settings validate + +@profile *args: + pyinstrument --no-color -m github_rest_cli.main {{ args }} diff --git a/pyproject.toml b/pyproject.toml index 818a0a0..091a28d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ build-backend = "hatchling.build" [tool.uv] managed = true dev-dependencies = [ + "pyinstrument>=5.0.2", "pytest>=8.4.0", "pytest-mock>=3.14.1", ] diff --git a/src/github_rest_cli/api.py b/src/github_rest_cli/api.py index 6e69537..893eaad 100644 --- a/src/github_rest_cli/api.py +++ b/src/github_rest_cli/api.py @@ -51,9 +51,10 @@ def fetch_user() -> str: def get_repository(name: str, org: str = None): - owner = fetch_user() + owner = org if org else fetch_user() headers = get_headers() - url = build_url("repos", org or owner, name) + url = build_url("repos", owner, name) + response = request_with_handling( "GET", url, @@ -83,16 +84,16 @@ def create_repository(name: str, visibility: str, org: str = None, empty: bool = if empty: payload["auto_init"] = False - owner = fetch_user() + owner = org if org else fetch_user() headers = get_headers() - url = build_url("orgs", org, "repos") if org else build_url("user", "repos") + url = build_url("orgs", owner, "repos") if org else build_url("user", "repos") return request_with_handling( "POST", url, headers=headers, json=payload, - success_msg=f"Repository successfully created in {org or owner}/{name}.", + success_msg=f"Repository successfully created in {owner}/{name}.", error_msg={ 401: "Unauthorized access. Please check your token or credentials.", 422: "Repository name already exists on this account or organization.", @@ -101,15 +102,15 @@ def create_repository(name: str, visibility: str, org: str = None, empty: bool = def delete_repository(name: str, org: str = None): - owner = fetch_user() + owner = org if org else fetch_user() headers = get_headers() - url = build_url("repos", org, name) if org else build_url("repos", owner, name) + url = build_url("repos", owner, name) return request_with_handling( "DELETE", url, headers=headers, - success_msg=f"Repository sucessfully deleted in {org or owner}/{name}.", + success_msg=f"Repository sucessfully deleted in {owner}/{name}.", error_msg={ 403: "The authenticated user does not have sufficient permissions to delete this repository.", 404: "The requested repository does not exist.", @@ -142,9 +143,9 @@ def list_repositories(page: int, property: str, role: str): def dependabot_security(name: str, enabled: bool, org: str = None): is_enabled = bool(enabled) - owner = fetch_user() + owner = org if org else fetch_user() headers = get_headers() - url = build_url("repos", org, name) if org else build_url("repos", owner, name) + url = build_url("repos", owner, name) security_urls = ["vulnerability-alerts", "automated-security-fixes"] if is_enabled: @@ -165,19 +166,15 @@ def dependabot_security(name: str, enabled: bool, org: str = None): "DELETE", url=full_url, headers=headers, - success_msg=f"Dependabot has been disabled on repository {org or owner}/{name}.", + success_msg=f"Dependabot has been disabled on repository {owner}/{name}.", error_msg={401: "Unauthorized. Please check your credentials."}, ) def deployment_environment(name: str, env: str, org: str = None): - owner = fetch_user() + owner = org if org else fetch_user() headers = get_headers() - url = ( - build_url("repos", org, name, "environments", env) - if org - else build_url("repos", owner, name, "environments", env) - ) + url = build_url("repos", owner, name, "environments", env) return request_with_handling( "PUT", diff --git a/tests/test_api.py b/tests/test_api.py index f06f9b4..f300fbc 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -43,8 +43,6 @@ def test_create_repository_org(mocker): "github_rest_cli.api.get_headers", return_value={"Authorization": "token fake"} ) - mocker.patch("github_rest_cli.api.fetch_user", return_value="test-user") - expected_message = "Repository successfully created in test-org/test-repo." mocker.patch( diff --git a/uv.lock b/uv.lock index bfc1230..7a5766f 100644 --- a/uv.lock +++ b/uv.lock @@ -80,6 +80,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "pyinstrument" }, { name = "pytest" }, { name = "pytest-mock" }, ] @@ -93,6 +94,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "pyinstrument", specifier = ">=5.0.2" }, { name = "pytest", specifier = ">=8.4.0" }, { name = "pytest-mock", specifier = ">=3.14.1" }, ] @@ -163,6 +165,50 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513, upload-time = "2024-05-04T13:41:57.345Z" }, ] +[[package]] +name = "pyinstrument" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/d0/665828770e8fcd5c50880dc83f03811f814d6260bc6a8068dca0a520e68a/pyinstrument-5.0.2.tar.gz", hash = "sha256:e466033ead16a48ffa8bedbd633b90d416fa772b3b22f61226882ace0371f5f3", size = 263930, upload-time = "2025-05-24T15:47:13.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/f2/b3f2416740be762fdfb052b63e1d85591682fa1d2ea6ee1b10db774f6350/pyinstrument-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0eec7a263cc1ccfb101594e13256115366338fee2a156be4172fe5315f71ec45", size = 129386, upload-time = "2025-05-24T15:45:39.429Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fa/a55b0bf911041b51d2a7a0e8a3feef5ed5ddb48ff0943fc667079955c14c/pyinstrument-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddd5effefb470d7f1886dc16467501b866e3b5883cf74773f13179e718b28393", size = 122100, upload-time = "2025-05-24T15:45:41.253Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e1/c42b94c795bc89d5a486ad7ef349fe3b7a8c3a4e730c09b5fa54af616a6b/pyinstrument-5.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e7458a6aa4048c1703354fc8a4a3c8b59d27b1409aafb707cf339d3c0bc794c", size = 145385, upload-time = "2025-05-24T15:45:43.024Z" }, + { url = "https://files.pythonhosted.org/packages/ff/41/b511141cc336ffeac284cce7d121f05802ffea4ab2c19df8869adda49743/pyinstrument-5.0.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2373dd699711463011ec14e4918427a777f7ab73b31ae374d960725dbd5d5a28", size = 156093, upload-time = "2025-05-24T15:45:44.755Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/4a7bc4f1c60d4886efb7397fd5bdcc7e537d01ec7372824cd834fff967a1/pyinstrument-5.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38ef498fbe71c2bbd11247b71e722290da93a367d88a5a8e0f66f6cc764c2b60", size = 143136, upload-time = "2025-05-24T15:45:46.469Z" }, + { url = "https://files.pythonhosted.org/packages/d8/69/0ac06cf609153fc5eb30ccc0071ce300a181f422836ca7ce8cd431ac3ab4/pyinstrument-5.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0a58a8a50f0cb3ee1c2e43ffec51bf48f48945e141feed7ccd9194917b97fe5b", size = 144077, upload-time = "2025-05-24T15:45:48.333Z" }, + { url = "https://files.pythonhosted.org/packages/e3/24/12bd82822393f708e5da8f6c0b82def3f0cbe1f4fbd72a082688c583d7fa/pyinstrument-5.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad2a97c79ecf0e610df292abb5c46d01a4f99778598881d6e918650fa39801b6", size = 144545, upload-time = "2025-05-24T15:45:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/c9/62/40e7511fa46247ca56734d34e2d2eb6b14390c72b155255ecd1b2288d02d/pyinstrument-5.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:57ec0277042ee198eb749b76a975fe60f006cd51ea0c7ce3054c937577d19315", size = 144010, upload-time = "2025-05-24T15:45:52.256Z" }, + { url = "https://files.pythonhosted.org/packages/82/77/6d40880dc46a6243951ad7cd50a77f26f6ad126b80d803616934efccf539/pyinstrument-5.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:73d34047266f27acb67218e331288c0241cf0080fe4b87dfad5596236c71abd7", size = 143746, upload-time = "2025-05-24T15:45:53.702Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a2/08b056d2420199dab877c665ed45bb685863dc5b83d31b2c4311430b2bbd/pyinstrument-5.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cfdc23284a8e2f27637b357c226a15d52b96608d9dde187b68dfe33a947f4908", size = 143928, upload-time = "2025-05-24T15:45:55.103Z" }, + { url = "https://files.pythonhosted.org/packages/39/a1/bab336f70cd5f798d7fa21ec92784b99d3b2df0b5c1736a64fdaa4521004/pyinstrument-5.0.2-cp311-cp311-win32.whl", hash = "sha256:3e6fa135aee6af2c608e912d8d07906bbac3c5e564d94f92721831a957297c26", size = 123395, upload-time = "2025-05-24T15:45:56.469Z" }, + { url = "https://files.pythonhosted.org/packages/f2/15/8a7ac268ffe913aa64bb42ad43315dd0fc3ac493d451a50d4431ecb736c2/pyinstrument-5.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:6317df42a98a8074ccd25af5482312ec59a1f27c05dab408eb3c7b2081242733", size = 124198, upload-time = "2025-05-24T15:45:57.814Z" }, + { url = "https://files.pythonhosted.org/packages/95/36/4afdffbc4fd77dd0155c8943101f175e701ba00cb374c5e84e64790a2a32/pyinstrument-5.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d0b680ef269b528d8dcd8151362fba9683b0ac22ffe74cc8161c33b53c65b899", size = 129527, upload-time = "2025-05-24T15:45:59.216Z" }, + { url = "https://files.pythonhosted.org/packages/96/fe/7ea5af73d65f8f22585005f6e2ce1016fb3145a8ecc1ded51f965c2e98cc/pyinstrument-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1c70b50ec90ae793b74733a6fc992723c6ee27c0fcb7d99848239316ded61189", size = 122068, upload-time = "2025-05-24T15:46:01.05Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d2/cf8f3b8fde3f3b6768f8407c681fb57e7b5a5bf5e7450a9fbec15164987b/pyinstrument-5.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3aae5f4f78515009f72393fdb271a15861534a586401383785f823cf8f60aa02", size = 146679, upload-time = "2025-05-24T15:46:02.841Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e2/6c00273778596560c7033cfee34aab07da6009f32c5a4dbcc35b64700e73/pyinstrument-5.0.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3aec8bc3d1c064ff849ca3568d6b0a7cfa0162d590a9d4d250c7118d09518b22", size = 157606, upload-time = "2025-05-24T15:46:04.551Z" }, + { url = "https://files.pythonhosted.org/packages/4c/cc/ec099f566e381f8e5db21d9523dd97b3255047813da57481ab3f45436089/pyinstrument-5.0.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28d87fac2bc0fed802b14a26982440f36c85dc53f303530ff7665a6e470315bb", size = 144317, upload-time = "2025-05-24T15:46:05.996Z" }, + { url = "https://files.pythonhosted.org/packages/37/a7/e2e54bf6d996b3c807534dbc4fe270f373660b89871c63965d3f895c285d/pyinstrument-5.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b9caac53c7eda8187ed122d4f7fcc6e3392f04c583d6d70b373351cede2b829", size = 145622, upload-time = "2025-05-24T15:46:07.334Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c6/0b084ddf8d836076e04912ea83ccae0f83bf4897d0168b0fd7684efdc2a4/pyinstrument-5.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8124419e8731a7bdbb9f7f885a8956806a4e9ab9dd19294f8a99e74c0bbdd327", size = 145645, upload-time = "2025-05-24T15:46:09.236Z" }, + { url = "https://files.pythonhosted.org/packages/b3/4d/3e542c5986cc30bc86c304492f4696e58dc03d1816d35c5b2cabfac1d01e/pyinstrument-5.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9990d9bd05fbb4fa83f24f0a62989b8e0a3ac15ff0fa19b49348c8ef5f9db50a", size = 145619, upload-time = "2025-05-24T15:46:10.643Z" }, + { url = "https://files.pythonhosted.org/packages/a7/a7/1e4664bf5ada1cff56852d10954b1ff5a39dad17b9b98a2f27054a0c0d95/pyinstrument-5.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:1dc35f3d200866a43d4bc7570799a405f001591c8f19a30eb7a983a717c1e1f7", size = 145049, upload-time = "2025-05-24T15:46:12.019Z" }, + { url = "https://files.pythonhosted.org/packages/fb/59/08a5237c8d1343842ac9ed3c661dce40c450f1750128fd4789ad80539253/pyinstrument-5.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a335a40d0ba1fe3658ef1a5ff2fc7a6870905828014645cb19dab5c1de379447", size = 145451, upload-time = "2025-05-24T15:46:13.49Z" }, + { url = "https://files.pythonhosted.org/packages/53/d0/321b5301e36ac1577dbf73cb49769779c41ebf72ba70a3f6f62d34df902b/pyinstrument-5.0.2-cp312-cp312-win32.whl", hash = "sha256:29e565ce85e03d2541330a8174124c1ecdb073d945962a8eb738d3b1c806ac83", size = 123491, upload-time = "2025-05-24T15:46:15.319Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a6/40f05febe6ab0856b4bfa119113d550d868d94a36b501e6b9fd64379b4ba/pyinstrument-5.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:300b0cc453ffe7661d5f3ceb94cdd98996fd9118f5ff1182b5336489c7d4e45c", size = 124277, upload-time = "2025-05-24T15:46:16.693Z" }, + { url = "https://files.pythonhosted.org/packages/03/88/48654e4b8c6853f218e0506e0609060a54559500b3af5ed6ac752ac4d64f/pyinstrument-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8141a5f78b927a88de46fb2bbb17e710e41d16e161fca99991635ff7196dbd5d", size = 129528, upload-time = "2025-05-24T15:46:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/92/a7/885418b733350f6c2b1d8fcca322a1eee87216a266ac516d7aefd6757ec8/pyinstrument-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:12a0095ae408dbbdd429501fd4c6a3ab51d1aeff5f31be36cc3eedc8c4870ede", size = 122072, upload-time = "2025-05-24T15:46:19.513Z" }, + { url = "https://files.pythonhosted.org/packages/a4/d5/dd0b323d2949d1a3ee0531ec6cdd66c3c69c13b9a8739aeec929a0b55fd2/pyinstrument-5.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eca651d840e8e75ae5330abfc5c90f6ea4af3f78f9f0269231328305a5f9c667", size = 146874, upload-time = "2025-05-24T15:46:21.38Z" }, + { url = "https://files.pythonhosted.org/packages/aa/3b/429572b57c9ae2874e86c48db91ddcd5d619bd798f73d7d2e51b28abb08d/pyinstrument-5.0.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:89d6ffc5459b19f1c85d4433bb9bbc8925ec04a8d7caf2694218b1f557555f23", size = 155257, upload-time = "2025-05-24T15:46:22.791Z" }, + { url = "https://files.pythonhosted.org/packages/7a/98/03cd22f68607362fd8d1ba72e6367104a9dc32bd4a0dbafc823c4e366f35/pyinstrument-5.0.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c84845ccc5318072708dc5535b6bedd54494e92a68e282e6b97b53c1db65331", size = 144380, upload-time = "2025-05-24T15:46:24.26Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c4/40d7b4be6c9620c4d9bbe9788eb9bac892f386c9bd40f1937464b2b95c09/pyinstrument-5.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6511092384b5729bbbf4b35534120d2969c5fdfd4f39080badedd973676b8725", size = 145794, upload-time = "2025-05-24T15:46:25.751Z" }, + { url = "https://files.pythonhosted.org/packages/05/07/3b2084b78521d5bbbc328ca9527fb54fbf645a5e62f25169b49f7bbb0bc3/pyinstrument-5.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73f08cff7a8d9714be15440046289ab1a70cbc429e09967a3a106ac61538773e", size = 145803, upload-time = "2025-05-24T15:46:27.277Z" }, + { url = "https://files.pythonhosted.org/packages/22/eb/e3ffcc8734e3d9f50b6bb750209c3ad0c4626dcc3754529741499d9f1d5c/pyinstrument-5.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3905b510cdab1a8255a23fbdedcba4685245cbf814fd80f5b2005b472161d16e", size = 145763, upload-time = "2025-05-24T15:46:28.656Z" }, + { url = "https://files.pythonhosted.org/packages/c6/34/6b94945a02afced9e486e9a6b20de0edcfec543e4942dea96d745e2148ac/pyinstrument-5.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cd693a616166679da529168037c294ff25746c7ae5e8b547811fb25bb26439f5", size = 145208, upload-time = "2025-05-24T15:46:30.125Z" }, + { url = "https://files.pythonhosted.org/packages/99/af/0339bbfe52de9a7df01e5a244a5fec4c228d23b1f422a55318fc6d0b9d91/pyinstrument-5.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:83a1659a3bc4123c81fcddfcc86608f37bd6a951da9692766c2251500a77ac06", size = 145591, upload-time = "2025-05-24T15:46:31.556Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f4/76a2c652e203c15cbc7aa3f8341e07d1ea865764b3ed9f9a97b3c4a5eda2/pyinstrument-5.0.2-cp313-cp313-win32.whl", hash = "sha256:386d047db6c043dcc86bac592873234a89eaa258460e1ad8f47a11fcc7b024d5", size = 123490, upload-time = "2025-05-24T15:46:32.951Z" }, + { url = "https://files.pythonhosted.org/packages/e4/63/14f5c6253e8c85c758485c7717f542346a0d4487818afc28721912a1574b/pyinstrument-5.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:971c974c061019fa6177a021882255e639399bc15bf71b0a17979830702ad8d3", size = 124287, upload-time = "2025-05-24T15:46:34.333Z" }, +] + [[package]] name = "pytest" version = "8.4.0" From b92c0037b0cf225f866e60551db90e5cff7bead4 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 17 Jun 2025 13:01:22 +0200 Subject: [PATCH 06/13] test(actions): ruff warning #01 --- .github/workflows/python-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index d1c3be2..566af8f 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -24,6 +24,8 @@ jobs: python-version: '3.11' - uses: astral-sh/ruff-action@v3 + with: + version-file: "pyproject.toml" - name: Ruff lint run: ruff check . From aa4fba68bde3cb05c7edc40b50c04b90638fb987 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 17 Jun 2025 13:03:15 +0200 Subject: [PATCH 07/13] test(actions): ruff warning #02 --- .github/workflows/python-ci.yml | 2 -- pyproject.toml | 1 + uv.lock | 27 +++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 566af8f..d1c3be2 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -24,8 +24,6 @@ jobs: python-version: '3.11' - uses: astral-sh/ruff-action@v3 - with: - version-file: "pyproject.toml" - name: Ruff lint run: ruff check . diff --git a/pyproject.toml b/pyproject.toml index 091a28d..b7b533e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ dev-dependencies = [ "pyinstrument>=5.0.2", "pytest>=8.4.0", "pytest-mock>=3.14.1", + "ruff>=0.11.13", ] [tool.hatch.metadata] diff --git a/uv.lock b/uv.lock index 7a5766f..180384f 100644 --- a/uv.lock +++ b/uv.lock @@ -83,6 +83,7 @@ dev = [ { name = "pyinstrument" }, { name = "pytest" }, { name = "pytest-mock" }, + { name = "ruff" }, ] [package.metadata] @@ -97,6 +98,7 @@ dev = [ { name = "pyinstrument", specifier = ">=5.0.2" }, { name = "pytest", specifier = ">=8.4.0" }, { name = "pytest-mock", specifier = ">=3.14.1" }, + { name = "ruff", specifier = ">=0.11.13" }, ] [[package]] @@ -265,6 +267,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload-time = "2025-03-30T14:15:12.283Z" }, ] +[[package]] +name = "ruff" +version = "0.11.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/da/9c6f995903b4d9474b39da91d2d626659af3ff1eeb43e9ae7c119349dba6/ruff-0.11.13.tar.gz", hash = "sha256:26fa247dc68d1d4e72c179e08889a25ac0c7ba4d78aecfc835d49cbfd60bf514", size = 4282054, upload-time = "2025-06-05T21:00:15.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/ce/a11d381192966e0b4290842cc8d4fac7dc9214ddf627c11c1afff87da29b/ruff-0.11.13-py3-none-linux_armv6l.whl", hash = "sha256:4bdfbf1240533f40042ec00c9e09a3aade6f8c10b6414cf11b519488d2635d46", size = 10292516, upload-time = "2025-06-05T20:59:32.944Z" }, + { url = "https://files.pythonhosted.org/packages/78/db/87c3b59b0d4e753e40b6a3b4a2642dfd1dcaefbff121ddc64d6c8b47ba00/ruff-0.11.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aef9c9ed1b5ca28bb15c7eac83b8670cf3b20b478195bd49c8d756ba0a36cf48", size = 11106083, upload-time = "2025-06-05T20:59:37.03Z" }, + { url = "https://files.pythonhosted.org/packages/77/79/d8cec175856ff810a19825d09ce700265f905c643c69f45d2b737e4a470a/ruff-0.11.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53b15a9dfdce029c842e9a5aebc3855e9ab7771395979ff85b7c1dedb53ddc2b", size = 10436024, upload-time = "2025-06-05T20:59:39.741Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5b/f6d94f2980fa1ee854b41568368a2e1252681b9238ab2895e133d303538f/ruff-0.11.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab153241400789138d13f362c43f7edecc0edfffce2afa6a68434000ecd8f69a", size = 10646324, upload-time = "2025-06-05T20:59:42.185Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9c/b4c2acf24ea4426016d511dfdc787f4ce1ceb835f3c5fbdbcb32b1c63bda/ruff-0.11.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c51f93029d54a910d3d24f7dd0bb909e31b6cd989a5e4ac513f4eb41629f0dc", size = 10174416, upload-time = "2025-06-05T20:59:44.319Z" }, + { url = "https://files.pythonhosted.org/packages/f3/10/e2e62f77c65ede8cd032c2ca39c41f48feabedb6e282bfd6073d81bb671d/ruff-0.11.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1808b3ed53e1a777c2ef733aca9051dc9bf7c99b26ece15cb59a0320fbdbd629", size = 11724197, upload-time = "2025-06-05T20:59:46.935Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f0/466fe8469b85c561e081d798c45f8a1d21e0b4a5ef795a1d7f1a9a9ec182/ruff-0.11.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d28ce58b5ecf0f43c1b71edffabe6ed7f245d5336b17805803312ec9bc665933", size = 12511615, upload-time = "2025-06-05T20:59:49.534Z" }, + { url = "https://files.pythonhosted.org/packages/17/0e/cefe778b46dbd0cbcb03a839946c8f80a06f7968eb298aa4d1a4293f3448/ruff-0.11.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55e4bc3a77842da33c16d55b32c6cac1ec5fb0fbec9c8c513bdce76c4f922165", size = 12117080, upload-time = "2025-06-05T20:59:51.654Z" }, + { url = "https://files.pythonhosted.org/packages/5d/2c/caaeda564cbe103bed145ea557cb86795b18651b0f6b3ff6a10e84e5a33f/ruff-0.11.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:633bf2c6f35678c56ec73189ba6fa19ff1c5e4807a78bf60ef487b9dd272cc71", size = 11326315, upload-time = "2025-06-05T20:59:54.469Z" }, + { url = "https://files.pythonhosted.org/packages/75/f0/782e7d681d660eda8c536962920c41309e6dd4ebcea9a2714ed5127d44bd/ruff-0.11.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ffbc82d70424b275b089166310448051afdc6e914fdab90e08df66c43bb5ca9", size = 11555640, upload-time = "2025-06-05T20:59:56.986Z" }, + { url = "https://files.pythonhosted.org/packages/5d/d4/3d580c616316c7f07fb3c99dbecfe01fbaea7b6fd9a82b801e72e5de742a/ruff-0.11.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a9ddd3ec62a9a89578c85842b836e4ac832d4a2e0bfaad3b02243f930ceafcc", size = 10507364, upload-time = "2025-06-05T20:59:59.154Z" }, + { url = "https://files.pythonhosted.org/packages/5a/dc/195e6f17d7b3ea6b12dc4f3e9de575db7983db187c378d44606e5d503319/ruff-0.11.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d237a496e0778d719efb05058c64d28b757c77824e04ffe8796c7436e26712b7", size = 10141462, upload-time = "2025-06-05T21:00:01.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/8e/39a094af6967faa57ecdeacb91bedfb232474ff8c3d20f16a5514e6b3534/ruff-0.11.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26816a218ca6ef02142343fd24c70f7cd8c5aa6c203bca284407adf675984432", size = 11121028, upload-time = "2025-06-05T21:00:04.06Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c0/b0b508193b0e8a1654ec683ebab18d309861f8bd64e3a2f9648b80d392cb/ruff-0.11.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:51c3f95abd9331dc5b87c47ac7f376db5616041173826dfd556cfe3d4977f492", size = 11602992, upload-time = "2025-06-05T21:00:06.249Z" }, + { url = "https://files.pythonhosted.org/packages/7c/91/263e33ab93ab09ca06ce4f8f8547a858cc198072f873ebc9be7466790bae/ruff-0.11.13-py3-none-win32.whl", hash = "sha256:96c27935418e4e8e77a26bb05962817f28b8ef3843a6c6cc49d8783b5507f250", size = 10474944, upload-time = "2025-06-05T21:00:08.459Z" }, + { url = "https://files.pythonhosted.org/packages/46/f4/7c27734ac2073aae8efb0119cae6931b6fb48017adf048fdf85c19337afc/ruff-0.11.13-py3-none-win_amd64.whl", hash = "sha256:29c3189895a8a6a657b7af4e97d330c8a3afd2c9c8f46c81e2fc5a31866517e3", size = 11548669, upload-time = "2025-06-05T21:00:11.147Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bf/b273dd11673fed8a6bd46032c0ea2a04b2ac9bfa9c628756a5856ba113b0/ruff-0.11.13-py3-none-win_arm64.whl", hash = "sha256:b4385285e9179d608ff1d2fb9922062663c658605819a6876d8beef0c30b7f3b", size = 10683928, upload-time = "2025-06-05T21:00:13.758Z" }, +] + [[package]] name = "urllib3" version = "2.2.3" From e0b011a89ccc16344dd92df2102a4cda3237f21a Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 17 Jun 2025 13:24:08 +0200 Subject: [PATCH 08/13] test(actions): ruff warning #03 --- pyproject.toml | 3 +-- uv.lock | 27 --------------------------- 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b7b533e..74d6381 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ dependencies = [ "dynaconf>=3.2.11", ] readme = "README.md" -requires-python = ">= 3.11" +requires-python = ">= 3.11.5" [project.scripts] github-rest-cli = 'github_rest_cli.main:cli' @@ -26,7 +26,6 @@ dev-dependencies = [ "pyinstrument>=5.0.2", "pytest>=8.4.0", "pytest-mock>=3.14.1", - "ruff>=0.11.13", ] [tool.hatch.metadata] diff --git a/uv.lock b/uv.lock index 180384f..7a5766f 100644 --- a/uv.lock +++ b/uv.lock @@ -83,7 +83,6 @@ dev = [ { name = "pyinstrument" }, { name = "pytest" }, { name = "pytest-mock" }, - { name = "ruff" }, ] [package.metadata] @@ -98,7 +97,6 @@ dev = [ { name = "pyinstrument", specifier = ">=5.0.2" }, { name = "pytest", specifier = ">=8.4.0" }, { name = "pytest-mock", specifier = ">=3.14.1" }, - { name = "ruff", specifier = ">=0.11.13" }, ] [[package]] @@ -267,31 +265,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload-time = "2025-03-30T14:15:12.283Z" }, ] -[[package]] -name = "ruff" -version = "0.11.13" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/da/9c6f995903b4d9474b39da91d2d626659af3ff1eeb43e9ae7c119349dba6/ruff-0.11.13.tar.gz", hash = "sha256:26fa247dc68d1d4e72c179e08889a25ac0c7ba4d78aecfc835d49cbfd60bf514", size = 4282054, upload-time = "2025-06-05T21:00:15.721Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/ce/a11d381192966e0b4290842cc8d4fac7dc9214ddf627c11c1afff87da29b/ruff-0.11.13-py3-none-linux_armv6l.whl", hash = "sha256:4bdfbf1240533f40042ec00c9e09a3aade6f8c10b6414cf11b519488d2635d46", size = 10292516, upload-time = "2025-06-05T20:59:32.944Z" }, - { url = "https://files.pythonhosted.org/packages/78/db/87c3b59b0d4e753e40b6a3b4a2642dfd1dcaefbff121ddc64d6c8b47ba00/ruff-0.11.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aef9c9ed1b5ca28bb15c7eac83b8670cf3b20b478195bd49c8d756ba0a36cf48", size = 11106083, upload-time = "2025-06-05T20:59:37.03Z" }, - { url = "https://files.pythonhosted.org/packages/77/79/d8cec175856ff810a19825d09ce700265f905c643c69f45d2b737e4a470a/ruff-0.11.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53b15a9dfdce029c842e9a5aebc3855e9ab7771395979ff85b7c1dedb53ddc2b", size = 10436024, upload-time = "2025-06-05T20:59:39.741Z" }, - { url = "https://files.pythonhosted.org/packages/8b/5b/f6d94f2980fa1ee854b41568368a2e1252681b9238ab2895e133d303538f/ruff-0.11.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab153241400789138d13f362c43f7edecc0edfffce2afa6a68434000ecd8f69a", size = 10646324, upload-time = "2025-06-05T20:59:42.185Z" }, - { url = "https://files.pythonhosted.org/packages/6c/9c/b4c2acf24ea4426016d511dfdc787f4ce1ceb835f3c5fbdbcb32b1c63bda/ruff-0.11.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c51f93029d54a910d3d24f7dd0bb909e31b6cd989a5e4ac513f4eb41629f0dc", size = 10174416, upload-time = "2025-06-05T20:59:44.319Z" }, - { url = "https://files.pythonhosted.org/packages/f3/10/e2e62f77c65ede8cd032c2ca39c41f48feabedb6e282bfd6073d81bb671d/ruff-0.11.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1808b3ed53e1a777c2ef733aca9051dc9bf7c99b26ece15cb59a0320fbdbd629", size = 11724197, upload-time = "2025-06-05T20:59:46.935Z" }, - { url = "https://files.pythonhosted.org/packages/bb/f0/466fe8469b85c561e081d798c45f8a1d21e0b4a5ef795a1d7f1a9a9ec182/ruff-0.11.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d28ce58b5ecf0f43c1b71edffabe6ed7f245d5336b17805803312ec9bc665933", size = 12511615, upload-time = "2025-06-05T20:59:49.534Z" }, - { url = "https://files.pythonhosted.org/packages/17/0e/cefe778b46dbd0cbcb03a839946c8f80a06f7968eb298aa4d1a4293f3448/ruff-0.11.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55e4bc3a77842da33c16d55b32c6cac1ec5fb0fbec9c8c513bdce76c4f922165", size = 12117080, upload-time = "2025-06-05T20:59:51.654Z" }, - { url = "https://files.pythonhosted.org/packages/5d/2c/caaeda564cbe103bed145ea557cb86795b18651b0f6b3ff6a10e84e5a33f/ruff-0.11.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:633bf2c6f35678c56ec73189ba6fa19ff1c5e4807a78bf60ef487b9dd272cc71", size = 11326315, upload-time = "2025-06-05T20:59:54.469Z" }, - { url = "https://files.pythonhosted.org/packages/75/f0/782e7d681d660eda8c536962920c41309e6dd4ebcea9a2714ed5127d44bd/ruff-0.11.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ffbc82d70424b275b089166310448051afdc6e914fdab90e08df66c43bb5ca9", size = 11555640, upload-time = "2025-06-05T20:59:56.986Z" }, - { url = "https://files.pythonhosted.org/packages/5d/d4/3d580c616316c7f07fb3c99dbecfe01fbaea7b6fd9a82b801e72e5de742a/ruff-0.11.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a9ddd3ec62a9a89578c85842b836e4ac832d4a2e0bfaad3b02243f930ceafcc", size = 10507364, upload-time = "2025-06-05T20:59:59.154Z" }, - { url = "https://files.pythonhosted.org/packages/5a/dc/195e6f17d7b3ea6b12dc4f3e9de575db7983db187c378d44606e5d503319/ruff-0.11.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d237a496e0778d719efb05058c64d28b757c77824e04ffe8796c7436e26712b7", size = 10141462, upload-time = "2025-06-05T21:00:01.481Z" }, - { url = "https://files.pythonhosted.org/packages/f4/8e/39a094af6967faa57ecdeacb91bedfb232474ff8c3d20f16a5514e6b3534/ruff-0.11.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26816a218ca6ef02142343fd24c70f7cd8c5aa6c203bca284407adf675984432", size = 11121028, upload-time = "2025-06-05T21:00:04.06Z" }, - { url = "https://files.pythonhosted.org/packages/5a/c0/b0b508193b0e8a1654ec683ebab18d309861f8bd64e3a2f9648b80d392cb/ruff-0.11.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:51c3f95abd9331dc5b87c47ac7f376db5616041173826dfd556cfe3d4977f492", size = 11602992, upload-time = "2025-06-05T21:00:06.249Z" }, - { url = "https://files.pythonhosted.org/packages/7c/91/263e33ab93ab09ca06ce4f8f8547a858cc198072f873ebc9be7466790bae/ruff-0.11.13-py3-none-win32.whl", hash = "sha256:96c27935418e4e8e77a26bb05962817f28b8ef3843a6c6cc49d8783b5507f250", size = 10474944, upload-time = "2025-06-05T21:00:08.459Z" }, - { url = "https://files.pythonhosted.org/packages/46/f4/7c27734ac2073aae8efb0119cae6931b6fb48017adf048fdf85c19337afc/ruff-0.11.13-py3-none-win_amd64.whl", hash = "sha256:29c3189895a8a6a657b7af4e97d330c8a3afd2c9c8f46c81e2fc5a31866517e3", size = 11548669, upload-time = "2025-06-05T21:00:11.147Z" }, - { url = "https://files.pythonhosted.org/packages/ec/bf/b273dd11673fed8a6bd46032c0ea2a04b2ac9bfa9c628756a5856ba113b0/ruff-0.11.13-py3-none-win_arm64.whl", hash = "sha256:b4385285e9179d608ff1d2fb9922062663c658605819a6876d8beef0c30b7f3b", size = 10683928, upload-time = "2025-06-05T21:00:13.758Z" }, -] - [[package]] name = "urllib3" version = "2.2.3" From 9a1c8f2927e79e1be99d0d38d2a82baf9f3cb7c8 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 17 Jun 2025 13:36:10 +0200 Subject: [PATCH 09/13] test(actions): ruff warning #04 --- .github/workflows/python-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index d1c3be2..c4e6543 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -24,6 +24,8 @@ jobs: python-version: '3.11' - uses: astral-sh/ruff-action@v3 + with: + version: "latest" - name: Ruff lint run: ruff check . From 08e4a6ad9eb9c6b7d482e7d87241d5c3303ed76a Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 17 Jun 2025 17:28:11 +0200 Subject: [PATCH 10/13] feat: refactor tests for create repository function --- tests/test_api.py | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index f300fbc..0be3e5a 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,53 +1,43 @@ from github_rest_cli import api +GET_HEADERS_FUNCTION = "github_rest_cli.api.get_headers" +FETCH_USER_FUNCTION = "github_rest_cli.api.fetch_user" +REQUEST_HANDLER_FUNCTION = "github_rest_cli.api.request_with_handling" + + def test_fetch_user(mocker): - mocker.patch( - "github_rest_cli.api.get_headers", return_value={"Authorization": "token fake"} - ) + mocker.patch(GET_HEADERS_FUNCTION, return_value={"Authorization": "token fake"}) mock_response = mocker.Mock() mock_response.status_code = 200 mock_response.json.return_value = {"login": "test-user"} mock_response.raise_for_status = lambda: None - mocker.patch( - "github_rest_cli.api.request_with_handling", return_value=mock_response - ) + mocker.patch(REQUEST_HANDLER_FUNCTION, return_value=mock_response) result = api.fetch_user() assert result == "test-user" -def test_create_repository_user(mocker): - mocker.patch( - "github_rest_cli.api.get_headers", return_value={"Authorization": "token fake"} - ) - - mocker.patch("github_rest_cli.api.fetch_user", return_value="test-user") - +def test_create_repository_user_expected_message(mocker): expected_message = "Repository successfully created in test-user/test-repo." - mocker.patch( - "github_rest_cli.api.request_with_handling", return_value=expected_message - ) + mocker.patch(GET_HEADERS_FUNCTION, return_value={"Authorization": "token fake"}) + mocker.patch(FETCH_USER_FUNCTION, return_value="test-user") + mocker.patch(REQUEST_HANDLER_FUNCTION, return_value=expected_message) result = api.create_repository("test-repo", "public") assert result == expected_message -def test_create_repository_org(mocker): - mocker.patch( - "github_rest_cli.api.get_headers", return_value={"Authorization": "token fake"} - ) - +def test_create_repository_org_expected_message(mocker): expected_message = "Repository successfully created in test-org/test-repo." - mocker.patch( - "github_rest_cli.api.request_with_handling", return_value=expected_message - ) + mocker.patch(GET_HEADERS_FUNCTION, return_value={"Authorization": "token fake"}) + mocker.patch(REQUEST_HANDLER_FUNCTION, return_value=expected_message) result = api.create_repository("test-repo", "public", "test-org") From 2c490f8e9d79a2b81dd7c2ba212354c2eb580ce2 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Wed, 18 Jun 2025 08:47:34 +0200 Subject: [PATCH 11/13] feat(actions): update python-ci workflow with new job --- .github/workflows/python-ci.yml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index c4e6543..c9cb69b 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -33,10 +33,30 @@ jobs: - name: Ruff fmt run: ruff format . + test: + name: Python tests + runs-on: ubuntu-latest + needs: lint + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up uv + uses: astral-sh/setup-uv@v6 + + - name: uv sync + run: uv sync + + - uses: extractions/setup-just@v3 + + - name: Run tests + run: just test + build: name: Build runs-on: ubuntu-latest - needs: lint + needs: [lint, test] steps: - name: Checkout repository From c46acec55274e48399e59eca02a23842fd8f3d24 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 19 Aug 2025 01:13:20 +0200 Subject: [PATCH 12/13] feat: rename test functions --- tests/test_api.py | 4 ++-- uv.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 0be3e5a..f70bb6f 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -21,7 +21,7 @@ def test_fetch_user(mocker): assert result == "test-user" -def test_create_repository_user_expected_message(mocker): +def test_create_repository_user(mocker): expected_message = "Repository successfully created in test-user/test-repo." mocker.patch(GET_HEADERS_FUNCTION, return_value={"Authorization": "token fake"}) @@ -33,7 +33,7 @@ def test_create_repository_user_expected_message(mocker): assert result == expected_message -def test_create_repository_org_expected_message(mocker): +def test_create_repository_org(mocker): expected_message = "Repository successfully created in test-org/test-repo." mocker.patch(GET_HEADERS_FUNCTION, return_value={"Authorization": "token fake"}) diff --git a/uv.lock b/uv.lock index 7a5766f..27623f4 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 2 -requires-python = ">=3.11" +requires-python = ">=3.11.5" [[package]] name = "certifi" From f3989244d49ceef9671f916f06b888350e0a5b0f Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 19 Aug 2025 01:15:07 +0200 Subject: [PATCH 13/13] test: uv sync #01 --- .github/workflows/python-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index c9cb69b..9786e9a 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -51,7 +51,9 @@ jobs: - uses: extractions/setup-just@v3 - name: Run tests - run: just test + run: | + source .venv/bin/activate + just test build: name: Build