1
0
mirror of synced 2025-12-25 02:09:19 -05:00

source-acuity-scheduling contribution from chanronson (#62486)

This commit is contained in:
Ronson
2025-09-07 16:53:54 -04:00
committed by GitHub
parent 88fb10f350
commit 46845b8cfc
6 changed files with 900 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
# Acuity Scheduling
This directory contains the manifest-only connector for `source-acuity-scheduling`.
Flexible scheduling software to help you succeed
With seamless client scheduling, secure payments, and workflow automation, all you have to do is show up on time.
## Usage
There are multiple ways to use this connector:
- You can use this connector as any other connector in Airbyte Marketplace.
- You can load this connector in `pyairbyte` using `get_source`!
- You can open this connector in Connector Builder, edit it, and publish to your workspaces.
Please refer to the manifest-only connector documentation for more details.
## Local Development
We recommend you use the Connector Builder to edit this connector.
But, if you want to develop this connector locally, you can use the following steps.
### Environment Setup
You will need `airbyte-ci` installed. You can find the documentation [here](airbyte-ci).
### Build
This will create a dev image (`source-acuity-scheduling:dev`) that you can use to test the connector locally.
```bash
airbyte-ci connectors --name=source-acuity-scheduling build
```
### Test
This will run the acceptance tests for the connector.
```bash
airbyte-ci connectors --name=source-acuity-scheduling test
```

View File

@@ -0,0 +1,17 @@
# See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference)
# for more information about how to configure these tests
connector_image: airbyte/source-acuity-scheduling:dev
acceptance_tests:
spec:
tests:
- spec_path: "manifest.yaml"
connection:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
discovery:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
basic_read:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
incremental:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
full_refresh:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="250" height="250" fill="none">
<path fill="#e8e8ed" fill-rule="evenodd" d="M95.775 53.416c20.364-22.88 54.087-29.592 81.811-16.385 36.836 17.549 50.274 62.252 30.219 96.734l-45.115 77.487a18.994 18.994 0 0 1-11.536 8.784 19.12 19.12 0 0 1-14.412-1.878l54.62-93.829c14.55-25.027 4.818-57.467-21.888-70.24-20.038-9.583-44.533-4.795-59.336 11.685a50.008 50.008 0 0 0-12.902 32.877 49.989 49.989 0 0 0 16.664 37.87l-31.887 54.875a18.917 18.917 0 0 1-4.885 5.534 19.041 19.041 0 0 1-6.647 3.255 19.13 19.13 0 0 1-7.395.482 19.087 19.087 0 0 1-7.018-2.365l34.617-59.575a68.424 68.424 0 0 1-10.524-23.544l-21.213 36.579a18.994 18.994 0 0 1-11.535 8.784A19.123 19.123 0 0 1 33 158.668l54.856-94.356a70.296 70.296 0 0 1 7.919-10.896Zm63.314 30.034c13.211 7.577 17.774 24.427 10.13 37.54l-52.603 90.251a18.997 18.997 0 0 1-11.536 8.784 19.122 19.122 0 0 1-14.412-1.878l48.843-84.024a27.778 27.778 0 0 1-10.825-4.847 27.545 27.545 0 0 1-7.783-8.907 27.344 27.344 0 0 1-3.307-11.326 27.293 27.293 0 0 1 1.776-11.66 27.454 27.454 0 0 1 6.533-9.846 27.703 27.703 0 0 1 10.087-6.222 27.858 27.858 0 0 1 23.097 2.135Zm-19.134 16.961a8.645 8.645 0 0 0-2.232 2.529h-.003a8.565 8.565 0 0 0 .632 9.556 8.68 8.68 0 0 0 4.097 2.915 8.738 8.738 0 0 0 5.036.163 8.692 8.692 0 0 0 4.279-2.642 8.59 8.59 0 0 0 2.079-4.558 8.563 8.563 0 0 0-.821-4.938 8.645 8.645 0 0 0-3.444-3.652 8.72 8.72 0 0 0-6.586-.86 8.7 8.7 0 0 0-3.037 1.487Z" clip-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,778 @@
version: 6.48.15
type: DeclarativeSource
description: >-
Flexible scheduling software to help you succeed
With seamless client scheduling, secure payments, and workflow automation, all
you have to do is show up on time.
check:
type: CheckStream
stream_names:
- appointments
definitions:
streams:
appointments:
type: DeclarativeStream
name: appointments
primary_key:
- id
retriever:
type: SimpleRetriever
requester:
$ref: "#/definitions/base_requester"
path: appointments
http_method: GET
request_parameters:
max: "100000"
showall: "true"
record_selector:
type: RecordSelector
extractor:
type: DpathExtractor
field_path: []
decoder:
type: JsonDecoder
incremental_sync:
type: DatetimeBasedCursor
cursor_field: insert_date
lookback_window: P1W
cursor_datetime_formats:
- "%Y-%m-%d"
datetime_format: "%Y-%m-%d"
start_datetime:
type: MinMaxDatetime
datetime: "{{ config[\"start_date\"] }}"
datetime_format: "%Y-%m-%dT%H:%M:%SZ"
start_time_option:
type: RequestOption
field_name: minDate
inject_into: request_parameter
end_datetime:
type: MinMaxDatetime
datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}"
datetime_format: "%Y-%m-%dT%H:%M:%SZ"
transformations:
- type: AddFields
fields:
- type: AddedFieldDefinition
path:
- insert_date
value: "{{ stream_slice.start_time }}"
schema_loader:
type: InlineSchemaLoader
schema:
$ref: "#/schemas/appointments"
calendars:
type: DeclarativeStream
name: calendars
primary_key:
- id
retriever:
type: SimpleRetriever
requester:
$ref: "#/definitions/base_requester"
path: calendars
http_method: GET
record_selector:
type: RecordSelector
extractor:
type: DpathExtractor
field_path: []
decoder:
type: JsonDecoder
schema_loader:
type: InlineSchemaLoader
schema:
$ref: "#/schemas/calendars"
clients:
type: DeclarativeStream
name: clients
primary_key:
- email
retriever:
type: SimpleRetriever
requester:
$ref: "#/definitions/base_requester"
path: clients
http_method: GET
record_selector:
type: RecordSelector
extractor:
type: DpathExtractor
field_path: []
decoder:
type: JsonDecoder
schema_loader:
type: InlineSchemaLoader
schema:
$ref: "#/schemas/clients"
appointment-types:
type: DeclarativeStream
name: appointment-types
primary_key:
- id
retriever:
type: SimpleRetriever
requester:
$ref: "#/definitions/base_requester"
path: appointment-types
http_method: GET
record_selector:
type: RecordSelector
extractor:
type: DpathExtractor
field_path: []
decoder:
type: JsonDecoder
schema_loader:
type: InlineSchemaLoader
schema:
$ref: "#/schemas/appointment-types"
blocks:
type: DeclarativeStream
name: blocks
primary_key:
- id
retriever:
type: SimpleRetriever
requester:
$ref: "#/definitions/base_requester"
path: blocks
http_method: GET
request_parameters:
max: "10000"
record_selector:
type: RecordSelector
extractor:
type: DpathExtractor
field_path: []
decoder:
type: JsonDecoder
incremental_sync:
type: DatetimeBasedCursor
cursor_field: insert_date
lookback_window: P1W
cursor_datetime_formats:
- "%Y-%m-%d"
datetime_format: "%Y-%m-%d"
start_datetime:
type: MinMaxDatetime
datetime: "{{ config[\"start_date\"] }}"
datetime_format: "%Y-%m-%dT%H:%M:%SZ"
start_time_option:
type: RequestOption
field_name: minDate
inject_into: request_parameter
end_datetime:
type: MinMaxDatetime
datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}"
datetime_format: "%Y-%m-%dT%H:%M:%SZ"
transformations:
- type: AddFields
fields:
- type: AddedFieldDefinition
path:
- insert_date
value: "{{ stream_slice.start_time }}"
schema_loader:
type: InlineSchemaLoader
schema:
$ref: "#/schemas/blocks"
labels:
type: DeclarativeStream
name: labels
primary_key:
- id
retriever:
type: SimpleRetriever
requester:
$ref: "#/definitions/base_requester"
path: labels
http_method: GET
record_selector:
type: RecordSelector
extractor:
type: DpathExtractor
field_path: []
decoder:
type: JsonDecoder
schema_loader:
type: InlineSchemaLoader
schema:
$ref: "#/schemas/labels"
forms:
type: DeclarativeStream
name: forms
primary_key:
- id
retriever:
type: SimpleRetriever
requester:
$ref: "#/definitions/base_requester"
path: forms
http_method: GET
record_selector:
type: RecordSelector
extractor:
type: DpathExtractor
field_path: []
decoder:
type: JsonDecoder
schema_loader:
type: InlineSchemaLoader
schema:
$ref: "#/schemas/forms"
base_requester:
type: HttpRequester
url_base: https://acuityscheduling.com/api/v1
authenticator:
type: BasicHttpAuthenticator
password: "{{ config[\"password\"] }}"
username: "{{ config[\"username\"] }}"
streams:
- $ref: "#/definitions/streams/appointments"
- $ref: "#/definitions/streams/calendars"
- $ref: "#/definitions/streams/clients"
- $ref: "#/definitions/streams/appointment-types"
- $ref: "#/definitions/streams/blocks"
- $ref: "#/definitions/streams/labels"
- $ref: "#/definitions/streams/forms"
spec:
type: Spec
connection_specification:
type: object
$schema: http://json-schema.org/draft-07/schema#
required:
- username
- start_date
properties:
username:
type: string
order: 0
title: Username
password:
type: string
order: 1
title: Password
always_show: true
airbyte_secret: true
start_date:
type: string
order: 2
title: Start date
format: date-time
pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$
additionalProperties: true
metadata:
autoImportSchema:
appointments: true
calendars: true
clients: true
appointment-types: true
blocks: true
labels: true
forms: true
testedStreams:
appointments:
streamHash: 583df5d3ff7b1808cfa5e2dd5cf6b6f7b82c3818
hasResponse: true
responsesAreSuccessful: true
hasRecords: true
primaryKeysArePresent: true
primaryKeysAreUnique: true
calendars:
streamHash: 0f0b6fd2e19930c693406ff8b814bd1b27ebe771
hasResponse: true
responsesAreSuccessful: true
hasRecords: true
primaryKeysArePresent: true
primaryKeysAreUnique: true
clients:
streamHash: 5b5ad6fd3c8e0552d1082c89924b189a96908dad
hasResponse: true
responsesAreSuccessful: true
hasRecords: true
primaryKeysArePresent: true
primaryKeysAreUnique: true
appointment-types:
streamHash: 610a45f21f5fc27da24e3a7b38f942772cdb970c
hasResponse: true
responsesAreSuccessful: true
hasRecords: true
primaryKeysArePresent: true
primaryKeysAreUnique: true
blocks:
streamHash: 135acc647612c65d16606b1de8f7c680e1e946b9
hasResponse: true
responsesAreSuccessful: true
hasRecords: true
primaryKeysArePresent: true
primaryKeysAreUnique: true
labels:
streamHash: 8b72b44745acf2445c0a67a3515991dbb2bfb318
hasResponse: true
responsesAreSuccessful: true
hasRecords: true
primaryKeysArePresent: true
primaryKeysAreUnique: true
forms:
streamHash: 2b13ee3df2f1f1b2a30171de8f1d826865690b96
hasResponse: true
responsesAreSuccessful: true
hasRecords: true
primaryKeysArePresent: true
primaryKeysAreUnique: true
assist: {}
schemas:
appointments:
type: object
$schema: http://json-schema.org/schema#
additionalProperties: true
properties:
type:
type:
- string
- "null"
addonIDs:
type:
- array
- "null"
amountPaid:
type:
- string
- "null"
appointmentTypeID:
type:
- number
- "null"
calendar:
type:
- string
- "null"
calendarID:
type:
- number
- "null"
calendarTimezone:
type:
- string
- "null"
canClientCancel:
type:
- boolean
- "null"
canClientReschedule:
type:
- boolean
- "null"
canceled:
type:
- boolean
- "null"
category:
type:
- string
- "null"
confirmationPage:
type:
- string
- "null"
confirmationPagePaymentLink:
type:
- string
- "null"
date:
type:
- string
- "null"
dateCreated:
type:
- string
- "null"
datetime:
type:
- string
- "null"
datetimeCreated:
type:
- string
- "null"
duration:
type:
- string
- "null"
email:
type:
- string
- "null"
endTime:
type:
- string
- "null"
firstName:
type:
- string
- "null"
forms:
type:
- array
- "null"
items:
type:
- object
- "null"
properties:
id:
type:
- number
- "null"
name:
type:
- string
- "null"
values:
type:
- array
- "null"
items:
type:
- object
- "null"
properties:
fieldID:
type:
- number
- "null"
id:
type:
- number
- "null"
name:
type:
- string
- "null"
value:
type:
- string
- "null"
formsText:
type:
- string
- "null"
id:
type: number
insert_date:
type: string
lastName:
type:
- string
- "null"
location:
type:
- string
- "null"
notes:
type:
- string
- "null"
paid:
type:
- string
- "null"
phone:
type:
- string
- "null"
price:
type:
- string
- "null"
priceSold:
type:
- string
- "null"
time:
type:
- string
- "null"
timezone:
type:
- string
- "null"
required:
- id
- insert_date
calendars:
type: object
$schema: http://json-schema.org/schema#
additionalProperties: true
properties:
description:
type:
- string
- "null"
email:
type:
- string
- "null"
id:
type: number
image:
type:
- boolean
- "null"
location:
type:
- string
- "null"
name:
type:
- string
- "null"
replyTo:
type:
- string
- "null"
thumbnail:
type:
- boolean
- "null"
timezone:
type:
- string
- "null"
required:
- id
clients:
type: object
$schema: http://json-schema.org/schema#
additionalProperties: true
properties:
email:
type: string
firstName:
type:
- string
- "null"
lastName:
type:
- string
- "null"
notes:
type:
- string
- "null"
phone:
type:
- string
- "null"
required:
- email
appointment-types:
type: object
$schema: http://json-schema.org/schema#
additionalProperties: true
properties:
type:
type:
- string
- "null"
description:
type:
- string
- "null"
active:
type:
- boolean
- "null"
addonIDs:
type:
- array
- "null"
calendarIDs:
type:
- array
- "null"
items:
type:
- number
- "null"
category:
type:
- string
- "null"
color:
type:
- string
- "null"
duration:
type:
- number
- "null"
formIDs:
type:
- array
- "null"
items:
type:
- number
- "null"
id:
type: number
image:
type:
- string
- "null"
name:
type:
- string
- "null"
paddingAfter:
type:
- number
- "null"
paddingBefore:
type:
- number
- "null"
price:
type:
- string
- "null"
private:
type:
- boolean
- "null"
schedulingUrl:
type:
- string
- "null"
required:
- id
blocks:
type: object
$schema: http://json-schema.org/schema#
additionalProperties: true
properties:
description:
type:
- string
- "null"
calendarID:
type:
- number
- "null"
calendarTimezone:
type:
- string
- "null"
end:
type:
- string
- "null"
id:
type: number
insert_date:
type: string
managed:
type:
- boolean
- "null"
notes:
type:
- string
- "null"
serviceGroupID:
type:
- number
- "null"
start:
type:
- string
- "null"
required:
- id
- insert_date
labels:
type: object
$schema: http://json-schema.org/schema#
additionalProperties: true
properties:
color:
type:
- string
- "null"
id:
type: number
name:
type:
- string
- "null"
required:
- id
forms:
type: object
$schema: http://json-schema.org/schema#
additionalProperties: true
properties:
description:
type:
- string
- "null"
appointmentTypeIDs:
type:
- array
- "null"
items:
type:
- number
- "null"
fields:
type:
- array
- "null"
items:
type:
- object
- "null"
properties:
type:
type:
- string
- "null"
id:
type:
- number
- "null"
lines:
type:
- number
- "null"
name:
type:
- string
- "null"
required:
type:
- boolean
- "null"
hidden:
type:
- boolean
- "null"
id:
type: number
name:
type:
- string
- "null"
required:
- id

View File

@@ -0,0 +1,35 @@
metadataSpecVersion: "1.0"
data:
allowedHosts:
hosts:
- "acuityscheduling.com"
registryOverrides:
oss:
enabled: true
cloud:
enabled: true
remoteRegistries:
pypi:
enabled: false
packageName: airbyte-source-acuity-scheduling
connectorBuildOptions:
baseImage: docker.io/airbyte/source-declarative-manifest:6.57.0@sha256:d3e766c04130e607773c1ed8e3ef82b1b932ad514e15b3bb78f0ee13ab59d03d
connectorSubtype: api
connectorType: source
definitionId: bc7db25c-bdfb-4ec2-96ae-a4687cead916
dockerImageTag: 0.0.1
dockerRepository: airbyte/source-acuity-scheduling
githubIssueLabel: source-acuity-scheduling
icon: icon.svg
license: MIT
name: Acuity Scheduling
releaseDate: 2025-07-02
releaseStage: alpha
supportLevel: community
documentationUrl: https://docs.airbyte.com/integrations/sources/acuity-scheduling
tags:
- language:manifest-only
- cdk:low-code
ab_internal:
ql: 100
sl: 100