From 254e9bf971b391110592de21309d6d75df1e0ebb Mon Sep 17 00:00:00 2001 From: Alex Bair Date: Thu, 14 Nov 2024 17:16:54 -0500 Subject: [PATCH] source-front: rewrite as native connector The `source-front` connector was not working correctly as an import. Instead of troubleshooting the low-code import, I chose to rewrite it as a native connector. Backwards compatibility with the sole existing (non-working) capture was not a goal. I focused on just parent streams that seemed most important for the user's use case, and we can add more later as needed. --- .github/workflows/python.yaml | 2 +- source-front/VERSION | 1 + source-front/acmeCo/channels.schema.yaml | 31 + source-front/acmeCo/contacts.schema.yaml | 40 + source-front/acmeCo/conversations.schema.yaml | 36 + source-front/acmeCo/events.schema.yaml | 40 + source-front/acmeCo/flow.yaml | 696 +---- source-front/acmeCo/inboxes.schema.yaml | 31 + source-front/acmeCo/tags.schema.yaml | 31 + source-front/acmeCo/teammates.schema.yaml | 31 + source-front/acmeCo/teams.schema.yaml | 31 + source-front/config.yaml | 17 + source-front/poetry.lock | 1208 +------- source-front/pyproject.toml | 16 +- source-front/source_front/__init__.py | 65 +- source-front/source_front/__main__.py | 15 +- source-front/source_front/api.py | 203 ++ source-front/source_front/manifest.yaml | 2473 ----------------- source-front/source_front/models.py | 90 + source-front/source_front/resources.py | 195 ++ source-front/source_front/source.py | 18 - source-front/test.flow.yaml | 196 +- .../snapshots__capture__capture.stdout.json | 177 ++ .../snapshots__discover__capture.stdout.json | 1333 ++------- .../snapshots__spec__capture.stdout.json | 99 +- source-front/tests/test_snapshots.py | 30 + 26 files changed, 1375 insertions(+), 5730 deletions(-) create mode 100644 source-front/VERSION create mode 100644 source-front/acmeCo/channels.schema.yaml create mode 100644 source-front/acmeCo/contacts.schema.yaml create mode 100644 source-front/acmeCo/conversations.schema.yaml create mode 100644 source-front/acmeCo/events.schema.yaml create mode 100644 source-front/acmeCo/inboxes.schema.yaml create mode 100644 source-front/acmeCo/tags.schema.yaml create mode 100644 source-front/acmeCo/teammates.schema.yaml create mode 100644 source-front/acmeCo/teams.schema.yaml create mode 100644 source-front/config.yaml create mode 100644 source-front/source_front/api.py delete mode 100644 source-front/source_front/manifest.yaml create mode 100644 source-front/source_front/models.py create mode 100644 source-front/source_front/resources.py delete mode 100644 source-front/source_front/source.py create mode 100644 source-front/tests/snapshots/snapshots__capture__capture.stdout.json diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 1c0921d468..6c111ab5bc 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -171,7 +171,7 @@ jobs: usage_rate: "1.0" - name: source-front type: capture - version: v2 + version: v3 usage_rate: "1.0" - name: source-genesys type: capture diff --git a/source-front/VERSION b/source-front/VERSION new file mode 100644 index 0000000000..29ef827e8a --- /dev/null +++ b/source-front/VERSION @@ -0,0 +1 @@ +v3 diff --git a/source-front/acmeCo/channels.schema.yaml b/source-front/acmeCo/channels.schema.yaml new file mode 100644 index 0000000000..efa45a5c07 --- /dev/null +++ b/source-front/acmeCo/channels.schema.yaml @@ -0,0 +1,31 @@ +--- +$defs: + Meta: + properties: + op: + default: u + description: "Operation type (c: Create, u: Update, d: Delete)" + enum: + - c + - u + - d + title: Op + type: string + row_id: + default: -1 + description: "Row ID of the Document, counting up from zero, or -1 if not known" + title: Row Id + type: integer + title: Meta + type: object +additionalProperties: true +properties: + _meta: + $ref: "#/$defs/Meta" + default: + op: u + row_id: -1 + description: Document metadata +title: FrontResource +type: object +x-infer-schema: true diff --git a/source-front/acmeCo/contacts.schema.yaml b/source-front/acmeCo/contacts.schema.yaml new file mode 100644 index 0000000000..8f1ac0372a --- /dev/null +++ b/source-front/acmeCo/contacts.schema.yaml @@ -0,0 +1,40 @@ +--- +$defs: + Meta: + properties: + op: + default: u + description: "Operation type (c: Create, u: Update, d: Delete)" + enum: + - c + - u + - d + title: Op + type: string + row_id: + default: -1 + description: "Row ID of the Document, counting up from zero, or -1 if not known" + title: Row Id + type: integer + title: Meta + type: object +additionalProperties: true +properties: + _meta: + $ref: "#/$defs/Meta" + default: + op: u + row_id: -1 + description: Document metadata + id: + title: Id + type: string + updated_at: + title: Updated At + type: number +required: + - id + - updated_at +title: Contact +type: object +x-infer-schema: true diff --git a/source-front/acmeCo/conversations.schema.yaml b/source-front/acmeCo/conversations.schema.yaml new file mode 100644 index 0000000000..2cc7ad6d26 --- /dev/null +++ b/source-front/acmeCo/conversations.schema.yaml @@ -0,0 +1,36 @@ +--- +$defs: + Meta: + properties: + op: + default: u + description: "Operation type (c: Create, u: Update, d: Delete)" + enum: + - c + - u + - d + title: Op + type: string + row_id: + default: -1 + description: "Row ID of the Document, counting up from zero, or -1 if not known" + title: Row Id + type: integer + title: Meta + type: object +additionalProperties: true +properties: + _meta: + $ref: "#/$defs/Meta" + default: + op: u + row_id: -1 + description: Document metadata + id: + title: Id + type: string +required: + - id +title: Conversation +type: object +x-infer-schema: true diff --git a/source-front/acmeCo/events.schema.yaml b/source-front/acmeCo/events.schema.yaml new file mode 100644 index 0000000000..afe867f96f --- /dev/null +++ b/source-front/acmeCo/events.schema.yaml @@ -0,0 +1,40 @@ +--- +$defs: + Meta: + properties: + op: + default: u + description: "Operation type (c: Create, u: Update, d: Delete)" + enum: + - c + - u + - d + title: Op + type: string + row_id: + default: -1 + description: "Row ID of the Document, counting up from zero, or -1 if not known" + title: Row Id + type: integer + title: Meta + type: object +additionalProperties: true +properties: + _meta: + $ref: "#/$defs/Meta" + default: + op: u + row_id: -1 + description: Document metadata + id: + title: Id + type: string + emitted_at: + title: Emitted At + type: number +required: + - id + - emitted_at +title: Event +type: object +x-infer-schema: true diff --git a/source-front/acmeCo/flow.yaml b/source-front/acmeCo/flow.yaml index fbc205726d..417ea0b0fc 100644 --- a/source-front/acmeCo/flow.yaml +++ b/source-front/acmeCo/flow.yaml @@ -1,704 +1,34 @@ --- collections: - acmeCo/accounts: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/accounts_contacts: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id acmeCo/channels: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/company_tags: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/contact_groups: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true + schema: channels.schema.yaml key: - - /id + - /_meta/row_id acmeCo/contacts: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true + schema: contacts.schema.yaml key: - /id - acmeCo/contacts_notes: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - contact_id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - contact_id - type: object - x-infer-schema: true - key: - - /contact_id acmeCo/conversations: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/conversations_drafts: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/conversations_events: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/conversations_followers: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/conversations_inboxes: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: - - string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/conversations_messages: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true + schema: conversations.schema.yaml key: - /id acmeCo/events: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true + schema: events.schema.yaml key: - /id acmeCo/inboxes: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/inboxes_channels: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/inboxes_conversations: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/inboxes_teammates: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/knowledge_bases: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/knowledge_bases_articles: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/knowledge_bases_categories: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/links: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/message_template_folders: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true + schema: inboxes.schema.yaml key: - - /id - acmeCo/message_templates: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id + - /_meta/row_id acmeCo/tags: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/tags_children: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true + schema: tags.schema.yaml key: - - /id + - /_meta/row_id acmeCo/teammates: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/teammates_contact_groups: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true + schema: teammates.schema.yaml key: - - /id - acmeCo/teammates_message_templates: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/teammates_tags: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id + - /_meta/row_id acmeCo/teams: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/teams_contact_groups: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: - - string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - type: object - required: - - id - x-infer-schema: true + schema: teams.schema.yaml key: - - /id - acmeCo/teams_message_templates: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/teams_signatures: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id - acmeCo/teams_tags: - schema: - $schema: "http://json-schema.org/schema#" - additionalProperties: true - properties: - id: - type: string - _meta: - type: object - properties: - row_id: - type: integer - required: - - row_id - required: - - id - type: object - x-infer-schema: true - key: - - /id + - /_meta/row_id diff --git a/source-front/acmeCo/inboxes.schema.yaml b/source-front/acmeCo/inboxes.schema.yaml new file mode 100644 index 0000000000..efa45a5c07 --- /dev/null +++ b/source-front/acmeCo/inboxes.schema.yaml @@ -0,0 +1,31 @@ +--- +$defs: + Meta: + properties: + op: + default: u + description: "Operation type (c: Create, u: Update, d: Delete)" + enum: + - c + - u + - d + title: Op + type: string + row_id: + default: -1 + description: "Row ID of the Document, counting up from zero, or -1 if not known" + title: Row Id + type: integer + title: Meta + type: object +additionalProperties: true +properties: + _meta: + $ref: "#/$defs/Meta" + default: + op: u + row_id: -1 + description: Document metadata +title: FrontResource +type: object +x-infer-schema: true diff --git a/source-front/acmeCo/tags.schema.yaml b/source-front/acmeCo/tags.schema.yaml new file mode 100644 index 0000000000..efa45a5c07 --- /dev/null +++ b/source-front/acmeCo/tags.schema.yaml @@ -0,0 +1,31 @@ +--- +$defs: + Meta: + properties: + op: + default: u + description: "Operation type (c: Create, u: Update, d: Delete)" + enum: + - c + - u + - d + title: Op + type: string + row_id: + default: -1 + description: "Row ID of the Document, counting up from zero, or -1 if not known" + title: Row Id + type: integer + title: Meta + type: object +additionalProperties: true +properties: + _meta: + $ref: "#/$defs/Meta" + default: + op: u + row_id: -1 + description: Document metadata +title: FrontResource +type: object +x-infer-schema: true diff --git a/source-front/acmeCo/teammates.schema.yaml b/source-front/acmeCo/teammates.schema.yaml new file mode 100644 index 0000000000..efa45a5c07 --- /dev/null +++ b/source-front/acmeCo/teammates.schema.yaml @@ -0,0 +1,31 @@ +--- +$defs: + Meta: + properties: + op: + default: u + description: "Operation type (c: Create, u: Update, d: Delete)" + enum: + - c + - u + - d + title: Op + type: string + row_id: + default: -1 + description: "Row ID of the Document, counting up from zero, or -1 if not known" + title: Row Id + type: integer + title: Meta + type: object +additionalProperties: true +properties: + _meta: + $ref: "#/$defs/Meta" + default: + op: u + row_id: -1 + description: Document metadata +title: FrontResource +type: object +x-infer-schema: true diff --git a/source-front/acmeCo/teams.schema.yaml b/source-front/acmeCo/teams.schema.yaml new file mode 100644 index 0000000000..efa45a5c07 --- /dev/null +++ b/source-front/acmeCo/teams.schema.yaml @@ -0,0 +1,31 @@ +--- +$defs: + Meta: + properties: + op: + default: u + description: "Operation type (c: Create, u: Update, d: Delete)" + enum: + - c + - u + - d + title: Op + type: string + row_id: + default: -1 + description: "Row ID of the Document, counting up from zero, or -1 if not known" + title: Row Id + type: integer + title: Meta + type: object +additionalProperties: true +properties: + _meta: + $ref: "#/$defs/Meta" + default: + op: u + row_id: -1 + description: Document metadata +title: FrontResource +type: object +x-infer-schema: true diff --git a/source-front/config.yaml b/source-front/config.yaml new file mode 100644 index 0000000000..45fb094c08 --- /dev/null +++ b/source-front/config.yaml @@ -0,0 +1,17 @@ +credentials: + access_token_sops: ENC[AES256_GCM,data:zSx56EB2jMwaEEif5QCCMP4RA4WxPsZh1nJH4qaRJSqYCfw+2E8MGG9MfkE111AgH9VjqfTxKZLeKk4tOd7w+pxLyKjQy7NO+fDccwG/HfbpDkFpt6bf/L8tyZiPMlehj06og7n49Fq4T3PEtygPPtKNfQaHN6BG2NjouQ84LuwUPIiROCYjpwTaj1S3oyRLtgIRj7mjkDIW4FRALu8Pz9dkdK5MBIdtCCYptb/fCn6Jl+feVBP5EHFi0CGnKLriZ2OWpLgBgmc5KaH/PRMiYkbKRtvNioEAqQ+L+qZX9dTIlAj9dIVrZT8sFovzHGAuPOFpg+VcaPQVmD4QKXo5ga2SNTjmXyt9IShb0JzDafVLn5a7E2nUsFOJcJEHOPE4Hr04fpirjcg1HgEYaaRqe8TcRERFTidjTnEtQ04=,iv:rSMuMHL4hJQTMRXZGdjjZ93D4YIwF4/7cgxtmhB8/cE=,tag:x2ARLry/Z4TUFXCWg+nSlQ==,type:str] +start_date: "2024-11-14T00:00:00Z" +sops: + kms: [] + gcp_kms: + - resource_id: projects/helpful-kingdom-273219/locations/us-central1/keyRings/dev/cryptoKeys/CI-estuary-flow + created_at: "2024-11-14T20:18:08Z" + enc: CiUAW8BC2LAD9Gr+hocB2TW+cZSGu2NveZnHFlPIJLjkX6+dnyHzEkkAH/toIoe8w9uSJnwZv5ViDaLNqjxltUzA6Knxs8HSFuwfQ3Oqj/nWJyfOgI11XkVn9x6IM60gr24XU5ikmAp9vCZAFfs+F43Q + azure_kv: [] + hc_vault: [] + age: [] + lastmodified: "2024-11-14T20:18:09Z" + mac: ENC[AES256_GCM,data:Dq6OPK0fiFAiXMPRAyAyyH9Ug1lozpB8UQS8lmTZFzIvaddHYITse3aIuFTJgaPho50fvWVaIsByySc8Bpsp/MjiY1EBeWQBPcZ+BgSXJb9PjaHkqzhqw3mby1lZcRD/UIcoLCi+/hO1w4nS4IL77CzAtnDDrcBq7PFkpfQNv3c=,iv:crtV/zrM4Qz3c1Ca7v/XQL5U4BB4ESXqkaH3ANzBTdY=,tag:+Y00qrUSalcPFO+10afL/Q==,type:str] + pgp: [] + encrypted_suffix: _sops + version: 3.7.3 diff --git a/source-front/poetry.lock b/source-front/poetry.lock index be478e3c2c..679b48988a 100644 --- a/source-front/poetry.lock +++ b/source-front/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiodns" @@ -150,62 +150,6 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" -[[package]] -name = "airbyte-cdk" -version = "4.6.2" -description = "A framework for writing Airbyte Connectors." -optional = false -python-versions = "<4.0,>=3.10" -files = [ - {file = "airbyte_cdk-4.6.2-py3-none-any.whl", hash = "sha256:3a37bd96c4b4f874b15fc18839b1e163eb30d1e4ef80d7dde2854e6a48efe934"}, - {file = "airbyte_cdk-4.6.2.tar.gz", hash = "sha256:c034f11ba6abe73dd7346ce2bc7017ff71ef0db1fd1ae86fb86beaeae35d8baf"}, -] - -[package.dependencies] -airbyte-protocol-models-pdv2 = ">=0.12.2,<0.13.0" -backoff = "*" -cachetools = "*" -cryptography = ">=42.0.5,<43.0.0" -Deprecated = ">=1.2,<1.3" -dpath = ">=2.1.6,<3.0.0" -genson = "1.2.2" -isodate = ">=0.6.1,<0.7.0" -Jinja2 = ">=3.1.2,<3.2.0" -jsonref = ">=0.2,<0.3" -jsonschema = ">=3.2.0,<3.3.0" -langchain_core = "0.1.42" -nltk = "3.8.1" -orjson = ">=3.10.7,<4.0.0" -pendulum = "<3.0.0" -pydantic = ">=2.7,<3.0" -pyjwt = ">=2.8.0,<3.0.0" -pyrate-limiter = ">=3.1.0,<3.2.0" -python-dateutil = "*" -pytz = "2024.1" -PyYAML = ">=6.0.1,<7.0.0" -requests = "*" -requests_cache = "*" -wcmatch = "8.4" - -[package.extras] -file-based = ["avro (>=1.11.2,<1.12.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pandas (==2.2.0)", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=15.0.0,<15.1.0)", "pytesseract (==0.3.10)", "python-calamine (==0.2.3)", "unstructured.pytesseract (>=0.3.12)", "unstructured[docx,pptx] (==0.10.27)"] -sphinx-docs = ["Sphinx (>=4.2,<4.3)", "sphinx-rtd-theme (>=1.0,<1.1)"] -vector-db-based = ["cohere (==4.21)", "langchain (==0.1.16)", "openai[embeddings] (==0.27.9)", "tiktoken (==0.4.0)"] - -[[package]] -name = "airbyte-protocol-models-pdv2" -version = "0.12.2" -description = "Declares the Airbyte Protocol." -optional = false -python-versions = ">=3.8" -files = [ - {file = "airbyte_protocol_models_pdv2-0.12.2-py3-none-any.whl", hash = "sha256:8b3f9d0388928547cdf2e9134c0d589e4bcaa6f63bf71a21299f6824bfb7ad0e"}, - {file = "airbyte_protocol_models_pdv2-0.12.2.tar.gz", hash = "sha256:130c9ab289f3f53749ce63ff1abbfb67a44b7e5bd2794865315a2976138b672b"}, -] - -[package.dependencies] -pydantic = ">=2.7.2,<3.0.0" - [[package]] name = "annotated-types" version = "0.7.0" @@ -217,26 +161,6 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -[[package]] -name = "anyio" -version = "4.6.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.9" -files = [ - {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, - {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] -trio = ["trio (>=0.26.1)"] - [[package]] name = "attrs" version = "24.2.0" @@ -256,74 +180,6 @@ docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphi tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] -[[package]] -name = "backoff" -version = "2.2.1" -description = "Function decoration for backoff and retry" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] - -[[package]] -name = "bracex" -version = "2.5.post1" -description = "Bash style brace expander." -optional = false -python-versions = ">=3.8" -files = [ - {file = "bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6"}, - {file = "bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6"}, -] - -[[package]] -name = "cachetools" -version = "5.5.0" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, - {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, -] - -[[package]] -name = "cattrs" -version = "24.1.2" -description = "Composable complex class support for attrs and dataclasses." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, - {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, -] - -[package.dependencies] -attrs = ">=23.1.0" - -[package.extras] -bson = ["pymongo (>=4.4.0)"] -cbor2 = ["cbor2 (>=5.4.6)"] -msgpack = ["msgpack (>=1.0.5)"] -msgspec = ["msgspec (>=0.18.5)"] -orjson = ["orjson (>=3.9.2)"] -pyyaml = ["pyyaml (>=6.0)"] -tomlkit = ["tomlkit (>=0.11.8)"] -ujson = ["ujson (>=5.7.0)"] - -[[package]] -name = "certifi" -version = "2024.8.30" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, -] - [[package]] name = "cffi" version = "1.17.1" @@ -403,119 +259,6 @@ files = [ [package.dependencies] pycparser = "*" -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - [[package]] name = "colorama" version = "0.4.6" @@ -527,60 +270,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "cryptography" -version = "42.0.8" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, -] - -[package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] -test-randomorder = ["pytest-randomly"] - [[package]] name = "debugpy" version = "1.8.6" @@ -612,34 +301,6 @@ files = [ {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, ] -[[package]] -name = "deprecated" -version = "1.2.14" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, - {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] - -[[package]] -name = "dpath" -version = "2.2.0" -description = "Filesystem-like pathing and searching for dictionaries" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dpath-2.2.0-py3-none-any.whl", hash = "sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576"}, - {file = "dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e"}, -] - [[package]] name = "estuary-cdk" version = "0.2.0" @@ -660,20 +321,6 @@ xxhash = "^3.4.1" type = "directory" url = "../estuary-cdk" -[[package]] -name = "freezegun" -version = "1.5.1" -description = "Let your Python tests travel through time" -optional = false -python-versions = ">=3.7" -files = [ - {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, - {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, -] - -[package.dependencies] -python-dateutil = ">=2.7" - [[package]] name = "frozenlist" version = "1.4.1" @@ -760,73 +407,6 @@ files = [ {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] -[[package]] -name = "genson" -version = "1.2.2" -description = "GenSON is a powerful, user-friendly JSON Schema generator." -optional = false -python-versions = "*" -files = [ - {file = "genson-1.2.2.tar.gz", hash = "sha256:8caf69aa10af7aee0e1a1351d1d06801f4696e005f06cedef438635384346a16"}, -] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.6" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, - {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.27.2" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - [[package]] name = "idna" version = "3.10" @@ -852,217 +432,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "isodate" -version = "0.6.1" -description = "An ISO 8601 date/time/duration parser and formatter" -optional = false -python-versions = "*" -files = [ - {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, - {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "jinja2" -version = "3.1.4" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "joblib" -version = "1.4.2" -description = "Lightweight pipelining with Python functions" -optional = false -python-versions = ">=3.8" -files = [ - {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, - {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, -] - -[[package]] -name = "jsonpatch" -version = "1.33" -description = "Apply JSON-Patches (RFC 6902)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, -] - -[[package]] -name = "jsonref" -version = "0.2" -description = "An implementation of JSON Reference for Python" -optional = false -python-versions = "*" -files = [ - {file = "jsonref-0.2-py3-none-any.whl", hash = "sha256:b1e82fa0b62e2c2796a13e5401fe51790b248f6d9bf9d7212a3e31a3501b291f"}, - {file = "jsonref-0.2.tar.gz", hash = "sha256:f3c45b121cf6257eafabdc3a8008763aed1cd7da06dbabc59a9e4d2a5e4e6697"}, -] - -[[package]] -name = "jsonschema" -version = "3.2.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = "*" -files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] - -[package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -setuptools = "*" -six = ">=1.11.0" - -[package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] - -[[package]] -name = "langchain-core" -version = "0.1.42" -description = "Building applications with LLMs through composability" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain_core-0.1.42-py3-none-any.whl", hash = "sha256:c5653ffa08a44f740295c157a24c0def4a753333f6a2c41f76bf431cd00be8b5"}, - {file = "langchain_core-0.1.42.tar.gz", hash = "sha256:40751bf60ea5d8e2b2efe65290db434717ee3834870c002e40e2811f09d814e6"}, -] - -[package.dependencies] -jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.0,<0.2.0" -packaging = ">=23.2,<24.0" -pydantic = ">=1,<3" -PyYAML = ">=5.3" -tenacity = ">=8.1.0,<9.0.0" - -[package.extras] -extended-testing = ["jinja2 (>=3,<4)"] - -[[package]] -name = "langsmith" -version = "0.1.130" -description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langsmith-0.1.130-py3-none-any.whl", hash = "sha256:acf27d77e699d84b03045f3f226e78be1dffb3e756aa1a085f9993a45380e8b2"}, - {file = "langsmith-0.1.130.tar.gz", hash = "sha256:3e43f87655a86395133e3a745d5968667d4d05dc9a24c617f89224c8cbf54dce"}, -] - -[package.dependencies] -httpx = ">=0.23.0,<1" -orjson = ">=3.9.14,<4.0.0" -pydantic = [ - {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, -] -requests = ">=2,<3" -requests-toolbelt = ">=1.0.0,<2.0.0" - -[[package]] -name = "markupsafe" -version = "2.1.5" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, -] - [[package]] name = "multidict" version = "6.1.0" @@ -1221,31 +590,6 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "nltk" -version = "3.8.1" -description = "Natural Language Toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, - {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, -] - -[package.dependencies] -click = "*" -joblib = "*" -regex = ">=2021.8.3" -tqdm = "*" - -[package.extras] -all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] -corenlp = ["requests"] -machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] -plot = ["matplotlib"] -tgrep = ["pyparsing"] -twitter = ["twython"] - [[package]] name = "orjson" version = "3.10.7" @@ -1323,45 +667,6 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] -[[package]] -name = "pendulum" -version = "2.0.0" -description = "Python datetimes made easy" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pendulum-2.0.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:6a0d65d3a7632e6eeaf2f34401dcec3d56c87f5eb8f6d66b76a1bddf3cef66cc"}, - {file = "pendulum-2.0.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4a1097f87aa8ea84a5a15f2a8f812bda7df7d082c8926555a804fa31618ba9b9"}, - {file = "pendulum-2.0.0-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:db3192df663c10ec4a30bedef855ecfbf84b8f890a1abfdb137e890c9cf2d72c"}, - {file = "pendulum-2.0.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:c1fbac0e8077658aa83e0d56d2c77b3578f11c7c88d9984bf1c1efee8b2f109c"}, - {file = "pendulum-2.0.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2c926f76ff9dab4f80e0cb2f03351241dfcbaaa898d6670a647d67d52792e7df"}, - {file = "pendulum-2.0.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:107eb0a59f8ce5b15d1aaae9e4ab796f3ec12c46f25a251bca64cc6620ebfa86"}, - {file = "pendulum-2.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:4c6b4f809c2283c661500527520314d213df61d85eadd93bc1f4f5abc886b4e5"}, - {file = "pendulum-2.0.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4e32446d39623b17e7a3aa8d8b190dc173883220f3a0dc18158c29038b731261"}, - {file = "pendulum-2.0.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e420a8e10a44c7a29bb27d73bdf32f3a4957f77e63242483064e2f9acadbdd7"}, - {file = "pendulum-2.0.0.tar.gz", hash = "sha256:4eb01d8a47dc7d2184886491aac43999ba7671a9418f56eb761b53d8480995f2"}, -] - -[package.dependencies] -python-dateutil = ">=2.6.0.0,<3.0.0.0" -pytzdata = ">=2018.3.0.0" - -[[package]] -name = "platformdirs" -version = "4.3.6" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, - {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, -] - -[package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.11.2)"] - [[package]] name = "pluggy" version = "1.5.0" @@ -1469,8 +774,8 @@ files = [ annotated-types = ">=0.6.0" pydantic-core = "2.23.4" typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, ] [package.extras] @@ -1578,79 +883,6 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" -[[package]] -name = "pyjwt" -version = "2.9.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, - {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - -[[package]] -name = "pyrate-limiter" -version = "3.1.1" -description = "Python Rate-Limiter using Leaky-Bucket Algorithm" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "pyrate_limiter-3.1.1-py3-none-any.whl", hash = "sha256:c51906f1d51d56dc992ff6c26e8300e32151bc6cfa3e6559792e31971dfd4e2b"}, - {file = "pyrate_limiter-3.1.1.tar.gz", hash = "sha256:2f57eda712687e6eccddf6afe8f8a15b409b97ed675fe64a626058f12863b7b7"}, -] - -[package.extras] -all = ["filelock (>=3.0)", "redis (>=5.0.0,<6.0.0)"] -docs = ["furo (>=2022.3.4,<2023.0.0)", "myst-parser (>=0.17)", "sphinx (>=4.3.0,<5.0.0)", "sphinx-autodoc-typehints (>=1.17,<2.0)", "sphinx-copybutton (>=0.5)", "sphinxcontrib-apidoc (>=0.3,<0.4)"] - -[[package]] -name = "pyrsistent" -version = "0.20.0" -description = "Persistent/Functional/Immutable data structures" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, - {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, - {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, - {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, - {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, - {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, - {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, -] - [[package]] name = "pytest" version = "7.4.4" @@ -1686,395 +918,6 @@ files = [ pytest = ">=7.2.0,<9.0.0" wrapt = ">=1.14.1,<2.0.0" -[[package]] -name = "pytest-mock" -version = "3.14.0" -description = "Thin-wrapper around the mock package for easier use with pytest" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, - {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, -] - -[package.dependencies] -pytest = ">=6.2.5" - -[package.extras] -dev = ["pre-commit", "pytest-asyncio", "tox"] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pytz" -version = "2024.1" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, -] - -[[package]] -name = "pytzdata" -version = "2020.1" -description = "The Olson timezone database for Python." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, - {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "regex" -version = "2024.9.11" -description = "Alternative regular expression module, to replace re." -optional = false -python-versions = ">=3.8" -files = [ - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, - {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, - {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, - {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, - {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, - {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, - {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, - {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, - {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, - {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, - {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, - {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, - {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, - {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, -] - -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-cache" -version = "1.2.1" -description = "A persistent cache for python requests" -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603"}, - {file = "requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1"}, -] - -[package.dependencies] -attrs = ">=21.2" -cattrs = ">=22.2" -platformdirs = ">=2.5" -requests = ">=2.22" -url-normalize = ">=1.4" -urllib3 = ">=1.25.5" - -[package.extras] -all = ["boto3 (>=1.15)", "botocore (>=1.18)", "itsdangerous (>=2.0)", "pymongo (>=3)", "pyyaml (>=6.0.1)", "redis (>=3)", "ujson (>=5.4)"] -bson = ["bson (>=0.5)"] -docs = ["furo (>=2023.3,<2024.0)", "linkify-it-py (>=2.0,<3.0)", "myst-parser (>=1.0,<2.0)", "sphinx (>=5.0.2,<6.0.0)", "sphinx-autodoc-typehints (>=1.19)", "sphinx-automodapi (>=0.14)", "sphinx-copybutton (>=0.5)", "sphinx-design (>=0.2)", "sphinx-notfound-page (>=0.8)", "sphinxcontrib-apidoc (>=0.3)", "sphinxext-opengraph (>=0.9)"] -dynamodb = ["boto3 (>=1.15)", "botocore (>=1.18)"] -json = ["ujson (>=5.4)"] -mongodb = ["pymongo (>=3)"] -redis = ["redis (>=3)"] -security = ["itsdangerous (>=2.0)"] -yaml = ["pyyaml (>=6.0.1)"] - -[[package]] -name = "requests-futures" -version = "1.0.1" -description = "Asynchronous Python HTTP for Humans." -optional = false -python-versions = "*" -files = [ - {file = "requests-futures-1.0.1.tar.gz", hash = "sha256:f55a4ef80070e2858e7d1e73123d2bfaeaf25b93fd34384d8ddf148e2b676373"}, - {file = "requests_futures-1.0.1-py2.py3-none-any.whl", hash = "sha256:4a2f5472e9911a79532137d156aa937cd9cd90fec55677f71b2976d1f7a66d38"}, -] - -[package.dependencies] -requests = ">=1.2.0" - -[package.extras] -dev = ["black (>=22.3.0)", "build (>=0.7.0)", "isort (>=5.11.4)", "pyflakes (>=2.2.0)", "pytest (>=6.2.5)", "pytest-cov (>=3.0.0)", "pytest-network (>=0.0.1)", "readme-renderer[rst] (>=26.0)", "twine (>=3.4.2)"] - -[[package]] -name = "requests-mock" -version = "1.12.1" -description = "Mock out responses from the requests package" -optional = false -python-versions = ">=3.5" -files = [ - {file = "requests-mock-1.12.1.tar.gz", hash = "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"}, - {file = "requests_mock-1.12.1-py2.py3-none-any.whl", hash = "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563"}, -] - -[package.dependencies] -requests = ">=2.22,<3" - -[package.extras] -fixture = ["fixtures"] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "setuptools" -version = "70.3.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-70.3.0-py3-none-any.whl", hash = "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc"}, - {file = "setuptools-70.3.0.tar.gz", hash = "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5"}, -] - -[package.extras] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "tenacity" -version = "8.5.0" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, - {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - -[[package]] -name = "tqdm" -version = "4.66.5" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, - {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - [[package]] name = "typing-extensions" version = "4.12.2" @@ -2086,51 +929,6 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] -[[package]] -name = "url-normalize" -version = "1.4.3" -description = "URL normalization for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, - {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "urllib3" -version = "2.2.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "wcmatch" -version = "8.4" -description = "Wildcard/glob file name matcher." -optional = false -python-versions = ">=3.7" -files = [ - {file = "wcmatch-8.4-py3-none-any.whl", hash = "sha256:dc7351e5a7f8bbf4c6828d51ad20c1770113f5f3fd3dfe2a03cfde2a63f03f98"}, - {file = "wcmatch-8.4.tar.gz", hash = "sha256:ba4fc5558f8946bf1ffc7034b05b814d825d694112499c86035e0e4d398b6a67"}, -] - -[package.dependencies] -bracex = ">=2.1.1" - [[package]] name = "wrapt" version = "1.16.0" @@ -2450,4 +1248,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "bf97700e6c69612959249d23682fa607e3c9be853371dd61d8483d01ede3509c" +content-hash = "ecec719ea550f8e4341577e3b277ef860e33f227b3cf670731ecc9c360452182" diff --git a/source-front/pyproject.toml b/source-front/pyproject.toml index ba5ae6c3cc..402438a895 100644 --- a/source-front/pyproject.toml +++ b/source-front/pyproject.toml @@ -1,32 +1,20 @@ [tool.poetry] version = "0.1.0" name = "source-front" -description = "Source implementation for front." -authors = [ "Luis Salomao"] +description = "" +authors = [ "Alex Bair "] [tool.poetry.dependencies] -airbyte-cdk = "^4.6.2" estuary-cdk = {path="../estuary-cdk", develop = true} python = "^3.11" pydantic = "^2" -pytz = "^2024.1" -requests-futures = "^1.0.1" -setuptools = "^70.0.0" [tool.poetry.group.dev.dependencies] debugpy = "^1.8.0" mypy = "^1.8.0" pytest = "^7.4.3" pytest-insta = "^0.3.0" -requests-mock = "^1.11.0" -pytest-mock = "^3.12.0" -freezegun = "^1.4.0" -pendulum = "2.0.0" [build-system] requires = [ "poetry-core>=1.0.0",] build-backend = "poetry.core.masonry.api" - -[tool.poetry.scripts] -source-brevo = "source_brevo.run:run" - diff --git a/source-front/source_front/__init__.py b/source-front/source_front/__init__.py index 004d3d7d97..adb66b442a 100644 --- a/source-front/source_front/__init__.py +++ b/source-front/source_front/__init__.py @@ -1,8 +1,63 @@ -# -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. -# +from logging import Logger +from typing import Callable, Awaitable +from estuary_cdk.flow import ( + ConnectorSpec, +) +from estuary_cdk.capture import ( + BaseCaptureConnector, + Request, + Task, + common, + request, + response, +) +from estuary_cdk.http import HTTPMixin -from .source import SourceFront +from .resources import all_resources, validate_credentials +from .models import ( + ConnectorState, + EndpointConfig, + ResourceConfig, +) -__all__ = ["SourceFront"] + +class Connector( + BaseCaptureConnector[EndpointConfig, ResourceConfig, ConnectorState], + HTTPMixin, +): + def request_class(self): + return Request[EndpointConfig, ResourceConfig, ConnectorState] + + async def spec(self, _: request.Spec, logger: Logger) -> ConnectorSpec: + return ConnectorSpec( + configSchema=EndpointConfig.model_json_schema(), + documentationUrl="https://go.estuary.dev/source-pendo", + resourceConfigSchema=ResourceConfig.model_json_schema(), + resourcePathPointers=ResourceConfig.PATH_POINTERS, + ) + + async def discover( + self, log: Logger, discover: request.Discover[EndpointConfig] + ) -> response.Discovered[ResourceConfig]: + resources = await all_resources(log, self, discover.config) + return common.discovered(resources) + + async def validate( + self, + log: Logger, + validate: request.Validate[EndpointConfig, ResourceConfig], + ) -> response.Validated: + await validate_credentials(log, self, validate.config) + resources = await all_resources(log, self, validate.config) + resolved = common.resolve_bindings(validate.bindings, resources) + return common.validated(resolved) + + async def open( + self, + log: Logger, + open: request.Open[EndpointConfig, ResourceConfig, ConnectorState], + ) -> tuple[response.Opened, Callable[[Task], Awaitable[None]]]: + resources = await all_resources(log, self, open.capture.config) + resolved = common.resolve_bindings(open.capture.bindings, resources) + return common.open(open, resolved) diff --git a/source-front/source_front/__main__.py b/source-front/source_front/__main__.py index 62f1dc0969..e100c411f2 100644 --- a/source-front/source_front/__main__.py +++ b/source-front/source_front/__main__.py @@ -1,15 +1,4 @@ -import estuary_cdk.pydantic_polyfill # Must be first. - import asyncio +import source_front -from estuary_cdk import flow, shim_airbyte_cdk - -from source_front import SourceFront - -asyncio.run( - shim_airbyte_cdk.CaptureShim( - delegate=SourceFront(), - oauth2=None, - schema_inference=True, - ).serve() -) \ No newline at end of file +asyncio.run(source_front.Connector().serve()) diff --git a/source-front/source_front/api.py b/source-front/source_front/api.py new file mode 100644 index 0000000000..cd5b28ffa3 --- /dev/null +++ b/source-front/source_front/api.py @@ -0,0 +1,203 @@ +from datetime import datetime, UTC, timedelta +from logging import Logger +from math import trunc +from typing import AsyncGenerator +from urllib.parse import urlparse, parse_qs, quote +from estuary_cdk.capture.common import LogCursor +from estuary_cdk.http import HTTPSession + +from .models import ( + FrontResource, + Response, +) + + +API = "https://api2.frontapp.com" +MAX_DATE_WINDOW_SIZE = 15 +CONVERSATIONS_LAG = 2 + +def _dt_to_s(dt: datetime) -> float: + timestamp = dt.timestamp() + # Front timestamps can have up to 3 decimal places, so we only keep the last 3 decimals. + return trunc(timestamp * 1000) / 1000 + +def _s_to_dt(s: float) -> datetime: + return datetime.fromtimestamp(s, tz=UTC) + +def _extract_page_token(url: str | None) -> str | None: + if url is None: + return None + + parsed_url = urlparse(url) + params: dict[str, str] = parse_qs(parsed_url.query) #type: ignore + + return params.get("page_token") + + +async def snapshot_resources( + http: HTTPSession, + path: str, + log: Logger, +) -> AsyncGenerator[FrontResource, None]: + url = f"{API}/{path}" + + params: dict[str, str | int] = { + "limit": 100, + } + + while True: + response = Response.model_validate_json( + await http.request(log, url, params=params) + ) + + resources = response.results + + for resource in resources: + yield resource + + next_page_token = _extract_page_token(response.pagination.next) + + if next_page_token is None: + break + + params.update({ + "page_token": next_page_token, + }) + + +async def _fetch_conversations_between( + http: HTTPSession, + log: Logger, + start: datetime, + end: datetime, +) -> AsyncGenerator[FrontResource, None]: + """ + Helper method to fetch conversations in a certain date window. + """ + query_path = f"after:{_dt_to_s(start)} before:{_dt_to_s(end)}" + url = f"{API}/conversations/search/{quote(query_path)}" + + params: dict[str, str | int] = { + "limit": 100, + } + + while True: + response = Response.model_validate_json( + await http.request(log, url, params=params) + ) + + records = response.results + + for record in records: + yield record + + next_page_token = _extract_page_token(response.pagination.next) + + if next_page_token is None: + return + + params.update({ + "page_token": next_page_token, + }) + + +async def fetch_conversations( + http: HTTPSession, + log: Logger, + log_cursor: LogCursor, +) -> AsyncGenerator[FrontResource | LogCursor, None]: + """ + Fetches conversations from the previous cursor value to the present. + """ + # Conversations do not contain a field that indicate when they were updated, so there's no way of determining + # when a conversation was updated. The /conversations/search/:query endpoint lets us filter conversations + # to only those who contain messages/comments created between timestamps. + assert isinstance(log_cursor, datetime) + + # Move the cutoff a couple minutes in the past to *hopefully* avoid potential distributed clocks issues. + cutoff = datetime.now(tz=UTC) - timedelta(minutes=CONVERSATIONS_LAG) + + def _determine_next_end(dt: datetime) -> datetime: + return min(dt + timedelta(days=MAX_DATE_WINDOW_SIZE), cutoff) + + def _determine_next_start(dt: datetime) -> datetime: + # The after and before filters are inclusive per the Front docs, so the new start needs to be + # 1 millisecond (the smallest time increment in Front) than the previous end. + return dt + timedelta(milliseconds=1) + + start = _determine_next_start(log_cursor) + end = _determine_next_end(start) + while start < cutoff: + count = 0 + async for record in _fetch_conversations_between(http, log, start, end): + yield record + count += 1 + + # Checkpoint after completing a date window. + yield end + log.info(f"Fetched {count} conversations between {start} and {end}.") + + start = _determine_next_start(end) + end = _determine_next_end(start) + + +async def fetch_resources_with_cursor_fields( + http: HTTPSession, + path: str, + q_filter: str, + sort_by: str, + model: type[FrontResource], + cursor_field: str, + log: Logger, + log_cursor: LogCursor, +) -> AsyncGenerator[FrontResource | LogCursor, None]: + assert isinstance(log_cursor, datetime) + + url = f"{API}/{path}" + previous_cursor_ts = _dt_to_s(log_cursor) + last_seen_ts = previous_cursor_ts + MIN_CHECKPOINT_INTERVAL = 100 + + params = { + f"q[{q_filter}]": previous_cursor_ts, + "limit": 100, + "sort_by": sort_by, + "sort_order": "asc", + } + + count = 0 + + while True: + response = Response.model_validate_json( + await http.request(log, url, params=params) + ) + + records = response.results + + for record in records: + document = model.model_validate(record.model_dump()) + ts: float = getattr(document, cursor_field) + if ts > last_seen_ts: + # Checkpoint the last timestamp we saw in this sweep after MIN_CHECKPOINT_INTERVAL documents are yielded. + if count >= MIN_CHECKPOINT_INTERVAL: + dt = _s_to_dt(last_seen_ts) + log.info(f"Updating checkpoint to {dt}.") + yield dt + count = 0 + + last_seen_ts = ts + if ts > previous_cursor_ts: + yield document + count += 1 + + next_page_token = _extract_page_token(response.pagination.next) + + if next_page_token is None: + break + + params.update({ + "page_token": next_page_token, + }) + + if last_seen_ts > previous_cursor_ts: + yield _s_to_dt(last_seen_ts) diff --git a/source-front/source_front/manifest.yaml b/source-front/source_front/manifest.yaml deleted file mode 100644 index 08daa11f2e..0000000000 --- a/source-front/source_front/manifest.yaml +++ /dev/null @@ -1,2473 +0,0 @@ -check: - stream_names: - - accounts - type: CheckStream -definitions: - base_requester: - authenticator: - api_token: '{{ config["api_key"] }}' - type: BearerAuthenticator - type: HttpRequester - url_base: https://api2.frontapp.com/ - streams: - accounts: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: accounts - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: accounts - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/accounts' - type: InlineSchemaLoader - type: DeclarativeStream - accounts_contacts: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: accounts_contacts - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: account_id - stream: - $ref: '#/definitions/streams/accounts' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: accounts/{{ stream_partition.account_id }}/contacts - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/accounts_contacts' - type: InlineSchemaLoader - type: DeclarativeStream - channels: - name: channels - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: channels - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/channels' - type: InlineSchemaLoader - type: DeclarativeStream - company_tags: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: company_tags - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: teammate_id - stream: - $ref: '#/definitions/streams/teammates' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: company/tags - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/company_tags' - type: InlineSchemaLoader - type: DeclarativeStream - contact_groups: - name: contact_groups - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: contact_groups - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/contact_groups' - type: InlineSchemaLoader - type: DeclarativeStream - contacts: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: contacts - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: contacts - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/contacts' - type: InlineSchemaLoader - type: DeclarativeStream - contacts_notes: - primary_key: - - contact_id - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: created_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: contacts_notes - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: contact_id - stream: - $ref: '#/definitions/streams/contacts' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: contacts/{{ stream_partition.contact_id }}/notes - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/contacts_notes' - type: InlineSchemaLoader - type: DeclarativeStream - transformations: - - type: AddFields - fields: - - path: [ "contact_id" ] - value: '{{ stream_partition[''contact_id''] }}' - conversations: - incremental_sync: - cursor_datetime_formats: - - '%ms' - - '%s' - cursor_field: created_at - datetime_format: '%ms' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: conversations - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: conversations - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/conversations' - type: InlineSchemaLoader - type: DeclarativeStream - conversations_drafts: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: created_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: conversations_drafts - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: conversation_id - stream: - $ref: '#/definitions/streams/conversations' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: conversations/{{ stream_partition.conversation_id }}/drafts - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/conversations_drafts' - type: InlineSchemaLoader - type: DeclarativeStream - conversations_events: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: emitted_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: conversations_events - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: conversation_id - stream: - $ref: '#/definitions/streams/conversations' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: conversations/{{ stream_partition.conversation_id }}/events - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/conversations_events' - type: InlineSchemaLoader - type: DeclarativeStream - conversations_followers: - name: conversations_followers - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: conversation_id - stream: - $ref: '#/definitions/streams/conversations' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: conversations/{{ stream_partition.conversation_id }}/followers - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/conversations_followers' - type: InlineSchemaLoader - type: DeclarativeStream - conversations_inboxes: - name: conversations_inboxes - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: conversation_id - stream: - $ref: '#/definitions/streams/conversations' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: conversations/{{ stream_partition.conversation_id }}/inboxes - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/conversations_inboxes' - type: InlineSchemaLoader - type: DeclarativeStream - conversations_messages: - incremental_sync: - cursor_datetime_formats: - - '%ms' - - '%s' - cursor_field: created_at - datetime_format: '%ms' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: conversations_messages - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: conversation_id - stream: - $ref: '#/definitions/streams/conversations' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: conversations/{{ stream_partition.conversation_id }}/messages - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/conversations_messages' - type: InlineSchemaLoader - type: DeclarativeStream - events: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: emitted_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: events - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: events - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/events' - type: InlineSchemaLoader - type: DeclarativeStream - inboxes: - name: inboxes - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: inboxes - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/inboxes' - type: InlineSchemaLoader - type: DeclarativeStream - inboxes_channels: - name: inboxes_channels - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: inbox_id - stream: - $ref: '#/definitions/streams/inboxes' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: inboxes/{{ stream_partition.inbox_id }}/channels - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/inboxes_channels' - type: InlineSchemaLoader - type: DeclarativeStream - inboxes_conversations: - incremental_sync: - cursor_datetime_formats: - - '%ms' - - '%s' - cursor_field: created_at - datetime_format: '%ms' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: inboxes_conversations - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: inbox_id - stream: - $ref: '#/definitions/streams/inboxes' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: inboxes/{{ stream_partition.inbox_id }}/conversations - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/inboxes_conversations' - type: InlineSchemaLoader - type: DeclarativeStream - inboxes_teammates: - name: inboxes_teammates - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: inbox_id - stream: - $ref: '#/definitions/streams/inboxes' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: inboxes/{{ stream_partition.inbox_id }}/teammates - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/inboxes_teammates' - type: InlineSchemaLoader - type: DeclarativeStream - knowledge_bases: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: knowledge_bases - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: knowledge_bases - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/knowledge_bases' - type: InlineSchemaLoader - type: DeclarativeStream - knowledge_bases_articles: - primary_key: - - id - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: knowledge_bases_articles - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: knowledge_base_id - stream: - $ref: '#/definitions/streams/knowledge_bases' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: knowledge_bases/{{ stream_partition.knowledge_base_id }}/articles - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/knowledge_bases_articles' - type: InlineSchemaLoader - type: DeclarativeStream - knowledge_bases_categories: - primary_key: - - id - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: knowledge_bases_categories - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: knowledge_base_id - stream: - $ref: '#/definitions/streams/knowledge_bases' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: knowledge_bases/{{ stream_partition.knowledge_base_id }}/categories - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/knowledge_bases_categories' - type: InlineSchemaLoader - type: DeclarativeStream - links: - name: links - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: links - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/links' - type: InlineSchemaLoader - type: DeclarativeStream - message_template_folders: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: message_template_folders - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: message_template_folders - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/message_template_folders' - type: InlineSchemaLoader - type: DeclarativeStream - message_templates: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: message_templates - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: message_templates - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/message_templates' - type: InlineSchemaLoader - type: DeclarativeStream - tags: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: tags - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: tags - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/tags' - type: InlineSchemaLoader - type: DeclarativeStream - tags_children: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: tags_children - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: tag_id - stream: - $ref: '#/definitions/streams/tags' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: tags/{{ stream_partition.tag_id }}/children - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/tags_children' - type: InlineSchemaLoader - type: DeclarativeStream - teammates: - name: teammates - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: teammates - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/teammates' - type: InlineSchemaLoader - type: DeclarativeStream - teammates_contact_groups: - name: teammates_contact_groups - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: teammate_id - stream: - $ref: '#/definitions/streams/teammates' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: teammates/{{ stream_partition.teammate_id }}/contact_groups - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/teammates_contact_groups' - type: InlineSchemaLoader - type: DeclarativeStream - teammates_message_templates: - name: teammates_message_templates - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: teammate_id - stream: - $ref: '#/definitions/streams/teammates' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: teammates/{{ stream_partition.teammate_id }}/message_templates - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/teammates_message_templates' - type: InlineSchemaLoader - type: DeclarativeStream - teammates_tags: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: teammates_tags - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: teammate_id - stream: - $ref: '#/definitions/streams/teammates' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: teammates/{{ stream_partition.teammate_id }}/tags - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/teammates_tags' - type: InlineSchemaLoader - type: DeclarativeStream - teams: - name: teams - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: teams - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/teams' - type: InlineSchemaLoader - type: DeclarativeStream - teams_contact_groups: - name: teams_contact_groups - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: team_id - stream: - $ref: '#/definitions/streams/teams' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: teams/{{ stream_partition.team_id }}/contact_groups - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/teams_contact_groups' - type: InlineSchemaLoader - type: DeclarativeStream - teams_message_templates: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: teams_message_templates - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: team_id - stream: - $ref: '#/definitions/streams/teams' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: teams/{{ stream_partition.team_id }}/message_templates - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/teams_message_templates' - type: InlineSchemaLoader - type: DeclarativeStream - teams_signatures: - name: teams_signatures - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: team_id - stream: - $ref: '#/definitions/streams/teams' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: teams/{{ stream_partition.team_id }}/signatures - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/teams_signatures' - type: InlineSchemaLoader - type: DeclarativeStream - teams_tags: - incremental_sync: - cursor_datetime_formats: - - '%s' - - '%ms' - cursor_field: updated_at - datetime_format: '%s' - end_datetime: - datetime: '{{ now_utc().strftime(''%Y-%m-%dT%H:%M:%SZ'') }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - start_datetime: - datetime: '{{ config["start_date"] }}' - datetime_format: '%Y-%m-%dT%H:%M:%SZ' - type: MinMaxDatetime - type: DatetimeBasedCursor - name: teams_tags - primary_key: - - id - retriever: - paginator: - page_token_option: - type: RequestPath - pagination_strategy: - cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' - stop_condition: '{{ not response.get(''_pagination'', {}).get(''next'') - }}' - type: CursorPagination - type: DefaultPaginator - partition_router: - parent_stream_configs: - - parent_key: id - partition_field: team_id - stream: - $ref: '#/definitions/streams/teams' - type: ParentStreamConfig - type: SubstreamPartitionRouter - record_selector: - extractor: - field_path: - - _results - type: DpathExtractor - type: RecordSelector - requester: - $ref: '#/definitions/base_requester' - error_handler: - error_handlers: - - backoff_strategies: - - factor: 2 - type: ExponentialBackoffStrategy - max_retries: 3 - response_filters: - - action: RATE_LIMITED - error_message: Rate limit hit - http_codes: - - 429 - type: HttpResponseFilter - type: DefaultErrorHandler - type: CompositeErrorHandler - http_method: GET - path: teams/{{ stream_partition.team_id }}/tags - request_parameters: - limit: '{{ config[''page_limit''] }}' - type: SimpleRetriever - schema_loader: - schema: - $ref: '#/schemas/teams_tags' - type: InlineSchemaLoader - type: DeclarativeStream -description: 'Website: https://app.frontapp.com/ - - Auth page: https://dev.frontapp.com/docs/create-and-revoke-api-tokens - - API Docs: https://dev.frontapp.com/reference/introduction' - -schemas: - accounts: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - accounts_contacts: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - channels: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - company_tags: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - contact_groups: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - contacts: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - contacts_notes: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - contact_id: - type: string - required: - - contact_id - type: object - conversations: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - conversations_drafts: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - conversations_events: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - conversations_followers: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - conversations_inboxes: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: - - string - required: - - id - type: object - conversations_messages: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - events: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - inboxes: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - inboxes_channels: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - inboxes_conversations: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - inboxes_teammates: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - knowledge_bases: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - knowledge_bases_articles: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - knowledge_bases_categories: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - links: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - message_template_folders: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - message_templates: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - tags: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - tags_children: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - teammates: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - teammates_contact_groups: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - teammates_message_templates: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - teammates_tags: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - teams: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - teams_contact_groups: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: - - string - type: object - required: - - id - teams_message_templates: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - teams_signatures: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object - teams_tags: - $schema: http://json-schema.org/schema# - additionalProperties: true - properties: - id: - type: string - required: - - id - type: object -spec: - connection_specification: - $schema: http://json-schema.org/draft-07/schema# - additionalProperties: true - properties: - api_key: - airbyte_secret: true - order: 0 - title: API Key - type: string - page_limit: - default: '50' - description: Page limit for the responses - order: 2 - title: Page limit - type: string - start_date: - format: date-time - order: 1 - pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ - title: Start date - type: string - required: - - api_key - - start_date - type: object - type: Spec -streams: -- $ref: '#/definitions/streams/events' -- $ref: '#/definitions/streams/inboxes' -- $ref: '#/definitions/streams/inboxes_channels' -- $ref: '#/definitions/streams/inboxes_conversations' -- $ref: '#/definitions/streams/inboxes_teammates' -- $ref: '#/definitions/streams/conversations' -- $ref: '#/definitions/streams/conversations_events' -- $ref: '#/definitions/streams/conversations_followers' -- $ref: '#/definitions/streams/conversations_inboxes' -- $ref: '#/definitions/streams/conversations_messages' -- $ref: '#/definitions/streams/links' -- $ref: '#/definitions/streams/accounts' -- $ref: '#/definitions/streams/accounts_contacts' -- $ref: '#/definitions/streams/contacts' -- $ref: '#/definitions/streams/channels' -- $ref: '#/definitions/streams/company_tags' -- $ref: '#/definitions/streams/teammates' -- $ref: '#/definitions/streams/tags' -- $ref: '#/definitions/streams/tags_children' -- $ref: '#/definitions/streams/teammates_tags' -- $ref: '#/definitions/streams/teams' -- $ref: '#/definitions/streams/teams_tags' -- $ref: '#/definitions/streams/contact_groups' -- $ref: '#/definitions/streams/conversations_drafts' -- $ref: '#/definitions/streams/contacts_notes' -- $ref: '#/definitions/streams/teammates_contact_groups' -- $ref: '#/definitions/streams/teams_contact_groups' -- $ref: '#/definitions/streams/knowledge_bases' -- $ref: '#/definitions/streams/knowledge_bases_articles' -- $ref: '#/definitions/streams/knowledge_bases_categories' -- $ref: '#/definitions/streams/message_template_folders' -- $ref: '#/definitions/streams/teams_signatures' -- $ref: '#/definitions/streams/message_templates' -- $ref: '#/definitions/streams/teammates_message_templates' -- $ref: '#/definitions/streams/teams_message_templates' -type: DeclarativeSource -version: 4.6.2 diff --git a/source-front/source_front/models.py b/source-front/source_front/models.py new file mode 100644 index 0000000000..36c8ab2a3c --- /dev/null +++ b/source-front/source_front/models.py @@ -0,0 +1,90 @@ +from datetime import datetime, UTC +from pydantic import AwareDatetime, BaseModel, Field + +from estuary_cdk.capture.common import ( + BaseDocument, + ResourceConfig, + ResourceState, +) +from estuary_cdk.capture.common import ( + ConnectorState as GenericConnectorState, +) +from estuary_cdk.flow import AccessToken + + +# Front was founded in 2013, so having a start date before then should capture all available data. +def default_start_date(): + dt = datetime(year=2000, month=1, day=1, tzinfo=UTC) + return dt + + +class EndpointConfig(BaseModel): + start_date: AwareDatetime = Field( + description="UTC date and time in the format YYYY-MM-DDTHH:MM:SSZ. Any event data generated before this date will not be replicated. If left blank, all available data will be captured.", + title="Start Date", + default_factory=default_start_date, + ) + credentials: AccessToken = Field( + title="Authentication", + ) + + +ConnectorState = GenericConnectorState[ResourceState] + + +class FrontResource(BaseDocument, extra="allow"): + pass + + +class Contact(FrontResource): + id: str + updated_at: float + + +class Event(FrontResource): + id: str + emitted_at: float + + +class Conversation(FrontResource): + id: str + + +class Pagination(BaseModel, extra="forbid"): + next: str | None + + +class Links(BaseModel, extra="forbid"): + self: str + + +class Response(BaseModel, extra="forbid"): + # The top level fields in each response have leading underscores. Pydantic treats + # attributes with leading underscores as private & doesn't include them in the model. + # So we have to use aliases in the Pydantic model so these fields are included in + # model without underscores & we can access them. + links: Links = Field(..., alias='_links') + results: list[FrontResource] = Field(..., alias='_results') + pagination: Pagination = Field(..., alias='_pagination') + total: int | None = Field(None, alias='_total') + + +# Resources that only support full refresh & do not support pagination. +FULL_REFRESH_RESOURCES: list[str] = [ + 'channels', + 'inboxes', + "tags", + "teammates", + "teams", +] + +# Resources that contain cursor fields in their records. Each tuple contains: +# - resource name +# - q filter query param +# - sort_by query param +# - document model +# - cursor field within each record +INCREMENTAL_RESOURCES_WITH_CURSOR_FIELDS: list[tuple[str, str, str, type[FrontResource], str]] = [ + ("events", "after", "created_at", Event, "emitted_at"), + ("contacts", "updated_after", "updated_at", Contact, "updated_at"), +] diff --git a/source-front/source_front/resources.py b/source-front/source_front/resources.py new file mode 100644 index 0000000000..551273591b --- /dev/null +++ b/source-front/source_front/resources.py @@ -0,0 +1,195 @@ +from datetime import datetime, timedelta, UTC +import functools +from logging import Logger + +from estuary_cdk.flow import CaptureBinding, ValidationError +from estuary_cdk.capture import common, Task +from estuary_cdk.http import HTTPMixin, TokenSource, HTTPError + + +from .models import ( + EndpointConfig, + ResourceConfig, + ResourceState, + FrontResource, + Conversation, + FULL_REFRESH_RESOURCES, + INCREMENTAL_RESOURCES_WITH_CURSOR_FIELDS, +) +from .api import ( + snapshot_resources, + fetch_resources_with_cursor_fields, + fetch_conversations, + API, + CONVERSATIONS_LAG +) + + +async def validate_credentials( + log: Logger, http: HTTPMixin, config: EndpointConfig +): + """ + Validates that the provided access token is a valid Front access token. + """ + http.token_source = TokenSource(oauth_spec=None, credentials=config.credentials) + url = f"{API}/accounts" + + try: + await http.request(log, url) + except HTTPError as err: + msg = 'Unknown error occurred.' + if err.code == 401: + msg = f"Invalid access token. Please confirm the provided access token is correct.\n\n{err.message}" + else: + msg = f"Encountered error validating access token.\n\n{err.message}" + + raise ValidationError([msg]) + + +def full_refresh_resources( + log: Logger, http: HTTPMixin, config: EndpointConfig +) -> list[common.Resource]: + + def open( + path: str, + binding: CaptureBinding[ResourceConfig], + binding_index: int, + state: ResourceState, + task: Task, + all_bindings + ): + common.open_binding( + binding, + binding_index, + state, + task, + fetch_snapshot=functools.partial( + snapshot_resources, + http, + path, + ), + tombstone=FrontResource(_meta=FrontResource.Meta(op="d")) + ) + + resources = [ + common.Resource( + name=name, + key=["/_meta/row_id"], + model=FrontResource, + open=functools.partial(open, name), + initial_state=ResourceState(), + initial_config=ResourceConfig( + name=name, interval=timedelta(minutes=5) + ), + schema_inference=True, + ) + for (name) in FULL_REFRESH_RESOURCES + ] + + return resources + + +def incremental_resources_with_cursor_fields( + log: Logger, http: HTTPMixin, config: EndpointConfig +) -> list[common.Resource]: + def open( + name: str, + q_filter: str, + sort_by: str, + model : type[FrontResource], + cursor_field: str, + binding: CaptureBinding[ResourceConfig], + binding_index: int, + state: ResourceState, + task: Task, + all_bindings + ): + common.open_binding( + binding, + binding_index, + state, + task, + fetch_changes=functools.partial( + fetch_resources_with_cursor_fields, + http, + name, + q_filter, + sort_by, + model, + cursor_field, + ) + ) + + resources = [ + common.Resource( + name=name, + key=["/id"], + model=model, + open=functools.partial(open, name, q_filter, sort_by, model, cursor_field), + initial_state=ResourceState( + inc=ResourceState.Incremental(cursor=config.start_date), + ), + initial_config=ResourceConfig( + name=name, interval=timedelta(minutes=5) + ), + schema_inference=True, + ) + for (name, q_filter, sort_by, model, cursor_field) in INCREMENTAL_RESOURCES_WITH_CURSOR_FIELDS + ] + + return resources + + +def conversations( + log: Logger, http: HTTPMixin, config: EndpointConfig +) -> list[common.Resource]: + def open( + binding: CaptureBinding[ResourceConfig], + binding_index: int, + state: ResourceState, + task: Task, + all_bindings + ): + common.open_binding( + binding, + binding_index, + state, + task, + fetch_changes=functools.partial( + fetch_conversations, + http, + ) + ) + + # Avoid querying for data less than a few minutes old to *hopefully* avoid distributed clock issues. + start = min(config.start_date, datetime.now(tz=UTC) - timedelta(minutes=CONVERSATIONS_LAG)) + + conversation = [ + common.Resource( + name="conversations", + key=["/id"], + model=Conversation, + open=open, + initial_state=ResourceState( + inc=ResourceState.Incremental(cursor=start), + ), + initial_config=ResourceConfig( + name="conversations", interval=timedelta(minutes=5 + CONVERSATIONS_LAG) + ), + schema_inference=True, + ) + ] + + return conversation + + +async def all_resources( + log: Logger, http: HTTPMixin, config: EndpointConfig +) -> list[common.Resource]: + http.token_source = TokenSource(oauth_spec=None, credentials=config.credentials) + + return [ + *full_refresh_resources(log, http, config), + *incremental_resources_with_cursor_fields(log, http, config), + *conversations(log, http, config), + ] diff --git a/source-front/source_front/source.py b/source-front/source_front/source.py deleted file mode 100644 index bb6c460afe..0000000000 --- a/source-front/source_front/source.py +++ /dev/null @@ -1,18 +0,0 @@ -# -# Copyright (c) 2024 Airbyte, Inc., all rights reserved. -# - -from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource - -""" -This file provides the necessary constructs to interpret a provided declarative YAML configuration file into -source connector. - -WARNING: Do not modify this file. -""" - - -# Declarative Source -class SourceFront(YamlDeclarativeSource): - def __init__(self): - super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/source-front/test.flow.yaml b/source-front/test.flow.yaml index ed25ce9446..d2dce5e13f 100644 --- a/source-front/test.flow.yaml +++ b/source-front/test.flow.yaml @@ -9,189 +9,37 @@ captures: - python - "-m" - source_front - config: - api_key: redacted - start_date: "2024-01-01T12:00:00Z" + config: config.yaml bindings: - resource: - stream: events - syncMode: incremental - cursorField: - - emitted_at - target: acmeCo/events - - resource: - stream: inboxes - syncMode: full_refresh - target: acmeCo/inboxes - - resource: - stream: inboxes_channels - syncMode: full_refresh - target: acmeCo/inboxes_channels - - resource: - stream: inboxes_conversations - syncMode: incremental - cursorField: - - created_at - target: acmeCo/inboxes_conversations - - resource: - stream: inboxes_teammates - syncMode: full_refresh - target: acmeCo/inboxes_teammates - - resource: - stream: conversations - syncMode: incremental - cursorField: - - created_at - target: acmeCo/conversations - - resource: - stream: conversations_events - syncMode: incremental - cursorField: - - emitted_at - target: acmeCo/conversations_events - - resource: - stream: conversations_followers - syncMode: full_refresh - target: acmeCo/conversations_followers - - resource: - stream: conversations_inboxes - syncMode: full_refresh - target: acmeCo/conversations_inboxes - - resource: - stream: conversations_messages - syncMode: incremental - cursorField: - - created_at - target: acmeCo/conversations_messages - - resource: - stream: links - syncMode: full_refresh - target: acmeCo/links - - resource: - stream: accounts - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/accounts - - resource: - stream: accounts_contacts - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/accounts_contacts - - resource: - stream: contacts - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/contacts - - resource: - stream: channels - syncMode: full_refresh + name: channels + interval: PT5M target: acmeCo/channels - resource: - stream: company_tags - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/company_tags - - resource: - stream: teammates - syncMode: full_refresh - target: acmeCo/teammates + name: inboxes + interval: PT5M + target: acmeCo/inboxes - resource: - stream: tags - syncMode: incremental - cursorField: - - updated_at + name: tags + interval: PT5M target: acmeCo/tags - resource: - stream: tags_children - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/tags_children - - resource: - stream: teammates_tags - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/teammates_tags + name: teammates + interval: PT5M + target: acmeCo/teammates - resource: - stream: teams - syncMode: full_refresh + name: teams + interval: PT5M target: acmeCo/teams - resource: - stream: teams_tags - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/teams_tags - - resource: - stream: contact_groups - syncMode: full_refresh - target: acmeCo/contact_groups - - resource: - stream: conversations_drafts - syncMode: incremental - cursorField: - - created_at - target: acmeCo/conversations_drafts - - resource: - stream: contacts_notes - syncMode: incremental - cursorField: - - created_at - target: acmeCo/contacts_notes - - resource: - stream: teammates_contact_groups - syncMode: full_refresh - target: acmeCo/teammates_contact_groups - - resource: - stream: teams_contact_groups - syncMode: full_refresh - target: acmeCo/teams_contact_groups - - resource: - stream: knowledge_bases - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/knowledge_bases - - resource: - stream: knowledge_bases_articles - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/knowledge_bases_articles - - resource: - stream: knowledge_bases_categories - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/knowledge_bases_categories - - resource: - stream: message_template_folders - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/message_template_folders - - resource: - stream: teams_signatures - syncMode: full_refresh - target: acmeCo/teams_signatures - - resource: - stream: message_templates - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/message_templates + name: events + interval: PT5M + target: acmeCo/events - resource: - stream: teammates_message_templates - syncMode: full_refresh - target: acmeCo/teammates_message_templates + name: contacts + interval: PT5M + target: acmeCo/contacts - resource: - stream: teams_message_templates - syncMode: incremental - cursorField: - - updated_at - target: acmeCo/teams_message_templates + name: conversations + interval: PT7M + target: acmeCo/conversations diff --git a/source-front/tests/snapshots/snapshots__capture__capture.stdout.json b/source-front/tests/snapshots/snapshots__capture__capture.stdout.json new file mode 100644 index 0000000000..f04fd580eb --- /dev/null +++ b/source-front/tests/snapshots/snapshots__capture__capture.stdout.json @@ -0,0 +1,177 @@ +[ + [ + "acmeCo/channels", + { + "_links": { + "related": { + "inbox": "https://estuary3f31.api.frontapp.com/inboxes/inb_fa4ym", + "owner": "https://estuary3f31.api.frontapp.com/teams/tim_77yhq" + }, + "self": "https://estuary3f31.api.frontapp.com/channels/cha_ilx26" + }, + "_meta": { + "op": "c", + "row_id": 0, + "uuid": "DocUUIDPlaceholder-329Bb50aa48EAa9ef" + }, + "address": "ilx26-2c856a1064fcb617fd7f@in.frontapp.com", + "id": "cha_ilx26", + "is_private": false, + "is_valid": true, + "name": "mylittleshop@yourfictionalcompany.com", + "send_as": "mylittleshop@yourfictionalcompany.com", + "settings": { + "all_teammates_can_reply": false, + "undo_send_time": 0 + }, + "type": "smtp" + } + ], + [ + "acmeCo/inboxes", + { + "_links": { + "related": { + "channels": "https://estuary3f31.api.frontapp.com/inboxes/inb_fa4ym/channels", + "conversations": "https://estuary3f31.api.frontapp.com/inboxes/inb_fa4ym/conversations", + "owner": "https://estuary3f31.api.frontapp.com/teams/tim_77yhq", + "teammates": "https://estuary3f31.api.frontapp.com/inboxes/inb_fa4ym/teammates" + }, + "self": "https://estuary3f31.api.frontapp.com/inboxes/inb_fa4ym" + }, + "_meta": { + "op": "c", + "row_id": 0, + "uuid": "DocUUIDPlaceholder-329Bb50aa48EAa9ef" + }, + "address": "ilx26-2c856a1064fcb617fd7f@in.frontapp.com", + "custom_fields": {}, + "id": "inb_fa4ym", + "is_private": false, + "is_public": true, + "name": "[Demo] Support", + "send_as": "mylittleshop@yourfictionalcompany.com", + "type": "smtp" + } + ], + [ + "acmeCo/tags", + { + "_links": { + "related": { + "children": null, + "conversations": "https://estuary3f31.api.frontapp.com/tags/tag_5632ou/conversations", + "owner": null, + "parent_tag": null + }, + "self": "https://estuary3f31.api.frontapp.com/tags/tag_5632ou" + }, + "_meta": { + "op": "c", + "row_id": 0, + "uuid": "DocUUIDPlaceholder-329Bb50aa48EAa9ef" + }, + "created_at": 1731619498.317, + "description": "Example company tag for testing", + "highlight": "blue", + "id": "tag_5632ou", + "is_private": false, + "is_visible_in_conversation_lists": true, + "name": "Company Tag 1", + "updated_at": 1731619626.677 + } + ], + [ + "acmeCo/teammates", + { + "_links": { + "related": { + "conversations": "https://estuary3f31.api.frontapp.com/teammates/tea_h5s7y/conversations", + "inboxes": "https://estuary3f31.api.frontapp.com/teammates/tea_h5s7y/inboxes" + }, + "self": "https://estuary3f31.api.frontapp.com/teammates/tea_h5s7y" + }, + "_meta": { + "op": "c", + "row_id": 0, + "uuid": "DocUUIDPlaceholder-329Bb50aa48EAa9ef" + }, + "custom_fields": {}, + "email": "alexb@estuary.dev", + "first_name": "Alex", + "id": "tea_h5s7y", + "is_admin": true, + "is_available": true, + "is_blocked": false, + "last_name": "Bair", + "username": "alexb" + } + ], + [ + "acmeCo/teams", + { + "_links": { + "self": "https://estuary3f31.api.frontapp.com/teams/tim_77yfy" + }, + "_meta": { + "op": "c", + "row_id": 0, + "uuid": "DocUUIDPlaceholder-329Bb50aa48EAa9ef" + }, + "id": "tim_77yfy", + "name": "Estuary" + } + ], + [ + "acmeCo/conversations", + { + "_links": { + "related": { + "comments": "https://estuary3f31.api.frontapp.com/conversations/cnv_1dwxv53y/comments", + "events": "https://estuary3f31.api.frontapp.com/conversations/cnv_1dwxv53y/events", + "followers": "https://estuary3f31.api.frontapp.com/conversations/cnv_1dwxv53y/followers", + "inboxes": "https://estuary3f31.api.frontapp.com/conversations/cnv_1dwxv53y/inboxes", + "last_message": null, + "messages": "https://estuary3f31.api.frontapp.com/conversations/cnv_1dwxv53y/messages" + }, + "self": "https://estuary3f31.api.frontapp.com/conversations/cnv_1dwxv53y" + }, + "_meta": { + "uuid": "DocUUIDPlaceholder-329Bb50aa48EAa9ef" + }, + "assignee": null, + "created_at": 1731600573.116, + "custom_fields": {}, + "id": "cnv_1dwxv53y", + "is_private": false, + "links": [], + "metadata": {}, + "recipient": null, + "scheduled_reminders": [], + "status": "unassigned", + "subject": "example subject 1", + "tags": [ + { + "_links": { + "related": { + "children": null, + "conversations": "https://estuary3f31.api.frontapp.com/tags/tag_55x6hq/conversations", + "owner": "https://estuary3f31.api.frontapp.com/teammates/tea_h5s7y", + "parent_tag": null + }, + "self": "https://estuary3f31.api.frontapp.com/tags/tag_55x6hq" + }, + "created_at": 1731514012.364, + "description": null, + "highlight": null, + "id": "tag_55x6hq", + "is_private": true, + "is_visible_in_conversation_lists": false, + "name": "Inbox", + "updated_at": 1731514012.364 + } + ], + "waiting_since": 1731600573.113 + } + ] +] diff --git a/source-front/tests/snapshots/snapshots__discover__capture.stdout.json b/source-front/tests/snapshots/snapshots__discover__capture.stdout.json index e449538ec3..a6fd7161da 100644 --- a/source-front/tests/snapshots/snapshots__discover__capture.stdout.json +++ b/source-front/tests/snapshots/snapshots__discover__capture.stdout.json @@ -1,437 +1,315 @@ [ { - "recommendedName": "events", + "recommendedName": "channels", "resourceConfig": { - "stream": "events", - "syncMode": "incremental", - "cursorField": [ - "emitted_at" - ] + "name": "channels", + "interval": "PT5M" }, "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", + "$defs": { + "Meta": { "properties": { + "op": { + "default": "u", + "description": "Operation type (c: Create, u: Update, d: Delete)", + "enum": [ + "c", + "u", + "d" + ], + "title": "Op", + "type": "string" + }, "row_id": { + "default": -1, + "description": "Row ID of the Document, counting up from zero, or -1 if not known", + "title": "Row Id", "type": "integer" } }, - "required": [ - "row_id" - ] + "title": "Meta", + "type": "object" } }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "inboxes", - "resourceConfig": { - "stream": "inboxes", - "syncMode": "full_refresh" - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", "additionalProperties": true, "properties": { - "id": { - "type": "string" - }, "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } + "$ref": "#/$defs/Meta", + "default": { + "op": "u", + "row_id": -1 }, - "required": [ - "row_id" - ] + "description": "Document metadata" } }, - "required": [ - "id" - ], + "title": "FrontResource", "type": "object", "x-infer-schema": true }, "key": [ - "/id" + "/_meta/row_id" ] }, { - "recommendedName": "inboxes_channels", + "recommendedName": "inboxes", "resourceConfig": { - "stream": "inboxes_channels", - "syncMode": "full_refresh" + "name": "inboxes", + "interval": "PT5M" }, "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", + "$defs": { + "Meta": { "properties": { + "op": { + "default": "u", + "description": "Operation type (c: Create, u: Update, d: Delete)", + "enum": [ + "c", + "u", + "d" + ], + "title": "Op", + "type": "string" + }, "row_id": { + "default": -1, + "description": "Row ID of the Document, counting up from zero, or -1 if not known", + "title": "Row Id", "type": "integer" } }, - "required": [ - "row_id" - ] + "title": "Meta", + "type": "object" } }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "inboxes_conversations", - "resourceConfig": { - "stream": "inboxes_conversations", - "syncMode": "incremental", - "cursorField": [ - "created_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", "additionalProperties": true, "properties": { - "id": { - "type": "string" - }, "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } + "$ref": "#/$defs/Meta", + "default": { + "op": "u", + "row_id": -1 }, - "required": [ - "row_id" - ] + "description": "Document metadata" } }, - "required": [ - "id" - ], + "title": "FrontResource", "type": "object", "x-infer-schema": true }, "key": [ - "/id" + "/_meta/row_id" ] }, { - "recommendedName": "inboxes_teammates", + "recommendedName": "tags", "resourceConfig": { - "stream": "inboxes_teammates", - "syncMode": "full_refresh" + "name": "tags", + "interval": "PT5M" }, "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", + "$defs": { + "Meta": { "properties": { + "op": { + "default": "u", + "description": "Operation type (c: Create, u: Update, d: Delete)", + "enum": [ + "c", + "u", + "d" + ], + "title": "Op", + "type": "string" + }, "row_id": { + "default": -1, + "description": "Row ID of the Document, counting up from zero, or -1 if not known", + "title": "Row Id", "type": "integer" } }, - "required": [ - "row_id" - ] + "title": "Meta", + "type": "object" } }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "conversations", - "resourceConfig": { - "stream": "conversations", - "syncMode": "incremental", - "cursorField": [ - "created_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", "additionalProperties": true, "properties": { - "id": { - "type": "string" - }, "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } + "$ref": "#/$defs/Meta", + "default": { + "op": "u", + "row_id": -1 }, - "required": [ - "row_id" - ] + "description": "Document metadata" } }, - "required": [ - "id" - ], + "title": "FrontResource", "type": "object", "x-infer-schema": true }, "key": [ - "/id" + "/_meta/row_id" ] }, { - "recommendedName": "conversations_events", + "recommendedName": "teammates", "resourceConfig": { - "stream": "conversations_events", - "syncMode": "incremental", - "cursorField": [ - "emitted_at" - ] + "name": "teammates", + "interval": "PT5M" }, "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", + "$defs": { + "Meta": { "properties": { + "op": { + "default": "u", + "description": "Operation type (c: Create, u: Update, d: Delete)", + "enum": [ + "c", + "u", + "d" + ], + "title": "Op", + "type": "string" + }, "row_id": { + "default": -1, + "description": "Row ID of the Document, counting up from zero, or -1 if not known", + "title": "Row Id", "type": "integer" } }, - "required": [ - "row_id" - ] + "title": "Meta", + "type": "object" } }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "conversations_followers", - "resourceConfig": { - "stream": "conversations_followers", - "syncMode": "full_refresh" - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", "additionalProperties": true, "properties": { - "id": { - "type": "string" - }, "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } + "$ref": "#/$defs/Meta", + "default": { + "op": "u", + "row_id": -1 }, - "required": [ - "row_id" - ] + "description": "Document metadata" } }, - "required": [ - "id" - ], + "title": "FrontResource", "type": "object", "x-infer-schema": true }, "key": [ - "/id" + "/_meta/row_id" ] }, { - "recommendedName": "conversations_inboxes", + "recommendedName": "teams", "resourceConfig": { - "stream": "conversations_inboxes", - "syncMode": "full_refresh" + "name": "teams", + "interval": "PT5M" }, "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": [ - "string" - ] - }, - "_meta": { - "type": "object", + "$defs": { + "Meta": { "properties": { + "op": { + "default": "u", + "description": "Operation type (c: Create, u: Update, d: Delete)", + "enum": [ + "c", + "u", + "d" + ], + "title": "Op", + "type": "string" + }, "row_id": { + "default": -1, + "description": "Row ID of the Document, counting up from zero, or -1 if not known", + "title": "Row Id", "type": "integer" } }, - "required": [ - "row_id" - ] + "title": "Meta", + "type": "object" } }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "conversations_messages", - "resourceConfig": { - "stream": "conversations_messages", - "syncMode": "incremental", - "cursorField": [ - "created_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", "additionalProperties": true, "properties": { - "id": { - "type": "string" - }, "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } + "$ref": "#/$defs/Meta", + "default": { + "op": "u", + "row_id": -1 }, - "required": [ - "row_id" - ] + "description": "Document metadata" } }, - "required": [ - "id" - ], + "title": "FrontResource", "type": "object", "x-infer-schema": true }, "key": [ - "/id" + "/_meta/row_id" ] }, { - "recommendedName": "links", + "recommendedName": "events", "resourceConfig": { - "stream": "links", - "syncMode": "full_refresh" + "name": "events", + "interval": "PT5M" }, "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", + "$defs": { + "Meta": { "properties": { + "op": { + "default": "u", + "description": "Operation type (c: Create, u: Update, d: Delete)", + "enum": [ + "c", + "u", + "d" + ], + "title": "Op", + "type": "string" + }, "row_id": { + "default": -1, + "description": "Row ID of the Document, counting up from zero, or -1 if not known", + "title": "Row Id", "type": "integer" } }, - "required": [ - "row_id" - ] + "title": "Meta", + "type": "object" } }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "accounts", - "resourceConfig": { - "stream": "accounts", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", "additionalProperties": true, "properties": { + "_meta": { + "$ref": "#/$defs/Meta", + "default": { + "op": "u", + "row_id": -1 + }, + "description": "Document metadata" + }, "id": { + "title": "Id", "type": "string" }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] + "emitted_at": { + "title": "Emitted At", + "type": "number" } }, "required": [ - "id" + "id", + "emitted_at" ], + "title": "Event", "type": "object", "x-infer-schema": true }, @@ -440,74 +318,61 @@ ] }, { - "recommendedName": "accounts_contacts", + "recommendedName": "contacts", "resourceConfig": { - "stream": "accounts_contacts", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] + "name": "contacts", + "interval": "PT5M" }, "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", + "$defs": { + "Meta": { "properties": { + "op": { + "default": "u", + "description": "Operation type (c: Create, u: Update, d: Delete)", + "enum": [ + "c", + "u", + "d" + ], + "title": "Op", + "type": "string" + }, "row_id": { + "default": -1, + "description": "Row ID of the Document, counting up from zero, or -1 if not known", + "title": "Row Id", "type": "integer" } }, - "required": [ - "row_id" - ] + "title": "Meta", + "type": "object" } }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "contacts", - "resourceConfig": { - "stream": "contacts", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", "additionalProperties": true, "properties": { + "_meta": { + "$ref": "#/$defs/Meta", + "default": { + "op": "u", + "row_id": -1 + }, + "description": "Document metadata" + }, "id": { + "title": "Id", "type": "string" }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] + "updated_at": { + "title": "Updated At", + "type": "number" } }, "required": [ - "id" + "id", + "updated_at" ], + "title": "Contact", "type": "object", "x-infer-schema": true }, @@ -516,774 +381,56 @@ ] }, { - "recommendedName": "channels", + "recommendedName": "conversations", "resourceConfig": { - "stream": "channels", - "syncMode": "full_refresh" + "name": "conversations", + "interval": "PT7M" }, "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", + "$defs": { + "Meta": { "properties": { + "op": { + "default": "u", + "description": "Operation type (c: Create, u: Update, d: Delete)", + "enum": [ + "c", + "u", + "d" + ], + "title": "Op", + "type": "string" + }, "row_id": { + "default": -1, + "description": "Row ID of the Document, counting up from zero, or -1 if not known", + "title": "Row Id", "type": "integer" } }, - "required": [ - "row_id" - ] + "title": "Meta", + "type": "object" } }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "company_tags", - "resourceConfig": { - "stream": "company_tags", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", "additionalProperties": true, "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "teammates", - "resourceConfig": { - "stream": "teammates", - "syncMode": "full_refresh" - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "tags", - "resourceConfig": { - "stream": "tags", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "tags_children", - "resourceConfig": { - "stream": "tags_children", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "teammates_tags", - "resourceConfig": { - "stream": "teammates_tags", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "teams", - "resourceConfig": { - "stream": "teams", - "syncMode": "full_refresh" - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "teams_tags", - "resourceConfig": { - "stream": "teams_tags", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "contact_groups", - "resourceConfig": { - "stream": "contact_groups", - "syncMode": "full_refresh" - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "conversations_drafts", - "resourceConfig": { - "stream": "conversations_drafts", - "syncMode": "incremental", - "cursorField": [ - "created_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "contacts_notes", - "resourceConfig": { - "stream": "contacts_notes", - "syncMode": "incremental", - "cursorField": [ - "created_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "contact_id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "contact_id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/contact_id" - ] - }, - { - "recommendedName": "teammates_contact_groups", - "resourceConfig": { - "stream": "teammates_contact_groups", - "syncMode": "full_refresh" - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "teams_contact_groups", - "resourceConfig": { - "stream": "teams_contact_groups", - "syncMode": "full_refresh" - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": [ - "string" - ] - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "type": "object", - "required": [ - "id" - ], - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "knowledge_bases", - "resourceConfig": { - "stream": "knowledge_bases", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "knowledge_bases_articles", - "resourceConfig": { - "stream": "knowledge_bases_articles", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "knowledge_bases_categories", - "resourceConfig": { - "stream": "knowledge_bases_categories", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "message_template_folders", - "resourceConfig": { - "stream": "message_template_folders", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "teams_signatures", - "resourceConfig": { - "stream": "teams_signatures", - "syncMode": "full_refresh" - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "message_templates", - "resourceConfig": { - "stream": "message_templates", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } + "$ref": "#/$defs/Meta", + "default": { + "op": "u", + "row_id": -1 }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "teammates_message_templates", - "resourceConfig": { - "stream": "teammates_message_templates", - "syncMode": "full_refresh" - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { - "id": { - "type": "string" + "description": "Document metadata" }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] - } - }, - "required": [ - "id" - ], - "type": "object", - "x-infer-schema": true - }, - "key": [ - "/id" - ] - }, - { - "recommendedName": "teams_message_templates", - "resourceConfig": { - "stream": "teams_message_templates", - "syncMode": "incremental", - "cursorField": [ - "updated_at" - ] - }, - "documentSchema": { - "$schema": "http://json-schema.org/schema#", - "additionalProperties": true, - "properties": { "id": { + "title": "Id", "type": "string" - }, - "_meta": { - "type": "object", - "properties": { - "row_id": { - "type": "integer" - } - }, - "required": [ - "row_id" - ] } }, "required": [ "id" ], + "title": "Conversation", "type": "object", "x-infer-schema": true }, diff --git a/source-front/tests/snapshots/snapshots__spec__capture.stdout.json b/source-front/tests/snapshots/snapshots__spec__capture.stdout.json index 56527f7939..5424f8dc30 100644 --- a/source-front/tests/snapshots/snapshots__spec__capture.stdout.json +++ b/source-front/tests/snapshots/snapshots__spec__capture.stdout.json @@ -2,78 +2,75 @@ { "protocol": 3032023, "configSchema": { - "type": "object", - "$schema": "http://json-schema.org/draft-07/schema#", - "required": [ - "api_key", - "start_date" - ], + "$defs": { + "AccessToken": { + "properties": { + "credentials_title": { + "const": "Private App Credentials", + "default": "Private App Credentials", + "enum": [ + "Private App Credentials" + ], + "title": "Credentials Title", + "type": "string" + }, + "access_token": { + "secret": true, + "title": "Access Token", + "type": "string" + } + }, + "required": [ + "access_token" + ], + "title": "AccessToken", + "type": "object" + } + }, "properties": { - "api_key": { - "type": "string", - "title": "API Key", - "airbyte_secret": true, - "order": 0 - }, "start_date": { - "type": "string", - "title": "Start date", + "description": "UTC date and time in the format YYYY-MM-DDTHH:MM:SSZ. Any event data generated before this date will not be replicated. If left blank, all available data will be captured.", "format": "date-time", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$", - "order": 1 + "title": "Start Date", + "type": "string" }, - "page_limit": { - "type": "string", - "description": "Page limit for the responses", - "title": "Page limit", - "default": "50", - "order": 2 + "credentials": { + "$ref": "#/$defs/AccessToken", + "title": "Authentication" } }, - "additionalProperties": true + "required": [ + "credentials" + ], + "title": "EndpointConfig", + "type": "object" }, "resourceConfigSchema": { "additionalProperties": false, - "description": "ResourceConfig encodes a configured resource stream", + "description": "ResourceConfig is a common resource configuration shape.", "properties": { - "stream": { - "description": "Name of this stream", - "title": "Stream", + "name": { + "description": "Name of this resource", + "title": "Name", "type": "string" }, - "syncMode": { - "description": "Sync this resource incrementally, or fully refresh it every run", - "enum": [ - "full_refresh", - "incremental" - ], - "title": "Sync Mode", + "interval": { + "default": "PT0S", + "description": "Interval between updates for this resource", + "format": "duration", + "title": "Interval", "type": "string" - }, - "namespace": { - "title": "Namespace", - "description": "Enclosing schema namespace of this resource", - "type": "string" - }, - "cursorField": { - "title": "Cursor Field", - "type": "array", - "items": { - "type": "string" - } } }, "required": [ - "stream", - "syncMode" + "name" ], "title": "ResourceConfig", "type": "object" }, - "documentationUrl": "None", + "documentationUrl": "https://go.estuary.dev/source-pendo", "resourcePathPointers": [ - "/namespace", - "/stream" + "/name" ] } ] diff --git a/source-front/tests/test_snapshots.py b/source-front/tests/test_snapshots.py index 5bb25dedbc..5167f7387d 100644 --- a/source-front/tests/test_snapshots.py +++ b/source-front/tests/test_snapshots.py @@ -2,6 +2,36 @@ import subprocess +def test_capture(request, snapshot): + result = subprocess.run( + [ + "flowctl", + "preview", + "--source", + request.fspath.dirname + "/../test.flow.yaml", + "--sessions", + "1", + "--delay", + "10s", + ], + stdout=subprocess.PIPE, + text=True, + ) + assert result.returncode == 0 + lines = [json.loads(l) for l in result.stdout.splitlines()] + + unique_stream_lines = [] + seen = set() + + for line in lines: + stream = line[0] + if stream not in seen: + unique_stream_lines.append(line) + seen.add(stream) + + assert snapshot("capture.stdout.json") == unique_stream_lines + + def test_discover(request, snapshot): result = subprocess.run( [