ingestr 0.13.49__tar.gz → 0.14.98__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ingestr might be problematic. Click here for more details.
- ingestr-0.14.98/.dlt/config.toml +3 -0
- ingestr-0.14.98/.github/workflows/release.yml +151 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/.github/workflows/tests.yml +24 -1
- {ingestr-0.13.49 → ingestr-0.14.98}/.gitignore +4 -1
- ingestr-0.14.98/Dockerfile +61 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/Makefile +14 -5
- {ingestr-0.13.49 → ingestr-0.14.98}/PKG-INFO +82 -17
- {ingestr-0.13.49 → ingestr-0.14.98}/README.md +53 -3
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/.vitepress/config.mjs +47 -10
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/commands/ingest.md +22 -0
- ingestr-0.14.98/docs/getting-started/data-masking.md +377 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/index.md +2 -2
- ingestr-0.14.98/docs/media/clickup_ingestion.png +0 -0
- ingestr-0.14.98/docs/media/cratedb-destination.png +0 -0
- ingestr-0.14.98/docs/media/cratedb-source.png +0 -0
- ingestr-0.14.98/docs/media/linear.png +0 -0
- ingestr-0.14.98/docs/media/mixpanel_ingestion.png +0 -0
- ingestr-0.14.98/docs/media/quickbook_ingestion.png +0 -0
- ingestr-0.14.98/docs/media/sftp.png +0 -0
- ingestr-0.14.98/docs/media/wise_ingestion.png +0 -0
- ingestr-0.14.98/docs/media/zoom_ingestion.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/adjust.md +14 -9
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/airtable.md +22 -5
- ingestr-0.14.98/docs/supported-sources/allium.md +164 -0
- ingestr-0.14.98/docs/supported-sources/anthropic.md +356 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/applovin.md +6 -6
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/applovin_max.md +5 -1
- ingestr-0.14.98/docs/supported-sources/appsflyer.md +93 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/appstore.md +65 -56
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/asana.md +11 -10
- ingestr-0.14.98/docs/supported-sources/attio.md +47 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/chess.md +5 -4
- ingestr-0.14.98/docs/supported-sources/clickup.md +45 -0
- ingestr-0.14.98/docs/supported-sources/couchbase.md +136 -0
- ingestr-0.14.98/docs/supported-sources/cratedb.md +139 -0
- ingestr-0.14.98/docs/supported-sources/cursor.md +148 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/db2.md +8 -0
- ingestr-0.14.98/docs/supported-sources/docebo.md +75 -0
- ingestr-0.14.98/docs/supported-sources/elasticsearch.md +80 -0
- ingestr-0.14.98/docs/supported-sources/facebook-ads.md +161 -0
- ingestr-0.14.98/docs/supported-sources/fluxx.md +306 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/frankfurter.md +7 -3
- ingestr-0.14.98/docs/supported-sources/freshdesk.md +49 -0
- ingestr-0.14.98/docs/supported-sources/fundraiseup.md +83 -0
- ingestr-0.14.98/docs/supported-sources/gcs.md +169 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/github.md +6 -7
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/google_analytics.md +8 -1
- ingestr-0.14.98/docs/supported-sources/gorgias.md +42 -0
- ingestr-0.14.98/docs/supported-sources/hostaway.md +104 -0
- ingestr-0.14.98/docs/supported-sources/http.md +111 -0
- ingestr-0.14.98/docs/supported-sources/hubspot.md +52 -0
- ingestr-0.14.98/docs/supported-sources/influxdb.md +39 -0
- ingestr-0.14.98/docs/supported-sources/intercom.md +57 -0
- ingestr-0.14.98/docs/supported-sources/isoc-pulse.md +150 -0
- ingestr-0.14.98/docs/supported-sources/jira.md +76 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/kinesis.md +5 -1
- ingestr-0.14.98/docs/supported-sources/klaviyo.md +57 -0
- ingestr-0.14.98/docs/supported-sources/linear.md +57 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/linkedin_ads.md +6 -3
- ingestr-0.14.98/docs/supported-sources/mailchimp.md +99 -0
- ingestr-0.14.98/docs/supported-sources/mixpanel.md +48 -0
- ingestr-0.14.98/docs/supported-sources/monday.md +59 -0
- ingestr-0.14.98/docs/supported-sources/mongodb.md +201 -0
- ingestr-0.14.98/docs/supported-sources/motherduck.md +46 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/mssql.md +18 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/mysql.md +3 -3
- ingestr-0.14.98/docs/supported-sources/personio.md +58 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/phantombuster.md +6 -2
- ingestr-0.14.98/docs/supported-sources/pinterest.md +30 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/pipedrive.md +8 -6
- ingestr-0.14.98/docs/supported-sources/plusvibeai.md +93 -0
- ingestr-0.14.98/docs/supported-sources/quickbooks.md +51 -0
- ingestr-0.14.98/docs/supported-sources/revenuecat.md +62 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/s3.md +46 -0
- ingestr-0.14.98/docs/supported-sources/salesforce.md +90 -0
- ingestr-0.14.98/docs/supported-sources/sftp.md +43 -0
- ingestr-0.14.98/docs/supported-sources/shopify.md +45 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/slack.md +8 -4
- ingestr-0.14.98/docs/supported-sources/socrata.md +127 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/solidgate.md +7 -3
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/spanner.md +4 -4
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/sqlite.md +1 -1
- ingestr-0.14.98/docs/supported-sources/stripe.md +146 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/tiktok-ads.md +5 -0
- ingestr-0.14.98/docs/supported-sources/trino.md +96 -0
- ingestr-0.14.98/docs/supported-sources/trustpilot.md +36 -0
- ingestr-0.14.98/docs/supported-sources/wise.md +49 -0
- ingestr-0.14.98/docs/supported-sources/zendesk.md +87 -0
- ingestr-0.14.98/docs/supported-sources/zoom.md +39 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/conftest.py +9 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/main.py +47 -4
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/adjust/__init__.py +4 -4
- ingestr-0.14.98/ingestr/src/allium/__init__.py +128 -0
- ingestr-0.14.98/ingestr/src/anthropic/__init__.py +277 -0
- ingestr-0.14.98/ingestr/src/anthropic/helpers.py +525 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/applovin_max/__init__.py +1 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/appstore/__init__.py +1 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/asana_source/__init__.py +1 -1
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/attio/__init__.py +10 -7
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/attio/helpers.py +19 -8
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/blob.py +24 -0
- ingestr-0.14.98/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/chess/__init__.py +1 -1
- ingestr-0.14.98/ingestr/src/clickup/__init__.py +85 -0
- ingestr-0.14.98/ingestr/src/clickup/helpers.py +47 -0
- ingestr-0.14.98/ingestr/src/couchbase_source/__init__.py +118 -0
- ingestr-0.14.98/ingestr/src/couchbase_source/helpers.py +135 -0
- ingestr-0.14.98/ingestr/src/cursor/__init__.py +83 -0
- ingestr-0.14.98/ingestr/src/cursor/helpers.py +188 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/destinations.py +381 -27
- ingestr-0.14.98/ingestr/src/docebo/__init__.py +589 -0
- ingestr-0.14.98/ingestr/src/docebo/client.py +435 -0
- ingestr-0.14.98/ingestr/src/docebo/helpers.py +97 -0
- ingestr-0.14.98/ingestr/src/elasticsearch/helpers.py +138 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/errors.py +8 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/facebook_ads/__init__.py +47 -28
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/facebook_ads/helpers.py +59 -37
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/facebook_ads/settings.py +2 -0
- ingestr-0.14.98/ingestr/src/facebook_ads/utils.py +39 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/factory.py +81 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/filesystem/__init__.py +8 -3
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/filters.py +23 -0
- ingestr-0.14.98/ingestr/src/fluxx/__init__.py +9906 -0
- ingestr-0.14.98/ingestr/src/fluxx/helpers.py +209 -0
- ingestr-0.14.98/ingestr/src/frankfurter/__init__.py +157 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/frankfurter/helpers.py +3 -3
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/freshdesk/__init__.py +25 -8
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/freshdesk/freshdesk_client.py +40 -5
- ingestr-0.14.98/ingestr/src/fundraiseup/__init__.py +49 -0
- ingestr-0.14.98/ingestr/src/fundraiseup/client.py +81 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/github/__init__.py +41 -6
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_analytics/__init__.py +1 -1
- ingestr-0.14.98/ingestr/src/hostaway/__init__.py +302 -0
- ingestr-0.14.98/ingestr/src/hostaway/client.py +288 -0
- ingestr-0.14.98/ingestr/src/http/__init__.py +35 -0
- ingestr-0.14.98/ingestr/src/http/readers.py +114 -0
- ingestr-0.14.98/ingestr/src/http_client.py +24 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/hubspot/__init__.py +6 -12
- ingestr-0.14.98/ingestr/src/influxdb/__init__.py +46 -0
- ingestr-0.14.98/ingestr/src/influxdb/client.py +34 -0
- ingestr-0.14.98/ingestr/src/intercom/__init__.py +142 -0
- ingestr-0.14.98/ingestr/src/intercom/helpers.py +674 -0
- ingestr-0.14.98/ingestr/src/intercom/settings.py +279 -0
- ingestr-0.14.98/ingestr/src/isoc_pulse/__init__.py +159 -0
- ingestr-0.14.98/ingestr/src/jira_source/__init__.py +340 -0
- ingestr-0.14.98/ingestr/src/jira_source/helpers.py +439 -0
- ingestr-0.14.98/ingestr/src/jira_source/settings.py +170 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/kafka/__init__.py +4 -1
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/kinesis/__init__.py +3 -3
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/kinesis/helpers.py +19 -2
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/klaviyo/__init__.py +5 -5
- ingestr-0.14.98/ingestr/src/linear/__init__.py +634 -0
- ingestr-0.14.98/ingestr/src/linear/helpers.py +111 -0
- ingestr-0.14.98/ingestr/src/mailchimp/__init__.py +126 -0
- ingestr-0.14.98/ingestr/src/mailchimp/helpers.py +226 -0
- ingestr-0.14.98/ingestr/src/mailchimp/settings.py +164 -0
- ingestr-0.14.98/ingestr/src/masking.py +344 -0
- ingestr-0.14.98/ingestr/src/mixpanel/__init__.py +62 -0
- ingestr-0.14.98/ingestr/src/mixpanel/client.py +99 -0
- ingestr-0.14.98/ingestr/src/monday/__init__.py +246 -0
- ingestr-0.14.98/ingestr/src/monday/helpers.py +392 -0
- ingestr-0.14.98/ingestr/src/monday/settings.py +328 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/mongodb/__init__.py +5 -2
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/mongodb/helpers.py +384 -10
- ingestr-0.14.98/ingestr/src/pinterest/__init__.py +82 -0
- ingestr-0.14.98/ingestr/src/plusvibeai/__init__.py +335 -0
- ingestr-0.14.98/ingestr/src/plusvibeai/helpers.py +544 -0
- ingestr-0.14.98/ingestr/src/plusvibeai/settings.py +252 -0
- ingestr-0.14.98/ingestr/src/quickbooks/__init__.py +117 -0
- ingestr-0.14.98/ingestr/src/revenuecat/__init__.py +83 -0
- ingestr-0.14.98/ingestr/src/revenuecat/helpers.py +237 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/salesforce/__init__.py +15 -8
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/shopify/__init__.py +1 -17
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/smartsheets/__init__.py +33 -5
- ingestr-0.14.98/ingestr/src/socrata_source/__init__.py +83 -0
- ingestr-0.14.98/ingestr/src/socrata_source/helpers.py +85 -0
- ingestr-0.14.98/ingestr/src/socrata_source/settings.py +8 -0
- ingestr-0.14.98/ingestr/src/solidgate/__init__.py +219 -0
- ingestr-0.14.98/ingestr/src/solidgate/helpers.py +154 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/sources.py +2049 -94
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/stripe_analytics/__init__.py +47 -18
- ingestr-0.14.98/ingestr/src/stripe_analytics/helpers.py +353 -0
- ingestr-0.14.98/ingestr/src/stripe_analytics/settings.py +66 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/tiktok_ads/__init__.py +12 -6
- ingestr-0.14.98/ingestr/src/trustpilot/__init__.py +48 -0
- ingestr-0.14.98/ingestr/src/trustpilot/client.py +48 -0
- ingestr-0.14.98/ingestr/src/wise/__init__.py +68 -0
- ingestr-0.14.98/ingestr/src/wise/client.py +63 -0
- ingestr-0.14.98/ingestr/src/zoom/__init__.py +99 -0
- ingestr-0.14.98/ingestr/src/zoom/helpers.py +102 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/tests/unit/test_smartsheets.py +6 -9
- {ingestr-0.13.49 → ingestr-0.14.98}/package-lock.json +3 -3
- {ingestr-0.13.49 → ingestr-0.14.98}/pyproject.toml +21 -1
- {ingestr-0.13.49 → ingestr-0.14.98}/requirements.in +11 -7
- {ingestr-0.13.49 → ingestr-0.14.98}/requirements.txt +96 -53
- {ingestr-0.13.49 → ingestr-0.14.98}/requirements_arm64.txt +98 -48
- ingestr-0.14.98/resources/demo.gif +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/config/vocabularies/bruin/accept.txt +1 -0
- ingestr-0.13.49/.github/workflows/release.yml +0 -81
- ingestr-0.13.49/Dockerfile +0 -44
- ingestr-0.13.49/docs/supported-sources/appsflyer.md +0 -58
- ingestr-0.13.49/docs/supported-sources/attio.md +0 -42
- ingestr-0.13.49/docs/supported-sources/elasticsearch.md +0 -35
- ingestr-0.13.49/docs/supported-sources/facebook-ads.md +0 -51
- ingestr-0.13.49/docs/supported-sources/freshdesk.md +0 -47
- ingestr-0.13.49/docs/supported-sources/gcs.md +0 -66
- ingestr-0.13.49/docs/supported-sources/gorgias.md +0 -53
- ingestr-0.13.49/docs/supported-sources/hubspot.md +0 -64
- ingestr-0.13.49/docs/supported-sources/klaviyo.md +0 -50
- ingestr-0.13.49/docs/supported-sources/mongodb.md +0 -24
- ingestr-0.13.49/docs/supported-sources/personio.md +0 -51
- ingestr-0.13.49/docs/supported-sources/salesforce.md +0 -68
- ingestr-0.13.49/docs/supported-sources/shopify.md +0 -43
- ingestr-0.13.49/docs/supported-sources/stripe.md +0 -51
- ingestr-0.13.49/docs/supported-sources/zendesk.md +0 -84
- ingestr-0.13.49/ingestr/src/buildinfo.py +0 -1
- ingestr-0.13.49/ingestr/src/frankfurter/__init__.py +0 -163
- ingestr-0.13.49/ingestr/src/http_client.py +0 -18
- ingestr-0.13.49/ingestr/src/solidgate/__init__.py +0 -97
- ingestr-0.13.49/ingestr/src/solidgate/helpers.py +0 -74
- ingestr-0.13.49/ingestr/src/stripe_analytics/helpers.py +0 -68
- ingestr-0.13.49/ingestr/src/stripe_analytics/settings.py +0 -26
- {ingestr-0.13.49 → ingestr-0.14.98}/.dockerignore +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/.gitleaksignore +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/.python-version +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/.vale.ini +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/LICENSE.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/athena.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/freshdesk_ingestion.png +0 -0
- /ingestr-0.13.49/docs/media/spanner_ingestion.png → /ingestr-0.14.98/docs/media/gcp_spanner_ingestion.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/github.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/ingestion_elasticsearch_img.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/personio.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/phantombuster.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.49/resources → ingestr-0.14.98/docs/public}/demo.gif +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/smartsheets.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/elasticsearch/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/phantombuster/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/phantombuster/client.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/time.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/version.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/package.json +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/requirements-dev.txt +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/resources/demo.tape +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/resources/ingestr.svg +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/We.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/meta.json +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.49 → ingestr-0.14.98}/test.env.template +0 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# WARN: this is used as a notification filter in our slack.
|
|
2
|
+
# When updating this, make sure to update the workflow subscription as well.
|
|
3
|
+
name: "Release ingestr on pip and ghcr.io"
|
|
4
|
+
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
tags:
|
|
8
|
+
- "v*.*.*"
|
|
9
|
+
|
|
10
|
+
env:
|
|
11
|
+
REGISTRY: ghcr.io
|
|
12
|
+
IMAGE: ghcr.io/${{ github.repository }}
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
tests:
|
|
16
|
+
uses: ./.github/workflows/tests.yml
|
|
17
|
+
pip-release:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
needs: tests
|
|
20
|
+
env:
|
|
21
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_INGESTR_TOKEN }}
|
|
22
|
+
steps:
|
|
23
|
+
- name: checkout
|
|
24
|
+
uses: actions/checkout@v4
|
|
25
|
+
with:
|
|
26
|
+
fetch-depth: 0
|
|
27
|
+
- name: setup python
|
|
28
|
+
uses: actions/setup-python@v5
|
|
29
|
+
with:
|
|
30
|
+
python-version: '3.11'
|
|
31
|
+
|
|
32
|
+
# github actions invoke a fresh shell
|
|
33
|
+
# for each step. This causes us to lose our
|
|
34
|
+
# venv context. So we run all our build commands
|
|
35
|
+
# in a single step to simplify our pipeline.
|
|
36
|
+
- name: build and release
|
|
37
|
+
run: |
|
|
38
|
+
pip install uv
|
|
39
|
+
uv venv
|
|
40
|
+
source .venv/bin/activate
|
|
41
|
+
uv pip install -r requirements-dev.txt
|
|
42
|
+
make build
|
|
43
|
+
make upload-release
|
|
44
|
+
|
|
45
|
+
docker-build:
|
|
46
|
+
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')
|
|
47
|
+
runs-on: ubuntu-24.04-arm
|
|
48
|
+
strategy:
|
|
49
|
+
fail-fast: false
|
|
50
|
+
matrix:
|
|
51
|
+
platform:
|
|
52
|
+
- linux/amd64
|
|
53
|
+
- linux/arm64
|
|
54
|
+
|
|
55
|
+
permissions:
|
|
56
|
+
contents: read
|
|
57
|
+
packages: write
|
|
58
|
+
|
|
59
|
+
steps:
|
|
60
|
+
- name: Prepare
|
|
61
|
+
run: |
|
|
62
|
+
platform=${{ matrix.platform }}
|
|
63
|
+
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
|
64
|
+
|
|
65
|
+
- name: Checkout repository
|
|
66
|
+
uses: actions/checkout@v4
|
|
67
|
+
|
|
68
|
+
- name: Log in to the Container registry
|
|
69
|
+
uses: docker/login-action@v3
|
|
70
|
+
with:
|
|
71
|
+
registry: ${{ env.REGISTRY }}
|
|
72
|
+
username: ${{ github.actor }}
|
|
73
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
74
|
+
|
|
75
|
+
- name: Extract metadata (tags, labels) for Docker
|
|
76
|
+
id: meta
|
|
77
|
+
uses: docker/metadata-action@v5
|
|
78
|
+
with:
|
|
79
|
+
images: ${{ env.IMAGE }}
|
|
80
|
+
|
|
81
|
+
- name: Set up Docker Buildx
|
|
82
|
+
uses: docker/setup-buildx-action@v3
|
|
83
|
+
|
|
84
|
+
- name: Build and push Docker image
|
|
85
|
+
uses: docker/build-push-action@v5
|
|
86
|
+
id: build
|
|
87
|
+
with:
|
|
88
|
+
context: .
|
|
89
|
+
platforms: ${{ matrix.platform }}
|
|
90
|
+
tags: ${{ env.IMAGE }}
|
|
91
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
92
|
+
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
|
|
93
|
+
|
|
94
|
+
- name: Export digest
|
|
95
|
+
run: |
|
|
96
|
+
mkdir -p ${{ runner.temp }}/digests
|
|
97
|
+
digest="${{ steps.build.outputs.digest }}"
|
|
98
|
+
# The following strips the 'sha256:' prefix from the digest using bash parameter expansion.
|
|
99
|
+
touch "${{ runner.temp }}/digests/${digest#sha256:}"
|
|
100
|
+
|
|
101
|
+
- name: Upload digest
|
|
102
|
+
uses: actions/upload-artifact@v4
|
|
103
|
+
with:
|
|
104
|
+
name: digests-${{ env.PLATFORM_PAIR }}
|
|
105
|
+
path: ${{ runner.temp }}/digests/*
|
|
106
|
+
if-no-files-found: error
|
|
107
|
+
retention-days: 1
|
|
108
|
+
|
|
109
|
+
docker-publish:
|
|
110
|
+
permissions:
|
|
111
|
+
contents: read
|
|
112
|
+
packages: write
|
|
113
|
+
|
|
114
|
+
runs-on: ubuntu-latest
|
|
115
|
+
needs:
|
|
116
|
+
- docker-build
|
|
117
|
+
- tests
|
|
118
|
+
steps:
|
|
119
|
+
- name: Download digests
|
|
120
|
+
uses: actions/download-artifact@v4
|
|
121
|
+
with:
|
|
122
|
+
path: ${{ runner.temp }}/digests
|
|
123
|
+
pattern: digests-*
|
|
124
|
+
merge-multiple: true
|
|
125
|
+
|
|
126
|
+
- name: Log in to the Container registry
|
|
127
|
+
uses: docker/login-action@v3
|
|
128
|
+
with:
|
|
129
|
+
registry: ${{ env.REGISTRY }}
|
|
130
|
+
username: ${{ github.actor }}
|
|
131
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
132
|
+
|
|
133
|
+
- name: Set up Docker Buildx
|
|
134
|
+
uses: docker/setup-buildx-action@v3
|
|
135
|
+
|
|
136
|
+
- name: Docker meta
|
|
137
|
+
id: meta
|
|
138
|
+
uses: docker/metadata-action@v5
|
|
139
|
+
with:
|
|
140
|
+
images: ${{ env.IMAGE }}
|
|
141
|
+
tags: |
|
|
142
|
+
type=ref,event=tag
|
|
143
|
+
type=semver,pattern={{raw}}
|
|
144
|
+
|
|
145
|
+
- name: Create manifest list and push
|
|
146
|
+
working-directory: ${{ runner.temp }}/digests
|
|
147
|
+
run: |
|
|
148
|
+
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
|
149
|
+
$(printf '${{ env.IMAGE }}@sha256:%s ' *)
|
|
150
|
+
|
|
151
|
+
|
|
@@ -13,13 +13,35 @@ concurrency:
|
|
|
13
13
|
cancel-in-progress: true
|
|
14
14
|
|
|
15
15
|
jobs:
|
|
16
|
+
check-changes:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
outputs:
|
|
19
|
+
code-changes: ${{ steps.filter.outputs.code-changes }}
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
- uses: dorny/paths-filter@v3
|
|
23
|
+
id: filter
|
|
24
|
+
with:
|
|
25
|
+
filters: |
|
|
26
|
+
code-changes:
|
|
27
|
+
- '**'
|
|
28
|
+
- '!**/*.md'
|
|
29
|
+
- '!docs/**'
|
|
30
|
+
|
|
16
31
|
tests:
|
|
32
|
+
needs: check-changes
|
|
33
|
+
if: needs.check-changes.outputs.code-changes == 'true'
|
|
17
34
|
strategy:
|
|
18
35
|
matrix:
|
|
19
36
|
# I tried running stuff on macOS but it was too slow and unreliable.
|
|
20
37
|
# I also tried windows runners but couldn't get Docker to work there, so I gave up.
|
|
21
38
|
os: [ubuntu-latest]
|
|
22
|
-
python-version: [
|
|
39
|
+
python-version: [
|
|
40
|
+
'3.10',
|
|
41
|
+
'3.11',
|
|
42
|
+
'3.12',
|
|
43
|
+
'3.13',
|
|
44
|
+
]
|
|
23
45
|
runs-on: ${{ matrix.os }}
|
|
24
46
|
steps:
|
|
25
47
|
- uses: actions/checkout@v4
|
|
@@ -53,6 +75,7 @@ jobs:
|
|
|
53
75
|
uses: astral-sh/setup-uv@v3
|
|
54
76
|
- name: Install pip dependencies
|
|
55
77
|
run: make deps-ci
|
|
78
|
+
|
|
56
79
|
- name: run tests (macOS)
|
|
57
80
|
if: matrix.os == 'macos-13'
|
|
58
81
|
run: make test-ci
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
FROM python:3.11-slim-trixie
|
|
2
|
+
|
|
3
|
+
# Guidelines that have been followed.
|
|
4
|
+
# - https://hynek.me/articles/docker-uv/
|
|
5
|
+
|
|
6
|
+
# Install the `uv` package manager.
|
|
7
|
+
# Security-conscious organizations should package/review uv themselves.
|
|
8
|
+
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
|
9
|
+
|
|
10
|
+
# - Tell uv to byte-compile packages for faster application startups.
|
|
11
|
+
# - Silence uv complaining about not being able to use hard links.
|
|
12
|
+
# - Prevent uv from accidentally downloading isolated Python builds.
|
|
13
|
+
# - Install packages into the system Python environment.
|
|
14
|
+
ENV \
|
|
15
|
+
UV_COMPILE_BYTECODE=1 \
|
|
16
|
+
UV_LINK_MODE=copy \
|
|
17
|
+
UV_PYTHON_DOWNLOADS=never \
|
|
18
|
+
UV_SYSTEM_PYTHON=1
|
|
19
|
+
|
|
20
|
+
WORKDIR /app
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Install all prerequisites.
|
|
24
|
+
|
|
25
|
+
RUN \
|
|
26
|
+
export ACCEPT_EULA='Y' && \
|
|
27
|
+
# Install build dependencies
|
|
28
|
+
apt-get update && \
|
|
29
|
+
apt-get install -y curl gcc gpg libpq-dev build-essential unixodbc-dev g++ apt-transport-https git
|
|
30
|
+
|
|
31
|
+
RUN \
|
|
32
|
+
# Install pyodbc db drivers for MSSQL and PostgreSQL
|
|
33
|
+
curl -sSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /usr/share/keyrings/microsoft-prod.gpg && \
|
|
34
|
+
curl -sSL https://packages.microsoft.com/config/debian/12/prod.list | tee /etc/apt/sources.list.d/mssql-release.list
|
|
35
|
+
|
|
36
|
+
RUN \
|
|
37
|
+
# install the rest of them
|
|
38
|
+
apt-get update && \
|
|
39
|
+
ACCEPT_EULA=Y apt-get install -y msodbcsql18 odbc-postgresql && \
|
|
40
|
+
# Update odbcinst.ini to make sure full path to driver is listed, and set CommLog to 0. i.e disables any communication logs to be written to files
|
|
41
|
+
sed 's/Driver=psql/Driver=\/usr\/lib\/x86_64-linux-gnu\/odbc\/psql/;s/CommLog=1/CommLog=0/' /etc/odbcinst.ini > /tmp/temp.ini && \
|
|
42
|
+
mv -f /tmp/temp.ini /etc/odbcinst.ini
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Install application.
|
|
46
|
+
|
|
47
|
+
# Copy sources and activate platform-specific requirements file.
|
|
48
|
+
COPY . /app
|
|
49
|
+
RUN if [ "$(uname -m)" = "aarch64" ]; then \
|
|
50
|
+
cp /app/requirements_arm64.txt /app/requirements.txt; \
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Generate version file
|
|
54
|
+
RUN make write-build-info
|
|
55
|
+
|
|
56
|
+
# Install all required packages and the application.
|
|
57
|
+
RUN uv pip install --requirement requirements.txt pyodbc .
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# Ready.
|
|
61
|
+
ENTRYPOINT ["ingestr"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
SHELL := /bin/bash
|
|
2
2
|
.ONESHELL:
|
|
3
|
-
.PHONY: test lint format test-ci lint-ci build upload-release setup docker-shell
|
|
3
|
+
.PHONY: test lint format test-ci lint-ci build upload-release setup docker-shell write-build-info remove-build-info
|
|
4
4
|
|
|
5
5
|
BUILDINFO=ingestr/src/buildinfo.py
|
|
6
6
|
|
|
@@ -31,11 +31,14 @@ test-specific: venv lock-deps
|
|
|
31
31
|
. venv/bin/activate; set -a; source test.env; set +a; TESTCONTAINERS_RYUK_DISABLED=true pytest -n auto -rP -vv --tb=short --capture=no -k $(test)
|
|
32
32
|
|
|
33
33
|
lint-ci:
|
|
34
|
-
ruff format ingestr && ruff check ingestr --
|
|
35
|
-
|
|
34
|
+
@ruff format --diff ingestr && ruff check ingestr && mypy --config-file pyproject.toml --explicit-package-bases ingestr
|
|
35
|
+
|
|
36
|
+
format:
|
|
37
|
+
@ruff format ingestr && ruff check ingestr --fix
|
|
38
|
+
@mypy --config-file pyproject.toml --explicit-package-bases ingestr
|
|
36
39
|
|
|
37
40
|
lint: venv lock-deps
|
|
38
|
-
. venv/bin/activate; $(MAKE)
|
|
41
|
+
. venv/bin/activate; $(MAKE) format
|
|
39
42
|
|
|
40
43
|
lint-docs:
|
|
41
44
|
vale docs --glob='!**/.vitepress/**'
|
|
@@ -43,8 +46,14 @@ lint-docs:
|
|
|
43
46
|
tl: test lint
|
|
44
47
|
|
|
45
48
|
build: lock-deps
|
|
46
|
-
|
|
49
|
+
$(MAKE) write-build-info
|
|
47
50
|
rm -rf dist && python3 -m build
|
|
51
|
+
$(MAKE) remove-build-info
|
|
52
|
+
|
|
53
|
+
write-build-info:
|
|
54
|
+
cat > ${BUILDINFO} <<< "version = \"$$(git describe --tags --abbrev=0)\""
|
|
55
|
+
|
|
56
|
+
remove-build-info:
|
|
48
57
|
rm -f ${BUILDINFO}
|
|
49
58
|
|
|
50
59
|
upload-release:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.98
|
|
4
4
|
Summary: ingestr is a command-line application that ingests data from various sources and stores them in any database.
|
|
5
5
|
Project-URL: Homepage, https://github.com/bruin-data/ingestr
|
|
6
6
|
Project-URL: Issues, https://github.com/bruin-data/ingestr/issues
|
|
@@ -26,7 +26,7 @@ Requires-Dist: asn1crypto==1.5.1
|
|
|
26
26
|
Requires-Dist: asynch==0.2.4
|
|
27
27
|
Requires-Dist: attrs==25.1.0
|
|
28
28
|
Requires-Dist: backoff==2.2.1
|
|
29
|
-
Requires-Dist:
|
|
29
|
+
Requires-Dist: bcrypt==4.3.0
|
|
30
30
|
Requires-Dist: boto3==1.37.1
|
|
31
31
|
Requires-Dist: botocore==1.37.1
|
|
32
32
|
Requires-Dist: cachetools==5.5.2
|
|
@@ -39,26 +39,33 @@ Requires-Dist: clickhouse-connect==0.8.14
|
|
|
39
39
|
Requires-Dist: clickhouse-driver==0.2.9
|
|
40
40
|
Requires-Dist: clickhouse-sqlalchemy==0.2.7
|
|
41
41
|
Requires-Dist: confluent-kafka==2.8.0
|
|
42
|
+
Requires-Dist: couchbase==4.3.6
|
|
43
|
+
Requires-Dist: crate==2.0.0
|
|
42
44
|
Requires-Dist: cryptography==44.0.2
|
|
43
45
|
Requires-Dist: curlify==2.2.1
|
|
44
|
-
Requires-Dist: databricks-sql-connector==
|
|
46
|
+
Requires-Dist: databricks-sql-connector==4.0.5
|
|
45
47
|
Requires-Dist: databricks-sqlalchemy==1.0.2
|
|
46
48
|
Requires-Dist: dataclasses-json==0.6.7
|
|
47
49
|
Requires-Dist: decorator==5.2.1
|
|
48
50
|
Requires-Dist: deprecation==2.1.0
|
|
49
|
-
Requires-Dist: dlt==
|
|
51
|
+
Requires-Dist: dlt-cratedb==0.0.2
|
|
52
|
+
Requires-Dist: dlt==1.16.0
|
|
50
53
|
Requires-Dist: dnspython==2.7.0
|
|
51
54
|
Requires-Dist: duckdb-engine==0.17.0
|
|
52
55
|
Requires-Dist: duckdb==1.2.1
|
|
56
|
+
Requires-Dist: ecdsa==0.19.1
|
|
53
57
|
Requires-Dist: elastic-transport==8.17.1
|
|
54
58
|
Requires-Dist: elasticsearch==8.10.1
|
|
59
|
+
Requires-Dist: enum-compat==0.0.3
|
|
55
60
|
Requires-Dist: et-xmlfile==2.0.0
|
|
56
|
-
Requires-Dist: facebook-business==
|
|
61
|
+
Requires-Dist: facebook-business==23.0.0
|
|
57
62
|
Requires-Dist: filelock==3.17.0
|
|
58
63
|
Requires-Dist: flatten-json==0.1.14
|
|
59
64
|
Requires-Dist: frozenlist==1.5.0
|
|
60
65
|
Requires-Dist: fsspec==2025.3.2
|
|
66
|
+
Requires-Dist: future==1.0.0
|
|
61
67
|
Requires-Dist: gcsfs==2025.3.2
|
|
68
|
+
Requires-Dist: geojson==3.2.0
|
|
62
69
|
Requires-Dist: gitdb==4.0.12
|
|
63
70
|
Requires-Dist: gitpython==3.1.44
|
|
64
71
|
Requires-Dist: giturlparse==0.12.0
|
|
@@ -77,7 +84,7 @@ Requires-Dist: google-cloud-storage==3.1.0
|
|
|
77
84
|
Requires-Dist: google-crc32c==1.6.0
|
|
78
85
|
Requires-Dist: google-resumable-media==2.7.2
|
|
79
86
|
Requires-Dist: googleapis-common-protos==1.69.0
|
|
80
|
-
Requires-Dist: greenlet==3.2.
|
|
87
|
+
Requires-Dist: greenlet==3.2.4
|
|
81
88
|
Requires-Dist: grpc-google-iam-v1==0.14.2
|
|
82
89
|
Requires-Dist: grpc-interceptor==0.15.4
|
|
83
90
|
Requires-Dist: grpcio-status==1.62.3
|
|
@@ -86,17 +93,16 @@ Requires-Dist: hdbcli==2.23.27
|
|
|
86
93
|
Requires-Dist: hexbytes==1.3.0
|
|
87
94
|
Requires-Dist: httplib2==0.22.0
|
|
88
95
|
Requires-Dist: humanize==4.12.1
|
|
89
|
-
Requires-Dist: ibm-db-sa==0.4.1
|
|
90
|
-
Requires-Dist: ibm-db==3.2.6
|
|
91
96
|
Requires-Dist: idna==3.10
|
|
92
97
|
Requires-Dist: inflection==0.5.1
|
|
98
|
+
Requires-Dist: influxdb-client==1.41.0
|
|
99
|
+
Requires-Dist: intuit-oauth==1.2.4
|
|
93
100
|
Requires-Dist: isodate==0.7.2
|
|
94
101
|
Requires-Dist: jmespath==1.0.1
|
|
95
102
|
Requires-Dist: jsonpath-ng==1.7.0
|
|
96
103
|
Requires-Dist: leb128==1.0.8
|
|
97
104
|
Requires-Dist: lxml==5.3.1
|
|
98
105
|
Requires-Dist: lz4==4.4.3
|
|
99
|
-
Requires-Dist: makefun==1.15.6
|
|
100
106
|
Requires-Dist: mako==1.3.9
|
|
101
107
|
Requires-Dist: markdown-it-py==3.0.0
|
|
102
108
|
Requires-Dist: markupsafe==3.0.2
|
|
@@ -110,9 +116,10 @@ Requires-Dist: mysql-connector-python==9.2.0
|
|
|
110
116
|
Requires-Dist: numpy==2.2.3
|
|
111
117
|
Requires-Dist: oauthlib==3.2.2
|
|
112
118
|
Requires-Dist: openpyxl==3.1.5
|
|
113
|
-
Requires-Dist: orjson==3.
|
|
119
|
+
Requires-Dist: orjson==3.11.3
|
|
114
120
|
Requires-Dist: packaging==24.2
|
|
115
121
|
Requires-Dist: pandas==2.2.3
|
|
122
|
+
Requires-Dist: paramiko==3.5.1
|
|
116
123
|
Requires-Dist: pathvalidate==3.2.3
|
|
117
124
|
Requires-Dist: pendulum==3.0.0
|
|
118
125
|
Requires-Dist: platformdirs==4.3.6
|
|
@@ -137,18 +144,22 @@ Requires-Dist: pygments==2.19.1
|
|
|
137
144
|
Requires-Dist: pyjwt==2.10.1
|
|
138
145
|
Requires-Dist: pymongo==4.11.1
|
|
139
146
|
Requires-Dist: pymysql==1.1.1
|
|
147
|
+
Requires-Dist: pynacl==1.5.0
|
|
140
148
|
Requires-Dist: pyopenssl==25.0.0
|
|
141
149
|
Requires-Dist: pyparsing==3.2.1
|
|
142
150
|
Requires-Dist: pyrate-limiter==3.7.0
|
|
143
151
|
Requires-Dist: python-dateutil==2.9.0.post0
|
|
144
152
|
Requires-Dist: python-dotenv==1.0.1
|
|
153
|
+
Requires-Dist: python-jose==3.5.0
|
|
154
|
+
Requires-Dist: python-quickbooks==0.9.2
|
|
145
155
|
Requires-Dist: pytz==2025.1
|
|
146
156
|
Requires-Dist: pyyaml==6.0.2
|
|
147
|
-
Requires-Dist:
|
|
157
|
+
Requires-Dist: rauth==0.7.3
|
|
158
|
+
Requires-Dist: reactivex==4.0.4
|
|
148
159
|
Requires-Dist: requests-file==2.1.0
|
|
149
160
|
Requires-Dist: requests-oauthlib==1.3.1
|
|
150
161
|
Requires-Dist: requests-toolbelt==1.0.0
|
|
151
|
-
Requires-Dist: requests==2.32.
|
|
162
|
+
Requires-Dist: requests==2.32.5
|
|
152
163
|
Requires-Dist: requirements-parser==0.11.0
|
|
153
164
|
Requires-Dist: rich-argparse==1.7.0
|
|
154
165
|
Requires-Dist: rich==13.9.4
|
|
@@ -156,7 +167,6 @@ Requires-Dist: rsa==4.9
|
|
|
156
167
|
Requires-Dist: rudder-sdk-python==2.1.4
|
|
157
168
|
Requires-Dist: s3fs==2025.3.2
|
|
158
169
|
Requires-Dist: s3transfer==0.11.3
|
|
159
|
-
Requires-Dist: scramp==1.4.5
|
|
160
170
|
Requires-Dist: semver==3.0.4
|
|
161
171
|
Requires-Dist: setuptools==75.8.2
|
|
162
172
|
Requires-Dist: shellingham==1.5.4
|
|
@@ -168,8 +178,8 @@ Requires-Dist: smmap==5.0.2
|
|
|
168
178
|
Requires-Dist: snowflake-connector-python==3.14.0
|
|
169
179
|
Requires-Dist: snowflake-sqlalchemy==1.6.1
|
|
170
180
|
Requires-Dist: sortedcontainers==2.4.0
|
|
171
|
-
Requires-Dist: soupsieve==2.6
|
|
172
181
|
Requires-Dist: sqlalchemy-bigquery==1.12.1
|
|
182
|
+
Requires-Dist: sqlalchemy-cratedb==0.41.0
|
|
173
183
|
Requires-Dist: sqlalchemy-hana==2.0.0
|
|
174
184
|
Requires-Dist: sqlalchemy-redshift==0.8.14
|
|
175
185
|
Requires-Dist: sqlalchemy-spanner==1.11.0
|
|
@@ -183,6 +193,7 @@ Requires-Dist: thrift==0.16.0
|
|
|
183
193
|
Requires-Dist: time-machine==2.16.0
|
|
184
194
|
Requires-Dist: tomlkit==0.13.2
|
|
185
195
|
Requires-Dist: tqdm==4.67.1
|
|
196
|
+
Requires-Dist: trino==0.336.0
|
|
186
197
|
Requires-Dist: typer==0.13.1
|
|
187
198
|
Requires-Dist: types-requests==2.32.0.20240907
|
|
188
199
|
Requires-Dist: types-setuptools==75.8.2.20250305
|
|
@@ -192,11 +203,15 @@ Requires-Dist: tzdata==2025.1
|
|
|
192
203
|
Requires-Dist: tzlocal==5.3
|
|
193
204
|
Requires-Dist: uritemplate==4.1.1
|
|
194
205
|
Requires-Dist: urllib3==2.3.0
|
|
206
|
+
Requires-Dist: verlib2==0.2.0
|
|
195
207
|
Requires-Dist: wrapt==1.17.2
|
|
196
208
|
Requires-Dist: yarl==1.18.3
|
|
197
209
|
Requires-Dist: zeep==4.3.1
|
|
198
210
|
Requires-Dist: zstandard==0.23.0
|
|
199
211
|
Requires-Dist: zstd==1.5.6.5
|
|
212
|
+
Provides-Extra: ibm-db
|
|
213
|
+
Requires-Dist: ibm-db-sa==0.4.1; extra == 'ibm-db'
|
|
214
|
+
Requires-Dist: ibm-db==3.2.6; extra == 'ibm-db'
|
|
200
215
|
Provides-Extra: odbc
|
|
201
216
|
Requires-Dist: pyodbc==5.1.0; extra == 'odbc'
|
|
202
217
|
Provides-Extra: oracle
|
|
@@ -292,11 +307,21 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
292
307
|
<td>✅</td>
|
|
293
308
|
<td>✅</td>
|
|
294
309
|
</tr>
|
|
310
|
+
<tr>
|
|
311
|
+
<td>CrateDB</td>
|
|
312
|
+
<td>✅</td>
|
|
313
|
+
<td>✅</td>
|
|
314
|
+
</tr>
|
|
295
315
|
<tr>
|
|
296
316
|
<td>Databricks</td>
|
|
297
317
|
<td>✅</td>
|
|
298
318
|
<td>✅</td>
|
|
299
319
|
</tr>
|
|
320
|
+
<tr>
|
|
321
|
+
<td>IBM Db2</td>
|
|
322
|
+
<td>✅</td>
|
|
323
|
+
<td>-</td>
|
|
324
|
+
</tr>
|
|
300
325
|
<tr>
|
|
301
326
|
<td>DuckDB</td>
|
|
302
327
|
<td>✅</td>
|
|
@@ -307,6 +332,16 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
307
332
|
<td>✅</td>
|
|
308
333
|
<td>-</td>
|
|
309
334
|
</tr>
|
|
335
|
+
<tr>
|
|
336
|
+
<td>Elasticsearch</td>
|
|
337
|
+
<td>✅</td>
|
|
338
|
+
<td>✅</td>
|
|
339
|
+
</tr>
|
|
340
|
+
<tr>
|
|
341
|
+
<td>GCP Spanner</td>
|
|
342
|
+
<td>✅</td>
|
|
343
|
+
<td>-</td>
|
|
344
|
+
</tr>
|
|
310
345
|
<tr>
|
|
311
346
|
<td>Local CSV file</td>
|
|
312
347
|
<td>✅</td>
|
|
@@ -320,7 +355,12 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
320
355
|
<tr>
|
|
321
356
|
<td>MongoDB</td>
|
|
322
357
|
<td>✅</td>
|
|
323
|
-
<td
|
|
358
|
+
<td>✅</td>
|
|
359
|
+
</tr>
|
|
360
|
+
<tr>
|
|
361
|
+
<td>MotherDuck</td>
|
|
362
|
+
<td>✅</td>
|
|
363
|
+
<td>✅</td>
|
|
324
364
|
</tr>
|
|
325
365
|
<tr>
|
|
326
366
|
<td>MySQL</td>
|
|
@@ -357,6 +397,11 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
357
397
|
<td>✅</td>
|
|
358
398
|
<td>❌</td>
|
|
359
399
|
</tr>
|
|
400
|
+
<tr>
|
|
401
|
+
<td>Trino</td>
|
|
402
|
+
<td>✅</td>
|
|
403
|
+
<td>✅</td>
|
|
404
|
+
</tr>
|
|
360
405
|
<tr>
|
|
361
406
|
<td colspan="3" style='text-align:center;'><strong>Platforms</strong></td>
|
|
362
407
|
</tr>
|
|
@@ -393,6 +438,11 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
393
438
|
<td>✅</td>
|
|
394
439
|
<td>-</td>
|
|
395
440
|
</tr>
|
|
441
|
+
<tr>
|
|
442
|
+
<td>Attio</td>
|
|
443
|
+
<td>✅</td>
|
|
444
|
+
<td>-</td>
|
|
445
|
+
</tr>
|
|
396
446
|
<tr>
|
|
397
447
|
<td>Chess.com</td>
|
|
398
448
|
<td>✅</td>
|
|
@@ -404,7 +454,7 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
404
454
|
<td>-</td>
|
|
405
455
|
</tr>
|
|
406
456
|
<tr>
|
|
407
|
-
<td>
|
|
457
|
+
<td>GitHub</td>
|
|
408
458
|
<td>✅</td>
|
|
409
459
|
<td>-</td>
|
|
410
460
|
</tr>
|
|
@@ -447,6 +497,16 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
447
497
|
<td>Personio</td>
|
|
448
498
|
<td>✅</td>
|
|
449
499
|
<td>-</td>
|
|
500
|
+
</tr>
|
|
501
|
+
<tr>
|
|
502
|
+
<td>Phantombuster</td>
|
|
503
|
+
<td>✅</td>
|
|
504
|
+
<td>-</td>
|
|
505
|
+
</tr>
|
|
506
|
+
<tr>
|
|
507
|
+
<td>Pipedrive</td>
|
|
508
|
+
<td>✅</td>
|
|
509
|
+
<td>-</td>
|
|
450
510
|
</tr>
|
|
451
511
|
<tr>
|
|
452
512
|
<td>S3</td>
|
|
@@ -469,7 +529,12 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
469
529
|
<td>-</td>
|
|
470
530
|
</tr>
|
|
471
531
|
<tr>
|
|
472
|
-
<td>
|
|
532
|
+
<td>Smartsheets</td>
|
|
533
|
+
<td>✅</td>
|
|
534
|
+
<td>-</td>
|
|
535
|
+
</tr>
|
|
536
|
+
<tr>
|
|
537
|
+
<td>Solidgate</td>
|
|
473
538
|
<td>✅</td>
|
|
474
539
|
<td>-</td>
|
|
475
540
|
</tr>
|