1
0
Fork
You've already forked pyforgejo
0
forked from harabat/pyforgejo
A client library for accessing the Forgejo API.
  • Python 100%
2025年02月24日 10:19:28 +01:00
pyforgejo format with ruff 2025年02月07日 16:53:48 +01:00
tests use different production and testing tokens 2025年02月24日 10:19:28 +01:00
LICENSE add MIT license 2024年02月22日 14:34:25 +01:00
poetry.lock update pyproject format 2025年02月07日 17:11:33 +01:00
pyproject.toml update pyproject format 2025年02月07日 17:11:33 +01:00
README.md update install guidance 2025年02月07日 10:29:40 +01:00

pyforgejo

A Python client library for accessing the Forgejo API.

⚠️ pyforgejo 2.0 introduces significant changes. If you're using 1.0, you can view docs on the 1.0 branch.

Usage

  1. Create an .env file in your project directory with the BASE_URL and your API_KEY:
BASE_URL=https://codeberg.org/api/v1API_KEY='token your_api_key' # your API token prepended with "token" followed by a space
  1. Create a client and call an endpoint:
from pyforgejo import PyforgejoApi
client = PyforgejoApi()
# get a specific repo
repo = client.repository.repo_get(owner='harabat', repo='pyforgejo')
repo
# Repository(allow_fast_forward_only_merge=False, allow_merge_commits=True, allow_rebase=True, ...)
repo.dict()
# {'allow_fast_forward_only_merge': False,
# 'allow_merge_commits': True,
# 'allow_rebase': True,
# ...
# }
# list issues for the repo
issues = client.issue.list_issues(owner=repo.owner.login, repo=repo.name)
[issue.title for issue in issues]
# ['Normalize option model names',
# 'Calling methods from client',
# '`parsed` is None for most methods',
# '`openapi-python-client` does not support `text/plain` requests']

The client follows this pattern for calling endpoints:

client.<resource>.<operation_id>(args)

where:

  • <resource>: the API resource (e.g., repository, issue, user)
  • <operation_id>: the specific operation, derived from the OpenAPI spec's operationId (converted to snake_case)

You can find the resource and operation_id either in the Swagger spec or in the API reference.

Installation

pip install pyforgejo

Forgejo API Resources

Development

Using fern

pyforgejo 2.0 is generated with fern, based on a slightly edited Forgejo OpenAPI spec.

The user experience and code architecture of the fern-generated client follow best practice. As the library is tested by users, we will identify any issues inherent to fern that prove limiting to pyforgejo: if we find such issues and cannot patch them upstream, the current codebase provides a good foundation for further development and any divergence from fern would not affect the vast majority of usecases.

Generating the client with fern

  1. Install fern, initialise a new workspace, and specify pyforgejo as the name of your organisation (= client).
npm install -g fern-api
fern init --openapi https://code.forgejo.org/swagger.v1.json
# Please enter your organization pyforgejo
  1. Edit the fern/openapi/openapi.json file to keep only AuthorizationHeaderToken in securityDefinitions and security.
"securityDefinitions": {
 "AuthorizationHeaderToken": {
 "description": "API tokens must be prepended with \"token\" followed by a space.",
 "type": "apiKey",
 "name": "Authorization",
 "in": "header"
 }
},
"security": [
 {
 "AuthorizationHeaderToken": []
 }
]
  1. Add the Python SDK generator to fern.
fern add fernapi/fern-python-sdk
  1. Generate the client (output will be in sdks/pyforgejo).
fern generate
# you'll have to login to GitHub
  1. Create a .env file in sdks/pyforgejo with your BASE_URL and API_KEY.
BASE_URL=https://codeberg.org/api/v1API_KEY="token your_api_key"
  1. Modify the PyforgejoApi and AsyncPyforgejoApi classes in sdks/pyforgejo/pyforgejo/client.py to use environment variables.
# ...
from .user.client import AsyncUserClient
+import os
+from dotenv import load_dotenv
+
+load_dotenv()
+
+BASE_URL = os.getenv('BASE_URL')
+API_KEY = os.getenv('API_KEY')

 class PyforgejoApi:
# ...
 base_url : typing.Optional[str]
- The base url to use for requests from the client.
+ The base url to use for requests from the client. Defaults to BASE_URL from .env file.
# ...
- api_key : str
+ api_key : typing.Optional[str]
+ The API key to use for authentication. Defaults to API_KEY from .env file.
# ...
 def __init__(
# ...
- api_key: str,
+ api_key: typing.Optional[str] = None,
# ...
 ):
+ base_url = base_url or BASE_URL
+ api_key = api_key or API_KEY
+
+ print(f"Using BASE_URL: {base_url if base_url else 'Not set'}")
+ print(f"Using API_KEY: {'*' * 40 if api_key else 'Not set'}")
+
+ if not base_url:
+ raise ValueError("base_url must be provided either as an .env variable or as an argument")
+ if not api_key:
+ raise ValueError("api_key must be provided either as an .env variable or as an argument")
# same for AsyncPyforgejoApi
  1. Create a virtual environment and install the lib.
conda create --name pyforgejo_dev
conda activate pyforgejo_dev
pip install /path/to/pyforgejo
  1. Use the client as shown in the Usage section.
conda install ipython
ipython
from pyforgejo import PyforgejoApi
client = PyforgejoApi()
user = client.user.get_current()