feat(clickup): add flyteplugins-clickup - #1516
Merged
Merged
Conversation
cosmicBboy
force-pushed
the
nielsb/webhooks-linear
branch
from
September 1, 2026 17:35
6afc243 to
68f65cb
Compare
cosmicBboy
force-pushed
the
nielsb/webhooks-clickup
branch
from
September 1, 2026 17:36
410aa4a to
d1b3007
Compare
cosmicBboy
marked this pull request as ready for review
September 1, 2026 17:54
cosmicBboy
force-pushed
the
nielsb/webhooks-linear
branch
from
September 1, 2026 18:29
68f65cb to
ab7c4a9
Compare
cosmicBboy
force-pushed
the
nielsb/webhooks-clickup
branch
from
September 1, 2026 18:29
d1b3007 to
69f870c
Compare
cosmicBboy
force-pushed
the
nielsb/webhooks-linear
branch
from
September 1, 2026 18:54
ab7c4a9 to
730652d
Compare
cosmicBboy
force-pushed
the
nielsb/webhooks-clickup
branch
from
September 1, 2026 18:54
69f870c to
7e85ea9
Compare
cosmicBboy
force-pushed
the
nielsb/webhooks-linear
branch
from
September 2, 2026 00:56
730652d to
57fc28f
Compare
cosmicBboy
force-pushed
the
nielsb/webhooks-clickup
branch
from
September 2, 2026 00:56
7e85ea9 to
8e7e70f
Compare
cosmicBboy
force-pushed
the
nielsb/webhooks-linear
branch
from
September 2, 2026 01:03
57fc28f to
2cd0960
Compare
cosmicBboy
force-pushed
the
nielsb/webhooks-clickup
branch
from
September 2, 2026 01:03
8e7e70f to
3ad4f51
Compare
Receive ClickUp webhooks in Flyte. Exports ClickUpProvider, a Provider subclass with its
defaults pre-wired, so wiring it up reads:
WebhookAppEnvironment(providers=[ClickUpProvider()])
The receiver itself ships with flyte, at flyte.extras.webhooks; this package
contributes only what is specific to ClickUp -- which environment variable holds
the secret, how to verify a delivery, how to parse one into a WebhookEvent, and
typed constants for every event ClickUp sends.
examples/clickup_webhooks.py runs with no ClickUp account at all: --local replays
this plugin's own SAMPLE_DELIVERY through the app. The shared conformance check
exercises that same sample.
The package is named for the product rather than for webhooks, so client
methods can land here later when they earn their place -- as review_pr does in
flyteplugins-github, where flyte.new_condition is the part no vendor SDK can
provide. Plain API passthrough belongs in the vendor's own SDK.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VKZrTNjjWVzTZUxDFbn4Nk
Signed-off-by: Niels Bantilan <niels.bantilan@gmail.com>
cosmicBboy
force-pushed
the
nielsb/webhooks-linear
branch
from
September 2, 2026 01:32
2cd0960 to
508f7e1
Compare
cosmicBboy
force-pushed
the
nielsb/webhooks-clickup
branch
from
September 2, 2026 01:32
3ad4f51 to
42db125
Compare
Part of the webhook plugin stack. Requires #1512 (`flyteplugins-webhooks-core`), which is this PR's base — the diff here is just this package. Receive Jira webhooks in Flyte. ## What it implements The `Provider` contract from core: which environment variable holds the secret, how to verify a delivery, how to parse one into a `WebhookEvent`, plus typed constants for every event Jira sends. **Verification:** **none** — Jira Cloud does not sign its webhooks. Because there is no signature, this plugin authenticates with a shared token in `X-Webhook-Token`, which something in front of the app has to inject since Jira cannot send custom headers. `PROVIDER.signed` is False, so the dashboard says the product does not sign rather than implying a guarantee that is absent. This is the plugin that made the conformance harness better: it caught that a shared token, unlike an HMAC, is **not bound to the request body**, so a tampered payload still verifies. That is inherent to an unsigned webhook rather than a bug here, and `signed=False` now opts out of that one check explicitly instead of the harness quietly passing. ## Conformance Runs the shared `assert_provider_conforms`, which replays this plugin's `SAMPLE_DELIVERY` — a real Jira payload — through `verify` and `parse` rather than trusting them to agree with each other. It also asserts the verifier returns False rather than raising on a hostile header, that event constants render as wire values rather than enum names, and that the sample parses to something the constants actually spell. 6 tests. `make fmt`, `make mypy`, `make ty`, ruff, and codespell pass. ## What it does not do Call the Jira API. Use the `jira` package directly from your tasks — the recipes are in the examples PR at the end of this stack. This plugin owns only the part that is Flyte's: authenticating an inbound delivery and turning it into a run. --------- Signed-off-by: Niels Bantilan <niels.bantilan@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of the webhook plugin stack. Requires #1512 (
flyteplugins-webhooks-core), which is this PR's base — the diff here is just this package.Receive ClickUp webhooks in Flyte.
What it implements
The
Providercontract from core: which environment variable holds the secret, how to verify a delivery, how to parse one into aWebhookEvent, plus typed constants for every event ClickUp sends.Verification: HMAC-SHA256 over the raw body (
X-Clickup-Signature).The list id sits at the top level on list-scoped events and on the nested task for task-scoped ones; the parser reads both, or a
scopesallowlist cannot attribute task events at all.Conformance
Runs the shared
assert_provider_conforms, which replays this plugin'sSAMPLE_DELIVERY— a real ClickUp payload — throughverifyandparserather than trusting them to agree with each other. It also asserts the verifier returns False rather than raising on a hostile header, that event constants render as wire values rather than enum names, and that the sample parses to something the constants actually spell.5 tests.
make fmt,make mypy,make ty, ruff, and codespell pass.What it does not do
Call the ClickUp API. Use
httpx— ClickUp ships no Python SDK and its API is a handful of REST calls directly from your tasks — the recipes are in the examples PR at the end of this stack. This plugin owns only the part that is Flyte's: authenticating an inbound delivery and turning it into a run.