dex-connector-calendly 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. dex_connector_calendly-0.1.0/.gitignore +16 -0
  2. dex_connector_calendly-0.1.0/LICENSE +21 -0
  3. dex_connector_calendly-0.1.0/PKG-INFO +19 -0
  4. dex_connector_calendly-0.1.0/README.md +7 -0
  5. dex_connector_calendly-0.1.0/examples/__init__.py +3 -0
  6. dex_connector_calendly-0.1.0/examples/scheduled_event/README.md +7 -0
  7. dex_connector_calendly-0.1.0/examples/scheduled_event/__init__.py +3 -0
  8. dex_connector_calendly-0.1.0/examples/scheduled_event/flow.py +62 -0
  9. dex_connector_calendly-0.1.0/examples/scheduled_event/integration_test.py +97 -0
  10. dex_connector_calendly-0.1.0/examples/scheduled_event/start.py +53 -0
  11. dex_connector_calendly-0.1.0/examples/scheduled_event/worker.py +50 -0
  12. dex_connector_calendly-0.1.0/pyproject.toml +38 -0
  13. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/__init__.py +150 -0
  14. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/_generated/__init__.py +2 -0
  15. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/_generated/config.py +30 -0
  16. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/_generated/connection.py +257 -0
  17. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/_generated/definitions.py +129 -0
  18. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/_generated/mock.py +377 -0
  19. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/_generated/models.py +425 -0
  20. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/_generated/refresh.py +9 -0
  21. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/_generated/steps.py +343 -0
  22. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/_generated/timestamps.py +60 -0
  23. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/calendlymock/__init__.py +6 -0
  24. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/client.py +310 -0
  25. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/connection.py +16 -0
  26. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/dex-connector.json +229 -0
  27. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/models.py +5 -0
  28. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/operations.py +1222 -0
  29. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/py.typed +0 -0
  30. dex_connector_calendly-0.1.0/src/dex_connectors/calendly/steps.py +5 -0
  31. dex_connector_calendly-0.1.0/tests/refresh_agreement_cases.json +353 -0
  32. dex_connector_calendly-0.1.0/tests/test_conformance.py +44 -0
  33. dex_connector_calendly-0.1.0/tests/test_provider_rules.py +69 -0
  34. dex_connector_calendly-0.1.0/tests/test_refresh_agreement.py +278 -0
  35. dex_connector_calendly-0.1.0/uv.lock +923 -0
@@ -0,0 +1,16 @@
1
+ .DS_Store
2
+ __pycache__/
3
+ *.py[cod]
4
+ node_modules/
5
+ dist/
6
+ sdkpython/dist/dex_connectors_sdk-0.1.0-py3-none-any.whl
7
+ /.bin/dexcli
8
+ /.bin/dex-server-zd
9
+ /sdkpython/.dexcli-data/
10
+ site/.catalog.yaml
11
+ coverage/
12
+ *.out
13
+ *.test
14
+ go.work
15
+ go.work.sum
16
+ .idea/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Super Durable
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,19 @@
1
+ Metadata-Version: 2.5
2
+ Name: dex-connector-calendly
3
+ Version: 0.1.0
4
+ Summary: Dex-native Calendly scheduling connector
5
+ License-Expression: MIT
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.11
8
+ Requires-Dist: dex-connectors-sdk==0.7.0
9
+ Requires-Dist: dex-python-sdk>=1.28.0
10
+ Requires-Dist: httpx>=0.27
11
+ Description-Content-Type: text/markdown
12
+
13
+ # Calendly Python connector
14
+
15
+ Calendly scheduled events, invitees, cancellation, scheduling links, and webhook subscriptions for Dex Flows.
16
+
17
+ The package implements six operations: `listScheduledEvents`, `getScheduledEvent`, `listEventInvitees`, `cancelScheduledEvent`, `createSchedulingLink`, and `createWebhookSubscription`. OAuth and personal access token decoding, refresh, and project connection wiring are manifest-generated. The invitee webhook Trigger remains Go-only.
18
+
19
+ See [the scheduled event example](examples/scheduled_event/README.md) for the static `calendly-scheduling` connection and Worker entrypoint. The connector source defines every operation's request and result type; the generated Step factories expose the stable branches. The `createSchedulingLink` Mutation uses Dex's single-dispatch fence and returns `uncertain` when a possibly accepted write cannot be confirmed.
@@ -0,0 +1,7 @@
1
+ # Calendly Python connector
2
+
3
+ Calendly scheduled events, invitees, cancellation, scheduling links, and webhook subscriptions for Dex Flows.
4
+
5
+ The package implements six operations: `listScheduledEvents`, `getScheduledEvent`, `listEventInvitees`, `cancelScheduledEvent`, `createSchedulingLink`, and `createWebhookSubscription`. OAuth and personal access token decoding, refresh, and project connection wiring are manifest-generated. The invitee webhook Trigger remains Go-only.
6
+
7
+ See [the scheduled event example](examples/scheduled_event/README.md) for the static `calendly-scheduling` connection and Worker entrypoint. The connector source defines every operation's request and result type; the generated Step factories expose the stable branches. The `createSchedulingLink` Mutation uses Dex's single-dispatch fence and returns `uncertain` when a possibly accepted write cannot be confirmed.
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2026 Super Durable
2
+ # SPDX-License-Identifier: MIT
3
+ """Runnable Calendly Dex applications."""
@@ -0,0 +1,7 @@
1
+ # Scheduled event lookup
2
+
3
+ This runnable Python Flow reads one Calendly scheduled event and saves the safe event result. Configure a Dex Web connection named `calendly-scheduling` using either a personal access token or Calendly OAuth. The connection's authorization guide links to Calendly's token and OAuth application pages and lists the scopes.
4
+
5
+ Start a local Dex stack with `dexcli dev -dex-port 40850 -web-port 40851 -open=false`, then run `DEX_FLOW_SERVICE_ADDRESS=127.0.0.1:40850 uv run python -m examples.scheduled_event.worker` from `connectors/calendly/python`. In another terminal, run `DEX_FLOW_SERVICE_ADDRESS=127.0.0.1:40850 uv run python -m examples.scheduled_event.start <unique-flow-id> https://api.calendly.com/scheduled_events/<id>`.
6
+
7
+ Generate a strict FDG 2.0 graph from `connectors/calendly/python` with `dexcli visualize ./examples/scheduled_event/flow.py --language python --python .venv/bin/python --schema-version 2.0 --json --out ./build/calendly-scheduled-event`. The sole provider Query exposes the `found` branch; optional rejection branches fail the Flow when selected.
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2026 Super Durable
2
+ # SPDX-License-Identifier: MIT
3
+ """Scheduled event lookup example."""
@@ -0,0 +1,62 @@
1
+ # Copyright (c) 2026 Super Durable
2
+ # SPDX-License-Identifier: MIT
3
+ """Read one Calendly scheduled event through a real Dex Query Step."""
4
+
5
+ import dex
6
+ from dex_connectors.sdk import QueryResult
7
+
8
+ from dex_connectors.calendly import (
9
+ Connection,
10
+ GetScheduledEventInput,
11
+ ScheduledEvent,
12
+ new_get_scheduled_event_step,
13
+ )
14
+
15
+ CONNECTION_NAME = "calendly-scheduling"
16
+ FLOW_TYPE = "CalendlyScheduledEventPython"
17
+ EVENT = dex.Attribute("calendly-python-scheduled-event", ScheduledEvent)
18
+
19
+
20
+ # dex:group group-id:scheduled-event group-label:"Scheduled event"
21
+ # dex:explanation text:"Persist the scheduled event returned by Calendly."
22
+ class CompleteEventLookup(dex.Step[QueryResult[ScheduledEvent]]):
23
+ """Complete the Flow with a safe event record."""
24
+
25
+ def execute(self, context: dex.Context, input: QueryResult[ScheduledEvent]) -> dex.StepDecision:
26
+ """Record the returned event and complete."""
27
+ EVENT.set(context, input.value)
28
+ return dex.graceful_complete(input.value)
29
+
30
+
31
+ class ScheduledEventFlow(dex.Flow[GetScheduledEventInput]):
32
+ """Look up one event using the configured Calendly connection."""
33
+
34
+ def __init__(self, connection: Connection) -> None:
35
+ if connection.reference.name != CONNECTION_NAME:
36
+ raise ValueError("scheduled event example requires its static Calendly connection")
37
+ self.complete = CompleteEventLookup()
38
+ self.lookup = new_get_scheduled_event_step(
39
+ step_type="GetScheduledEvent",
40
+ step_input_type=GetScheduledEventInput,
41
+ annotations={
42
+ "groupId": "scheduled-event",
43
+ "groupLabel": "Scheduled event",
44
+ "explanation": "Read the selected scheduled event from Calendly.",
45
+ },
46
+ connection=connection,
47
+ connection_name=CONNECTION_NAME,
48
+ map_to_operation_input=lambda input: input,
49
+ found=self.complete,
50
+ )
51
+
52
+ def get_flow_type(self) -> str:
53
+ """Return the stable Flow type."""
54
+ return "CalendlyScheduledEventPython"
55
+
56
+ def get_steps(self) -> dex.StepList[GetScheduledEventInput]:
57
+ """Register the provider Query and completion Step."""
58
+ return dex.StepList.start_step(self.lookup).other_steps(self.complete)
59
+
60
+ def get_persistence_schema(self) -> dex.PersistenceSchema:
61
+ """Register the event Attribute consumed by this Flow."""
62
+ return dex.PersistenceSchema.of(EVENT)
@@ -0,0 +1,97 @@
1
+ # Copyright (c) 2026 Super Durable
2
+ # SPDX-License-Identifier: MIT
3
+ """Exercise the scheduled event example through a real Dex Worker and Client."""
4
+
5
+ import asyncio
6
+ import os
7
+ import tempfile
8
+ from datetime import timedelta
9
+ from pathlib import Path
10
+ from uuid import uuid4
11
+
12
+ import dex
13
+ import httpx
14
+ import pytest
15
+ from dex_connectors.sdk import ConnectionRef, SecretString, StaticCredentialProvider
16
+
17
+ from dex_connectors.calendly import (
18
+ Client,
19
+ Config,
20
+ Credentials,
21
+ GetScheduledEventInput,
22
+ ScheduledEvent,
23
+ new_connection,
24
+ )
25
+
26
+ from .flow import CONNECTION_NAME, ScheduledEventFlow
27
+
28
+ EVENT_URI = "https://api.calendly.com/scheduled_events/EVT00001"
29
+ CONNECTION = ConnectionRef("calendly", CONNECTION_NAME)
30
+
31
+
32
+ @pytest.mark.asyncio
33
+ async def test_lookup_retries_and_fails_unwired_rejection_in_real_dex() -> None:
34
+ """Verify a retry, successful persistence, and optional branch failure."""
35
+ server_address = os.environ["DEX_FLOW_SERVICE_ADDRESS"]
36
+ requests: list[httpx.Request] = []
37
+
38
+ def answer(request: httpx.Request) -> httpx.Response:
39
+ requests.append(request)
40
+ if request.url.path.endswith("EVT404"):
41
+ return httpx.Response(404, json={"title": "Not found"})
42
+ if len(requests) == 1:
43
+ return httpx.Response(503, json={"title": "Unavailable"})
44
+ return httpx.Response(
45
+ 200,
46
+ json={
47
+ "resource": {
48
+ "uri": EVENT_URI,
49
+ "name": "Discovery Call",
50
+ "status": "active",
51
+ "start_time": "2026-11-02T17:00:00Z",
52
+ "end_time": "2026-11-02T17:30:00Z",
53
+ }
54
+ },
55
+ )
56
+
57
+ async with httpx.AsyncClient(transport=httpx.MockTransport(answer)) as provider_http:
58
+ client = Client(
59
+ Config(),
60
+ StaticCredentialProvider({CONNECTION: Credentials(access_token=SecretString("inert-token"))}),
61
+ provider_http,
62
+ )
63
+ connection = new_connection(client, CONNECTION)
64
+ flow = ScheduledEventFlow(connection)
65
+ registry = dex.Registry([flow], allow_async_handlers=True)
66
+ with tempfile.TemporaryDirectory(prefix="calendly-python-dex-blobs-") as cache_directory:
67
+ cache = dex.open_blob_cache(dex.BlobCacheConfig(str(Path(cache_directory) / "blobs"), 1 << 24))
68
+ worker = dex.AsyncWorker(registry, cache, dex.WorkerOptions(server_address=server_address))
69
+ worker_task = asyncio.create_task(worker.start())
70
+ try:
71
+ await worker.wait_pull_registered(timeout=15)
72
+ async with dex.AsyncClient(
73
+ registry, cache, dex.ClientOptions(server_address=server_address)
74
+ ) as dex_client:
75
+ success_id = f"calendly-python-event-{uuid4().hex}"
76
+ await dex_client.start_flow(flow, success_id, GetScheduledEventInput(EVENT_URI))
77
+ success = await asyncio.wait_for(
78
+ dex_client.wait_for_flow(success_id, timedelta(seconds=20)), 30
79
+ )
80
+ assert success.status == dex.FlowStatus.COMPLETED, success.error_message
81
+ assert success.single_output(ScheduledEvent).uri == EVENT_URI
82
+ assert len(requests) == 2
83
+ rejected_id = f"calendly-python-event-{uuid4().hex}"
84
+ await dex_client.start_flow(
85
+ flow,
86
+ rejected_id,
87
+ GetScheduledEventInput("https://api.calendly.com/scheduled_events/EVT404"),
88
+ )
89
+ rejected = await asyncio.wait_for(
90
+ dex_client.wait_for_flow(rejected_id, timedelta(seconds=20)), 30
91
+ )
92
+ assert rejected.status == dex.FlowStatus.FAILED
93
+ assert rejected.error_message is not None and "notFound" in rejected.error_message
94
+ finally:
95
+ await worker.stop()
96
+ await worker_task
97
+ cache.close()
@@ -0,0 +1,53 @@
1
+ # Copyright (c) 2026 Super Durable
2
+ # SPDX-License-Identifier: MIT
3
+ """Submit a scheduled event lookup to Dex."""
4
+
5
+ import argparse
6
+ import asyncio
7
+ import os
8
+ import tempfile
9
+
10
+ import dex
11
+ from dex_connectors.sdk.projectconfig import load_from_environment
12
+
13
+ from dex_connectors.calendly import GetScheduledEventInput, new_project_connection
14
+
15
+ from .flow import CONNECTION_NAME, ScheduledEventFlow
16
+
17
+
18
+ async def start_lookup(flow_id: str, scheduled_event_uri: str) -> str:
19
+ """Start a lookup with a unique Flow ID and stable Calendly event URI."""
20
+ project = await load_from_environment()
21
+ connection = new_project_connection(project, CONNECTION_NAME)
22
+ try:
23
+ flow = ScheduledEventFlow(connection)
24
+ registry = dex.Registry([flow], allow_async_handlers=True)
25
+ with tempfile.TemporaryDirectory(prefix="calendly-python-start-blobs-") as cache_path:
26
+ cache = dex.open_blob_cache(dex.BlobCacheConfig(cache_path, 1 << 24))
27
+ try:
28
+ async with dex.AsyncClient(
29
+ registry,
30
+ cache,
31
+ dex.ClientOptions(
32
+ server_address=os.environ.get("DEX_FLOW_SERVICE_ADDRESS", "localhost:8801")
33
+ ),
34
+ ) as client:
35
+ return await client.start_flow(flow, flow_id, GetScheduledEventInput(scheduled_event_uri))
36
+ finally:
37
+ cache.close()
38
+ finally:
39
+ await connection.aclose()
40
+ await project.close()
41
+
42
+
43
+ def main() -> None:
44
+ """Accept a Flow ID and Calendly event URI from the command line."""
45
+ parser = argparse.ArgumentParser(description="Start a Calendly event lookup")
46
+ parser.add_argument("flow_id")
47
+ parser.add_argument("scheduled_event_uri")
48
+ options = parser.parse_args()
49
+ print(asyncio.run(start_lookup(options.flow_id, options.scheduled_event_uri)))
50
+
51
+
52
+ if __name__ == "__main__":
53
+ main()
@@ -0,0 +1,50 @@
1
+ # Copyright (c) 2026 Super Durable
2
+ # SPDX-License-Identifier: MIT
3
+ """Serve the Calendly scheduled event Flow using Dex Web Connections."""
4
+
5
+ import asyncio
6
+ import os
7
+ import tempfile
8
+ from pathlib import Path
9
+
10
+ import dex
11
+ from dex_connectors.sdk.projectconfig import load_from_environment
12
+
13
+ from dex_connectors.calendly import new_project_connection
14
+
15
+ from .flow import CONNECTION_NAME, ScheduledEventFlow
16
+
17
+
18
+ async def run_worker() -> None:
19
+ """Load the named connection and run the Flow Worker until shutdown."""
20
+ project = await load_from_environment()
21
+ connection = None
22
+ cache = None
23
+ try:
24
+ connection = new_project_connection(project, CONNECTION_NAME)
25
+ registry = dex.Registry([ScheduledEventFlow(connection)], allow_async_handlers=True)
26
+ cache_path = os.environ.get(
27
+ "DEX_BLOB_CACHE_DIR", str(Path(tempfile.gettempdir()) / "dex-calendly-python-blobs")
28
+ )
29
+ cache = dex.open_blob_cache(dex.BlobCacheConfig(cache_path, 1 << 30))
30
+ async with dex.AsyncWorker(
31
+ registry,
32
+ cache,
33
+ dex.WorkerOptions(server_address=os.environ.get("DEX_FLOW_SERVICE_ADDRESS", "localhost:8801")),
34
+ ) as worker:
35
+ await worker.start()
36
+ finally:
37
+ if connection is not None:
38
+ await connection.aclose()
39
+ if cache is not None:
40
+ cache.close()
41
+ await project.close()
42
+
43
+
44
+ def main() -> None:
45
+ """Run the Worker from a module invocation."""
46
+ asyncio.run(run_worker())
47
+
48
+
49
+ if __name__ == "__main__":
50
+ main()
@@ -0,0 +1,38 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.27"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "dex-connector-calendly"
7
+ version = "0.1.0"
8
+ description = "Dex-native Calendly scheduling connector"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = "MIT"
12
+ license-files = ["LICENSE"]
13
+ dependencies = ["dex-connectors-sdk==0.7.0", "dex-python-sdk>=1.28.0", "httpx>=0.27"]
14
+
15
+ [dependency-groups]
16
+ dev = ["pytest>=8", "pytest-asyncio>=0.24", "mypy>=1.13", "ruff>=0.7", "PyYAML>=6"]
17
+
18
+ [tool.hatch.build.targets.wheel]
19
+ packages = ["src/dex_connectors"]
20
+
21
+ [tool.pytest.ini_options]
22
+ testpaths = ["tests"]
23
+ pythonpath = [".", "src"]
24
+ asyncio_mode = "auto"
25
+ asyncio_default_fixture_loop_scope = "function"
26
+
27
+ [tool.mypy]
28
+ python_version = "3.11"
29
+ strict = true
30
+ mypy_path = "src"
31
+ explicit_package_bases = true
32
+
33
+ [tool.ruff]
34
+ target-version = "py311"
35
+ line-length = 110
36
+
37
+ [tool.ruff.lint]
38
+ select = ["E", "F", "I", "UP", "B"]
@@ -0,0 +1,150 @@
1
+ # Copyright (c) 2026 Super Durable
2
+ # SPDX-License-Identifier: MIT
3
+ """Calendly scheduling operations for Dex Flows."""
4
+
5
+ from ._generated.definitions import * # noqa: F403
6
+ from .client import Client as Client
7
+ from .client import Config as Config
8
+ from .client import Credentials as Credentials
9
+ from .connection import (
10
+ Connection as Connection,
11
+ )
12
+ from .connection import (
13
+ new_connection as new_connection,
14
+ )
15
+ from .connection import (
16
+ new_connection_with_operations as new_connection_with_operations,
17
+ )
18
+ from .connection import (
19
+ new_project_connection as new_project_connection,
20
+ )
21
+ from .models import (
22
+ Cancellation as Cancellation,
23
+ )
24
+ from .models import (
25
+ CancelScheduledEventInput as CancelScheduledEventInput,
26
+ )
27
+ from .models import (
28
+ CreateSchedulingLinkInput as CreateSchedulingLinkInput,
29
+ )
30
+ from .models import (
31
+ CreateWebhookSubscriptionInput as CreateWebhookSubscriptionInput,
32
+ )
33
+ from .models import (
34
+ EventInviteePage as EventInviteePage,
35
+ )
36
+ from .models import (
37
+ GetScheduledEventInput as GetScheduledEventInput,
38
+ )
39
+ from .models import (
40
+ Invitee as Invitee,
41
+ )
42
+ from .models import (
43
+ InviteeAnswer as InviteeAnswer,
44
+ )
45
+ from .models import (
46
+ ListEventInviteesInput as ListEventInviteesInput,
47
+ )
48
+ from .models import (
49
+ ListScheduledEventsInput as ListScheduledEventsInput,
50
+ )
51
+ from .models import (
52
+ ScheduledEvent as ScheduledEvent,
53
+ )
54
+ from .models import (
55
+ ScheduledEventCancellation as ScheduledEventCancellation,
56
+ )
57
+ from .models import (
58
+ ScheduledEventHost as ScheduledEventHost,
59
+ )
60
+ from .models import (
61
+ ScheduledEventInviteesCounter as ScheduledEventInviteesCounter,
62
+ )
63
+ from .models import (
64
+ ScheduledEventLocation as ScheduledEventLocation,
65
+ )
66
+ from .models import (
67
+ ScheduledEventPage as ScheduledEventPage,
68
+ )
69
+ from .models import (
70
+ SchedulingLink as SchedulingLink,
71
+ )
72
+ from .models import (
73
+ WebhookSubscription as WebhookSubscription,
74
+ )
75
+ from .operations import (
76
+ CancelScheduledEventOperation as CancelScheduledEventOperation,
77
+ )
78
+ from .operations import (
79
+ CreateSchedulingLinkOperation as CreateSchedulingLinkOperation,
80
+ )
81
+ from .operations import (
82
+ CreateWebhookSubscriptionOperation as CreateWebhookSubscriptionOperation,
83
+ )
84
+ from .operations import (
85
+ GetScheduledEventOperation as GetScheduledEventOperation,
86
+ )
87
+ from .operations import (
88
+ ListEventInviteesOperation as ListEventInviteesOperation,
89
+ )
90
+ from .operations import (
91
+ ListScheduledEventsOperation as ListScheduledEventsOperation,
92
+ )
93
+ from .steps import (
94
+ new_cancel_scheduled_event_step as new_cancel_scheduled_event_step,
95
+ )
96
+ from .steps import (
97
+ new_create_scheduling_link_step as new_create_scheduling_link_step,
98
+ )
99
+ from .steps import (
100
+ new_create_webhook_subscription_step as new_create_webhook_subscription_step,
101
+ )
102
+ from .steps import (
103
+ new_get_scheduled_event_step as new_get_scheduled_event_step,
104
+ )
105
+ from .steps import (
106
+ new_list_event_invitees_step as new_list_event_invitees_step,
107
+ )
108
+ from .steps import (
109
+ new_list_scheduled_events_step as new_list_scheduled_events_step,
110
+ )
111
+
112
+ __all__ = [
113
+ "CancelScheduledEventInput",
114
+ "CancelScheduledEventOperation",
115
+ "Cancellation",
116
+ "Client",
117
+ "Config",
118
+ "Connection",
119
+ "CreateSchedulingLinkInput",
120
+ "CreateSchedulingLinkOperation",
121
+ "CreateWebhookSubscriptionInput",
122
+ "CreateWebhookSubscriptionOperation",
123
+ "Credentials",
124
+ "EventInviteePage",
125
+ "GetScheduledEventInput",
126
+ "GetScheduledEventOperation",
127
+ "Invitee",
128
+ "InviteeAnswer",
129
+ "ListEventInviteesInput",
130
+ "ListEventInviteesOperation",
131
+ "ListScheduledEventsInput",
132
+ "ListScheduledEventsOperation",
133
+ "ScheduledEvent",
134
+ "ScheduledEventCancellation",
135
+ "ScheduledEventHost",
136
+ "ScheduledEventInviteesCounter",
137
+ "ScheduledEventLocation",
138
+ "ScheduledEventPage",
139
+ "SchedulingLink",
140
+ "WebhookSubscription",
141
+ "new_cancel_scheduled_event_step",
142
+ "new_connection",
143
+ "new_connection_with_operations",
144
+ "new_create_scheduling_link_step",
145
+ "new_create_webhook_subscription_step",
146
+ "new_get_scheduled_event_step",
147
+ "new_list_event_invitees_step",
148
+ "new_list_scheduled_events_step",
149
+ "new_project_connection",
150
+ ]
@@ -0,0 +1,2 @@
1
+ # Copyright (c) 2026 Super Durable
2
+ # SPDX-License-Identifier: MIT
@@ -0,0 +1,30 @@
1
+ # Copyright (c) 2026 Super Durable
2
+ # SPDX-License-Identifier: MIT
3
+ # ruff: noqa
4
+
5
+ from dataclasses import dataclass
6
+
7
+ from dex_connectors.sdk import SecretString
8
+
9
+
10
+ @dataclass(frozen=True, slots=True)
11
+ class Config:
12
+
13
+ max_response_bytes: int = 1048576
14
+ webhook_max_body_bytes: int = 1048576
15
+ webhook_signature_tolerance_seconds: float = 180
16
+
17
+ setattr(Config, '__module__', 'dex_connectors.calendly.client')
18
+
19
+
20
+ @dataclass(frozen=True, slots=True)
21
+ class Credentials:
22
+
23
+ auth_method_id: str = "personal-access-token"
24
+ access_token: SecretString | None = None
25
+ webhook_signing_key: SecretString = SecretString('')
26
+ oauth_client_id: str | None = None
27
+ oauth_client_secret: SecretString | None = None
28
+ refresh_token: SecretString | None = None
29
+
30
+ setattr(Credentials, '__module__', 'dex_connectors.calendly.client')