Skip to content

Commit c0e629f

Browse files
authored
source-savvycal contribution from natikgadzhi (#45069)
1 parent 34eb16d commit c0e629f

File tree

6 files changed

+295
-0
lines changed

6 files changed

+295
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# SavvyCal
2+
This directory contains the manifest-only connector for `source-savvycal`.
3+
4+
Sync your scheduled meetings and scheduling links from SavvyCal!
5+
6+
## Usage
7+
There are multiple ways to use this connector:
8+
- You can use this connector as any other connector in Airbyte Marketplace.
9+
- You can load this connector in `pyairbyte` using `get_source`!
10+
- You can open this connector in Connector Builder, edit it, and publish to your workspaces.
11+
12+
Please refer to the manifest-only connector documentation for more details.
13+
14+
## Local Development
15+
We recommend you use the Connector Builder to edit this connector.
16+
17+
But, if you want to develop this connector locally, you can use the following steps.
18+
19+
### Environment Setup
20+
You will need `airbyte-ci` installed. You can find the documentation [here](airbyte-ci).
21+
22+
### Build
23+
This will create a dev image (`source-savvycal:dev`) that you can use to test the connector locally.
24+
```bash
25+
airbyte-ci connectors --name=source-savvycal build
26+
```
27+
28+
### Test
29+
This will run the acceptance tests for the connector.
30+
```bash
31+
airbyte-ci connectors --name=source-savvycal test
32+
```
33+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference)
2+
# for more information about how to configure these tests
3+
connector_image: airbyte/source-savvycal:dev
4+
acceptance_tests:
5+
spec:
6+
tests:
7+
- spec_path: "manifest.yaml"
8+
connection:
9+
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
10+
discovery:
11+
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
12+
basic_read:
13+
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
14+
incremental:
15+
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
16+
full_refresh:
17+
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
version: 4.6.2
2+
3+
type: DeclarativeSource
4+
5+
description: Sync your scheduled meetings and scheduling links from SavvyCal!
6+
7+
check:
8+
type: CheckStream
9+
stream_names:
10+
- events
11+
12+
definitions:
13+
streams:
14+
events:
15+
type: DeclarativeStream
16+
name: events
17+
primary_key:
18+
- id
19+
retriever:
20+
type: SimpleRetriever
21+
requester:
22+
$ref: "#/definitions/base_requester"
23+
path: /v1/events
24+
http_method: GET
25+
record_selector:
26+
type: RecordSelector
27+
extractor:
28+
type: DpathExtractor
29+
field_path:
30+
- entries
31+
paginator:
32+
type: DefaultPaginator
33+
page_token_option:
34+
type: RequestOption
35+
inject_into: request_parameter
36+
field_name: after
37+
pagination_strategy:
38+
type: CursorPagination
39+
cursor_value: "{{ response.metadata.after }}"
40+
stop_condition: "{{ response.metadata.after is none }}"
41+
transformations:
42+
- type: AddFields
43+
fields:
44+
- path:
45+
- scheduler_name
46+
value: '{{ record["scheduler"]["display_name"] }}'
47+
- type: AddFields
48+
fields:
49+
- path:
50+
- scheduler_email
51+
value: '{{ record["scheduler"]["email"] }}'
52+
schema_loader:
53+
type: InlineSchemaLoader
54+
schema:
55+
$ref: "#/schemas/events"
56+
scheduling_links:
57+
type: DeclarativeStream
58+
name: scheduling_links
59+
primary_key:
60+
- id
61+
retriever:
62+
type: SimpleRetriever
63+
requester:
64+
$ref: "#/definitions/base_requester"
65+
path: /v1/links
66+
http_method: GET
67+
record_selector:
68+
type: RecordSelector
69+
extractor:
70+
type: DpathExtractor
71+
field_path:
72+
- entries
73+
paginator:
74+
type: DefaultPaginator
75+
page_token_option:
76+
type: RequestOption
77+
inject_into: request_parameter
78+
field_name: after
79+
pagination_strategy:
80+
type: CursorPagination
81+
cursor_value: "{{ response.metadata.after }}"
82+
stop_condition: "{{ response.metadata.after is none }}"
83+
schema_loader:
84+
type: InlineSchemaLoader
85+
schema:
86+
$ref: "#/schemas/scheduling_links"
87+
timezones:
88+
type: DeclarativeStream
89+
name: timezones
90+
primary_key:
91+
- id
92+
retriever:
93+
type: SimpleRetriever
94+
requester:
95+
$ref: "#/definitions/base_requester"
96+
path: /v1/time_zones
97+
http_method: GET
98+
record_selector:
99+
type: RecordSelector
100+
extractor:
101+
type: DpathExtractor
102+
field_path: []
103+
schema_loader:
104+
type: InlineSchemaLoader
105+
schema:
106+
$ref: "#/schemas/timezones"
107+
base_requester:
108+
type: HttpRequester
109+
url_base: https://api.savvycal.com
110+
authenticator:
111+
type: BearerAuthenticator
112+
api_token: '{{ config["api_key"] }}'
113+
114+
streams:
115+
- $ref: "#/definitions/streams/events"
116+
- $ref: "#/definitions/streams/scheduling_links"
117+
- $ref: "#/definitions/streams/timezones"
118+
119+
spec:
120+
type: Spec
121+
connection_specification:
122+
type: object
123+
$schema: http://json-schema.org/draft-07/schema#
124+
required:
125+
- api_key
126+
properties:
127+
api_key:
128+
type: string
129+
description: >-
130+
Go to SavvyCal → Settings → Developer → Personal Tokens and make a new
131+
token. Then, copy the private key. https://savvycal.com/developers
132+
name: api_key
133+
order: 0
134+
title: API Key
135+
airbyte_secret: true
136+
additionalProperties: true
137+
138+
metadata:
139+
autoImportSchema:
140+
events: false
141+
scheduling_links: false
142+
timezones: false
143+
testedStreams:
144+
events:
145+
streamHash: 983fbfcd76c950fb5a2e529e77be8c8cb53153a6
146+
hasResponse: true
147+
responsesAreSuccessful: true
148+
hasRecords: true
149+
primaryKeysArePresent: true
150+
primaryKeysAreUnique: true
151+
scheduling_links:
152+
streamHash: 41c519374dbff290916742ae064487485e0043e3
153+
hasResponse: true
154+
responsesAreSuccessful: true
155+
hasRecords: true
156+
primaryKeysArePresent: true
157+
primaryKeysAreUnique: true
158+
timezones:
159+
streamHash: e0aa739a05ae7c75ffc6d8e624102c52241d9744
160+
hasResponse: true
161+
responsesAreSuccessful: true
162+
hasRecords: true
163+
primaryKeysArePresent: true
164+
primaryKeysAreUnique: true
165+
assist:
166+
docsUrl: https://savvycal.com/docs/api/
167+
168+
schemas:
169+
events:
170+
type: object
171+
$schema: http://json-schema.org/draft-07/schema#
172+
additionalProperties: true
173+
properties: {}
174+
scheduling_links:
175+
type: object
176+
$schema: http://json-schema.org/draft-07/schema#
177+
additionalProperties: true
178+
properties: {}
179+
timezones:
180+
type: object
181+
$schema: http://json-schema.org/draft-07/schema#
182+
additionalProperties: true
183+
properties: {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
metadataSpecVersion: "1.0"
2+
data:
3+
allowedHosts:
4+
hosts:
5+
- api.savvycal.com
6+
registryOverrides:
7+
oss:
8+
enabled: true
9+
cloud:
10+
enabled: true
11+
remoteRegistries:
12+
pypi:
13+
enabled: false
14+
packageName: airbyte-source-savvycal
15+
connectorBuildOptions:
16+
baseImage: docker.io/airbyte/source-declarative-manifest:4.6.2@sha256:f5fcd3d4703b7590b6166a7853c5ed1686731607cd30a159a8c24e2fe2c1ee98
17+
connectorSubtype: api
18+
connectorType: source
19+
definitionId: a554ed06-74e2-4c60-9510-d63f7dc463b6
20+
dockerImageTag: 0.0.1
21+
dockerRepository: airbyte/source-savvycal
22+
githubIssueLabel: source-savvycal
23+
icon: icon.svg
24+
license: MIT
25+
name: SavvyCal
26+
releaseDate: 2024-09-01
27+
releaseStage: alpha
28+
supportLevel: community
29+
documentationUrl: https://docs.airbyte.com/integrations/sources/savvycal
30+
tags:
31+
- language:manifest-only
32+
- cdk:low-code
33+
ab_internal:
34+
ql: 100
35+
sl: 100

docs/integrations/sources/savvycal.md

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# SavvyCal
2+
Sync your scheduled meetings and scheduling links from SavvyCal!
3+
4+
## Configuration
5+
6+
| Input | Type | Description | Default Value |
7+
|-------|------|-------------|---------------|
8+
| `api_key` | `string` | API Key. Go to SavvyCal → Settings → Developer → Personal Tokens and make a new token. Then, copy the private key. https://savvycal.com/developers | |
9+
10+
## Streams
11+
| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental |
12+
|-------------|-------------|------------|---------------------|----------------------|
13+
| events | id | DefaultPaginator |||
14+
| scheduling_links | id | DefaultPaginator |||
15+
| timezones | id | No pagination |||
16+
17+
## Changelog
18+
19+
<details>
20+
<summary>Expand to review</summary>
21+
22+
| Version | Date | Subject |
23+
|------------------|------------|----------------|
24+
| 0.0.1 | 2024-09-01 | Initial release by [@natikgadzhi](https://github.com/natikgadzhi) via Connector Builder|
25+
26+
</details>

0 commit comments

Comments
 (0)