ingestr 0.14.92__tar.gz → 0.14.93__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 (372) hide show
  1. {ingestr-0.14.92 → ingestr-0.14.93}/PKG-INFO +1 -1
  2. ingestr-0.14.93/docs/supported-sources/allium.md +164 -0
  3. ingestr-0.14.93/ingestr/src/allium/__init__.py +128 -0
  4. ingestr-0.14.93/ingestr/src/buildinfo.py +1 -0
  5. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/factory.py +2 -0
  6. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/sources.py +69 -0
  7. ingestr-0.14.92/ingestr/src/buildinfo.py +0 -1
  8. {ingestr-0.14.92 → ingestr-0.14.93}/.dlt/config.toml +0 -0
  9. {ingestr-0.14.92 → ingestr-0.14.93}/.dockerignore +0 -0
  10. {ingestr-0.14.92 → ingestr-0.14.93}/.githooks/pre-commit-hook.sh +0 -0
  11. {ingestr-0.14.92 → ingestr-0.14.93}/.github/workflows/deploy-docs.yml +0 -0
  12. {ingestr-0.14.92 → ingestr-0.14.93}/.github/workflows/release.yml +0 -0
  13. {ingestr-0.14.92 → ingestr-0.14.93}/.github/workflows/secrets-scan.yml +0 -0
  14. {ingestr-0.14.92 → ingestr-0.14.93}/.github/workflows/tests.yml +0 -0
  15. {ingestr-0.14.92 → ingestr-0.14.93}/.gitignore +0 -0
  16. {ingestr-0.14.92 → ingestr-0.14.93}/.gitleaksignore +0 -0
  17. {ingestr-0.14.92 → ingestr-0.14.93}/.python-version +0 -0
  18. {ingestr-0.14.92 → ingestr-0.14.93}/.vale.ini +0 -0
  19. {ingestr-0.14.92 → ingestr-0.14.93}/Dockerfile +0 -0
  20. {ingestr-0.14.92 → ingestr-0.14.93}/LICENSE.md +0 -0
  21. {ingestr-0.14.92 → ingestr-0.14.93}/Makefile +0 -0
  22. {ingestr-0.14.92 → ingestr-0.14.93}/README.md +0 -0
  23. {ingestr-0.14.92 → ingestr-0.14.93}/docs/.vitepress/config.mjs +0 -0
  24. {ingestr-0.14.92 → ingestr-0.14.93}/docs/.vitepress/theme/custom.css +0 -0
  25. {ingestr-0.14.92 → ingestr-0.14.93}/docs/.vitepress/theme/index.js +0 -0
  26. {ingestr-0.14.92 → ingestr-0.14.93}/docs/commands/example-uris.md +0 -0
  27. {ingestr-0.14.92 → ingestr-0.14.93}/docs/commands/ingest.md +0 -0
  28. {ingestr-0.14.92 → ingestr-0.14.93}/docs/getting-started/core-concepts.md +0 -0
  29. {ingestr-0.14.92 → ingestr-0.14.93}/docs/getting-started/data-masking.md +0 -0
  30. {ingestr-0.14.92 → ingestr-0.14.93}/docs/getting-started/incremental-loading.md +0 -0
  31. {ingestr-0.14.92 → ingestr-0.14.93}/docs/getting-started/quickstart.md +0 -0
  32. {ingestr-0.14.92 → ingestr-0.14.93}/docs/getting-started/telemetry.md +0 -0
  33. {ingestr-0.14.92 → ingestr-0.14.93}/docs/index.md +0 -0
  34. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/applovin_max.png +0 -0
  35. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/athena.png +0 -0
  36. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/clickhouse_img.png +0 -0
  37. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/clickup_ingestion.png +0 -0
  38. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/cratedb-destination.png +0 -0
  39. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/cratedb-source.png +0 -0
  40. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/freshdesk_ingestion.png +0 -0
  41. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/gcp_spanner_ingestion.png +0 -0
  42. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/github.png +0 -0
  43. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/google_analytics_realtime_report.png +0 -0
  44. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/googleanalytics.png +0 -0
  45. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/ingestion_elasticsearch_img.png +0 -0
  46. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/kinesis.bigquery.png +0 -0
  47. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/linear.png +0 -0
  48. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/linkedin_ads.png +0 -0
  49. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/mixpanel_ingestion.png +0 -0
  50. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/personio.png +0 -0
  51. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/personio_duckdb.png +0 -0
  52. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/phantombuster.png +0 -0
  53. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/pipedrive.png +0 -0
  54. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/quickbook_ingestion.png +0 -0
  55. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/sftp.png +0 -0
  56. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/stripe_postgres.png +0 -0
  57. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/tiktok.png +0 -0
  58. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/wise_ingestion.png +0 -0
  59. {ingestr-0.14.92 → ingestr-0.14.93}/docs/media/zoom_ingestion.png +0 -0
  60. {ingestr-0.14.92 → ingestr-0.14.93}/docs/public/demo.gif +0 -0
  61. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/adjust.md +0 -0
  62. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/airtable.md +0 -0
  63. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/anthropic.md +0 -0
  64. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/applovin.md +0 -0
  65. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/applovin_max.md +0 -0
  66. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/appsflyer.md +0 -0
  67. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/appstore.md +0 -0
  68. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/asana.md +0 -0
  69. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/athena.md +0 -0
  70. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/attio.md +0 -0
  71. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/bigquery.md +0 -0
  72. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/chess.md +0 -0
  73. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/clickhouse.md +0 -0
  74. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/clickup.md +0 -0
  75. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/cratedb.md +0 -0
  76. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/csv.md +0 -0
  77. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/custom_queries.md +0 -0
  78. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/databricks.md +0 -0
  79. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/db2.md +0 -0
  80. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/docebo.md +0 -0
  81. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/duckdb.md +0 -0
  82. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/dynamodb.md +0 -0
  83. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/elasticsearch.md +0 -0
  84. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/facebook-ads.md +0 -0
  85. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/fluxx.md +0 -0
  86. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/frankfurter.md +0 -0
  87. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/freshdesk.md +0 -0
  88. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/fundraiseup.md +0 -0
  89. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/gcs.md +0 -0
  90. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/github.md +0 -0
  91. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/google-ads.md +0 -0
  92. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/google_analytics.md +0 -0
  93. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/gorgias.md +0 -0
  94. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/gsheets.md +0 -0
  95. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/http.md +0 -0
  96. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/hubspot.md +0 -0
  97. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/influxdb.md +0 -0
  98. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/intercom.md +0 -0
  99. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/isoc-pulse.md +0 -0
  100. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/jira.md +0 -0
  101. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/kafka.md +0 -0
  102. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/kinesis.md +0 -0
  103. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/klaviyo.md +0 -0
  104. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/linear.md +0 -0
  105. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/linkedin_ads.md +0 -0
  106. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/mailchimp.md +0 -0
  107. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/mixpanel.md +0 -0
  108. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/monday.md +0 -0
  109. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/mongodb.md +0 -0
  110. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/motherduck.md +0 -0
  111. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/mssql.md +0 -0
  112. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/mysql.md +0 -0
  113. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/notion.md +0 -0
  114. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/oracle.md +0 -0
  115. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/personio.md +0 -0
  116. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/phantombuster.md +0 -0
  117. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/pinterest.md +0 -0
  118. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/pipedrive.md +0 -0
  119. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/plusvibeai.md +0 -0
  120. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/postgres.md +0 -0
  121. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/quickbooks.md +0 -0
  122. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/redshift.md +0 -0
  123. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/revenuecat.md +0 -0
  124. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/s3.md +0 -0
  125. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/salesforce.md +0 -0
  126. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/sap-hana.md +0 -0
  127. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/sftp.md +0 -0
  128. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/shopify.md +0 -0
  129. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/slack.md +0 -0
  130. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/smartsheets.md +0 -0
  131. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/snowflake.md +0 -0
  132. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/solidgate.md +0 -0
  133. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/spanner.md +0 -0
  134. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/sqlite.md +0 -0
  135. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/stripe.md +0 -0
  136. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/tiktok-ads.md +0 -0
  137. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/trino.md +0 -0
  138. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/trustpilot.md +0 -0
  139. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/wise.md +0 -0
  140. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/zendesk.md +0 -0
  141. {ingestr-0.14.92 → ingestr-0.14.93}/docs/supported-sources/zoom.md +0 -0
  142. {ingestr-0.14.92 → ingestr-0.14.93}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  143. {ingestr-0.14.92 → ingestr-0.14.93}/docs/tutorials/load-personio-duckdb.md +0 -0
  144. {ingestr-0.14.92 → ingestr-0.14.93}/docs/tutorials/load-stripe-postgres.md +0 -0
  145. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/conftest.py +0 -0
  146. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/main.py +0 -0
  147. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/.gitignore +0 -0
  148. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/adjust/__init__.py +0 -0
  149. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/adjust/adjust_helpers.py +0 -0
  150. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/airtable/__init__.py +0 -0
  151. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/anthropic/__init__.py +0 -0
  152. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/anthropic/helpers.py +0 -0
  153. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/applovin/__init__.py +0 -0
  154. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/applovin_max/__init__.py +0 -0
  155. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/appsflyer/__init__.py +0 -0
  156. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/appsflyer/client.py +0 -0
  157. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/appstore/__init__.py +0 -0
  158. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/appstore/client.py +0 -0
  159. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/appstore/errors.py +0 -0
  160. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/appstore/models.py +0 -0
  161. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/appstore/resources.py +0 -0
  162. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/arrow/__init__.py +0 -0
  163. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/asana_source/__init__.py +0 -0
  164. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/asana_source/helpers.py +0 -0
  165. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/asana_source/settings.py +0 -0
  166. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/attio/__init__.py +0 -0
  167. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/attio/helpers.py +0 -0
  168. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/blob.py +0 -0
  169. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/chess/__init__.py +0 -0
  170. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/chess/helpers.py +0 -0
  171. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/chess/settings.py +0 -0
  172. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/clickup/__init__.py +0 -0
  173. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/clickup/helpers.py +0 -0
  174. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/collector/spinner.py +0 -0
  175. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/destinations.py +0 -0
  176. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/docebo/__init__.py +0 -0
  177. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/docebo/client.py +0 -0
  178. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/docebo/helpers.py +0 -0
  179. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/dynamodb/__init__.py +0 -0
  180. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/elasticsearch/__init__.py +0 -0
  181. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/elasticsearch/helpers.py +0 -0
  182. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/errors.py +0 -0
  183. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/facebook_ads/__init__.py +0 -0
  184. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/facebook_ads/exceptions.py +0 -0
  185. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/facebook_ads/helpers.py +0 -0
  186. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/facebook_ads/settings.py +0 -0
  187. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/facebook_ads/utils.py +0 -0
  188. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/filesystem/__init__.py +0 -0
  189. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/filesystem/helpers.py +0 -0
  190. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/filesystem/readers.py +0 -0
  191. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/filters.py +0 -0
  192. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/fluxx/__init__.py +0 -0
  193. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/fluxx/helpers.py +0 -0
  194. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/frankfurter/__init__.py +0 -0
  195. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/frankfurter/helpers.py +0 -0
  196. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/freshdesk/__init__.py +0 -0
  197. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  198. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/freshdesk/settings.py +0 -0
  199. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/fundraiseup/__init__.py +0 -0
  200. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/fundraiseup/client.py +0 -0
  201. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/github/__init__.py +0 -0
  202. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/github/helpers.py +0 -0
  203. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/github/queries.py +0 -0
  204. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/github/settings.py +0 -0
  205. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_ads/__init__.py +0 -0
  206. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_ads/field.py +0 -0
  207. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_ads/metrics.py +0 -0
  208. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_ads/predicates.py +0 -0
  209. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_ads/reports.py +0 -0
  210. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_analytics/__init__.py +0 -0
  211. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_analytics/helpers.py +0 -0
  212. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_sheets/README.md +0 -0
  213. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_sheets/__init__.py +0 -0
  214. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  215. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  216. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  217. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/gorgias/__init__.py +0 -0
  218. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/gorgias/helpers.py +0 -0
  219. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/http/__init__.py +0 -0
  220. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/http/readers.py +0 -0
  221. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/http_client.py +0 -0
  222. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/hubspot/__init__.py +0 -0
  223. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/hubspot/helpers.py +0 -0
  224. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/hubspot/settings.py +0 -0
  225. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/influxdb/__init__.py +0 -0
  226. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/influxdb/client.py +0 -0
  227. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/intercom/__init__.py +0 -0
  228. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/intercom/helpers.py +0 -0
  229. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/intercom/settings.py +0 -0
  230. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/isoc_pulse/__init__.py +0 -0
  231. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/jira_source/__init__.py +0 -0
  232. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/jira_source/helpers.py +0 -0
  233. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/jira_source/settings.py +0 -0
  234. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/kafka/__init__.py +0 -0
  235. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/kafka/helpers.py +0 -0
  236. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/kinesis/__init__.py +0 -0
  237. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/kinesis/helpers.py +0 -0
  238. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/klaviyo/__init__.py +0 -0
  239. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/klaviyo/client.py +0 -0
  240. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/klaviyo/helpers.py +0 -0
  241. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/linear/__init__.py +0 -0
  242. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/linear/helpers.py +0 -0
  243. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/linkedin_ads/__init__.py +0 -0
  244. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  245. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/linkedin_ads/helpers.py +0 -0
  246. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/loader.py +0 -0
  247. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/mailchimp/__init__.py +0 -0
  248. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/mailchimp/helpers.py +0 -0
  249. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/mailchimp/settings.py +0 -0
  250. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/masking.py +0 -0
  251. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/mixpanel/__init__.py +0 -0
  252. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/mixpanel/client.py +0 -0
  253. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/monday/__init__.py +0 -0
  254. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/monday/helpers.py +0 -0
  255. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/monday/settings.py +0 -0
  256. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/mongodb/__init__.py +0 -0
  257. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/mongodb/helpers.py +0 -0
  258. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/notion/__init__.py +0 -0
  259. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/notion/helpers/__init__.py +0 -0
  260. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/notion/helpers/client.py +0 -0
  261. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/notion/helpers/database.py +0 -0
  262. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/notion/settings.py +0 -0
  263. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/partition.py +0 -0
  264. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/personio/__init__.py +0 -0
  265. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/personio/helpers.py +0 -0
  266. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/phantombuster/__init__.py +0 -0
  267. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/phantombuster/client.py +0 -0
  268. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/pinterest/__init__.py +0 -0
  269. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/pipedrive/__init__.py +0 -0
  270. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  271. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  272. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  273. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/pipedrive/settings.py +0 -0
  274. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/pipedrive/typing.py +0 -0
  275. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/plusvibeai/__init__.py +0 -0
  276. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/plusvibeai/helpers.py +0 -0
  277. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/plusvibeai/settings.py +0 -0
  278. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/quickbooks/__init__.py +0 -0
  279. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/resource.py +0 -0
  280. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/revenuecat/__init__.py +0 -0
  281. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/revenuecat/helpers.py +0 -0
  282. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/salesforce/__init__.py +0 -0
  283. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/salesforce/helpers.py +0 -0
  284. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/shopify/__init__.py +0 -0
  285. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/shopify/exceptions.py +0 -0
  286. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/shopify/helpers.py +0 -0
  287. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/shopify/settings.py +0 -0
  288. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/slack/__init__.py +0 -0
  289. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/slack/helpers.py +0 -0
  290. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/slack/settings.py +0 -0
  291. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/smartsheets/__init__.py +0 -0
  292. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/solidgate/__init__.py +0 -0
  293. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/solidgate/helpers.py +0 -0
  294. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/sql_database/__init__.py +0 -0
  295. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/sql_database/callbacks.py +0 -0
  296. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/stripe_analytics/__init__.py +0 -0
  297. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/stripe_analytics/helpers.py +0 -0
  298. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/stripe_analytics/settings.py +0 -0
  299. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/table_definition.py +0 -0
  300. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/telemetry/event.py +0 -0
  301. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  302. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/tiktok_ads/__init__.py +0 -0
  303. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  304. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/time.py +0 -0
  305. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/trustpilot/__init__.py +0 -0
  306. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/trustpilot/client.py +0 -0
  307. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/version.py +0 -0
  308. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/wise/__init__.py +0 -0
  309. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/wise/client.py +0 -0
  310. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/zendesk/__init__.py +0 -0
  311. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  312. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  313. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  314. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  315. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/zendesk/settings.py +0 -0
  316. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/zoom/__init__.py +0 -0
  317. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/src/zoom/helpers.py +0 -0
  318. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/testdata/.gitignore +0 -0
  319. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/testdata/create_replace.csv +0 -0
  320. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/testdata/delete_insert_expected.csv +0 -0
  321. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/testdata/delete_insert_part1.csv +0 -0
  322. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/testdata/delete_insert_part2.csv +0 -0
  323. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/testdata/merge_expected.csv +0 -0
  324. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/testdata/merge_part1.csv +0 -0
  325. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/testdata/merge_part2.csv +0 -0
  326. {ingestr-0.14.92 → ingestr-0.14.93}/ingestr/tests/unit/test_smartsheets.py +0 -0
  327. {ingestr-0.14.92 → ingestr-0.14.93}/package-lock.json +0 -0
  328. {ingestr-0.14.92 → ingestr-0.14.93}/package.json +0 -0
  329. {ingestr-0.14.92 → ingestr-0.14.93}/pyproject.toml +0 -0
  330. {ingestr-0.14.92 → ingestr-0.14.93}/requirements-dev.txt +0 -0
  331. {ingestr-0.14.92 → ingestr-0.14.93}/requirements.in +0 -0
  332. {ingestr-0.14.92 → ingestr-0.14.93}/requirements.txt +0 -0
  333. {ingestr-0.14.92 → ingestr-0.14.93}/requirements_arm64.txt +0 -0
  334. {ingestr-0.14.92 → ingestr-0.14.93}/resources/demo.gif +0 -0
  335. {ingestr-0.14.92 → ingestr-0.14.93}/resources/demo.tape +0 -0
  336. {ingestr-0.14.92 → ingestr-0.14.93}/resources/ingestr.svg +0 -0
  337. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/AMPM.yml +0 -0
  338. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Acronyms.yml +0 -0
  339. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Colons.yml +0 -0
  340. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Contractions.yml +0 -0
  341. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/DateFormat.yml +0 -0
  342. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Ellipses.yml +0 -0
  343. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/EmDash.yml +0 -0
  344. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Exclamation.yml +0 -0
  345. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/FirstPerson.yml +0 -0
  346. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Gender.yml +0 -0
  347. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/GenderBias.yml +0 -0
  348. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/HeadingPunctuation.yml +0 -0
  349. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Headings.yml +0 -0
  350. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Latin.yml +0 -0
  351. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/LyHyphens.yml +0 -0
  352. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/OptionalPlurals.yml +0 -0
  353. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Ordinal.yml +0 -0
  354. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/OxfordComma.yml +0 -0
  355. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Parens.yml +0 -0
  356. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Passive.yml +0 -0
  357. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Periods.yml +0 -0
  358. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Quotes.yml +0 -0
  359. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Ranges.yml +0 -0
  360. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Semicolons.yml +0 -0
  361. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Slang.yml +0 -0
  362. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Spacing.yml +0 -0
  363. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Spelling.yml +0 -0
  364. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Units.yml +0 -0
  365. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/We.yml +0 -0
  366. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/Will.yml +0 -0
  367. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/WordList.yml +0 -0
  368. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/meta.json +0 -0
  369. {ingestr-0.14.92 → ingestr-0.14.93}/styles/Google/vocab.txt +0 -0
  370. {ingestr-0.14.92 → ingestr-0.14.93}/styles/bruin/Ingestr.yml +0 -0
  371. {ingestr-0.14.92 → ingestr-0.14.93}/styles/config/vocabularies/bruin/accept.txt +0 -0
  372. {ingestr-0.14.92 → ingestr-0.14.93}/test.env.template +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.14.92
3
+ Version: 0.14.93
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,164 @@
1
+ # Allium
2
+
3
+ [Allium](https://allium.so/) is a blockchain data platform that provides access to indexed blockchain data through a powerful query interface.
4
+
5
+ ingestr supports Allium as a source.
6
+
7
+ ## URI format
8
+
9
+ The URI format for Allium is as follows:
10
+
11
+ ```plaintext
12
+ allium://?api_key=<api-key>
13
+ ```
14
+
15
+ URI parameters:
16
+
17
+ - `api_key`: The API key used for authentication with the Allium API (required)
18
+
19
+ The URI is used to connect to the Allium API for extracting blockchain data.
20
+
21
+ Query parameters should be passed using ingestr's `--interval-start` and `--interval-end` flags.
22
+
23
+ ## Setting up an Allium Integration
24
+
25
+ To get your Allium API credentials:
26
+
27
+ 1. Sign up for an Allium account at [allium.so](https://allium.so/)
28
+ 2. Navigate to your account settings
29
+ 3. Generate an API key
30
+ 4. Find your query ID from the Allium explorer interface
31
+
32
+ Once you have your credentials, here's a sample command that will copy the data from Allium into a DuckDB database:
33
+
34
+ ```sh
35
+ ingestr ingest \
36
+ --source-uri 'allium://?api_key=your_api_key' \
37
+ --source-table 'query:your_query_id' \
38
+ --interval-start '2025-02-01' \
39
+ --interval-end '2025-02-02' \
40
+ --dest-uri duckdb:///allium.duckdb \
41
+ --dest-table 'allium.query_results'
42
+ ```
43
+
44
+ The result of this command will be a table in the `allium.duckdb` database.
45
+
46
+ ## Query ID Format
47
+
48
+ Allium source uses query IDs to identify which query to execute. The query ID should be passed as the `--source-table` parameter with the `query:` prefix.
49
+
50
+ | Format | Example | Description |
51
+ |--------|---------|-------------|
52
+ | `query:<query_id>` | `query:abc123def456` | The query ID from Allium explorer |
53
+ | `query:<query_id>:<params>` | `query:abc123def456:network=ethereum&min_value=1000` | Query ID with custom parameters |
54
+ | `query:<query_id>:<params>` | `query:abc123def456:limit=5000&compute_profile=standard` | Query ID with run_config parameters |
55
+
56
+ Each query ID represents a specific blockchain data query that you've created in the Allium explorer.
57
+
58
+ ### Run Config Parameters
59
+
60
+ Special parameters that control query execution (part of `run_config`):
61
+
62
+ - `limit`: Limit the number of rows in the result (max 250,000)
63
+ - `compute_profile`: Compute profile identifier
64
+
65
+ These parameters are passed in the same format as custom parameters but are used for query execution control.
66
+
67
+ ### Custom Query Parameters
68
+
69
+ You can pass additional custom parameters to your Allium query using the format:
70
+ ```
71
+ query:<query_id>:param1=value1&param2=value2
72
+ ```
73
+
74
+ These custom parameters will be merged with the default date parameters. If a custom parameter has the same name as a default parameter, the custom value will take precedence.
75
+
76
+ ## How it works
77
+
78
+ The Allium source connector:
79
+
80
+ 1. **Starts an async query execution** using your query ID and parameters
81
+ 2. **Polls for completion status** every 5 seconds (max 12 hours)
82
+ 3. **Fetches and returns the results** once the query completes successfully
83
+
84
+ ## Examples
85
+
86
+ ### Basic Query Ingestion (without date filters)
87
+
88
+ ```sh
89
+ ingestr ingest \
90
+ --source-uri 'allium://?api_key=your_api_key' \
91
+ --source-table 'query:abc123def456' \
92
+ --dest-uri duckdb:///allium.duckdb \
93
+ --dest-table 'allium.transactions'
94
+ ```
95
+
96
+ ### Query with Date Parameters
97
+
98
+ ```sh
99
+ ingestr ingest \
100
+ --source-uri 'allium://?api_key=your_api_key' \
101
+ --source-table 'query:abc123def456' \
102
+ --interval-start '2025-02-01' \
103
+ --interval-end '2025-02-02' \
104
+ --dest-uri duckdb:///allium.duckdb \
105
+ --dest-table 'allium.daily_transactions'
106
+ ```
107
+
108
+ ### Query with Custom Parameters
109
+
110
+ ```sh
111
+ ingestr ingest \
112
+ --source-uri 'allium://?api_key=your_api_key' \
113
+ --source-table 'query:abc123def456:network=ethereum&min_value=1000' \
114
+ --interval-start '2025-02-01' \
115
+ --interval-end '2025-02-02' \
116
+ --dest-uri duckdb:///allium.duckdb \
117
+ --dest-table 'allium.filtered_transactions'
118
+ ```
119
+
120
+ In this example, the query will receive both the default date parameters and the custom parameters `network` and `min_value`.
121
+
122
+ ### Query with Run Config Parameters
123
+
124
+ ```sh
125
+ ingestr ingest \
126
+ --source-uri 'allium://?api_key=your_api_key' \
127
+ --source-table 'query:abc123def456:limit=5000&compute_profile=standard' \
128
+ --interval-start '2025-02-01' \
129
+ --interval-end '2025-02-02' \
130
+ --dest-uri duckdb:///allium.duckdb \
131
+ --dest-table 'allium.query_results'
132
+ ```
133
+
134
+ This example limits the result to 5000 rows and uses the 'standard' compute profile.
135
+
136
+ ### Query with Both Custom and Run Config Parameters
137
+
138
+ ```sh
139
+ ingestr ingest \
140
+ --source-uri 'allium://?api_key=your_api_key' \
141
+ --source-table 'query:abc123def456:network=ethereum&limit=10000&compute_profile=large' \
142
+ --interval-start '2025-02-01' \
143
+ --interval-end '2025-02-02' \
144
+ --dest-uri duckdb:///allium.duckdb \
145
+ --dest-table 'allium.filtered_transactions'
146
+ ```
147
+
148
+ This example combines custom query parameters (`network`) with run config parameters (`limit` and `compute_profile`).
149
+
150
+ ## Notes
151
+
152
+ > [!NOTE]
153
+ > - Query execution is asynchronous and may take time depending on the complexity of your query
154
+ > - The connector will wait up to 12 hours for query completion
155
+ > - Use `--interval-start` and `--interval-end` flags to pass date parameters to your Allium query
156
+ > - The dates will be automatically converted to:
157
+ > - `start_date` and `end_date` parameters in the format `YYYY-MM-DD`
158
+ > - `start_timestamp` and `end_timestamp` parameters as Unix timestamps (seconds since epoch)
159
+ > - **Default dates**: If not specified, defaults to 2 days ago (00:00) to yesterday (00:00)
160
+ > - Custom parameters can be added to the source table format: `query:your_query_id:param1=value1&param2=value2`
161
+ > - Run config parameters (`limit`, `compute_profile`) are also passed in the source table format
162
+ > - Custom parameters will override default parameters if they have the same name
163
+ > - The `limit` parameter has a maximum value of 250,000 rows
164
+ > - Make sure your query ID is valid and accessible with your API key
@@ -0,0 +1,128 @@
1
+ """
2
+ Allium source for data extraction via REST API.
3
+
4
+ This source provides access to Allium blockchain data via asynchronous query execution.
5
+ """
6
+
7
+ import time
8
+ from typing import Any, Iterator
9
+
10
+ import dlt
11
+
12
+ from ingestr.src.http_client import create_client
13
+
14
+
15
+ @dlt.source(max_table_nesting=0, name="allium_source")
16
+ def allium_source(
17
+ api_key: str,
18
+ query_id: str,
19
+ parameters: dict[str, Any] | None = None,
20
+ limit: int | None = None,
21
+ compute_profile: str | None = None,
22
+ ) -> Any:
23
+ """
24
+ Allium data source for blockchain data extraction.
25
+
26
+ This source connects to Allium API, runs async queries, and fetches results.
27
+
28
+ Args:
29
+ api_key: Allium API key for authentication
30
+ query_id: The query ID to execute (e.g., 'abc123')
31
+ parameters: Optional parameters for the query (e.g., {'start_date': '2025-02-01', 'end_date': '2025-02-02'})
32
+ limit: Limit the number of rows in the result (max 250,000)
33
+ compute_profile: Compute profile identifier
34
+
35
+ Yields:
36
+ DltResource: Data resources for Allium query results
37
+ """
38
+ base_url = "https://api.allium.so/api/v1/explorer"
39
+ session = create_client()
40
+ headers = {"X-API-Key": api_key}
41
+
42
+ @dlt.resource(
43
+ name="query_results",
44
+ write_disposition="replace",
45
+ )
46
+ def fetch_query_results() -> Iterator[dict[str, Any]]:
47
+ """
48
+ Fetch query results from Allium.
49
+
50
+ This function:
51
+ 1. Starts an async query execution
52
+ 2. Polls for completion status
53
+ 3. Fetches and yields the results
54
+ """
55
+ # Step 1: Start async query execution
56
+ run_config: dict[str, Any] = {}
57
+ if limit is not None:
58
+ run_config["limit"] = limit
59
+ if compute_profile is not None:
60
+ run_config["compute_profile"] = compute_profile
61
+
62
+ run_payload = {"parameters": parameters or {}, "run_config": run_config}
63
+
64
+ run_response = session.post(
65
+ f"{base_url}/queries/{query_id}/run-async",
66
+ json=run_payload,
67
+ headers=headers,
68
+ )
69
+
70
+ run_data = run_response.json()
71
+
72
+ if "run_id" not in run_data:
73
+ raise ValueError(f"Failed to start query execution: {run_data}")
74
+
75
+ run_id = run_data["run_id"]
76
+
77
+ # Step 2: Poll for completion
78
+ max_retries = 8640 # Max 12 hours with 5-second intervals
79
+ retry_count = 0
80
+ poll_interval = 5 # seconds
81
+
82
+ while retry_count < max_retries:
83
+ status_response = session.get(
84
+ f"{base_url}/query-runs/{run_id}/status",
85
+ headers=headers,
86
+ )
87
+ status_response.raise_for_status()
88
+ status_data = status_response.json()
89
+
90
+ # Handle both string and dict responses
91
+ if isinstance(status_data, str):
92
+ status = status_data
93
+ else:
94
+ status = status_data.get("status")
95
+
96
+ if status == "success":
97
+ break
98
+ elif status == "failed":
99
+ error_msg = (
100
+ status_data.get("error", "Unknown error")
101
+ if isinstance(status_data, dict)
102
+ else "Unknown error"
103
+ )
104
+ raise ValueError(f"Query execution failed: {error_msg}")
105
+ elif status in ["pending", "running", "queued"]:
106
+ time.sleep(poll_interval)
107
+ retry_count += 1
108
+ else:
109
+ raise ValueError(f"Unknown status: {status}")
110
+
111
+ if retry_count >= max_retries:
112
+ raise TimeoutError(
113
+ f"Query execution timed out after {max_retries * poll_interval} seconds"
114
+ )
115
+
116
+ # Step 3: Fetch results
117
+ results_response = session.get(
118
+ f"{base_url}/query-runs/{run_id}/results",
119
+ headers=headers,
120
+ params={"f": "json"},
121
+ )
122
+ results_response.raise_for_status()
123
+ query_output = results_response.json()
124
+
125
+ # Extract and yield all data
126
+ yield query_output.get("data", [])
127
+
128
+ return (fetch_query_results,)
@@ -0,0 +1 @@
1
+ version = "v0.14.93"
@@ -28,6 +28,7 @@ from ingestr.src.destinations import (
28
28
  from ingestr.src.sources import (
29
29
  AdjustSource,
30
30
  AirtableSource,
31
+ AlliumSource,
31
32
  AnthropicSource,
32
33
  AppleAppStoreSource,
33
34
  ApplovinMaxSource,
@@ -156,6 +157,7 @@ class SourceDestinationFactory:
156
157
  source_scheme: str
157
158
  destination_scheme: str
158
159
  sources: Dict[str, Type[SourceProtocol]] = {
160
+ "allium": AlliumSource,
159
161
  "anthropic": AnthropicSource,
160
162
  "csv": LocalCsvSource,
161
163
  "docebo": DoceboSource,
@@ -3997,3 +3997,72 @@ class MailchimpSource:
3997
3997
  ).with_resources(table)
3998
3998
  except ResourcesNotFoundError:
3999
3999
  raise UnsupportedResourceError(table, "Mailchimp")
4000
+
4001
+
4002
+ class AlliumSource:
4003
+ def handles_incrementality(self) -> bool:
4004
+ return False
4005
+
4006
+ def dlt_source(self, uri: str, table: str, **kwargs):
4007
+ parsed_uri = urlparse(uri)
4008
+ query_params = parse_qs(parsed_uri.query)
4009
+ api_key = query_params.get("api_key")
4010
+
4011
+ if api_key is None:
4012
+ raise MissingValueError("api_key", "Allium")
4013
+
4014
+ # Extract query_id and custom parameters from table parameter
4015
+ # Format: query_id or query:query_id or query:query_id:param1=value1&param2=value2
4016
+ query_id = table
4017
+ custom_params = {}
4018
+ limit = None
4019
+ compute_profile = None
4020
+
4021
+ if ":" in table:
4022
+ parts = table.split(":", 2) # Split into max 3 parts
4023
+ if len(parts) >= 2:
4024
+ query_id = parts[1]
4025
+ if len(parts) == 3:
4026
+ # Parse custom parameters from query string format
4027
+ param_string = parts[2]
4028
+ for param in param_string.split("&"):
4029
+ if "=" in param:
4030
+ key, value = param.split("=", 1)
4031
+ # Extract run_config parameters
4032
+ if key == "limit":
4033
+ limit = int(value)
4034
+ elif key == "compute_profile":
4035
+ compute_profile = value
4036
+ else:
4037
+ custom_params[key] = value
4038
+
4039
+ # Extract parameters from interval_start and interval_end
4040
+ # Default: 2 days ago 00:00 to yesterday 00:00
4041
+ now = pendulum.now()
4042
+ default_start = now.subtract(days=2).start_of("day")
4043
+ default_end = now.subtract(days=1).start_of("day")
4044
+
4045
+ parameters = {}
4046
+ interval_start = kwargs.get("interval_start")
4047
+ interval_end = kwargs.get("interval_end")
4048
+
4049
+ start_date = interval_start if interval_start is not None else default_start
4050
+ end_date = interval_end if interval_end is not None else default_end
4051
+
4052
+ parameters["start_date"] = start_date.strftime("%Y-%m-%d")
4053
+ parameters["end_date"] = end_date.strftime("%Y-%m-%d")
4054
+ parameters["start_timestamp"] = str(int(start_date.timestamp()))
4055
+ parameters["end_timestamp"] = str(int(end_date.timestamp()))
4056
+
4057
+ # Merge custom parameters (they override default parameters)
4058
+ parameters.update(custom_params)
4059
+
4060
+ from ingestr.src.allium import allium_source
4061
+
4062
+ return allium_source(
4063
+ api_key=api_key[0],
4064
+ query_id=query_id,
4065
+ parameters=parameters if parameters else None,
4066
+ limit=limit,
4067
+ compute_profile=compute_profile,
4068
+ )
@@ -1 +0,0 @@
1
- version = "v0.14.92"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes