ingestr 0.14.5__tar.gz → 0.14.6__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 (366) hide show
  1. {ingestr-0.14.5 → ingestr-0.14.6}/PKG-INFO +1 -1
  2. {ingestr-0.14.5 → ingestr-0.14.6}/docs/.vitepress/config.mjs +9 -9
  3. ingestr-0.14.6/docs/supported-sources/http.md +111 -0
  4. ingestr-0.14.6/docs/supported-sources/monday.md +59 -0
  5. ingestr-0.14.6/ingestr/src/buildinfo.py +1 -0
  6. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/factory.py +5 -0
  7. ingestr-0.14.6/ingestr/src/http/__init__.py +35 -0
  8. ingestr-0.14.6/ingestr/src/http/readers.py +114 -0
  9. ingestr-0.14.6/ingestr/src/monday/__init__.py +246 -0
  10. ingestr-0.14.6/ingestr/src/monday/helpers.py +392 -0
  11. ingestr-0.14.6/ingestr/src/monday/settings.py +328 -0
  12. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/sources.py +83 -0
  13. ingestr-0.14.5/ingestr/src/buildinfo.py +0 -1
  14. {ingestr-0.14.5 → ingestr-0.14.6}/.dlt/config.toml +0 -0
  15. {ingestr-0.14.5 → ingestr-0.14.6}/.dockerignore +0 -0
  16. {ingestr-0.14.5 → ingestr-0.14.6}/.githooks/pre-commit-hook.sh +0 -0
  17. {ingestr-0.14.5 → ingestr-0.14.6}/.github/workflows/deploy-docs.yml +0 -0
  18. {ingestr-0.14.5 → ingestr-0.14.6}/.github/workflows/release.yml +0 -0
  19. {ingestr-0.14.5 → ingestr-0.14.6}/.github/workflows/secrets-scan.yml +0 -0
  20. {ingestr-0.14.5 → ingestr-0.14.6}/.github/workflows/tests.yml +0 -0
  21. {ingestr-0.14.5 → ingestr-0.14.6}/.gitignore +0 -0
  22. {ingestr-0.14.5 → ingestr-0.14.6}/.gitleaksignore +0 -0
  23. {ingestr-0.14.5 → ingestr-0.14.6}/.python-version +0 -0
  24. {ingestr-0.14.5 → ingestr-0.14.6}/.vale.ini +0 -0
  25. {ingestr-0.14.5 → ingestr-0.14.6}/Dockerfile +0 -0
  26. {ingestr-0.14.5 → ingestr-0.14.6}/LICENSE.md +0 -0
  27. {ingestr-0.14.5 → ingestr-0.14.6}/Makefile +0 -0
  28. {ingestr-0.14.5 → ingestr-0.14.6}/README.md +0 -0
  29. {ingestr-0.14.5 → ingestr-0.14.6}/docs/.vitepress/theme/custom.css +0 -0
  30. {ingestr-0.14.5 → ingestr-0.14.6}/docs/.vitepress/theme/index.js +0 -0
  31. {ingestr-0.14.5 → ingestr-0.14.6}/docs/commands/example-uris.md +0 -0
  32. {ingestr-0.14.5 → ingestr-0.14.6}/docs/commands/ingest.md +0 -0
  33. {ingestr-0.14.5 → ingestr-0.14.6}/docs/getting-started/core-concepts.md +0 -0
  34. {ingestr-0.14.5 → ingestr-0.14.6}/docs/getting-started/data-masking.md +0 -0
  35. {ingestr-0.14.5 → ingestr-0.14.6}/docs/getting-started/incremental-loading.md +0 -0
  36. {ingestr-0.14.5 → ingestr-0.14.6}/docs/getting-started/quickstart.md +0 -0
  37. {ingestr-0.14.5 → ingestr-0.14.6}/docs/getting-started/telemetry.md +0 -0
  38. {ingestr-0.14.5 → ingestr-0.14.6}/docs/index.md +0 -0
  39. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/applovin_max.png +0 -0
  40. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/athena.png +0 -0
  41. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/clickhouse_img.png +0 -0
  42. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/clickup_ingestion.png +0 -0
  43. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/cratedb-destination.png +0 -0
  44. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/cratedb-source.png +0 -0
  45. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/freshdesk_ingestion.png +0 -0
  46. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/gcp_spanner_ingestion.png +0 -0
  47. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/github.png +0 -0
  48. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/google_analytics_realtime_report.png +0 -0
  49. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/googleanalytics.png +0 -0
  50. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/ingestion_elasticsearch_img.png +0 -0
  51. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/kinesis.bigquery.png +0 -0
  52. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/linear.png +0 -0
  53. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/linkedin_ads.png +0 -0
  54. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/mixpanel_ingestion.png +0 -0
  55. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/personio.png +0 -0
  56. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/personio_duckdb.png +0 -0
  57. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/phantombuster.png +0 -0
  58. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/pipedrive.png +0 -0
  59. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/quickbook_ingestion.png +0 -0
  60. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/sftp.png +0 -0
  61. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/stripe_postgres.png +0 -0
  62. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/tiktok.png +0 -0
  63. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/wise_ingestion.png +0 -0
  64. {ingestr-0.14.5 → ingestr-0.14.6}/docs/media/zoom_ingestion.png +0 -0
  65. {ingestr-0.14.5 → ingestr-0.14.6}/docs/public/demo.gif +0 -0
  66. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/adjust.md +0 -0
  67. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/airtable.md +0 -0
  68. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/anthropic.md +0 -0
  69. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/applovin.md +0 -0
  70. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/applovin_max.md +0 -0
  71. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/appsflyer.md +0 -0
  72. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/appstore.md +0 -0
  73. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/asana.md +0 -0
  74. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/athena.md +0 -0
  75. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/attio.md +0 -0
  76. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/bigquery.md +0 -0
  77. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/chess.md +0 -0
  78. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/clickhouse.md +0 -0
  79. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/clickup.md +0 -0
  80. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/cratedb.md +0 -0
  81. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/csv.md +0 -0
  82. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/custom_queries.md +0 -0
  83. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/databricks.md +0 -0
  84. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/db2.md +0 -0
  85. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/docebo.md +0 -0
  86. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/duckdb.md +0 -0
  87. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/dynamodb.md +0 -0
  88. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/elasticsearch.md +0 -0
  89. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/facebook-ads.md +0 -0
  90. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/fluxx.md +0 -0
  91. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/frankfurter.md +0 -0
  92. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/freshdesk.md +0 -0
  93. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/fundraiseup.md +0 -0
  94. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/gcs.md +0 -0
  95. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/github.md +0 -0
  96. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/google-ads.md +0 -0
  97. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/google_analytics.md +0 -0
  98. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/gorgias.md +0 -0
  99. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/gsheets.md +0 -0
  100. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/hubspot.md +0 -0
  101. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/influxdb.md +0 -0
  102. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/intercom.md +0 -0
  103. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/isoc-pulse.md +0 -0
  104. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/jira.md +0 -0
  105. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/kafka.md +0 -0
  106. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/kinesis.md +0 -0
  107. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/klaviyo.md +0 -0
  108. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/linear.md +0 -0
  109. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/linkedin_ads.md +0 -0
  110. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/mixpanel.md +0 -0
  111. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/mongodb.md +0 -0
  112. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/motherduck.md +0 -0
  113. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/mssql.md +0 -0
  114. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/mysql.md +0 -0
  115. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/notion.md +0 -0
  116. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/oracle.md +0 -0
  117. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/personio.md +0 -0
  118. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/phantombuster.md +0 -0
  119. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/pinterest.md +0 -0
  120. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/pipedrive.md +0 -0
  121. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/plusvibeai.md +0 -0
  122. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/postgres.md +0 -0
  123. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/quickbooks.md +0 -0
  124. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/redshift.md +0 -0
  125. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/revenuecat.md +0 -0
  126. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/s3.md +0 -0
  127. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/salesforce.md +0 -0
  128. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/sap-hana.md +0 -0
  129. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/sftp.md +0 -0
  130. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/shopify.md +0 -0
  131. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/slack.md +0 -0
  132. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/smartsheets.md +0 -0
  133. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/snowflake.md +0 -0
  134. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/solidgate.md +0 -0
  135. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/spanner.md +0 -0
  136. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/sqlite.md +0 -0
  137. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/stripe.md +0 -0
  138. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/tiktok-ads.md +0 -0
  139. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/trino.md +0 -0
  140. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/trustpilot.md +0 -0
  141. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/wise.md +0 -0
  142. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/zendesk.md +0 -0
  143. {ingestr-0.14.5 → ingestr-0.14.6}/docs/supported-sources/zoom.md +0 -0
  144. {ingestr-0.14.5 → ingestr-0.14.6}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  145. {ingestr-0.14.5 → ingestr-0.14.6}/docs/tutorials/load-personio-duckdb.md +0 -0
  146. {ingestr-0.14.5 → ingestr-0.14.6}/docs/tutorials/load-stripe-postgres.md +0 -0
  147. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/conftest.py +0 -0
  148. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/main.py +0 -0
  149. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/.gitignore +0 -0
  150. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/adjust/__init__.py +0 -0
  151. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/adjust/adjust_helpers.py +0 -0
  152. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/airtable/__init__.py +0 -0
  153. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/anthropic/__init__.py +0 -0
  154. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/anthropic/helpers.py +0 -0
  155. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/applovin/__init__.py +0 -0
  156. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/applovin_max/__init__.py +0 -0
  157. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/appsflyer/__init__.py +0 -0
  158. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/appsflyer/client.py +0 -0
  159. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/appstore/__init__.py +0 -0
  160. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/appstore/client.py +0 -0
  161. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/appstore/errors.py +0 -0
  162. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/appstore/models.py +0 -0
  163. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/appstore/resources.py +0 -0
  164. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/arrow/__init__.py +0 -0
  165. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/asana_source/__init__.py +0 -0
  166. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/asana_source/helpers.py +0 -0
  167. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/asana_source/settings.py +0 -0
  168. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/attio/__init__.py +0 -0
  169. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/attio/helpers.py +0 -0
  170. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/blob.py +0 -0
  171. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/chess/__init__.py +0 -0
  172. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/chess/helpers.py +0 -0
  173. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/chess/settings.py +0 -0
  174. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/clickup/__init__.py +0 -0
  175. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/clickup/helpers.py +0 -0
  176. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/collector/spinner.py +0 -0
  177. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/destinations.py +0 -0
  178. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/docebo/__init__.py +0 -0
  179. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/docebo/client.py +0 -0
  180. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/docebo/helpers.py +0 -0
  181. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/dynamodb/__init__.py +0 -0
  182. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/elasticsearch/__init__.py +0 -0
  183. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/elasticsearch/helpers.py +0 -0
  184. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/errors.py +0 -0
  185. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/facebook_ads/__init__.py +0 -0
  186. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/facebook_ads/exceptions.py +0 -0
  187. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/facebook_ads/helpers.py +0 -0
  188. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/facebook_ads/settings.py +0 -0
  189. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/facebook_ads/utils.py +0 -0
  190. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/filesystem/__init__.py +0 -0
  191. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/filesystem/helpers.py +0 -0
  192. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/filesystem/readers.py +0 -0
  193. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/filters.py +0 -0
  194. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/fluxx/__init__.py +0 -0
  195. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/fluxx/helpers.py +0 -0
  196. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/frankfurter/__init__.py +0 -0
  197. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/frankfurter/helpers.py +0 -0
  198. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/freshdesk/__init__.py +0 -0
  199. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  200. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/freshdesk/settings.py +0 -0
  201. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/fundraiseup/__init__.py +0 -0
  202. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/fundraiseup/client.py +0 -0
  203. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/github/__init__.py +0 -0
  204. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/github/helpers.py +0 -0
  205. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/github/queries.py +0 -0
  206. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/github/settings.py +0 -0
  207. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_ads/__init__.py +0 -0
  208. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_ads/field.py +0 -0
  209. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_ads/metrics.py +0 -0
  210. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_ads/predicates.py +0 -0
  211. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_ads/reports.py +0 -0
  212. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_analytics/__init__.py +0 -0
  213. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_analytics/helpers.py +0 -0
  214. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_sheets/README.md +0 -0
  215. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_sheets/__init__.py +0 -0
  216. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  217. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  218. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  219. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/gorgias/__init__.py +0 -0
  220. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/gorgias/helpers.py +0 -0
  221. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/http_client.py +0 -0
  222. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/hubspot/__init__.py +0 -0
  223. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/hubspot/helpers.py +0 -0
  224. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/hubspot/settings.py +0 -0
  225. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/influxdb/__init__.py +0 -0
  226. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/influxdb/client.py +0 -0
  227. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/intercom/__init__.py +0 -0
  228. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/intercom/helpers.py +0 -0
  229. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/intercom/settings.py +0 -0
  230. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/isoc_pulse/__init__.py +0 -0
  231. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/jira_source/__init__.py +0 -0
  232. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/jira_source/helpers.py +0 -0
  233. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/jira_source/settings.py +0 -0
  234. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/kafka/__init__.py +0 -0
  235. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/kafka/helpers.py +0 -0
  236. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/kinesis/__init__.py +0 -0
  237. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/kinesis/helpers.py +0 -0
  238. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/klaviyo/__init__.py +0 -0
  239. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/klaviyo/client.py +0 -0
  240. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/klaviyo/helpers.py +0 -0
  241. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/linear/__init__.py +0 -0
  242. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/linear/helpers.py +0 -0
  243. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/linkedin_ads/__init__.py +0 -0
  244. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  245. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/linkedin_ads/helpers.py +0 -0
  246. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/loader.py +0 -0
  247. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/masking.py +0 -0
  248. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/mixpanel/__init__.py +0 -0
  249. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/mixpanel/client.py +0 -0
  250. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/mongodb/__init__.py +0 -0
  251. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/mongodb/helpers.py +0 -0
  252. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/notion/__init__.py +0 -0
  253. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/notion/helpers/__init__.py +0 -0
  254. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/notion/helpers/client.py +0 -0
  255. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/notion/helpers/database.py +0 -0
  256. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/notion/settings.py +0 -0
  257. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/partition.py +0 -0
  258. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/personio/__init__.py +0 -0
  259. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/personio/helpers.py +0 -0
  260. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/phantombuster/__init__.py +0 -0
  261. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/phantombuster/client.py +0 -0
  262. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/pinterest/__init__.py +0 -0
  263. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/pipedrive/__init__.py +0 -0
  264. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  265. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  266. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  267. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/pipedrive/settings.py +0 -0
  268. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/pipedrive/typing.py +0 -0
  269. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/plusvibeai/__init__.py +0 -0
  270. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/plusvibeai/helpers.py +0 -0
  271. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/plusvibeai/settings.py +0 -0
  272. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/quickbooks/__init__.py +0 -0
  273. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/resource.py +0 -0
  274. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/revenuecat/__init__.py +0 -0
  275. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/revenuecat/helpers.py +0 -0
  276. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/salesforce/__init__.py +0 -0
  277. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/salesforce/helpers.py +0 -0
  278. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/shopify/__init__.py +0 -0
  279. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/shopify/exceptions.py +0 -0
  280. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/shopify/helpers.py +0 -0
  281. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/shopify/settings.py +0 -0
  282. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/slack/__init__.py +0 -0
  283. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/slack/helpers.py +0 -0
  284. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/slack/settings.py +0 -0
  285. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/smartsheets/__init__.py +0 -0
  286. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/solidgate/__init__.py +0 -0
  287. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/solidgate/helpers.py +0 -0
  288. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/sql_database/__init__.py +0 -0
  289. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/sql_database/callbacks.py +0 -0
  290. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/stripe_analytics/__init__.py +0 -0
  291. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/stripe_analytics/helpers.py +0 -0
  292. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/stripe_analytics/settings.py +0 -0
  293. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/table_definition.py +0 -0
  294. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/telemetry/event.py +0 -0
  295. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  296. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/tiktok_ads/__init__.py +0 -0
  297. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  298. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/time.py +0 -0
  299. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/trustpilot/__init__.py +0 -0
  300. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/trustpilot/client.py +0 -0
  301. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/version.py +0 -0
  302. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/wise/__init__.py +0 -0
  303. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/wise/client.py +0 -0
  304. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/zendesk/__init__.py +0 -0
  305. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  306. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  307. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  308. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  309. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/zendesk/settings.py +0 -0
  310. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/zoom/__init__.py +0 -0
  311. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/src/zoom/helpers.py +0 -0
  312. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/testdata/.gitignore +0 -0
  313. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/testdata/create_replace.csv +0 -0
  314. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/testdata/delete_insert_expected.csv +0 -0
  315. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/testdata/delete_insert_part1.csv +0 -0
  316. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/testdata/delete_insert_part2.csv +0 -0
  317. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/testdata/merge_expected.csv +0 -0
  318. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/testdata/merge_part1.csv +0 -0
  319. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/testdata/merge_part2.csv +0 -0
  320. {ingestr-0.14.5 → ingestr-0.14.6}/ingestr/tests/unit/test_smartsheets.py +0 -0
  321. {ingestr-0.14.5 → ingestr-0.14.6}/package-lock.json +0 -0
  322. {ingestr-0.14.5 → ingestr-0.14.6}/package.json +0 -0
  323. {ingestr-0.14.5 → ingestr-0.14.6}/pyproject.toml +0 -0
  324. {ingestr-0.14.5 → ingestr-0.14.6}/requirements-dev.txt +0 -0
  325. {ingestr-0.14.5 → ingestr-0.14.6}/requirements.in +0 -0
  326. {ingestr-0.14.5 → ingestr-0.14.6}/requirements.txt +0 -0
  327. {ingestr-0.14.5 → ingestr-0.14.6}/requirements_arm64.txt +0 -0
  328. {ingestr-0.14.5 → ingestr-0.14.6}/resources/demo.gif +0 -0
  329. {ingestr-0.14.5 → ingestr-0.14.6}/resources/demo.tape +0 -0
  330. {ingestr-0.14.5 → ingestr-0.14.6}/resources/ingestr.svg +0 -0
  331. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/AMPM.yml +0 -0
  332. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Acronyms.yml +0 -0
  333. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Colons.yml +0 -0
  334. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Contractions.yml +0 -0
  335. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/DateFormat.yml +0 -0
  336. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Ellipses.yml +0 -0
  337. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/EmDash.yml +0 -0
  338. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Exclamation.yml +0 -0
  339. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/FirstPerson.yml +0 -0
  340. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Gender.yml +0 -0
  341. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/GenderBias.yml +0 -0
  342. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/HeadingPunctuation.yml +0 -0
  343. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Headings.yml +0 -0
  344. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Latin.yml +0 -0
  345. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/LyHyphens.yml +0 -0
  346. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/OptionalPlurals.yml +0 -0
  347. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Ordinal.yml +0 -0
  348. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/OxfordComma.yml +0 -0
  349. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Parens.yml +0 -0
  350. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Passive.yml +0 -0
  351. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Periods.yml +0 -0
  352. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Quotes.yml +0 -0
  353. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Ranges.yml +0 -0
  354. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Semicolons.yml +0 -0
  355. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Slang.yml +0 -0
  356. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Spacing.yml +0 -0
  357. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Spelling.yml +0 -0
  358. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Units.yml +0 -0
  359. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/We.yml +0 -0
  360. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/Will.yml +0 -0
  361. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/WordList.yml +0 -0
  362. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/meta.json +0 -0
  363. {ingestr-0.14.5 → ingestr-0.14.6}/styles/Google/vocab.txt +0 -0
  364. {ingestr-0.14.5 → ingestr-0.14.6}/styles/bruin/Ingestr.yml +0 -0
  365. {ingestr-0.14.5 → ingestr-0.14.6}/styles/config/vocabularies/bruin/accept.txt +0 -0
  366. {ingestr-0.14.5 → ingestr-0.14.6}/test.env.template +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.14.5
3
+ Version: 0.14.6
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
@@ -19,18 +19,17 @@ export default defineConfig({
19
19
  head: [
20
20
  [
21
21
  "script",
22
- {
23
- async: "",
24
- src: "https://www.googletagmanager.com/gtag/js?id=G-MZJ20PP4MJ",
25
- },
22
+ {},
23
+ `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
24
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
25
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
26
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
27
+ })(window,document,'script','dataLayer','GTM-K2L7S5FP');`,
26
28
  ],
27
29
  [
28
- "script",
30
+ "noscript",
29
31
  {},
30
- `window.dataLayer = window.dataLayer || [];
31
- function gtag(){dataLayer.push(arguments);}
32
- gtag('js', new Date());
33
- gtag('config', 'G-MZJ20PP4MJ');`,
32
+ `<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-K2L7S5FP" height="0" width="0" style="display:none;visibility:hidden"></iframe>`,
34
33
  ],
35
34
  ],
36
35
  themeConfig: {
@@ -157,6 +156,7 @@ export default defineConfig({
157
156
  { text: "Linear", link: "/supported-sources/linear.md" },
158
157
  { text: "LinkedIn Ads", link: "/supported-sources/linkedin_ads.md" },
159
158
  { text: "Mixpanel", link: "/supported-sources/mixpanel.md" },
159
+ { text: "Monday", link: "/supported-sources/monday.md" },
160
160
  { text: "Notion", link: "/supported-sources/notion.md" },
161
161
  { text: "Personio", link: "/supported-sources/personio.md" },
162
162
  { text: "PhantomBuster", link: "/supported-sources/phantombuster.md" },
@@ -0,0 +1,111 @@
1
+ # HTTP
2
+
3
+ ingestr supports reading CSV, JSON, and Parquet files from public HTTP/HTTPS URLs. This allows you to ingest data from publicly accessible file URLs directly into your databases.
4
+
5
+ ## URI format
6
+
7
+ The URI format for HTTP sources is as follows:
8
+
9
+ ```plaintext
10
+ http://example.com/path/to/file.csv
11
+ https://example.com/path/to/file.json
12
+ https://example.com/path/to/file.parquet
13
+ ```
14
+
15
+ ## Supported file formats
16
+
17
+ The HTTP source supports the following file formats:
18
+
19
+ - **CSV** (`.csv`) - Comma-separated values files
20
+ - **JSON** (`.json`, `.jsonl`) - JSON objects and JSON Lines format
21
+ - **Parquet** (`.parquet`) - Apache Parquet columnar format
22
+
23
+ The file format is automatically inferred from the URL extension. You can also explicitly specify the format using the `file_format` parameter.
24
+
25
+ ## Usage
26
+
27
+ ### Basic example
28
+
29
+ ```bash
30
+ ingestr ingest \
31
+ --source-uri "https://example.com/data.csv" \
32
+ --dest-uri "duckdb:///local.duckdb" \
33
+ --dest-table "my_table"
34
+ ```
35
+
36
+ ### Example with Phantombuster CSV
37
+
38
+ ```bash
39
+ ingestr ingest \
40
+ --source-uri "https://phantombuster.s3.amazonaws.com/hNQdB02WKv0/l7xqy7HlU0wyWIvPjqKk5Q/dts_size.csv" \
41
+ --dest-uri "postgres://user:pass@localhost:5432/mydb" \
42
+ --dest-table "phantombuster_data"
43
+ ```
44
+
45
+ ### Example with JSON file
46
+
47
+ ```bash
48
+ ingestr ingest \
49
+ --source-uri "https://api.example.com/export/data.json" \
50
+ --dest-uri "snowflake://user:pass@account/database/schema" \
51
+ --dest-table "json_data"
52
+ ```
53
+
54
+ ### Example with Parquet file
55
+
56
+ ```bash
57
+ ingestr ingest \
58
+ --source-uri "https://storage.example.com/data.parquet" \
59
+ --dest-uri "bigquery://project/dataset" \
60
+ --dest-table "parquet_data"
61
+ ```
62
+
63
+ ## Parameters
64
+
65
+ ### `file_format`
66
+
67
+ Optional. Explicitly specify the file format if it cannot be inferred from the URL extension.
68
+
69
+ **Valid values:** `csv`, `json`, `parquet`
70
+
71
+ **Example:**
72
+
73
+ ```bash
74
+ ingestr ingest \
75
+ --source-uri "https://example.com/data?format=csv" \
76
+ --source-file-format "csv" \
77
+ --dest-uri "duckdb:///local.duckdb" \
78
+ --dest-table "my_table"
79
+ ```
80
+
81
+ ### `chunksize`
82
+
83
+ Optional. Number of records to process at once. This helps manage memory usage for large files.
84
+
85
+ **Default values:**
86
+ - CSV: 10,000 rows
87
+ - JSON: 1,000 objects
88
+ - Parquet: 10,000 rows
89
+
90
+ **Example:**
91
+
92
+ ```bash
93
+ ingestr ingest \
94
+ --source-uri "https://example.com/large-file.csv" \
95
+ --source-chunksize 5000 \
96
+ --dest-uri "postgres://user:pass@localhost:5432/mydb" \
97
+ --dest-table "chunked_data"
98
+ ```
99
+
100
+ ## Notes
101
+
102
+ - The HTTP source downloads the entire file before processing, so ensure you have sufficient memory for large files
103
+ - Authentication is not currently supported; only publicly accessible URLs can be used
104
+ - The file must be accessible without requiring cookies, headers, or other authentication mechanisms
105
+ - For very large files, consider using chunked transfer or a dedicated file storage source (e.g., S3, GCS)
106
+
107
+ ## Limitations
108
+
109
+ - Only supports public URLs (no authentication)
110
+ - The entire file is downloaded into memory before processing
111
+ - No support for incremental loading
@@ -0,0 +1,59 @@
1
+ # Monday.com
2
+ [Monday.com](https://monday.com/) is a Work OS that powers teams to run projects and workflows with confidence. It's a simple, yet powerful platform that enables people to manage work, meet deadlines, and build a culture of transparency.
3
+
4
+ ## URI format
5
+
6
+ The URI format for Monday.com is as follows:
7
+ ```
8
+ monday://?api_token=<api_token>
9
+ ```
10
+
11
+ URI parameters:
12
+ - `api_token` is your Monday.com API token for authentication.
13
+
14
+ ## Setting up a Monday.com Integration
15
+
16
+ You can obtain an API token from the [Monday.com Developer Console](https://developer.monday.com/). For more information, see [Monday.com authentication documentation](https://developer.monday.com/api-reference/docs/authentication).
17
+
18
+ To get your API token:
19
+ 1. Go to your Monday.com account
20
+ 2. Click on your profile picture in the top right corner
21
+ 3. Select "Admin" → "API"
22
+ 4. Generate a new API token
23
+
24
+ ## Example
25
+ Let's say you want to ingest all boards into a DuckDB database called `monday.db`. For this example the value of `api_token` will be `fake_token`.
26
+
27
+ You can run the following to achieve this:
28
+ ```sh
29
+ ingestr ingest \
30
+ --source-uri "monday://?api_token=fake_token" \
31
+ --source-table "boards" \
32
+ --dest-uri "duckdb://./monday.db" \
33
+ --dest-table "public.boards"
34
+ ```
35
+
36
+ ## Tables
37
+
38
+ Monday.com source allows ingesting the following resources into separate tables:
39
+
40
+ | Table | Primary/Merge Key | Inc Key | Inc Strategy | Details |
41
+ |-------|-------------------|---------|--------------|---------|
42
+ | `account` | - | - | replace | Account information including name, slug, tier, and plan details. Full reload on each run. |
43
+ | `account_roles` | - | - | replace | Account roles with their types and permissions. Full reload on each run. |
44
+ | `users` | - | - | replace | Users in your Monday.com account with their profiles and permissions. Full reload on each run. |
45
+ | `boards` | id | updated_at | merge | Boards with their metadata, state, and configuration. Incrementally loads only updated boards. |
46
+ | `workspaces` | - | - | replace | Workspaces containing boards and their settings. Full reload on each run. |
47
+ | `webhooks` | - | - | replace | Webhooks configured for boards with their events and configurations. Full reload on each run. |
48
+ | `updates` | id | updated_at | merge | Updates (comments) on items with their content and metadata. Incrementally loads only updated entries. |
49
+ | `teams` | - | - | replace | Teams in your account with their members. Full reload on each run. |
50
+ | `tags` | - | - | replace | Tags used across your account for organizing items. Full reload on each run. |
51
+ | `custom_activities` | - | - | replace | Custom activity types defined in your account. Full reload on each run. |
52
+ | `board_columns` | - | - | replace | Columns defined in all boards with their types and settings. Full reload on each run. |
53
+ | `board_views` | - | - | replace | Views configured for boards with their filters and settings. Full reload on each run. |
54
+
55
+ Use these as `--source-table` parameter in the `ingestr ingest` command.
56
+
57
+ > [!NOTE]
58
+ > Monday.com has rate limits for API requests. The source handles pagination automatically and respects the API's maximum page size of 100 items.
59
+
@@ -0,0 +1 @@
1
+ version = "v0.14.6"
@@ -52,6 +52,7 @@ from ingestr.src.sources import (
52
52
  GoogleAnalyticsSource,
53
53
  GoogleSheetsSource,
54
54
  GorgiasSource,
55
+ HttpSource,
55
56
  HubspotSource,
56
57
  InfluxDBSource,
57
58
  IntercomSource,
@@ -64,6 +65,7 @@ from ingestr.src.sources import (
64
65
  LinkedInAdsSource,
65
66
  LocalCsvSource,
66
67
  MixpanelSource,
68
+ MondaySource,
67
69
  MongoDbSource,
68
70
  NotionSource,
69
71
  PersonioSource,
@@ -156,6 +158,8 @@ class SourceDestinationFactory:
156
158
  "anthropic": AnthropicSource,
157
159
  "csv": LocalCsvSource,
158
160
  "docebo": DoceboSource,
161
+ "http": HttpSource,
162
+ "https": HttpSource,
159
163
  "mongodb": MongoDbSource,
160
164
  "mongodb+srv": MongoDbSource,
161
165
  "notion": NotionSource,
@@ -214,6 +218,7 @@ class SourceDestinationFactory:
214
218
  "influxdb": InfluxDBSource,
215
219
  "wise": WiseSource,
216
220
  "plusvibeai": PlusVibeAISource,
221
+ "monday": MondaySource,
217
222
  }
218
223
  destinations: Dict[str, Type[DestinationProtocol]] = {
219
224
  "bigquery": BigQueryDestination,
@@ -0,0 +1,35 @@
1
+ """HTTP source for reading CSV, JSON, and Parquet files from public URLs"""
2
+
3
+ from typing import Any, Optional
4
+
5
+ import dlt
6
+ from dlt.sources import DltResource
7
+
8
+ from .readers import HttpReader
9
+
10
+
11
+ @dlt.source
12
+ def http_source(
13
+ url: str,
14
+ file_format: Optional[str] = None,
15
+ **kwargs: Any,
16
+ ) -> DltResource:
17
+ """Source for reading files from HTTP URLs.
18
+
19
+ Supports CSV, JSON, and Parquet file formats.
20
+
21
+ Args:
22
+ url (str): The HTTP(S) URL to the file
23
+ file_format (str, optional): File format ('csv', 'json', 'parquet').
24
+ If not provided, will be inferred from URL extension.
25
+ **kwargs: Additional arguments passed to the reader functions
26
+
27
+ Returns:
28
+ DltResource: A dlt resource that yields the file data
29
+ """
30
+ reader = HttpReader(url, file_format)
31
+
32
+ return dlt.resource(
33
+ reader.read_file(**kwargs),
34
+ name="http_data",
35
+ )
@@ -0,0 +1,114 @@
1
+ """Readers for HTTP file sources"""
2
+
3
+ import io
4
+ from typing import Any, Iterator, Optional
5
+ from urllib.parse import urlparse
6
+
7
+ import requests
8
+ from dlt.sources import TDataItems
9
+
10
+
11
+ class HttpReader:
12
+ """Reader for HTTP-based file sources"""
13
+
14
+ def __init__(self, url: str, file_format: Optional[str] = None):
15
+ self.url = url
16
+ self.file_format = file_format or self._infer_format(url)
17
+
18
+ if self.file_format not in ["csv", "json", "parquet"]:
19
+ raise ValueError(
20
+ f"Unsupported file format: {self.file_format}. "
21
+ "Supported formats: csv, json, parquet"
22
+ )
23
+
24
+ def _infer_format(self, url: str) -> str:
25
+ """Infer file format from URL extension"""
26
+ parsed = urlparse(url)
27
+ path = parsed.path.lower()
28
+
29
+ if path.endswith(".csv"):
30
+ return "csv"
31
+ elif path.endswith(".json") or path.endswith(".jsonl"):
32
+ return "json"
33
+ elif path.endswith(".parquet"):
34
+ return "parquet"
35
+ else:
36
+ raise ValueError(
37
+ f"Cannot infer file format from URL: {url}. "
38
+ "Please specify file_format parameter."
39
+ )
40
+
41
+ def _download_file(self) -> bytes:
42
+ """Download file from URL"""
43
+ response = requests.get(self.url, stream=True, timeout=30)
44
+ response.raise_for_status()
45
+ return response.content
46
+
47
+ def read_file(self, **kwargs: Any) -> Iterator[TDataItems]:
48
+ """Read file and yield data in chunks"""
49
+ content = self._download_file()
50
+
51
+ if self.file_format == "csv":
52
+ yield from self._read_csv(content, **kwargs)
53
+ elif self.file_format == "json":
54
+ yield from self._read_json(content, **kwargs)
55
+ elif self.file_format == "parquet":
56
+ yield from self._read_parquet(content, **kwargs)
57
+
58
+ def _read_csv(
59
+ self, content: bytes, chunksize: int = 10000, **pandas_kwargs: Any
60
+ ) -> Iterator[TDataItems]:
61
+ """Read CSV file with Pandas chunk by chunk"""
62
+ import pandas as pd # type: ignore
63
+
64
+ kwargs = {**{"header": "infer", "chunksize": chunksize}, **pandas_kwargs}
65
+
66
+ file_obj = io.BytesIO(content)
67
+ for df in pd.read_csv(file_obj, **kwargs):
68
+ yield df.to_dict(orient="records")
69
+
70
+ def _read_json(
71
+ self, content: bytes, chunksize: int = 1000, **kwargs: Any
72
+ ) -> Iterator[TDataItems]:
73
+ """Read JSON or JSONL file"""
74
+ from dlt.common import json
75
+
76
+ file_obj = io.BytesIO(content)
77
+ text = file_obj.read().decode("utf-8")
78
+
79
+ # Try to detect if it's JSONL format (one JSON object per line)
80
+ lines = text.strip().split("\n")
81
+
82
+ if len(lines) > 1:
83
+ # Likely JSONL format
84
+ lines_chunk = []
85
+ for line in lines:
86
+ if line.strip():
87
+ lines_chunk.append(json.loads(line))
88
+ if len(lines_chunk) >= chunksize:
89
+ yield lines_chunk
90
+ lines_chunk = []
91
+ if lines_chunk:
92
+ yield lines_chunk
93
+ else:
94
+ # Single JSON object or array
95
+ data = json.loads(text)
96
+ if isinstance(data, list):
97
+ # Chunk the list
98
+ for i in range(0, len(data), chunksize):
99
+ yield data[i : i + chunksize]
100
+ else:
101
+ # Single object
102
+ yield [data]
103
+
104
+ def _read_parquet(
105
+ self, content: bytes, chunksize: int = 10000, **kwargs: Any
106
+ ) -> Iterator[TDataItems]:
107
+ """Read Parquet file"""
108
+ from pyarrow import parquet as pq # type: ignore
109
+
110
+ file_obj = io.BytesIO(content)
111
+ parquet_file = pq.ParquetFile(file_obj)
112
+
113
+ for batch in parquet_file.iter_batches(batch_size=chunksize):
114
+ yield batch.to_pylist()
@@ -0,0 +1,246 @@
1
+ """
2
+ Monday.com source for data extraction via GraphQL API.
3
+
4
+ This source provides access to Monday.com app installation data.
5
+ """
6
+
7
+ from typing import Any, Iterable, Iterator, Optional
8
+
9
+ import dlt
10
+ from dlt.sources import DltResource
11
+
12
+ from .helpers import MondayClient, normalize_dict
13
+
14
+
15
+ @dlt.source(max_table_nesting=0, name="monday_source")
16
+ def monday_source(
17
+ api_token: str,
18
+ params: list[str],
19
+ start_date: Optional[str] = None,
20
+ end_date: Optional[str] = None,
21
+ ) -> Iterable[DltResource]:
22
+ """
23
+ Monday.com data source.
24
+
25
+ Args:
26
+ api_token: Monday.com API token for authentication
27
+ params: Table-specific parameters in format [table_type, ...params]
28
+ start_date: Optional start date for date-filtered queries (YYYY-MM-DD)
29
+ end_date: Optional end date for date-filtered queries (YYYY-MM-DD)
30
+
31
+ Yields:
32
+ DltResource: Data resource for the requested table
33
+ """
34
+ monday_client = MondayClient(api_token)
35
+
36
+ @dlt.resource(
37
+ name="account",
38
+ write_disposition="replace",
39
+ )
40
+ def fetch_account() -> Iterator[dict[str, Any]]:
41
+ """
42
+ Fetch account information from Monday.com.
43
+
44
+ Table format: account (no parameters needed)
45
+ """
46
+ if len(params) != 0:
47
+ raise ValueError("Account table must be in the format `account`")
48
+
49
+ yield normalize_dict(monday_client.get_account())
50
+
51
+ @dlt.resource(
52
+ name="account_roles",
53
+ write_disposition="replace",
54
+ )
55
+ def fetch_account_roles() -> Iterator[dict[str, Any]]:
56
+ """
57
+ Fetch account roles from Monday.com.
58
+
59
+ Table format: account_roles (no parameters needed)
60
+ """
61
+ if len(params) != 0:
62
+ raise ValueError(
63
+ "Account roles table must be in the format `account_roles`"
64
+ )
65
+
66
+ yield from monday_client.get_account_roles()
67
+
68
+ @dlt.resource(
69
+ name="users",
70
+ write_disposition="replace",
71
+ )
72
+ def fetch_users() -> Iterator[dict[str, Any]]:
73
+ """
74
+ Fetch users from Monday.com.
75
+
76
+ Table format: users (no parameters needed)
77
+ """
78
+ if len(params) != 0:
79
+ raise ValueError("Users table must be in the format `users`")
80
+
81
+ yield from monday_client.get_users()
82
+
83
+ @dlt.resource(
84
+ name="boards",
85
+ write_disposition="merge",
86
+ primary_key="id",
87
+ )
88
+ def fetch_boards(
89
+ updated_at: dlt.sources.incremental[str] = dlt.sources.incremental(
90
+ "updated_at", initial_value=start_date
91
+ ),
92
+ ) -> Iterator[dict[str, Any]]:
93
+ """
94
+ Fetch boards from Monday.com.
95
+
96
+ Table format: boards (no parameters needed)
97
+ """
98
+ if len(params) != 0:
99
+ raise ValueError("Boards table must be in the format `boards`")
100
+
101
+ yield from monday_client.get_boards()
102
+
103
+ @dlt.resource(
104
+ name="workspaces",
105
+ write_disposition="replace",
106
+ )
107
+ def fetch_workspaces() -> Iterator[dict[str, Any]]:
108
+ """
109
+ Fetch workspaces from Monday.com.
110
+
111
+ Table format: workspaces (no parameters needed)
112
+ """
113
+ if len(params) != 0:
114
+ raise ValueError("Workspaces table must be in the format `workspaces`")
115
+
116
+ yield from monday_client.get_workspaces()
117
+
118
+ @dlt.resource(
119
+ name="webhooks",
120
+ write_disposition="replace",
121
+ )
122
+ def fetch_webhooks() -> Iterator[dict[str, Any]]:
123
+ """
124
+ Fetch webhooks from Monday.com.
125
+
126
+ Table format: webhooks (no parameters needed)
127
+ """
128
+ if len(params) != 0:
129
+ raise ValueError("Webhooks table must be in the format `webhooks`")
130
+
131
+ yield from monday_client.get_webhooks()
132
+
133
+ @dlt.resource(
134
+ name="updates",
135
+ write_disposition="merge",
136
+ primary_key="id",
137
+ )
138
+ def fetch_updates(
139
+ updated_at: dlt.sources.incremental[str] = dlt.sources.incremental(
140
+ "updated_at", initial_value=start_date
141
+ ),
142
+ ) -> Iterator[dict[str, Any]]:
143
+ """
144
+ Fetch updates from Monday.com.
145
+
146
+ Table format: updates (no parameters needed)
147
+ Requires start_date and end_date parameters
148
+ """
149
+ if len(params) != 0:
150
+ raise ValueError("Updates table must be in the format `updates`")
151
+
152
+ yield from monday_client.get_updates(start_date=start_date, end_date=end_date)
153
+
154
+ @dlt.resource(
155
+ name="teams",
156
+ write_disposition="replace",
157
+ )
158
+ def fetch_teams() -> Iterator[dict[str, Any]]:
159
+ """
160
+ Fetch teams from Monday.com.
161
+
162
+ Table format: teams (no parameters needed)
163
+ """
164
+ if len(params) != 0:
165
+ raise ValueError("Teams table must be in the format `teams`")
166
+
167
+ yield from monday_client.get_teams()
168
+
169
+ @dlt.resource(
170
+ name="tags",
171
+ write_disposition="replace",
172
+ )
173
+ def fetch_tags() -> Iterator[dict[str, Any]]:
174
+ """
175
+ Fetch tags from Monday.com.
176
+
177
+ Table format: tags (no parameters needed)
178
+ """
179
+ if len(params) != 0:
180
+ raise ValueError("Tags table must be in the format `tags`")
181
+
182
+ yield from monday_client.get_tags()
183
+
184
+ @dlt.resource(
185
+ name="custom_activities",
186
+ write_disposition="replace",
187
+ )
188
+ def fetch_custom_activities() -> Iterator[dict[str, Any]]:
189
+ """
190
+ Fetch custom activities from Monday.com.
191
+
192
+ Table format: custom_activities (no parameters needed)
193
+ """
194
+ if len(params) != 0:
195
+ raise ValueError(
196
+ "Custom activities table must be in the format `custom_activities`"
197
+ )
198
+
199
+ yield from monday_client.get_custom_activities()
200
+
201
+ @dlt.resource(
202
+ name="board_columns",
203
+ write_disposition="replace",
204
+ )
205
+ def fetch_board_columns() -> Iterator[dict[str, Any]]:
206
+ """
207
+ Fetch board columns from Monday.com.
208
+
209
+ Table format: board_columns (no parameters needed)
210
+ """
211
+ if len(params) != 0:
212
+ raise ValueError(
213
+ "Board columns table must be in the format `board_columns`"
214
+ )
215
+
216
+ yield from monday_client.get_board_columns()
217
+
218
+ @dlt.resource(
219
+ name="board_views",
220
+ write_disposition="replace",
221
+ )
222
+ def fetch_board_views() -> Iterator[dict[str, Any]]:
223
+ """
224
+ Fetch board views from Monday.com.
225
+
226
+ Table format: board_views (no parameters needed)
227
+ """
228
+ if len(params) != 0:
229
+ raise ValueError("Board views table must be in the format `board_views`")
230
+
231
+ yield from monday_client.get_board_views()
232
+
233
+ return (
234
+ fetch_account,
235
+ fetch_account_roles,
236
+ fetch_users,
237
+ fetch_boards,
238
+ fetch_workspaces,
239
+ fetch_webhooks,
240
+ fetch_updates,
241
+ fetch_teams,
242
+ fetch_tags,
243
+ fetch_custom_activities,
244
+ fetch_board_columns,
245
+ fetch_board_views,
246
+ )