ingestr 0.13.20__tar.gz → 0.13.22__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 (254) hide show
  1. {ingestr-0.13.20 → ingestr-0.13.22}/PKG-INFO +5 -5
  2. {ingestr-0.13.20 → ingestr-0.13.22}/docs/.vitepress/config.mjs +1 -0
  3. ingestr-0.13.22/docs/media/pipedrive.png +0 -0
  4. ingestr-0.13.22/docs/supported-sources/pipedrive.md +43 -0
  5. ingestr-0.13.22/docs/tutorials/load-kinesis-bigquery.md +130 -0
  6. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/main.py +29 -25
  7. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/adjust/adjust_helpers.py +6 -2
  8. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/applovin_max/__init__.py +5 -3
  9. ingestr-0.13.22/ingestr/src/buildinfo.py +1 -0
  10. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/factory.py +2 -0
  11. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/hubspot/__init__.py +0 -1
  12. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/kinesis/__init__.py +3 -4
  13. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/partition.py +2 -2
  14. ingestr-0.13.22/ingestr/src/pipedrive/__init__.py +198 -0
  15. ingestr-0.13.22/ingestr/src/pipedrive/helpers/__init__.py +23 -0
  16. ingestr-0.13.22/ingestr/src/pipedrive/helpers/custom_fields_munger.py +102 -0
  17. ingestr-0.13.22/ingestr/src/pipedrive/helpers/pages.py +115 -0
  18. ingestr-0.13.22/ingestr/src/pipedrive/settings.py +27 -0
  19. ingestr-0.13.22/ingestr/src/pipedrive/typing.py +3 -0
  20. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/sources.py +46 -14
  21. {ingestr-0.13.20 → ingestr-0.13.22}/pyproject.toml +2 -0
  22. {ingestr-0.13.20 → ingestr-0.13.22}/requirements.in +4 -4
  23. {ingestr-0.13.20 → ingestr-0.13.22}/requirements.txt +5 -4
  24. ingestr-0.13.20/docs/tutorials/load-kinesis-bigquery.md +0 -67
  25. ingestr-0.13.20/ingestr/src/buildinfo.py +0 -1
  26. {ingestr-0.13.20 → ingestr-0.13.22}/.dockerignore +0 -0
  27. {ingestr-0.13.20 → ingestr-0.13.22}/.githooks/pre-commit-hook.sh +0 -0
  28. {ingestr-0.13.20 → ingestr-0.13.22}/.github/workflows/deploy-docs.yml +0 -0
  29. {ingestr-0.13.20 → ingestr-0.13.22}/.github/workflows/release.yml +0 -0
  30. {ingestr-0.13.20 → ingestr-0.13.22}/.github/workflows/secrets-scan.yml +0 -0
  31. {ingestr-0.13.20 → ingestr-0.13.22}/.github/workflows/tests.yml +0 -0
  32. {ingestr-0.13.20 → ingestr-0.13.22}/.gitignore +0 -0
  33. {ingestr-0.13.20 → ingestr-0.13.22}/.gitleaksignore +0 -0
  34. {ingestr-0.13.20 → ingestr-0.13.22}/.python-version +0 -0
  35. {ingestr-0.13.20 → ingestr-0.13.22}/.vale.ini +0 -0
  36. {ingestr-0.13.20 → ingestr-0.13.22}/Dockerfile +0 -0
  37. {ingestr-0.13.20 → ingestr-0.13.22}/LICENSE.md +0 -0
  38. {ingestr-0.13.20 → ingestr-0.13.22}/Makefile +0 -0
  39. {ingestr-0.13.20 → ingestr-0.13.22}/README.md +0 -0
  40. {ingestr-0.13.20 → ingestr-0.13.22}/docs/.vitepress/theme/custom.css +0 -0
  41. {ingestr-0.13.20 → ingestr-0.13.22}/docs/.vitepress/theme/index.js +0 -0
  42. {ingestr-0.13.20 → ingestr-0.13.22}/docs/commands/example-uris.md +0 -0
  43. {ingestr-0.13.20 → ingestr-0.13.22}/docs/commands/ingest.md +0 -0
  44. {ingestr-0.13.20 → ingestr-0.13.22}/docs/getting-started/core-concepts.md +0 -0
  45. {ingestr-0.13.20 → ingestr-0.13.22}/docs/getting-started/incremental-loading.md +0 -0
  46. {ingestr-0.13.20 → ingestr-0.13.22}/docs/getting-started/quickstart.md +0 -0
  47. {ingestr-0.13.20 → ingestr-0.13.22}/docs/getting-started/telemetry.md +0 -0
  48. {ingestr-0.13.20 → ingestr-0.13.22}/docs/index.md +0 -0
  49. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/applovin_max.png +0 -0
  50. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/athena.png +0 -0
  51. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/clickhouse_img.png +0 -0
  52. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/github.png +0 -0
  53. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/googleanalytics.png +0 -0
  54. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/kinesis.bigquery.png +0 -0
  55. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/linkedin_ads.png +0 -0
  56. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/personio.png +0 -0
  57. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/personio_duckdb.png +0 -0
  58. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/stripe_postgres.png +0 -0
  59. {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/tiktok.png +0 -0
  60. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/adjust.md +0 -0
  61. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/airtable.md +0 -0
  62. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/applovin.md +0 -0
  63. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/applovin_max.md +0 -0
  64. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/appsflyer.md +0 -0
  65. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/appstore.md +0 -0
  66. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/asana.md +0 -0
  67. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/athena.md +0 -0
  68. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/bigquery.md +0 -0
  69. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/chess.md +0 -0
  70. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/clickhouse.md +0 -0
  71. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/csv.md +0 -0
  72. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/custom_queries.md +0 -0
  73. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/databricks.md +0 -0
  74. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/db2.md +0 -0
  75. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/duckdb.md +0 -0
  76. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/dynamodb.md +0 -0
  77. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/facebook-ads.md +0 -0
  78. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/gcs.md +0 -0
  79. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/github.md +0 -0
  80. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/google-ads.md +0 -0
  81. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/google_analytics.md +0 -0
  82. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/gorgias.md +0 -0
  83. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/gsheets.md +0 -0
  84. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/hubspot.md +0 -0
  85. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/kafka.md +0 -0
  86. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/kinesis.md +0 -0
  87. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/klaviyo.md +0 -0
  88. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/linkedin_ads.md +0 -0
  89. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/mongodb.md +0 -0
  90. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/mssql.md +0 -0
  91. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/mysql.md +0 -0
  92. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/notion.md +0 -0
  93. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/oracle.md +0 -0
  94. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/personio.md +0 -0
  95. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/postgres.md +0 -0
  96. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/redshift.md +0 -0
  97. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/s3.md +0 -0
  98. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/salesforce.md +0 -0
  99. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/sap-hana.md +0 -0
  100. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/shopify.md +0 -0
  101. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/slack.md +0 -0
  102. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/snowflake.md +0 -0
  103. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/sqlite.md +0 -0
  104. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/stripe.md +0 -0
  105. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/tiktok-ads.md +0 -0
  106. {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/zendesk.md +0 -0
  107. {ingestr-0.13.20 → ingestr-0.13.22}/docs/tutorials/load-personio-duckdb.md +0 -0
  108. {ingestr-0.13.20 → ingestr-0.13.22}/docs/tutorials/load-stripe-postgres.md +0 -0
  109. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/.gitignore +0 -0
  110. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/adjust/__init__.py +0 -0
  111. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/airtable/__init__.py +0 -0
  112. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/applovin/__init__.py +0 -0
  113. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appsflyer/_init_.py +0 -0
  114. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appsflyer/client.py +0 -0
  115. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/__init__.py +0 -0
  116. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/client.py +0 -0
  117. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/errors.py +0 -0
  118. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/models.py +0 -0
  119. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/resources.py +0 -0
  120. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/arrow/__init__.py +0 -0
  121. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/asana_source/__init__.py +0 -0
  122. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/asana_source/helpers.py +0 -0
  123. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/asana_source/settings.py +0 -0
  124. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/blob.py +0 -0
  125. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/chess/__init__.py +0 -0
  126. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/chess/helpers.py +0 -0
  127. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/chess/settings.py +0 -0
  128. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/destinations.py +0 -0
  129. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/dynamodb/__init__.py +0 -0
  130. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/errors.py +0 -0
  131. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/facebook_ads/__init__.py +0 -0
  132. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/facebook_ads/exceptions.py +0 -0
  133. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/facebook_ads/helpers.py +0 -0
  134. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/facebook_ads/settings.py +0 -0
  135. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/filesystem/__init__.py +0 -0
  136. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/filesystem/helpers.py +0 -0
  137. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/filesystem/readers.py +0 -0
  138. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/filters.py +0 -0
  139. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/github/__init__.py +0 -0
  140. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/github/helpers.py +0 -0
  141. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/github/queries.py +0 -0
  142. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/github/settings.py +0 -0
  143. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/__init__.py +0 -0
  144. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/field.py +0 -0
  145. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/metrics.py +0 -0
  146. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/predicates.py +0 -0
  147. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/reports.py +0 -0
  148. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_analytics/__init__.py +0 -0
  149. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_analytics/helpers.py +0 -0
  150. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/README.md +0 -0
  151. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/__init__.py +0 -0
  152. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  153. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  154. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  155. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/gorgias/__init__.py +0 -0
  156. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/gorgias/helpers.py +0 -0
  157. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/hubspot/helpers.py +0 -0
  158. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/hubspot/settings.py +0 -0
  159. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/kafka/__init__.py +0 -0
  160. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/kafka/helpers.py +0 -0
  161. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/kinesis/helpers.py +0 -0
  162. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/klaviyo/_init_.py +0 -0
  163. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/klaviyo/client.py +0 -0
  164. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/klaviyo/helpers.py +0 -0
  165. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/linkedin_ads/__init__.py +0 -0
  166. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  167. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/linkedin_ads/helpers.py +0 -0
  168. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/loader.py +0 -0
  169. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/mongodb/__init__.py +0 -0
  170. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/mongodb/helpers.py +0 -0
  171. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/__init__.py +0 -0
  172. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/helpers/__init__.py +0 -0
  173. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/helpers/client.py +0 -0
  174. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/helpers/database.py +0 -0
  175. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/settings.py +0 -0
  176. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/personio/__init__.py +0 -0
  177. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/personio/helpers.py +0 -0
  178. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/resource.py +0 -0
  179. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/salesforce/__init__.py +0 -0
  180. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/salesforce/helpers.py +0 -0
  181. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/shopify/__init__.py +0 -0
  182. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/shopify/exceptions.py +0 -0
  183. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/shopify/helpers.py +0 -0
  184. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/shopify/settings.py +0 -0
  185. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/slack/__init__.py +0 -0
  186. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/slack/helpers.py +0 -0
  187. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/slack/settings.py +0 -0
  188. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/sql_database/__init__.py +0 -0
  189. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/sql_database/callbacks.py +0 -0
  190. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/stripe_analytics/__init__.py +0 -0
  191. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/stripe_analytics/helpers.py +0 -0
  192. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/stripe_analytics/settings.py +0 -0
  193. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/table_definition.py +0 -0
  194. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/telemetry/event.py +0 -0
  195. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  196. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/tiktok_ads/__init__.py +0 -0
  197. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  198. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/time.py +0 -0
  199. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/version.py +0 -0
  200. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/__init__.py +0 -0
  201. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  202. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  203. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  204. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  205. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/settings.py +0 -0
  206. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/.gitignore +0 -0
  207. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/create_replace.csv +0 -0
  208. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/delete_insert_expected.csv +0 -0
  209. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/delete_insert_part1.csv +0 -0
  210. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/delete_insert_part2.csv +0 -0
  211. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/merge_expected.csv +0 -0
  212. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/merge_part1.csv +0 -0
  213. {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/merge_part2.csv +0 -0
  214. {ingestr-0.13.20 → ingestr-0.13.22}/package-lock.json +0 -0
  215. {ingestr-0.13.20 → ingestr-0.13.22}/package.json +0 -0
  216. {ingestr-0.13.20 → ingestr-0.13.22}/requirements-dev.txt +0 -0
  217. {ingestr-0.13.20 → ingestr-0.13.22}/resources/demo.gif +0 -0
  218. {ingestr-0.13.20 → ingestr-0.13.22}/resources/demo.tape +0 -0
  219. {ingestr-0.13.20 → ingestr-0.13.22}/resources/ingestr.svg +0 -0
  220. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/AMPM.yml +0 -0
  221. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Acronyms.yml +0 -0
  222. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Colons.yml +0 -0
  223. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Contractions.yml +0 -0
  224. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/DateFormat.yml +0 -0
  225. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Ellipses.yml +0 -0
  226. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/EmDash.yml +0 -0
  227. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Exclamation.yml +0 -0
  228. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/FirstPerson.yml +0 -0
  229. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Gender.yml +0 -0
  230. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/GenderBias.yml +0 -0
  231. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/HeadingPunctuation.yml +0 -0
  232. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Headings.yml +0 -0
  233. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Latin.yml +0 -0
  234. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/LyHyphens.yml +0 -0
  235. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/OptionalPlurals.yml +0 -0
  236. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Ordinal.yml +0 -0
  237. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/OxfordComma.yml +0 -0
  238. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Parens.yml +0 -0
  239. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Passive.yml +0 -0
  240. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Periods.yml +0 -0
  241. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Quotes.yml +0 -0
  242. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Ranges.yml +0 -0
  243. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Semicolons.yml +0 -0
  244. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Slang.yml +0 -0
  245. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Spacing.yml +0 -0
  246. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Spelling.yml +0 -0
  247. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Units.yml +0 -0
  248. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/We.yml +0 -0
  249. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Will.yml +0 -0
  250. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/WordList.yml +0 -0
  251. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/meta.json +0 -0
  252. {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/vocab.txt +0 -0
  253. {ingestr-0.13.20 → ingestr-0.13.22}/styles/bruin/Ingestr.yml +0 -0
  254. {ingestr-0.13.20 → ingestr-0.13.22}/styles/config/vocabularies/bruin/accept.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.20
3
+ Version: 0.13.22
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
@@ -16,7 +16,7 @@ Classifier: Topic :: Database
16
16
  Requires-Python: >=3.9
17
17
  Requires-Dist: aiobotocore==2.21.1
18
18
  Requires-Dist: aiohappyeyeballs==2.4.8
19
- Requires-Dist: aiohttp==3.11.13
19
+ Requires-Dist: aiohttp==3.11.15
20
20
  Requires-Dist: aioitertools==0.12.0
21
21
  Requires-Dist: aiosignal==1.3.2
22
22
  Requires-Dist: alembic==1.15.1
@@ -55,8 +55,8 @@ Requires-Dist: facebook-business==20.0.0
55
55
  Requires-Dist: filelock==3.17.0
56
56
  Requires-Dist: flatten-json==0.1.14
57
57
  Requires-Dist: frozenlist==1.5.0
58
- Requires-Dist: fsspec==2024.10.0
59
- Requires-Dist: gcsfs==2024.10.0
58
+ Requires-Dist: fsspec==2025.3.2
59
+ Requires-Dist: gcsfs==2025.3.2
60
60
  Requires-Dist: gitdb==4.0.12
61
61
  Requires-Dist: gitpython==3.1.44
62
62
  Requires-Dist: giturlparse==0.12.0
@@ -149,7 +149,7 @@ Requires-Dist: rich-argparse==1.7.0
149
149
  Requires-Dist: rich==13.9.4
150
150
  Requires-Dist: rsa==4.9
151
151
  Requires-Dist: rudder-sdk-python==2.1.4
152
- Requires-Dist: s3fs==2024.10.0
152
+ Requires-Dist: s3fs==2025.3.2
153
153
  Requires-Dist: s3transfer==0.11.3
154
154
  Requires-Dist: scramp==1.4.5
155
155
  Requires-Dist: semver==3.0.4
@@ -126,6 +126,7 @@ export default defineConfig({
126
126
  { text: "LinkedIn Ads", link: "/supported-sources/linkedin_ads.md" },
127
127
  { text: "Notion", link: "/supported-sources/notion.md" },
128
128
  { text: "Personio", link: "/supported-sources/personio.md" },
129
+ { text: "Pipedrive", link: "/supported-sources/pipedrive.md" },
129
130
  { text: "S3", link: "/supported-sources/s3.md" },
130
131
  { text: "Salesforce", link: "/supported-sources/salesforce.md" },
131
132
  { text: "Shopify", link: "/supported-sources/shopify.md" },
Binary file
@@ -0,0 +1,43 @@
1
+ # Pipedrive
2
+ [Pipedrive](https://www.pipedrive.com/) is a cloud-based sales Customer Relationship Management (CRM) tool designed to help businesses manage leads and deals, track communication, and automate sales processes.
3
+
4
+ ingestr supports pipedrive as a source.
5
+
6
+ ## URI format
7
+
8
+ The URI format for pipedrive is as follows:
9
+
10
+ ```plaintext
11
+ pipedrive://?api_token=<api_token>
12
+ ```
13
+
14
+ URI parameters:
15
+ - api_token: token used for authentication with the Pipedrive API
16
+
17
+ ## Setting up a pipedrive Integration
18
+
19
+ To grab pipedrive credentials, please follow the guide [here](https://dlthub.com/docs/dlt-ecosystem/verified-sources/pipedrive#grab-api-token).
20
+
21
+ Once you complete the guide, you should have a `api_token`. Let's say your `api_token` is token_123, here's a sample command that will copy the data from pipedriveinto a DuckDB database:
22
+
23
+ ```bash
24
+ ingestr ingest \
25
+ --source-uri 'pipedrive://?api_token=token' \
26
+ --source-table 'users' \
27
+ --dest-uri duckdb:///pipedrive.duckdb \
28
+ --dest-table 'dest.users'
29
+ ```
30
+
31
+ <img alt="pipedrive_img" src="../media/pipedrive.png"/>
32
+
33
+ pipedrive source allows ingesting the following resources into separate tables:
34
+
35
+ - `activities`: Refers to scheduled events or tasks associated with deals, contacts, or organizations
36
+ - `organizations`: Refers to company or entity with which you have potential or existing business dealings.
37
+ - `products`: Refers to items or services offered for sale that can be associated with deals
38
+ - `deals`: Refers to potential sale or transaction that you can track through various stages
39
+ - `users`: Refers to Individual with a unique login credential who can access and use the platform
40
+ - `persons`: Refers individual contacts or leads that can be linked to sales deals
41
+
42
+
43
+ Use these as `--source-table` parameter in the `ingestr ingest` command.
@@ -0,0 +1,130 @@
1
+ # Load Data from Amazon Kinesis to Google BigQuery
2
+
3
+ Welcome! 👋
4
+ This beginner-friendly guide will help you load data from `Amazon Kinesis` into `Google BigQuery` using `ingestr` — a simple yet powerful command-line tool. No prior experience is needed, and best of all, no coding required!
5
+
6
+ By the end of this guide, you'll have your Kinesis data securely stored in BigQuery. But before we dive in, let’s take a quick look at `ingestr`.
7
+
8
+ ## Overview of ingestr
9
+
10
+ `ingestr` is a command-line tool that simplifies data ingestion by allowing users to load data from a source to a destination using simple command-line flags.
11
+
12
+ ### ingestr Command
13
+
14
+ ```bash
15
+ ingestr ingest \
16
+ --source-uri '<your-source-uri-here>' \
17
+ --source-table '<your-schema>.<your-table>' \
18
+ --dest-uri '<your-destination-uri-here>' \
19
+ --dest-table '<your-schema>.<your-table>'
20
+ ```
21
+
22
+ - `ingestr ingest`: Executes the data ingestion process.
23
+ - `--source-uri TEXT`: Specifies the URI of the data source.
24
+ - `--dest-uri TEXT`: Specifies the URI of the destination.
25
+ - `--source-table TEXT`: Defines the table to fetch data from.
26
+ - `--dest-table TEXT`: Specifies the destination table. If not provided, it defaults to `--source-table`.
27
+
28
+ With this command, we connect to the source, retrieve the specified data, and load it into the destination database.
29
+
30
+ ## Let's Load Data from Kinesis to BigQuery Together!
31
+
32
+ Amazon Kinesis is a cloud-based service for real-time data streaming and analytics that processes large data streams. To analyze this data, you may need to load it into a data warehouse like Google BigQuery. `ingestr` makes this process simple.
33
+
34
+ ### Step 1: Install ingestr
35
+
36
+ Ensure `ingestr` is installed. If not, follow the installation guide [here](../getting-started/quickstart.md#Installation).
37
+
38
+ ### Step 2: Get AWS Credentials
39
+ Kinesis will be our data source. To access it, you need AWS credentials.
40
+
41
+ 1. Log in to your AWS account.
42
+ 2. Navigate to `IAM` (Identity and Access Management).
43
+ 3. Create a new IAM user or select an existing one.
44
+ 4. Assign necessary permissions (e.g., `AmazonKinesisReadOnlyAccess`).
45
+ 5. Generate and copy the `Access Key ID` and `Secret Access Key`.
46
+
47
+ For more details, read [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html).
48
+
49
+ ### Step 3: Configure Kinesis as Source
50
+
51
+ #### `--source-uri`
52
+ This flag connects to your Kinesis stream. The URI format is:
53
+
54
+ ```bash
55
+ kinesis://?aws_access_key_id=<YOUR_KEY_ID>&aws_secret_access_key=<YOUR_SECRET_KEY>&region_name=<YOUR_REGION>
56
+ ```
57
+
58
+ Required parameters:
59
+ - `aws_access_key_id`: Your AWS access key
60
+ - `aws_secret_access_key`: Your AWS secret key
61
+ - `region_name`: AWS region of your Kinesis stream
62
+
63
+ #### `--source-table`
64
+ This flag specifies which Kinesis stream to read from:
65
+
66
+ ```bash
67
+ --source-table 'kinesis_stream_name'
68
+ ```
69
+ This flag specifies which Kinesis stream to read from:
70
+ ### Step 4: Configure BigQuery as Destination
71
+
72
+ #### `--dest-uri`
73
+ This flag connects to BigQuery. The URI format is:
74
+
75
+ ```bash
76
+ bigquery://<project-name>?credentials_path=/path/to/service/account.json&location=<location>
77
+ ```
78
+
79
+ Required parameters:
80
+ - `project-name`: Your BigQuery project name
81
+ - `credentials_path`: Path to the service account JSON file
82
+ - `location`: (Optional) Dataset location
83
+
84
+ #### `--dest-table`
85
+ This flag specifies where to save the data:
86
+
87
+ ```bash
88
+ --dest-table 'dataset.table_name'
89
+ ```
90
+
91
+ ### Step 5: Run the ingestr Command
92
+
93
+ Execute the following command to load data from Kinesis to BigQuery:
94
+
95
+ ```bash
96
+ ingestr ingest \
97
+ --source-uri 'kinesis://?aws_access_key_id=<YOUR_KEY_ID>&aws_secret_access_key=<YOUR_SECRET_KEY>&region_name=eu-central-1' \
98
+ --source-table 'kinesis_stream_name' \
99
+ --dest-uri 'bigquery://project-name?credentials_path=/Users/abc.json' \
100
+ --dest-table 'dataset.results'
101
+ ```
102
+
103
+ ### Step 6: Verify Data in BigQuery
104
+ Once the command runs successfully, your Kinesis data will be available in BigQuery. Follow these steps to verify the data:
105
+
106
+ 1. Open the [BigQuery Console](https://console.cloud.google.com/bigquery) and select your project.
107
+
108
+ 2. In the left-hand side panel:
109
+ - Expand your project.
110
+ - Navigate to the appropriate dataset and click on the table name.
111
+
112
+ 3. Select the "Preview" tab to view a sample of the ingested data.
113
+ - Confirm that rows are present and fields appear as expected.
114
+
115
+ 5. Go to the "Query" tab and run a basic query to inspect your data more closely. For example:
116
+ ```sql
117
+ SELECT * FROM `project-name.dataset.results` LIMIT 100;
118
+
119
+ ```
120
+
121
+ Ensure that the retrieved data matches what was expected from the Kinesis stream.
122
+
123
+ ### Example Output
124
+
125
+ After running the ingestion process, your Kinesis data will be available in BigQuery. Here's an example of what the data might look like:
126
+
127
+ <img alt="kinesis_bigquery" src="../media/kinesis.bigquery.png" />
128
+
129
+ ## 🎉 Congratulations!
130
+ You have successfully loaded data from Amazon Kinesis to BigQuery using `ingestr`.
@@ -127,40 +127,44 @@ class SqlReflectionLevel(str, Enum):
127
127
  def ingest(
128
128
  source_uri: Annotated[
129
129
  str,
130
- typer.Option(help="The URI of the [green]source[/green]", envvar="SOURCE_URI"),
130
+ typer.Option(
131
+ help="The URI of the [green]source[/green]",
132
+ envvar=["SOURCE_URI", "INGESTR_SOURCE_URI"],
133
+ ),
131
134
  ], # type: ignore
132
135
  dest_uri: Annotated[
133
136
  str,
134
137
  typer.Option(
135
- help="The URI of the [cyan]destination[/cyan]", envvar="DESTINATION_URI"
138
+ help="The URI of the [cyan]destination[/cyan]",
139
+ envvar=["DESTINATION_URI", "INGESTR_DESTINATION_URI"],
136
140
  ),
137
141
  ], # type: ignore
138
142
  source_table: Annotated[
139
143
  str,
140
144
  typer.Option(
141
145
  help="The table name in the [green]source[/green] to fetch",
142
- envvar="SOURCE_TABLE",
146
+ envvar=["SOURCE_TABLE", "INGESTR_SOURCE_TABLE"],
143
147
  ),
144
148
  ], # type: ignore
145
149
  dest_table: Annotated[
146
150
  str,
147
151
  typer.Option(
148
152
  help="The table in the [cyan]destination[/cyan] to save the data into",
149
- envvar="DESTINATION_TABLE",
153
+ envvar=["DESTINATION_TABLE", "INGESTR_DESTINATION_TABLE"],
150
154
  ),
151
155
  ] = None, # type: ignore
152
156
  incremental_key: Annotated[
153
157
  Optional[str],
154
158
  typer.Option(
155
159
  help="The incremental key from the table to be used for incremental strategies",
156
- envvar="INCREMENTAL_KEY",
160
+ envvar=["INCREMENTAL_KEY", "INGESTR_INCREMENTAL_KEY"],
157
161
  ),
158
162
  ] = None, # type: ignore
159
163
  incremental_strategy: Annotated[
160
164
  IncrementalStrategy,
161
165
  typer.Option(
162
166
  help="The incremental strategy to use",
163
- envvar="INCREMENTAL_STRATEGY",
167
+ envvar=["INCREMENTAL_STRATEGY", "INGESTR_INCREMENTAL_STRATEGY"],
164
168
  ),
165
169
  ] = IncrementalStrategy.create_replace, # type: ignore
166
170
  interval_start: Annotated[
@@ -168,7 +172,7 @@ def ingest(
168
172
  typer.Option(
169
173
  help="The start of the interval the incremental key will cover",
170
174
  formats=DATE_FORMATS,
171
- envvar="INTERVAL_START",
175
+ envvar=["INTERVAL_START", "INGESTR_INTERVAL_START"],
172
176
  ),
173
177
  ] = None, # type: ignore
174
178
  interval_end: Annotated[
@@ -176,126 +180,126 @@ def ingest(
176
180
  typer.Option(
177
181
  help="The end of the interval the incremental key will cover",
178
182
  formats=DATE_FORMATS,
179
- envvar="INTERVAL_END",
183
+ envvar=["INTERVAL_END", "INGESTR_INTERVAL_END"],
180
184
  ),
181
185
  ] = None, # type: ignore
182
186
  primary_key: Annotated[
183
187
  Optional[list[str]],
184
188
  typer.Option(
185
189
  help="The key that will be used to deduplicate the resulting table",
186
- envvar="PRIMARY_KEY",
190
+ envvar=["PRIMARY_KEY", "INGESTR_PRIMARY_KEY"],
187
191
  ),
188
192
  ] = None, # type: ignore
189
193
  partition_by: Annotated[
190
194
  Optional[str],
191
195
  typer.Option(
192
196
  help="The partition key to be used for partitioning the destination table",
193
- envvar="PARTITION_BY",
197
+ envvar=["PARTITION_BY", "INGESTR_PARTITION_BY"],
194
198
  ),
195
199
  ] = None, # type: ignore
196
200
  cluster_by: Annotated[
197
201
  Optional[str],
198
202
  typer.Option(
199
203
  help="The clustering key to be used for clustering the destination table, not every destination supports clustering.",
200
- envvar="CLUSTER_BY",
204
+ envvar=["CLUSTER_BY", "INGESTR_CLUSTER_BY"],
201
205
  ),
202
206
  ] = None, # type: ignore
203
207
  yes: Annotated[
204
208
  Optional[bool],
205
209
  typer.Option(
206
210
  help="Skip the confirmation prompt and ingest right away",
207
- envvar="SKIP_CONFIRMATION",
211
+ envvar=["SKIP_CONFIRMATION", "INGESTR_SKIP_CONFIRMATION"],
208
212
  ),
209
213
  ] = False, # type: ignore
210
214
  full_refresh: Annotated[
211
215
  bool,
212
216
  typer.Option(
213
217
  help="Ignore the state and refresh the destination table completely",
214
- envvar="FULL_REFRESH",
218
+ envvar=["FULL_REFRESH", "INGESTR_FULL_REFRESH"],
215
219
  ),
216
220
  ] = False, # type: ignore
217
221
  progress: Annotated[
218
222
  Progress,
219
223
  typer.Option(
220
224
  help="The progress display type, must be one of 'interactive', 'log'",
221
- envvar="PROGRESS",
225
+ envvar=["PROGRESS", "INGESTR_PROGRESS"],
222
226
  ),
223
227
  ] = Progress.interactive, # type: ignore
224
228
  sql_backend: Annotated[
225
229
  SqlBackend,
226
230
  typer.Option(
227
231
  help="The SQL backend to use",
228
- envvar="SQL_BACKEND",
232
+ envvar=["SQL_BACKEND", "INGESTR_SQL_BACKEND"],
229
233
  ),
230
234
  ] = SqlBackend.pyarrow, # type: ignore
231
235
  loader_file_format: Annotated[
232
236
  Optional[LoaderFileFormat],
233
237
  typer.Option(
234
238
  help="The file format to use when loading data",
235
- envvar="LOADER_FILE_FORMAT",
239
+ envvar=["LOADER_FILE_FORMAT", "INGESTR_LOADER_FILE_FORMAT"],
236
240
  ),
237
241
  ] = None, # type: ignore
238
242
  page_size: Annotated[
239
243
  Optional[int],
240
244
  typer.Option(
241
245
  help="The page size to be used when fetching data from SQL sources",
242
- envvar="PAGE_SIZE",
246
+ envvar=["PAGE_SIZE", "INGESTR_PAGE_SIZE"],
243
247
  ),
244
248
  ] = 50000, # type: ignore
245
249
  loader_file_size: Annotated[
246
250
  Optional[int],
247
251
  typer.Option(
248
252
  help="The file size to be used by the loader to split the data into multiple files. This can be set independent of the page size, since page size is used for fetching the data from the sources whereas this is used for the processing/loading part.",
249
- envvar="LOADER_FILE_SIZE",
253
+ envvar=["LOADER_FILE_SIZE", "INGESTR_LOADER_FILE_SIZE"],
250
254
  ),
251
255
  ] = 100000, # type: ignore
252
256
  schema_naming: Annotated[
253
257
  SchemaNaming,
254
258
  typer.Option(
255
259
  help="The naming convention to use when moving the tables from source to destination. The default behavior is explained here: https://dlthub.com/docs/general-usage/schema#naming-convention",
256
- envvar="SCHEMA_NAMING",
260
+ envvar=["SCHEMA_NAMING", "INGESTR_SCHEMA_NAMING"],
257
261
  ),
258
262
  ] = SchemaNaming.default, # type: ignore
259
263
  pipelines_dir: Annotated[
260
264
  Optional[str],
261
265
  typer.Option(
262
266
  help="The path to store dlt-related pipeline metadata. By default, ingestr will create a temporary directory and delete it after the execution is done in order to make retries stateless.",
263
- envvar="PIPELINES_DIR",
267
+ envvar=["PIPELINES_DIR", "INGESTR_PIPELINES_DIR"],
264
268
  ),
265
269
  ] = None, # type: ignore
266
270
  extract_parallelism: Annotated[
267
271
  Optional[int],
268
272
  typer.Option(
269
273
  help="The number of parallel jobs to run for extracting data from the source, only applicable for certain sources",
270
- envvar="EXTRACT_PARALLELISM",
274
+ envvar=["EXTRACT_PARALLELISM", "INGESTR_EXTRACT_PARALLELISM"],
271
275
  ),
272
276
  ] = 5, # type: ignore
273
277
  sql_reflection_level: Annotated[
274
278
  SqlReflectionLevel,
275
279
  typer.Option(
276
280
  help="The reflection level to use when reflecting the table schema from the source",
277
- envvar="SQL_REFLECTION_LEVEL",
281
+ envvar=["SQL_REFLECTION_LEVEL", "INGESTR_SQL_REFLECTION_LEVEL"],
278
282
  ),
279
283
  ] = SqlReflectionLevel.full, # type: ignore
280
284
  sql_limit: Annotated[
281
285
  Optional[int],
282
286
  typer.Option(
283
287
  help="The limit to use when fetching data from the source",
284
- envvar="SQL_LIMIT",
288
+ envvar=["SQL_LIMIT", "INGESTR_SQL_LIMIT"],
285
289
  ),
286
290
  ] = None, # type: ignore
287
291
  sql_exclude_columns: Annotated[
288
292
  Optional[list[str]],
289
293
  typer.Option(
290
294
  help="The columns to exclude from the source table",
291
- envvar="SQL_EXCLUDE_COLUMNS",
295
+ envvar=["SQL_EXCLUDE_COLUMNS", "INGESTR_SQL_EXCLUDE_COLUMNS"],
292
296
  ),
293
297
  ] = [], # type: ignore
294
298
  columns: Annotated[
295
299
  Optional[list[str]],
296
300
  typer.Option(
297
301
  help="The column types to be used for the destination table in the format of 'column_name:column_type'",
298
- envvar="COLUMNS",
302
+ envvar=["COLUMNS", "INGESTR_COLUMNS"],
299
303
  ),
300
304
  ] = None, # type: ignore
301
305
  ):
@@ -82,7 +82,9 @@ class AdjustAPI:
82
82
  items = result.get("rows", [])
83
83
  yield items
84
84
  else:
85
- raise HTTPError(f"Request failed with status code: {response.status_code}, {response.text}.")
85
+ raise HTTPError(
86
+ f"Request failed with status code: {response.status_code}, {response.text}."
87
+ )
86
88
 
87
89
  def fetch_events(self):
88
90
  headers = {"Authorization": f"Bearer {self.api_key}"}
@@ -93,7 +95,9 @@ class AdjustAPI:
93
95
  result = response.json()
94
96
  yield result
95
97
  else:
96
- raise HTTPError(f"Request failed with status code: {response.status_code}, {response.text}.")
98
+ raise HTTPError(
99
+ f"Request failed with status code: {response.status_code}, {response.text}."
100
+ )
97
101
 
98
102
 
99
103
  def parse_filters(filters_raw: str) -> dict:
@@ -105,11 +105,13 @@ def get_data(
105
105
  if response.status_code == 404:
106
106
  if "No Mediation App Id found for platform" in response.text:
107
107
  return None
108
- error_message = f"AppLovin MAX API error (status {response.status_code}): {response.text}"
108
+ error_message = (
109
+ f"AppLovin MAX API error (status {response.status_code}): {response.text}"
110
+ )
109
111
  raise requests.HTTPError(error_message)
110
-
112
+
111
113
  response_url = response.json().get("ad_revenue_report_url")
112
114
  df = pd.read_csv(response_url)
113
115
  df["Date"] = pd.to_datetime(df["Date"])
114
116
  df["partition_date"] = df["Date"].dt.date
115
- return df
117
+ return df
@@ -0,0 +1 @@
1
+ version = "v0.13.22"
@@ -43,6 +43,7 @@ from ingestr.src.sources import (
43
43
  MongoDbSource,
44
44
  NotionSource,
45
45
  PersonioSource,
46
+ PipedriveSource,
46
47
  S3Source,
47
48
  SalesforceSource,
48
49
  ShopifySource,
@@ -144,6 +145,7 @@ class SourceDestinationFactory:
144
145
  "salesforce": SalesforceSource,
145
146
  "personio": PersonioSource,
146
147
  "kinesis": KinesisSource,
148
+ "pipedrive": PipedriveSource,
147
149
  }
148
150
  destinations: Dict[str, Type[DestinationProtocol]] = {
149
151
  "bigquery": BigQueryDestination,
@@ -199,7 +199,6 @@ def crm_objects(
199
199
 
200
200
  props = ",".join(sorted(list(set(props))))
201
201
 
202
-
203
202
  params = {"properties": props, "limit": 100}
204
203
 
205
204
  yield from fetch_data(CRM_OBJECT_ENDPOINTS[object_type], api_key, params=params)
@@ -16,7 +16,7 @@ from .helpers import get_shard_iterator, max_sequence_by_shard
16
16
  name=lambda args: args["stream_name"],
17
17
  primary_key="kinesis_msg_id",
18
18
  standalone=True,
19
- max_table_nesting=0
19
+ max_table_nesting=0,
20
20
  )
21
21
  def kinesis_stream(
22
22
  stream_name: str,
@@ -75,7 +75,6 @@ def kinesis_stream(
75
75
 
76
76
  # get next shard to fetch messages from
77
77
  while shard_id := shard_ids.pop(0) if shard_ids else None:
78
-
79
78
  shard_iterator, _ = get_shard_iterator(
80
79
  kinesis_client,
81
80
  stream_name,
@@ -83,14 +82,14 @@ def kinesis_stream(
83
82
  last_msg, # type: ignore
84
83
  initial_at_datetime, # type: ignore
85
84
  )
86
-
85
+
87
86
  while shard_iterator:
88
87
  records = []
89
88
  records_response = kinesis_client.get_records(
90
89
  ShardIterator=shard_iterator,
91
90
  Limit=chunk_size, # The size of data can be up to 1 MB, it must be controlled by the user
92
91
  )
93
-
92
+
94
93
  for record in records_response["Records"]:
95
94
  sequence_number = record["SequenceNumber"]
96
95
  content = record["Data"]
@@ -13,7 +13,6 @@ def apply_athena_hints(
13
13
  additional_hints: Dict[str, TColumnSchema] = {},
14
14
  ) -> None:
15
15
  def _apply_partition_hint(resource: DltResource) -> None:
16
-
17
16
  columns = resource.columns if resource.columns else {}
18
17
 
19
18
  partition_hint = (
@@ -24,7 +23,8 @@ def apply_athena_hints(
24
23
  athena_adapter(
25
24
  resource,
26
25
  athena_partition.day(partition_column)
27
- if partition_hint and partition_hint.get("data_type") in ("timestamp", "date")
26
+ if partition_hint
27
+ and partition_hint.get("data_type") in ("timestamp", "date")
28
28
  else partition_column,
29
29
  )
30
30