ingestr 0.13.26__tar.gz → 0.13.28__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 (258) hide show
  1. {ingestr-0.13.26 → ingestr-0.13.28}/PKG-INFO +2 -2
  2. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/google_analytics.md +6 -1
  3. ingestr-0.13.28/ingestr/src/buildinfo.py +1 -0
  4. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/hubspot/__init__.py +31 -3
  5. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/hubspot/helpers.py +6 -2
  6. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/sources.py +25 -6
  7. {ingestr-0.13.26 → ingestr-0.13.28}/requirements.txt +1 -1
  8. ingestr-0.13.26/ingestr/src/buildinfo.py +0 -1
  9. {ingestr-0.13.26 → ingestr-0.13.28}/.dockerignore +0 -0
  10. {ingestr-0.13.26 → ingestr-0.13.28}/.githooks/pre-commit-hook.sh +0 -0
  11. {ingestr-0.13.26 → ingestr-0.13.28}/.github/workflows/deploy-docs.yml +0 -0
  12. {ingestr-0.13.26 → ingestr-0.13.28}/.github/workflows/release.yml +0 -0
  13. {ingestr-0.13.26 → ingestr-0.13.28}/.github/workflows/secrets-scan.yml +0 -0
  14. {ingestr-0.13.26 → ingestr-0.13.28}/.github/workflows/tests.yml +0 -0
  15. {ingestr-0.13.26 → ingestr-0.13.28}/.gitignore +0 -0
  16. {ingestr-0.13.26 → ingestr-0.13.28}/.gitleaksignore +0 -0
  17. {ingestr-0.13.26 → ingestr-0.13.28}/.python-version +0 -0
  18. {ingestr-0.13.26 → ingestr-0.13.28}/.vale.ini +0 -0
  19. {ingestr-0.13.26 → ingestr-0.13.28}/Dockerfile +0 -0
  20. {ingestr-0.13.26 → ingestr-0.13.28}/LICENSE.md +0 -0
  21. {ingestr-0.13.26 → ingestr-0.13.28}/Makefile +0 -0
  22. {ingestr-0.13.26 → ingestr-0.13.28}/README.md +0 -0
  23. {ingestr-0.13.26 → ingestr-0.13.28}/docs/.vitepress/config.mjs +0 -0
  24. {ingestr-0.13.26 → ingestr-0.13.28}/docs/.vitepress/theme/custom.css +0 -0
  25. {ingestr-0.13.26 → ingestr-0.13.28}/docs/.vitepress/theme/index.js +0 -0
  26. {ingestr-0.13.26 → ingestr-0.13.28}/docs/commands/example-uris.md +0 -0
  27. {ingestr-0.13.26 → ingestr-0.13.28}/docs/commands/ingest.md +0 -0
  28. {ingestr-0.13.26 → ingestr-0.13.28}/docs/getting-started/core-concepts.md +0 -0
  29. {ingestr-0.13.26 → ingestr-0.13.28}/docs/getting-started/incremental-loading.md +0 -0
  30. {ingestr-0.13.26 → ingestr-0.13.28}/docs/getting-started/quickstart.md +0 -0
  31. {ingestr-0.13.26 → ingestr-0.13.28}/docs/getting-started/telemetry.md +0 -0
  32. {ingestr-0.13.26 → ingestr-0.13.28}/docs/index.md +0 -0
  33. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/applovin_max.png +0 -0
  34. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/athena.png +0 -0
  35. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/clickhouse_img.png +0 -0
  36. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/github.png +0 -0
  37. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/googleanalytics.png +0 -0
  38. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/kinesis.bigquery.png +0 -0
  39. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/linkedin_ads.png +0 -0
  40. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/personio.png +0 -0
  41. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/personio_duckdb.png +0 -0
  42. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/pipedrive.png +0 -0
  43. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/stripe_postgres.png +0 -0
  44. {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/tiktok.png +0 -0
  45. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/adjust.md +0 -0
  46. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/airtable.md +0 -0
  47. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/applovin.md +0 -0
  48. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/applovin_max.md +0 -0
  49. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/appsflyer.md +0 -0
  50. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/appstore.md +0 -0
  51. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/asana.md +0 -0
  52. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/athena.md +0 -0
  53. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/bigquery.md +0 -0
  54. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/chess.md +0 -0
  55. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/clickhouse.md +0 -0
  56. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/csv.md +0 -0
  57. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/custom_queries.md +0 -0
  58. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/databricks.md +0 -0
  59. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/db2.md +0 -0
  60. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/duckdb.md +0 -0
  61. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/dynamodb.md +0 -0
  62. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/facebook-ads.md +0 -0
  63. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/frankfurter.md +0 -0
  64. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/gcs.md +0 -0
  65. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/github.md +0 -0
  66. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/google-ads.md +0 -0
  67. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/gorgias.md +0 -0
  68. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/gsheets.md +0 -0
  69. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/hubspot.md +0 -0
  70. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/kafka.md +0 -0
  71. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/kinesis.md +0 -0
  72. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/klaviyo.md +0 -0
  73. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/linkedin_ads.md +0 -0
  74. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/mongodb.md +0 -0
  75. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/mssql.md +0 -0
  76. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/mysql.md +0 -0
  77. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/notion.md +0 -0
  78. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/oracle.md +0 -0
  79. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/personio.md +0 -0
  80. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/pipedrive.md +0 -0
  81. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/postgres.md +0 -0
  82. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/redshift.md +0 -0
  83. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/s3.md +0 -0
  84. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/salesforce.md +0 -0
  85. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/sap-hana.md +0 -0
  86. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/shopify.md +0 -0
  87. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/slack.md +0 -0
  88. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/snowflake.md +0 -0
  89. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/sqlite.md +0 -0
  90. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/stripe.md +0 -0
  91. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/tiktok-ads.md +0 -0
  92. {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/zendesk.md +0 -0
  93. {ingestr-0.13.26 → ingestr-0.13.28}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  94. {ingestr-0.13.26 → ingestr-0.13.28}/docs/tutorials/load-personio-duckdb.md +0 -0
  95. {ingestr-0.13.26 → ingestr-0.13.28}/docs/tutorials/load-stripe-postgres.md +0 -0
  96. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/conftest.py +0 -0
  97. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/main.py +0 -0
  98. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/.gitignore +0 -0
  99. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/adjust/__init__.py +0 -0
  100. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/adjust/adjust_helpers.py +0 -0
  101. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/airtable/__init__.py +0 -0
  102. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/applovin/__init__.py +0 -0
  103. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/applovin_max/__init__.py +0 -0
  104. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appsflyer/_init_.py +0 -0
  105. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appsflyer/client.py +0 -0
  106. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/__init__.py +0 -0
  107. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/client.py +0 -0
  108. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/errors.py +0 -0
  109. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/models.py +0 -0
  110. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/resources.py +0 -0
  111. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/arrow/__init__.py +0 -0
  112. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/asana_source/__init__.py +0 -0
  113. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/asana_source/helpers.py +0 -0
  114. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/asana_source/settings.py +0 -0
  115. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/blob.py +0 -0
  116. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/chess/__init__.py +0 -0
  117. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/chess/helpers.py +0 -0
  118. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/chess/settings.py +0 -0
  119. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/destinations.py +0 -0
  120. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/dynamodb/__init__.py +0 -0
  121. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/errors.py +0 -0
  122. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/facebook_ads/__init__.py +0 -0
  123. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/facebook_ads/exceptions.py +0 -0
  124. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/facebook_ads/helpers.py +0 -0
  125. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/facebook_ads/settings.py +0 -0
  126. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/factory.py +0 -0
  127. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/filesystem/__init__.py +0 -0
  128. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/filesystem/helpers.py +0 -0
  129. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/filesystem/readers.py +0 -0
  130. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/filters.py +0 -0
  131. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/frankfurter/__init__.py +0 -0
  132. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/frankfurter/helpers.py +0 -0
  133. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/github/__init__.py +0 -0
  134. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/github/helpers.py +0 -0
  135. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/github/queries.py +0 -0
  136. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/github/settings.py +0 -0
  137. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/__init__.py +0 -0
  138. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/field.py +0 -0
  139. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/metrics.py +0 -0
  140. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/predicates.py +0 -0
  141. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/reports.py +0 -0
  142. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_analytics/__init__.py +0 -0
  143. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_analytics/helpers.py +0 -0
  144. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/README.md +0 -0
  145. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/__init__.py +0 -0
  146. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  147. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  148. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  149. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/gorgias/__init__.py +0 -0
  150. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/gorgias/helpers.py +0 -0
  151. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/hubspot/settings.py +0 -0
  152. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/kafka/__init__.py +0 -0
  153. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/kafka/helpers.py +0 -0
  154. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/kinesis/__init__.py +0 -0
  155. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/kinesis/helpers.py +0 -0
  156. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/klaviyo/_init_.py +0 -0
  157. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/klaviyo/client.py +0 -0
  158. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/klaviyo/helpers.py +0 -0
  159. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/linkedin_ads/__init__.py +0 -0
  160. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  161. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/linkedin_ads/helpers.py +0 -0
  162. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/loader.py +0 -0
  163. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/mongodb/__init__.py +0 -0
  164. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/mongodb/helpers.py +0 -0
  165. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/__init__.py +0 -0
  166. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/helpers/__init__.py +0 -0
  167. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/helpers/client.py +0 -0
  168. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/helpers/database.py +0 -0
  169. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/settings.py +0 -0
  170. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/partition.py +0 -0
  171. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/personio/__init__.py +0 -0
  172. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/personio/helpers.py +0 -0
  173. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/__init__.py +0 -0
  174. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  175. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  176. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  177. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/settings.py +0 -0
  178. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/typing.py +0 -0
  179. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/resource.py +0 -0
  180. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/salesforce/__init__.py +0 -0
  181. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/salesforce/helpers.py +0 -0
  182. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/shopify/__init__.py +0 -0
  183. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/shopify/exceptions.py +0 -0
  184. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/shopify/helpers.py +0 -0
  185. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/shopify/settings.py +0 -0
  186. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/slack/__init__.py +0 -0
  187. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/slack/helpers.py +0 -0
  188. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/slack/settings.py +0 -0
  189. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/sql_database/__init__.py +0 -0
  190. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/sql_database/callbacks.py +0 -0
  191. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/stripe_analytics/__init__.py +0 -0
  192. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/stripe_analytics/helpers.py +0 -0
  193. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/stripe_analytics/settings.py +0 -0
  194. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/table_definition.py +0 -0
  195. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/telemetry/event.py +0 -0
  196. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  197. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/tiktok_ads/__init__.py +0 -0
  198. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  199. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/time.py +0 -0
  200. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/version.py +0 -0
  201. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/__init__.py +0 -0
  202. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  203. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  204. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  205. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  206. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/settings.py +0 -0
  207. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/.gitignore +0 -0
  208. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/create_replace.csv +0 -0
  209. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/delete_insert_expected.csv +0 -0
  210. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/delete_insert_part1.csv +0 -0
  211. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/delete_insert_part2.csv +0 -0
  212. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/merge_expected.csv +0 -0
  213. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/merge_part1.csv +0 -0
  214. {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/merge_part2.csv +0 -0
  215. {ingestr-0.13.26 → ingestr-0.13.28}/package-lock.json +0 -0
  216. {ingestr-0.13.26 → ingestr-0.13.28}/package.json +0 -0
  217. {ingestr-0.13.26 → ingestr-0.13.28}/pyproject.toml +0 -0
  218. {ingestr-0.13.26 → ingestr-0.13.28}/requirements-dev.txt +0 -0
  219. {ingestr-0.13.26 → ingestr-0.13.28}/requirements.in +0 -0
  220. {ingestr-0.13.26 → ingestr-0.13.28}/requirements_arm64.txt +0 -0
  221. {ingestr-0.13.26 → ingestr-0.13.28}/resources/demo.gif +0 -0
  222. {ingestr-0.13.26 → ingestr-0.13.28}/resources/demo.tape +0 -0
  223. {ingestr-0.13.26 → ingestr-0.13.28}/resources/ingestr.svg +0 -0
  224. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/AMPM.yml +0 -0
  225. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Acronyms.yml +0 -0
  226. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Colons.yml +0 -0
  227. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Contractions.yml +0 -0
  228. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/DateFormat.yml +0 -0
  229. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Ellipses.yml +0 -0
  230. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/EmDash.yml +0 -0
  231. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Exclamation.yml +0 -0
  232. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/FirstPerson.yml +0 -0
  233. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Gender.yml +0 -0
  234. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/GenderBias.yml +0 -0
  235. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/HeadingPunctuation.yml +0 -0
  236. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Headings.yml +0 -0
  237. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Latin.yml +0 -0
  238. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/LyHyphens.yml +0 -0
  239. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/OptionalPlurals.yml +0 -0
  240. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Ordinal.yml +0 -0
  241. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/OxfordComma.yml +0 -0
  242. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Parens.yml +0 -0
  243. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Passive.yml +0 -0
  244. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Periods.yml +0 -0
  245. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Quotes.yml +0 -0
  246. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Ranges.yml +0 -0
  247. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Semicolons.yml +0 -0
  248. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Slang.yml +0 -0
  249. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Spacing.yml +0 -0
  250. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Spelling.yml +0 -0
  251. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Units.yml +0 -0
  252. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/We.yml +0 -0
  253. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Will.yml +0 -0
  254. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/WordList.yml +0 -0
  255. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/meta.json +0 -0
  256. {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/vocab.txt +0 -0
  257. {ingestr-0.13.26 → ingestr-0.13.28}/styles/bruin/Ingestr.yml +0 -0
  258. {ingestr-0.13.26 → ingestr-0.13.28}/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.26
3
+ Version: 0.13.28
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
@@ -74,7 +74,7 @@ Requires-Dist: google-cloud-storage==3.1.0
74
74
  Requires-Dist: google-crc32c==1.6.0
75
75
  Requires-Dist: google-resumable-media==2.7.2
76
76
  Requires-Dist: googleapis-common-protos==1.69.0
77
- Requires-Dist: greenlet==3.1.1
77
+ Requires-Dist: greenlet==3.2.0
78
78
  Requires-Dist: grpcio-status==1.62.3
79
79
  Requires-Dist: grpcio==1.70.0
80
80
  Requires-Dist: hdbcli==2.23.27
@@ -9,10 +9,15 @@ The URI format for Google Analytics is as follows:
9
9
  ```plaintext
10
10
  googleanalytics://?credentials_path=/path/to/service/account.json&property_id=<property_id>
11
11
  ```
12
+ Alternatively, you can use base64 encoded credentials:
13
+
14
+ ```
15
+ googleanalytics://?credentials_base64=<base64_encoded_credentials>&property_id=<property_id>
16
+ ```
12
17
 
13
18
  URI parameters:
14
19
  - `credentials_path`: The path to the service account JSON file.
15
- - `property_id`: It is a unique number that identifies a particular property on Google Analytics. [Follow this guide](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id#what_is_my_property_id) if you don't know your property ID.
20
+ - `property_id`: It is a unique number that identifies a particular property on Google Analytics. [Follow this guide](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id#what_is_my_property_id) to know more about property ID.
16
21
 
17
22
  ## Setting up an Google Analytics Integration
18
23
  Google Analytics 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/google_analytics#grab-google-service-account-credentials). Once you complete the guide, you should have an `.json` file and `project_id`.
@@ -0,0 +1 @@
1
+ version = "v0.13.28"
@@ -56,6 +56,7 @@ def hubspot(
56
56
  api_key: str = dlt.secrets.value,
57
57
  include_history: bool = False,
58
58
  include_custom_props: bool = True,
59
+ custom_object: str = None,
59
60
  ) -> Sequence[DltResource]:
60
61
  """
61
62
  A DLT source that retrieves data from the HubSpot API using the
@@ -162,13 +163,13 @@ def hubspot(
162
163
  props,
163
164
  include_custom_props,
164
165
  )
165
-
166
+
166
167
  @dlt.resource(name="schemas", write_disposition="merge", primary_key="id")
167
168
  def schemas(
168
169
  api_key: str = api_key,
169
170
  ) -> Iterator[TDataItems]:
170
171
  """Hubspot schemas resource"""
171
- yield from fetch_data(CRM_SCHEMAS_ENDPOINT, api_key)
172
+ yield from fetch_data(CRM_SCHEMAS_ENDPOINT, api_key,resource_name="schemas")
172
173
 
173
174
  @dlt.resource(name="quotes", write_disposition="replace")
174
175
  def quotes(
@@ -186,7 +187,34 @@ def hubspot(
186
187
  include_custom_props,
187
188
  )
188
189
 
189
- return companies, contacts, deals, tickets, products, quotes, schemas
190
+ @dlt.resource(write_disposition="merge", primary_key="hs_object_id")
191
+ def custom(
192
+ api_key: str = api_key,
193
+ custom_object_name: str = custom_object,
194
+ ) -> Iterator[TDataItems]:
195
+
196
+ get_custom_object = schemas(api_key)
197
+ object_type_id = None
198
+ for custom_object in get_custom_object:
199
+ if custom_object["name"] == custom_object_name.capitalize():
200
+ object_type_id = custom_object["objectTypeId"]
201
+ break
202
+ if object_type_id is None:
203
+ raise ValueError(f"There is no such custom object as {custom_object_name}")
204
+ custom_object_properties= f"crm/v3/properties/{object_type_id}"
205
+
206
+ props_pages = fetch_data(custom_object_properties, api_key)
207
+ props = []
208
+ for page in props_pages:
209
+ props.extend([prop["name"] for prop in page])
210
+ props = ",".join(sorted(list(set(props))))
211
+
212
+ custom_object_endpoint= f"crm/v3/objects/{object_type_id}/?properties={props}"
213
+
214
+ """Hubspot custom object details resource"""
215
+ yield from fetch_data(custom_object_endpoint, api_key,resource_name="custom")
216
+
217
+ return companies, contacts, deals, tickets, products, quotes, schemas, custom
190
218
 
191
219
 
192
220
  def crm_objects(
@@ -90,7 +90,7 @@ def fetch_property_history(
90
90
 
91
91
 
92
92
  def fetch_data(
93
- endpoint: str, api_key: str, params: Optional[Dict[str, Any]] = None
93
+ endpoint: str, api_key: str, params: Optional[Dict[str, Any]] = None,resource_name: str = None
94
94
  ) -> Iterator[List[Dict[str, Any]]]:
95
95
  """
96
96
  Fetch data from HUBSPOT endpoint using a specified API key and yield the properties of each result.
@@ -132,7 +132,7 @@ def fetch_data(
132
132
  if "results" in _data:
133
133
  _objects: List[Dict[str, Any]] = []
134
134
  for _result in _data["results"]:
135
- if endpoint == "/crm/v3/schemas":
135
+ if resource_name == "schemas":
136
136
  _objects.append({
137
137
  "name": _result["labels"].get("singular", ""),
138
138
  "objectTypeId": _result.get("objectTypeId", ""),
@@ -142,6 +142,10 @@ def fetch_data(
142
142
  "createdAt": _result.get("createdAt", ""),
143
143
  "updatedAt": _result.get("updatedAt", "")
144
144
  })
145
+ elif resource_name == "custom":
146
+ _objects.append(
147
+ _result.get("properties", ""),
148
+ )
145
149
  else:
146
150
  _obj = _result.get("properties", _result)
147
151
  if "id" not in _obj and "id" in _result:
@@ -803,7 +803,20 @@ class HubspotSource:
803
803
  raise ValueError("api_key in the URI is required to connect to Hubspot")
804
804
 
805
805
  endpoint = None
806
- if table in ["contacts", "companies", "deals", "tickets", "products", "quotes", "schemas"]:
806
+
807
+ if table.startswith("custom:"):
808
+ fields = table.split(":", 2)
809
+ if len(fields) != 2:
810
+ raise ValueError(
811
+ "Invalid Hubspot custom table format. Expected format: custom:<custom_object_type>"
812
+ )
813
+ endpoint = fields[1]
814
+ return hubspot(
815
+ api_key=api_key[0],
816
+ custom_object=endpoint,
817
+ ).with_resources("custom")
818
+
819
+ elif table in ["contacts", "companies", "deals", "tickets", "products", "quotes", "schemas"]:
807
820
  endpoint = table
808
821
  else:
809
822
  raise ValueError(
@@ -1398,13 +1411,19 @@ class GoogleAnalyticsSource:
1398
1411
  parse_uri = urlparse(uri)
1399
1412
  source_fields = parse_qs(parse_uri.query)
1400
1413
  cred_path = source_fields.get("credentials_path")
1414
+ cred_base64 = source_fields.get("credentials_base64")
1401
1415
 
1402
- if not cred_path:
1403
- raise ValueError("credentials_path is required to connect Google Analytics")
1404
- credentials = {}
1416
+ if not cred_path and not cred_base64:
1417
+ raise ValueError("credentials_path or credentials_base64 is required to connect Google Analytics")
1405
1418
 
1406
- with open(cred_path[0], "r") as f:
1407
- credentials = json.load(f)
1419
+ credentials = {}
1420
+ if cred_path:
1421
+ with open(cred_path[0], "r") as f:
1422
+ credentials = json.load(f)
1423
+ elif cred_base64:
1424
+ credentials = json.loads(
1425
+ base64.b64decode(cred_base64[0]).decode("utf-8")
1426
+ )
1408
1427
 
1409
1428
  property_id = source_fields.get("property_id")
1410
1429
  if not property_id:
@@ -187,7 +187,7 @@ googleapis-common-protos==1.69.0
187
187
  # google-ads
188
188
  # google-api-core
189
189
  # grpcio-status
190
- greenlet==3.1.1
190
+ greenlet==3.2.0
191
191
  # via sqlalchemy
192
192
  grpcio==1.70.0
193
193
  # via
@@ -1 +0,0 @@
1
- version = "v0.13.26"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes