ingestr 0.13.81__tar.gz → 0.13.82__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 (325) hide show
  1. {ingestr-0.13.81 → ingestr-0.13.82}/PKG-INFO +1 -1
  2. ingestr-0.13.82/docs/supported-sources/linear.md +60 -0
  3. ingestr-0.13.82/ingestr/src/buildinfo.py +1 -0
  4. ingestr-0.13.82/ingestr/src/linear/__init__.py +557 -0
  5. ingestr-0.13.82/ingestr/src/linear/helpers.py +101 -0
  6. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/sources.py +21 -1
  7. ingestr-0.13.81/docs/supported-sources/linear.md +0 -41
  8. ingestr-0.13.81/ingestr/src/buildinfo.py +0 -1
  9. ingestr-0.13.81/ingestr/src/linear/__init__.py +0 -217
  10. ingestr-0.13.81/ingestr/src/linear/helpers.py +0 -53
  11. {ingestr-0.13.81 → ingestr-0.13.82}/.dlt/config.toml +0 -0
  12. {ingestr-0.13.81 → ingestr-0.13.82}/.dockerignore +0 -0
  13. {ingestr-0.13.81 → ingestr-0.13.82}/.githooks/pre-commit-hook.sh +0 -0
  14. {ingestr-0.13.81 → ingestr-0.13.82}/.github/workflows/deploy-docs.yml +0 -0
  15. {ingestr-0.13.81 → ingestr-0.13.82}/.github/workflows/release.yml +0 -0
  16. {ingestr-0.13.81 → ingestr-0.13.82}/.github/workflows/secrets-scan.yml +0 -0
  17. {ingestr-0.13.81 → ingestr-0.13.82}/.github/workflows/tests.yml +0 -0
  18. {ingestr-0.13.81 → ingestr-0.13.82}/.gitignore +0 -0
  19. {ingestr-0.13.81 → ingestr-0.13.82}/.gitleaksignore +0 -0
  20. {ingestr-0.13.81 → ingestr-0.13.82}/.python-version +0 -0
  21. {ingestr-0.13.81 → ingestr-0.13.82}/.vale.ini +0 -0
  22. {ingestr-0.13.81 → ingestr-0.13.82}/Dockerfile +0 -0
  23. {ingestr-0.13.81 → ingestr-0.13.82}/LICENSE.md +0 -0
  24. {ingestr-0.13.81 → ingestr-0.13.82}/Makefile +0 -0
  25. {ingestr-0.13.81 → ingestr-0.13.82}/README.md +0 -0
  26. {ingestr-0.13.81 → ingestr-0.13.82}/docs/.vitepress/config.mjs +0 -0
  27. {ingestr-0.13.81 → ingestr-0.13.82}/docs/.vitepress/theme/custom.css +0 -0
  28. {ingestr-0.13.81 → ingestr-0.13.82}/docs/.vitepress/theme/index.js +0 -0
  29. {ingestr-0.13.81 → ingestr-0.13.82}/docs/commands/example-uris.md +0 -0
  30. {ingestr-0.13.81 → ingestr-0.13.82}/docs/commands/ingest.md +0 -0
  31. {ingestr-0.13.81 → ingestr-0.13.82}/docs/getting-started/core-concepts.md +0 -0
  32. {ingestr-0.13.81 → ingestr-0.13.82}/docs/getting-started/incremental-loading.md +0 -0
  33. {ingestr-0.13.81 → ingestr-0.13.82}/docs/getting-started/quickstart.md +0 -0
  34. {ingestr-0.13.81 → ingestr-0.13.82}/docs/getting-started/telemetry.md +0 -0
  35. {ingestr-0.13.81 → ingestr-0.13.82}/docs/index.md +0 -0
  36. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/applovin_max.png +0 -0
  37. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/athena.png +0 -0
  38. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/clickhouse_img.png +0 -0
  39. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/clickup_ingestion.png +0 -0
  40. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/cratedb-destination.png +0 -0
  41. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/cratedb-source.png +0 -0
  42. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/freshdesk_ingestion.png +0 -0
  43. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/gcp_spanner_ingestion.png +0 -0
  44. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/github.png +0 -0
  45. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/google_analytics_realtime_report.png +0 -0
  46. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/googleanalytics.png +0 -0
  47. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/ingestion_elasticsearch_img.png +0 -0
  48. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/kinesis.bigquery.png +0 -0
  49. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/linear.png +0 -0
  50. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/linkedin_ads.png +0 -0
  51. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/mixpanel_ingestion.png +0 -0
  52. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/personio.png +0 -0
  53. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/personio_duckdb.png +0 -0
  54. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/phantombuster.png +0 -0
  55. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/pipedrive.png +0 -0
  56. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/quickbook_ingestion.png +0 -0
  57. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/sftp.png +0 -0
  58. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/stripe_postgres.png +0 -0
  59. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/tiktok.png +0 -0
  60. {ingestr-0.13.81 → ingestr-0.13.82}/docs/media/zoom_ingestion.png +0 -0
  61. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/adjust.md +0 -0
  62. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/airtable.md +0 -0
  63. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/applovin.md +0 -0
  64. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/applovin_max.md +0 -0
  65. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/appsflyer.md +0 -0
  66. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/appstore.md +0 -0
  67. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/asana.md +0 -0
  68. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/athena.md +0 -0
  69. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/attio.md +0 -0
  70. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/bigquery.md +0 -0
  71. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/chess.md +0 -0
  72. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/clickhouse.md +0 -0
  73. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/clickup.md +0 -0
  74. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/cratedb.md +0 -0
  75. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/csv.md +0 -0
  76. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/custom_queries.md +0 -0
  77. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/databricks.md +0 -0
  78. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/db2.md +0 -0
  79. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/duckdb.md +0 -0
  80. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/dynamodb.md +0 -0
  81. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/elasticsearch.md +0 -0
  82. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/facebook-ads.md +0 -0
  83. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/frankfurter.md +0 -0
  84. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/freshdesk.md +0 -0
  85. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/gcs.md +0 -0
  86. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/github.md +0 -0
  87. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/google-ads.md +0 -0
  88. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/google_analytics.md +0 -0
  89. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/gorgias.md +0 -0
  90. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/gsheets.md +0 -0
  91. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/hubspot.md +0 -0
  92. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/influxdb.md +0 -0
  93. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/isoc-pulse.md +0 -0
  94. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/kafka.md +0 -0
  95. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/kinesis.md +0 -0
  96. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/klaviyo.md +0 -0
  97. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/linkedin_ads.md +0 -0
  98. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/mixpanel.md +0 -0
  99. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/mongodb.md +0 -0
  100. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/motherduck.md +0 -0
  101. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/mssql.md +0 -0
  102. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/mysql.md +0 -0
  103. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/notion.md +0 -0
  104. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/oracle.md +0 -0
  105. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/personio.md +0 -0
  106. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/phantombuster.md +0 -0
  107. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/pinterest.md +0 -0
  108. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/pipedrive.md +0 -0
  109. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/postgres.md +0 -0
  110. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/quickbooks.md +0 -0
  111. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/redshift.md +0 -0
  112. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/s3.md +0 -0
  113. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/salesforce.md +0 -0
  114. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/sap-hana.md +0 -0
  115. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/sftp.md +0 -0
  116. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/shopify.md +0 -0
  117. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/slack.md +0 -0
  118. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/smartsheets.md +0 -0
  119. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/snowflake.md +0 -0
  120. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/solidgate.md +0 -0
  121. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/spanner.md +0 -0
  122. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/sqlite.md +0 -0
  123. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/stripe.md +0 -0
  124. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/tiktok-ads.md +0 -0
  125. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/trustpilot.md +0 -0
  126. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/zendesk.md +0 -0
  127. {ingestr-0.13.81 → ingestr-0.13.82}/docs/supported-sources/zoom.md +0 -0
  128. {ingestr-0.13.81 → ingestr-0.13.82}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  129. {ingestr-0.13.81 → ingestr-0.13.82}/docs/tutorials/load-personio-duckdb.md +0 -0
  130. {ingestr-0.13.81 → ingestr-0.13.82}/docs/tutorials/load-stripe-postgres.md +0 -0
  131. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/conftest.py +0 -0
  132. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/main.py +0 -0
  133. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/.gitignore +0 -0
  134. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/adjust/__init__.py +0 -0
  135. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/adjust/adjust_helpers.py +0 -0
  136. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/airtable/__init__.py +0 -0
  137. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/applovin/__init__.py +0 -0
  138. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/applovin_max/__init__.py +0 -0
  139. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/appsflyer/__init__.py +0 -0
  140. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/appsflyer/client.py +0 -0
  141. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/appstore/__init__.py +0 -0
  142. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/appstore/client.py +0 -0
  143. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/appstore/errors.py +0 -0
  144. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/appstore/models.py +0 -0
  145. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/appstore/resources.py +0 -0
  146. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/arrow/__init__.py +0 -0
  147. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/asana_source/__init__.py +0 -0
  148. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/asana_source/helpers.py +0 -0
  149. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/asana_source/settings.py +0 -0
  150. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/attio/__init__.py +0 -0
  151. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/attio/helpers.py +0 -0
  152. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/blob.py +0 -0
  153. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/chess/__init__.py +0 -0
  154. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/chess/helpers.py +0 -0
  155. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/chess/settings.py +0 -0
  156. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/clickup/__init__.py +0 -0
  157. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/clickup/helpers.py +0 -0
  158. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/collector/spinner.py +0 -0
  159. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/destinations.py +0 -0
  160. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/dynamodb/__init__.py +0 -0
  161. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/elasticsearch/__init__.py +0 -0
  162. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/errors.py +0 -0
  163. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/facebook_ads/__init__.py +0 -0
  164. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/facebook_ads/exceptions.py +0 -0
  165. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/facebook_ads/helpers.py +0 -0
  166. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/facebook_ads/settings.py +0 -0
  167. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/facebook_ads/utils.py +0 -0
  168. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/factory.py +0 -0
  169. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/filesystem/__init__.py +0 -0
  170. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/filesystem/helpers.py +0 -0
  171. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/filesystem/readers.py +0 -0
  172. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/filters.py +0 -0
  173. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/frankfurter/__init__.py +0 -0
  174. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/frankfurter/helpers.py +0 -0
  175. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/freshdesk/__init__.py +0 -0
  176. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  177. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/freshdesk/settings.py +0 -0
  178. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/github/__init__.py +0 -0
  179. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/github/helpers.py +0 -0
  180. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/github/queries.py +0 -0
  181. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/github/settings.py +0 -0
  182. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_ads/__init__.py +0 -0
  183. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_ads/field.py +0 -0
  184. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_ads/metrics.py +0 -0
  185. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_ads/predicates.py +0 -0
  186. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_ads/reports.py +0 -0
  187. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_analytics/__init__.py +0 -0
  188. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_analytics/helpers.py +0 -0
  189. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_sheets/README.md +0 -0
  190. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_sheets/__init__.py +0 -0
  191. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  192. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  193. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  194. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/gorgias/__init__.py +0 -0
  195. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/gorgias/helpers.py +0 -0
  196. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/http_client.py +0 -0
  197. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/hubspot/__init__.py +0 -0
  198. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/hubspot/helpers.py +0 -0
  199. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/hubspot/settings.py +0 -0
  200. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/influxdb/__init__.py +0 -0
  201. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/influxdb/client.py +0 -0
  202. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/isoc_pulse/__init__.py +0 -0
  203. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/kafka/__init__.py +0 -0
  204. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/kafka/helpers.py +0 -0
  205. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/kinesis/__init__.py +0 -0
  206. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/kinesis/helpers.py +0 -0
  207. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/klaviyo/__init__.py +0 -0
  208. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/klaviyo/client.py +0 -0
  209. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/klaviyo/helpers.py +0 -0
  210. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/linkedin_ads/__init__.py +0 -0
  211. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  212. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/linkedin_ads/helpers.py +0 -0
  213. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/loader.py +0 -0
  214. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/mixpanel/__init__.py +0 -0
  215. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/mixpanel/client.py +0 -0
  216. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/mongodb/__init__.py +0 -0
  217. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/mongodb/helpers.py +0 -0
  218. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/notion/__init__.py +0 -0
  219. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/notion/helpers/__init__.py +0 -0
  220. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/notion/helpers/client.py +0 -0
  221. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/notion/helpers/database.py +0 -0
  222. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/notion/settings.py +0 -0
  223. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/partition.py +0 -0
  224. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/personio/__init__.py +0 -0
  225. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/personio/helpers.py +0 -0
  226. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/phantombuster/__init__.py +0 -0
  227. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/phantombuster/client.py +0 -0
  228. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/pinterest/__init__.py +0 -0
  229. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/pipedrive/__init__.py +0 -0
  230. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  231. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  232. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  233. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/pipedrive/settings.py +0 -0
  234. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/pipedrive/typing.py +0 -0
  235. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/quickbooks/__init__.py +0 -0
  236. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/resource.py +0 -0
  237. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/salesforce/__init__.py +0 -0
  238. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/salesforce/helpers.py +0 -0
  239. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/shopify/__init__.py +0 -0
  240. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/shopify/exceptions.py +0 -0
  241. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/shopify/helpers.py +0 -0
  242. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/shopify/settings.py +0 -0
  243. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/slack/__init__.py +0 -0
  244. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/slack/helpers.py +0 -0
  245. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/slack/settings.py +0 -0
  246. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/smartsheets/__init__.py +0 -0
  247. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/solidgate/__init__.py +0 -0
  248. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/solidgate/helpers.py +0 -0
  249. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/sql_database/__init__.py +0 -0
  250. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/sql_database/callbacks.py +0 -0
  251. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/stripe_analytics/__init__.py +0 -0
  252. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/stripe_analytics/helpers.py +0 -0
  253. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/stripe_analytics/settings.py +0 -0
  254. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/table_definition.py +0 -0
  255. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/telemetry/event.py +0 -0
  256. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  257. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/tiktok_ads/__init__.py +0 -0
  258. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  259. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/time.py +0 -0
  260. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/trustpilot/__init__.py +0 -0
  261. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/trustpilot/client.py +0 -0
  262. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/version.py +0 -0
  263. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/zendesk/__init__.py +0 -0
  264. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  265. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  266. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  267. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  268. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/zendesk/settings.py +0 -0
  269. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/zoom/__init__.py +0 -0
  270. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/src/zoom/helpers.py +0 -0
  271. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/testdata/.gitignore +0 -0
  272. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/testdata/create_replace.csv +0 -0
  273. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/testdata/delete_insert_expected.csv +0 -0
  274. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/testdata/delete_insert_part1.csv +0 -0
  275. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/testdata/delete_insert_part2.csv +0 -0
  276. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/testdata/merge_expected.csv +0 -0
  277. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/testdata/merge_part1.csv +0 -0
  278. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/testdata/merge_part2.csv +0 -0
  279. {ingestr-0.13.81 → ingestr-0.13.82}/ingestr/tests/unit/test_smartsheets.py +0 -0
  280. {ingestr-0.13.81 → ingestr-0.13.82}/package-lock.json +0 -0
  281. {ingestr-0.13.81 → ingestr-0.13.82}/package.json +0 -0
  282. {ingestr-0.13.81 → ingestr-0.13.82}/pyproject.toml +0 -0
  283. {ingestr-0.13.81 → ingestr-0.13.82}/requirements-dev.txt +0 -0
  284. {ingestr-0.13.81 → ingestr-0.13.82}/requirements.in +0 -0
  285. {ingestr-0.13.81 → ingestr-0.13.82}/requirements.txt +0 -0
  286. {ingestr-0.13.81 → ingestr-0.13.82}/requirements_arm64.txt +0 -0
  287. {ingestr-0.13.81 → ingestr-0.13.82}/resources/demo.gif +0 -0
  288. {ingestr-0.13.81 → ingestr-0.13.82}/resources/demo.tape +0 -0
  289. {ingestr-0.13.81 → ingestr-0.13.82}/resources/ingestr.svg +0 -0
  290. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/AMPM.yml +0 -0
  291. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Acronyms.yml +0 -0
  292. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Colons.yml +0 -0
  293. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Contractions.yml +0 -0
  294. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/DateFormat.yml +0 -0
  295. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Ellipses.yml +0 -0
  296. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/EmDash.yml +0 -0
  297. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Exclamation.yml +0 -0
  298. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/FirstPerson.yml +0 -0
  299. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Gender.yml +0 -0
  300. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/GenderBias.yml +0 -0
  301. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/HeadingPunctuation.yml +0 -0
  302. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Headings.yml +0 -0
  303. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Latin.yml +0 -0
  304. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/LyHyphens.yml +0 -0
  305. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/OptionalPlurals.yml +0 -0
  306. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Ordinal.yml +0 -0
  307. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/OxfordComma.yml +0 -0
  308. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Parens.yml +0 -0
  309. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Passive.yml +0 -0
  310. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Periods.yml +0 -0
  311. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Quotes.yml +0 -0
  312. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Ranges.yml +0 -0
  313. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Semicolons.yml +0 -0
  314. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Slang.yml +0 -0
  315. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Spacing.yml +0 -0
  316. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Spelling.yml +0 -0
  317. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Units.yml +0 -0
  318. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/We.yml +0 -0
  319. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/Will.yml +0 -0
  320. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/WordList.yml +0 -0
  321. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/meta.json +0 -0
  322. {ingestr-0.13.81 → ingestr-0.13.82}/styles/Google/vocab.txt +0 -0
  323. {ingestr-0.13.81 → ingestr-0.13.82}/styles/bruin/Ingestr.yml +0 -0
  324. {ingestr-0.13.81 → ingestr-0.13.82}/styles/config/vocabularies/bruin/accept.txt +0 -0
  325. {ingestr-0.13.81 → ingestr-0.13.82}/test.env.template +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.81
3
+ Version: 0.13.82
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
@@ -0,0 +1,60 @@
1
+ # Linear
2
+
3
+ [Linear](https://linear.app/) is a purpose-built tool for planning and building products that provides issue tracking and project management for teams.
4
+
5
+ ingestr supports Linear as a source.
6
+
7
+ ## URI format
8
+
9
+ The URI format for Linear is:
10
+
11
+ ```plaintext
12
+ linear://?api_key=<api_key>
13
+ ```
14
+
15
+ URI parameters:
16
+
17
+ - `api_key`: The API key used for authentication with the Linear API.
18
+
19
+ ## Example usage
20
+
21
+ Assuming your API key is `lin_api_123`, you can ingest teams into DuckDB using:
22
+
23
+ ```bash
24
+ ingestr ingest
25
+ --source-uri 'linear://?api_key=lin_api_123' \
26
+ --source-table 'teams' \
27
+ --dest-uri duckdb:///linear.duckdb \
28
+ --dest-table 'dest.teams'
29
+ ```
30
+ <img alt="linear" src="../media/linear.png"/>
31
+
32
+ ## Tables
33
+ Linear source allows ingesting the following tables:
34
+
35
+ - `issues`: Fetches all issues from your Linear workspace.
36
+ - `projects`: Fetches project-level data.
37
+ - `teams`: Fetches information about the teams configured in Linear.
38
+ - `users`: Fetches users from your workspace.
39
+ - `workflow_states`: Fetches workflow states used in your Linear workspace.
40
+ - `cycles`: Fetches cycle information and planning data.
41
+ - `attachments`: Fetches file attachments associated with issues.
42
+ - `comments`: Fetches comments on issues and other entities.
43
+ - `documents`: Fetches documents created in Linear.
44
+ - `external_users`: Fetches information about external users.
45
+ - `initiative`: Fetches initiative data for high-level planning.
46
+ - `integrations`: Fetches integration configurations.
47
+ - `labels`: Fetches labels used for categorizing issues.
48
+ - `organization`: Fetches organization-level information.
49
+ - `project_updates`: Fetches updates posted to projects.
50
+ - `roadmaps`: Fetches roadmap data for strategic planning.
51
+ - `roadmap_to_projects`: Fetches relationships between roadmaps and projects.
52
+ - `team_memberships`: Fetches team membership information.
53
+ - `initiative_to_project`: Fetches relationships between initiatives and projects.
54
+ - `project_milestone`: Fetches project milestone data.
55
+ - `project_status`: Fetches project status information.
56
+ - `team`: Fetches team-level data.
57
+ - `project`: Fetches individual project information.
58
+
59
+
60
+ Use these as the `--source-table` parameter in the `ingestr ingest` command.
@@ -0,0 +1 @@
1
+ version = "v0.13.82"
@@ -0,0 +1,557 @@
1
+ from typing import Any, Dict, Iterable, Iterator
2
+
3
+ import dlt
4
+ import pendulum
5
+ import requests
6
+
7
+ from .helpers import _graphql, normalize_dictionaries, _get_date_range, _create_paginated_resource
8
+
9
+
10
+ ISSUES_QUERY = """
11
+ query Issues($cursor: String) {
12
+ issues(first: 50, after: $cursor) {
13
+ nodes {
14
+ id
15
+ title
16
+ description
17
+ createdAt
18
+ updatedAt
19
+ archivedAt
20
+ addedToCycleAt
21
+ autoArchivedAt
22
+ autoClosedAt
23
+ boardOrder
24
+ branchName
25
+ canceledAt
26
+ completedAt
27
+ customerTicketCount
28
+ descriptionState
29
+ dueDate
30
+ estimate
31
+ identifier
32
+ integrationSourceType
33
+ labelIds
34
+ number
35
+ previousIdentifiers
36
+ priority
37
+ priorityLabel
38
+ prioritySortOrder
39
+ reactionData
40
+ slaBreachesAt
41
+ slaHighRiskAt
42
+ slaMediumRiskAt
43
+ slaStartedAt
44
+ slaType
45
+ snoozedUntilAt
46
+ sortOrder
47
+ startedAt
48
+ startedTriageAt
49
+ subIssueSortOrder
50
+ triagedAt
51
+ url
52
+
53
+ creator { id }
54
+ assignee { id }
55
+ botActor { id name type }
56
+ cycle { id }
57
+ delegate { id }
58
+ externalUserCreator { id }
59
+ favorite { id }
60
+ lastAppliedTemplate { id }
61
+ parent { id }
62
+ projectMilestone { id }
63
+ recurringIssueTemplate { id }
64
+ snoozedBy { id }
65
+ sourceComment { id }
66
+ state { id }
67
+
68
+ labels(first: 250) {
69
+ nodes {
70
+ id
71
+ }
72
+ }
73
+ }
74
+ pageInfo { hasNextPage endCursor }
75
+ }
76
+ }
77
+ """
78
+
79
+ ATTACHMENTS_QUERY = """
80
+ query Attachments($cursor: String) {
81
+ attachments(first: 50, after: $cursor) {
82
+ nodes {
83
+ id
84
+ archivedAt
85
+ bodyData
86
+ createdAt
87
+ groupBySource
88
+ metadata
89
+ sourceType
90
+ subtitle
91
+ title
92
+ updatedAt
93
+ url
94
+
95
+ creator { id }
96
+ externalUserCreator { id }
97
+ issue { id }
98
+ originalIssue { id }
99
+ }
100
+ pageInfo { hasNextPage endCursor }
101
+ }
102
+ }
103
+ """
104
+
105
+ COMMENTS_QUERY = """
106
+ query Comments($cursor: String) {
107
+ comments(first: 50, after: $cursor) {
108
+ nodes {
109
+ id
110
+ archivedAt
111
+ body
112
+ bodyData
113
+ createdAt
114
+ editedAt
115
+ quotedText
116
+ reactionData
117
+ resolvedAt
118
+ threadSummary
119
+ updatedAt
120
+ url
121
+
122
+ botActor { id }
123
+ documentContent { id }
124
+ externalThread { id }
125
+ externalUser { id }
126
+ initiativeUpdate { id }
127
+ issue { id }
128
+ parent { id }
129
+ post { id }
130
+ projectUpdate { id }
131
+ resolvingComment { id }
132
+ resolvingUser { id }
133
+ user { id }
134
+ }
135
+ pageInfo { hasNextPage endCursor }
136
+ }
137
+ }
138
+ """
139
+
140
+ CYCLES_QUERY = """
141
+ query Cycles($cursor: String) {
142
+ cycles(first: 50, after: $cursor) {
143
+ nodes {
144
+ id
145
+ archivedAt
146
+ autoArchivedAt
147
+ completedAt
148
+ completedIssueCountHistory
149
+ completedScopeHistory
150
+ createdAt
151
+ description
152
+ endsAt
153
+ inProgressScopeHistory
154
+ issueCountHistory
155
+ name
156
+ number
157
+ progress
158
+ scopeHistory
159
+ startsAt
160
+ updatedAt
161
+ }
162
+ pageInfo { hasNextPage endCursor }
163
+ }
164
+ }
165
+ """
166
+
167
+ DOCUMENTS_QUERY = """
168
+ query Documents($cursor: String) {
169
+ documents(first: 50, after: $cursor) {
170
+ nodes {
171
+ id
172
+ archivedAt
173
+ color
174
+ createdAt
175
+ icon
176
+ slugId
177
+ title
178
+ updatedAt
179
+
180
+ creator { id }
181
+ updatedBy { id }
182
+ }
183
+ pageInfo { hasNextPage endCursor }
184
+ }
185
+ }
186
+ """
187
+
188
+ EXTERNAL_USERS_QUERY = """
189
+ query ExternalUsers($cursor: String) {
190
+ externalUsers(first: 50, after: $cursor) {
191
+ nodes {
192
+ id
193
+ archivedAt
194
+ avatarUrl
195
+ createdAt
196
+ displayName
197
+ email
198
+ lastSeen
199
+ name
200
+ updatedAt
201
+
202
+ organization { id }
203
+ }
204
+ pageInfo { hasNextPage endCursor }
205
+ }
206
+ }
207
+ """
208
+
209
+ INITIATIVES_QUERY = """
210
+ query Initiatives($cursor: String) {
211
+ initiatives(first: 50, after: $cursor) {
212
+ nodes {
213
+ id
214
+ archivedAt
215
+ color
216
+ completedAt
217
+ content
218
+ createdAt
219
+ description
220
+ frequencyResolution
221
+ health
222
+ healthUpdatedAt
223
+ icon
224
+ name
225
+ slugId
226
+ sortOrder
227
+ startedAt
228
+ status
229
+ targetDate
230
+ targetDateResolution
231
+ trashed
232
+ updateReminderFrequency
233
+ updateReminderFrequencyInWeeks
234
+ updateRemindersDay
235
+ updateRemindersHour
236
+ updatedAt
237
+
238
+ creator { id }
239
+ documentContent { id }
240
+ integrationsSettings { id }
241
+ lastUpdate { id }
242
+ organization { id }
243
+ owner { id }
244
+ parentInitiative { id }
245
+ }
246
+ pageInfo { hasNextPage endCursor }
247
+ }
248
+ }
249
+ """
250
+
251
+
252
+
253
+ INITIATIVE_TO_PROJECTS_QUERY = """
254
+ query InitiativeToProjects($cursor: String) {
255
+ initiativeToProjects(first: 50, after: $cursor) {
256
+ nodes {
257
+ id
258
+ archivedAt
259
+ createdAt
260
+ sortOrder
261
+ updatedAt
262
+
263
+ initiative { id }
264
+ }
265
+ pageInfo { hasNextPage endCursor }
266
+ }
267
+ }
268
+ """
269
+
270
+ PROJECT_MILESTONES_QUERY = """
271
+ query ProjectMilestones($cursor: String) {
272
+ projectMilestones(first: 50, after: $cursor) {
273
+ nodes {
274
+ id
275
+ archivedAt
276
+ createdAt
277
+ currentProgress
278
+ description
279
+ descriptionState
280
+ name
281
+ progress
282
+ progressHistory
283
+ sortOrder
284
+ status
285
+ targetDate
286
+ updatedAt
287
+
288
+ documentContent { id }
289
+ }
290
+ pageInfo { hasNextPage endCursor }
291
+ }
292
+ }
293
+ """
294
+
295
+ PROJECT_STATUSES_QUERY = """
296
+ query ProjectStatuses($cursor: String) {
297
+ projectStatuses(first: 50, after: $cursor) {
298
+ nodes {
299
+ id
300
+ archivedAt
301
+ color
302
+ createdAt
303
+ description
304
+ indefinite
305
+ name
306
+ position
307
+ type
308
+ updatedAt
309
+ }
310
+ pageInfo { hasNextPage endCursor }
311
+ }
312
+ }
313
+ """
314
+
315
+ INTEGRATIONS_QUERY = """
316
+ query Integrations($cursor: String) {
317
+ integrations(first: 50, after: $cursor) {
318
+ nodes {
319
+ id
320
+ archivedAt
321
+ createdAt
322
+ service
323
+ updatedAt
324
+
325
+ creator { id }
326
+ organization { id }
327
+ }
328
+ pageInfo { hasNextPage endCursor }
329
+ }
330
+ }
331
+ """
332
+
333
+
334
+ LABELS_QUERY = """
335
+ query IssueLabels($cursor: String) {
336
+ issueLabels(first: 50, after: $cursor) {
337
+ nodes {
338
+ id
339
+ archivedAt
340
+ color
341
+ createdAt
342
+ description
343
+ name
344
+ updatedAt
345
+
346
+ creator { id }
347
+ organization { id }
348
+ parent { id }
349
+ }
350
+ pageInfo { hasNextPage endCursor }
351
+ }
352
+ }
353
+ """
354
+
355
+
356
+ ORGANIZATION_QUERY = """
357
+ query Organization {
358
+ viewer {
359
+ organization {
360
+ id
361
+ name
362
+ createdAt
363
+ updatedAt
364
+ archivedAt
365
+ logoUrl
366
+ allowMembersToInvite
367
+ allowedAuthServices
368
+ createdIssueCount
369
+ customerCount
370
+ customersEnabled
371
+ deletionRequestedAt
372
+ gitBranchFormat
373
+ gitLinkbackMessagesEnabled
374
+ gitPublicLinkbackMessagesEnabled
375
+ logoUrl
376
+ periodUploadVolume
377
+ previousUrlKeys
378
+ roadmapEnabled
379
+ samlEnabled
380
+ scimEnabled
381
+ }
382
+ }
383
+ }
384
+ """
385
+
386
+
387
+ PROJECT_UPDATES_QUERY = """
388
+ query ProjectUpdates($cursor: String) {
389
+ projectUpdates(first: 50, after: $cursor) {
390
+ nodes {
391
+ id
392
+ archivedAt
393
+ body
394
+ bodyData
395
+ createdAt
396
+ diffMarkdown
397
+ health
398
+ updatedAt
399
+ url
400
+
401
+ user { id }
402
+ }
403
+ pageInfo { hasNextPage endCursor }
404
+ }
405
+ }
406
+ """
407
+
408
+
409
+
410
+ TEAM_MEMBERSHIPS_QUERY = """
411
+ query TeamMemberships($cursor: String) {
412
+ teamMemberships(first: 50, after: $cursor) {
413
+ nodes {
414
+ id
415
+ archivedAt
416
+ createdAt
417
+ owner
418
+ sortOrder
419
+ updatedAt
420
+
421
+ user { id }
422
+ }
423
+ pageInfo { hasNextPage endCursor }
424
+ }
425
+ }
426
+ """
427
+
428
+ USERS_QUERY = """
429
+ query Users($cursor: String) {
430
+ users(first: 50, after: $cursor) {
431
+ nodes {
432
+ id
433
+ active
434
+ admin
435
+ archivedAt
436
+ avatarUrl
437
+ calendarHash
438
+ createdAt
439
+ createdIssueCount
440
+ description
441
+ disableReason
442
+ displayName
443
+ email
444
+ guest
445
+ inviteHash
446
+ lastSeen
447
+ name
448
+ statusEmoji
449
+ statusLabel
450
+ statusUntilAt
451
+ timezone
452
+ updatedAt
453
+ url
454
+
455
+ organization { id }
456
+ }
457
+ pageInfo { hasNextPage endCursor }
458
+ }
459
+ }
460
+ """
461
+ WORKFLOW_STATES_QUERY = """
462
+ query WorkflowStates($cursor: String) {
463
+ workflowStates(first: 50, after: $cursor) {
464
+ nodes {
465
+ id
466
+ archivedAt
467
+ color
468
+ createdAt
469
+ description
470
+ name
471
+ position
472
+ type
473
+ updatedAt
474
+ }
475
+ pageInfo { hasNextPage endCursor }
476
+ }
477
+ }
478
+ """
479
+ PROJECTS_QUERY = """
480
+ query Projects($cursor: String) {
481
+ projects(first: 50, after: $cursor) {
482
+ nodes {
483
+ id
484
+ name
485
+ description
486
+ createdAt
487
+ updatedAt
488
+ health
489
+ priority
490
+ targetDate
491
+ lead { id }
492
+ }
493
+ pageInfo { hasNextPage endCursor }
494
+ }
495
+ }
496
+ """
497
+
498
+
499
+ # Paginated resources configuration
500
+ PAGINATED_RESOURCES = [
501
+ ("issues", ISSUES_QUERY, "issues"),
502
+ ("users", USERS_QUERY, "users"),
503
+ ("workflow_states", WORKFLOW_STATES_QUERY, "workflowStates"),
504
+ ("cycles", CYCLES_QUERY, "cycles"),
505
+ ("attachments", ATTACHMENTS_QUERY, "attachments"),
506
+ ("comments", COMMENTS_QUERY, "comments"),
507
+ ("documents", DOCUMENTS_QUERY, "documents"),
508
+ ("external_users", EXTERNAL_USERS_QUERY, "externalUsers"),
509
+ ("initiative", INITIATIVES_QUERY, "initiatives"),
510
+ ("integrations", INTEGRATIONS_QUERY, "integrations"),
511
+ ("labels", LABELS_QUERY, "issueLabels"),
512
+ ("project_updates", PROJECT_UPDATES_QUERY, "projectUpdates"),
513
+ ("team_memberships", TEAM_MEMBERSHIPS_QUERY, "teamMemberships"),
514
+ ("initiative_to_project", INITIATIVE_TO_PROJECTS_QUERY, "initiativeToProjects"),
515
+ ("project_milestone", PROJECT_MILESTONES_QUERY, "projectMilestones"),
516
+ ("project_status", PROJECT_STATUSES_QUERY, "projectStatuses"),
517
+ ("projects", PROJECTS_QUERY, "projects"),
518
+ ]
519
+
520
+
521
+
522
+ @dlt.source(name="linear", max_table_nesting=0)
523
+ def linear_source(
524
+ api_key: str,
525
+ start_date: pendulum.DateTime,
526
+ end_date: pendulum.DateTime | None = None,
527
+ ) -> Iterable[dlt.sources.DltResource]:
528
+
529
+ @dlt.resource(name="organization", primary_key="id", write_disposition="merge")
530
+ def organization(
531
+ updated_at: dlt.sources.incremental[str] = dlt.sources.incremental(
532
+ "updatedAt",
533
+ initial_value=start_date.isoformat(),
534
+ end_value=end_date.isoformat() if end_date else None,
535
+ range_start="closed",
536
+ range_end="closed",
537
+ ),
538
+ ) -> Iterator[Dict[str, Any]]:
539
+ current_start_date, current_end_date = _get_date_range(updated_at, start_date)
540
+
541
+ data = _graphql(api_key, ORGANIZATION_QUERY)
542
+ if "viewer" in data and "organization" in data["viewer"]:
543
+ item = data["viewer"]["organization"]
544
+ if item and pendulum.parse(item["updatedAt"]) >= current_start_date:
545
+ if pendulum.parse(item["updatedAt"]) <= current_end_date:
546
+ yield normalize_dictionaries(item)
547
+
548
+ # Create paginated resources dynamically
549
+ paginated_resources = [
550
+ _create_paginated_resource(resource_name, query, query_field, api_key, start_date, end_date)
551
+ for resource_name, query, query_field in PAGINATED_RESOURCES
552
+ ]
553
+
554
+ return [
555
+ *paginated_resources,
556
+ organization,
557
+ ]