From 641c30ef0faf561f78eb97429e825167839dd890 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 12:34:39 +0200 Subject: [PATCH 01/17] feat: refactor github_rest_api to github_rest_cli --- README.md | 6 +++--- pyproject.toml | 8 ++++---- src/github_rest_api/__init__.py | 1 - src/github_rest_cli/__init__.py | 1 + src/{github_rest_api => github_rest_cli}/config.py | 0 src/{github_rest_api => github_rest_cli}/main.py | 2 +- uv.lock | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 src/github_rest_api/__init__.py create mode 100644 src/github_rest_cli/__init__.py rename src/{github_rest_api => github_rest_cli}/config.py (100%) rename src/{github_rest_api => github_rest_cli}/main.py (99%) diff --git a/README.md b/README.md index b0a1e5b..293dc1f 100644 --- a/README.md +++ b/README.md @@ -31,15 +31,15 @@ github-rest-api -h List all defined parameters: ```shell -dynaconf -i github_rest_api.config.settings list +dynaconf -i github_rest_cli.config.settings list ``` Validate all defined parameters: ```shell -dynaconf -i github_rest_api.config.settings validate +dynaconf -i github_rest_cli.config.settings validate ``` -**NOTE:** `dynaconf_validators.toml` must exist. +**NOTE:** To run dynaconf validate `dynaconf_validators.toml` should exist. ### Ruff diff --git a/pyproject.toml b/pyproject.toml index 56fb2d9..4a84bf9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] -name = "github-rest-api" -version = "0.1.0" -description = "Add your description here" +name = "github-rest-cli" +version = "0.2.0" +description = "GitHub REST API cli" authors = [ { name = "lbrealdev", email = "lbrealdeveloper@gmail.com" } ] @@ -14,7 +14,7 @@ readme = "README.md" requires-python = ">= 3.11" [project.scripts] -github-rest-api = 'github_rest_api.main:cli' +github-rest-cli = 'github_rest_cli.main:cli' [build-system] requires = ["hatchling"] diff --git a/src/github_rest_api/__init__.py b/src/github_rest_api/__init__.py deleted file mode 100644 index 3dc1f76..0000000 --- a/src/github_rest_api/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "0.1.0" diff --git a/src/github_rest_cli/__init__.py b/src/github_rest_cli/__init__.py new file mode 100644 index 0000000..d3ec452 --- /dev/null +++ b/src/github_rest_cli/__init__.py @@ -0,0 +1 @@ +__version__ = "0.2.0" diff --git a/src/github_rest_api/config.py b/src/github_rest_cli/config.py similarity index 100% rename from src/github_rest_api/config.py rename to src/github_rest_cli/config.py diff --git a/src/github_rest_api/main.py b/src/github_rest_cli/main.py similarity index 99% rename from src/github_rest_api/main.py rename to src/github_rest_cli/main.py index ce54dcb..9e61cc7 100644 --- a/src/github_rest_api/main.py +++ b/src/github_rest_cli/main.py @@ -1,7 +1,7 @@ import requests import argparse import json -from github_rest_api.config import settings +from github_rest_cli.config import settings from rich.console import Console from rich import print as rprint from rich.text import Text diff --git a/uv.lock b/uv.lock index 4096c48..14ae87f 100644 --- a/uv.lock +++ b/uv.lock @@ -59,8 +59,8 @@ wheels = [ ] [[package]] -name = "github-rest-api" -version = "0.1.0" +name = "github-rest-cli" +version = "0.2.0" source = { editable = "." } dependencies = [ { name = "dynaconf" }, From f843555ce85c93c173cf27c25dfec86bac09b060 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 12:38:57 +0200 Subject: [PATCH 02/17] fix(actions): python-ci.yml --- .github/workflows/python-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 340c793..902c5ab 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -2,12 +2,12 @@ name: Python CI run-name: Python build and test on: pull_request: + branches: + - main types: - opened - synchronize - closed - branches: - - 'main' jobs: lint: @@ -44,7 +44,7 @@ jobs: - name: Debug CLI run: | source .venv/bin/activate - github-rest-api -h + github-rest-cli -h env: GITHUB_API_URL: https://api.github.com GITHUB_USER: rest-api-user From e864e553502522afb511b779ab26e7c76d44cda0 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 12:40:53 +0200 Subject: [PATCH 03/17] feat(dependabot): update dependabot.yml --- .github/dependabot.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index af80d6e..8c39ef1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,20 +1,16 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - version: 2 updates: - - package-ecosystem: "pip" + - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" - time: "13:00" - timezone: "Europe/Madrid" - - - package-ecosystem: "github-actions" + time: "06:00" + open-pull-requests-limit: 10 + + - package-ecosystem: "pip" directory: "/" schedule: interval: "daily" - time: "00:00" - timezone: "Europe/Madrid" + time: "06:00" + target-branch: "main" + open-pull-requests-limit: 10 \ No newline at end of file From 3f9532b55fc27e7e61de8275d5422faa2b8addc8 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 13:09:07 +0200 Subject: [PATCH 04/17] feat: add justfile --- justfile | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 justfile diff --git a/justfile b/justfile new file mode 100644 index 0000000..2eb6665 --- /dev/null +++ b/justfile @@ -0,0 +1,9 @@ +# Justfile for Python + +set dotenv-load := true + +test: + @echo {{justfile_directory()}} + +cc: + uv clean cache \ No newline at end of file From 00d77c121d90acdee44cb3f5ec56ee8b07846bf5 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 13:20:28 +0200 Subject: [PATCH 05/17] feat(just): add new recipes --- justfile | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/justfile b/justfile index 2eb6665..6ed7972 100644 --- a/justfile +++ b/justfile @@ -3,7 +3,16 @@ set dotenv-load := true test: - @echo {{justfile_directory()}} + @echo {{ justfile_directory() }} cc: - uv clean cache \ No newline at end of file + uv clean cache + +setup-ruff: + uv tool install ruff + +lint: + ruff check . + +fmt: + ruff format . From 322f786e463bcf1c206432876e97e1902e6d15f2 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 13:47:25 +0200 Subject: [PATCH 06/17] feat(just): add dynaconf recipes --- README.md | 17 ++++++----------- justfile | 11 +++++++++++ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 293dc1f..2bff146 100644 --- a/README.md +++ b/README.md @@ -27,33 +27,28 @@ Run the `github-rest-api` cli: github-rest-api -h ``` -### Dynaconfg +### Dynaconf List all defined parameters: ```shell -dynaconf -i github_rest_cli.config.settings list +just dl ``` Validate all defined parameters: ```shell -dynaconf -i github_rest_cli.config.settings validate +just dv ``` **NOTE:** To run dynaconf validate `dynaconf_validators.toml` should exist. ### Ruff -Install ruff via uv: +Run lint: ```shell -uv tool install ruff -``` - -Run check: -```shell -ruff check . +just lint ``` Run format: ```shell -ruff format . +just fmt ``` diff --git a/justfile b/justfile index 6ed7972..456b46b 100644 --- a/justfile +++ b/justfile @@ -2,6 +2,11 @@ set dotenv-load := true +# Alias + +alias dl := dynaconf-list +alias dv := dynaconf-validate + test: @echo {{ justfile_directory() }} @@ -16,3 +21,9 @@ lint: fmt: ruff format . + +dynaconf-list: + dynaconf -i github_rest_cli.config.settings list + +dynaconf-validate: + dynaconf -i github_rest_cli.config.settings validate From 45050c0d57a603c6daf98f4593149dcb14abebc0 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 15:43:26 +0200 Subject: [PATCH 07/17] feat: update dynaconf validator --- README.md | 7 ++++++- pyproject.toml | 4 ++-- src/github_rest_cli/config.py | 7 +++++-- src/github_rest_cli/main.py | 2 +- uv.lock | 20 ++++++++++++-------- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 2bff146..562d2b6 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,16 @@ Set up python package dependencies in `pyproject.toml`: uv sync ``` -Activate `virtualenv`: +After sync the project, activate virtualenv in `.venv` directory: ```shell source .venv/bin/activate ``` +To list all installed packages, run: +```shell +uv pip list +``` + Export required environment variables: ```shell export GITHUB_USER="" diff --git a/pyproject.toml b/pyproject.toml index 4a84bf9..8c793d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,8 +7,8 @@ authors = [ ] dependencies = [ "requests>=2.31.0", - "rich>=13.6.0", - "dynaconf>=3.2.3", + "rich>=14.0.0", + "dynaconf>=3.2.11", ] readme = "README.md" requires-python = ">= 3.11" diff --git a/src/github_rest_cli/config.py b/src/github_rest_cli/config.py index 00b1c3a..e029050 100644 --- a/src/github_rest_cli/config.py +++ b/src/github_rest_cli/config.py @@ -12,8 +12,11 @@ # The script will not work if the variables # defined in the Validator class are not defined. validators=[ - Validator("API_URL", must_exist=True, cont="github") - & Validator("AUTH_TOKEN", must_exist=True), + Validator( + "AUTH_TOKEN", + must_exist=True, + messages={"must_exist_true": "Environment variable GITHUB_AUTH_TOKEN is not set. Please set it and try again."} + ), ], ) diff --git a/src/github_rest_cli/main.py b/src/github_rest_cli/main.py index 9e61cc7..f23d50a 100644 --- a/src/github_rest_cli/main.py +++ b/src/github_rest_cli/main.py @@ -7,7 +7,7 @@ from rich.text import Text -GITHUB_URL = f"{settings.API_URL}" +GITHUB_URL = "https://api.github.com" GITHUB_USER = f"{settings.USER}" GITHUB_TOKEN = f"{settings.AUTH_TOKEN}" diff --git a/uv.lock b/uv.lock index 14ae87f..5a9a726 100644 --- a/uv.lock +++ b/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 1 requires-python = ">=3.11" [[package]] @@ -51,11 +52,11 @@ wheels = [ [[package]] name = "dynaconf" -version = "3.2.6" +version = "3.2.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/56/1a/324f1bf234cc4f98445305fd8719245318466e310e05caea7ef052748ecd/dynaconf-3.2.6.tar.gz", hash = "sha256:74cc1897396380bb957730eb341cc0976ee9c38bbcb53d3307c50caed0aedfb8", size = 229209 } +sdist = { url = "https://files.pythonhosted.org/packages/62/eb/e9d1249ff56b11e63fd8c7d0fcc1f94704e21693c16862bf0ebfb07bd61a/dynaconf-3.2.11.tar.gz", hash = "sha256:4cfc6a730c533bf1a1d0bf266ae202133a22236bb3227d23eff4b8542d4034a5", size = 234694 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/14/c8a7d861262139688fa465d2e27ff7113764d6fa03b15b9c7b666729ea2e/dynaconf-3.2.6-py2.py3-none-any.whl", hash = "sha256:3911c740d717df4576ed55f616c7cbad6e06bc8ef23ffca444b6e2a12fb1c34c", size = 231063 }, + { url = "https://files.pythonhosted.org/packages/36/64/580c74003a356c5662e7b1da43ecd7cbda6e8f970c87b30c5a654c8ccb53/dynaconf-3.2.11-py2.py3-none-any.whl", hash = "sha256:660de90879d4da236f79195692a7d197957224d7acf922bcc6899187dc7b4a27", size = 236536 }, ] [[package]] @@ -70,11 +71,14 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "dynaconf", specifier = ">=3.2.3" }, + { name = "dynaconf", specifier = ">=3.2.11" }, { name = "requests", specifier = ">=2.31.0" }, - { name = "rich", specifier = ">=13.6.0" }, + { name = "rich", specifier = ">=14.0.0" }, ] +[package.metadata.requires-dev] +dev = [] + [[package]] name = "idna" version = "3.10" @@ -131,15 +135,15 @@ wheels = [ [[package]] name = "rich" -version = "13.9.2" +version = "14.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/9e/1784d15b057b0075e5136445aaea92d23955aad2c93eaede673718a40d95/rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c", size = 222843 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1", size = 242117 }, + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, ] [[package]] From 02ed83510c9f8e124fae2df70b474a4f964dff78 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 15:47:09 +0200 Subject: [PATCH 08/17] feat(just): add setup-pre-commit recipe --- .pre-commit-config.yaml | 8 ++++++++ justfile | 19 +++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..102255c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,8 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files diff --git a/justfile b/justfile index 456b46b..6053bfd 100644 --- a/justfile +++ b/justfile @@ -7,23 +7,26 @@ set dotenv-load := true alias dl := dynaconf-list alias dv := dynaconf-validate +@setup-pre-commit: + pre-commit install + +@setup-ruff: + uv tool install ruff + test: @echo {{ justfile_directory() }} -cc: +@cc: uv clean cache -setup-ruff: - uv tool install ruff - -lint: +@lint: ruff check . -fmt: +@fmt: ruff format . -dynaconf-list: +@dynaconf-list: dynaconf -i github_rest_cli.config.settings list -dynaconf-validate: +@dynaconf-validate: dynaconf -i github_rest_cli.config.settings validate From b850cf8a269312ab6486fb563fc9ea9ef4990bc5 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 22:11:50 +0200 Subject: [PATCH 09/17] feat: refactor API logic with request_with_handling and build_url functions --- src/github_rest_cli/api.py | 181 ++++++++++++++++++ src/github_rest_cli/globals.py | 10 + src/github_rest_cli/main.py | 337 +++++++-------------------------- src/github_rest_cli/utils.py | 5 + 4 files changed, 265 insertions(+), 268 deletions(-) create mode 100644 src/github_rest_cli/api.py create mode 100644 src/github_rest_cli/globals.py create mode 100644 src/github_rest_cli/utils.py diff --git a/src/github_rest_cli/api.py b/src/github_rest_cli/api.py new file mode 100644 index 0000000..a5bf641 --- /dev/null +++ b/src/github_rest_cli/api.py @@ -0,0 +1,181 @@ +import requests +import json +from github_rest_cli.globals import GITHUB_URL, HEADERS +from github_rest_cli.utils import rich_output, rprint + + +def request_with_handling(method, url, success_msg: str = None, error_msg: str = None, **kwargs): + try: + response = requests.request(method, url, **kwargs) + response.raise_for_status() + if success_msg: + rich_output(success_msg) + except requests.exceptions.HTTPError as e: + status = e.response.status_code + if error_msg and status in error_msg: + rich_output(error_msg[status], format_str="bold red") + else: + rich_output(f"Request failed: status code {status}", format_str="bold red") + return None + except requests.exceptions.RequestException as e: + rich_output(f"Request error: {e}", format_str="bold red") + return None + + +def build_url(*segments: str) -> str: + """ + Build an GitHub REST API endpoint + + Example: + build_url("repos", "org", "repo", "environments", "prod") + + Result: + https://api.github.com/repos/org/repo/environments/prod + """ + base = GITHUB_URL.rstrip('/') + path = "/".join(segment.strip('/') for segment in segments) + return f"{base}/{path}" + + +def fetch_user(): + url = build_url("user") + response = request_with_handling("GET", url, headers=HEADERS) + if response: + data = response.json() + return data.get('login') + return None + + +def get_repository(owner: str, name: str, org: str = None): + url = build_url("repos", org or owner, name) + response = request_with_handling("GET", url, headers=HEADERS) + if response: + data = response.json() + rprint(data) + + +def create_repository(owner: str, name: str, visibility: str, org: str = None): + data = { + "name": name, + "auto_init": "true", + "visibility": visibility, + } + + if visibility == "private": + data["private"] = True + + url = ( + build_url("orgs", org, "repos") + if org + else build_url("user", "repos") + ) + + return request_with_handling( + "POST", + url, + headers=HEADERS, + json=data, + success_msg=f"Repository successfully created in {owner or org }/{name}", + error_msg={ + 401: "Unauthorized access. Please check your token or credentials.", + 422: "Repository name already exists on this account or organization.", + }, + ) + + +def delete_repository(owner: str, name: str, org: str = None): + url = ( + build_url("repos", org, name) + if org + else build_url("repos", owner, name) + ) + + return request_with_handling( + "DELETE", + url, + headers=HEADERS, + success_msg=f"Repository sucessfully deleted in {owner or org}/{name}", + error_msg={ + 403: "The authenticated user does not have sufficient permissions to delete this repository.", + 404: "The requested repository was not found.", + }, + ) + + +def list_repositories(page: int, property: str, role: str): + try: + params = {"per_page": page, "sort": property, "type": role} + req = requests.get(f"{GITHUB_URL}/user/repos", headers=HEADERS, params=params) + req.raise_for_status() + repositories = json.loads(req.text) + repository_full_name = [repo["full_name"] for repo in repositories] + for repos in repository_full_name: + rich_output(f"- {repos}", format_str="bold green") + rich_output( + f"\nTotal repositories: {len(repository_full_name)}", + format_str="bold green", + ) + + except requests.exceptions.HTTPError as e: + if e.response.status_code == 401: + rich_output( + "Unauthorized access. Please check your token or credentials.", + format_str="bold red", + ) + else: + rich_output( + f"Failed to list repositories for {GITHUB_USER} Status code: {e.response.status_code}", + format_str="bold red", + ) + + +def dependabot_security(name: str, org: str, enabled: bool): + is_enabled = bool(enabled) + + try: + url = ( + f"{GITHUB_URL}/repos/{org}/{name}" + if org + else f"{GITHUB_URL}/repos/{GITHUB_USER}/{name}" + ) + if is_enabled: + for endpoint in ["vulnerability-alerts", "automated-security-fixes"]: + req = requests.put(f"{url}/{endpoint}", headers=HEADERS) + req.raise_for_status() + rich_output( + f"Dependabot has been activated on repository {org or GITHUB_USER}/{name}", + format_str="bold green", + ) + else: + req = requests.delete(f"{url}/vulnerability-alerts", headers=HEADERS) + req.raise_for_status() + rich_output( + f"Dependabot has been disabled on repository {org or GITHUB_USER}/{name}", + format_str="bold green", + ) + except requests.exceptions.RequestException as e: + rprint(f"Error: {e}") + + +def deployment_environment(name: str, env: str, org: str): + try: + url = ( + f"{GITHUB_URL}/repos/{org}/{name}/environments/{env}" + if org + else f"{GITHUB_URL}/repos/{GITHUB_USER}/{name}/environments/{env}" + ) + req = requests.put(url, headers=HEADERS) + req.raise_for_status() + rich_output( + f"Environment '{env.upper()}' created.\n" + + f"Repository: {org or GITHUB_USER}/{name}", + format_str="bold green", + ) + except requests.exceptions.HTTPError as e: + if e.response.status_code == 422: + rich_output( + f"Failed to create environment {env.upper()}", + format_str="bold red", + ) + else: + rprint(f"Error: {e}") diff --git a/src/github_rest_cli/globals.py b/src/github_rest_cli/globals.py new file mode 100644 index 0000000..bcda475 --- /dev/null +++ b/src/github_rest_cli/globals.py @@ -0,0 +1,10 @@ +from github_rest_cli.config import settings + +GITHUB_URL = "https://api.github.com" +GITHUB_TOKEN = f"{settings.AUTH_TOKEN}" + +HEADERS = { + "Accept": "application/vnd.github+json", + "X-GitHub-Api-Version": "2022-11-28", + "Authorization": f"token {GITHUB_TOKEN}", +} diff --git a/src/github_rest_cli/main.py b/src/github_rest_cli/main.py index f23d50a..fc68cd1 100644 --- a/src/github_rest_cli/main.py +++ b/src/github_rest_cli/main.py @@ -1,206 +1,5 @@ -import requests import argparse -import json -from github_rest_cli.config import settings -from rich.console import Console -from rich import print as rprint -from rich.text import Text - - -GITHUB_URL = "https://api.github.com" -GITHUB_USER = f"{settings.USER}" -GITHUB_TOKEN = f"{settings.AUTH_TOKEN}" - -HEADERS = { - "Accept": "application/vnd.github+json", - "X-GitHub-Api-Version": "2022-11-28", - "Authorization": f"token {GITHUB_TOKEN}", -} - - -def rich_output(input_str: str, format_str: str): - console = Console() - text = Text(input_str) - text.stylize(format_str) - console.print(text) - - -def get_repository(name: str, org: str): - try: - url = ( - f"{GITHUB_URL}/repos/{org}/{name}" - if org - else f"{GITHUB_URL}/repos/{GITHUB_USER}/{name}" - ) - req = requests.get(url, headers=HEADERS) - req.raise_for_status() - source_repo = json.loads(req.text) - rprint(source_repo) - except requests.exceptions.HTTPError as e: - if e.response.status_code == 401: - rich_output( - "Unauthorized access. Please check your token or credentials.", - format_str="bold red", - ) - elif e.response.status_code == 404: - rich_output( - "The requested repository does not exist!", format_str="bold red" - ) - else: - rich_output( - f"Failed to get repository {name}\n" - + f"Status code: {str(e.response.status_code)}", - format_str="bold red", - ) - - -def create_repository(name: str, visibility: str, org: str): - data = { - "name": name, - "auto_init": "true", - "visibility": visibility, - } - - if visibility == "private": - data["private"] = True - - try: - url = f"{GITHUB_URL}/orgs/{org}/repos" if org else f"{GITHUB_URL}/user/repos" - req = requests.post(url, headers=HEADERS, json=data) - req.raise_for_status() - rich_output( - f"Repository successfully created in {org or GITHUB_USER}/{name}", - format_str="bold green", - ) - except requests.exceptions.HTTPError as e: - if e.response.status_code == 401: - rich_output( - "Unauthorized access. Please check your token or credentials.", - format_str="bold red", - ) - elif e.response.status_code == 422: - rich_output( - "Repository name already exists on this account or organization!", - format_str="bold red", - ) - else: - rich_output( - f"Failed to create repository {name}\ - Status code: {e.response.status_code}", - format_str="bold red", - ) - - -def delete_repository(name: str, org: str): - try: - url = ( - f"{GITHUB_URL}/repos/{org}/{name}" - if org - else f"{GITHUB_URL}/repos/{GITHUB_USER}/{name}" - ) - req = requests.delete(url, headers=HEADERS) - req.raise_for_status() - rich_output( - f"Repository sucessfully deleted in {org or GITHUB_USER}/{name}", - format_str="bold green", - ) - except requests.exceptions.HTTPError as e: - if e.response.status_code == 403: - rich_output( - "You are not an admin of this repository!", - format_str="bold red", - ) - elif e.response.status_code == 404: - rich_output( - "The requested repository was not found!", - format_str="bold red", - ) - else: - rich_output( - f"Failed to delete repository {name}\ - with status code {e.response.status_code}", - format_str="bold red", - ) - - -def list_repositories(page: int, property: str, role: str): - try: - params = {"per_page": page, "sort": property, "type": role} - req = requests.get(f"{GITHUB_URL}/user/repos", headers=HEADERS, params=params) - req.raise_for_status() - repositories = json.loads(req.text) - repository_full_name = [repo["full_name"] for repo in repositories] - for repos in repository_full_name: - rich_output(f"- {repos}", format_str="bold green") - rich_output( - f"\nTotal repositories: {len(repository_full_name)}", - format_str="bold green", - ) - - except requests.exceptions.HTTPError as e: - if e.response.status_code == 401: - rich_output( - "Unauthorized access. Please check your token or credentials.", - format_str="bold red", - ) - else: - rich_output( - f"Failed to list repositories for {GITHUB_USER} Status code: {e.response.status_code}", - format_str="bold red", - ) - - -def dependabot_security(name: str, org: str, enabled: bool): - is_enabled = bool(enabled) - - try: - url = ( - f"{GITHUB_URL}/repos/{org}/{name}" - if org - else f"{GITHUB_URL}/repos/{GITHUB_USER}/{name}" - ) - if is_enabled: - for endpoint in ["vulnerability-alerts", "automated-security-fixes"]: - req = requests.put(f"{url}/{endpoint}", headers=HEADERS) - req.raise_for_status() - rich_output( - f"Dependabot has been activated on repository {org or GITHUB_USER}/{name}", - format_str="bold green", - ) - else: - req = requests.delete(f"{url}/vulnerability-alerts", headers=HEADERS) - req.raise_for_status() - rich_output( - f"Dependabot has been disabled on repository {org or GITHUB_USER}/{name}", - format_str="bold green", - ) - except requests.exceptions.RequestException as e: - rprint(f"Error: {e}") - - -def deployment_environment(name: str, env: str, org: str): - try: - url = ( - f"{GITHUB_URL}/repos/{org}/{name}/environments/{env}" - if org - else f"{GITHUB_URL}/repos/{GITHUB_USER}/{name}/environments/{env}" - ) - req = requests.put(url, headers=HEADERS) - req.raise_for_status() - rich_output( - f"Environment '{env.upper()}' created.\n" - + f"Repository: {org or GITHUB_USER}/{name}", - format_str="bold green", - ) - except requests.exceptions.HTTPError as e: - if e.response.status_code == 422: - rich_output( - f"Failed to create environment {env.upper()}", - format_str="bold red", - ) - else: - rprint(f"Error: {e}") - +from github_rest_cli.api import * def cli(): """ @@ -306,82 +105,84 @@ def cli(): help="The organization name", ) - # Subparser for "delete-repository" function - dependabot_parser = subparsers.add_parser( - "dependabot", - help="Github Dependabot security updates", - ) - dependabot_parser.add_argument( - "-n", - "--name", - required=True, - dest="name", - help="The repository name", - ) - dependabot_parser.add_argument( - "-o", - "--org", - dest="org", - help="The organization name", - ) - dependabot_parser.add_argument( - "--enable", - required=False, - action="store_true", - dest="control", - help="Enable dependabot security updates", - ) - dependabot_parser.add_argument( - "--disable", - required=False, - action="store_false", - dest="control", - help="Disable dependabot security updates", - ) - - # Subparser for "deployment-environments" function - deploy_env_parser = subparsers.add_parser( - "environment", - help="Github Deployment environments", - ) - deploy_env_parser.add_argument( - "-n", - "--name", - required=True, - dest="name", - help="The repository name", - ) - deploy_env_parser.add_argument( - "-e", - "--env", - required=True, - dest="env", - help="Deployment environment name", - ) - deploy_env_parser.add_argument( - "-o", - "--org", - required=False, - dest="org", - help="The organization name", - ) + # # Subparser for "dependabot" function + # dependabot_parser = subparsers.add_parser( + # "dependabot", + # help="Github Dependabot security updates", + # ) + # dependabot_parser.add_argument( + # "-n", + # "--name", + # required=True, + # dest="name", + # help="The repository name", + # ) + # dependabot_parser.add_argument( + # "-o", + # "--org", + # dest="org", + # help="The organization name", + # ) + # dependabot_parser.add_argument( + # "--enable", + # required=False, + # action="store_true", + # dest="control", + # help="Enable dependabot security updates", + # ) + # dependabot_parser.add_argument( + # "--disable", + # required=False, + # action="store_false", + # dest="control", + # help="Disable dependabot security updates", + # ) + + # # Subparser for "deployment-environments" function + # deploy_env_parser = subparsers.add_parser( + # "environment", + # help="Github Deployment environments", + # ) + # deploy_env_parser.add_argument( + # "-n", + # "--name", + # required=True, + # dest="name", + # help="The repository name", + # ) + # deploy_env_parser.add_argument( + # "-e", + # "--env", + # required=True, + # dest="env", + # help="Deployment environment name", + # ) + # deploy_env_parser.add_argument( + # "-o", + # "--org", + # required=False, + # dest="org", + # help="The organization name", + # ) # guard clause pattern args = global_parser.parse_args() command = args.command + owner = fetch_user() + if command == "get-repo": - return get_repository(args.name, args.org) + return get_repository(owner, args.name, args.org) if command == "list-repo": return list_repositories(args.page, args.sort, args.role) if command == "create-repo": - return create_repository(args.name, args.visibility, args.org) + return create_repository(owner, args.name, args.visibility, args.org) if command == "delete-repo": - return delete_repository(args.name, args.org) - if command == "dependabot": - return dependabot_security(args.name, args.org, args.control) - if command == "environment": - return deployment_environment(args.name, args.env, args.org) + return delete_repository(owner, args.name, args.org) + # if command == "dependabot": + # return dependabot_security(args.name, args.org, args.control) + # if command == "environment": + # return deployment_environment(args.name, args.env, args.org) return False diff --git a/src/github_rest_cli/utils.py b/src/github_rest_cli/utils.py new file mode 100644 index 0000000..744f3d1 --- /dev/null +++ b/src/github_rest_cli/utils.py @@ -0,0 +1,5 @@ +from rich import print as rprint + + +def rich_output(message: str, format_str: str = "bold green"): + rprint(f"[{format_str}]{message}[/{format_str}]") From 48d6b164c9e484ca9eaf5cd4564641abccd195ca Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 22:22:23 +0200 Subject: [PATCH 10/17] style: ruff lint & fmt --- src/github_rest_cli/api.py | 108 ++++++++++++++++------------------ src/github_rest_cli/config.py | 6 +- src/github_rest_cli/main.py | 9 ++- src/github_rest_cli/utils.py | 2 +- 4 files changed, 64 insertions(+), 61 deletions(-) diff --git a/src/github_rest_cli/api.py b/src/github_rest_cli/api.py index a5bf641..b041ca9 100644 --- a/src/github_rest_cli/api.py +++ b/src/github_rest_cli/api.py @@ -4,22 +4,24 @@ from github_rest_cli.utils import rich_output, rprint -def request_with_handling(method, url, success_msg: str = None, error_msg: str = None, **kwargs): +def request_with_handling( + method, url, success_msg: str = None, error_msg: str = None, **kwargs +): try: - response = requests.request(method, url, **kwargs) - response.raise_for_status() - if success_msg: - rich_output(success_msg) + response = requests.request(method, url, **kwargs) + response.raise_for_status() + if success_msg: + rich_output(success_msg) except requests.exceptions.HTTPError as e: - status = e.response.status_code - if error_msg and status in error_msg: - rich_output(error_msg[status], format_str="bold red") - else: - rich_output(f"Request failed: status code {status}", format_str="bold red") - return None + status = e.response.status_code + if error_msg and status in error_msg: + rich_output(error_msg[status], format_str="bold red") + else: + rich_output(f"Request failed: status code {status}", format_str="bold red") + return None except requests.exceptions.RequestException as e: - rich_output(f"Request error: {e}", format_str="bold red") - return None + rich_output(f"Request error: {e}", format_str="bold red") + return None def build_url(*segments: str) -> str: @@ -32,8 +34,8 @@ def build_url(*segments: str) -> str: Result: https://api.github.com/repos/org/repo/environments/prod """ - base = GITHUB_URL.rstrip('/') - path = "/".join(segment.strip('/') for segment in segments) + base = GITHUB_URL.rstrip("/") + path = "/".join(segment.strip("/") for segment in segments) return f"{base}/{path}" @@ -41,8 +43,8 @@ def fetch_user(): url = build_url("user") response = request_with_handling("GET", url, headers=HEADERS) if response: - data = response.json() - return data.get('login') + data = response.json() + return data.get("login") return None @@ -50,8 +52,8 @@ def get_repository(owner: str, name: str, org: str = None): url = build_url("repos", org or owner, name) response = request_with_handling("GET", url, headers=HEADERS) if response: - data = response.json() - rprint(data) + data = response.json() + rprint(data) def create_repository(owner: str, name: str, visibility: str, org: str = None): @@ -64,42 +66,34 @@ def create_repository(owner: str, name: str, visibility: str, org: str = None): if visibility == "private": data["private"] = True - url = ( - build_url("orgs", org, "repos") - if org - else build_url("user", "repos") - ) + url = build_url("orgs", org, "repos") if org else build_url("user", "repos") return request_with_handling( - "POST", - url, - headers=HEADERS, - json=data, - success_msg=f"Repository successfully created in {owner or org }/{name}", - error_msg={ - 401: "Unauthorized access. Please check your token or credentials.", - 422: "Repository name already exists on this account or organization.", - }, + "POST", + url, + headers=HEADERS, + json=data, + success_msg=f"Repository successfully created in {owner or org }/{name}", + error_msg={ + 401: "Unauthorized access. Please check your token or credentials.", + 422: "Repository name already exists on this account or organization.", + }, ) def delete_repository(owner: str, name: str, org: str = None): - url = ( - build_url("repos", org, name) - if org - else build_url("repos", owner, name) - ) - - return request_with_handling( - "DELETE", - url, - headers=HEADERS, - success_msg=f"Repository sucessfully deleted in {owner or org}/{name}", - error_msg={ - 403: "The authenticated user does not have sufficient permissions to delete this repository.", - 404: "The requested repository was not found.", - }, - ) + url = build_url("repos", org, name) if org else build_url("repos", owner, name) + + return request_with_handling( + "DELETE", + url, + headers=HEADERS, + success_msg=f"Repository sucessfully deleted in {owner or org}/{name}", + error_msg={ + 403: "The authenticated user does not have sufficient permissions to delete this repository.", + 404: "The requested repository was not found.", + }, + ) def list_repositories(page: int, property: str, role: str): @@ -124,51 +118,51 @@ def list_repositories(page: int, property: str, role: str): ) else: rich_output( - f"Failed to list repositories for {GITHUB_USER} Status code: {e.response.status_code}", + f"Failed to list repositories. Status code: {e.response.status_code}", format_str="bold red", ) -def dependabot_security(name: str, org: str, enabled: bool): +def dependabot_security(owner: str, name: str, org: str, enabled: bool): is_enabled = bool(enabled) try: url = ( f"{GITHUB_URL}/repos/{org}/{name}" if org - else f"{GITHUB_URL}/repos/{GITHUB_USER}/{name}" + else f"{GITHUB_URL}/repos/{owner}/{name}" ) if is_enabled: for endpoint in ["vulnerability-alerts", "automated-security-fixes"]: req = requests.put(f"{url}/{endpoint}", headers=HEADERS) req.raise_for_status() rich_output( - f"Dependabot has been activated on repository {org or GITHUB_USER}/{name}", + f"Dependabot has been activated on repository {org or owner}/{name}", format_str="bold green", ) else: req = requests.delete(f"{url}/vulnerability-alerts", headers=HEADERS) req.raise_for_status() rich_output( - f"Dependabot has been disabled on repository {org or GITHUB_USER}/{name}", + f"Dependabot has been disabled on repository {org or owner}/{name}", format_str="bold green", ) except requests.exceptions.RequestException as e: rprint(f"Error: {e}") -def deployment_environment(name: str, env: str, org: str): +def deployment_environment(owner: str, name: str, env: str, org: str = None): try: url = ( f"{GITHUB_URL}/repos/{org}/{name}/environments/{env}" if org - else f"{GITHUB_URL}/repos/{GITHUB_USER}/{name}/environments/{env}" + else f"{GITHUB_URL}/repos/{owner}/{name}/environments/{env}" ) req = requests.put(url, headers=HEADERS) req.raise_for_status() rich_output( f"Environment '{env.upper()}' created.\n" - + f"Repository: {org or GITHUB_USER}/{name}", + + f"Repository: {owner or org}/{name}", format_str="bold green", ) except requests.exceptions.HTTPError as e: diff --git a/src/github_rest_cli/config.py b/src/github_rest_cli/config.py index e029050..20e3e5e 100644 --- a/src/github_rest_cli/config.py +++ b/src/github_rest_cli/config.py @@ -13,9 +13,11 @@ # defined in the Validator class are not defined. validators=[ Validator( - "AUTH_TOKEN", + "AUTH_TOKEN", must_exist=True, - messages={"must_exist_true": "Environment variable GITHUB_AUTH_TOKEN is not set. Please set it and try again."} + messages={ + "must_exist_true": "Environment variable GITHUB_AUTH_TOKEN is not set. Please set it and try again." + }, ), ], ) diff --git a/src/github_rest_cli/main.py b/src/github_rest_cli/main.py index fc68cd1..a0ab1ab 100644 --- a/src/github_rest_cli/main.py +++ b/src/github_rest_cli/main.py @@ -1,5 +1,12 @@ import argparse -from github_rest_cli.api import * +from github_rest_cli.api import ( + fetch_user, + get_repository, + create_repository, + delete_repository, + list_repositories, +) + def cli(): """ diff --git a/src/github_rest_cli/utils.py b/src/github_rest_cli/utils.py index 744f3d1..fc23643 100644 --- a/src/github_rest_cli/utils.py +++ b/src/github_rest_cli/utils.py @@ -2,4 +2,4 @@ def rich_output(message: str, format_str: str = "bold green"): - rprint(f"[{format_str}]{message}[/{format_str}]") + rprint(f"[{format_str}]{message}[/{format_str}]") From 8c8d85c59e625e5a7eb3c2dd7bfafd027093a0ef Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 22:42:01 +0200 Subject: [PATCH 11/17] feat: refactor list_repositories --- src/github_rest_cli/api.py | 48 ++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/github_rest_cli/api.py b/src/github_rest_cli/api.py index b041ca9..685bdb7 100644 --- a/src/github_rest_cli/api.py +++ b/src/github_rest_cli/api.py @@ -12,6 +12,8 @@ def request_with_handling( response.raise_for_status() if success_msg: rich_output(success_msg) + else: + return response except requests.exceptions.HTTPError as e: status = e.response.status_code if error_msg and status in error_msg: @@ -97,30 +99,30 @@ def delete_repository(owner: str, name: str, org: str = None): def list_repositories(page: int, property: str, role: str): - try: - params = {"per_page": page, "sort": property, "type": role} - req = requests.get(f"{GITHUB_URL}/user/repos", headers=HEADERS, params=params) - req.raise_for_status() - repositories = json.loads(req.text) - repository_full_name = [repo["full_name"] for repo in repositories] - for repos in repository_full_name: - rich_output(f"- {repos}", format_str="bold green") - rich_output( - f"\nTotal repositories: {len(repository_full_name)}", - format_str="bold green", - ) + url = build_url("user", "repos") - except requests.exceptions.HTTPError as e: - if e.response.status_code == 401: - rich_output( - "Unauthorized access. Please check your token or credentials.", - format_str="bold red", - ) - else: - rich_output( - f"Failed to list repositories. Status code: {e.response.status_code}", - format_str="bold red", - ) + params = { + "per_page": page, + "sort": property, + "type": role + } + + response = request_with_handling( + "GET", + url, + params=params, + headers=HEADERS, + error_msg={ + 401: "Unauthorized access. Please check your token or credentials." + }, + ) + + if response: + data = response.json() + repo_full_name = [repo['full_name'] for repo in data] + for repos in repo_full_name: + rich_output(f"- {repos}") + rich_output(f"\nTotal repositories: {len(repo_full_name)}") def dependabot_security(owner: str, name: str, org: str, enabled: bool): From f7be9daf42f59a3be3a23b2a888ab22260aa4ea5 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 22:44:23 +0200 Subject: [PATCH 12/17] style: ruff fmt --- src/github_rest_cli/api.py | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/github_rest_cli/api.py b/src/github_rest_cli/api.py index 685bdb7..92238e2 100644 --- a/src/github_rest_cli/api.py +++ b/src/github_rest_cli/api.py @@ -1,5 +1,4 @@ import requests -import json from github_rest_cli.globals import GITHUB_URL, HEADERS from github_rest_cli.utils import rich_output, rprint @@ -13,7 +12,7 @@ def request_with_handling( if success_msg: rich_output(success_msg) else: - return response + return response except requests.exceptions.HTTPError as e: status = e.response.status_code if error_msg and status in error_msg: @@ -101,25 +100,19 @@ def delete_repository(owner: str, name: str, org: str = None): def list_repositories(page: int, property: str, role: str): url = build_url("user", "repos") - params = { - "per_page": page, - "sort": property, - "type": role - } + params = {"per_page": page, "sort": property, "type": role} response = request_with_handling( - "GET", - url, - params=params, - headers=HEADERS, - error_msg={ - 401: "Unauthorized access. Please check your token or credentials." - }, + "GET", + url, + params=params, + headers=HEADERS, + error_msg={401: "Unauthorized access. Please check your token or credentials."}, ) if response: data = response.json() - repo_full_name = [repo['full_name'] for repo in data] + repo_full_name = [repo["full_name"] for repo in data] for repos in repo_full_name: rich_output(f"- {repos}") rich_output(f"\nTotal repositories: {len(repo_full_name)}") From ba7fc940ac68f690ca6af55f138c4f82e720cf9f Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 23:20:13 +0200 Subject: [PATCH 13/17] feat: refactor dependabot_security and deployment_environment functions --- src/github_rest_cli/api.py | 81 +++++++++++------------ src/github_rest_cli/main.py | 126 ++++++++++++++++++------------------ 2 files changed, 101 insertions(+), 106 deletions(-) diff --git a/src/github_rest_cli/api.py b/src/github_rest_cli/api.py index 92238e2..4a2e446 100644 --- a/src/github_rest_cli/api.py +++ b/src/github_rest_cli/api.py @@ -118,53 +118,46 @@ def list_repositories(page: int, property: str, role: str): rich_output(f"\nTotal repositories: {len(repo_full_name)}") -def dependabot_security(owner: str, name: str, org: str, enabled: bool): +def dependabot_security(owner: str, name: str, enabled: bool, org: str = None): is_enabled = bool(enabled) - try: - url = ( - f"{GITHUB_URL}/repos/{org}/{name}" - if org - else f"{GITHUB_URL}/repos/{owner}/{name}" + url = build_url("repos", org, name) if org else build_url("repos", owner, name) + security_urls = ["vulnerability-alerts", "automated-security-fixes"] + + if is_enabled: + for endpoint in security_urls: + full_url = f"{url}/{endpoint}" + request_with_handling( + "PUT", + url=full_url, + headers=HEADERS, + success_msg=f"Enabled {endpoint}", + error_msg={ + 401: "Unauthorized. Please check your credentials.", + }, ) - if is_enabled: - for endpoint in ["vulnerability-alerts", "automated-security-fixes"]: - req = requests.put(f"{url}/{endpoint}", headers=HEADERS) - req.raise_for_status() - rich_output( - f"Dependabot has been activated on repository {org or owner}/{name}", - format_str="bold green", - ) - else: - req = requests.delete(f"{url}/vulnerability-alerts", headers=HEADERS) - req.raise_for_status() - rich_output( - f"Dependabot has been disabled on repository {org or owner}/{name}", - format_str="bold green", - ) - except requests.exceptions.RequestException as e: - rprint(f"Error: {e}") + else: + full_url = f"{url}/{security_urls[0]}" + request_with_handling( + "DELETE", + url=full_url, + headers=HEADERS, + success_msg=f"Dependabot has been disabled on repository {owner or org}/{name}.", + error_msg={ + 401: "Unauthorized. Please check your credentials." + }, + ) def deployment_environment(owner: str, name: str, env: str, org: str = None): - try: - url = ( - f"{GITHUB_URL}/repos/{org}/{name}/environments/{env}" - if org - else f"{GITHUB_URL}/repos/{owner}/{name}/environments/{env}" - ) - req = requests.put(url, headers=HEADERS) - req.raise_for_status() - rich_output( - f"Environment '{env.upper()}' created.\n" - + f"Repository: {owner or org}/{name}", - format_str="bold green", - ) - except requests.exceptions.HTTPError as e: - if e.response.status_code == 422: - rich_output( - f"Failed to create environment {env.upper()}", - format_str="bold red", - ) - else: - rprint(f"Error: {e}") + url = build_url("repos", org, name, "environments", env) if org else build_url("repos", owner, name, "environments", env) + + return request_with_handling( + "PUT", + url, + headers=HEADERS, + success_msg=f"Environment {env} has been created successfully in {owner or org}/{name}.", + error_msg={ + 422: f"Failed to create repository enviroment {owner or org}/{name}" + } + ) diff --git a/src/github_rest_cli/main.py b/src/github_rest_cli/main.py index a0ab1ab..f9da400 100644 --- a/src/github_rest_cli/main.py +++ b/src/github_rest_cli/main.py @@ -5,6 +5,8 @@ create_repository, delete_repository, list_repositories, + dependabot_security, + deployment_environment, ) @@ -112,65 +114,65 @@ def cli(): help="The organization name", ) - # # Subparser for "dependabot" function - # dependabot_parser = subparsers.add_parser( - # "dependabot", - # help="Github Dependabot security updates", - # ) - # dependabot_parser.add_argument( - # "-n", - # "--name", - # required=True, - # dest="name", - # help="The repository name", - # ) - # dependabot_parser.add_argument( - # "-o", - # "--org", - # dest="org", - # help="The organization name", - # ) - # dependabot_parser.add_argument( - # "--enable", - # required=False, - # action="store_true", - # dest="control", - # help="Enable dependabot security updates", - # ) - # dependabot_parser.add_argument( - # "--disable", - # required=False, - # action="store_false", - # dest="control", - # help="Disable dependabot security updates", - # ) + # Subparser for "dependabot" function + dependabot_parser = subparsers.add_parser( + "dependabot", + help="Github Dependabot security updates", + ) + dependabot_parser.add_argument( + "-n", + "--name", + required=True, + dest="name", + help="The repository name", + ) + dependabot_parser.add_argument( + "-o", + "--org", + dest="org", + help="The organization name", + ) + dependabot_parser.add_argument( + "--enable", + required=False, + action="store_true", + dest="control", + help="Enable dependabot security updates", + ) + dependabot_parser.add_argument( + "--disable", + required=False, + action="store_false", + dest="control", + help="Disable dependabot security updates", + ) - # # Subparser for "deployment-environments" function - # deploy_env_parser = subparsers.add_parser( - # "environment", - # help="Github Deployment environments", - # ) - # deploy_env_parser.add_argument( - # "-n", - # "--name", - # required=True, - # dest="name", - # help="The repository name", - # ) - # deploy_env_parser.add_argument( - # "-e", - # "--env", - # required=True, - # dest="env", - # help="Deployment environment name", - # ) - # deploy_env_parser.add_argument( - # "-o", - # "--org", - # required=False, - # dest="org", - # help="The organization name", - # ) + # Subparser for "deployment-environments" function + deploy_env_parser = subparsers.add_parser( + "environment", + help="Github Deployment environments", + ) + deploy_env_parser.add_argument( + "-n", + "--name", + required=True, + dest="name", + help="The repository name", + ) + deploy_env_parser.add_argument( + "-e", + "--env", + required=True, + dest="env", + help="Deployment environment name", + ) + deploy_env_parser.add_argument( + "-o", + "--org", + required=False, + dest="org", + help="The organization name", + ) # guard clause pattern args = global_parser.parse_args() @@ -186,10 +188,10 @@ def cli(): return create_repository(owner, args.name, args.visibility, args.org) if command == "delete-repo": return delete_repository(owner, args.name, args.org) - # if command == "dependabot": - # return dependabot_security(args.name, args.org, args.control) - # if command == "environment": - # return deployment_environment(args.name, args.env, args.org) + if command == "dependabot": + return dependabot_security(owner, args.name, args.control, args.org) + if command == "environment": + return deployment_environment(owner, args.name, args.env, args.org) return False From 2ee9e482106572cbe450ad06030f71481139c953 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Tue, 27 May 2025 23:21:25 +0200 Subject: [PATCH 14/17] style: ruff again --- src/github_rest_cli/api.py | 44 ++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/github_rest_cli/api.py b/src/github_rest_cli/api.py index 4a2e446..50a289f 100644 --- a/src/github_rest_cli/api.py +++ b/src/github_rest_cli/api.py @@ -125,32 +125,34 @@ def dependabot_security(owner: str, name: str, enabled: bool, org: str = None): security_urls = ["vulnerability-alerts", "automated-security-fixes"] if is_enabled: - for endpoint in security_urls: - full_url = f"{url}/{endpoint}" + for endpoint in security_urls: + full_url = f"{url}/{endpoint}" + request_with_handling( + "PUT", + url=full_url, + headers=HEADERS, + success_msg=f"Enabled {endpoint}", + error_msg={ + 401: "Unauthorized. Please check your credentials.", + }, + ) + else: + full_url = f"{url}/{security_urls[0]}" request_with_handling( - "PUT", + "DELETE", url=full_url, headers=HEADERS, - success_msg=f"Enabled {endpoint}", - error_msg={ - 401: "Unauthorized. Please check your credentials.", - }, + success_msg=f"Dependabot has been disabled on repository {owner or org}/{name}.", + error_msg={401: "Unauthorized. Please check your credentials."}, ) - else: - full_url = f"{url}/{security_urls[0]}" - request_with_handling( - "DELETE", - url=full_url, - headers=HEADERS, - success_msg=f"Dependabot has been disabled on repository {owner or org}/{name}.", - error_msg={ - 401: "Unauthorized. Please check your credentials." - }, - ) def deployment_environment(owner: str, name: str, env: str, org: str = None): - url = build_url("repos", org, name, "environments", env) if org else build_url("repos", owner, name, "environments", env) + url = ( + build_url("repos", org, name, "environments", env) + if org + else build_url("repos", owner, name, "environments", env) + ) return request_with_handling( "PUT", @@ -158,6 +160,6 @@ def deployment_environment(owner: str, name: str, env: str, org: str = None): headers=HEADERS, success_msg=f"Environment {env} has been created successfully in {owner or org}/{name}.", error_msg={ - 422: f"Failed to create repository enviroment {owner or org}/{name}" - } + 422: f"Failed to create repository enviroment {owner or org}/{name}" + }, ) From ebd8eaf5986ffd042203a058a82800babf09681d Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Wed, 28 May 2025 09:14:53 +0200 Subject: [PATCH 15/17] fix: project version --- justfile | 6 ++++++ pyproject.toml | 2 +- src/github_rest_cli/__init__.py | 2 +- src/github_rest_cli/config.py | 2 -- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/justfile b/justfile index 6053bfd..c63710f 100644 --- a/justfile +++ b/justfile @@ -19,6 +19,12 @@ test: @cc: uv clean cache +@build: + uv build + +@publish: + uv publish --token $PYPI_TOKEN + @lint: ruff check . diff --git a/pyproject.toml b/pyproject.toml index 8c793d4..8823fc2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "github-rest-cli" -version = "0.2.0" +version = "0.1.0" description = "GitHub REST API cli" authors = [ { name = "lbrealdev", email = "lbrealdeveloper@gmail.com" } diff --git a/src/github_rest_cli/__init__.py b/src/github_rest_cli/__init__.py index d3ec452..3dc1f76 100644 --- a/src/github_rest_cli/__init__.py +++ b/src/github_rest_cli/__init__.py @@ -1 +1 @@ -__version__ = "0.2.0" +__version__ = "0.1.0" diff --git a/src/github_rest_cli/config.py b/src/github_rest_cli/config.py index 20e3e5e..6ba58f1 100644 --- a/src/github_rest_cli/config.py +++ b/src/github_rest_cli/config.py @@ -1,5 +1,3 @@ -"""Main config module""" - from dynaconf import Dynaconf, Validator settings = Dynaconf( From 9ff0880f02dd888d6d1cfd54158d75b4f49caa26 Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Wed, 28 May 2025 09:17:46 +0200 Subject: [PATCH 16/17] fix(actions): uv sync --- .github/workflows/python-ci.yml | 4 +- uv.lock | 104 ++++++++++++++++---------------- 2 files changed, 55 insertions(+), 53 deletions(-) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 902c5ab..4fdc27c 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -39,7 +39,9 @@ jobs: uses: astral-sh/setup-uv@v3 - name: uv sync - run: uv sync --locked + run: | + uv lock + uv sync --locked - name: Debug CLI run: | diff --git a/uv.lock b/uv.lock index 5a9a726..8f5ffae 100644 --- a/uv.lock +++ b/uv.lock @@ -1,67 +1,67 @@ version = 1 -revision = 1 +revision = 2 requires-python = ">=3.11" [[package]] name = "certifi" version = "2024.8.30" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507, upload-time = "2024-08-30T01:55:04.365Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, + { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321, upload-time = "2024-08-30T01:55:02.591Z" }, ] [[package]] name = "charset-normalizer" version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809 } +sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809, upload-time = "2023-11-01T04:04:59.997Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", size = 191647 }, - { url = "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", size = 121434 }, - { url = "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", size = 118979 }, - { url = "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", size = 136582 }, - { url = "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", size = 146645 }, - { url = "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", size = 139398 }, - { url = "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", size = 140273 }, - { url = "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", size = 142577 }, - { url = "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", size = 137747 }, - { url = "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", size = 143375 }, - { url = "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", size = 148474 }, - { url = "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", size = 140232 }, - { url = "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", size = 140859 }, - { url = "https://files.pythonhosted.org/packages/6c/c2/4a583f800c0708dd22096298e49f887b49d9746d0e78bfc1d7e29816614c/charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", size = 92509 }, - { url = "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", size = 99870 }, - { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892 }, - { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213 }, - { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404 }, - { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275 }, - { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518 }, - { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182 }, - { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869 }, - { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042 }, - { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275 }, - { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819 }, - { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415 }, - { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212 }, - { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167 }, - { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041 }, - { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397 }, - { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543 }, + { url = "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", size = 191647, upload-time = "2023-11-01T04:02:55.329Z" }, + { url = "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", size = 121434, upload-time = "2023-11-01T04:02:57.173Z" }, + { url = "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", size = 118979, upload-time = "2023-11-01T04:02:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", size = 136582, upload-time = "2023-11-01T04:02:59.776Z" }, + { url = "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", size = 146645, upload-time = "2023-11-01T04:03:02.186Z" }, + { url = "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", size = 139398, upload-time = "2023-11-01T04:03:04.255Z" }, + { url = "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", size = 140273, upload-time = "2023-11-01T04:03:05.983Z" }, + { url = "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", size = 142577, upload-time = "2023-11-01T04:03:07.567Z" }, + { url = "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", size = 137747, upload-time = "2023-11-01T04:03:08.886Z" }, + { url = "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", size = 143375, upload-time = "2023-11-01T04:03:10.613Z" }, + { url = "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", size = 148474, upload-time = "2023-11-01T04:03:11.973Z" }, + { url = "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", size = 140232, upload-time = "2023-11-01T04:03:13.505Z" }, + { url = "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", size = 140859, upload-time = "2023-11-01T04:03:17.362Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/4a583f800c0708dd22096298e49f887b49d9746d0e78bfc1d7e29816614c/charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", size = 92509, upload-time = "2023-11-01T04:03:21.453Z" }, + { url = "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", size = 99870, upload-time = "2023-11-01T04:03:22.723Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892, upload-time = "2023-11-01T04:03:24.135Z" }, + { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213, upload-time = "2023-11-01T04:03:25.66Z" }, + { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404, upload-time = "2023-11-01T04:03:27.04Z" }, + { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275, upload-time = "2023-11-01T04:03:28.466Z" }, + { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518, upload-time = "2023-11-01T04:03:29.82Z" }, + { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182, upload-time = "2023-11-01T04:03:31.511Z" }, + { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869, upload-time = "2023-11-01T04:03:32.887Z" }, + { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042, upload-time = "2023-11-01T04:03:34.412Z" }, + { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275, upload-time = "2023-11-01T04:03:35.759Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819, upload-time = "2023-11-01T04:03:37.216Z" }, + { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415, upload-time = "2023-11-01T04:03:38.694Z" }, + { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212, upload-time = "2023-11-01T04:03:40.07Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167, upload-time = "2023-11-01T04:03:41.491Z" }, + { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041, upload-time = "2023-11-01T04:03:42.836Z" }, + { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397, upload-time = "2023-11-01T04:03:44.467Z" }, + { 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 = "dynaconf" version = "3.2.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/62/eb/e9d1249ff56b11e63fd8c7d0fcc1f94704e21693c16862bf0ebfb07bd61a/dynaconf-3.2.11.tar.gz", hash = "sha256:4cfc6a730c533bf1a1d0bf266ae202133a22236bb3227d23eff4b8542d4034a5", size = 234694 } +sdist = { url = "https://files.pythonhosted.org/packages/62/eb/e9d1249ff56b11e63fd8c7d0fcc1f94704e21693c16862bf0ebfb07bd61a/dynaconf-3.2.11.tar.gz", hash = "sha256:4cfc6a730c533bf1a1d0bf266ae202133a22236bb3227d23eff4b8542d4034a5", size = 234694, upload-time = "2025-05-06T15:44:59.16Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/64/580c74003a356c5662e7b1da43ecd7cbda6e8f970c87b30c5a654c8ccb53/dynaconf-3.2.11-py2.py3-none-any.whl", hash = "sha256:660de90879d4da236f79195692a7d197957224d7acf922bcc6899187dc7b4a27", size = 236536 }, + { url = "https://files.pythonhosted.org/packages/36/64/580c74003a356c5662e7b1da43ecd7cbda6e8f970c87b30c5a654c8ccb53/dynaconf-3.2.11-py2.py3-none-any.whl", hash = "sha256:660de90879d4da236f79195692a7d197957224d7acf922bcc6899187dc7b4a27", size = 236536, upload-time = "2025-05-06T15:44:56.18Z" }, ] [[package]] name = "github-rest-cli" -version = "0.2.0" +version = "0.1.0" source = { editable = "." } dependencies = [ { name = "dynaconf" }, @@ -83,9 +83,9 @@ dev = [] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, + { 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]] @@ -95,27 +95,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, + { 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 = "pygments" version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 } +sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905, upload-time = "2024-05-04T13:42:02.013Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 }, + { 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]] @@ -128,9 +128,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, ] [[package]] @@ -141,16 +141,16 @@ dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, + { 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 = "urllib3" version = "2.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677, upload-time = "2024-09-12T10:52:18.401Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338, upload-time = "2024-09-12T10:52:16.589Z" }, ] From 2b375c860f95a2312fdd3092be43c0d84b4ad57f Mon Sep 17 00:00:00 2001 From: lbrealdev Date: Wed, 28 May 2025 09:23:26 +0200 Subject: [PATCH 17/17] feat(actions): remove --locked flag from uv sync --- .github/workflows/python-ci.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 4fdc27c..b38f256 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -39,15 +39,11 @@ jobs: uses: astral-sh/setup-uv@v3 - name: uv sync - run: | - uv lock - uv sync --locked + run: uv sync - name: Debug CLI run: | source .venv/bin/activate github-rest-cli -h env: - GITHUB_API_URL: https://api.github.com - GITHUB_USER: rest-api-user GITHUB_AUTH_TOKEN: f@k3-t0k3n