ingestr 0.14.96__tar.gz → 0.14.97__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.96 → ingestr-0.14.97}/.github/workflows/tests.yml +6 -6
- {ingestr-0.14.96 → ingestr-0.14.97}/PKG-INFO +1 -1
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/.vitepress/config.mjs +1 -0
- ingestr-0.14.97/docs/supported-sources/hostaway.md +104 -0
- ingestr-0.14.97/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/factory.py +2 -0
- ingestr-0.14.97/ingestr/src/hostaway/__init__.py +302 -0
- ingestr-0.14.97/ingestr/src/hostaway/client.py +288 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/sources.py +90 -0
- ingestr-0.14.96/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.14.96 → ingestr-0.14.97}/.dlt/config.toml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/.dockerignore +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/.github/workflows/release.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/.gitignore +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/.gitleaksignore +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/.python-version +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/.vale.ini +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/Dockerfile +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/LICENSE.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/Makefile +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/README.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/commands/example-uris.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/commands/ingest.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/getting-started/data-masking.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/index.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/applovin_max.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/athena.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/clickup_ingestion.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/cratedb-destination.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/cratedb-source.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/freshdesk_ingestion.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/gcp_spanner_ingestion.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/github.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/ingestion_elasticsearch_img.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/linear.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/mixpanel_ingestion.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/personio.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/phantombuster.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/pipedrive.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/quickbook_ingestion.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/sftp.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/tiktok.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/wise_ingestion.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/media/zoom_ingestion.png +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/public/demo.gif +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/allium.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/anthropic.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/attio.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/clickup.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/couchbase.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/cratedb.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/docebo.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/elasticsearch.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/fluxx.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/freshdesk.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/fundraiseup.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/github.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/http.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/influxdb.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/intercom.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/isoc-pulse.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/jira.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/linear.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/mailchimp.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/mixpanel.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/monday.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/motherduck.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/phantombuster.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/pinterest.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/plusvibeai.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/quickbooks.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/revenuecat.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/sftp.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/smartsheets.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/socrata.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/solidgate.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/spanner.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/trino.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/trustpilot.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/wise.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/supported-sources/zoom.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/conftest.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/main.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/.gitignore +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/allium/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/anthropic/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/anthropic/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/attio/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/attio/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/blob.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/clickup/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/clickup/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/couchbase_source/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/couchbase_source/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/destinations.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/docebo/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/docebo/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/docebo/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/elasticsearch/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/elasticsearch/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/errors.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/facebook_ads/utils.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/filters.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/fluxx/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/fluxx/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/freshdesk/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/fundraiseup/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/fundraiseup/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/http/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/http/readers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/http_client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/influxdb/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/influxdb/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/intercom/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/intercom/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/intercom/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/isoc_pulse/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/jira_source/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/jira_source/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/jira_source/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/linear/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/linear/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/loader.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/mailchimp/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/mailchimp/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/mailchimp/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/masking.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/mixpanel/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/mixpanel/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/monday/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/monday/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/monday/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/partition.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/phantombuster/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/phantombuster/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/pinterest/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/plusvibeai/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/plusvibeai/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/plusvibeai/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/quickbooks/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/resource.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/revenuecat/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/revenuecat/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/smartsheets/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/socrata_source/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/socrata_source/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/socrata_source/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/solidgate/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/solidgate/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/time.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/trustpilot/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/trustpilot/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/version.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/wise/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/wise/client.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/zoom/__init__.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/src/zoom/helpers.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/ingestr/tests/unit/test_smartsheets.py +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/package-lock.json +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/package.json +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/pyproject.toml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/requirements-dev.txt +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/requirements.in +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/requirements.txt +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/requirements_arm64.txt +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/resources/demo.gif +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/resources/demo.tape +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/resources/ingestr.svg +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Colons.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Gender.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Headings.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Latin.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Parens.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Passive.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Periods.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Slang.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Units.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/We.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/Will.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/WordList.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/meta.json +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/Google/vocab.txt +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.14.96 → ingestr-0.14.97}/test.env.template +0 -0
|
@@ -16,21 +16,21 @@ jobs:
|
|
|
16
16
|
check-changes:
|
|
17
17
|
runs-on: ubuntu-latest
|
|
18
18
|
outputs:
|
|
19
|
-
|
|
19
|
+
code-changes: ${{ steps.filter.outputs.code-changes }}
|
|
20
20
|
steps:
|
|
21
21
|
- uses: actions/checkout@v4
|
|
22
22
|
- uses: dorny/paths-filter@v3
|
|
23
23
|
id: filter
|
|
24
24
|
with:
|
|
25
25
|
filters: |
|
|
26
|
-
|
|
27
|
-
- '
|
|
28
|
-
- '
|
|
29
|
-
- 'docs/**'
|
|
26
|
+
code-changes:
|
|
27
|
+
- '**'
|
|
28
|
+
- '!**/*.md'
|
|
29
|
+
- '!docs/**'
|
|
30
30
|
|
|
31
31
|
tests:
|
|
32
32
|
needs: check-changes
|
|
33
|
-
if: needs.check-changes.outputs.
|
|
33
|
+
if: needs.check-changes.outputs.code-changes == 'true'
|
|
34
34
|
strategy:
|
|
35
35
|
matrix:
|
|
36
36
|
# I tried running stuff on macOS but it was too slow and unreliable.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.14.
|
|
3
|
+
Version: 0.14.97
|
|
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
|
|
@@ -150,6 +150,7 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
|
|
150
150
|
{ text: "Google Ads", link: "/supported-sources/google-ads.md" },
|
|
151
151
|
{ text: "GitHub", link: "/supported-sources/github.md" },
|
|
152
152
|
{ text: "Google Sheets", link: "/supported-sources/gsheets.md" },
|
|
153
|
+
{ text: "Hostaway", link: "/supported-sources/hostaway.md" },
|
|
153
154
|
{ text: "Gorgias", link: "/supported-sources/gorgias.md" },
|
|
154
155
|
{ text: "HubSpot", link: "/supported-sources/hubspot.md" },
|
|
155
156
|
{ text: "Internet Society Pulse", link: "/supported-sources/isoc-pulse.md" },
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Hostaway
|
|
2
|
+
|
|
3
|
+
[Hostaway](https://www.hostaway.com/) is a property management system (PMS) designed for vacation rental managers and hosts. It provides tools for managing listings, reservations, channels, and guest communications across multiple booking platforms.
|
|
4
|
+
|
|
5
|
+
ingestr supports Hostaway as a source.
|
|
6
|
+
|
|
7
|
+
## URI format
|
|
8
|
+
|
|
9
|
+
The URI format for Hostaway is as follows:
|
|
10
|
+
|
|
11
|
+
```plaintext
|
|
12
|
+
hostaway://?api_key=<api-key-here>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
URI parameters:
|
|
16
|
+
|
|
17
|
+
- `api_key`: the API access token used for authentication with the Hostaway API
|
|
18
|
+
|
|
19
|
+
The URI is used to connect to the Hostaway API for extracting data. More details on the Hostaway API can be found in the [official API documentation](https://api-docs.hostaway.com/).
|
|
20
|
+
|
|
21
|
+
## Setting up a Hostaway Integration
|
|
22
|
+
|
|
23
|
+
Hostaway uses OAuth 2.0 client credentials for authentication. Follow these steps to obtain an API access token:
|
|
24
|
+
|
|
25
|
+
### 1. Get Your Credentials
|
|
26
|
+
|
|
27
|
+
First, you need your Hostaway account credentials:
|
|
28
|
+
- `client_id`: Your Hostaway account ID
|
|
29
|
+
- `client_secret`: Your API client secret (available in Hostaway settings)
|
|
30
|
+
|
|
31
|
+
### 2. Generate an Access Token
|
|
32
|
+
|
|
33
|
+
Use the following curl command to generate an access token:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
curl -X POST https://api.hostaway.com/v1/accessTokens \
|
|
37
|
+
-H 'Cache-control: no-cache' \
|
|
38
|
+
-H 'Content-type: application/x-www-form-urlencoded' \
|
|
39
|
+
-d 'grant_type=client_credentials&client_id=YOUR_ACCOUNT_ID&client_secret=YOUR_CLIENT_SECRET&scope=general'
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The response will contain an access token (JWT) that you'll use for authentication.
|
|
43
|
+
|
|
44
|
+
### 3. Use the Access Token
|
|
45
|
+
|
|
46
|
+
Once you have your access token, you can use it with ingestr. Here's a sample command that will copy listings data from Hostaway into a DuckDB database:
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
ingestr ingest \
|
|
50
|
+
--source-uri 'hostaway://?api_key=YOUR_ACCESS_TOKEN' \
|
|
51
|
+
--source-table 'listings' \
|
|
52
|
+
--dest-uri 'duckdb:///hostaway.duckdb' \
|
|
53
|
+
--dest-table 'main.listings' \
|
|
54
|
+
--interval-start '2020-01-01' \
|
|
55
|
+
--interval-end '2025-12-31'
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 4. Revoking Access Tokens
|
|
59
|
+
|
|
60
|
+
To revoke an access token when it's no longer needed:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
curl -X DELETE 'https://api.hostaway.com/v1/accessTokens?token=YOUR_ACCESS_TOKEN' \
|
|
64
|
+
-H 'Content-type: application/x-www-form-urlencoded'
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Tables
|
|
68
|
+
|
|
69
|
+
Hostaway source allows ingesting the following resources into separate tables:
|
|
70
|
+
|
|
71
|
+
| Table | PK | Inc Key | Inc Strategy | Description |
|
|
72
|
+
| ----- | -- | ------- | ------------ | ----------- |
|
|
73
|
+
| `listings` | id | latestActivityOn | merge | Property listings managed in Hostaway |
|
|
74
|
+
| `listing_fee_settings` | id | updatedOn | merge | Fee settings configured for each listing |
|
|
75
|
+
| `listing_pricing_settings` | - | - | replace | Pricing rules and settings for listings |
|
|
76
|
+
| `listing_agreements` | - | - | replace | Rental agreements associated with listings |
|
|
77
|
+
| `listing_calendars` | - | - | replace | Calendar availability data for each listing. Uses parallelization for performance |
|
|
78
|
+
| `cancellation_policies` | - | - | replace | General cancellation policies |
|
|
79
|
+
| `cancellation_policies_airbnb` | - | - | replace | Airbnb-specific cancellation policies |
|
|
80
|
+
| `cancellation_policies_marriott` | - | - | replace | Marriott-specific cancellation policies |
|
|
81
|
+
| `cancellation_policies_vrbo` | - | - | replace | VRBO-specific cancellation policies |
|
|
82
|
+
| `reservations` | - | - | replace | Booking reservations across all channels |
|
|
83
|
+
| `finance_fields` | - | - | replace | Financial data for each reservation. Uses parallelization for performance |
|
|
84
|
+
| `reservation_payment_methods` | - | - | replace | Available payment methods for reservations |
|
|
85
|
+
| `reservation_rental_agreements` | - | - | replace | Rental agreements for specific reservations. Uses parallelization for performance |
|
|
86
|
+
| `conversations` | - | - | replace | Guest communication threads |
|
|
87
|
+
| `message_templates` | - | - | replace | Pre-configured message templates |
|
|
88
|
+
| `bed_types` | - | - | replace | Available bed type configurations |
|
|
89
|
+
| `property_types` | - | - | replace | Property type classifications |
|
|
90
|
+
| `countries` | - | - | replace | Supported countries and their codes |
|
|
91
|
+
| `account_tax_settings` | - | - | replace | Tax configuration for the account |
|
|
92
|
+
| `user_groups` | - | - | replace | User groups and permissions |
|
|
93
|
+
| `guest_payment_charges` | - | - | replace | Guest payment transaction records |
|
|
94
|
+
| `coupons` | - | - | replace | Discount coupons and promotional codes |
|
|
95
|
+
| `webhook_reservations` | - | - | replace | Webhook configurations for reservation events |
|
|
96
|
+
| `tasks` | - | - | replace | Tasks and to-dos within the system |
|
|
97
|
+
|
|
98
|
+
Use these table names as the `--source-table` parameter in the `ingestr ingest` command.
|
|
99
|
+
|
|
100
|
+
## Notes
|
|
101
|
+
|
|
102
|
+
- The `finance_fields`, `reservation_rental_agreements`, and `listing_calendars` tables use parallelization for improved performance when fetching nested resource data
|
|
103
|
+
- Some endpoints like `listings` and `reservations` support incremental loading using `--interval-start` and `--interval-end` parameters
|
|
104
|
+
- Access tokens are JWTs with configurable expiration times - manage them securely and rotate them as needed
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.14.97"
|
|
@@ -54,6 +54,7 @@ from ingestr.src.sources import (
|
|
|
54
54
|
GoogleAnalyticsSource,
|
|
55
55
|
GoogleSheetsSource,
|
|
56
56
|
GorgiasSource,
|
|
57
|
+
HostawaySource,
|
|
57
58
|
HttpSource,
|
|
58
59
|
HubspotSource,
|
|
59
60
|
InfluxDBSource,
|
|
@@ -178,6 +179,7 @@ class SourceDestinationFactory:
|
|
|
178
179
|
"facebookads": FacebookAdsSource,
|
|
179
180
|
"fluxx": FluxxSource,
|
|
180
181
|
"slack": SlackSource,
|
|
182
|
+
"hostaway": HostawaySource,
|
|
181
183
|
"hubspot": HubspotSource,
|
|
182
184
|
"intercom": IntercomSource,
|
|
183
185
|
"jira": JiraSource,
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
from typing import Iterable
|
|
2
|
+
|
|
3
|
+
import dlt
|
|
4
|
+
import pendulum
|
|
5
|
+
from dlt.common.typing import TDataItem
|
|
6
|
+
from dlt.sources import DltResource
|
|
7
|
+
|
|
8
|
+
from .client import HostawayClient
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dlt.source(max_table_nesting=0)
|
|
12
|
+
def hostaway_source(
|
|
13
|
+
api_key: str,
|
|
14
|
+
start_date: pendulum.DateTime,
|
|
15
|
+
end_date: pendulum.DateTime | None = None,
|
|
16
|
+
) -> Iterable[DltResource]:
|
|
17
|
+
"""
|
|
18
|
+
Hostaway API source for fetching listings and fee settings data.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
api_key: Hostaway API key for Bearer token authentication
|
|
22
|
+
start_date: Start date for incremental loading
|
|
23
|
+
end_date: End date for incremental loading (defaults to current time)
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
Iterable[DltResource]: DLT resources for listings and/or fee settings
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
client = HostawayClient(api_key)
|
|
30
|
+
|
|
31
|
+
@dlt.resource(
|
|
32
|
+
write_disposition="merge",
|
|
33
|
+
name="listings",
|
|
34
|
+
primary_key="id",
|
|
35
|
+
)
|
|
36
|
+
def listings(
|
|
37
|
+
datetime=dlt.sources.incremental(
|
|
38
|
+
"latestActivityOn",
|
|
39
|
+
initial_value=start_date,
|
|
40
|
+
end_value=end_date,
|
|
41
|
+
range_end="closed",
|
|
42
|
+
range_start="closed",
|
|
43
|
+
),
|
|
44
|
+
) -> Iterable[TDataItem]:
|
|
45
|
+
"""
|
|
46
|
+
Fetch listings from Hostaway API with incremental loading.
|
|
47
|
+
Uses latestActivityOn field as the incremental cursor.
|
|
48
|
+
"""
|
|
49
|
+
start_dt = datetime.last_value
|
|
50
|
+
end_dt = (
|
|
51
|
+
datetime.end_value
|
|
52
|
+
if datetime.end_value is not None
|
|
53
|
+
else pendulum.now(tz="UTC")
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
yield from client.fetch_listings(start_dt, end_dt)
|
|
57
|
+
|
|
58
|
+
@dlt.resource(
|
|
59
|
+
write_disposition="merge",
|
|
60
|
+
name="listing_fee_settings",
|
|
61
|
+
primary_key="id",
|
|
62
|
+
)
|
|
63
|
+
def listing_fee_settings(
|
|
64
|
+
datetime=dlt.sources.incremental(
|
|
65
|
+
"updatedOn",
|
|
66
|
+
initial_value=start_date,
|
|
67
|
+
end_value=end_date,
|
|
68
|
+
range_end="closed",
|
|
69
|
+
range_start="closed",
|
|
70
|
+
),
|
|
71
|
+
) -> Iterable[TDataItem]:
|
|
72
|
+
"""
|
|
73
|
+
Fetch listing fee settings from Hostaway API with incremental loading.
|
|
74
|
+
Uses updatedOn field as the incremental cursor.
|
|
75
|
+
"""
|
|
76
|
+
start_dt = datetime.last_value
|
|
77
|
+
end_dt = (
|
|
78
|
+
datetime.end_value
|
|
79
|
+
if datetime.end_value is not None
|
|
80
|
+
else pendulum.now(tz="UTC")
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
yield from client.fetch_all_listing_fee_settings(start_dt, end_dt)
|
|
84
|
+
|
|
85
|
+
@dlt.resource(
|
|
86
|
+
write_disposition="replace",
|
|
87
|
+
name="listing_agreements",
|
|
88
|
+
)
|
|
89
|
+
def listing_agreements() -> Iterable[TDataItem]:
|
|
90
|
+
"""
|
|
91
|
+
Fetch listing agreements from Hostaway API.
|
|
92
|
+
|
|
93
|
+
Note: Uses replace mode, so no incremental loading.
|
|
94
|
+
"""
|
|
95
|
+
very_old_date = pendulum.datetime(1970, 1, 1, tz="UTC")
|
|
96
|
+
now = pendulum.now(tz="UTC")
|
|
97
|
+
yield from client.fetch_all_listing_agreements(very_old_date, now)
|
|
98
|
+
|
|
99
|
+
@dlt.resource(
|
|
100
|
+
write_disposition="replace",
|
|
101
|
+
name="listing_pricing_settings",
|
|
102
|
+
)
|
|
103
|
+
def listing_pricing_settings() -> Iterable[TDataItem]:
|
|
104
|
+
"""
|
|
105
|
+
Fetch listing pricing settings from Hostaway API.
|
|
106
|
+
|
|
107
|
+
Note: Uses replace mode, so no incremental loading.
|
|
108
|
+
"""
|
|
109
|
+
very_old_date = pendulum.datetime(1970, 1, 1, tz="UTC")
|
|
110
|
+
now = pendulum.now(tz="UTC")
|
|
111
|
+
yield from client.fetch_all_listing_pricing_settings(very_old_date, now)
|
|
112
|
+
|
|
113
|
+
@dlt.resource(
|
|
114
|
+
write_disposition="replace",
|
|
115
|
+
name="cancellation_policies",
|
|
116
|
+
)
|
|
117
|
+
def cancellation_policies() -> Iterable[TDataItem]:
|
|
118
|
+
yield from client.fetch_cancellation_policies()
|
|
119
|
+
|
|
120
|
+
@dlt.resource(
|
|
121
|
+
write_disposition="replace",
|
|
122
|
+
name="cancellation_policies_airbnb",
|
|
123
|
+
)
|
|
124
|
+
def cancellation_policies_airbnb() -> Iterable[TDataItem]:
|
|
125
|
+
yield from client.fetch_cancellation_policies_airbnb()
|
|
126
|
+
|
|
127
|
+
@dlt.resource(
|
|
128
|
+
write_disposition="replace",
|
|
129
|
+
name="cancellation_policies_marriott",
|
|
130
|
+
)
|
|
131
|
+
def cancellation_policies_marriott() -> Iterable[TDataItem]:
|
|
132
|
+
yield from client.fetch_cancellation_policies_marriott()
|
|
133
|
+
|
|
134
|
+
@dlt.resource(
|
|
135
|
+
write_disposition="replace",
|
|
136
|
+
name="cancellation_policies_vrbo",
|
|
137
|
+
)
|
|
138
|
+
def cancellation_policies_vrbo() -> Iterable[TDataItem]:
|
|
139
|
+
yield from client.fetch_cancellation_policies_vrbo()
|
|
140
|
+
|
|
141
|
+
@dlt.resource(
|
|
142
|
+
write_disposition="replace",
|
|
143
|
+
name="reservations",
|
|
144
|
+
selected=False,
|
|
145
|
+
)
|
|
146
|
+
def reservations() -> Iterable[TDataItem]:
|
|
147
|
+
yield from client.fetch_reservations()
|
|
148
|
+
|
|
149
|
+
@dlt.transformer(
|
|
150
|
+
data_from=reservations,
|
|
151
|
+
write_disposition="replace",
|
|
152
|
+
name="finance_fields",
|
|
153
|
+
)
|
|
154
|
+
def finance_fields(reservation_item: TDataItem) -> Iterable[TDataItem]:
|
|
155
|
+
@dlt.defer
|
|
156
|
+
def _get_finance_field(res_id):
|
|
157
|
+
return list(client.fetch_finance_field(res_id))
|
|
158
|
+
|
|
159
|
+
reservation_id_val = reservation_item.get("id")
|
|
160
|
+
if reservation_id_val:
|
|
161
|
+
yield _get_finance_field(reservation_id_val)
|
|
162
|
+
|
|
163
|
+
@dlt.resource(
|
|
164
|
+
write_disposition="replace",
|
|
165
|
+
name="reservation_payment_methods",
|
|
166
|
+
)
|
|
167
|
+
def reservation_payment_methods() -> Iterable[TDataItem]:
|
|
168
|
+
yield from client.fetch_reservation_payment_methods()
|
|
169
|
+
|
|
170
|
+
@dlt.transformer(
|
|
171
|
+
data_from=reservations,
|
|
172
|
+
write_disposition="replace",
|
|
173
|
+
name="reservation_rental_agreements",
|
|
174
|
+
)
|
|
175
|
+
def reservation_rental_agreements(
|
|
176
|
+
reservation_item: TDataItem,
|
|
177
|
+
) -> Iterable[TDataItem]:
|
|
178
|
+
@dlt.defer
|
|
179
|
+
def _get_rental_agreement(res_id):
|
|
180
|
+
return list(client.fetch_reservation_rental_agreement(res_id))
|
|
181
|
+
|
|
182
|
+
reservation_id = reservation_item.get("id")
|
|
183
|
+
if reservation_id:
|
|
184
|
+
yield _get_rental_agreement(reservation_id)
|
|
185
|
+
|
|
186
|
+
@dlt.transformer(
|
|
187
|
+
data_from=listings,
|
|
188
|
+
write_disposition="replace",
|
|
189
|
+
name="listing_calendars",
|
|
190
|
+
)
|
|
191
|
+
def listing_calendars(listing_item: TDataItem) -> Iterable[TDataItem]:
|
|
192
|
+
@dlt.defer
|
|
193
|
+
def _get_calendar(lst_id):
|
|
194
|
+
return list(client.fetch_listing_calendar(lst_id))
|
|
195
|
+
|
|
196
|
+
listing_id_val = listing_item.get("id")
|
|
197
|
+
if listing_id_val:
|
|
198
|
+
yield _get_calendar(listing_id_val)
|
|
199
|
+
|
|
200
|
+
@dlt.resource(
|
|
201
|
+
write_disposition="replace",
|
|
202
|
+
name="conversations",
|
|
203
|
+
)
|
|
204
|
+
def conversations() -> Iterable[TDataItem]:
|
|
205
|
+
yield from client.fetch_conversations()
|
|
206
|
+
|
|
207
|
+
@dlt.resource(
|
|
208
|
+
write_disposition="replace",
|
|
209
|
+
name="message_templates",
|
|
210
|
+
)
|
|
211
|
+
def message_templates() -> Iterable[TDataItem]:
|
|
212
|
+
yield from client.fetch_message_templates()
|
|
213
|
+
|
|
214
|
+
@dlt.resource(
|
|
215
|
+
write_disposition="replace",
|
|
216
|
+
name="bed_types",
|
|
217
|
+
)
|
|
218
|
+
def bed_types() -> Iterable[TDataItem]:
|
|
219
|
+
yield from client.fetch_bed_types()
|
|
220
|
+
|
|
221
|
+
@dlt.resource(
|
|
222
|
+
write_disposition="replace",
|
|
223
|
+
name="property_types",
|
|
224
|
+
)
|
|
225
|
+
def property_types() -> Iterable[TDataItem]:
|
|
226
|
+
yield from client.fetch_property_types()
|
|
227
|
+
|
|
228
|
+
@dlt.resource(
|
|
229
|
+
write_disposition="replace",
|
|
230
|
+
name="countries",
|
|
231
|
+
)
|
|
232
|
+
def countries() -> Iterable[TDataItem]:
|
|
233
|
+
yield from client.fetch_countries()
|
|
234
|
+
|
|
235
|
+
@dlt.resource(
|
|
236
|
+
write_disposition="replace",
|
|
237
|
+
name="account_tax_settings",
|
|
238
|
+
)
|
|
239
|
+
def account_tax_settings() -> Iterable[TDataItem]:
|
|
240
|
+
yield from client.fetch_account_tax_settings()
|
|
241
|
+
|
|
242
|
+
@dlt.resource(
|
|
243
|
+
write_disposition="replace",
|
|
244
|
+
name="user_groups",
|
|
245
|
+
)
|
|
246
|
+
def user_groups() -> Iterable[TDataItem]:
|
|
247
|
+
yield from client.fetch_user_groups()
|
|
248
|
+
|
|
249
|
+
@dlt.resource(
|
|
250
|
+
write_disposition="replace",
|
|
251
|
+
name="guest_payment_charges",
|
|
252
|
+
)
|
|
253
|
+
def guest_payment_charges() -> Iterable[TDataItem]:
|
|
254
|
+
yield from client.fetch_guest_payment_charges()
|
|
255
|
+
|
|
256
|
+
@dlt.resource(
|
|
257
|
+
write_disposition="replace",
|
|
258
|
+
name="coupons",
|
|
259
|
+
)
|
|
260
|
+
def coupons() -> Iterable[TDataItem]:
|
|
261
|
+
yield from client.fetch_coupons()
|
|
262
|
+
|
|
263
|
+
@dlt.resource(
|
|
264
|
+
write_disposition="replace",
|
|
265
|
+
name="webhook_reservations",
|
|
266
|
+
)
|
|
267
|
+
def webhook_reservations() -> Iterable[TDataItem]:
|
|
268
|
+
yield from client.fetch_webhook_reservations()
|
|
269
|
+
|
|
270
|
+
@dlt.resource(
|
|
271
|
+
write_disposition="replace",
|
|
272
|
+
name="tasks",
|
|
273
|
+
)
|
|
274
|
+
def tasks() -> Iterable[TDataItem]:
|
|
275
|
+
yield from client.fetch_tasks()
|
|
276
|
+
|
|
277
|
+
return (
|
|
278
|
+
listings,
|
|
279
|
+
listing_fee_settings,
|
|
280
|
+
listing_agreements,
|
|
281
|
+
listing_pricing_settings,
|
|
282
|
+
cancellation_policies,
|
|
283
|
+
cancellation_policies_airbnb,
|
|
284
|
+
cancellation_policies_marriott,
|
|
285
|
+
cancellation_policies_vrbo,
|
|
286
|
+
reservations,
|
|
287
|
+
finance_fields,
|
|
288
|
+
reservation_payment_methods,
|
|
289
|
+
reservation_rental_agreements,
|
|
290
|
+
listing_calendars,
|
|
291
|
+
conversations,
|
|
292
|
+
message_templates,
|
|
293
|
+
bed_types,
|
|
294
|
+
property_types,
|
|
295
|
+
countries,
|
|
296
|
+
account_tax_settings,
|
|
297
|
+
user_groups,
|
|
298
|
+
guest_payment_charges,
|
|
299
|
+
coupons,
|
|
300
|
+
webhook_reservations,
|
|
301
|
+
tasks,
|
|
302
|
+
)
|