ingestr 0.14.0__tar.gz → 0.14.2__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.

Files changed (350) hide show
  1. ingestr-0.14.2/.github/workflows/release.yml +151 -0
  2. {ingestr-0.14.0 → ingestr-0.14.2}/PKG-INFO +1 -1
  3. ingestr-0.14.2/ingestr/src/buildinfo.py +1 -0
  4. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/factory.py +2 -0
  5. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/fluxx/__init__.py +1 -4
  6. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/fluxx/helpers.py +0 -7
  7. ingestr-0.14.2/ingestr/src/intercom/__init__.py +142 -0
  8. ingestr-0.14.2/ingestr/src/intercom/helpers.py +674 -0
  9. ingestr-0.14.2/ingestr/src/intercom/settings.py +277 -0
  10. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/sources.py +73 -0
  11. ingestr-0.14.0/.github/workflows/release.yml +0 -81
  12. ingestr-0.14.0/ingestr/src/buildinfo.py +0 -1
  13. {ingestr-0.14.0 → ingestr-0.14.2}/.dlt/config.toml +0 -0
  14. {ingestr-0.14.0 → ingestr-0.14.2}/.dockerignore +0 -0
  15. {ingestr-0.14.0 → ingestr-0.14.2}/.githooks/pre-commit-hook.sh +0 -0
  16. {ingestr-0.14.0 → ingestr-0.14.2}/.github/workflows/deploy-docs.yml +0 -0
  17. {ingestr-0.14.0 → ingestr-0.14.2}/.github/workflows/secrets-scan.yml +0 -0
  18. {ingestr-0.14.0 → ingestr-0.14.2}/.github/workflows/tests.yml +0 -0
  19. {ingestr-0.14.0 → ingestr-0.14.2}/.gitignore +0 -0
  20. {ingestr-0.14.0 → ingestr-0.14.2}/.gitleaksignore +0 -0
  21. {ingestr-0.14.0 → ingestr-0.14.2}/.python-version +0 -0
  22. {ingestr-0.14.0 → ingestr-0.14.2}/.vale.ini +0 -0
  23. {ingestr-0.14.0 → ingestr-0.14.2}/Dockerfile +0 -0
  24. {ingestr-0.14.0 → ingestr-0.14.2}/LICENSE.md +0 -0
  25. {ingestr-0.14.0 → ingestr-0.14.2}/Makefile +0 -0
  26. {ingestr-0.14.0 → ingestr-0.14.2}/README.md +0 -0
  27. {ingestr-0.14.0 → ingestr-0.14.2}/docs/.vitepress/config.mjs +0 -0
  28. {ingestr-0.14.0 → ingestr-0.14.2}/docs/.vitepress/theme/custom.css +0 -0
  29. {ingestr-0.14.0 → ingestr-0.14.2}/docs/.vitepress/theme/index.js +0 -0
  30. {ingestr-0.14.0 → ingestr-0.14.2}/docs/commands/example-uris.md +0 -0
  31. {ingestr-0.14.0 → ingestr-0.14.2}/docs/commands/ingest.md +0 -0
  32. {ingestr-0.14.0 → ingestr-0.14.2}/docs/getting-started/core-concepts.md +0 -0
  33. {ingestr-0.14.0 → ingestr-0.14.2}/docs/getting-started/data-masking.md +0 -0
  34. {ingestr-0.14.0 → ingestr-0.14.2}/docs/getting-started/incremental-loading.md +0 -0
  35. {ingestr-0.14.0 → ingestr-0.14.2}/docs/getting-started/quickstart.md +0 -0
  36. {ingestr-0.14.0 → ingestr-0.14.2}/docs/getting-started/telemetry.md +0 -0
  37. {ingestr-0.14.0 → ingestr-0.14.2}/docs/index.md +0 -0
  38. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/applovin_max.png +0 -0
  39. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/athena.png +0 -0
  40. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/clickhouse_img.png +0 -0
  41. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/clickup_ingestion.png +0 -0
  42. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/cratedb-destination.png +0 -0
  43. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/cratedb-source.png +0 -0
  44. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/freshdesk_ingestion.png +0 -0
  45. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/gcp_spanner_ingestion.png +0 -0
  46. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/github.png +0 -0
  47. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/google_analytics_realtime_report.png +0 -0
  48. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/googleanalytics.png +0 -0
  49. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/ingestion_elasticsearch_img.png +0 -0
  50. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/kinesis.bigquery.png +0 -0
  51. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/linear.png +0 -0
  52. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/linkedin_ads.png +0 -0
  53. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/mixpanel_ingestion.png +0 -0
  54. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/personio.png +0 -0
  55. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/personio_duckdb.png +0 -0
  56. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/phantombuster.png +0 -0
  57. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/pipedrive.png +0 -0
  58. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/quickbook_ingestion.png +0 -0
  59. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/sftp.png +0 -0
  60. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/stripe_postgres.png +0 -0
  61. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/tiktok.png +0 -0
  62. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/wise_ingestion.png +0 -0
  63. {ingestr-0.14.0 → ingestr-0.14.2}/docs/media/zoom_ingestion.png +0 -0
  64. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/adjust.md +0 -0
  65. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/airtable.md +0 -0
  66. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/anthropic.md +0 -0
  67. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/applovin.md +0 -0
  68. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/applovin_max.md +0 -0
  69. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/appsflyer.md +0 -0
  70. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/appstore.md +0 -0
  71. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/asana.md +0 -0
  72. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/athena.md +0 -0
  73. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/attio.md +0 -0
  74. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/bigquery.md +0 -0
  75. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/chess.md +0 -0
  76. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/clickhouse.md +0 -0
  77. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/clickup.md +0 -0
  78. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/cratedb.md +0 -0
  79. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/csv.md +0 -0
  80. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/custom_queries.md +0 -0
  81. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/databricks.md +0 -0
  82. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/db2.md +0 -0
  83. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/docebo.md +0 -0
  84. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/duckdb.md +0 -0
  85. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/dynamodb.md +0 -0
  86. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/elasticsearch.md +0 -0
  87. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/facebook-ads.md +0 -0
  88. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/fluxx.md +0 -0
  89. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/frankfurter.md +0 -0
  90. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/freshdesk.md +0 -0
  91. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/fundraiseup.md +0 -0
  92. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/gcs.md +0 -0
  93. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/github.md +0 -0
  94. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/google-ads.md +0 -0
  95. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/google_analytics.md +0 -0
  96. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/gorgias.md +0 -0
  97. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/gsheets.md +0 -0
  98. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/hubspot.md +0 -0
  99. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/influxdb.md +0 -0
  100. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/isoc-pulse.md +0 -0
  101. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/kafka.md +0 -0
  102. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/kinesis.md +0 -0
  103. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/klaviyo.md +0 -0
  104. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/linear.md +0 -0
  105. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/linkedin_ads.md +0 -0
  106. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/mixpanel.md +0 -0
  107. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/mongodb.md +0 -0
  108. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/motherduck.md +0 -0
  109. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/mssql.md +0 -0
  110. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/mysql.md +0 -0
  111. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/notion.md +0 -0
  112. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/oracle.md +0 -0
  113. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/personio.md +0 -0
  114. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/phantombuster.md +0 -0
  115. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/pinterest.md +0 -0
  116. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/pipedrive.md +0 -0
  117. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/postgres.md +0 -0
  118. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/quickbooks.md +0 -0
  119. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/redshift.md +0 -0
  120. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/revenuecat.md +0 -0
  121. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/s3.md +0 -0
  122. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/salesforce.md +0 -0
  123. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/sap-hana.md +0 -0
  124. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/sftp.md +0 -0
  125. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/shopify.md +0 -0
  126. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/slack.md +0 -0
  127. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/smartsheets.md +0 -0
  128. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/snowflake.md +0 -0
  129. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/solidgate.md +0 -0
  130. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/spanner.md +0 -0
  131. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/sqlite.md +0 -0
  132. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/stripe.md +0 -0
  133. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/tiktok-ads.md +0 -0
  134. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/trino.md +0 -0
  135. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/trustpilot.md +0 -0
  136. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/wise.md +0 -0
  137. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/zendesk.md +0 -0
  138. {ingestr-0.14.0 → ingestr-0.14.2}/docs/supported-sources/zoom.md +0 -0
  139. {ingestr-0.14.0 → ingestr-0.14.2}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  140. {ingestr-0.14.0 → ingestr-0.14.2}/docs/tutorials/load-personio-duckdb.md +0 -0
  141. {ingestr-0.14.0 → ingestr-0.14.2}/docs/tutorials/load-stripe-postgres.md +0 -0
  142. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/conftest.py +0 -0
  143. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/main.py +0 -0
  144. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/.gitignore +0 -0
  145. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/adjust/__init__.py +0 -0
  146. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/adjust/adjust_helpers.py +0 -0
  147. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/airtable/__init__.py +0 -0
  148. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/anthropic/__init__.py +0 -0
  149. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/anthropic/helpers.py +0 -0
  150. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/applovin/__init__.py +0 -0
  151. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/applovin_max/__init__.py +0 -0
  152. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/appsflyer/__init__.py +0 -0
  153. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/appsflyer/client.py +0 -0
  154. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/appstore/__init__.py +0 -0
  155. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/appstore/client.py +0 -0
  156. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/appstore/errors.py +0 -0
  157. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/appstore/models.py +0 -0
  158. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/appstore/resources.py +0 -0
  159. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/arrow/__init__.py +0 -0
  160. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/asana_source/__init__.py +0 -0
  161. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/asana_source/helpers.py +0 -0
  162. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/asana_source/settings.py +0 -0
  163. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/attio/__init__.py +0 -0
  164. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/attio/helpers.py +0 -0
  165. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/blob.py +0 -0
  166. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/chess/__init__.py +0 -0
  167. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/chess/helpers.py +0 -0
  168. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/chess/settings.py +0 -0
  169. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/clickup/__init__.py +0 -0
  170. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/clickup/helpers.py +0 -0
  171. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/collector/spinner.py +0 -0
  172. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/destinations.py +0 -0
  173. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/docebo/__init__.py +0 -0
  174. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/docebo/client.py +0 -0
  175. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/docebo/helpers.py +0 -0
  176. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/dynamodb/__init__.py +0 -0
  177. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/elasticsearch/__init__.py +0 -0
  178. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/elasticsearch/helpers.py +0 -0
  179. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/errors.py +0 -0
  180. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/facebook_ads/__init__.py +0 -0
  181. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/facebook_ads/exceptions.py +0 -0
  182. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/facebook_ads/helpers.py +0 -0
  183. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/facebook_ads/settings.py +0 -0
  184. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/facebook_ads/utils.py +0 -0
  185. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/filesystem/__init__.py +0 -0
  186. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/filesystem/helpers.py +0 -0
  187. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/filesystem/readers.py +0 -0
  188. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/filters.py +0 -0
  189. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/frankfurter/__init__.py +0 -0
  190. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/frankfurter/helpers.py +0 -0
  191. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/freshdesk/__init__.py +0 -0
  192. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  193. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/freshdesk/settings.py +0 -0
  194. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/fundraiseup/__init__.py +0 -0
  195. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/fundraiseup/client.py +0 -0
  196. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/github/__init__.py +0 -0
  197. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/github/helpers.py +0 -0
  198. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/github/queries.py +0 -0
  199. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/github/settings.py +0 -0
  200. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_ads/__init__.py +0 -0
  201. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_ads/field.py +0 -0
  202. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_ads/metrics.py +0 -0
  203. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_ads/predicates.py +0 -0
  204. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_ads/reports.py +0 -0
  205. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_analytics/__init__.py +0 -0
  206. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_analytics/helpers.py +0 -0
  207. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_sheets/README.md +0 -0
  208. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_sheets/__init__.py +0 -0
  209. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  210. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  211. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  212. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/gorgias/__init__.py +0 -0
  213. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/gorgias/helpers.py +0 -0
  214. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/http_client.py +0 -0
  215. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/hubspot/__init__.py +0 -0
  216. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/hubspot/helpers.py +0 -0
  217. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/hubspot/settings.py +0 -0
  218. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/influxdb/__init__.py +0 -0
  219. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/influxdb/client.py +0 -0
  220. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/isoc_pulse/__init__.py +0 -0
  221. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/kafka/__init__.py +0 -0
  222. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/kafka/helpers.py +0 -0
  223. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/kinesis/__init__.py +0 -0
  224. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/kinesis/helpers.py +0 -0
  225. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/klaviyo/__init__.py +0 -0
  226. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/klaviyo/client.py +0 -0
  227. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/klaviyo/helpers.py +0 -0
  228. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/linear/__init__.py +0 -0
  229. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/linear/helpers.py +0 -0
  230. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/linkedin_ads/__init__.py +0 -0
  231. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  232. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/linkedin_ads/helpers.py +0 -0
  233. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/loader.py +0 -0
  234. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/masking.py +0 -0
  235. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/mixpanel/__init__.py +0 -0
  236. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/mixpanel/client.py +0 -0
  237. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/mongodb/__init__.py +0 -0
  238. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/mongodb/helpers.py +0 -0
  239. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/notion/__init__.py +0 -0
  240. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/notion/helpers/__init__.py +0 -0
  241. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/notion/helpers/client.py +0 -0
  242. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/notion/helpers/database.py +0 -0
  243. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/notion/settings.py +0 -0
  244. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/partition.py +0 -0
  245. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/personio/__init__.py +0 -0
  246. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/personio/helpers.py +0 -0
  247. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/phantombuster/__init__.py +0 -0
  248. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/phantombuster/client.py +0 -0
  249. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/pinterest/__init__.py +0 -0
  250. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/pipedrive/__init__.py +0 -0
  251. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  252. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  253. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  254. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/pipedrive/settings.py +0 -0
  255. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/pipedrive/typing.py +0 -0
  256. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/quickbooks/__init__.py +0 -0
  257. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/resource.py +0 -0
  258. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/revenuecat/__init__.py +0 -0
  259. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/revenuecat/helpers.py +0 -0
  260. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/salesforce/__init__.py +0 -0
  261. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/salesforce/helpers.py +0 -0
  262. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/shopify/__init__.py +0 -0
  263. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/shopify/exceptions.py +0 -0
  264. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/shopify/helpers.py +0 -0
  265. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/shopify/settings.py +0 -0
  266. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/slack/__init__.py +0 -0
  267. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/slack/helpers.py +0 -0
  268. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/slack/settings.py +0 -0
  269. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/smartsheets/__init__.py +0 -0
  270. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/solidgate/__init__.py +0 -0
  271. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/solidgate/helpers.py +0 -0
  272. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/sql_database/__init__.py +0 -0
  273. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/sql_database/callbacks.py +0 -0
  274. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/stripe_analytics/__init__.py +0 -0
  275. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/stripe_analytics/helpers.py +0 -0
  276. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/stripe_analytics/settings.py +0 -0
  277. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/table_definition.py +0 -0
  278. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/telemetry/event.py +0 -0
  279. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  280. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/tiktok_ads/__init__.py +0 -0
  281. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  282. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/time.py +0 -0
  283. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/trustpilot/__init__.py +0 -0
  284. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/trustpilot/client.py +0 -0
  285. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/version.py +0 -0
  286. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/wise/__init__.py +0 -0
  287. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/wise/client.py +0 -0
  288. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/zendesk/__init__.py +0 -0
  289. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  290. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  291. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  292. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  293. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/zendesk/settings.py +0 -0
  294. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/zoom/__init__.py +0 -0
  295. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/src/zoom/helpers.py +0 -0
  296. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/testdata/.gitignore +0 -0
  297. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/testdata/create_replace.csv +0 -0
  298. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/testdata/delete_insert_expected.csv +0 -0
  299. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/testdata/delete_insert_part1.csv +0 -0
  300. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/testdata/delete_insert_part2.csv +0 -0
  301. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/testdata/merge_expected.csv +0 -0
  302. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/testdata/merge_part1.csv +0 -0
  303. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/testdata/merge_part2.csv +0 -0
  304. {ingestr-0.14.0 → ingestr-0.14.2}/ingestr/tests/unit/test_smartsheets.py +0 -0
  305. {ingestr-0.14.0 → ingestr-0.14.2}/package-lock.json +0 -0
  306. {ingestr-0.14.0 → ingestr-0.14.2}/package.json +0 -0
  307. {ingestr-0.14.0 → ingestr-0.14.2}/pyproject.toml +0 -0
  308. {ingestr-0.14.0 → ingestr-0.14.2}/requirements-dev.txt +0 -0
  309. {ingestr-0.14.0 → ingestr-0.14.2}/requirements.in +0 -0
  310. {ingestr-0.14.0 → ingestr-0.14.2}/requirements.txt +0 -0
  311. {ingestr-0.14.0 → ingestr-0.14.2}/requirements_arm64.txt +0 -0
  312. {ingestr-0.14.0 → ingestr-0.14.2}/resources/demo.gif +0 -0
  313. {ingestr-0.14.0 → ingestr-0.14.2}/resources/demo.tape +0 -0
  314. {ingestr-0.14.0 → ingestr-0.14.2}/resources/ingestr.svg +0 -0
  315. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/AMPM.yml +0 -0
  316. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Acronyms.yml +0 -0
  317. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Colons.yml +0 -0
  318. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Contractions.yml +0 -0
  319. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/DateFormat.yml +0 -0
  320. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Ellipses.yml +0 -0
  321. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/EmDash.yml +0 -0
  322. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Exclamation.yml +0 -0
  323. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/FirstPerson.yml +0 -0
  324. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Gender.yml +0 -0
  325. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/GenderBias.yml +0 -0
  326. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/HeadingPunctuation.yml +0 -0
  327. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Headings.yml +0 -0
  328. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Latin.yml +0 -0
  329. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/LyHyphens.yml +0 -0
  330. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/OptionalPlurals.yml +0 -0
  331. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Ordinal.yml +0 -0
  332. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/OxfordComma.yml +0 -0
  333. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Parens.yml +0 -0
  334. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Passive.yml +0 -0
  335. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Periods.yml +0 -0
  336. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Quotes.yml +0 -0
  337. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Ranges.yml +0 -0
  338. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Semicolons.yml +0 -0
  339. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Slang.yml +0 -0
  340. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Spacing.yml +0 -0
  341. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Spelling.yml +0 -0
  342. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Units.yml +0 -0
  343. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/We.yml +0 -0
  344. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/Will.yml +0 -0
  345. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/WordList.yml +0 -0
  346. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/meta.json +0 -0
  347. {ingestr-0.14.0 → ingestr-0.14.2}/styles/Google/vocab.txt +0 -0
  348. {ingestr-0.14.0 → ingestr-0.14.2}/styles/bruin/Ingestr.yml +0 -0
  349. {ingestr-0.14.0 → ingestr-0.14.2}/styles/config/vocabularies/bruin/accept.txt +0 -0
  350. {ingestr-0.14.0 → ingestr-0.14.2}/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
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.14.0
3
+ Version: 0.14.2
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
@@ -0,0 +1 @@
1
+ version = "v0.14.2"
@@ -54,6 +54,7 @@ from ingestr.src.sources import (
54
54
  GorgiasSource,
55
55
  HubspotSource,
56
56
  InfluxDBSource,
57
+ IntercomSource,
57
58
  IsocPulseSource,
58
59
  KafkaSource,
59
60
  KinesisSource,
@@ -166,6 +167,7 @@ class SourceDestinationFactory:
166
167
  "fluxx": FluxxSource,
167
168
  "slack": SlackSource,
168
169
  "hubspot": HubspotSource,
170
+ "intercom": IntercomSource,
169
171
  "airtable": AirtableSource,
170
172
  "klaviyo": KlaviyoSource,
171
173
  "mixpanel": MixpanelSource,
@@ -9879,10 +9879,7 @@ def fluxx_source(
9879
9879
  if field_name in fields_to_extract:
9880
9880
  filtered_fields[field_name] = fields_to_extract[field_name]
9881
9881
  else:
9882
- # If field is not in the resource configuration, log a warning but continue
9883
- print(
9884
- f"Warning: Field '{field_name}' not found in {resource_name} configuration"
9885
- )
9882
+ filtered_fields[field_name] = {}
9886
9883
 
9887
9884
  fields_to_extract = filtered_fields
9888
9885
 
@@ -43,12 +43,6 @@ def fluxx_api_request(
43
43
  "Authorization": f"Bearer {access_token}",
44
44
  "Content-Type": "application/json",
45
45
  }
46
- # print(f"Making request to Fluxx API:")
47
- # print(f" Method: {method}")
48
- # print(f" URL: {url}")
49
- # print(f" Headers: {headers}")
50
- # print(f" Params: {params}")
51
- # print(f" Data: {data}")
52
46
 
53
47
  response = requests.request(
54
48
  method=method,
@@ -88,7 +82,6 @@ def paginate_fluxx_resource(
88
82
  params=params,
89
83
  )
90
84
 
91
- print("resssponse", response)
92
85
  if not response:
93
86
  break
94
87
 
@@ -0,0 +1,142 @@
1
+ """
2
+ Intercom source implementation for data ingestion.
3
+
4
+ This module provides DLT sources for retrieving data from Intercom API endpoints
5
+ including contacts, companies, conversations, tickets, and more.
6
+ """
7
+
8
+ from typing import Optional, Sequence
9
+
10
+ import dlt
11
+ from dlt.common.time import ensure_pendulum_datetime
12
+ from dlt.common.typing import TAnyDateTime
13
+ from dlt.sources import DltResource, DltSource
14
+
15
+ from .helpers import (
16
+ IntercomAPIClient,
17
+ IntercomCredentialsAccessToken,
18
+ TIntercomCredentials,
19
+ convert_datetime_to_timestamp,
20
+ create_resource_from_config,
21
+ transform_company,
22
+ transform_contact,
23
+ transform_conversation,
24
+ )
25
+ from .helpers import (
26
+ IntercomCredentialsOAuth as IntercomCredentialsOAuth,
27
+ )
28
+ from .settings import (
29
+ DEFAULT_START_DATE,
30
+ RESOURCE_CONFIGS,
31
+ )
32
+
33
+
34
+ @dlt.source(name="intercom", max_table_nesting=0)
35
+ def intercom_source(
36
+ credentials: TIntercomCredentials = dlt.secrets.value,
37
+ start_date: Optional[TAnyDateTime] = DEFAULT_START_DATE,
38
+ end_date: Optional[TAnyDateTime] = None,
39
+ ) -> Sequence[DltResource]:
40
+ """
41
+ A DLT source that retrieves data from Intercom API.
42
+
43
+ This source provides access to various Intercom resources including contacts,
44
+ companies, conversations, tickets, and more. It supports incremental loading
45
+ for resources that track updated timestamps.
46
+
47
+ Args:
48
+ credentials: Intercom API credentials (AccessToken or OAuth).
49
+ Defaults to dlt.secrets.value.
50
+ start_date: The start date for incremental loading.
51
+ Defaults to January 1, 2020.
52
+ end_date: Optional end date for incremental loading.
53
+ If not provided, loads all data from start_date to present.
54
+
55
+ Returns:
56
+ Sequence of DLT resources for different Intercom endpoints.
57
+
58
+ Example:
59
+ >>> source = intercom_source(
60
+ ... credentials=IntercomCredentialsAccessToken(
61
+ ... access_token="your_token",
62
+ ... region="us"
63
+ ... ),
64
+ ... start_date=datetime(2024, 1, 1)
65
+ ... )
66
+ """
67
+ # Initialize API client
68
+ api_client = IntercomAPIClient(credentials)
69
+
70
+ # Convert dates to pendulum and then to unix timestamps for Intercom API
71
+ start_date_obj = ensure_pendulum_datetime(start_date) if start_date else None
72
+ end_date_obj = ensure_pendulum_datetime(end_date) if end_date else None
73
+
74
+ # Convert to unix timestamps for API compatibility
75
+ # Use default start date if none provided
76
+ if not start_date_obj:
77
+ from .settings import DEFAULT_START_DATE
78
+
79
+ start_date_obj = ensure_pendulum_datetime(DEFAULT_START_DATE)
80
+
81
+ start_timestamp = convert_datetime_to_timestamp(start_date_obj)
82
+ end_timestamp = (
83
+ convert_datetime_to_timestamp(end_date_obj) if end_date_obj else None
84
+ )
85
+
86
+ # Transform function mapping
87
+ transform_functions = {
88
+ "transform_contact": transform_contact,
89
+ "transform_company": transform_company,
90
+ "transform_conversation": transform_conversation,
91
+ }
92
+
93
+ # Generate all resources from configuration
94
+ resources = []
95
+ for resource_name, config in RESOURCE_CONFIGS.items():
96
+ resource_func = create_resource_from_config(
97
+ resource_name,
98
+ config,
99
+ api_client,
100
+ start_timestamp,
101
+ end_timestamp,
102
+ transform_functions,
103
+ )
104
+
105
+ # Call the resource function to get the actual resource
106
+ resources.append(resource_func())
107
+
108
+ return resources
109
+
110
+
111
+ def intercom(
112
+ api_key: str,
113
+ region: str = "us",
114
+ start_date: Optional[TAnyDateTime] = DEFAULT_START_DATE,
115
+ end_date: Optional[TAnyDateTime] = None,
116
+ ) -> DltSource:
117
+ """
118
+ Convenience function to create Intercom source with access token.
119
+
120
+ Args:
121
+ api_key: Intercom API access token.
122
+ region: Data region (us, eu, or au). Defaults to "us".
123
+ start_date: Start date for incremental loading.
124
+ end_date: Optional end date for incremental loading.
125
+
126
+ Returns:
127
+ Sequence of DLT resources.
128
+
129
+ Example:
130
+ >>> source = intercom(
131
+ ... api_key="your_access_token",
132
+ ... region="us",
133
+ ... start_date=datetime(2024, 1, 1)
134
+ ... )
135
+ """
136
+ credentials = IntercomCredentialsAccessToken(access_token=api_key, region=region)
137
+
138
+ return intercom_source(
139
+ credentials=credentials,
140
+ start_date=start_date,
141
+ end_date=end_date,
142
+ )