Metadata-Version: 2.5
Name: render-lab-tasks-gitlab
Version: 0.1.0
Summary: gitlab tasks for Render Workflows
Project-URL: Repository, https://github.com/render-lab/render-tasks-python
License-Expression: MIT
License-File: LICENSE
Requires-Python: >=3.12
Requires-Dist: httpx<0.29,>=0.28
Requires-Dist: render-lab-tasks-core<0.2,>=0.1.1
Requires-Dist: render-lab-triggers<0.2,>=0.1.0
Requires-Dist: render==1.0.1
Description-Content-Type: text/markdown

# render-lab-tasks-gitlab

Python port of all 10 registered tasks in the pinned TypeScript pack at
`45f9c2d44bd28e01ae9813e0d2ff56ee6c533816`. Python 3.12+.

From the repository, install this pack and its supporting core together:

```sh
pip install render-lab-tasks-gitlab==0.1.0
```

Import task definitions from `render_lab_tasks_gitlab.tasks`. Combine its `app` with
other pack apps using `Workflows.from_workflows(...)` and call tasks with
`await ctx.run(task, input)`. Package roots do not register tasks. JSON fields
retain the TS spelling; Python functions use snake_case.

## Tasks

| Registered name | Python export (also exposes `_impl`) |
| --- | --- |
| `gitlab.closeIssue` | `close_issue` |
| `gitlab.comment` | `comment` |
| `gitlab.createIssue` | `create_issue` |
| `gitlab.createMergeRequest` | `create_merge_request` |
| `gitlab.getIssue` | `get_issue` |
| `gitlab.getMergeRequest` | `get_merge_request` |
| `gitlab.getPipelineStatus` | `get_pipeline_status` |
| `gitlab.listMergeRequests` | `list_merge_requests` |
| `gitlab.mergeWhenGreen` | `merge_when_green` |
| `gitlab.triggerPipeline` | `trigger_pipeline` |

## Dependencies and retries

Raw implementations accept context first and keyword-only `deps`. The `.client`
module exports typed `Port`, `Deps`, and `Client` classes (also vendor-named aliases).
Inject a fake port, or pass a caller-owned `httpx.AsyncClient` to `Client` for custom
transport/configuration. Default dependencies close their HTTP clients after the
operation. Credentials resolve at first use. HTTP and SDK retries are disabled;
`retry.py` owns durable retry settings. DTO types live in `.types`.

## Environment

| Variable | Contract |
| --- | --- |
| `GITLAB_TOKEN` | Required on API calls. |
| `GITLAB_URL` | Optional GitLab site URL; defaults to https://gitlab.com. |

## Verification and limitations

mergeWhenGreen preserves the TS behavior: success and manual pipelines permit a merge, failed/canceled pipelines throw a failure, and other/missing states throw a pending error. It inherits the normal three-retry policy, not an hour-long wait. Project paths are URL-encoded. The optional TS webhook adapter is deferred until the Python triggers contract is ported.

Shared JSON fixtures compare the Python task output with the actual pinned TS
implementation. REST fixtures also compare HTTP requests; HubSpot and Linear
fixtures compare source SDK arguments with HTTP payloads/GraphQL variables.
No live vendor calls were made for this batch. Registered-task parity does not
claim live readiness or all supporting TS exports. See the root verification
tracker and docs/porting-batches.md. Licensed under MIT.

## Webhook adapter

`render_lab_tasks_gitlab.webhooks.gitlab_adapter(on_event, ...)` returns a
registration-free adapter for `render_lab_triggers`. The callback receives the
verified event and returns `{"task": "namespace.task", "args": [event]}` or `None`.
The signing credential `GITLAB_WEBHOOK_SECRET` is read inside verification unless
provided explicitly. Importing this module does not register tasks. Signature
checks use the raw body; live delivery remains in the testing backlog.
