feat(source-stripe): migrate application_fees, authorizations, cardholders, cards, early_fraud_warnings, external_account_bank_accounts and external_account_cards to low-code (#58060)
Co-authored-by: Octavia Squidington III <octavia-squidington-iii@users.noreply.github.com>
This commit is contained in:
@@ -10,7 +10,7 @@ data:
|
||||
connectorSubtype: api
|
||||
connectorType: source
|
||||
definitionId: e094cb9a-26de-4645-8761-65c0c425d1de
|
||||
dockerImageTag: 5.9.2
|
||||
dockerImageTag: 5.10.0-rc.1
|
||||
dockerRepository: airbyte/source-stripe
|
||||
documentationUrl: https://docs.airbyte.com/integrations/sources/stripe
|
||||
erdUrl: https://dbdocs.io/airbyteio/source-stripe?view=relationships
|
||||
@@ -31,7 +31,7 @@ data:
|
||||
releaseStage: generally_available
|
||||
releases:
|
||||
rolloutConfiguration:
|
||||
enableProgressiveRollout: false
|
||||
enableProgressiveRollout: true
|
||||
breakingChanges:
|
||||
4.0.0:
|
||||
message: Version 4.0.0 changes the cursors in most of the Stripe streams that support incremental sync mode. This is done to not only sync the data that was created since previous sync, but also the data that was modified. A schema refresh of all effected streams is required to use the new cursor format.
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
|
||||
[[package]]
|
||||
name = "airbyte-cdk"
|
||||
version = "6.42.1"
|
||||
version = "6.45.1"
|
||||
description = "A framework for writing Airbyte Connectors."
|
||||
optional = false
|
||||
python-versions = "<3.13,>=3.10"
|
||||
groups = ["main"]
|
||||
files = [
|
||||
{file = "airbyte_cdk-6.42.1-py3-none-any.whl", hash = "sha256:7a23fa4d3711173b7dbc1f20d94c8f10bb3fae3f164464be63cf60ad631782ab"},
|
||||
{file = "airbyte_cdk-6.42.1.tar.gz", hash = "sha256:c8fd4760cd68f8a93ea32bdafadd0d436f8274ee01ca316ab574f99433d4684b"},
|
||||
{file = "airbyte_cdk-6.45.1-py3-none-any.whl", hash = "sha256:bd79306da8b8c6c2e7100c407872845e734a82ad5814c0899ac1c33c7b292780"},
|
||||
{file = "airbyte_cdk-6.45.1.tar.gz", hash = "sha256:a9e5ea9c57080604716a9f1d148a8703688ce05bac68dd0a71a4ad8c38afd05d"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -572,14 +572,14 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "httpcore"
|
||||
version = "1.0.7"
|
||||
version = "1.0.8"
|
||||
description = "A minimal low-level HTTP client."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
groups = ["main"]
|
||||
files = [
|
||||
{file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
|
||||
{file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
|
||||
{file = "httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be"},
|
||||
{file = "httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
||||
@@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
|
||||
[tool.poetry]
|
||||
version = "5.9.2"
|
||||
version = "5.10.0-rc.1"
|
||||
name = "source-stripe"
|
||||
description = "Source implementation for Stripe."
|
||||
authors = [ "Airbyte <contact@airbyte.io>",]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 6.33.0
|
||||
version: 6.42.1
|
||||
|
||||
type: DeclarativeSource
|
||||
|
||||
@@ -8,11 +8,9 @@ check:
|
||||
- events
|
||||
|
||||
definitions:
|
||||
# base components
|
||||
# Base components
|
||||
base_stream:
|
||||
type: DeclarativeStream
|
||||
primary_key:
|
||||
- id
|
||||
retriever:
|
||||
$ref: "#/definitions/base_retriever"
|
||||
schema_loader:
|
||||
@@ -29,6 +27,7 @@ definitions:
|
||||
type: DpathExtractor
|
||||
field_path:
|
||||
- data
|
||||
transform_before_filtering: true
|
||||
schema_normalization: Default
|
||||
paginator:
|
||||
$ref: "#/definitions/base_paginator"
|
||||
@@ -42,7 +41,35 @@ definitions:
|
||||
request_headers:
|
||||
Stripe-Version: "2022-11-15"
|
||||
Stripe-Account: '{{ config.get("account_id") }}'
|
||||
|
||||
error_handler:
|
||||
type: CompositeErrorHandler
|
||||
error_handlers:
|
||||
- type: DefaultErrorHandler
|
||||
response_filters:
|
||||
- type: HttpResponseFilter
|
||||
action: IGNORE
|
||||
http_codes:
|
||||
- 403
|
||||
error_message: >-
|
||||
{{ response['error']['message'] }}
|
||||
- type: DefaultErrorHandler
|
||||
response_filters:
|
||||
- type: HttpResponseFilter
|
||||
action: IGNORE
|
||||
http_codes:
|
||||
- 400
|
||||
error_message: >-
|
||||
{{ response['error']['message'] }}
|
||||
- type: DefaultErrorHandler
|
||||
response_filters:
|
||||
- type: HttpResponseFilter
|
||||
action: IGNORE
|
||||
http_codes:
|
||||
- 404
|
||||
error_message: >-
|
||||
Data was not found. Error message: {{ response['error']['message'] }} If this is a path for getting
|
||||
child attributes like /v1/checkout/sessions/<session_id>/line_items when running the incremental sync,
|
||||
you may safely ignore this warning.
|
||||
bearer_authenticator:
|
||||
type: BearerAuthenticator
|
||||
api_token: "{{ config['client_secret'] }}"
|
||||
@@ -88,7 +115,7 @@ definitions:
|
||||
field_name: "created[lte]"
|
||||
inject_into: "request_parameter"
|
||||
|
||||
# created flow component
|
||||
# Regular flow components
|
||||
created_stream:
|
||||
$ref: "#/definitions/base_stream"
|
||||
incremental_sync:
|
||||
@@ -98,6 +125,143 @@ definitions:
|
||||
$ref: "#/definitions/base_incremental_sync"
|
||||
cursor_field: created
|
||||
|
||||
# Entity flow components
|
||||
entity_stream:
|
||||
$ref: "#/definitions/base_stream"
|
||||
primary_key:
|
||||
- id
|
||||
incremental_sync:
|
||||
$ref: "#/definitions/entity_with_slice_cursor"
|
||||
transformations:
|
||||
- type: AddFields
|
||||
fields:
|
||||
- path:
|
||||
- updated
|
||||
value: "{{ record.get('updated', record.get('created', now_utc().timestamp())) | int }}"
|
||||
value_type: integer
|
||||
|
||||
entity_restricted_stream:
|
||||
$ref: "#/definitions/base_stream"
|
||||
primary_key:
|
||||
- id
|
||||
incremental_sync:
|
||||
$ref: "#/definitions/entity_single_slice_cursor"
|
||||
transformations:
|
||||
- type: AddFields
|
||||
fields:
|
||||
- path:
|
||||
- updated
|
||||
value: "{{ record.get('updated', record.get('created', now_utc().timestamp())) | int }}"
|
||||
value_type: integer
|
||||
|
||||
entity_with_slice_cursor:
|
||||
type: DatetimeBasedCursor
|
||||
cursor_field: updated
|
||||
cursor_datetime_formats:
|
||||
- "%s"
|
||||
datetime_format: "%s"
|
||||
step: P{{ config.get('slice_range', 365) }}D
|
||||
cursor_granularity: PT1S
|
||||
lookback_window: P{{ config.get('lookback_window_days', 0) }}D
|
||||
start_datetime:
|
||||
type: MinMaxDatetime
|
||||
datetime: "{{ format_datetime(config.get('start_date', '2017-01-25T00:00:00Z'), '%Y-%m-%dT%H:%M:%S%z') }}"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%S%z"
|
||||
end_datetime:
|
||||
type: MinMaxDatetime
|
||||
datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%SZ"
|
||||
start_time_option:
|
||||
type: RequestOption
|
||||
field_name: "created[gte]"
|
||||
inject_into: "request_parameter"
|
||||
end_time_option:
|
||||
type: RequestOption
|
||||
field_name: "created[lte]"
|
||||
inject_into: "request_parameter"
|
||||
|
||||
entity_single_slice_cursor:
|
||||
type: DatetimeBasedCursor
|
||||
cursor_field: updated
|
||||
cursor_datetime_formats:
|
||||
- "%s"
|
||||
datetime_format: "%s"
|
||||
lookback_window: P{{ config.get('lookback_window_days', 0) }}D
|
||||
start_datetime:
|
||||
type: MinMaxDatetime
|
||||
datetime: "{{ format_datetime(config.get('start_date', '2017-01-25T00:00:00Z'), '%Y-%m-%dT%H:%M:%S%z') }}"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%S%z"
|
||||
end_datetime:
|
||||
type: MinMaxDatetime
|
||||
datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%SZ"
|
||||
|
||||
# Events flow components
|
||||
events_based_stream:
|
||||
$ref: "#/definitions/base_stream"
|
||||
primary_key:
|
||||
- id
|
||||
incremental_sync:
|
||||
$ref: "#/definitions/events_read_slice_cursor"
|
||||
retriever:
|
||||
$ref: "#/definitions/events_objects_retriever"
|
||||
transformations:
|
||||
- type: AddFields
|
||||
fields:
|
||||
- path:
|
||||
- data
|
||||
- object
|
||||
- is_deleted
|
||||
value: "{{ True }}"
|
||||
condition: "{{ record.get('data', {}).get('object', False) and record.get('type', '').endswith('.deleted') }}"
|
||||
- type: AddFields
|
||||
fields:
|
||||
- path:
|
||||
- data
|
||||
- object
|
||||
- updated
|
||||
value: "{{ record.get('updated', record.get('created', now_utc().timestamp())) | int }}"
|
||||
value_type: integer
|
||||
condition: "{{ record.get('data', {}).get('object', False) }}"
|
||||
- type: DpathFlattenFields
|
||||
field_path:
|
||||
- data
|
||||
- object
|
||||
replace_record: true
|
||||
|
||||
events_objects_retriever:
|
||||
$ref: "#/definitions/base_retriever"
|
||||
requester:
|
||||
$ref: "#/definitions/base_requester"
|
||||
path: events
|
||||
|
||||
events_read_slice_cursor:
|
||||
type: DatetimeBasedCursor
|
||||
cursor_field: updated
|
||||
cursor_datetime_formats:
|
||||
- "%s"
|
||||
datetime_format: "%s"
|
||||
step: P{{ config.get('slice_range', 365) }}D
|
||||
cursor_granularity: PT1S
|
||||
lookback_window: P{{ config.get('lookback_window_days', 0) }}D
|
||||
start_datetime:
|
||||
type: MinMaxDatetime
|
||||
datetime: "{{ format_datetime(config.get('start_date', '2017-01-25T00:00:00Z'), '%Y-%m-%dT%H:%M:%S%z') }}"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%S%z"
|
||||
min_datetime: "{{ (now_utc() - duration('P30D')).strftime('%Y-%m-%dT%H:%M:%SZ') }}"
|
||||
end_datetime:
|
||||
type: MinMaxDatetime
|
||||
datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}"
|
||||
datetime_format: "%Y-%m-%dT%H:%M:%SZ"
|
||||
start_time_option:
|
||||
type: RequestOption
|
||||
field_name: "created[gte]"
|
||||
inject_into: "request_parameter"
|
||||
end_time_option:
|
||||
type: RequestOption
|
||||
field_name: "created[lte]"
|
||||
inject_into: "request_parameter"
|
||||
|
||||
streams:
|
||||
events:
|
||||
$ref: "#/definitions/created_stream"
|
||||
@@ -125,13 +289,167 @@ definitions:
|
||||
path: file_links
|
||||
name: file_links
|
||||
|
||||
authorizations:
|
||||
type: StateDelegatingStream
|
||||
$parameters:
|
||||
name: authorizations
|
||||
full_refresh_stream:
|
||||
$ref: "#/definitions/entity_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/base_retriever"
|
||||
$parameters:
|
||||
path: issuing/authorizations
|
||||
incremental_stream:
|
||||
$ref: "#/definitions/events_based_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/events_objects_retriever"
|
||||
$parameters:
|
||||
request_parameters:
|
||||
types[]: '{{["issuing_authorization.created", "issuing_authorization.request", "issuing_authorization.updated"]}}'
|
||||
|
||||
cardholders:
|
||||
type: StateDelegatingStream
|
||||
$parameters:
|
||||
name: cardholders
|
||||
full_refresh_stream:
|
||||
$ref: "#/definitions/entity_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/base_retriever"
|
||||
$parameters:
|
||||
path: issuing/cardholders
|
||||
incremental_stream:
|
||||
$ref: "#/definitions/events_based_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/events_objects_retriever"
|
||||
$parameters:
|
||||
request_parameters:
|
||||
types[]: '{{["issuing_cardholder.created", "issuing_cardholder.updated"]}}'
|
||||
|
||||
application_fees:
|
||||
type: StateDelegatingStream
|
||||
$parameters:
|
||||
name: application_fees
|
||||
full_refresh_stream:
|
||||
$ref: "#/definitions/entity_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/base_retriever"
|
||||
$parameters:
|
||||
path: application_fees
|
||||
incremental_stream:
|
||||
$ref: "#/definitions/events_based_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/events_objects_retriever"
|
||||
$parameters:
|
||||
request_parameters:
|
||||
types[]: '{{["application_fee.created", "application_fee.refunded"]}}'
|
||||
|
||||
cards:
|
||||
type: StateDelegatingStream
|
||||
$parameters:
|
||||
name: cards
|
||||
full_refresh_stream:
|
||||
$ref: "#/definitions/entity_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/base_retriever"
|
||||
$parameters:
|
||||
path: issuing/cards
|
||||
incremental_stream:
|
||||
$ref: "#/definitions/events_based_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/events_objects_retriever"
|
||||
$parameters:
|
||||
request_parameters:
|
||||
types[]: '{{["issuing_card.created", "issuing_card.updated"]}}'
|
||||
|
||||
external_account_cards:
|
||||
type: StateDelegatingStream
|
||||
$parameters:
|
||||
name: external_account_cards
|
||||
full_refresh_stream:
|
||||
$ref: "#/definitions/entity_restricted_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/base_retriever"
|
||||
$parameters:
|
||||
path: accounts/{{ config["account_id"] }}/external_accounts
|
||||
requester:
|
||||
$ref: "#/definitions/base_requester"
|
||||
request_parameters:
|
||||
object: "card"
|
||||
incremental_stream:
|
||||
$ref: "#/definitions/events_based_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/events_objects_retriever"
|
||||
$parameters:
|
||||
request_parameters:
|
||||
types[]: '{{["account.external_account.created", "account.external_account.updated", "account.external_account.deleted"]}}'
|
||||
record_filter:
|
||||
condition: "{{ record['object'] == 'card' }}"
|
||||
|
||||
external_account_bank_accounts:
|
||||
type: StateDelegatingStream
|
||||
$parameters:
|
||||
name: external_account_bank_accounts
|
||||
full_refresh_stream:
|
||||
$ref: "#/definitions/entity_restricted_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/base_retriever"
|
||||
$parameters:
|
||||
path: accounts/{{ config["account_id"] }}/external_accounts
|
||||
requester:
|
||||
$ref: "#/definitions/base_requester"
|
||||
request_parameters:
|
||||
object: "bank_account"
|
||||
incremental_stream:
|
||||
$ref: "#/definitions/events_based_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/events_objects_retriever"
|
||||
$parameters:
|
||||
request_parameters:
|
||||
types[]: '{{["account.external_account.created", "account.external_account.updated", "account.external_account.deleted"]}}'
|
||||
record_filter:
|
||||
condition: "{{ record['object'] == 'bank_account' }}"
|
||||
|
||||
early_fraud_warnings:
|
||||
type: StateDelegatingStream
|
||||
$parameters:
|
||||
name: early_fraud_warnings
|
||||
full_refresh_stream:
|
||||
$ref: "#/definitions/entity_restricted_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/base_retriever"
|
||||
$parameters:
|
||||
path: radar/early_fraud_warnings
|
||||
incremental_stream:
|
||||
$ref: "#/definitions/events_based_stream"
|
||||
retriever:
|
||||
$ref: "#/definitions/events_objects_retriever"
|
||||
$parameters:
|
||||
request_parameters:
|
||||
types[]: '{{["radar.early_fraud_warning.created", "radar.early_fraud_warning.updated"]}}'
|
||||
|
||||
streams:
|
||||
# These streams are base incremental streams
|
||||
- $ref: "#/definitions/streams/events"
|
||||
- $ref: "#/definitions/streams/shipping_rates"
|
||||
- $ref: "#/definitions/streams/balance_transactions"
|
||||
- $ref: "#/definitions/streams/files"
|
||||
- $ref: "#/definitions/streams/file_links"
|
||||
|
||||
## These streams are state condition streams and have two behaviors depending on whether the state is set:
|
||||
# - No State: Runs the base stream.
|
||||
# - State: Uses the event stream to call events related to streams (event types provided by params).
|
||||
- $ref: "#/definitions/streams/application_fees"
|
||||
- $ref: "#/definitions/streams/authorizations"
|
||||
- $ref: "#/definitions/streams/cardholders"
|
||||
- $ref: "#/definitions/streams/cards"
|
||||
|
||||
## These streams are state condition streams with stricter behavior:
|
||||
# - No State: Runs the base stream (endpoints strictly define allowed query params and return an error if unexpected params are present).
|
||||
# - State: Uses the event stream to call events related to streams (event types provided by params).
|
||||
- $ref: "#/definitions/streams/early_fraud_warnings"
|
||||
- $ref: "#/definitions/streams/external_account_bank_accounts"
|
||||
- $ref: "#/definitions/streams/external_account_cards"
|
||||
|
||||
spec:
|
||||
type: Spec
|
||||
documentation_url: https://docs.airbyte.com/integrations/sources/stripe
|
||||
|
||||
@@ -284,24 +284,6 @@ class SourceStripe(YamlDeclarativeSource):
|
||||
|
||||
streams = [
|
||||
checkout_sessions,
|
||||
UpdatedCursorIncrementalStripeStream(
|
||||
name="external_account_cards",
|
||||
path=lambda self, *args, **kwargs: f"accounts/{self.account_id}/external_accounts",
|
||||
event_types=["account.external_account.created", "account.external_account.updated", "account.external_account.deleted"],
|
||||
legacy_cursor_field=None,
|
||||
extra_request_params={"object": "card"},
|
||||
response_filter=lambda record: record["object"] == "card",
|
||||
**args,
|
||||
),
|
||||
UpdatedCursorIncrementalStripeStream(
|
||||
name="external_account_bank_accounts",
|
||||
path=lambda self, *args, **kwargs: f"accounts/{self.account_id}/external_accounts",
|
||||
event_types=["account.external_account.created", "account.external_account.updated", "account.external_account.deleted"],
|
||||
legacy_cursor_field=None,
|
||||
extra_request_params={"object": "bank_account"},
|
||||
response_filter=lambda record: record["object"] == "bank_account",
|
||||
**args,
|
||||
),
|
||||
UpdatedCursorIncrementalStripeSubStream(
|
||||
name="persons",
|
||||
path=lambda self, stream_slice, *args, **kwargs: f"accounts/{stream_slice['parent']['id']}/persons",
|
||||
@@ -340,25 +322,7 @@ class SourceStripe(YamlDeclarativeSource):
|
||||
event_types=["credit_note.created", "credit_note.updated", "credit_note.voided"],
|
||||
**args,
|
||||
),
|
||||
UpdatedCursorIncrementalStripeStream(
|
||||
name="early_fraud_warnings",
|
||||
path="radar/early_fraud_warnings",
|
||||
event_types=["radar.early_fraud_warning.created", "radar.early_fraud_warning.updated"],
|
||||
**args,
|
||||
),
|
||||
IncrementalStripeStream(
|
||||
name="authorizations",
|
||||
path="issuing/authorizations",
|
||||
event_types=["issuing_authorization.created", "issuing_authorization.request", "issuing_authorization.updated"],
|
||||
**args,
|
||||
),
|
||||
self.customers(**args),
|
||||
IncrementalStripeStream(
|
||||
name="cardholders",
|
||||
path="issuing/cardholders",
|
||||
event_types=["issuing_cardholder.created", "issuing_cardholder.updated"],
|
||||
**args,
|
||||
),
|
||||
IncrementalStripeStream(
|
||||
name="charges",
|
||||
path="charges",
|
||||
@@ -390,7 +354,6 @@ class SourceStripe(YamlDeclarativeSource):
|
||||
],
|
||||
**args,
|
||||
),
|
||||
application_fees,
|
||||
invoices,
|
||||
IncrementalStripeStream(
|
||||
name="invoice_items",
|
||||
@@ -478,9 +441,6 @@ class SourceStripe(YamlDeclarativeSource):
|
||||
],
|
||||
**args,
|
||||
),
|
||||
IncrementalStripeStream(
|
||||
name="cards", path="issuing/cards", event_types=["issuing_card.created", "issuing_card.updated"], **args
|
||||
),
|
||||
IncrementalStripeStream(
|
||||
name="transactions",
|
||||
path="issuing/transactions",
|
||||
|
||||
@@ -25,22 +25,3 @@ def assert_stream_did_not_run(output, stream_name: str, expected_error_message_p
|
||||
# Use any to check if any message contains the substring
|
||||
found = any(contains_substring(message, expected_error_message_pattern) for message in output.logs)
|
||||
assert found, f"Expected message '{expected_error_message_pattern}' not found in logs."
|
||||
|
||||
|
||||
def assert_stream_incomplete(output, stream_name: str, expected_error_message_pattern: Optional[str] = None):
|
||||
expected = [
|
||||
AirbyteStreamStatus.STARTED,
|
||||
AirbyteStreamStatus.INCOMPLETE,
|
||||
]
|
||||
|
||||
assert output.get_stream_statuses(stream_name) == expected
|
||||
assert output.records == []
|
||||
|
||||
if expected_error_message_pattern:
|
||||
|
||||
def contains_substring(message, expected_message_pattern):
|
||||
return expected_message_pattern in message.log.message
|
||||
|
||||
# Use any to check if any message contains the substring
|
||||
found = any(contains_substring(message, expected_error_message_pattern) for message in output.logs)
|
||||
assert found, f"Expected message '{expected_error_message_pattern}' not found in logs."
|
||||
|
||||
@@ -166,13 +166,13 @@ class FullRefreshTest(TestCase):
|
||||
slice_datetime = start_date + slice_range
|
||||
|
||||
http_mocker.get(
|
||||
_application_fees_request().with_created_gte(start_date).with_created_lte(slice_datetime).with_limit(100).build(),
|
||||
_application_fees_request().with_created_gte(slice_datetime).with_created_lte(_NOW).with_limit(100).build(),
|
||||
_application_fees_response().build(),
|
||||
)
|
||||
http_mocker.get(
|
||||
_application_fees_request()
|
||||
.with_created_gte(slice_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_created_gte(start_date)
|
||||
.with_created_lte(slice_datetime - _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_limit(100)
|
||||
.build(),
|
||||
_application_fees_response().build(),
|
||||
@@ -180,10 +180,8 @@ class FullRefreshTest(TestCase):
|
||||
|
||||
self._read(_config().with_start_date(start_date).with_slice_range_in_days(slice_range.days))
|
||||
|
||||
# request matched http_mocker
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_http_status_400_when_read_then_stream_did_not_run(self, http_mocker: HttpMocker) -> None:
|
||||
def test_given_http_status_400_when_read_then_stream_incomplete(self, http_mocker: HttpMocker) -> None:
|
||||
http_mocker.get(
|
||||
_application_fees_request().with_any_query_params().build(),
|
||||
a_response_with_status(400),
|
||||
@@ -250,21 +248,16 @@ class IncrementalTest(TestCase):
|
||||
output = self._read(_config().with_start_date(_A_START_DATE), _NO_STATE)
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_when_read_then_query_events_using_types_and_state_value_plus_1(self, http_mocker: HttpMocker) -> None:
|
||||
start_date = _NOW - timedelta(days=40)
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
cursor_value = int(state_datetime.timestamp()) + 1
|
||||
cursor_value = int(state_datetime.timestamp())
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_record(_an_event().with_cursor(cursor_value).with_field(_DATA_FIELD, _an_application_fee().build()))
|
||||
.build(),
|
||||
@@ -277,18 +270,13 @@ class IncrementalTest(TestCase):
|
||||
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_and_pagination_when_read_then_return_records(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_pagination()
|
||||
.with_record(_an_event().with_id("last_record_id_from_first_page").with_field(_DATA_FIELD, _an_application_fee().build()))
|
||||
@@ -297,7 +285,7 @@ class IncrementalTest(TestCase):
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_starting_after("last_record_id_from_first_page")
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
@@ -316,24 +304,19 @@ class IncrementalTest(TestCase):
|
||||
def test_given_state_and_small_slice_range_when_read_then_perform_multiple_queries(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
slice_range = timedelta(days=3)
|
||||
slice_datetime = state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES + slice_range
|
||||
slice_datetime = state_datetime + slice_range
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(slice_datetime)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(slice_datetime - _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_response().with_record(self._an_application_fee_event()).build(),
|
||||
)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(slice_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(slice_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response().with_record(self._an_application_fee_event()).with_record(self._an_application_fee_event()).build(),
|
||||
)
|
||||
|
||||
|
||||
@@ -164,15 +164,15 @@ class FullRefreshTest(TestCase):
|
||||
slice_datetime = start_date + slice_range
|
||||
|
||||
http_mocker.get(
|
||||
_authorizations_request().with_created_gte(start_date).with_created_lte(slice_datetime).with_limit(100).build(),
|
||||
_authorizations_request()
|
||||
.with_created_gte(start_date)
|
||||
.with_created_lte(slice_datetime - _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_limit(100)
|
||||
.build(),
|
||||
_authorizations_response().build(),
|
||||
)
|
||||
http_mocker.get(
|
||||
_authorizations_request()
|
||||
.with_created_gte(slice_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.build(),
|
||||
_authorizations_request().with_created_gte(slice_datetime).with_created_lte(_NOW).with_limit(100).build(),
|
||||
_authorizations_response().build(),
|
||||
)
|
||||
|
||||
@@ -245,7 +245,7 @@ class IncrementalTest(TestCase):
|
||||
output = self._read(_config().with_start_date(_A_START_DATE), _NO_STATE)
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_when_read_then_query_events_using_types_and_state_value_plus_1(self, http_mocker: HttpMocker) -> None:
|
||||
@@ -254,12 +254,7 @@ class IncrementalTest(TestCase):
|
||||
cursor_value = int(state_datetime.timestamp()) + 1
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_record(_an_event().with_cursor(cursor_value).with_field(_DATA_FIELD, _an_authorization().build()))
|
||||
.build(),
|
||||
@@ -272,18 +267,13 @@ class IncrementalTest(TestCase):
|
||||
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_and_pagination_when_read_then_return_records(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_pagination()
|
||||
.with_record(_an_event().with_id("last_record_id_from_first_page").with_field(_DATA_FIELD, _an_authorization().build()))
|
||||
@@ -292,7 +282,7 @@ class IncrementalTest(TestCase):
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_starting_after("last_record_id_from_first_page")
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
@@ -311,24 +301,19 @@ class IncrementalTest(TestCase):
|
||||
def test_given_state_and_small_slice_range_when_read_then_perform_multiple_queries(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
slice_range = timedelta(days=3)
|
||||
slice_datetime = state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES + slice_range
|
||||
slice_datetime = state_datetime + slice_range
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(slice_datetime)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(slice_datetime - _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_response().with_record(self._an_authorization_event()).build(),
|
||||
)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(slice_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(slice_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response().with_record(self._an_authorization_event()).with_record(self._an_authorization_event()).build(),
|
||||
)
|
||||
|
||||
|
||||
@@ -164,15 +164,15 @@ class FullRefreshTest(TestCase):
|
||||
slice_datetime = start_date + slice_range
|
||||
|
||||
http_mocker.get(
|
||||
_cards_request().with_created_gte(start_date).with_created_lte(slice_datetime).with_limit(100).build(),
|
||||
_cards_request()
|
||||
.with_created_gte(start_date)
|
||||
.with_created_lte(slice_datetime - _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_limit(100)
|
||||
.build(),
|
||||
_cards_response().build(),
|
||||
)
|
||||
http_mocker.get(
|
||||
_cards_request()
|
||||
.with_created_gte(slice_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.build(),
|
||||
_cards_request().with_created_gte(slice_datetime).with_created_lte(_NOW).with_limit(100).build(),
|
||||
_cards_response().build(),
|
||||
)
|
||||
|
||||
@@ -189,6 +189,7 @@ class FullRefreshTest(TestCase):
|
||||
output = self._read(_config())
|
||||
assert_stream_did_not_run(output, _STREAM_NAME, "Your account is not set up to use Issuing")
|
||||
|
||||
@HttpMocker()
|
||||
@HttpMocker()
|
||||
def test_given_http_status_401_when_read_then_config_error(self, http_mocker: HttpMocker) -> None:
|
||||
http_mocker.get(
|
||||
@@ -245,7 +246,7 @@ class IncrementalTest(TestCase):
|
||||
output = self._read(_config().with_start_date(_A_START_DATE), _NO_STATE)
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_when_read_then_query_events_using_types_and_state_value_plus_1(self, http_mocker: HttpMocker) -> None:
|
||||
@@ -254,12 +255,7 @@ class IncrementalTest(TestCase):
|
||||
cursor_value = int(state_datetime.timestamp()) + 1
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response().with_record(_an_event().with_cursor(cursor_value).with_field(_DATA_FIELD, _a_card().build())).build(),
|
||||
)
|
||||
|
||||
@@ -270,18 +266,13 @@ class IncrementalTest(TestCase):
|
||||
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_and_pagination_when_read_then_return_records(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_pagination()
|
||||
.with_record(_an_event().with_id("last_record_id_from_first_page").with_field(_DATA_FIELD, _a_card().build()))
|
||||
@@ -290,7 +281,7 @@ class IncrementalTest(TestCase):
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_starting_after("last_record_id_from_first_page")
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
@@ -309,24 +300,19 @@ class IncrementalTest(TestCase):
|
||||
def test_given_state_and_small_slice_range_when_read_then_perform_multiple_queries(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
slice_range = timedelta(days=3)
|
||||
slice_datetime = state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES + slice_range
|
||||
slice_datetime = state_datetime + slice_range
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(slice_datetime)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(slice_datetime - _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_response().with_record(self._a_card_event()).build(),
|
||||
)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(slice_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(slice_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response().with_record(self._a_card_event()).with_record(self._a_card_event()).build(),
|
||||
)
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#
|
||||
# Copyright (c) 2025 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
@@ -209,7 +208,7 @@ class IncrementalTest(TestCase):
|
||||
output = self._read(_config().with_start_date(_A_START_DATE), _NO_STATE)
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_when_read_then_query_events_using_types_and_state_value_plus_1(self, http_mocker: HttpMocker) -> None:
|
||||
@@ -218,12 +217,7 @@ class IncrementalTest(TestCase):
|
||||
cursor_value = int(state_datetime.timestamp()) + 1
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_record(_an_event().with_cursor(cursor_value).with_field(_DATA_FIELD, _an_early_fraud_warning().build()))
|
||||
.build(),
|
||||
@@ -236,18 +230,13 @@ class IncrementalTest(TestCase):
|
||||
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_and_pagination_when_read_then_return_records(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_pagination()
|
||||
.with_record(_an_event().with_id("last_record_id_from_first_page").with_field(_DATA_FIELD, _an_early_fraud_warning().build()))
|
||||
@@ -256,7 +245,7 @@ class IncrementalTest(TestCase):
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_starting_after("last_record_id_from_first_page")
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
@@ -275,24 +264,19 @@ class IncrementalTest(TestCase):
|
||||
def test_given_state_and_small_slice_range_when_read_then_perform_multiple_queries(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
slice_range = timedelta(days=3)
|
||||
slice_datetime = state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES + slice_range
|
||||
slice_datetime = state_datetime + slice_range
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(slice_datetime)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(slice_datetime - _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_response().with_record(self._an_early_fraud_warning_event()).build(),
|
||||
)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(slice_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(slice_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response().with_record(self._an_early_fraud_warning_event()).with_record(self._an_early_fraud_warning_event()).build(),
|
||||
)
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ from airbyte_cdk.test.mock_http.response_builder import (
|
||||
)
|
||||
from airbyte_cdk.test.state_builder import StateBuilder
|
||||
from integration.config import ConfigBuilder
|
||||
from integration.helpers import assert_stream_incomplete
|
||||
from integration.helpers import assert_stream_did_not_run
|
||||
from integration.pagination import StripePaginationStrategy
|
||||
from integration.request_builder import StripeRequestBuilder
|
||||
from integration.response_builder import a_response_with_status
|
||||
@@ -184,7 +184,7 @@ class FullRefreshTest(TestCase):
|
||||
a_response_with_status(400),
|
||||
)
|
||||
output = self._read(_config())
|
||||
assert_stream_incomplete(output, _STREAM_NAME, "Your account is not set up to use Issuing")
|
||||
assert_stream_did_not_run(output, _STREAM_NAME, "Your account is not set up to use Issuing")
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_http_status_401_when_read_then_stream_is_incomplete(self, http_mocker: HttpMocker) -> None:
|
||||
|
||||
@@ -208,7 +208,7 @@ class IncrementalTest(TestCase):
|
||||
output = self._read(_config().with_start_date(_A_START_DATE), _NO_STATE)
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=int(_NOW.timestamp()))
|
||||
assert int(most_recent_state.stream_state.updated) == int(_NOW.timestamp())
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_when_read_then_query_events_using_types_and_state_value_plus_1(self, http_mocker: HttpMocker) -> None:
|
||||
@@ -217,12 +217,7 @@ class IncrementalTest(TestCase):
|
||||
cursor_value = int(state_datetime.timestamp()) + 1
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_record(_an_event().with_cursor(cursor_value).with_field(_DATA_FIELD, _an_external_bank_account().build()))
|
||||
.build(),
|
||||
@@ -235,7 +230,7 @@ class IncrementalTest(TestCase):
|
||||
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_object_is_not_back_account_when_read_then_filter_out(self, http_mocker: HttpMocker) -> None:
|
||||
@@ -258,12 +253,7 @@ class IncrementalTest(TestCase):
|
||||
def test_given_state_and_pagination_when_read_then_return_records(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_pagination()
|
||||
.with_record(_an_event().with_id("last_record_id_from_first_page").with_field(_DATA_FIELD, _an_external_bank_account().build()))
|
||||
@@ -272,7 +262,7 @@ class IncrementalTest(TestCase):
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_starting_after("last_record_id_from_first_page")
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
@@ -291,24 +281,19 @@ class IncrementalTest(TestCase):
|
||||
def test_given_state_and_small_slice_range_when_read_then_perform_multiple_queries(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
slice_range = timedelta(days=3)
|
||||
slice_datetime = state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES + slice_range
|
||||
slice_datetime = state_datetime + slice_range
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(slice_datetime)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(slice_datetime - _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_response().with_record(self._an_external_account_event()).build(),
|
||||
)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(slice_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(slice_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response().with_record(self._an_external_account_event()).with_record(self._an_external_account_event()).build(),
|
||||
)
|
||||
|
||||
|
||||
@@ -146,7 +146,6 @@ class FullRefreshTest(TestCase):
|
||||
)
|
||||
|
||||
output = self._read(_config().with_start_date(_A_START_DATE).with_lookback_window_in_days(10))
|
||||
|
||||
assert output.records[0].record.data["updated"] == int(_NOW.timestamp())
|
||||
|
||||
@HttpMocker()
|
||||
@@ -213,7 +212,7 @@ class IncrementalTest(TestCase):
|
||||
output = self._read(_config().with_start_date(_A_START_DATE), _NO_STATE)
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=int(_NOW.timestamp()))
|
||||
assert int(most_recent_state.stream_state.updated) == int(_NOW.timestamp())
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_state_when_read_then_query_events_using_types_and_state_value_plus_1(self, http_mocker: HttpMocker) -> None:
|
||||
@@ -222,12 +221,7 @@ class IncrementalTest(TestCase):
|
||||
cursor_value = int(state_datetime.timestamp()) + 1
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_record(_an_event().with_cursor(cursor_value).with_field(_DATA_FIELD, _an_external_account_card().build()))
|
||||
.build(),
|
||||
@@ -240,7 +234,7 @@ class IncrementalTest(TestCase):
|
||||
|
||||
most_recent_state = output.most_recent_state
|
||||
assert most_recent_state.stream_descriptor == StreamDescriptor(name=_STREAM_NAME)
|
||||
assert most_recent_state.stream_state == AirbyteStateBlob(updated=cursor_value)
|
||||
assert most_recent_state.stream_state.updated == str(cursor_value)
|
||||
|
||||
@HttpMocker()
|
||||
def test_given_object_is_not_back_account_when_read_then_filter_out(self, http_mocker: HttpMocker) -> None:
|
||||
@@ -263,12 +257,7 @@ class IncrementalTest(TestCase):
|
||||
def test_given_state_and_pagination_when_read_then_return_records(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(state_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response()
|
||||
.with_pagination()
|
||||
.with_record(_an_event().with_id("last_record_id_from_first_page").with_field(_DATA_FIELD, _an_external_account_card().build()))
|
||||
@@ -277,7 +266,7 @@ class IncrementalTest(TestCase):
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_starting_after("last_record_id_from_first_page")
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
@@ -296,24 +285,19 @@ class IncrementalTest(TestCase):
|
||||
def test_given_state_and_small_slice_range_when_read_then_perform_multiple_queries(self, http_mocker: HttpMocker) -> None:
|
||||
state_datetime = _NOW - timedelta(days=5)
|
||||
slice_range = timedelta(days=3)
|
||||
slice_datetime = state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES + slice_range
|
||||
slice_datetime = state_datetime + slice_range
|
||||
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(state_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(slice_datetime)
|
||||
.with_created_gte(state_datetime)
|
||||
.with_created_lte(slice_datetime - _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_response().with_record(self._an_external_account_event()).build(),
|
||||
)
|
||||
http_mocker.get(
|
||||
_events_request()
|
||||
.with_created_gte(slice_datetime + _AVOIDING_INCLUSIVE_BOUNDARIES)
|
||||
.with_created_lte(_NOW)
|
||||
.with_limit(100)
|
||||
.with_types(_EVENT_TYPES)
|
||||
.build(),
|
||||
_events_request().with_created_gte(slice_datetime).with_created_lte(_NOW).with_limit(100).with_types(_EVENT_TYPES).build(),
|
||||
_events_response().with_record(self._an_external_account_event()).with_record(self._an_external_account_event()).build(),
|
||||
)
|
||||
|
||||
|
||||
@@ -244,154 +244,155 @@ Each record is marked with `is_deleted` flag when the appropriate event happens
|
||||
<details>
|
||||
<summary>Expand to review</summary>
|
||||
|
||||
| Version | Date | Pull Request | Subject |
|
||||
|:-----------|:-----------|:----------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 5.9.2 | 2025-04-15 | [58072](https://github.com/airbytehq/airbyte/pull/58072) | Add safe state data type handling |
|
||||
| 5.9.1 | 2025-04-15 | [58068](https://github.com/airbytehq/airbyte/pull/58068) | Add documentation url back in spec |
|
||||
| 5.9.0 | 2025-04-14 | [58065](https://github.com/airbytehq/airbyte/pull/58065) | Promoting release candidate 5.9.0-rc.1 to a main version. |
|
||||
| 5.9.0-rc.1 | 2025-03-04 | [54162](https://github.com/airbytehq/airbyte/pull/54162) | Migrate events, shipping_rates, balance_transactions, files and file_links to low-code |
|
||||
| 5.8.14 | 2025-03-29 | [56871](https://github.com/airbytehq/airbyte/pull/56871) | Update dependencies |
|
||||
| 5.8.13 | 2025-03-22 | [56276](https://github.com/airbytehq/airbyte/pull/56276) | Update dependencies |
|
||||
| 5.8.12 | 2025-03-10 | [55682](https://github.com/airbytehq/airbyte/pull/55682) | Promoting release candidate 5.8.10-rc.1 to a main version. |
|
||||
| 5.8.11 | 2025-03-08 | [55598](https://github.com/airbytehq/airbyte/pull/55598) | Update dependencies |
|
||||
| 5.8.10-rc1 | 2025-02-22 | [53670](https://github.com/airbytehq/airbyte/pull/53670) | Update pritbuffer logic |
|
||||
| 5.8.9 | 2025-03-01 | [55117](https://github.com/airbytehq/airbyte/pull/55117) | Update dependencies |
|
||||
| 5.8.8 | 2025-02-28 | [54711](https://github.com/airbytehq/airbyte/pull/54711) | Add retry error handler for `requests.exceptions.InvalidURL' |
|
||||
| 5.8.7 | 2025-02-22 | [54468](https://github.com/airbytehq/airbyte/pull/54468) | Update dependencies |
|
||||
| 5.8.6 | 2025-02-15 | [54067](https://github.com/airbytehq/airbyte/pull/54067) | Update dependencies |
|
||||
| 5.8.5 | 2025-02-08 | [52018](https://github.com/airbytehq/airbyte/pull/52018) | Update dependencies |
|
||||
| 5.8.4 | 2025-02-03 | [49940](https://github.com/airbytehq/airbyte/pull/49940) | Update CDK version |
|
||||
| 5.8.3 | 2025-01-11 | [46832](https://github.com/airbytehq/airbyte/pull/46832) | Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64 |
|
||||
| 5.8.2 | 2024-12-10 | [46499](https://github.com/airbytehq/airbyte/pull/46499) | Source-Stripe: Refactor Customer Balance Transactions |
|
||||
| 5.8.1 | 2024-12-08 | [46499](https://github.com/airbytehq/airbyte/pull/46499) | Source-Stripe: Add new payout_balance_transactions incremental stream |
|
||||
| 5.8.0 | 2024-10-12 | [46864](https://github.com/airbytehq/airbyte/pull/46864) | Add incremental stream support to `accounts` stream |
|
||||
| 5.7.0 | 2024-10-01 | [45860](https://github.com/airbytehq/airbyte/pull/45860) | Add incremental stream support to `invoice_line_items` and `subscription_items` streams |
|
||||
| 5.6.2 | 2024-10-05 | [43881](https://github.com/airbytehq/airbyte/pull/43881) | Update dependencies |
|
||||
| 5.6.1 | 2024-10-03 | [46327](https://github.com/airbytehq/airbyte/pull/46327) | Bump the cdk to 5.10.2 to stop using PrintBuffer optimization due to record count mismatches |
|
||||
| 5.6.0 | 2024-09-10 | [44891](https://github.com/airbytehq/airbyte/pull/44891) | Update `Payment Methods` stream |
|
||||
| 5.5.4 | 2024-09-09 | [45348](https://github.com/airbytehq/airbyte/pull/45348) | Remove `stripe` python package |
|
||||
| 5.5.3 | 2024-09-03 | [45101](https://github.com/airbytehq/airbyte/pull/45101) | Fix regression following pagination issue fix |
|
||||
| 5.5.2 | 2024-08-28 | [44862](https://github.com/airbytehq/airbyte/pull/44862) | Fix RFR pagination issue |
|
||||
| 5.5.1 | 2024-08-10 | [43105](https://github.com/airbytehq/airbyte/pull/43105) | Update dependencies |
|
||||
| 5.5.0 | 2024-08-08 | [43302](https://github.com/airbytehq/airbyte/pull/43302) | Fix problem with state not updating and upgrade cdk 4 |
|
||||
| 5.4.12 | 2024-07-31 | [41985](https://github.com/airbytehq/airbyte/pull/41985) | Expand Invoice discounts and tax rates |
|
||||
| 5.4.11 | 2024-07-27 | [42623](https://github.com/airbytehq/airbyte/pull/42623) | Update dependencies |
|
||||
| 5.4.10 | 2024-07-20 | [42305](https://github.com/airbytehq/airbyte/pull/42305) | Update dependencies |
|
||||
| 5.4.9 | 2024-07-13 | [41760](https://github.com/airbytehq/airbyte/pull/41760) | Update dependencies |
|
||||
| 5.4.8 | 2024-07-10 | [41477](https://github.com/airbytehq/airbyte/pull/41477) | Update dependencies |
|
||||
| 5.4.7 | 2024-07-09 | [40869](https://github.com/airbytehq/airbyte/pull/40869) | Update dependencies |
|
||||
| 5.4.6 | 2024-07-08 | [41044](https://github.com/airbytehq/airbyte/pull/41044) | Use latest `CDK` version possible |
|
||||
| 5.4.5 | 2024-06-25 | [40404](https://github.com/airbytehq/airbyte/pull/40404) | Update dependencies |
|
||||
| 5.4.4 | 2024-06-22 | [40040](https://github.com/airbytehq/airbyte/pull/40040) | Update dependencies |
|
||||
| 5.4.3 | 2024-06-06 | [39284](https://github.com/airbytehq/airbyte/pull/39284) | [autopull] Upgrade base image to v1.2.2 |
|
||||
| 5.4.2 | 2024-06-11 | [39412](https://github.com/airbytehq/airbyte/pull/39412) | Removed `invoice.upcomming` event type from (incremental sync) for `Invoices` stream |
|
||||
| 5.4.1 | 2024-06-11 | [39393](https://github.com/airbytehq/airbyte/pull/39393) | Added missing `event types` (incremental sync) for `Invoices` stream |
|
||||
| 5.4.0 | 2024-06-05 | [39138](https://github.com/airbytehq/airbyte/pull/39138) | Fixed the `Refunds` stream missing data for the `incremental` sync |
|
||||
| 5.3.9 | 2024-05-22 | [38550](https://github.com/airbytehq/airbyte/pull/38550) | Update authenticator package |
|
||||
| 5.3.8 | 2024-05-15 | [38248](https://github.com/airbytehq/airbyte/pull/38248) | Replace AirbyteLogger with logging.Logger |
|
||||
| 5.3.7 | 2024-04-24 | [36663](https://github.com/airbytehq/airbyte/pull/36663) | Schema descriptions |
|
||||
| 5.3.6 | 2024-04-18 | [37448](https://github.com/airbytehq/airbyte/pull/37448) | Ensure AirbyteTracedException in concurrent CDK are emitted with the right type |
|
||||
| 5.3.5 | 2024-04-18 | [37418](https://github.com/airbytehq/airbyte/pull/37418) | Ensure python return code != 0 in case of error |
|
||||
| 5.3.4 | 2024-04-11 | [37406](https://github.com/airbytehq/airbyte/pull/37406) | Update CDK version to have partitioned state fix |
|
||||
| 5.3.3 | 2024-04-11 | [37001](https://github.com/airbytehq/airbyte/pull/37001) | Update airbyte-cdk to flush print buffer for every message |
|
||||
| 5.3.2 | 2024-04-11 | [36964](https://github.com/airbytehq/airbyte/pull/36964) | Update CDK version to fix breaking change before another devs work on it |
|
||||
| 5.3.1 | 2024-04-10 | [36960](https://github.com/airbytehq/airbyte/pull/36960) | Remove unused imports |
|
||||
| 5.3.0 | 2024-03-12 | [35978](https://github.com/airbytehq/airbyte/pull/35978) | Upgrade CDK to start emitting record counts with state and full refresh state |
|
||||
| 5.2.4 | 2024-02-12 | [35137](https://github.com/airbytehq/airbyte/pull/35137) | Fix license in `pyproject.toml` |
|
||||
| 5.2.3 | 2024-02-09 | [35068](https://github.com/airbytehq/airbyte/pull/35068) | Manage dependencies with Poetry. |
|
||||
| 5.2.2 | 2024-01-31 | [34619](https://github.com/airbytehq/airbyte/pull/34619) | Events stream concurrent on incremental syncs |
|
||||
| 5.2.1 | 2024-01-18 | [34495](https://github.com/airbytehq/airbyte/pull/34495) | Fix deadlock issue |
|
||||
| 5.2.0 | 2024-01-18 | [34347](https://github.com/airbytehq/airbyte/pull//34347) | Add new fields invoices and subscription streams. Upgrade the CDK for better memory usage. |
|
||||
| 5.1.3 | 2023-12-18 | [33306](https://github.com/airbytehq/airbyte/pull/33306/) | Adding integration tests |
|
||||
| 5.1.2 | 2024-01-04 | [33414](https://github.com/airbytehq/airbyte/pull/33414) | Prepare for airbyte-lib |
|
||||
| 5.1.1 | 2024-01-04 | [33926](https://github.com/airbytehq/airbyte/pull/33926/) | Update endpoint for `bank_accounts` stream |
|
||||
| 5.1.0 | 2023-12-11 | [32908](https://github.com/airbytehq/airbyte/pull/32908/) | Read full refresh streams concurrently |
|
||||
| 5.0.2 | 2023-12-01 | [33038](https://github.com/airbytehq/airbyte/pull/33038) | Add stream slice logging for SubStream |
|
||||
| 5.0.1 | 2023-11-17 | [32638](https://github.com/airbytehq/airbyte/pull/32638/) | Availability stretegy: check availability of both endpoints (if applicable) - common API + events API |
|
||||
| 5.0.0 | 2023-11-16 | [32286](https://github.com/airbytehq/airbyte/pull/32286/) | Fix multiple issues regarding usage of the incremental sync mode for the `Refunds`, `CheckoutSessions`, `CheckoutSessionsLineItems` streams. Fix schemas for the streams: `Invoices`, `Subscriptions`, `SubscriptionSchedule` |
|
||||
| 4.5.4 | 2023-11-16 | [32284](https://github.com/airbytehq/airbyte/pull/32284/) | Enable client-side rate limiting |
|
||||
| 4.5.3 | 2023-11-14 | [32473](https://github.com/airbytehq/airbyte/pull/32473/) | Have all full_refresh stream syncs be concurrent |
|
||||
| 4.5.2 | 2023-11-03 | [32146](https://github.com/airbytehq/airbyte/pull/32146/) | Fix multiple BankAccount issues |
|
||||
| 4.5.1 | 2023-11-01 | [32056](https://github.com/airbytehq/airbyte/pull/32056/) | Use CDK version 0.52.8 |
|
||||
| 4.5.0 | 2023-10-25 | [31327](https://github.com/airbytehq/airbyte/pull/31327/) | Use concurrent CDK when running in full-refresh |
|
||||
| 4.4.2 | 2023-10-24 | [31764](https://github.com/airbytehq/airbyte/pull/31764) | Base image migration: remove Dockerfile and use the python-connector-base image |
|
||||
| 4.4.1 | 2023-10-18 | [31553](https://github.com/airbytehq/airbyte/pull/31553) | Adjusted `Setup Attempts` and extended `Checkout Sessions` stream schemas |
|
||||
| 4.4.0 | 2023-10-04 | [31046](https://github.com/airbytehq/airbyte/pull/31046) | Added margins field to invoice_line_items stream. |
|
||||
| 4.3.1 | 2023-09-27 | [30800](https://github.com/airbytehq/airbyte/pull/30800) | Handle permission issues a non breaking |
|
||||
| 4.3.0 | 2023-09-26 | [30752](https://github.com/airbytehq/airbyte/pull/30752) | Do not sync upcoming invoices, extend stream schemas |
|
||||
| 4.2.0 | 2023-09-21 | [30660](https://github.com/airbytehq/airbyte/pull/30660) | Fix updated state for the incremental syncs |
|
||||
| 4.1.1 | 2023-09-15 | [30494](https://github.com/airbytehq/airbyte/pull/30494) | Fix datatype of invoices.lines property |
|
||||
| 4.1.0 | 2023-08-29 | [29950](https://github.com/airbytehq/airbyte/pull/29950) | Implement incremental deletes, add suggested streams |
|
||||
| 4.0.1 | 2023-09-07 | [30254](https://github.com/airbytehq/airbyte/pull/30254) | Fix cursorless incremental streams |
|
||||
| 4.0.0 | 2023-08-15 | [29330](https://github.com/airbytehq/airbyte/pull/29330) | Implement incremental syncs based on date of update |
|
||||
| 3.17.4 | 2023-08-15 | [29425](https://github.com/airbytehq/airbyte/pull/29425) | Revert 3.17.3 |
|
||||
| 3.17.3 | 2023-08-01 | [28911](https://github.com/airbytehq/airbyte/pull/28911) | Revert 3.17.2 and fix atm_fee property |
|
||||
| 3.17.2 | 2023-08-01 | [28911](https://github.com/airbytehq/airbyte/pull/28911) | Fix stream schemas, remove custom 403 error handling |
|
||||
| 3.17.1 | 2023-08-01 | [28887](https://github.com/airbytehq/airbyte/pull/28887) | Fix `Invoices` schema |
|
||||
| 3.17.0 | 2023-07-28 | [26127](https://github.com/airbytehq/airbyte/pull/26127) | Add `Prices` stream |
|
||||
| 3.16.0 | 2023-07-27 | [28776](https://github.com/airbytehq/airbyte/pull/28776) | Add new fields to stream schemas |
|
||||
| 3.15.0 | 2023-07-09 | [28709](https://github.com/airbytehq/airbyte/pull/28709) | Remove duplicate streams |
|
||||
| 3.14.0 | 2023-07-09 | [27217](https://github.com/airbytehq/airbyte/pull/27217) | Add `ShippingRates` stream |
|
||||
| 3.13.0 | 2023-07-18 | [28466](https://github.com/airbytehq/airbyte/pull/28466) | Pin source API version |
|
||||
| 3.12.0 | 2023-05-20 | [26208](https://github.com/airbytehq/airbyte/pull/26208) | Add new stream `Persons` |
|
||||
| 3.11.0 | 2023-06-26 | [27734](https://github.com/airbytehq/airbyte/pull/27734) | License Update: Elv2 stream |
|
||||
| 3.10.0 | 2023-06-22 | [27132](https://github.com/airbytehq/airbyte/pull/27132) | Add `CreditNotes` stream |
|
||||
| 3.9.1 | 2023-06-20 | [27522](https://github.com/airbytehq/airbyte/pull/27522) | Fix formatting |
|
||||
| 3.9.0 | 2023-06-19 | [27362](https://github.com/airbytehq/airbyte/pull/27362) | Add new Streams: Transfer Reversals, Setup Attempts, Usage Records, Transactions |
|
||||
| 3.8.0 | 2023-06-12 | [27238](https://github.com/airbytehq/airbyte/pull/27238) | Add `Topups` stream; Add `Files` stream; Add `FileLinks` stream |
|
||||
| 3.7.0 | 2023-06-06 | [27083](https://github.com/airbytehq/airbyte/pull/27083) | Add new Streams: Authorizations, Cardholders, Cards, Payment Methods, Reviews |
|
||||
| 3.6.0 | 2023-05-24 | [25893](https://github.com/airbytehq/airbyte/pull/25893) | Add `ApplicationFeesRefunds` stream with parent `ApplicationFees` |
|
||||
| 3.5.0 | 2023-05-20 | [22859](https://github.com/airbytehq/airbyte/pull/22859) | Add stream `Early Fraud Warnings` |
|
||||
| 3.4.3 | 2023-05-10 | [25965](https://github.com/airbytehq/airbyte/pull/25965) | Fix Airbyte date-time data-types |
|
||||
| 3.4.2 | 2023-05-04 | [25795](https://github.com/airbytehq/airbyte/pull/25795) | Added `CDK TypeTransformer` to guarantee declared JSON Schema data-types |
|
||||
| 3.4.1 | 2023-04-24 | [23389](https://github.com/airbytehq/airbyte/pull/23389) | Add `customer_tax_ids` to `Invoices` |
|
||||
| 3.4.0 | 2023-03-20 | [23963](https://github.com/airbytehq/airbyte/pull/23963) | Add `SetupIntents` stream |
|
||||
| 3.3.0 | 2023-04-12 | [25136](https://github.com/airbytehq/airbyte/pull/25136) | Add stream `Accounts` |
|
||||
| 3.2.0 | 2023-04-10 | [23624](https://github.com/airbytehq/airbyte/pull/23624) | Add new stream `Subscription Schedule` |
|
||||
| 3.1.0 | 2023-03-10 | [19906](https://github.com/airbytehq/airbyte/pull/19906) | Expand `tiers` when syncing `Plans` streams |
|
||||
| 3.0.5 | 2023-03-25 | [22866](https://github.com/airbytehq/airbyte/pull/22866) | Specified date formatting in specification |
|
||||
| 3.0.4 | 2023-03-24 | [24471](https://github.com/airbytehq/airbyte/pull/24471) | Fix stream slices for single sliced streams |
|
||||
| 3.0.3 | 2023-03-17 | [24179](https://github.com/airbytehq/airbyte/pull/24179) | Get customer's attributes safely |
|
||||
| 3.0.2 | 2023-03-13 | [24051](https://github.com/airbytehq/airbyte/pull/24051) | Cache `customers` stream; Do not request transactions of customers with zero balance. |
|
||||
| 3.0.1 | 2023-02-22 | [22898](https://github.com/airbytehq/airbyte/pull/22898) | Add missing column to Subscriptions stream |
|
||||
| 3.0.0 | 2023-02-21 | [23295](https://github.com/airbytehq/airbyte/pull/23295) | Fix invoice schema |
|
||||
| 2.0.0 | 2023-02-14 | [22312](https://github.com/airbytehq/airbyte/pull/22312) | Another fix of `Invoices` stream schema + Remove http urls from openapi_spec.json |
|
||||
| 1.0.2 | 2023-02-09 | [22659](https://github.com/airbytehq/airbyte/pull/22659) | Set `AvailabilityStrategy` for all streams |
|
||||
| 1.0.1 | 2023-01-27 | [22042](https://github.com/airbytehq/airbyte/pull/22042) | Set `AvailabilityStrategy` for streams explicitly to `None` |
|
||||
| 1.0.0 | 2023-01-25 | [21858](https://github.com/airbytehq/airbyte/pull/21858) | Update the `Subscriptions` and `Invoices` stream schemas |
|
||||
| 0.1.40 | 2022-10-20 | [18228](https://github.com/airbytehq/airbyte/pull/18228) | Update the `PaymentIntents` stream schema |
|
||||
| 0.1.39 | 2022-09-28 | [17304](https://github.com/airbytehq/airbyte/pull/17304) | Migrate to per-stream states. |
|
||||
| 0.1.38 | 2022-09-09 | [16537](https://github.com/airbytehq/airbyte/pull/16537) | Fix `redeem_by` field type for `customers` stream |
|
||||
| 0.1.37 | 2022-08-16 | [15686](https://github.com/airbytehq/airbyte/pull/15686) | Fix the bug when the stream couldn't be fetched due to limited permission set, if so - it should be skipped |
|
||||
| 0.1.36 | 2022-08-04 | [15292](https://github.com/airbytehq/airbyte/pull/15292) | Implement slicing |
|
||||
| 0.1.35 | 2022-07-21 | [14924](https://github.com/airbytehq/airbyte/pull/14924) | Remove `additionalProperties` field from spec and schema |
|
||||
| 0.1.34 | 2022-07-01 | [14357](https://github.com/airbytehq/airbyte/pull/14357) | Add external account streams - |
|
||||
| 0.1.33 | 2022-06-06 | [13449](https://github.com/airbytehq/airbyte/pull/13449) | Add semi-incremental support for CheckoutSessions and CheckoutSessionsLineItems streams, fixed big in StripeSubStream, added unittests, updated docs |
|
||||
| 0.1.32 | 2022-04-30 | [12500](https://github.com/airbytehq/airbyte/pull/12500) | Improve input configuration copy |
|
||||
| 0.1.31 | 2022-04-20 | [12230](https://github.com/airbytehq/airbyte/pull/12230) | Update connector to use a `spec.yaml` |
|
||||
| 0.1.30 | 2022-03-21 | [11286](https://github.com/airbytehq/airbyte/pull/11286) | Minor corrections to documentation and connector specification |
|
||||
| 0.1.29 | 2022-03-08 | [10359](https://github.com/airbytehq/airbyte/pull/10359) | Improved performance for streams with substreams: invoice_line_items, subscription_items, bank_accounts |
|
||||
| 0.1.28 | 2022-02-08 | [10165](https://github.com/airbytehq/airbyte/pull/10165) | Improve 404 handling for `CheckoutSessionsLineItems` stream |
|
||||
| 0.1.27 | 2021-12-28 | [9148](https://github.com/airbytehq/airbyte/pull/9148) | Fix `date`, `arrival\_date` fields |
|
||||
| 0.1.26 | 2021-12-21 | [8992](https://github.com/airbytehq/airbyte/pull/8992) | Fix type `events.request` in schema |
|
||||
| 0.1.25 | 2021-11-25 | [8250](https://github.com/airbytehq/airbyte/pull/8250) | Rearrange setup fields |
|
||||
| 0.1.24 | 2021-11-08 | [7729](https://github.com/airbytehq/airbyte/pull/7729) | Include tax data in `checkout_sessions_line_items` stream |
|
||||
| 0.1.23 | 2021-11-08 | [7729](https://github.com/airbytehq/airbyte/pull/7729) | Correct `payment_intents` schema |
|
||||
| 0.1.22 | 2021-11-05 | [7345](https://github.com/airbytehq/airbyte/pull/7345) | Add 3 new streams |
|
||||
| 0.1.21 | 2021-10-07 | [6841](https://github.com/airbytehq/airbyte/pull/6841) | Fix missing `start_date` argument + update json files for SAT |
|
||||
| 0.1.20 | 2021-09-30 | [6017](https://github.com/airbytehq/airbyte/pull/6017) | Add lookback_window_days parameter |
|
||||
| 0.1.19 | 2021-09-27 | [6466](https://github.com/airbytehq/airbyte/pull/6466) | Use `start_date` parameter in incremental streams |
|
||||
| 0.1.18 | 2021-09-14 | [6004](https://github.com/airbytehq/airbyte/pull/6004) | Fix coupons and subscriptions stream schemas by removing incorrect timestamp formatting |
|
||||
| 0.1.17 | 2021-09-14 | [6004](https://github.com/airbytehq/airbyte/pull/6004) | Add `PaymentIntents` stream |
|
||||
| 0.1.16 | 2021-07-28 | [4980](https://github.com/airbytehq/airbyte/pull/4980) | Remove Updated field from schemas |
|
||||
| 0.1.15 | 2021-07-21 | [4878](https://github.com/airbytehq/airbyte/pull/4878) | Fix incorrect percent_off and discounts data filed types |
|
||||
| 0.1.14 | 2021-07-09 | [4669](https://github.com/airbytehq/airbyte/pull/4669) | Subscriptions Stream now returns all kinds of subscriptions \(including expired and canceled\) |
|
||||
| 0.1.13 | 2021-07-03 | [4528](https://github.com/airbytehq/airbyte/pull/4528) | Remove regex for acc validation |
|
||||
| 0.1.12 | 2021-06-08 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support |
|
||||
| 0.1.11 | 2021-05-30 | [3744](https://github.com/airbytehq/airbyte/pull/3744) | Fix types in schema |
|
||||
| 0.1.10 | 2021-05-28 | [3728](https://github.com/airbytehq/airbyte/pull/3728) | Update data types to be number instead of int |
|
||||
| 0.1.9 | 2021-05-13 | [3367](https://github.com/airbytehq/airbyte/pull/3367) | Add acceptance tests for connected accounts |
|
||||
| 0.1.8 | 2021-05-11 | [3566](https://github.com/airbytehq/airbyte/pull/3368) | Bump CDK connectors |
|
||||
| Version | Date | Pull Request | Subject |
|
||||
|:------------|:-----------|:----------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 5.10.0-rc.1 | 2025-04-13 | [58060](https://github.com/airbytehq/airbyte/pull/58060) | Migrate application_fees, authorizations, cardholders, cards, early_fraud_warnings, external_account_bank_accounts and external_account_cards to low-code |
|
||||
| 5.9.2 | 2025-04-15 | [58072](https://github.com/airbytehq/airbyte/pull/58072) | Add safe state data type handling |
|
||||
| 5.9.1 | 2025-04-15 | [58068](https://github.com/airbytehq/airbyte/pull/58068) | Add documentation url back in spec |
|
||||
| 5.9.0 | 2025-04-14 | [58065](https://github.com/airbytehq/airbyte/pull/58065) | Promoting release candidate 5.9.0-rc.1 to a main version. |
|
||||
| 5.9.0-rc.1 | 2025-03-04 | [54162](https://github.com/airbytehq/airbyte/pull/54162) | Migrate events, shipping_rates, balance_transactions, files and file_links to low-code |
|
||||
| 5.8.14 | 2025-03-29 | [56871](https://github.com/airbytehq/airbyte/pull/56871) | Update dependencies |
|
||||
| 5.8.13 | 2025-03-22 | [56276](https://github.com/airbytehq/airbyte/pull/56276) | Update dependencies |
|
||||
| 5.8.12 | 2025-03-10 | [55682](https://github.com/airbytehq/airbyte/pull/55682) | Promoting release candidate 5.8.10-rc.1 to a main version. |
|
||||
| 5.8.11 | 2025-03-08 | [55598](https://github.com/airbytehq/airbyte/pull/55598) | Update dependencies |
|
||||
| 5.8.10-rc1 | 2025-02-22 | [53670](https://github.com/airbytehq/airbyte/pull/53670) | Update pritbuffer logic |
|
||||
| 5.8.9 | 2025-03-01 | [55117](https://github.com/airbytehq/airbyte/pull/55117) | Update dependencies |
|
||||
| 5.8.8 | 2025-02-28 | [54711](https://github.com/airbytehq/airbyte/pull/54711) | Add retry error handler for `requests.exceptions.InvalidURL' |
|
||||
| 5.8.7 | 2025-02-22 | [54468](https://github.com/airbytehq/airbyte/pull/54468) | Update dependencies |
|
||||
| 5.8.6 | 2025-02-15 | [54067](https://github.com/airbytehq/airbyte/pull/54067) | Update dependencies |
|
||||
| 5.8.5 | 2025-02-08 | [52018](https://github.com/airbytehq/airbyte/pull/52018) | Update dependencies |
|
||||
| 5.8.4 | 2025-02-03 | [49940](https://github.com/airbytehq/airbyte/pull/49940) | Update CDK version |
|
||||
| 5.8.3 | 2025-01-11 | [46832](https://github.com/airbytehq/airbyte/pull/46832) | Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64 |
|
||||
| 5.8.2 | 2024-12-10 | [46499](https://github.com/airbytehq/airbyte/pull/46499) | Source-Stripe: Refactor Customer Balance Transactions |
|
||||
| 5.8.1 | 2024-12-08 | [46499](https://github.com/airbytehq/airbyte/pull/46499) | Source-Stripe: Add new payout_balance_transactions incremental stream |
|
||||
| 5.8.0 | 2024-10-12 | [46864](https://github.com/airbytehq/airbyte/pull/46864) | Add incremental stream support to `accounts` stream |
|
||||
| 5.7.0 | 2024-10-01 | [45860](https://github.com/airbytehq/airbyte/pull/45860) | Add incremental stream support to `invoice_line_items` and `subscription_items` streams |
|
||||
| 5.6.2 | 2024-10-05 | [43881](https://github.com/airbytehq/airbyte/pull/43881) | Update dependencies |
|
||||
| 5.6.1 | 2024-10-03 | [46327](https://github.com/airbytehq/airbyte/pull/46327) | Bump the cdk to 5.10.2 to stop using PrintBuffer optimization due to record count mismatches |
|
||||
| 5.6.0 | 2024-09-10 | [44891](https://github.com/airbytehq/airbyte/pull/44891) | Update `Payment Methods` stream |
|
||||
| 5.5.4 | 2024-09-09 | [45348](https://github.com/airbytehq/airbyte/pull/45348) | Remove `stripe` python package |
|
||||
| 5.5.3 | 2024-09-03 | [45101](https://github.com/airbytehq/airbyte/pull/45101) | Fix regression following pagination issue fix |
|
||||
| 5.5.2 | 2024-08-28 | [44862](https://github.com/airbytehq/airbyte/pull/44862) | Fix RFR pagination issue |
|
||||
| 5.5.1 | 2024-08-10 | [43105](https://github.com/airbytehq/airbyte/pull/43105) | Update dependencies |
|
||||
| 5.5.0 | 2024-08-08 | [43302](https://github.com/airbytehq/airbyte/pull/43302) | Fix problem with state not updating and upgrade cdk 4 |
|
||||
| 5.4.12 | 2024-07-31 | [41985](https://github.com/airbytehq/airbyte/pull/41985) | Expand Invoice discounts and tax rates |
|
||||
| 5.4.11 | 2024-07-27 | [42623](https://github.com/airbytehq/airbyte/pull/42623) | Update dependencies |
|
||||
| 5.4.10 | 2024-07-20 | [42305](https://github.com/airbytehq/airbyte/pull/42305) | Update dependencies |
|
||||
| 5.4.9 | 2024-07-13 | [41760](https://github.com/airbytehq/airbyte/pull/41760) | Update dependencies |
|
||||
| 5.4.8 | 2024-07-10 | [41477](https://github.com/airbytehq/airbyte/pull/41477) | Update dependencies |
|
||||
| 5.4.7 | 2024-07-09 | [40869](https://github.com/airbytehq/airbyte/pull/40869) | Update dependencies |
|
||||
| 5.4.6 | 2024-07-08 | [41044](https://github.com/airbytehq/airbyte/pull/41044) | Use latest `CDK` version possible |
|
||||
| 5.4.5 | 2024-06-25 | [40404](https://github.com/airbytehq/airbyte/pull/40404) | Update dependencies |
|
||||
| 5.4.4 | 2024-06-22 | [40040](https://github.com/airbytehq/airbyte/pull/40040) | Update dependencies |
|
||||
| 5.4.3 | 2024-06-06 | [39284](https://github.com/airbytehq/airbyte/pull/39284) | [autopull] Upgrade base image to v1.2.2 |
|
||||
| 5.4.2 | 2024-06-11 | [39412](https://github.com/airbytehq/airbyte/pull/39412) | Removed `invoice.upcomming` event type from (incremental sync) for `Invoices` stream |
|
||||
| 5.4.1 | 2024-06-11 | [39393](https://github.com/airbytehq/airbyte/pull/39393) | Added missing `event types` (incremental sync) for `Invoices` stream |
|
||||
| 5.4.0 | 2024-06-05 | [39138](https://github.com/airbytehq/airbyte/pull/39138) | Fixed the `Refunds` stream missing data for the `incremental` sync |
|
||||
| 5.3.9 | 2024-05-22 | [38550](https://github.com/airbytehq/airbyte/pull/38550) | Update authenticator package |
|
||||
| 5.3.8 | 2024-05-15 | [38248](https://github.com/airbytehq/airbyte/pull/38248) | Replace AirbyteLogger with logging.Logger |
|
||||
| 5.3.7 | 2024-04-24 | [36663](https://github.com/airbytehq/airbyte/pull/36663) | Schema descriptions |
|
||||
| 5.3.6 | 2024-04-18 | [37448](https://github.com/airbytehq/airbyte/pull/37448) | Ensure AirbyteTracedException in concurrent CDK are emitted with the right type |
|
||||
| 5.3.5 | 2024-04-18 | [37418](https://github.com/airbytehq/airbyte/pull/37418) | Ensure python return code != 0 in case of error |
|
||||
| 5.3.4 | 2024-04-11 | [37406](https://github.com/airbytehq/airbyte/pull/37406) | Update CDK version to have partitioned state fix |
|
||||
| 5.3.3 | 2024-04-11 | [37001](https://github.com/airbytehq/airbyte/pull/37001) | Update airbyte-cdk to flush print buffer for every message |
|
||||
| 5.3.2 | 2024-04-11 | [36964](https://github.com/airbytehq/airbyte/pull/36964) | Update CDK version to fix breaking change before another devs work on it |
|
||||
| 5.3.1 | 2024-04-10 | [36960](https://github.com/airbytehq/airbyte/pull/36960) | Remove unused imports |
|
||||
| 5.3.0 | 2024-03-12 | [35978](https://github.com/airbytehq/airbyte/pull/35978) | Upgrade CDK to start emitting record counts with state and full refresh state |
|
||||
| 5.2.4 | 2024-02-12 | [35137](https://github.com/airbytehq/airbyte/pull/35137) | Fix license in `pyproject.toml` |
|
||||
| 5.2.3 | 2024-02-09 | [35068](https://github.com/airbytehq/airbyte/pull/35068) | Manage dependencies with Poetry. |
|
||||
| 5.2.2 | 2024-01-31 | [34619](https://github.com/airbytehq/airbyte/pull/34619) | Events stream concurrent on incremental syncs |
|
||||
| 5.2.1 | 2024-01-18 | [34495](https://github.com/airbytehq/airbyte/pull/34495) | Fix deadlock issue |
|
||||
| 5.2.0 | 2024-01-18 | [34347](https://github.com/airbytehq/airbyte/pull//34347) | Add new fields invoices and subscription streams. Upgrade the CDK for better memory usage. |
|
||||
| 5.1.3 | 2023-12-18 | [33306](https://github.com/airbytehq/airbyte/pull/33306/) | Adding integration tests |
|
||||
| 5.1.2 | 2024-01-04 | [33414](https://github.com/airbytehq/airbyte/pull/33414) | Prepare for airbyte-lib |
|
||||
| 5.1.1 | 2024-01-04 | [33926](https://github.com/airbytehq/airbyte/pull/33926/) | Update endpoint for `bank_accounts` stream |
|
||||
| 5.1.0 | 2023-12-11 | [32908](https://github.com/airbytehq/airbyte/pull/32908/) | Read full refresh streams concurrently |
|
||||
| 5.0.2 | 2023-12-01 | [33038](https://github.com/airbytehq/airbyte/pull/33038) | Add stream slice logging for SubStream |
|
||||
| 5.0.1 | 2023-11-17 | [32638](https://github.com/airbytehq/airbyte/pull/32638/) | Availability stretegy: check availability of both endpoints (if applicable) - common API + events API |
|
||||
| 5.0.0 | 2023-11-16 | [32286](https://github.com/airbytehq/airbyte/pull/32286/) | Fix multiple issues regarding usage of the incremental sync mode for the `Refunds`, `CheckoutSessions`, `CheckoutSessionsLineItems` streams. Fix schemas for the streams: `Invoices`, `Subscriptions`, `SubscriptionSchedule` |
|
||||
| 4.5.4 | 2023-11-16 | [32284](https://github.com/airbytehq/airbyte/pull/32284/) | Enable client-side rate limiting |
|
||||
| 4.5.3 | 2023-11-14 | [32473](https://github.com/airbytehq/airbyte/pull/32473/) | Have all full_refresh stream syncs be concurrent |
|
||||
| 4.5.2 | 2023-11-03 | [32146](https://github.com/airbytehq/airbyte/pull/32146/) | Fix multiple BankAccount issues |
|
||||
| 4.5.1 | 2023-11-01 | [32056](https://github.com/airbytehq/airbyte/pull/32056/) | Use CDK version 0.52.8 |
|
||||
| 4.5.0 | 2023-10-25 | [31327](https://github.com/airbytehq/airbyte/pull/31327/) | Use concurrent CDK when running in full-refresh |
|
||||
| 4.4.2 | 2023-10-24 | [31764](https://github.com/airbytehq/airbyte/pull/31764) | Base image migration: remove Dockerfile and use the python-connector-base image |
|
||||
| 4.4.1 | 2023-10-18 | [31553](https://github.com/airbytehq/airbyte/pull/31553) | Adjusted `Setup Attempts` and extended `Checkout Sessions` stream schemas |
|
||||
| 4.4.0 | 2023-10-04 | [31046](https://github.com/airbytehq/airbyte/pull/31046) | Added margins field to invoice_line_items stream. |
|
||||
| 4.3.1 | 2023-09-27 | [30800](https://github.com/airbytehq/airbyte/pull/30800) | Handle permission issues a non breaking |
|
||||
| 4.3.0 | 2023-09-26 | [30752](https://github.com/airbytehq/airbyte/pull/30752) | Do not sync upcoming invoices, extend stream schemas |
|
||||
| 4.2.0 | 2023-09-21 | [30660](https://github.com/airbytehq/airbyte/pull/30660) | Fix updated state for the incremental syncs |
|
||||
| 4.1.1 | 2023-09-15 | [30494](https://github.com/airbytehq/airbyte/pull/30494) | Fix datatype of invoices.lines property |
|
||||
| 4.1.0 | 2023-08-29 | [29950](https://github.com/airbytehq/airbyte/pull/29950) | Implement incremental deletes, add suggested streams |
|
||||
| 4.0.1 | 2023-09-07 | [30254](https://github.com/airbytehq/airbyte/pull/30254) | Fix cursorless incremental streams |
|
||||
| 4.0.0 | 2023-08-15 | [29330](https://github.com/airbytehq/airbyte/pull/29330) | Implement incremental syncs based on date of update |
|
||||
| 3.17.4 | 2023-08-15 | [29425](https://github.com/airbytehq/airbyte/pull/29425) | Revert 3.17.3 |
|
||||
| 3.17.3 | 2023-08-01 | [28911](https://github.com/airbytehq/airbyte/pull/28911) | Revert 3.17.2 and fix atm_fee property |
|
||||
| 3.17.2 | 2023-08-01 | [28911](https://github.com/airbytehq/airbyte/pull/28911) | Fix stream schemas, remove custom 403 error handling |
|
||||
| 3.17.1 | 2023-08-01 | [28887](https://github.com/airbytehq/airbyte/pull/28887) | Fix `Invoices` schema |
|
||||
| 3.17.0 | 2023-07-28 | [26127](https://github.com/airbytehq/airbyte/pull/26127) | Add `Prices` stream |
|
||||
| 3.16.0 | 2023-07-27 | [28776](https://github.com/airbytehq/airbyte/pull/28776) | Add new fields to stream schemas |
|
||||
| 3.15.0 | 2023-07-09 | [28709](https://github.com/airbytehq/airbyte/pull/28709) | Remove duplicate streams |
|
||||
| 3.14.0 | 2023-07-09 | [27217](https://github.com/airbytehq/airbyte/pull/27217) | Add `ShippingRates` stream |
|
||||
| 3.13.0 | 2023-07-18 | [28466](https://github.com/airbytehq/airbyte/pull/28466) | Pin source API version |
|
||||
| 3.12.0 | 2023-05-20 | [26208](https://github.com/airbytehq/airbyte/pull/26208) | Add new stream `Persons` |
|
||||
| 3.11.0 | 2023-06-26 | [27734](https://github.com/airbytehq/airbyte/pull/27734) | License Update: Elv2 stream |
|
||||
| 3.10.0 | 2023-06-22 | [27132](https://github.com/airbytehq/airbyte/pull/27132) | Add `CreditNotes` stream |
|
||||
| 3.9.1 | 2023-06-20 | [27522](https://github.com/airbytehq/airbyte/pull/27522) | Fix formatting |
|
||||
| 3.9.0 | 2023-06-19 | [27362](https://github.com/airbytehq/airbyte/pull/27362) | Add new Streams: Transfer Reversals, Setup Attempts, Usage Records, Transactions |
|
||||
| 3.8.0 | 2023-06-12 | [27238](https://github.com/airbytehq/airbyte/pull/27238) | Add `Topups` stream; Add `Files` stream; Add `FileLinks` stream |
|
||||
| 3.7.0 | 2023-06-06 | [27083](https://github.com/airbytehq/airbyte/pull/27083) | Add new Streams: Authorizations, Cardholders, Cards, Payment Methods, Reviews |
|
||||
| 3.6.0 | 2023-05-24 | [25893](https://github.com/airbytehq/airbyte/pull/25893) | Add `ApplicationFeesRefunds` stream with parent `ApplicationFees` |
|
||||
| 3.5.0 | 2023-05-20 | [22859](https://github.com/airbytehq/airbyte/pull/22859) | Add stream `Early Fraud Warnings` |
|
||||
| 3.4.3 | 2023-05-10 | [25965](https://github.com/airbytehq/airbyte/pull/25965) | Fix Airbyte date-time data-types |
|
||||
| 3.4.2 | 2023-05-04 | [25795](https://github.com/airbytehq/airbyte/pull/25795) | Added `CDK TypeTransformer` to guarantee declared JSON Schema data-types |
|
||||
| 3.4.1 | 2023-04-24 | [23389](https://github.com/airbytehq/airbyte/pull/23389) | Add `customer_tax_ids` to `Invoices` |
|
||||
| 3.4.0 | 2023-03-20 | [23963](https://github.com/airbytehq/airbyte/pull/23963) | Add `SetupIntents` stream |
|
||||
| 3.3.0 | 2023-04-12 | [25136](https://github.com/airbytehq/airbyte/pull/25136) | Add stream `Accounts` |
|
||||
| 3.2.0 | 2023-04-10 | [23624](https://github.com/airbytehq/airbyte/pull/23624) | Add new stream `Subscription Schedule` |
|
||||
| 3.1.0 | 2023-03-10 | [19906](https://github.com/airbytehq/airbyte/pull/19906) | Expand `tiers` when syncing `Plans` streams |
|
||||
| 3.0.5 | 2023-03-25 | [22866](https://github.com/airbytehq/airbyte/pull/22866) | Specified date formatting in specification |
|
||||
| 3.0.4 | 2023-03-24 | [24471](https://github.com/airbytehq/airbyte/pull/24471) | Fix stream slices for single sliced streams |
|
||||
| 3.0.3 | 2023-03-17 | [24179](https://github.com/airbytehq/airbyte/pull/24179) | Get customer's attributes safely |
|
||||
| 3.0.2 | 2023-03-13 | [24051](https://github.com/airbytehq/airbyte/pull/24051) | Cache `customers` stream; Do not request transactions of customers with zero balance. |
|
||||
| 3.0.1 | 2023-02-22 | [22898](https://github.com/airbytehq/airbyte/pull/22898) | Add missing column to Subscriptions stream |
|
||||
| 3.0.0 | 2023-02-21 | [23295](https://github.com/airbytehq/airbyte/pull/23295) | Fix invoice schema |
|
||||
| 2.0.0 | 2023-02-14 | [22312](https://github.com/airbytehq/airbyte/pull/22312) | Another fix of `Invoices` stream schema + Remove http urls from openapi_spec.json |
|
||||
| 1.0.2 | 2023-02-09 | [22659](https://github.com/airbytehq/airbyte/pull/22659) | Set `AvailabilityStrategy` for all streams |
|
||||
| 1.0.1 | 2023-01-27 | [22042](https://github.com/airbytehq/airbyte/pull/22042) | Set `AvailabilityStrategy` for streams explicitly to `None` |
|
||||
| 1.0.0 | 2023-01-25 | [21858](https://github.com/airbytehq/airbyte/pull/21858) | Update the `Subscriptions` and `Invoices` stream schemas |
|
||||
| 0.1.40 | 2022-10-20 | [18228](https://github.com/airbytehq/airbyte/pull/18228) | Update the `PaymentIntents` stream schema |
|
||||
| 0.1.39 | 2022-09-28 | [17304](https://github.com/airbytehq/airbyte/pull/17304) | Migrate to per-stream states. |
|
||||
| 0.1.38 | 2022-09-09 | [16537](https://github.com/airbytehq/airbyte/pull/16537) | Fix `redeem_by` field type for `customers` stream |
|
||||
| 0.1.37 | 2022-08-16 | [15686](https://github.com/airbytehq/airbyte/pull/15686) | Fix the bug when the stream couldn't be fetched due to limited permission set, if so - it should be skipped |
|
||||
| 0.1.36 | 2022-08-04 | [15292](https://github.com/airbytehq/airbyte/pull/15292) | Implement slicing |
|
||||
| 0.1.35 | 2022-07-21 | [14924](https://github.com/airbytehq/airbyte/pull/14924) | Remove `additionalProperties` field from spec and schema |
|
||||
| 0.1.34 | 2022-07-01 | [14357](https://github.com/airbytehq/airbyte/pull/14357) | Add external account streams - |
|
||||
| 0.1.33 | 2022-06-06 | [13449](https://github.com/airbytehq/airbyte/pull/13449) | Add semi-incremental support for CheckoutSessions and CheckoutSessionsLineItems streams, fixed big in StripeSubStream, added unittests, updated docs |
|
||||
| 0.1.32 | 2022-04-30 | [12500](https://github.com/airbytehq/airbyte/pull/12500) | Improve input configuration copy |
|
||||
| 0.1.31 | 2022-04-20 | [12230](https://github.com/airbytehq/airbyte/pull/12230) | Update connector to use a `spec.yaml` |
|
||||
| 0.1.30 | 2022-03-21 | [11286](https://github.com/airbytehq/airbyte/pull/11286) | Minor corrections to documentation and connector specification |
|
||||
| 0.1.29 | 2022-03-08 | [10359](https://github.com/airbytehq/airbyte/pull/10359) | Improved performance for streams with substreams: invoice_line_items, subscription_items, bank_accounts |
|
||||
| 0.1.28 | 2022-02-08 | [10165](https://github.com/airbytehq/airbyte/pull/10165) | Improve 404 handling for `CheckoutSessionsLineItems` stream |
|
||||
| 0.1.27 | 2021-12-28 | [9148](https://github.com/airbytehq/airbyte/pull/9148) | Fix `date`, `arrival\_date` fields |
|
||||
| 0.1.26 | 2021-12-21 | [8992](https://github.com/airbytehq/airbyte/pull/8992) | Fix type `events.request` in schema |
|
||||
| 0.1.25 | 2021-11-25 | [8250](https://github.com/airbytehq/airbyte/pull/8250) | Rearrange setup fields |
|
||||
| 0.1.24 | 2021-11-08 | [7729](https://github.com/airbytehq/airbyte/pull/7729) | Include tax data in `checkout_sessions_line_items` stream |
|
||||
| 0.1.23 | 2021-11-08 | [7729](https://github.com/airbytehq/airbyte/pull/7729) | Correct `payment_intents` schema |
|
||||
| 0.1.22 | 2021-11-05 | [7345](https://github.com/airbytehq/airbyte/pull/7345) | Add 3 new streams |
|
||||
| 0.1.21 | 2021-10-07 | [6841](https://github.com/airbytehq/airbyte/pull/6841) | Fix missing `start_date` argument + update json files for SAT |
|
||||
| 0.1.20 | 2021-09-30 | [6017](https://github.com/airbytehq/airbyte/pull/6017) | Add lookback_window_days parameter |
|
||||
| 0.1.19 | 2021-09-27 | [6466](https://github.com/airbytehq/airbyte/pull/6466) | Use `start_date` parameter in incremental streams |
|
||||
| 0.1.18 | 2021-09-14 | [6004](https://github.com/airbytehq/airbyte/pull/6004) | Fix coupons and subscriptions stream schemas by removing incorrect timestamp formatting |
|
||||
| 0.1.17 | 2021-09-14 | [6004](https://github.com/airbytehq/airbyte/pull/6004) | Add `PaymentIntents` stream |
|
||||
| 0.1.16 | 2021-07-28 | [4980](https://github.com/airbytehq/airbyte/pull/4980) | Remove Updated field from schemas |
|
||||
| 0.1.15 | 2021-07-21 | [4878](https://github.com/airbytehq/airbyte/pull/4878) | Fix incorrect percent_off and discounts data filed types |
|
||||
| 0.1.14 | 2021-07-09 | [4669](https://github.com/airbytehq/airbyte/pull/4669) | Subscriptions Stream now returns all kinds of subscriptions \(including expired and canceled\) |
|
||||
| 0.1.13 | 2021-07-03 | [4528](https://github.com/airbytehq/airbyte/pull/4528) | Remove regex for acc validation |
|
||||
| 0.1.12 | 2021-06-08 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support |
|
||||
| 0.1.11 | 2021-05-30 | [3744](https://github.com/airbytehq/airbyte/pull/3744) | Fix types in schema |
|
||||
| 0.1.10 | 2021-05-28 | [3728](https://github.com/airbytehq/airbyte/pull/3728) | Update data types to be number instead of int |
|
||||
| 0.1.9 | 2021-05-13 | [3367](https://github.com/airbytehq/airbyte/pull/3367) | Add acceptance tests for connected accounts |
|
||||
| 0.1.8 | 2021-05-11 | [3566](https://github.com/airbytehq/airbyte/pull/3368) | Bump CDK connectors |
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user