✨Source SendInBlue: Make Connector Compatible with Builder (#38346)
Co-authored-by: Alexandre Girard <alexandre@airbyte.io>
This commit is contained in:
@@ -1,6 +0,0 @@
|
||||
*
|
||||
!Dockerfile
|
||||
!main.py
|
||||
!source_sendinblue
|
||||
!setup.py
|
||||
!secrets
|
||||
@@ -1,38 +0,0 @@
|
||||
FROM python:3.9.11-alpine3.15 as base
|
||||
|
||||
# build and load all requirements
|
||||
FROM base as builder
|
||||
WORKDIR /airbyte/integration_code
|
||||
|
||||
# upgrade pip to the latest version
|
||||
RUN apk --no-cache upgrade \
|
||||
&& pip install --upgrade pip \
|
||||
&& apk --no-cache add tzdata build-base
|
||||
|
||||
|
||||
COPY setup.py ./
|
||||
# install necessary packages to a temporary folder
|
||||
RUN pip install --prefix=/install .
|
||||
|
||||
# build a clean environment
|
||||
FROM base
|
||||
WORKDIR /airbyte/integration_code
|
||||
|
||||
# copy all loaded and built libraries to a pure basic image
|
||||
COPY --from=builder /install /usr/local
|
||||
# add default timezone settings
|
||||
COPY --from=builder /usr/share/zoneinfo/Etc/UTC /etc/localtime
|
||||
RUN echo "Etc/UTC" > /etc/timezone
|
||||
|
||||
# bash is installed for more convenient debugging.
|
||||
RUN apk --no-cache add bash
|
||||
|
||||
# copy payload code only
|
||||
COPY main.py ./
|
||||
COPY source_sendinblue ./source_sendinblue
|
||||
|
||||
ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py"
|
||||
ENTRYPOINT ["python", "/airbyte/integration_code/main.py"]
|
||||
|
||||
LABEL io.airbyte.version=0.1.1
|
||||
LABEL io.airbyte.name=airbyte/source-sendinblue
|
||||
@@ -1,42 +1,64 @@
|
||||
# Sendinblue Source
|
||||
|
||||
This is the repository for the Sendinblue configuration based source connector.
|
||||
For information about how to use this connector within Airbyte, see [the documentation](https://docs.airbyte.io/integrations/sources/sendinblue).
|
||||
For information about how to use this connector within Airbyte, see [the documentation](https://docs.airbyte.com/integrations/sources/sendinblue).
|
||||
|
||||
## Local development
|
||||
|
||||
#### Create credentials
|
||||
### Prerequisites
|
||||
|
||||
**If you are a community contributor**, follow the instructions in the [documentation](https://docs.airbyte.io/integrations/sources/sendinblue)
|
||||
to generate the necessary credentials. Then create a file `secrets/config.json` conforming to the `source_sendinblue/spec.yaml` file.
|
||||
* Python (`^3.9`)
|
||||
* Poetry (`^1.7`) - installation instructions [here](https://python-poetry.org/docs/#installation)
|
||||
|
||||
|
||||
|
||||
### Installing the connector
|
||||
|
||||
From this connector directory, run:
|
||||
```bash
|
||||
poetry install --with dev
|
||||
```
|
||||
|
||||
|
||||
### Create credentials
|
||||
|
||||
**If you are a community contributor**, follow the instructions in the [documentation](https://docs.airbyte.com/integrations/sources/sendinblue)
|
||||
to generate the necessary credentials. Then create a file `secrets/config.json` conforming to the `src/source_sendinblue/spec.yaml` file.
|
||||
Note that any directory named `secrets` is gitignored across the entire Airbyte repo, so there is no danger of accidentally checking in sensitive information.
|
||||
See `integration_tests/sample_config.json` for a sample config file.
|
||||
See `sample_files/sample_config.json` for a sample config file.
|
||||
|
||||
**If you are an Airbyte core member**, copy the credentials in Lastpass under the secret name `source sendinblue test creds`
|
||||
and place them into `secrets/config.json`.
|
||||
|
||||
### Locally running the connector docker image
|
||||
### Locally running the connector
|
||||
|
||||
#### Build
|
||||
```
|
||||
poetry run source-sendinblue spec
|
||||
poetry run source-sendinblue check --config secrets/config.json
|
||||
poetry run source-sendinblue discover --config secrets/config.json
|
||||
poetry run source-sendinblue read --config secrets/config.json --catalog sample_files/configured_catalog.json
|
||||
```
|
||||
|
||||
**Via [`airbyte-ci`](https://github.com/airbytehq/airbyte/blob/master/airbyte-ci/connectors/pipelines/README.md) (recommended):**
|
||||
### Running tests
|
||||
|
||||
To run tests locally, from the connector directory run:
|
||||
|
||||
```
|
||||
poetry run pytest tests
|
||||
```
|
||||
|
||||
### Building the docker image
|
||||
|
||||
1. Install [`airbyte-ci`](https://github.com/airbytehq/airbyte/blob/master/airbyte-ci/connectors/pipelines/README.md)
|
||||
2. Run the following command to build the docker image:
|
||||
```bash
|
||||
airbyte-ci connectors --name=source-sendinblue build
|
||||
```
|
||||
|
||||
An image will be built with the tag `airbyte/source-sendinblue:dev`.
|
||||
An image will be available on your host with the tag `airbyte/source-sendinblue:dev`.
|
||||
|
||||
**Via `docker build`:**
|
||||
|
||||
```bash
|
||||
docker build -t airbyte/source-sendinblue:dev .
|
||||
```
|
||||
|
||||
#### Run
|
||||
### Running as a docker container
|
||||
|
||||
Then run any of the connector commands as follows:
|
||||
|
||||
```
|
||||
docker run --rm airbyte/source-sendinblue:dev spec
|
||||
docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-sendinblue:dev check --config /secrets/config.json
|
||||
@@ -44,35 +66,38 @@ docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-sendinblue:dev discove
|
||||
docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integration_tests airbyte/source-sendinblue:dev read --config /secrets/config.json --catalog /integration_tests/configured_catalog.json
|
||||
```
|
||||
|
||||
## Testing
|
||||
### Running our CI test suite
|
||||
|
||||
You can run our full test suite locally using [`airbyte-ci`](https://github.com/airbytehq/airbyte/blob/master/airbyte-ci/connectors/pipelines/README.md):
|
||||
|
||||
```bash
|
||||
airbyte-ci connectors --name=source-sendinblue test
|
||||
```
|
||||
|
||||
### Customizing acceptance Tests
|
||||
|
||||
Customize `acceptance-test-config.yml` file to configure tests. See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference) for more information.
|
||||
Customize `acceptance-test-config.yml` file to configure acceptance tests. See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference) for more information.
|
||||
If your connector requires to create or destroy resources for use during acceptance tests create fixtures for it and place them inside integration_tests/acceptance.py.
|
||||
|
||||
## Dependency Management
|
||||
### Dependency Management
|
||||
|
||||
All of your dependencies should go in `setup.py`, NOT `requirements.txt`. The requirements file is only used to connect internal Airbyte dependencies in the monorepo for local development.
|
||||
We split dependencies between two groups, dependencies that are:
|
||||
All of your dependencies should be managed via Poetry.
|
||||
To add a new dependency, run:
|
||||
```bash
|
||||
poetry add <package-name>
|
||||
```
|
||||
|
||||
- required for your connector to work need to go to `MAIN_REQUIREMENTS` list.
|
||||
- required for the testing need to go to `TEST_REQUIREMENTS` list
|
||||
Please commit the changes to `pyproject.toml` and `poetry.lock` files.
|
||||
|
||||
### Publishing a new version of the connector
|
||||
## Publishing a new version of the connector
|
||||
|
||||
You've checked out the repo, implemented a million dollar feature, and you're ready to share your changes with the world. Now what?
|
||||
|
||||
1. Make sure your changes are passing our test suite: `airbyte-ci connectors --name=source-sendinblue test`
|
||||
2. Bump the connector version in `metadata.yaml`: increment the `dockerImageTag` value. Please follow [semantic versioning for connectors](https://docs.airbyte.com/contributing-to-airbyte/resources/pull-requests-handbook/#semantic-versioning-for-connectors).
|
||||
2. Bump the connector version (please follow [semantic versioning for connectors](https://docs.airbyte.com/contributing-to-airbyte/resources/pull-requests-handbook/#semantic-versioning-for-connectors)):
|
||||
- bump the `dockerImageTag` value in in `metadata.yaml`
|
||||
- bump the `version` value in `pyproject.toml`
|
||||
3. Make sure the `metadata.yaml` content is up to date.
|
||||
4. Make the connector documentation and its changelog is up to date (`docs/integrations/sources/sendinblue.md`).
|
||||
4. Make sure the connector documentation and its changelog is up to date (`docs/integrations/sources/sendinblue.md`).
|
||||
5. Create a Pull Request: use [our PR naming conventions](https://docs.airbyte.com/contributing-to-airbyte/resources/pull-requests-handbook/#pull-request-title-convention).
|
||||
6. Pat yourself on the back for being an awesome contributor.
|
||||
7. Someone from Airbyte will take a look at your PR and iterate with you to merge it into master.
|
||||
8. Once your PR is merged, the new version of the connector will be automatically published to Docker Hub and our connector registry.
|
||||
@@ -1,3 +1,3 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
from source_sendinblue.run import run
|
||||
|
||||
@@ -2,16 +2,25 @@ data:
|
||||
ab_internal:
|
||||
ql: 200
|
||||
sl: 100
|
||||
allowedHosts:
|
||||
hosts:
|
||||
- api.sendinblue.com
|
||||
connectorBuildOptions:
|
||||
# Please update to the latest version of the connector base image.
|
||||
# https://hub.docker.com/r/airbyte/python-connector-base
|
||||
# Please use the full address with sha256 hash to guarantee build reproducibility.
|
||||
baseImage: docker.io/airbyte/python-connector-base:1.2.0@sha256:c22a9d97464b69d6ef01898edf3f8612dc11614f05a84984451dde195f337db9
|
||||
connectorSubtype: api
|
||||
connectorType: source
|
||||
definitionId: 2e88fa20-a2f6-43cc-bba6-98a0a3f244fb
|
||||
dockerImageTag: 0.1.1
|
||||
dockerImageTag: 0.1.2
|
||||
dockerRepository: airbyte/source-sendinblue
|
||||
documentationUrl: https://docs.airbyte.com/integrations/sources/sendinblue
|
||||
githubIssueLabel: source-sendinblue
|
||||
icon: sendinblue.svg
|
||||
license: MIT
|
||||
name: Sendinblue
|
||||
releaseDate: 2022-11-01
|
||||
remoteRegistries:
|
||||
pypi:
|
||||
enabled: true
|
||||
|
||||
1303
airbyte-integrations/connectors/source-sendinblue/poetry.lock
generated
Normal file
1303
airbyte-integrations/connectors/source-sendinblue/poetry.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,27 @@
|
||||
[build-system]
|
||||
requires = [ "poetry-core>=1.0.0",]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
|
||||
[tool.poetry]
|
||||
version = "0.1.2"
|
||||
name = "source-sendinblue"
|
||||
description = "Source implementation for sendinblue."
|
||||
authors = [ "Airbyte <contact@airbyte.io>",]
|
||||
license = "MIT"
|
||||
readme = "README.md"
|
||||
documentation = "https://docs.airbyte.com/integrations/sources/sendinblue"
|
||||
homepage = "https://airbyte.com"
|
||||
repository = "https://github.com/airbytehq/airbyte"
|
||||
packages = [ { include = "source_sendinblue" }, {include = "main.py" } ]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.9,<3.12"
|
||||
airbyte-cdk = "^0"
|
||||
|
||||
[tool.poetry.scripts]
|
||||
source-sendinblue = "source_sendinblue.run:run"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
requests-mock = "*"
|
||||
pytest-mock = "*"
|
||||
pytest = "*"
|
||||
@@ -1 +0,0 @@
|
||||
-e .
|
||||
@@ -1,46 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
MAIN_REQUIREMENTS = [
|
||||
"airbyte-cdk",
|
||||
]
|
||||
|
||||
TEST_REQUIREMENTS = [
|
||||
"requests-mock~=1.9.3",
|
||||
"pytest~=6.1",
|
||||
"pytest-mock~=3.6.1",
|
||||
]
|
||||
|
||||
setup(
|
||||
entry_points={
|
||||
"console_scripts": [
|
||||
"source-sendinblue=source_sendinblue.run:run",
|
||||
],
|
||||
},
|
||||
name="source_sendinblue",
|
||||
description="Source implementation for Sendinblue.",
|
||||
author="Airbyte",
|
||||
author_email="contact@airbyte.io",
|
||||
packages=find_packages(),
|
||||
install_requires=MAIN_REQUIREMENTS,
|
||||
package_data={
|
||||
"": [
|
||||
# Include yaml files in the package (if any)
|
||||
"*.yml",
|
||||
"*.yaml",
|
||||
# Include all json files in the package, up to 4 levels deep
|
||||
"*.json",
|
||||
"*/*.json",
|
||||
"*/*/*.json",
|
||||
"*/*/*/*.json",
|
||||
"*/*/*/*/*.json",
|
||||
]
|
||||
},
|
||||
extras_require={
|
||||
"tests": TEST_REQUIREMENTS,
|
||||
},
|
||||
)
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
|
||||
@@ -1,83 +1,375 @@
|
||||
version: "0.29.0"
|
||||
version: 0.78.5
|
||||
|
||||
definitions:
|
||||
selector:
|
||||
extractor:
|
||||
field_path: ["{{ parameters['name'] }}"]
|
||||
requester:
|
||||
url_base: "https://api.sendinblue.com/v3"
|
||||
http_method: "GET"
|
||||
authenticator:
|
||||
type: ApiKeyAuthenticator
|
||||
header: "api-key"
|
||||
api_token: "{{ config['api_key'] }}"
|
||||
offset_paginator:
|
||||
type: DefaultPaginator
|
||||
pagination_strategy:
|
||||
type: "OffsetIncrement"
|
||||
page_size: 100
|
||||
page_token_option:
|
||||
type: RequestOption
|
||||
field_name: "offset"
|
||||
inject_into: "request_parameter"
|
||||
page_size_option:
|
||||
inject_into: "request_parameter"
|
||||
field_name: "limit"
|
||||
incremental_sync:
|
||||
type: DatetimeBasedCursor
|
||||
cursor_field: modifiedAt
|
||||
cursor_datetime_formats:
|
||||
- "%Y-%m-%dT%H:%M:%S.%f%z"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%S.%f%z"
|
||||
start_datetime:
|
||||
type: MinMaxDatetime
|
||||
datetime: "2000-01-01T00:00:00Z"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%SZ"
|
||||
start_time_option:
|
||||
inject_into: request_parameter
|
||||
field_name: modifiedSince
|
||||
retriever:
|
||||
record_selector:
|
||||
$ref: "#/definitions/selector"
|
||||
paginator:
|
||||
$ref: "#/definitions/offset_paginator"
|
||||
requester:
|
||||
$ref: "#/definitions/requester"
|
||||
base_stream:
|
||||
retriever:
|
||||
$ref: "#/definitions/retriever"
|
||||
campaigns_stream:
|
||||
$ref: "#/definitions/base_stream"
|
||||
$parameters:
|
||||
name: "campaigns"
|
||||
primary_key: "id"
|
||||
path: "/emailCampaigns"
|
||||
campaign_partition_router:
|
||||
type: SubstreamPartitionRouter
|
||||
parent_stream_configs:
|
||||
- stream: "#/definitions/campaigns_stream"
|
||||
parent_key: id
|
||||
partition_field: campaign_id
|
||||
templates_stream:
|
||||
$ref: "#/definitions/base_stream"
|
||||
$parameters:
|
||||
name: templates
|
||||
primary_key: id
|
||||
path: "/smtp/templates"
|
||||
contacts_stream:
|
||||
$ref: "#/definitions/base_stream"
|
||||
incremental_sync:
|
||||
$ref: "#/definitions/incremental_sync"
|
||||
$parameters:
|
||||
name: contacts
|
||||
primary_key: id
|
||||
path: "/contacts"
|
||||
|
||||
streams:
|
||||
- "#/definitions/campaigns_stream"
|
||||
- "#/definitions/templates_stream"
|
||||
- "#/definitions/contacts_stream"
|
||||
type: DeclarativeSource
|
||||
|
||||
check:
|
||||
type: CheckStream
|
||||
stream_names:
|
||||
- "campaigns"
|
||||
- campaigns
|
||||
|
||||
definitions:
|
||||
streams:
|
||||
campaigns:
|
||||
type: DeclarativeStream
|
||||
name: campaigns
|
||||
primary_key:
|
||||
- id
|
||||
retriever:
|
||||
type: SimpleRetriever
|
||||
requester:
|
||||
$ref: "#/definitions/base_requester"
|
||||
path: /emailCampaigns
|
||||
http_method: GET
|
||||
record_selector:
|
||||
type: RecordSelector
|
||||
extractor:
|
||||
type: DpathExtractor
|
||||
field_path:
|
||||
- campaigns
|
||||
paginator:
|
||||
type: DefaultPaginator
|
||||
page_token_option:
|
||||
type: RequestOption
|
||||
inject_into: request_parameter
|
||||
field_name: offset
|
||||
page_size_option:
|
||||
type: RequestOption
|
||||
inject_into: request_parameter
|
||||
field_name: limit
|
||||
pagination_strategy:
|
||||
type: OffsetIncrement
|
||||
page_size: 100
|
||||
schema_loader:
|
||||
type: InlineSchemaLoader
|
||||
schema:
|
||||
$ref: "#/schemas/campaigns"
|
||||
templates:
|
||||
type: DeclarativeStream
|
||||
name: templates
|
||||
primary_key:
|
||||
- id
|
||||
retriever:
|
||||
type: SimpleRetriever
|
||||
requester:
|
||||
$ref: "#/definitions/base_requester"
|
||||
path: /smtp/templates
|
||||
http_method: GET
|
||||
record_selector:
|
||||
type: RecordSelector
|
||||
extractor:
|
||||
type: DpathExtractor
|
||||
field_path:
|
||||
- templates
|
||||
paginator:
|
||||
type: DefaultPaginator
|
||||
page_token_option:
|
||||
type: RequestOption
|
||||
inject_into: request_parameter
|
||||
field_name: offset
|
||||
page_size_option:
|
||||
type: RequestOption
|
||||
inject_into: request_parameter
|
||||
field_name: limit
|
||||
pagination_strategy:
|
||||
type: OffsetIncrement
|
||||
page_size: 100
|
||||
schema_loader:
|
||||
type: InlineSchemaLoader
|
||||
schema:
|
||||
$ref: "#/schemas/templates"
|
||||
contacts:
|
||||
type: DeclarativeStream
|
||||
name: contacts
|
||||
primary_key:
|
||||
- id
|
||||
retriever:
|
||||
type: SimpleRetriever
|
||||
requester:
|
||||
$ref: "#/definitions/base_requester"
|
||||
path: /contacts
|
||||
http_method: GET
|
||||
record_selector:
|
||||
type: RecordSelector
|
||||
extractor:
|
||||
type: DpathExtractor
|
||||
field_path:
|
||||
- contacts
|
||||
record_filter:
|
||||
type: RecordFilter
|
||||
condition: "{{ record['modifiedAt'] >= stream_interval['start_time'] }}"
|
||||
paginator:
|
||||
type: DefaultPaginator
|
||||
page_token_option:
|
||||
type: RequestOption
|
||||
inject_into: request_parameter
|
||||
field_name: offset
|
||||
page_size_option:
|
||||
type: RequestOption
|
||||
inject_into: request_parameter
|
||||
field_name: limit
|
||||
pagination_strategy:
|
||||
type: OffsetIncrement
|
||||
page_size: 100
|
||||
incremental_sync:
|
||||
type: DatetimeBasedCursor
|
||||
cursor_field: modifiedAt
|
||||
name: contacts
|
||||
primary_key: id
|
||||
path: /contacts
|
||||
cursor_datetime_formats:
|
||||
- "%Y-%m-%dT%H:%M:%S.%f%z"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%S.%f%z"
|
||||
start_datetime:
|
||||
type: MinMaxDatetime
|
||||
datetime: "2000-01-01T00:00:00Z"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%SZ"
|
||||
start_time_option:
|
||||
type: RequestOption
|
||||
inject_into: request_parameter
|
||||
field_name: modifiedSince
|
||||
schema_loader:
|
||||
type: InlineSchemaLoader
|
||||
schema:
|
||||
$ref: "#/schemas/contacts"
|
||||
base_requester:
|
||||
type: HttpRequester
|
||||
url_base: https://api.sendinblue.com/v3
|
||||
authenticator:
|
||||
type: ApiKeyAuthenticator
|
||||
api_token: "{{ config['api_key'] }}"
|
||||
inject_into:
|
||||
type: RequestOption
|
||||
field_name: api-key
|
||||
inject_into: header
|
||||
|
||||
streams:
|
||||
- $ref: "#/definitions/streams/campaigns"
|
||||
- $ref: "#/definitions/streams/templates"
|
||||
- $ref: "#/definitions/streams/contacts"
|
||||
|
||||
spec:
|
||||
type: Spec
|
||||
connection_specification:
|
||||
type: object
|
||||
$schema: http://json-schema.org/draft-07/schema#
|
||||
required:
|
||||
- api_key
|
||||
properties:
|
||||
api_key:
|
||||
type: string
|
||||
title: API Key
|
||||
airbyte_secret: true
|
||||
description: >-
|
||||
Your API Key. See <a
|
||||
href="https://developers.sendinblue.com/docs/getting-started">here</a>.
|
||||
order: 0
|
||||
additionalProperties: true
|
||||
|
||||
metadata:
|
||||
autoImportSchema:
|
||||
campaigns: false
|
||||
templates: false
|
||||
contacts: false
|
||||
|
||||
schemas:
|
||||
campaigns:
|
||||
type: object
|
||||
$schema: http://json-schema.org/draft-07/schema#
|
||||
additionalProperties: true
|
||||
properties:
|
||||
type:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
abTesting:
|
||||
type:
|
||||
- "null"
|
||||
- boolean
|
||||
createdAt:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
footer:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
header:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
htmlContent:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
id:
|
||||
type:
|
||||
- "null"
|
||||
- integer
|
||||
inlineImageActivation:
|
||||
type:
|
||||
- "null"
|
||||
- boolean
|
||||
mirrorActive:
|
||||
type:
|
||||
- "null"
|
||||
- boolean
|
||||
modifiedAt:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
name:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
previewText:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
recipients:
|
||||
type:
|
||||
- "null"
|
||||
- object
|
||||
replyTo:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
scheduledAt:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
sendAtBestTime:
|
||||
type:
|
||||
- "null"
|
||||
- boolean
|
||||
sender:
|
||||
type:
|
||||
- "null"
|
||||
- object
|
||||
additionalProperties: true
|
||||
properties: {}
|
||||
shareLink:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
statistics:
|
||||
type:
|
||||
- "null"
|
||||
- object
|
||||
status:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
subject:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
tag:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
testSent:
|
||||
type:
|
||||
- "null"
|
||||
- boolean
|
||||
toField:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
templates:
|
||||
type: object
|
||||
$schema: http://json-schema.org/draft-07/schema#
|
||||
additionalProperties: true
|
||||
properties:
|
||||
type:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
createdAt:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
htmlContent:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
id:
|
||||
type:
|
||||
- "null"
|
||||
- integer
|
||||
isActive:
|
||||
type:
|
||||
- "null"
|
||||
- boolean
|
||||
modifiedAt:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
name:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
replyTo:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
sender:
|
||||
type:
|
||||
- "null"
|
||||
- object
|
||||
additionalProperties: true
|
||||
properties: {}
|
||||
subject:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
tag:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
testSent:
|
||||
type:
|
||||
- "null"
|
||||
- boolean
|
||||
toField:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
contacts:
|
||||
type: object
|
||||
$schema: http://json-schema.org/draft-07/schema#
|
||||
additionalProperties: true
|
||||
properties:
|
||||
attributes:
|
||||
type:
|
||||
- "null"
|
||||
- object
|
||||
additionalProperties: true
|
||||
properties: {}
|
||||
createdAt:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
email:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
emailBlacklisted:
|
||||
type:
|
||||
- "null"
|
||||
- boolean
|
||||
id:
|
||||
type:
|
||||
- "null"
|
||||
- integer
|
||||
listIds:
|
||||
type:
|
||||
- "null"
|
||||
- array
|
||||
modifiedAt:
|
||||
type:
|
||||
- "null"
|
||||
- string
|
||||
smsBlacklisted:
|
||||
type:
|
||||
- "null"
|
||||
- boolean
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
from airbyte_cdk.entrypoint import launch
|
||||
from source_sendinblue import SourceSendinblue
|
||||
|
||||
from .source import SourceSendinblue
|
||||
|
||||
|
||||
def run():
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"additionalProperties": true,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": ["null", "integer"]
|
||||
},
|
||||
"name": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"type": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"status": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"testSent": {
|
||||
"type": ["null", "boolean"]
|
||||
},
|
||||
"header": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"footer": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"sender": {
|
||||
"type": ["null", "object"],
|
||||
"additionalProperties": true,
|
||||
"properties": {}
|
||||
},
|
||||
"replyTo": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"toField": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"htmlContent": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"tag": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"inlineImageActivation": {
|
||||
"type": ["null", "boolean"]
|
||||
},
|
||||
"mirrorActive": {
|
||||
"type": ["null", "boolean"]
|
||||
},
|
||||
"recipients": {
|
||||
"type": ["null", "object"]
|
||||
},
|
||||
"statistics": {
|
||||
"type": ["null", "object"]
|
||||
},
|
||||
"subject": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"scheduledAt": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"createdAt": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"modifiedAt": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"previewText": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"shareLink": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"sendAtBestTime": {
|
||||
"type": ["null", "boolean"]
|
||||
},
|
||||
"abTesting": {
|
||||
"type": ["null", "boolean"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"additionalProperties": true,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": ["null", "integer"]
|
||||
},
|
||||
"email": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"emailBlacklisted": {
|
||||
"type": ["null", "boolean"]
|
||||
},
|
||||
"smsBlacklisted": {
|
||||
"type": ["null", "boolean"]
|
||||
},
|
||||
"listIds": {
|
||||
"type": ["null", "array"]
|
||||
},
|
||||
"createdAt": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"modifiedAt": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"attributes": {
|
||||
"type": ["null", "object"],
|
||||
"additionalProperties": true,
|
||||
"properties": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"additionalProperties": true,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": ["null", "integer"]
|
||||
},
|
||||
"name": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"type": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"testSent": {
|
||||
"type": ["null", "boolean"]
|
||||
},
|
||||
"isActive": {
|
||||
"type": ["null", "boolean"]
|
||||
},
|
||||
"sender": {
|
||||
"type": ["null", "object"],
|
||||
"additionalProperties": true,
|
||||
"properties": {}
|
||||
},
|
||||
"subject": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"replyTo": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"toField": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"htmlContent": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"tag": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"createdAt": {
|
||||
"type": ["null", "string"]
|
||||
},
|
||||
"modifiedAt": {
|
||||
"type": ["null", "string"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
documentationUrl: https://docs.airbyte.com/integrations/sources/sendinblue
|
||||
connectionSpecification:
|
||||
$schema: http://json-schema.org/draft-07/schema#
|
||||
title: Sendinblue Spec
|
||||
type: object
|
||||
required:
|
||||
- api_key
|
||||
additionalProperties: true
|
||||
properties:
|
||||
api_key:
|
||||
title: API Key
|
||||
type: string
|
||||
description: >-
|
||||
Your API Key. See <a
|
||||
href="https://developers.sendinblue.com/docs/getting-started">here</a>.
|
||||
airbyte_secret: true
|
||||
@@ -34,7 +34,8 @@ Sendinblue APIs are under rate limits for the number of API calls allowed per AP
|
||||
|
||||
| Version | Date | Pull Request | Subject |
|
||||
| :------ | :--------- | :-------------------------------------------------------- | :------------------------------------------------------------ |
|
||||
| 0.1.1 | 2022-08-31 | [#30022](https://github.com/airbytehq/airbyte/pull/30022) | ✨ Source SendInBlue: Add incremental sync to contacts stream |
|
||||
| 0.1.0 | 2022-11-01 | [#18771](https://github.com/airbytehq/airbyte/pull/18771) | 🎉 New Source: Sendinblue API [low-code CDK] |
|
||||
| 0.1.2 | 2024-06-27 | [38346](https://github.com/airbytehq/airbyte/pull/38346) | Make comptability with builder |
|
||||
| 0.1.1 | 2022-08-31 | [30022](https://github.com/airbytehq/airbyte/pull/30022) | ✨ Source SendInBlue: Add incremental sync to contacts stream |
|
||||
| 0.1.0 | 2022-11-01 | [18771](https://github.com/airbytehq/airbyte/pull/18771) | 🎉 New Source: Sendinblue API [low-code CDK] |
|
||||
|
||||
</details>
|
||||
Reference in New Issue
Block a user