ingestr 0.13.39__tar.gz → 0.13.40__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 (273) hide show
  1. {ingestr-0.13.39 → ingestr-0.13.40}/PKG-INFO +3 -1
  2. {ingestr-0.13.39 → ingestr-0.13.40}/docs/.vitepress/config.mjs +1 -0
  3. ingestr-0.13.40/docs/media/ingestion_elasticsearch_img.png +0 -0
  4. ingestr-0.13.40/docs/supported-sources/elasticsearch.md +35 -0
  5. ingestr-0.13.40/ingestr/src/buildinfo.py +1 -0
  6. ingestr-0.13.40/ingestr/src/elasticsearch/__init__.py +80 -0
  7. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/factory.py +2 -0
  8. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/sources.py +50 -0
  9. {ingestr-0.13.39 → ingestr-0.13.40}/requirements.in +2 -1
  10. {ingestr-0.13.39 → ingestr-0.13.40}/requirements.txt +6 -0
  11. {ingestr-0.13.39 → ingestr-0.13.40}/requirements_arm64.txt +6 -0
  12. ingestr-0.13.39/ingestr/src/buildinfo.py +0 -1
  13. {ingestr-0.13.39 → ingestr-0.13.40}/.dockerignore +0 -0
  14. {ingestr-0.13.39 → ingestr-0.13.40}/.githooks/pre-commit-hook.sh +0 -0
  15. {ingestr-0.13.39 → ingestr-0.13.40}/.github/workflows/deploy-docs.yml +0 -0
  16. {ingestr-0.13.39 → ingestr-0.13.40}/.github/workflows/release.yml +0 -0
  17. {ingestr-0.13.39 → ingestr-0.13.40}/.github/workflows/secrets-scan.yml +0 -0
  18. {ingestr-0.13.39 → ingestr-0.13.40}/.github/workflows/tests.yml +0 -0
  19. {ingestr-0.13.39 → ingestr-0.13.40}/.gitignore +0 -0
  20. {ingestr-0.13.39 → ingestr-0.13.40}/.gitleaksignore +0 -0
  21. {ingestr-0.13.39 → ingestr-0.13.40}/.python-version +0 -0
  22. {ingestr-0.13.39 → ingestr-0.13.40}/.vale.ini +0 -0
  23. {ingestr-0.13.39 → ingestr-0.13.40}/Dockerfile +0 -0
  24. {ingestr-0.13.39 → ingestr-0.13.40}/LICENSE.md +0 -0
  25. {ingestr-0.13.39 → ingestr-0.13.40}/Makefile +0 -0
  26. {ingestr-0.13.39 → ingestr-0.13.40}/README.md +0 -0
  27. {ingestr-0.13.39 → ingestr-0.13.40}/docs/.vitepress/theme/custom.css +0 -0
  28. {ingestr-0.13.39 → ingestr-0.13.40}/docs/.vitepress/theme/index.js +0 -0
  29. {ingestr-0.13.39 → ingestr-0.13.40}/docs/commands/example-uris.md +0 -0
  30. {ingestr-0.13.39 → ingestr-0.13.40}/docs/commands/ingest.md +0 -0
  31. {ingestr-0.13.39 → ingestr-0.13.40}/docs/getting-started/core-concepts.md +0 -0
  32. {ingestr-0.13.39 → ingestr-0.13.40}/docs/getting-started/incremental-loading.md +0 -0
  33. {ingestr-0.13.39 → ingestr-0.13.40}/docs/getting-started/quickstart.md +0 -0
  34. {ingestr-0.13.39 → ingestr-0.13.40}/docs/getting-started/telemetry.md +0 -0
  35. {ingestr-0.13.39 → ingestr-0.13.40}/docs/index.md +0 -0
  36. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/applovin_max.png +0 -0
  37. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/athena.png +0 -0
  38. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/clickhouse_img.png +0 -0
  39. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/freshdesk_ingestion.png +0 -0
  40. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/github.png +0 -0
  41. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/google_analytics_realtime_report.png +0 -0
  42. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/googleanalytics.png +0 -0
  43. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/kinesis.bigquery.png +0 -0
  44. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/linkedin_ads.png +0 -0
  45. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/personio.png +0 -0
  46. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/personio_duckdb.png +0 -0
  47. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/phantombuster.png +0 -0
  48. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/pipedrive.png +0 -0
  49. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/stripe_postgres.png +0 -0
  50. {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/tiktok.png +0 -0
  51. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/adjust.md +0 -0
  52. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/airtable.md +0 -0
  53. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/applovin.md +0 -0
  54. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/applovin_max.md +0 -0
  55. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/appsflyer.md +0 -0
  56. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/appstore.md +0 -0
  57. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/asana.md +0 -0
  58. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/athena.md +0 -0
  59. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/bigquery.md +0 -0
  60. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/chess.md +0 -0
  61. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/clickhouse.md +0 -0
  62. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/csv.md +0 -0
  63. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/custom_queries.md +0 -0
  64. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/databricks.md +0 -0
  65. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/db2.md +0 -0
  66. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/duckdb.md +0 -0
  67. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/dynamodb.md +0 -0
  68. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/facebook-ads.md +0 -0
  69. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/frankfurter.md +0 -0
  70. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/freshdesk.md +0 -0
  71. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/gcs.md +0 -0
  72. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/github.md +0 -0
  73. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/google-ads.md +0 -0
  74. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/google_analytics.md +0 -0
  75. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/gorgias.md +0 -0
  76. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/gsheets.md +0 -0
  77. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/hubspot.md +0 -0
  78. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/kafka.md +0 -0
  79. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/kinesis.md +0 -0
  80. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/klaviyo.md +0 -0
  81. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/linkedin_ads.md +0 -0
  82. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/mongodb.md +0 -0
  83. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/mssql.md +0 -0
  84. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/mysql.md +0 -0
  85. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/notion.md +0 -0
  86. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/oracle.md +0 -0
  87. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/personio.md +0 -0
  88. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/phantombuster.md +0 -0
  89. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/pipedrive.md +0 -0
  90. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/postgres.md +0 -0
  91. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/redshift.md +0 -0
  92. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/s3.md +0 -0
  93. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/salesforce.md +0 -0
  94. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/sap-hana.md +0 -0
  95. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/shopify.md +0 -0
  96. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/slack.md +0 -0
  97. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/snowflake.md +0 -0
  98. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/sqlite.md +0 -0
  99. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/stripe.md +0 -0
  100. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/tiktok-ads.md +0 -0
  101. {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/zendesk.md +0 -0
  102. {ingestr-0.13.39 → ingestr-0.13.40}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  103. {ingestr-0.13.39 → ingestr-0.13.40}/docs/tutorials/load-personio-duckdb.md +0 -0
  104. {ingestr-0.13.39 → ingestr-0.13.40}/docs/tutorials/load-stripe-postgres.md +0 -0
  105. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/conftest.py +0 -0
  106. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/main.py +0 -0
  107. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/.gitignore +0 -0
  108. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/adjust/__init__.py +0 -0
  109. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/adjust/adjust_helpers.py +0 -0
  110. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/airtable/__init__.py +0 -0
  111. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/applovin/__init__.py +0 -0
  112. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/applovin_max/__init__.py +0 -0
  113. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appsflyer/__init__.py +0 -0
  114. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appsflyer/client.py +0 -0
  115. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/__init__.py +0 -0
  116. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/client.py +0 -0
  117. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/errors.py +0 -0
  118. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/models.py +0 -0
  119. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/resources.py +0 -0
  120. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/arrow/__init__.py +0 -0
  121. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/asana_source/__init__.py +0 -0
  122. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/asana_source/helpers.py +0 -0
  123. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/asana_source/settings.py +0 -0
  124. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/blob.py +0 -0
  125. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/chess/__init__.py +0 -0
  126. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/chess/helpers.py +0 -0
  127. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/chess/settings.py +0 -0
  128. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/collector/spinner.py +0 -0
  129. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/destinations.py +0 -0
  130. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/dynamodb/__init__.py +0 -0
  131. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/errors.py +0 -0
  132. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/facebook_ads/__init__.py +0 -0
  133. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/facebook_ads/exceptions.py +0 -0
  134. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/facebook_ads/helpers.py +0 -0
  135. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/facebook_ads/settings.py +0 -0
  136. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/filesystem/__init__.py +0 -0
  137. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/filesystem/helpers.py +0 -0
  138. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/filesystem/readers.py +0 -0
  139. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/filters.py +0 -0
  140. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/frankfurter/__init__.py +0 -0
  141. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/frankfurter/helpers.py +0 -0
  142. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/freshdesk/__init__.py +0 -0
  143. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  144. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/freshdesk/settings.py +0 -0
  145. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/github/__init__.py +0 -0
  146. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/github/helpers.py +0 -0
  147. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/github/queries.py +0 -0
  148. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/github/settings.py +0 -0
  149. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/__init__.py +0 -0
  150. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/field.py +0 -0
  151. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/metrics.py +0 -0
  152. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/predicates.py +0 -0
  153. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/reports.py +0 -0
  154. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_analytics/__init__.py +0 -0
  155. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_analytics/helpers.py +0 -0
  156. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/README.md +0 -0
  157. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/__init__.py +0 -0
  158. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  159. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  160. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  161. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/gorgias/__init__.py +0 -0
  162. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/gorgias/helpers.py +0 -0
  163. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/hubspot/__init__.py +0 -0
  164. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/hubspot/helpers.py +0 -0
  165. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/hubspot/settings.py +0 -0
  166. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/kafka/__init__.py +0 -0
  167. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/kafka/helpers.py +0 -0
  168. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/kinesis/__init__.py +0 -0
  169. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/kinesis/helpers.py +0 -0
  170. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/klaviyo/__init__.py +0 -0
  171. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/klaviyo/client.py +0 -0
  172. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/klaviyo/helpers.py +0 -0
  173. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/linkedin_ads/__init__.py +0 -0
  174. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  175. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/linkedin_ads/helpers.py +0 -0
  176. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/loader.py +0 -0
  177. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/mongodb/__init__.py +0 -0
  178. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/mongodb/helpers.py +0 -0
  179. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/__init__.py +0 -0
  180. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/helpers/__init__.py +0 -0
  181. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/helpers/client.py +0 -0
  182. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/helpers/database.py +0 -0
  183. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/settings.py +0 -0
  184. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/partition.py +0 -0
  185. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/personio/__init__.py +0 -0
  186. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/personio/helpers.py +0 -0
  187. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/phantombuster/__init__.py +0 -0
  188. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/phantombuster/client.py +0 -0
  189. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/__init__.py +0 -0
  190. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  191. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  192. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  193. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/settings.py +0 -0
  194. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/typing.py +0 -0
  195. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/resource.py +0 -0
  196. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/salesforce/__init__.py +0 -0
  197. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/salesforce/helpers.py +0 -0
  198. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/shopify/__init__.py +0 -0
  199. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/shopify/exceptions.py +0 -0
  200. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/shopify/helpers.py +0 -0
  201. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/shopify/settings.py +0 -0
  202. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/slack/__init__.py +0 -0
  203. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/slack/helpers.py +0 -0
  204. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/slack/settings.py +0 -0
  205. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/sql_database/__init__.py +0 -0
  206. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/sql_database/callbacks.py +0 -0
  207. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/stripe_analytics/__init__.py +0 -0
  208. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/stripe_analytics/helpers.py +0 -0
  209. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/stripe_analytics/settings.py +0 -0
  210. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/table_definition.py +0 -0
  211. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/telemetry/event.py +0 -0
  212. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  213. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/tiktok_ads/__init__.py +0 -0
  214. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  215. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/time.py +0 -0
  216. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/version.py +0 -0
  217. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/__init__.py +0 -0
  218. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  219. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  220. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  221. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  222. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/settings.py +0 -0
  223. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/.gitignore +0 -0
  224. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/create_replace.csv +0 -0
  225. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/delete_insert_expected.csv +0 -0
  226. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/delete_insert_part1.csv +0 -0
  227. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/delete_insert_part2.csv +0 -0
  228. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/merge_expected.csv +0 -0
  229. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/merge_part1.csv +0 -0
  230. {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/merge_part2.csv +0 -0
  231. {ingestr-0.13.39 → ingestr-0.13.40}/package-lock.json +0 -0
  232. {ingestr-0.13.39 → ingestr-0.13.40}/package.json +0 -0
  233. {ingestr-0.13.39 → ingestr-0.13.40}/pyproject.toml +0 -0
  234. {ingestr-0.13.39 → ingestr-0.13.40}/requirements-dev.txt +0 -0
  235. {ingestr-0.13.39 → ingestr-0.13.40}/resources/demo.gif +0 -0
  236. {ingestr-0.13.39 → ingestr-0.13.40}/resources/demo.tape +0 -0
  237. {ingestr-0.13.39 → ingestr-0.13.40}/resources/ingestr.svg +0 -0
  238. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/AMPM.yml +0 -0
  239. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Acronyms.yml +0 -0
  240. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Colons.yml +0 -0
  241. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Contractions.yml +0 -0
  242. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/DateFormat.yml +0 -0
  243. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Ellipses.yml +0 -0
  244. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/EmDash.yml +0 -0
  245. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Exclamation.yml +0 -0
  246. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/FirstPerson.yml +0 -0
  247. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Gender.yml +0 -0
  248. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/GenderBias.yml +0 -0
  249. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/HeadingPunctuation.yml +0 -0
  250. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Headings.yml +0 -0
  251. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Latin.yml +0 -0
  252. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/LyHyphens.yml +0 -0
  253. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/OptionalPlurals.yml +0 -0
  254. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Ordinal.yml +0 -0
  255. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/OxfordComma.yml +0 -0
  256. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Parens.yml +0 -0
  257. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Passive.yml +0 -0
  258. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Periods.yml +0 -0
  259. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Quotes.yml +0 -0
  260. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Ranges.yml +0 -0
  261. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Semicolons.yml +0 -0
  262. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Slang.yml +0 -0
  263. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Spacing.yml +0 -0
  264. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Spelling.yml +0 -0
  265. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Units.yml +0 -0
  266. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/We.yml +0 -0
  267. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Will.yml +0 -0
  268. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/WordList.yml +0 -0
  269. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/meta.json +0 -0
  270. {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/vocab.txt +0 -0
  271. {ingestr-0.13.39 → ingestr-0.13.40}/styles/bruin/Ingestr.yml +0 -0
  272. {ingestr-0.13.39 → ingestr-0.13.40}/styles/config/vocabularies/bruin/accept.txt +0 -0
  273. {ingestr-0.13.39 → ingestr-0.13.40}/test.env.template +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.39
3
+ Version: 0.13.40
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
@@ -50,6 +50,8 @@ Requires-Dist: dlt==1.10.0
50
50
  Requires-Dist: dnspython==2.7.0
51
51
  Requires-Dist: duckdb-engine==0.17.0
52
52
  Requires-Dist: duckdb==1.2.1
53
+ Requires-Dist: elastic-transport==8.17.1
54
+ Requires-Dist: elasticsearch==8.10.1
53
55
  Requires-Dist: et-xmlfile==2.0.0
54
56
  Requires-Dist: facebook-business==20.0.0
55
57
  Requires-Dist: filelock==3.17.0
@@ -74,6 +74,7 @@ export default defineConfig({
74
74
  { text: "Databricks", link: "/supported-sources/databricks.md" },
75
75
  { text: "DuckDB", link: "/supported-sources/duckdb.md" },
76
76
  { text: "DynamoDB", link: "/supported-sources/dynamodb.md" },
77
+ { text: "Elasticsearch", link: "/supported-sources/elasticsearch.md" },
77
78
  {
78
79
  text: "Google BigQuery",
79
80
  link: "/supported-sources/bigquery.md",
@@ -0,0 +1,35 @@
1
+ # Elasticsearch
2
+ [Elasticsearch](https://www.elastic.co/elasticsearch) is a distributed, RESTful search and analytics engine designed for fast and scalable data retrieval.
3
+
4
+ ingestr supports Elasticsearch as a source.
5
+
6
+ ## URI format
7
+ The URI format for Elasticsearch is as follows:
8
+
9
+ ```plaintext
10
+ elasticsearch://username:password@host:port?secure=<secure>&verify_certs=<verify_certs>
11
+ ```
12
+
13
+ URI parameters:
14
+ - `username`: The username used to authenticate with Elasticsearch.
15
+ - `password`: The password associated with the specified username.
16
+ - `host`: The host address of the Elasticsearch server.
17
+ - `port`: The port number used by the Elasticsearch server.
18
+ - `secure`: Enables HTTPS when set to true. By default, it is true.
19
+ - `verify_certs`: Verifies TLS certificates when set to true. By default, it is true.
20
+
21
+ Source Table
22
+
23
+ `<index-name>`: Fetches all available documents from the specified index.
24
+
25
+ ```ingestr ingest \
26
+ --source-uri "elasticsearch://elastic:changeme@localhost:9200?secure=false&verify_certs=false" \
27
+ --source-table 'test-index' \
28
+ --dest-uri "duckdb:///users.duckdb" \
29
+ --dest-table 'dest.users_detail'
30
+ ```
31
+
32
+ This command retrieves all documents from the test-index in Elasticsearch and copy them to the dest.users_detail table in DuckDB.
33
+
34
+ <img alt="ingestion_elasticsearch_img" src="../media/ingestion_elasticsearch_img.png" />
35
+
@@ -0,0 +1 @@
1
+ version = "v0.13.40"
@@ -0,0 +1,80 @@
1
+ from datetime import date, datetime
2
+ from typing import Any, Optional
3
+
4
+ import dlt
5
+ import pendulum
6
+ from dlt.common.time import ensure_pendulum_datetime
7
+ from pendulum import parse
8
+
9
+ from elasticsearch import Elasticsearch
10
+
11
+
12
+ @dlt.source
13
+ def elasticsearch_source(
14
+ connection_url: str,
15
+ index: str,
16
+ verify_certs: bool,
17
+ incremental: Optional[dlt.sources.incremental] = None,
18
+ ):
19
+ client = Elasticsearch(connection_url, verify_certs=verify_certs)
20
+
21
+ @dlt.resource(
22
+ name=index, primary_key="id", write_disposition="merge", incremental=incremental
23
+ )
24
+ def get_documents(incremental=incremental):
25
+ body = {"query": {"match_all": {}}}
26
+
27
+ if incremental:
28
+ start_value = incremental.last_value
29
+ range_filter = {"gte": start_value}
30
+ if incremental.end_value is not None:
31
+ range_filter["lt"] = incremental.end_value
32
+ body = {"query": {"range": {incremental.cursor_path: range_filter}}}
33
+
34
+ page = client.search(index=index, scroll="5m", size=5, body=body)
35
+
36
+ sid = page["_scroll_id"]
37
+ hits = page["hits"]["hits"]
38
+
39
+ if not hits:
40
+ return
41
+
42
+ # fetching first page (via .search)
43
+ for doc in hits:
44
+ doc_data = {"id": doc["_id"], **doc["_source"]}
45
+ if incremental:
46
+ doc_data[incremental.cursor_path] = convert_elasticsearch_objs(
47
+ doc_data[incremental.cursor_path]
48
+ )
49
+ yield doc_data
50
+
51
+ while True:
52
+ # fetching page 2 and other pages (via .scroll)
53
+ page = client.scroll(scroll_id=sid, scroll="5m")
54
+ sid = page["_scroll_id"]
55
+ hits = page["hits"]["hits"]
56
+ if not hits:
57
+ break
58
+ for doc in hits:
59
+ doc_data = {"id": doc["_id"], **doc["_source"]}
60
+ if incremental:
61
+ doc_data[incremental.cursor_path] = convert_elasticsearch_objs(
62
+ doc_data[incremental.cursor_path]
63
+ )
64
+ yield doc_data
65
+
66
+ client.clear_scroll(scroll_id=sid)
67
+
68
+ return get_documents
69
+
70
+
71
+ def convert_elasticsearch_objs(value: Any) -> Any:
72
+ if isinstance(value, str):
73
+ parsed_date = parse(value, strict=False)
74
+ if parsed_date is not None:
75
+ if isinstance(
76
+ parsed_date,
77
+ (pendulum.DateTime, pendulum.Date, datetime, date, str, float, int),
78
+ ):
79
+ return ensure_pendulum_datetime(parsed_date)
80
+ return value
@@ -28,6 +28,7 @@ from ingestr.src.sources import (
28
28
  AsanaSource,
29
29
  ChessSource,
30
30
  DynamoDBSource,
31
+ ElasticsearchSource,
31
32
  FacebookAdsSource,
32
33
  FrankfurterSource,
33
34
  FreshdeskSource,
@@ -153,6 +154,7 @@ class SourceDestinationFactory:
153
154
  "frankfurter": FrankfurterSource,
154
155
  "freshdesk": FreshdeskSource,
155
156
  "phantombuster": PhantombusterSource,
157
+ "elasticsearch": ElasticsearchSource,
156
158
  }
157
159
  destinations: Dict[str, Type[DestinationProtocol]] = {
158
160
  "bigquery": BigQueryDestination,
@@ -2298,3 +2298,53 @@ class PhantombusterSource:
2298
2298
  start_date=start_date,
2299
2299
  end_date=end_date,
2300
2300
  ).with_resources(table_name)
2301
+
2302
+
2303
+ class ElasticsearchSource:
2304
+ def handles_incrementality(self) -> bool:
2305
+ return False
2306
+
2307
+ def dlt_source(self, uri: str, table: str, **kwargs):
2308
+ from ingestr.src.elasticsearch import elasticsearch_source
2309
+
2310
+ incremental = None
2311
+ if kwargs.get("incremental_key"):
2312
+ start_value = kwargs.get("interval_start")
2313
+ end_value = kwargs.get("interval_end")
2314
+
2315
+ incremental = dlt_incremental(
2316
+ kwargs.get("incremental_key", ""),
2317
+ initial_value=start_value,
2318
+ end_value=end_value,
2319
+ range_end="closed",
2320
+ range_start="closed",
2321
+ )
2322
+
2323
+ # elasticsearch://localhost:9200?secure=true&verify_certs=false
2324
+ parsed = urlparse(uri)
2325
+
2326
+ index = table
2327
+ if not index:
2328
+ raise ValueError("Table name must be provided which is the index name in elasticsearch")
2329
+
2330
+ query_params = parsed.query
2331
+ params = parse_qs(query_params)
2332
+
2333
+ secure = True
2334
+ if "secure" in params:
2335
+ secure = params["secure"][0].capitalize() == "True"
2336
+
2337
+ verify_certs = True
2338
+ if "verify_certs" in params:
2339
+ verify_certs = params["verify_certs"][0].capitalize() == "True"
2340
+
2341
+ scheme = "https" if secure else "http"
2342
+ netloc = parsed.netloc
2343
+ connection_url = f"{scheme}://{netloc}"
2344
+
2345
+ return elasticsearch_source(
2346
+ connection_url=connection_url,
2347
+ index=index,
2348
+ verify_certs=verify_certs,
2349
+ incremental=incremental,
2350
+ ).with_resources(table)
@@ -48,4 +48,5 @@ clickhouse-sqlalchemy==0.2.7
48
48
  zstd==1.5.6.5
49
49
  ibm-db==3.2.6; platform_machine != "aarch64"
50
50
  ibm-db-sa==0.4.1; platform_machine != "aarch64"
51
- aiohttp>=3.11.15
51
+ aiohttp>=3.11.15
52
+ elasticsearch==8.10.1
@@ -51,6 +51,7 @@ cachetools==5.5.2
51
51
  certifi==2025.1.31
52
52
  # via
53
53
  # clickhouse-connect
54
+ # elastic-transport
54
55
  # requests
55
56
  # snowflake-connector-python
56
57
  cffi==1.17.1
@@ -104,6 +105,10 @@ duckdb==1.2.1
104
105
  # duckdb-engine
105
106
  duckdb-engine==0.17.0
106
107
  # via -r requirements.in
108
+ elastic-transport==8.17.1
109
+ # via elasticsearch
110
+ elasticsearch==8.10.1
111
+ # via -r requirements.in
107
112
  et-xmlfile==2.0.0
108
113
  # via openpyxl
109
114
  facebook-business==20.0.0
@@ -553,6 +558,7 @@ urllib3==2.3.0
553
558
  # botocore
554
559
  # clickhouse-connect
555
560
  # databricks-sql-connector
561
+ # elastic-transport
556
562
  # pyairtable
557
563
  # requests
558
564
  # types-requests
@@ -51,6 +51,7 @@ cachetools==5.5.2
51
51
  certifi==2025.1.31
52
52
  # via
53
53
  # clickhouse-connect
54
+ # elastic-transport
54
55
  # requests
55
56
  # snowflake-connector-python
56
57
  cffi==1.17.1
@@ -104,6 +105,10 @@ duckdb==1.2.1
104
105
  # duckdb-engine
105
106
  duckdb-engine==0.17.0
106
107
  # via -r requirements.in
108
+ elastic-transport==8.17.1
109
+ # via elasticsearch
110
+ elasticsearch==8.10.1
111
+ # via -r requirements.in
107
112
  et-xmlfile==2.0.0
108
113
  # via openpyxl
109
114
  facebook-business==20.0.0
@@ -549,6 +554,7 @@ urllib3==2.3.0
549
554
  # botocore
550
555
  # clickhouse-connect
551
556
  # databricks-sql-connector
557
+ # elastic-transport
552
558
  # pyairtable
553
559
  # requests
554
560
  # types-requests
@@ -1 +0,0 @@
1
- version = "v0.13.39"
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
File without changes