ingestr 0.13.89__tar.gz → 0.13.91__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 (334) hide show
  1. {ingestr-0.13.89 → ingestr-0.13.91}/PKG-INFO +1 -1
  2. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/adjust.md +12 -9
  3. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/airtable.md +22 -5
  4. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/appsflyer.md +39 -8
  5. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/appstore.md +60 -59
  6. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/salesforce.md +20 -0
  7. ingestr-0.13.91/ingestr/src/buildinfo.py +1 -0
  8. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/salesforce/__init__.py +6 -0
  9. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/smartsheets/__init__.py +1 -1
  10. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/sources.py +6 -1
  11. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/tests/unit/test_smartsheets.py +4 -4
  12. {ingestr-0.13.89 → ingestr-0.13.91}/pyproject.toml +5 -2
  13. ingestr-0.13.89/ingestr/src/buildinfo.py +0 -1
  14. {ingestr-0.13.89 → ingestr-0.13.91}/.dlt/config.toml +0 -0
  15. {ingestr-0.13.89 → ingestr-0.13.91}/.dockerignore +0 -0
  16. {ingestr-0.13.89 → ingestr-0.13.91}/.githooks/pre-commit-hook.sh +0 -0
  17. {ingestr-0.13.89 → ingestr-0.13.91}/.github/workflows/deploy-docs.yml +0 -0
  18. {ingestr-0.13.89 → ingestr-0.13.91}/.github/workflows/release.yml +0 -0
  19. {ingestr-0.13.89 → ingestr-0.13.91}/.github/workflows/secrets-scan.yml +0 -0
  20. {ingestr-0.13.89 → ingestr-0.13.91}/.github/workflows/tests.yml +0 -0
  21. {ingestr-0.13.89 → ingestr-0.13.91}/.gitignore +0 -0
  22. {ingestr-0.13.89 → ingestr-0.13.91}/.gitleaksignore +0 -0
  23. {ingestr-0.13.89 → ingestr-0.13.91}/.python-version +0 -0
  24. {ingestr-0.13.89 → ingestr-0.13.91}/.vale.ini +0 -0
  25. {ingestr-0.13.89 → ingestr-0.13.91}/Dockerfile +0 -0
  26. {ingestr-0.13.89 → ingestr-0.13.91}/LICENSE.md +0 -0
  27. {ingestr-0.13.89 → ingestr-0.13.91}/Makefile +0 -0
  28. {ingestr-0.13.89 → ingestr-0.13.91}/README.md +0 -0
  29. {ingestr-0.13.89 → ingestr-0.13.91}/docs/.vitepress/config.mjs +0 -0
  30. {ingestr-0.13.89 → ingestr-0.13.91}/docs/.vitepress/theme/custom.css +0 -0
  31. {ingestr-0.13.89 → ingestr-0.13.91}/docs/.vitepress/theme/index.js +0 -0
  32. {ingestr-0.13.89 → ingestr-0.13.91}/docs/commands/example-uris.md +0 -0
  33. {ingestr-0.13.89 → ingestr-0.13.91}/docs/commands/ingest.md +0 -0
  34. {ingestr-0.13.89 → ingestr-0.13.91}/docs/getting-started/core-concepts.md +0 -0
  35. {ingestr-0.13.89 → ingestr-0.13.91}/docs/getting-started/data-masking.md +0 -0
  36. {ingestr-0.13.89 → ingestr-0.13.91}/docs/getting-started/incremental-loading.md +0 -0
  37. {ingestr-0.13.89 → ingestr-0.13.91}/docs/getting-started/quickstart.md +0 -0
  38. {ingestr-0.13.89 → ingestr-0.13.91}/docs/getting-started/telemetry.md +0 -0
  39. {ingestr-0.13.89 → ingestr-0.13.91}/docs/index.md +0 -0
  40. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/applovin_max.png +0 -0
  41. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/athena.png +0 -0
  42. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/clickhouse_img.png +0 -0
  43. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/clickup_ingestion.png +0 -0
  44. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/cratedb-destination.png +0 -0
  45. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/cratedb-source.png +0 -0
  46. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/freshdesk_ingestion.png +0 -0
  47. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/gcp_spanner_ingestion.png +0 -0
  48. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/github.png +0 -0
  49. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/google_analytics_realtime_report.png +0 -0
  50. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/googleanalytics.png +0 -0
  51. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/ingestion_elasticsearch_img.png +0 -0
  52. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/kinesis.bigquery.png +0 -0
  53. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/linear.png +0 -0
  54. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/linkedin_ads.png +0 -0
  55. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/mixpanel_ingestion.png +0 -0
  56. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/personio.png +0 -0
  57. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/personio_duckdb.png +0 -0
  58. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/phantombuster.png +0 -0
  59. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/pipedrive.png +0 -0
  60. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/quickbook_ingestion.png +0 -0
  61. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/sftp.png +0 -0
  62. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/stripe_postgres.png +0 -0
  63. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/tiktok.png +0 -0
  64. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/wise_ingestion.png +0 -0
  65. {ingestr-0.13.89 → ingestr-0.13.91}/docs/media/zoom_ingestion.png +0 -0
  66. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/applovin.md +0 -0
  67. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/applovin_max.md +0 -0
  68. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/asana.md +0 -0
  69. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/athena.md +0 -0
  70. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/attio.md +0 -0
  71. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/bigquery.md +0 -0
  72. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/chess.md +0 -0
  73. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/clickhouse.md +0 -0
  74. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/clickup.md +0 -0
  75. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/cratedb.md +0 -0
  76. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/csv.md +0 -0
  77. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/custom_queries.md +0 -0
  78. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/databricks.md +0 -0
  79. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/db2.md +0 -0
  80. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/duckdb.md +0 -0
  81. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/dynamodb.md +0 -0
  82. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/elasticsearch.md +0 -0
  83. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/facebook-ads.md +0 -0
  84. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/fluxx.md +0 -0
  85. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/frankfurter.md +0 -0
  86. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/freshdesk.md +0 -0
  87. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/gcs.md +0 -0
  88. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/github.md +0 -0
  89. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/google-ads.md +0 -0
  90. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/google_analytics.md +0 -0
  91. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/gorgias.md +0 -0
  92. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/gsheets.md +0 -0
  93. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/hubspot.md +0 -0
  94. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/influxdb.md +0 -0
  95. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/isoc-pulse.md +0 -0
  96. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/kafka.md +0 -0
  97. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/kinesis.md +0 -0
  98. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/klaviyo.md +0 -0
  99. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/linear.md +0 -0
  100. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/linkedin_ads.md +0 -0
  101. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/mixpanel.md +0 -0
  102. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/mongodb.md +0 -0
  103. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/motherduck.md +0 -0
  104. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/mssql.md +0 -0
  105. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/mysql.md +0 -0
  106. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/notion.md +0 -0
  107. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/oracle.md +0 -0
  108. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/personio.md +0 -0
  109. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/phantombuster.md +0 -0
  110. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/pinterest.md +0 -0
  111. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/pipedrive.md +0 -0
  112. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/postgres.md +0 -0
  113. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/quickbooks.md +0 -0
  114. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/redshift.md +0 -0
  115. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/revenuecat.md +0 -0
  116. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/s3.md +0 -0
  117. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/sap-hana.md +0 -0
  118. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/sftp.md +0 -0
  119. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/shopify.md +0 -0
  120. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/slack.md +0 -0
  121. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/smartsheets.md +0 -0
  122. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/snowflake.md +0 -0
  123. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/solidgate.md +0 -0
  124. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/spanner.md +0 -0
  125. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/sqlite.md +0 -0
  126. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/stripe.md +0 -0
  127. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/tiktok-ads.md +0 -0
  128. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/trustpilot.md +0 -0
  129. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/wise.md +0 -0
  130. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/zendesk.md +0 -0
  131. {ingestr-0.13.89 → ingestr-0.13.91}/docs/supported-sources/zoom.md +0 -0
  132. {ingestr-0.13.89 → ingestr-0.13.91}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  133. {ingestr-0.13.89 → ingestr-0.13.91}/docs/tutorials/load-personio-duckdb.md +0 -0
  134. {ingestr-0.13.89 → ingestr-0.13.91}/docs/tutorials/load-stripe-postgres.md +0 -0
  135. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/conftest.py +0 -0
  136. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/main.py +0 -0
  137. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/.gitignore +0 -0
  138. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/adjust/__init__.py +0 -0
  139. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/adjust/adjust_helpers.py +0 -0
  140. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/airtable/__init__.py +0 -0
  141. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/applovin/__init__.py +0 -0
  142. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/applovin_max/__init__.py +0 -0
  143. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/appsflyer/__init__.py +0 -0
  144. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/appsflyer/client.py +0 -0
  145. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/appstore/__init__.py +0 -0
  146. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/appstore/client.py +0 -0
  147. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/appstore/errors.py +0 -0
  148. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/appstore/models.py +0 -0
  149. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/appstore/resources.py +0 -0
  150. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/arrow/__init__.py +0 -0
  151. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/asana_source/__init__.py +0 -0
  152. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/asana_source/helpers.py +0 -0
  153. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/asana_source/settings.py +0 -0
  154. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/attio/__init__.py +0 -0
  155. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/attio/helpers.py +0 -0
  156. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/blob.py +0 -0
  157. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/chess/__init__.py +0 -0
  158. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/chess/helpers.py +0 -0
  159. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/chess/settings.py +0 -0
  160. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/clickup/__init__.py +0 -0
  161. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/clickup/helpers.py +0 -0
  162. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/collector/spinner.py +0 -0
  163. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/destinations.py +0 -0
  164. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/dynamodb/__init__.py +0 -0
  165. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/elasticsearch/__init__.py +0 -0
  166. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/errors.py +0 -0
  167. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/facebook_ads/__init__.py +0 -0
  168. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/facebook_ads/exceptions.py +0 -0
  169. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/facebook_ads/helpers.py +0 -0
  170. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/facebook_ads/settings.py +0 -0
  171. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/facebook_ads/utils.py +0 -0
  172. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/factory.py +0 -0
  173. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/filesystem/__init__.py +0 -0
  174. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/filesystem/helpers.py +0 -0
  175. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/filesystem/readers.py +0 -0
  176. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/filters.py +0 -0
  177. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/fluxx/__init__.py +0 -0
  178. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/fluxx/helpers.py +0 -0
  179. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/frankfurter/__init__.py +0 -0
  180. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/frankfurter/helpers.py +0 -0
  181. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/freshdesk/__init__.py +0 -0
  182. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  183. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/freshdesk/settings.py +0 -0
  184. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/github/__init__.py +0 -0
  185. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/github/helpers.py +0 -0
  186. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/github/queries.py +0 -0
  187. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/github/settings.py +0 -0
  188. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_ads/__init__.py +0 -0
  189. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_ads/field.py +0 -0
  190. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_ads/metrics.py +0 -0
  191. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_ads/predicates.py +0 -0
  192. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_ads/reports.py +0 -0
  193. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_analytics/__init__.py +0 -0
  194. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_analytics/helpers.py +0 -0
  195. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_sheets/README.md +0 -0
  196. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_sheets/__init__.py +0 -0
  197. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  198. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  199. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  200. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/gorgias/__init__.py +0 -0
  201. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/gorgias/helpers.py +0 -0
  202. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/http_client.py +0 -0
  203. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/hubspot/__init__.py +0 -0
  204. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/hubspot/helpers.py +0 -0
  205. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/hubspot/settings.py +0 -0
  206. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/influxdb/__init__.py +0 -0
  207. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/influxdb/client.py +0 -0
  208. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/isoc_pulse/__init__.py +0 -0
  209. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/kafka/__init__.py +0 -0
  210. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/kafka/helpers.py +0 -0
  211. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/kinesis/__init__.py +0 -0
  212. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/kinesis/helpers.py +0 -0
  213. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/klaviyo/__init__.py +0 -0
  214. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/klaviyo/client.py +0 -0
  215. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/klaviyo/helpers.py +0 -0
  216. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/linear/__init__.py +0 -0
  217. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/linear/helpers.py +0 -0
  218. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/linkedin_ads/__init__.py +0 -0
  219. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  220. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/linkedin_ads/helpers.py +0 -0
  221. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/loader.py +0 -0
  222. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/masking.py +0 -0
  223. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/mixpanel/__init__.py +0 -0
  224. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/mixpanel/client.py +0 -0
  225. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/mongodb/__init__.py +0 -0
  226. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/mongodb/helpers.py +0 -0
  227. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/notion/__init__.py +0 -0
  228. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/notion/helpers/__init__.py +0 -0
  229. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/notion/helpers/client.py +0 -0
  230. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/notion/helpers/database.py +0 -0
  231. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/notion/settings.py +0 -0
  232. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/partition.py +0 -0
  233. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/personio/__init__.py +0 -0
  234. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/personio/helpers.py +0 -0
  235. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/phantombuster/__init__.py +0 -0
  236. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/phantombuster/client.py +0 -0
  237. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/pinterest/__init__.py +0 -0
  238. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/pipedrive/__init__.py +0 -0
  239. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  240. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  241. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  242. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/pipedrive/settings.py +0 -0
  243. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/pipedrive/typing.py +0 -0
  244. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/quickbooks/__init__.py +0 -0
  245. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/resource.py +0 -0
  246. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/revenuecat/__init__.py +0 -0
  247. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/revenuecat/helpers.py +0 -0
  248. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/salesforce/helpers.py +0 -0
  249. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/shopify/__init__.py +0 -0
  250. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/shopify/exceptions.py +0 -0
  251. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/shopify/helpers.py +0 -0
  252. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/shopify/settings.py +0 -0
  253. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/slack/__init__.py +0 -0
  254. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/slack/helpers.py +0 -0
  255. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/slack/settings.py +0 -0
  256. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/solidgate/__init__.py +0 -0
  257. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/solidgate/helpers.py +0 -0
  258. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/sql_database/__init__.py +0 -0
  259. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/sql_database/callbacks.py +0 -0
  260. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/stripe_analytics/__init__.py +0 -0
  261. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/stripe_analytics/helpers.py +0 -0
  262. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/stripe_analytics/settings.py +0 -0
  263. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/table_definition.py +0 -0
  264. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/telemetry/event.py +0 -0
  265. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  266. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/tiktok_ads/__init__.py +0 -0
  267. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  268. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/time.py +0 -0
  269. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/trustpilot/__init__.py +0 -0
  270. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/trustpilot/client.py +0 -0
  271. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/version.py +0 -0
  272. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/wise/__init__.py +0 -0
  273. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/wise/client.py +0 -0
  274. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/zendesk/__init__.py +0 -0
  275. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  276. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  277. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  278. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  279. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/zendesk/settings.py +0 -0
  280. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/zoom/__init__.py +0 -0
  281. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/src/zoom/helpers.py +0 -0
  282. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/testdata/.gitignore +0 -0
  283. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/testdata/create_replace.csv +0 -0
  284. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/testdata/delete_insert_expected.csv +0 -0
  285. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/testdata/delete_insert_part1.csv +0 -0
  286. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/testdata/delete_insert_part2.csv +0 -0
  287. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/testdata/merge_expected.csv +0 -0
  288. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/testdata/merge_part1.csv +0 -0
  289. {ingestr-0.13.89 → ingestr-0.13.91}/ingestr/testdata/merge_part2.csv +0 -0
  290. {ingestr-0.13.89 → ingestr-0.13.91}/package-lock.json +0 -0
  291. {ingestr-0.13.89 → ingestr-0.13.91}/package.json +0 -0
  292. {ingestr-0.13.89 → ingestr-0.13.91}/requirements-dev.txt +0 -0
  293. {ingestr-0.13.89 → ingestr-0.13.91}/requirements.in +0 -0
  294. {ingestr-0.13.89 → ingestr-0.13.91}/requirements.txt +0 -0
  295. {ingestr-0.13.89 → ingestr-0.13.91}/requirements_arm64.txt +0 -0
  296. {ingestr-0.13.89 → ingestr-0.13.91}/resources/demo.gif +0 -0
  297. {ingestr-0.13.89 → ingestr-0.13.91}/resources/demo.tape +0 -0
  298. {ingestr-0.13.89 → ingestr-0.13.91}/resources/ingestr.svg +0 -0
  299. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/AMPM.yml +0 -0
  300. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Acronyms.yml +0 -0
  301. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Colons.yml +0 -0
  302. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Contractions.yml +0 -0
  303. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/DateFormat.yml +0 -0
  304. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Ellipses.yml +0 -0
  305. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/EmDash.yml +0 -0
  306. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Exclamation.yml +0 -0
  307. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/FirstPerson.yml +0 -0
  308. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Gender.yml +0 -0
  309. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/GenderBias.yml +0 -0
  310. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/HeadingPunctuation.yml +0 -0
  311. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Headings.yml +0 -0
  312. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Latin.yml +0 -0
  313. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/LyHyphens.yml +0 -0
  314. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/OptionalPlurals.yml +0 -0
  315. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Ordinal.yml +0 -0
  316. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/OxfordComma.yml +0 -0
  317. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Parens.yml +0 -0
  318. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Passive.yml +0 -0
  319. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Periods.yml +0 -0
  320. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Quotes.yml +0 -0
  321. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Ranges.yml +0 -0
  322. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Semicolons.yml +0 -0
  323. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Slang.yml +0 -0
  324. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Spacing.yml +0 -0
  325. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Spelling.yml +0 -0
  326. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Units.yml +0 -0
  327. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/We.yml +0 -0
  328. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/Will.yml +0 -0
  329. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/WordList.yml +0 -0
  330. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/meta.json +0 -0
  331. {ingestr-0.13.89 → ingestr-0.13.91}/styles/Google/vocab.txt +0 -0
  332. {ingestr-0.13.89 → ingestr-0.13.91}/styles/bruin/Ingestr.yml +0 -0
  333. {ingestr-0.13.89 → ingestr-0.13.91}/styles/config/vocabularies/bruin/accept.txt +0 -0
  334. {ingestr-0.13.89 → ingestr-0.13.91}/test.env.template +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.89
3
+ Version: 0.13.91
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
@@ -9,7 +9,7 @@ ingestr supports Adjust as a source.
9
9
  The URI format for Adjust is as follows:
10
10
 
11
11
  ```plaintext
12
- adjust://?api_key=<api-key-here>
12
+ adjust://?api_key=<api-key-here>&lookback_days=40
13
13
  ```
14
14
  Parameters:
15
15
  - `api_key`: Required. The API key for the Adjust account.
@@ -20,7 +20,10 @@ An API token is required to retrieve reports from the Adjust reporting API. plea
20
20
  Once you complete the guide, you should have an API key. Let's say your API key is `nr_123`, here's a sample command that will copy the data from Adjust into a DuckDB database:
21
21
 
22
22
  ```sh
23
- ingestr ingest --source-uri 'adjust://?api_key=nr_123' --source-table 'campaigns' --dest-uri duckdb:///adjust.duckdb --dest-table 'adjust.output'
23
+ ingestr ingest --source-uri 'adjust://?api_key=nr_123' \
24
+ --source-table 'campaigns' \
25
+ --dest-uri duckdb:///adjust.duckdb \
26
+ --dest-table 'adjust.output'
24
27
  ```
25
28
 
26
29
  The result of this command will be a table in the `adjust.duckdb` database.
@@ -32,6 +35,13 @@ Adjust data may change going back, which means you'll need to change your start
32
35
  ## Tables
33
36
  Adjust source allows ingesting data from various sources:
34
37
 
38
+ | Table | PK/Merge Key | Inc Key | Inc Strategy | Details |
39
+ | --------------- | ----------- | --------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
40
+ | [Events](https://dev.adjust.com/en/api/rs-api/events) | id | – | replace | Retrieves data for [events](https://dev.adjust.com/en/api/rs-api/events/) and event slugs. | |
41
+ | [campaigns](https://dev.adjust.com/en/api/rs-api/reports) | day | – | merge | Retrieves data for a campaign, showing the app's revenue and network costs over multiple days. `Columns:` campaign, day, app, store_type, channel, country, network_cost, all_revenue_total_d0, ad_revenue_total_d0, revenue_total_d0, all_revenue_total_d1, ad_revenue_total_d1, revenue_total_d1, all_revenue_total_d3, ad_revenue_total_d3, revenue_total_d3, all_revenue_total_d7, ad_revenue_total_d7, revenue_total_d7, all_revenue_total_d14, ad_revenue_total_d14, revenue_total_d14, all_revenue_total_d21 |
42
+ | [creatives](https://dev.adjust.com/en/api/rs-api/reports) | day | - | merge | Retrieves data for a creative assets, detailing the app's revenue and network costs across multiple days. `Columns:` campaign, day, app, store_type, channel, country, adgroup, creative, network_cost, all_revenue_total_d0, ad_revenue_total_d0, revenue_total_d0, all_revenue_total_d1, ad_revenue_total_d1, revenue_total_d1, all_revenue_total_d3, ad_revenue_total_d3, revenue_total_d3, all_revenue_total_d7, ad_revenue_total_d7, revenue_total_d7, all_revenue_total_d14, ad_revenue_total_d14, revenue_total_d14, all_revenue_total_d21 |
43
+ | `custom` | `configurable` | - | merge | Retrieves custom data based on the dimensions and metrics specified. Please refer to the `custom reports` section below for more information.
44
+
35
45
  #### Custom reports: `custom:<dimensions>:<metrics>[:<filters>]`
36
46
 
37
47
  The custom table allows you to retrieve data based on specific dimensions and metrics, and apply filters to the data.
@@ -50,13 +60,6 @@ Parameters:
50
60
  > [!WARNING]
51
61
  > Custom tables require a time-based dimension for efficient operation, such as `hour`, `day`, `week`, `month`, or `year`.
52
62
 
53
- | Table | PK/Merge Key | Inc Key | Inc Strategy | Details |
54
- | --------------- | ----------- | --------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
55
- | [Events](https://dev.adjust.com/en/api/rs-api/events) | id | – | replace | Retrieves data for [events](https://dev.adjust.com/en/api/rs-api/events/) and event slugs. | |
56
- | [campaigns](https://dev.adjust.com/en/api/rs-api/reports) | day | – | merge | Retrieves data for a campaign, showing the app's revenue and network costs over multiple days. `Columns:` campaign, day, app, store_type, channel, country, network_cost, all_revenue_total_d0, ad_revenue_total_d0, revenue_total_d0, all_revenue_total_d1, ad_revenue_total_d1, revenue_total_d1, all_revenue_total_d3, ad_revenue_total_d3, revenue_total_d3, all_revenue_total_d7, ad_revenue_total_d7, revenue_total_d7, all_revenue_total_d14, ad_revenue_total_d14, revenue_total_d14, all_revenue_total_d21 |
57
- | [creatives](https://dev.adjust.com/en/api/rs-api/reports) | day | - | merge | Retrieves data for a creative assets, detailing the app's revenue and network costs across multiple days. `Columns:` campaign, day, app, store_type, channel, country, adgroup, creative, network_cost, all_revenue_total_d0, ad_revenue_total_d0, revenue_total_d0, all_revenue_total_d1, ad_revenue_total_d1, revenue_total_d1, all_revenue_total_d3, ad_revenue_total_d3, revenue_total_d3, all_revenue_total_d7, ad_revenue_total_d7, revenue_total_d7, all_revenue_total_d14, ad_revenue_total_d14, revenue_total_d14, all_revenue_total_d21 |
58
- | `custom` | `configurable` | - | merge | Retrieves custom data based on the dimensions and metrics specified.
59
-
60
63
  ## Examples
61
64
 
62
65
  Copy campaigns data from Adjust into a DuckDB database:
@@ -22,15 +22,32 @@ The URI is used to connect to the Airtable API for extracting data. More details
22
22
 
23
23
  Airtable requires a few steps to set up an integration, please follow the guide dltHub [has built here](https://dlthub.com/docs/dlt-ecosystem/verified-sources/airtable#setup-guide).
24
24
 
25
- Once you complete the guide, you should have an Access Token and a Base ID. The source table you'll use for ingestr will be `<base_id>/<table_name>`.
25
+ Once you complete the guide, you should have an Access Token.
26
+
27
+ The source table you'll use for ingestr will be `<base_id>/<table_id>`.
28
+
29
+ ### Getting your Base ID and Table ID
30
+
31
+ To find your Base ID and Table ID:
32
+
33
+ 1. Log into Airtable and navigate to your base or table
34
+ 2. Look at the URL in your browser's address bar when viewing your base
35
+ 3. The Base ID always starts with "app" and appears before the next `/`
36
+ 4. The Table IDs start with "tbl" and appears before the next `/`.
37
+
38
+ For example, in this URL:
39
+ ```plaintext
40
+ https://airtable.com/appve10kl227BIT4GV/tblOUnZVLFWbemTP1/viw3qtF76bRQC3wKx/rec9khXgeTotgCQ62?blocks=hide
41
+ ```
42
+ In this case base_id is `appve10kl227BIT4GV` and table_id is `tblOUnZVLFWbemTP1`
26
43
 
27
44
  Let's say your access token is `patr123.abc` and the base ID is `appXYZ`, here's a sample command that will copy the data from Airtable into a DuckDB database:
28
45
 
29
46
  ```sh
30
- ingestr ingest
31
- --source-uri 'airtable://?access_token=patr123.abc'
32
- --source-table 'appXYZ/employee'
33
- --dest-uri 'duckdb:///airtable.duckdb'
47
+ ingestr ingest \
48
+ --source-uri 'airtable://?access_token=patr123.abc' \
49
+ --source-table 'appXYZ/employee' \
50
+ --dest-uri 'duckdb:///airtable.duckdb' \
34
51
  --dest-table 'des.employee'
35
52
  ```
36
53
 
@@ -21,10 +21,10 @@ An API token is required to retrieve reports from the AppsFlyer API, please [fol
21
21
  Let's say your API key is `ey123`, here's a sample command that will copy the data from AppsFlyer into a DuckDB database:
22
22
 
23
23
  ```bash
24
- ingestr ingest
25
- --source-uri 'appsflyer://?api_key=ey123'
26
- --source-table 'campaigns'
27
- --dest-uri duckdb:///appsflyer.duckdb
24
+ ingestr ingest \
25
+ --source-uri 'appsflyer://?api_key=ey123' \
26
+ --source-table 'campaigns' \
27
+ --dest-uri duckdb:///appsflyer.duckdb \
28
28
  --dest-table 'appsflyer.output'
29
29
  ```
30
30
 
@@ -40,7 +40,7 @@ ingestr integrates with the [Master Report API](https://dev.appsflyer.com/hc/ref
40
40
  | --------------- | ----------- | --------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
41
41
  | [campaigns](https://dev.appsflyer.com/hc/reference/master_api_get) | install_time | install_time | merge| Retrieves data for campaigns, detailing the app's costs, loyal users, total installs, and revenue over multiple days.`columns:` app_id, campaign, geo, install_time, average_ecpi, clicks, cohort_day_1_revenue_per_user, cohort_day_1_total_revenue_per_user, cohort_day_14_revenue_per_user, cohort_day_14_total_revenue_per_user, cohort_day_21_revenue_per_user, cohort_day_21_total_revenue_per_user, cohort_day_3_revenue_per_user, cohort_day_3_total_revenue_per_user, cohort_day_7_revenue_per_user, cohort_day_7_total_revenue_per_user, cost, impressions, installs, loyal_users, retention_day_7, revenue, roi, uninstalls |
42
42
  | [creatives](https://dev.appsflyer.com/hc/reference/master_api_get) | install_time | install_time | merge| Retrieves data for a creative asset, including revenue and cost. `columns:` geo, app_id, install_time, campaign, adset_id, adset, ad_id, impressions, clicks, installs, cost, revenue, average_ecpi, loyal_users, uninstalls, roi |
43
- | `custom:<dimensions>:<metrics>` | Dynamic (dimensions + install_time) | install_time | merge| Retrieves data for custom tables, which can be specified by the user.|
43
+ | `custom:<dimensions>:<metrics>` | Dynamic (dimensions + install_time) | install_time | merge| Retrieves data for custom tables, which can be specified by the user. Please refer to the `custom Tables` section below for more information. |
44
44
 
45
45
  Use these as `--source-table` parameter in the `ingestr ingest` command.
46
46
 
@@ -48,15 +48,46 @@ Use these as `--source-table` parameter in the `ingestr ingest` command.
48
48
 
49
49
  You can also ingest custom tables by providing a list of dimensions and metrics.
50
50
 
51
- The table format is as follows:
51
+ The format for the custom table is:
52
52
 
53
53
  ```plaintext
54
54
  custom:<dimension1>,<dimension2>,<metric1>,<metric2>
55
55
  ```
56
-
57
- This will automatically generate a table with the dimensions and metrics you provided.
56
+ Parameters:
57
+ - `dimensions`: A comma-separated list of [dimensions](https://support.appsflyer.com/hc/en-us/articles/213223166-Master-API-user-acquisition-metrics-via-API#groupings) to retrieve.
58
+ - `metrics`: A comma-separated list of [metrics](https://support.appsflyer.com/hc/en-us/articles/213223166-Master-API-user-acquisition-metrics-via-API#kpis) to retrieve.
58
59
 
59
60
  For custom tables, ingestr will use the given dimensions as the primary key to deduplicate the data.
60
61
 
61
62
  > [!NOTE]
62
63
  > ingestr will add `install_time` as the primary key to the table by default if it is not provided as one of the dimensions.
64
+
65
+
66
+ ## Examples
67
+
68
+ Copy campaigns data from Appsflyer into a DuckDB database:
69
+ ```sh
70
+ ingestr ingest \
71
+ --source-uri 'appsflyer://?api_key=ey123' \
72
+ --source-table 'campaigns' \
73
+ --dest-uri duckdb:///appsflyer.duckdb \
74
+ --dest-table 'dest.output'
75
+ ```
76
+
77
+ Copy creatives data from Appsflyer into a DuckDB database:
78
+ ```sh
79
+ ingestr ingest \
80
+ --source-uri 'appsflyer://?api_key=ey123' \
81
+ --source-table 'creatives' \
82
+ --dest-uri duckdb:///appsflyer.duckdb \
83
+ --dest-table 'dest.output'
84
+ ```
85
+
86
+ Copy custom data from Appsflyer into a DuckDB database:
87
+ ```sh
88
+ ingestr ingest \
89
+ --source-uri "appsflyer://?api_key=ey123" \
90
+ --source-table "custom:app_id,geo,install_time,clicks,install" \
91
+ --dest-uri duckdb:///appsflyer.db \
92
+ --dest-table "mat.example"
93
+ ```
@@ -57,70 +57,14 @@ We recommend using `ONGOING` access-type for reports. Please note that it may ta
57
57
 
58
58
  > [!NOTE]
59
59
  > you have to create a Report Request for each individual App that you want to ingest data for. You can use [list apps](https://developer.apple.com/documentation/appstoreconnectapi/get-v1-apps) API to get the list of all apps in your Apple Account.
60
- ### Example: Loading App Downloads Analytics
61
-
62
- For this example, we'll assume that:
63
- * `key_id` is `key_0`
64
- * `issuer_id` is `issue_0`
65
- * `key` is stored in the current directory and is named `api.key`
66
- * `app_id` is `12345`
67
-
68
- We will run `ingestr` to save this data to a [duckdb](https://duckdb.org/) database called `analytics.db` under the name `public.app_downloads`.
69
-
70
- ```sh
71
- ingestr ingest \
72
- --source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
73
- --source-table "app-downloads-detailed" \
74
- --dest-uri "duckdb:///analytics.db" \
75
- --dest-table "public.app_downloads" \
76
- ```
77
-
78
- ### Example: Loading Data for multiple Apps
79
-
80
- We will extend the prior example with another app with ID `67890`. To achieve this, simply add another `app_id` query parameter to the URI.
81
- ```sh
82
- ingestr ingest \
83
- --source-uri "appstore://app_id=12345&app_id=67890&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
84
- --source-table "app-downloads-detailed" \
85
- --dest-uri "duckdb:///analytics.db" \
86
- --dest-table "public.app_downloads" \
87
- ```
88
-
89
-
90
- ### Example: Incremental Loading
91
-
92
- `ingestr` supports incremental loading for all App Store tables.
93
-
94
- To begin, we will first load all data till `2025-01-01` by specifying the `--interval-end` flag. We'll assume the same credentials from our [first example](#example-loading-app-downloads-analytics)
95
- ```sh
96
- ingestr ingest \
97
- --source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
98
- --source-table "app-downloads-detailed" \
99
- --dest-uri "duckdb:///analytics.db" \
100
- --dest-table "public.app_downloads" \
101
- --interval-end "2025-01-01"
102
- ```
103
-
104
- `ingestr` will load all data available till `2025-01-01`. Now we will run `ingestr` again, but this time, we'll let `ingestr` pickup from where it left off by specifying the `--incremental-strategy` flag.
105
-
106
- ```sh
107
- ingestr ingest \
108
- --source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
109
- --source-table "app-downloads-detailed" \
110
- --dest-uri "duckdb:///analytics.db" \
111
- --dest-table "public.app_downloads" \
112
- --incremental-strategy "merge"
113
- ```
114
-
115
- Notice how we didn't specify a date parameter? `ingestr` will automatically use the metadata from last load and continue loading data from that point on.
116
60
 
117
61
  ## Tables
118
62
  | Table | PK | Inc Key | Inc Strategy | Details |
119
63
  |-------|----|---------|--------------|---------|
120
64
  | `app-downloads-detailed` | [App Apple Identifier,App Name, App Version,Campaign,Date,Device,Download Type,Page Title,Page Type,Platform Version,Pre-Order,Source Info,Source Type,Territory] | processing_date | merge | App download analytics including first-time downloads, redownloads, updates, and more. |
121
- | `app-store-discovery-and-engagement-detailed` | primary_key = [App Apple Identifier,App Name,Campaign,Date,Device,Engagement Type,Event,Page Title,Page Type,Platform Version,Source Info,Source Type,Territory] | processing_date | merge | App Store discovery and engagement metrics including data about user engagement with your app’s icons, product pages, in-app event pages, and other install sheets. |
122
- |`app-sessions-detailed` | primary_key=[Date,App Name,App Apple Identifier,App Version,Device,Platform Version,Source Type,Source Info,Campaign,Page Type,Page Title,App Download Date,Territory] | processing_date | merge | App Session provides insights on how often people open your app, and how long they spend in your app. |
123
- | app-store-installation-and-deletion-detailed | [App Apple Identifier,App Download Date,App Name,App Version,Campaign,Counts,Date,Device,Download Type,Event,Page Title,Page Type,Platform Version,Source Info,Source Type,Territory,Unique Devices] | processing_date | merge | App installation and deletion metrics including device to estimate the number of times people install and delete your App Store apps. |
65
+ | `app-store-discovery-and-engagement-detailed` | [App Apple Identifier,App Name,Campaign,Date,Device,Engagement Type,Event,Page Title,Page Type,Platform Version,Source Info,Source Type,Territory] | processing_date | merge | App Store discovery and engagement metrics including data about user engagement with your app’s icons, product pages, in-app event pages, and other install sheets. |
66
+ |`app-sessions-detailed` | [Date,App Name,App Apple Identifier,App Version,Device,Platform Version,Source Type,Source Info,Campaign,Page Type,Page Title,App Download Date,Territory] | processing_date | merge | App Session provides insights on how often people open your app, and how long they spend in your app. |
67
+ | `app-store-installation-and-deletion-detailed` | [App Apple Identifier,App Download Date,App Name,App Version,Campaign,Counts,Date,Device,Download Type,Event,Page Title,Page Type,Platform Version,Source Info,Source Type,Territory,Unique Devices] | processing_date | merge | App installation and deletion metrics including device to estimate the number of times people install and delete your App Store apps. |
124
68
  | `app-store-purchases-detailed`| [App Apple Identifier,App Download Date,App Name,Campaign,Content Apple Identifier,Content Name,Date,Device,Page Title,Page Type,Payment Method,Platform Version,Pre-Order,Purchase Type,Source Info,Source Type,Territory] | processing_date | merge | App purchase analytics including revenue, payment methods, and content details. |
125
69
  | `app-crashes-expanded`| [App Name,App Version,Build,Date,Device,Platform,Release Type,Territory] |processing_date | merge | App crash analytics including crash counts, device information, and version details. |
126
70
 
@@ -257,6 +201,63 @@ Use this report to understand crashes for your App Store apps by app version and
257
201
  | `unique_devices` | Number of unique devices where app crashed. |
258
202
 
259
203
 
204
+ ## Examples
205
+ ### Loading App Downloads Analytics
206
+
207
+ For this example, we'll assume that:
208
+ * `key_id` is `key_0`
209
+ * `issuer_id` is `issue_0`
210
+ * `key` is stored in the current directory and is named `api.key`
211
+ * `app_id` is `12345`
212
+
213
+ We will run `ingestr` to save this data to a [duckdb](https://duckdb.org/) database called `analytics.db` under the name `public.app_downloads`.
214
+
215
+ ```sh
216
+ ingestr ingest \
217
+ --source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
218
+ --source-table "app-downloads-detailed" \
219
+ --dest-uri "duckdb:///analytics.db" \
220
+ --dest-table "public.app_downloads"
221
+ ```
222
+
223
+ ### Loading Data for multiple Apps
224
+
225
+ We will extend the prior example with another app with ID `67890`. To achieve this, simply add another `app_id` query parameter to the URI.
226
+ ```sh
227
+ ingestr ingest \
228
+ --source-uri "appstore://app_id=12345&app_id=67890&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
229
+ --source-table "app-downloads-detailed" \
230
+ --dest-uri "duckdb:///analytics.db" \
231
+ --dest-table "public.app_downloads"
232
+ ```
233
+
234
+ ### Incremental Loading
235
+
236
+ `ingestr` supports incremental loading for all App Store tables.
237
+
238
+ To begin, we will first load all data till `2025-01-01` by specifying the `--interval-end` flag. We'll assume the same credentials from our [first example](#example-loading-app-downloads-analytics)
239
+ ```sh
240
+ ingestr ingest \
241
+ --source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
242
+ --source-table "app-downloads-detailed" \
243
+ --dest-uri "duckdb:///analytics.db" \
244
+ --dest-table "public.app_downloads"
245
+ --interval-end "2025-01-01"
246
+ ```
247
+
248
+ `ingestr` will load all data available till `2025-01-01`. Now we will run `ingestr` again, but this time, we'll let `ingestr` pickup from where it left off by specifying the `--incremental-strategy` flag.
249
+
250
+ ```sh
251
+ ingestr ingest \
252
+ --source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
253
+ --source-table "app-downloads-detailed" \
254
+ --dest-uri "duckdb:///analytics.db" \
255
+ --dest-table "public.app_downloads" \
256
+ --incremental-strategy "merge"
257
+ ```
258
+
259
+ Notice how we didn't specify a date parameter? `ingestr` will automatically use the metadata from last load and continue loading data from that point on.
260
+
260
261
  Use these as `--source-table` parameter in the `ingestr ingest` command.
261
262
 
262
263
  To know more about these reports and their dimensions, see [App Store Analytics docs](https://developer.apple.com/documentation/analytics-reports).
@@ -62,9 +62,29 @@ Salesforce source allows ingesting the following objects into separate tables:
62
62
  | `pricebook_entry` | id | - | replace | Represents a specific price for a product in a price book. |
63
63
  | `task` | id | last_timestamp | merge | Used to track and manage various activities and tasks within the Salesforce platform. |
64
64
  | `event` | id | last_timestamp | merge | Used to track and manage calendar-based events, such as meetings, appointments, or calls. |
65
+ | `custom:<custom_object_name>` | - | - | replace | Track and store data that’s unique to your organization. For more information about custom objects in Salesforce, read [here](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_custom_objects.htm)|
65
66
 
66
67
  Use these as `--source-table` parameters in the `ingestr ingest` command.
67
68
 
69
+ ## Examples
70
+ Copy user_role data from Salesforce into a DuckDB database:
71
+ ```sh
72
+ ingestr ingest \
73
+ --source-uri "salesforce://?username=<username>&password=<password>&token=<token>&domain=<domain>" \
74
+ --source-table "user_role" \
75
+ --dest-uri "duckdb:///sf.db" \
76
+ --dest-table "public.user_role"
77
+ ```
78
+
79
+ Copy custom object data from Salesforce into a DuckDB database:
80
+ ```sh
81
+ ingestr ingest \
82
+ --source-uri "salesforce://?username=<username>&password=<password>&token=<token>&domain=<domain>" \
83
+ --source-table "custom:My__Community_Group__c" \
84
+ --dest-uri "duckdb:///sf.db" \
85
+ --dest-table "public.my_community"
86
+ ```
87
+
68
88
  > [!WARNING]
69
89
  > Salesforce API limits may affect the frequency and volume of data ingestion. Incremental loading is supported for objects with the `SystemModstamp` field, but some objects may require full-refresh loads. This is indicated by `mode` in the tables above. Tables with mode `replace` don't support incremental loads, while the ones with `merge` do.
70
90
 
@@ -0,0 +1 @@
1
+ version = "v0.13.91"
@@ -14,6 +14,7 @@ def salesforce_source(
14
14
  password: str,
15
15
  token: str,
16
16
  domain: str,
17
+ custom_object: str = None,
17
18
  ) -> Iterable[DltResource]:
18
19
  """
19
20
  Retrieves data from Salesforce using the Salesforce API.
@@ -131,6 +132,10 @@ def salesforce_source(
131
132
  ) -> Iterable[TDataItem]:
132
133
  yield get_records(client, "Event", last_timestamp.last_value, "SystemModstamp")
133
134
 
135
+ @dlt.resource(write_disposition="replace")
136
+ def custom() -> Iterable[TDataItem]:
137
+ yield get_records(client, custom_object)
138
+
134
139
  return (
135
140
  user,
136
141
  user_role,
@@ -147,4 +152,5 @@ def salesforce_source(
147
152
  pricebook_entry,
148
153
  task,
149
154
  event,
155
+ custom,
150
156
  )
@@ -48,7 +48,7 @@ def _get_sheet_data(smartsheet_client: smartsheet.Smartsheet, sheet_id: int):
48
48
  # Transform rows to a list of dictionaries
49
49
  column_titles = [col.title for col in sheet.columns]
50
50
  for row in sheet.rows:
51
- row_data = {}
51
+ row_data = {"_row_id": row.id}
52
52
  for i, cell in enumerate(row.cells):
53
53
  row_data[column_titles[i]] = cell.value
54
54
  yield row_data
@@ -2525,9 +2525,14 @@ class SalesforceSource:
2525
2525
 
2526
2526
  src = salesforce_source(**creds) # type: ignore
2527
2527
 
2528
+ if table.startswith("custom:"):
2529
+ custom_object = table.split(":")[1]
2530
+ src = salesforce_source(**creds, custom_object=custom_object)
2531
+ return src.with_resources("custom")
2532
+
2528
2533
  if table not in src.resources:
2529
2534
  raise UnsupportedResourceError(table, "Salesforce")
2530
-
2535
+
2531
2536
  return src.with_resources(table)
2532
2537
 
2533
2538
 
@@ -60,8 +60,8 @@ class TestSmartsheetSource(unittest.TestCase):
60
60
  resource = smartsheet_source(access_token="test_token", sheet_id="123")
61
61
  data = list(resource)
62
62
  self.assertEqual(len(data), 2)
63
- self.assertEqual(data[0], {"Col A": "r1c1", "Col B": "r1c2"})
64
- self.assertEqual(data[1], {"Col A": "r2c1", "Col B": "r2c2"})
63
+ self.assertEqual(data[0], {"_row_id": 101, "Col A": "r1c1", "Col B": "r1c2"})
64
+ self.assertEqual(data[1], {"_row_id": 102, "Col A": "r2c1", "Col B": "r2c2"})
65
65
 
66
66
  mock_smartsheet_client.assert_called_once_with("test_token")
67
67
  mock_client_instance.Sheets.get_sheet.assert_any_call(
@@ -127,8 +127,8 @@ class TestSmartsheetSource(unittest.TestCase):
127
127
  data = list(data_generator)
128
128
 
129
129
  self.assertEqual(len(data), 2)
130
- self.assertEqual(data[0], {"ID": 1, "Value": "Alpha"})
131
- self.assertEqual(data[1], {"ID": 2, "Value": "Beta"})
130
+ self.assertEqual(data[0], {"_row_id": 201, "ID": 1, "Value": "Alpha"})
131
+ self.assertEqual(data[1], {"_row_id": 202, "ID": 2, "Value": "Beta"})
132
132
  mock_smartsheet_client_instance.Sheets.get_sheet.assert_called_once_with(456)
133
133
 
134
134
 
@@ -94,7 +94,9 @@ exclude = [
94
94
  'src/clickup/.*',
95
95
  'src/influxdb/.*',
96
96
  'src/freshdesk/.*',
97
- 'src/wise/.*'
97
+ 'src/wise/.*',
98
+ 'src/salesforce/.*'
99
+
98
100
  ]
99
101
 
100
102
  [[tool.mypy.overrides]]
@@ -128,7 +130,8 @@ module = [
128
130
  "ingestr.src.influxdb",
129
131
  "ingestr.src.freshdesk",
130
132
  "ingestr.src.wise",
131
- "ingestr.src.revenuecat"
133
+ "ingestr.src.revenuecat",
134
+ "ingestr.src.salesforce",
132
135
  ]
133
136
  follow_imports = "skip"
134
137
 
@@ -1 +0,0 @@
1
- version = "v0.13.89"
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