querysource 4.5.10__tar.gz → 4.5.12__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.
Files changed (634) hide show
  1. {querysource-4.5.10 → querysource-4.5.12}/Makefile +5 -6
  2. {querysource-4.5.10 → querysource-4.5.12}/PKG-INFO +2 -1
  3. {querysource-4.5.10 → querysource-4.5.12}/pyproject.toml +2 -1
  4. {querysource-4.5.10 → querysource-4.5.12}/querysource/_version.py +3 -3
  5. {querysource-4.5.10 → querysource-4.5.12}/querysource/exceptions.py +21 -1
  6. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/abstract.py +9 -2
  7. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/multi.py +50 -20
  8. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/__init__.py +63 -3
  9. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/dt/filters.py +6 -3
  10. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/errors.py +31 -5
  11. {querysource-4.5.10 → querysource-4.5.12}/querysource/version.py +1 -1
  12. {querysource-4.5.10 → querysource-4.5.12}/querysource.egg-info/PKG-INFO +2 -1
  13. {querysource-4.5.10 → querysource-4.5.12}/querysource.egg-info/SOURCES.txt +6 -0
  14. {querysource-4.5.10 → querysource-4.5.12}/querysource.egg-info/requires.txt +1 -0
  15. {querysource-4.5.10 → querysource-4.5.12}/querysource.egg-info/scm_file_list.json +839 -826
  16. querysource-4.5.12/querysource.egg-info/scm_version.json +8 -0
  17. querysource-4.5.12/tests/integration/test_multiquery_output_errors.py +207 -0
  18. querysource-4.5.12/tests/test_multiqs_slug_sources_normalize.py +73 -0
  19. querysource-4.5.12/tests/unit/test_error_payload.py +82 -0
  20. querysource-4.5.12/tests/unit/test_handler_output_status.py +124 -0
  21. querysource-4.5.12/tests/unit/test_multiqs_output_raise.py +128 -0
  22. querysource-4.5.12/tests/unit/test_output_error.py +22 -0
  23. querysource-4.5.10/querysource.egg-info/scm_version.json +0 -8
  24. {querysource-4.5.10 → querysource-4.5.12}/.agent/rules/async-programming-expert.md +0 -0
  25. {querysource-4.5.10 → querysource-4.5.12}/.agent/rules/code-reviewer.md +0 -0
  26. {querysource-4.5.10 → querysource-4.5.12}/.agent/rules/cython-development.md +0 -0
  27. {querysource-4.5.10 → querysource-4.5.12}/.agent/rules/prompt-expert.md +0 -0
  28. {querysource-4.5.10 → querysource-4.5.12}/.agent/rules/python-development.md +0 -0
  29. {querysource-4.5.10 → querysource-4.5.12}/.agent/rules/rust-development.md +0 -0
  30. {querysource-4.5.10 → querysource-4.5.12}/.agent/workflows/create-parrot-tool.md +0 -0
  31. {querysource-4.5.10 → querysource-4.5.12}/.agent/workflows/create-workflow.md +0 -0
  32. {querysource-4.5.10 → querysource-4.5.12}/.agent/workflows/debug-regressions-with-git-bisect-binary-search.md +0 -0
  33. {querysource-4.5.10 → querysource-4.5.12}/.agent/workflows/generate-tests.md +0 -0
  34. {querysource-4.5.10 → querysource-4.5.12}/.agent/workflows/git-new-feature.md +0 -0
  35. {querysource-4.5.10 → querysource-4.5.12}/.agent/workflows/parrot-mcp-server.md +0 -0
  36. {querysource-4.5.10 → querysource-4.5.12}/.agent/workflows/release_package.md +0 -0
  37. {querysource-4.5.10 → querysource-4.5.12}/.agent/workflows/start-flow.md +0 -0
  38. {querysource-4.5.10 → querysource-4.5.12}/.bumpversion.cfg +0 -0
  39. {querysource-4.5.10 → querysource-4.5.12}/.claude/agents/code-reviewer.md +0 -0
  40. {querysource-4.5.10 → querysource-4.5.12}/.claude/agents/sdd-autopilot.md +0 -0
  41. {querysource-4.5.10 → querysource-4.5.12}/.claude/agents/sdd-qa.md +0 -0
  42. {querysource-4.5.10 → querysource-4.5.12}/.claude/agents/sdd-research.md +0 -0
  43. {querysource-4.5.10 → querysource-4.5.12}/.claude/agents/sdd-worker.md +0 -0
  44. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/pr-review.md +0 -0
  45. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-brainstorm.md +0 -0
  46. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-codereview.md +0 -0
  47. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-done.md +0 -0
  48. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-fromjira.md +0 -0
  49. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-next.md +0 -0
  50. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-proposal.md +0 -0
  51. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-spec.md +0 -0
  52. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-start.md +0 -0
  53. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-status.md +0 -0
  54. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-task.md +0 -0
  55. {querysource-4.5.10 → querysource-4.5.12}/.claude/commands/sdd-tojira.md +0 -0
  56. {querysource-4.5.10 → querysource-4.5.12}/.claude/rules/aws-cost-optimization.md +0 -0
  57. {querysource-4.5.10 → querysource-4.5.12}/.claude/rules/code-reviewer.md +0 -0
  58. {querysource-4.5.10 → querysource-4.5.12}/.claude/rules/cython-development.md +0 -0
  59. {querysource-4.5.10 → querysource-4.5.12}/.claude/rules/python-development.md +0 -0
  60. {querysource-4.5.10 → querysource-4.5.12}/.claude/rules/rust-development.md +0 -0
  61. {querysource-4.5.10 → querysource-4.5.12}/.claude/rules/using-git-worktrees.md +0 -0
  62. {querysource-4.5.10 → querysource-4.5.12}/.claude/rules/worktree-pr-and-clean.md +0 -0
  63. {querysource-4.5.10 → querysource-4.5.12}/.claude/rules/worktree-start-feature.md +0 -0
  64. {querysource-4.5.10 → querysource-4.5.12}/.claude/rules/worktree-status.md +0 -0
  65. {querysource-4.5.10 → querysource-4.5.12}/.github/dependabot.yml +0 -0
  66. {querysource-4.5.10 → querysource-4.5.12}/.github/workflows/codeql-analysis.yml +0 -0
  67. {querysource-4.5.10 → querysource-4.5.12}/.github/workflows/release.yml +0 -0
  68. {querysource-4.5.10 → querysource-4.5.12}/.isort.cfg +0 -0
  69. {querysource-4.5.10 → querysource-4.5.12}/.jupyter/jupyter_notebook_config.py +0 -0
  70. {querysource-4.5.10 → querysource-4.5.12}/.pre-commit-config.yaml +0 -0
  71. {querysource-4.5.10 → querysource-4.5.12}/.pylintrc +0 -0
  72. {querysource-4.5.10 → querysource-4.5.12}/CHANGES.rst +0 -0
  73. {querysource-4.5.10 → querysource-4.5.12}/CODE_OF_CONDUCT.md +0 -0
  74. {querysource-4.5.10 → querysource-4.5.12}/CONTRIBUTING.md +0 -0
  75. {querysource-4.5.10 → querysource-4.5.12}/INSTALL +0 -0
  76. {querysource-4.5.10 → querysource-4.5.12}/JOIN_CONDITIONS_FEATURE.md +0 -0
  77. {querysource-4.5.10 → querysource-4.5.12}/JOIN_CONDITIONS_SUMMARY.md +0 -0
  78. {querysource-4.5.10 → querysource-4.5.12}/LICENSE +0 -0
  79. {querysource-4.5.10 → querysource-4.5.12}/MANIFEST.in +0 -0
  80. {querysource-4.5.10 → querysource-4.5.12}/README.md +0 -0
  81. {querysource-4.5.10 → querysource-4.5.12}/app.py +0 -0
  82. {querysource-4.5.10 → querysource-4.5.12}/bin/README.md +0 -0
  83. {querysource-4.5.10 → querysource-4.5.12}/conftest.py +0 -0
  84. {querysource-4.5.10 → querysource-4.5.12}/generated/AirtableSource.json +0 -0
  85. {querysource-4.5.10 → querysource-4.5.12}/generated/Concat.json +0 -0
  86. {querysource-4.5.10 → querysource-4.5.12}/generated/DWHDestination.json +0 -0
  87. {querysource-4.5.10 → querysource-4.5.12}/generated/DropCols.json +0 -0
  88. {querysource-4.5.10 → querysource-4.5.12}/generated/FileSource.json +0 -0
  89. {querysource-4.5.10 → querysource-4.5.12}/generated/Filter.json +0 -0
  90. {querysource-4.5.10 → querysource-4.5.12}/generated/FilterCols.json +0 -0
  91. {querysource-4.5.10 → querysource-4.5.12}/generated/Forecast.json +0 -0
  92. {querysource-4.5.10 → querysource-4.5.12}/generated/GoogleMaps.json +0 -0
  93. {querysource-4.5.10 → querysource-4.5.12}/generated/GroupBy.json +0 -0
  94. {querysource-4.5.10 → querysource-4.5.12}/generated/Info.json +0 -0
  95. {querysource-4.5.10 → querysource-4.5.12}/generated/Join.json +0 -0
  96. {querysource-4.5.10 → querysource-4.5.12}/generated/Map.json +0 -0
  97. {querysource-4.5.10 → querysource-4.5.12}/generated/Melt.json +0 -0
  98. {querysource-4.5.10 → querysource-4.5.12}/generated/Merge.json +0 -0
  99. {querysource-4.5.10 → querysource-4.5.12}/generated/NormalizeColumns.json +0 -0
  100. {querysource-4.5.10 → querysource-4.5.12}/generated/PluckCols.json +0 -0
  101. {querysource-4.5.10 → querysource-4.5.12}/generated/Query.json +0 -0
  102. {querysource-4.5.10 → querysource-4.5.12}/generated/S3Source.json +0 -0
  103. {querysource-4.5.10 → querysource-4.5.12}/generated/SharepointSource.json +0 -0
  104. {querysource-4.5.10 → querysource-4.5.12}/generated/SmartSheetSource.json +0 -0
  105. {querysource-4.5.10 → querysource-4.5.12}/generated/Table.json +0 -0
  106. {querysource-4.5.10 → querysource-4.5.12}/generated/TableDestination.json +0 -0
  107. {querysource-4.5.10 → querysource-4.5.12}/generated/TableOutput.json +0 -0
  108. {querysource-4.5.10 → querysource-4.5.12}/generated/TableOutputAdapter.json +0 -0
  109. {querysource-4.5.10 → querysource-4.5.12}/generated/TableSource.json +0 -0
  110. {querysource-4.5.10 → querysource-4.5.12}/generated/ToS3.json +0 -0
  111. {querysource-4.5.10 → querysource-4.5.12}/generated/ToSharepoint.json +0 -0
  112. {querysource-4.5.10 → querysource-4.5.12}/generated/correlation.json +0 -0
  113. {querysource-4.5.10 → querysource-4.5.12}/generated/crosstab.json +0 -0
  114. {querysource-4.5.10 → querysource-4.5.12}/generated/pivot.json +0 -0
  115. {querysource-4.5.10 → querysource-4.5.12}/generated/tExplode.json +0 -0
  116. {querysource-4.5.10 → querysource-4.5.12}/generated/tOrder.json +0 -0
  117. {querysource-4.5.10 → querysource-4.5.12}/generated/tPandas.json +0 -0
  118. {querysource-4.5.10 → querysource-4.5.12}/gunicorn_config.py +0 -0
  119. {querysource-4.5.10 → querysource-4.5.12}/mypy.ini +0 -0
  120. {querysource-4.5.10 → querysource-4.5.12}/nav.py +0 -0
  121. {querysource-4.5.10 → querysource-4.5.12}/policies/HARDENING.md +0 -0
  122. {querysource-4.5.10 → querysource-4.5.12}/policies/authorized.yaml +0 -0
  123. {querysource-4.5.10 → querysource-4.5.12}/policies/baseline.yaml +0 -0
  124. {querysource-4.5.10 → querysource-4.5.12}/policies/datasources.yaml +0 -0
  125. {querysource-4.5.10 → querysource-4.5.12}/policies/defaults.yaml +0 -0
  126. {querysource-4.5.10 → querysource-4.5.12}/policies/drivers.yaml +0 -0
  127. {querysource-4.5.10 → querysource-4.5.12}/policies/raw_queries.yaml +0 -0
  128. {querysource-4.5.10 → querysource-4.5.12}/policies/slugs.yaml +0 -0
  129. {querysource-4.5.10 → querysource-4.5.12}/policies/superusers.yaml +0 -0
  130. {querysource-4.5.10 → querysource-4.5.12}/pytest.ini +0 -0
  131. {querysource-4.5.10 → querysource-4.5.12}/querysource/__cli__.py +0 -0
  132. {querysource-4.5.10 → querysource-4.5.12}/querysource/__init__.py +0 -0
  133. {querysource-4.5.10 → querysource-4.5.12}/querysource/auth/__init__.py +0 -0
  134. {querysource-4.5.10 → querysource-4.5.12}/querysource/auth/_resource_types.py +0 -0
  135. {querysource-4.5.10 → querysource-4.5.12}/querysource/auth/credentials.py +0 -0
  136. {querysource-4.5.10 → querysource-4.5.12}/querysource/auth/pbac.py +0 -0
  137. {querysource-4.5.10 → querysource-4.5.12}/querysource/cache/__init__.py +0 -0
  138. {querysource-4.5.10 → querysource-4.5.12}/querysource/cache/backends/__init__.py +0 -0
  139. {querysource-4.5.10 → querysource-4.5.12}/querysource/cache/backends/abstract.py +0 -0
  140. {querysource-4.5.10 → querysource-4.5.12}/querysource/cache/backends/memcache.py +0 -0
  141. {querysource-4.5.10 → querysource-4.5.12}/querysource/cache/backends/redis.py +0 -0
  142. {querysource-4.5.10 → querysource-4.5.12}/querysource/cache/base.py +0 -0
  143. {querysource-4.5.10 → querysource-4.5.12}/querysource/cli/__init__.py +0 -0
  144. {querysource-4.5.10 → querysource-4.5.12}/querysource/cli/generate_docs.py +0 -0
  145. {querysource-4.5.10 → querysource-4.5.12}/querysource/conf.py +0 -0
  146. {querysource-4.5.10 → querysource-4.5.12}/querysource/connections.py +0 -0
  147. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/__init__.py +0 -0
  148. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/__init__.py +0 -0
  149. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/abstract.py +0 -0
  150. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/arangodb.py +0 -0
  151. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/athena.py +0 -0
  152. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/bigquery.py +0 -0
  153. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/cassandra.py +0 -0
  154. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/clickhouse.py +0 -0
  155. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/cockroachdb.py +0 -0
  156. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/couchbase.py +0 -0
  157. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/couchdb.py +0 -0
  158. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/countries.py +0 -0
  159. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/delta.py +0 -0
  160. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/documentdb.py +0 -0
  161. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/dynamodb.py +0 -0
  162. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/elastic.py +0 -0
  163. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/ga.py +0 -0
  164. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/gcalc.py +0 -0
  165. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/hazel.py +0 -0
  166. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/iceberg.py +0 -0
  167. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/influx.py +0 -0
  168. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/jdbc.py +0 -0
  169. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/jira.py +0 -0
  170. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/mariadb.py +0 -0
  171. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/memcached.py +0 -0
  172. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/mongo.py +0 -0
  173. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/mysql.py +0 -0
  174. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/odbc.py +0 -0
  175. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/openweather.py +0 -0
  176. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/oracle.py +0 -0
  177. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/pg.py +0 -0
  178. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/pg_admin.py +0 -0
  179. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/postgres.py +0 -0
  180. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/py.typed +0 -0
  181. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/qs.py +0 -0
  182. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/redis.py +0 -0
  183. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/rest.py +0 -0
  184. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/rethink.py +0 -0
  185. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/sa.py +0 -0
  186. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/salesforce.py +0 -0
  187. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/scylladb.py +0 -0
  188. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/sqlalchemy.py +0 -0
  189. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/sqlite.py +0 -0
  190. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/sqlserver.py +0 -0
  191. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/upc.py +0 -0
  192. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/drivers/zipcodeapi.py +0 -0
  193. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/handlers/__init__.py +0 -0
  194. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/handlers/datasource.py +0 -0
  195. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/handlers/utils.py +0 -0
  196. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/introspection.py +0 -0
  197. {querysource-4.5.10 → querysource-4.5.12}/querysource/datasources/models.py +0 -0
  198. {querysource-4.5.10 → querysource-4.5.12}/querysource/events/__init__.py +0 -0
  199. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/__init__.py +0 -0
  200. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/_pagination.py +0 -0
  201. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/components.py +0 -0
  202. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/executor.py +0 -0
  203. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/integrations/__init__.py +0 -0
  204. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/integrations/airtable.py +0 -0
  205. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/log.py +0 -0
  206. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/manager.py +0 -0
  207. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/outputs/__init__.py +0 -0
  208. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/outputs/tableOutput/__init__.py +0 -0
  209. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/outputs/tableOutput/postgres.py +0 -0
  210. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/outputs/tableOutput/table.py +0 -0
  211. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/scheduler.py +0 -0
  212. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/service.py +0 -0
  213. {querysource-4.5.10 → querysource-4.5.12}/querysource/handlers/variables.py +0 -0
  214. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/__init__.py +0 -0
  215. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/airtable.py +0 -0
  216. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/connections.py +0 -0
  217. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/credentials.py +0 -0
  218. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/databases/__init__.py +0 -0
  219. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/databases/abstract.py +0 -0
  220. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/databases/bigquery.py +0 -0
  221. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/databases/db.py +0 -0
  222. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/databases/mongo.py +0 -0
  223. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/databases/rethink.py +0 -0
  224. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/http.py +0 -0
  225. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/playwright_service.py +0 -0
  226. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/queries.py +0 -0
  227. {querysource-4.5.10 → querysource-4.5.12}/querysource/interfaces/selenium_service.py +0 -0
  228. {querysource-4.5.10 → querysource-4.5.12}/querysource/libs/__init__.py +0 -0
  229. {querysource-4.5.10 → querysource-4.5.12}/querysource/libs/encoders.py +0 -0
  230. {querysource-4.5.10 → querysource-4.5.12}/querysource/libs/functions/__init__.py +0 -0
  231. {querysource-4.5.10 → querysource-4.5.12}/querysource/libs/py.typed +0 -0
  232. {querysource-4.5.10 → querysource-4.5.12}/querysource/models.py +0 -0
  233. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/__init__.py +0 -0
  234. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/destinations/__init__.py +0 -0
  235. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/destinations/abstract.py +0 -0
  236. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/destinations/dwh.py +0 -0
  237. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/destinations/s3.py +0 -0
  238. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/destinations/sharepoint.py +0 -0
  239. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/destinations/table.py +0 -0
  240. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/dt/__init__.py +0 -0
  241. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/dt/abstract.py +0 -0
  242. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/dt/arrow.py +0 -0
  243. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/dt/dt.py +0 -0
  244. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/dt/factory.py +0 -0
  245. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/dt/iter.py +0 -0
  246. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/dt/modin.py +0 -0
  247. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/dt/pandas.py +0 -0
  248. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/dt/polars.py +0 -0
  249. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/output.py +0 -0
  250. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/__init__.py +0 -0
  251. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/abstract.py +0 -0
  252. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/bigquery.py +0 -0
  253. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/documentdb.py +0 -0
  254. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/mongodb.py +0 -0
  255. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/mysql.py +0 -0
  256. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/postgres.py +0 -0
  257. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/rethink.py +0 -0
  258. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/sa.py +0 -0
  259. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/TableOutput/table.py +0 -0
  260. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/tables/__init__.py +0 -0
  261. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/__init__.py +0 -0
  262. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/abstract.py +0 -0
  263. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/bokeh.py +0 -0
  264. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/clustering.py +0 -0
  265. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/csv.py +0 -0
  266. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/describe.py +0 -0
  267. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/eda.py +0 -0
  268. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/excel.py +0 -0
  269. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/html.py +0 -0
  270. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/json.py +0 -0
  271. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/pdf.py +0 -0
  272. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/pickle.py +0 -0
  273. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/plotly.py +0 -0
  274. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/profiling.py +0 -0
  275. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/report.py +0 -0
  276. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/table.py +0 -0
  277. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/tsv.py +0 -0
  278. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/txt.py +0 -0
  279. {querysource-4.5.10 → querysource-4.5.12}/querysource/outputs/writers/xml.py +0 -0
  280. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/__init__.py +0 -0
  281. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/abstract.c +0 -0
  282. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/abstract.pxd +0 -0
  283. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/abstract.pyx +0 -0
  284. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/arangodb.c +0 -0
  285. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/arangodb.pxd +0 -0
  286. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/arangodb.pyx +0 -0
  287. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/bigquery.c +0 -0
  288. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/bigquery.pxd +0 -0
  289. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/bigquery.pyx +0 -0
  290. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/cql.c +0 -0
  291. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/cql.pxd +0 -0
  292. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/cql.pyx +0 -0
  293. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/deltatbl.c +0 -0
  294. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/deltatbl.pxd +0 -0
  295. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/deltatbl.pyx +0 -0
  296. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/elastic.cpp +0 -0
  297. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/elastic.pxd +0 -0
  298. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/elastic.pyx +0 -0
  299. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/iceberg.c +0 -0
  300. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/iceberg.pxd +0 -0
  301. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/iceberg.pyx +0 -0
  302. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/influx.c +0 -0
  303. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/influx.pxd +0 -0
  304. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/influx.pyx +0 -0
  305. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/mongo.cpp +0 -0
  306. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/mongo.pxd +0 -0
  307. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/mongo.pyx +0 -0
  308. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/parser.c +0 -0
  309. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/parser.pxd +0 -0
  310. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/parser.pyx +0 -0
  311. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/pgsql.c +0 -0
  312. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/pgsql.pxd +0 -0
  313. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/pgsql.pyx +0 -0
  314. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/rethink.c +0 -0
  315. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/rethink.pxd +0 -0
  316. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/rethink.pyx +0 -0
  317. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/sosql.c +0 -0
  318. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/sosql.pxd +0 -0
  319. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/sosql.pyx +0 -0
  320. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/sql.c +0 -0
  321. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/sql.pxd +0 -0
  322. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/sql.pyx +0 -0
  323. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/sqlserver.c +0 -0
  324. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/sqlserver.pxd +0 -0
  325. {querysource-4.5.10 → querysource-4.5.12}/querysource/parsers/sqlserver.pyx +0 -0
  326. {querysource-4.5.10 → querysource-4.5.12}/querysource/plugins/__init__.py +0 -0
  327. {querysource-4.5.10 → querysource-4.5.12}/querysource/plugins/importer.py +0 -0
  328. {querysource-4.5.10 → querysource-4.5.12}/querysource/plugins/sources/__init__.py +0 -0
  329. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/__init__.py +0 -0
  330. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/abstract.py +0 -0
  331. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/arangodb.py +0 -0
  332. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/bigquery.py +0 -0
  333. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/cassandra.py +0 -0
  334. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/db.py +0 -0
  335. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/default.py +0 -0
  336. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/deltatbl.py +0 -0
  337. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/documentdb.py +0 -0
  338. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/dummy.py +0 -0
  339. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/elastic.py +0 -0
  340. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/external.py +0 -0
  341. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/http.py +0 -0
  342. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/iceberg.py +0 -0
  343. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/influx.py +0 -0
  344. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/mysql.py +0 -0
  345. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/pg.py +0 -0
  346. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/py.typed +0 -0
  347. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/rest.py +0 -0
  348. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/rethink.py +0 -0
  349. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/salesforce.py +0 -0
  350. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/scylladb.py +0 -0
  351. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/__init__.py +0 -0
  352. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/abstract.py +0 -0
  353. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/amazon.py +0 -0
  354. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/countries.py +0 -0
  355. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/ga.py +0 -0
  356. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/geofcc.py +0 -0
  357. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/gmaps.py +0 -0
  358. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/graphcountries.py +0 -0
  359. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/graphql.py +0 -0
  360. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/http.py +0 -0
  361. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/hubspot.py +0 -0
  362. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/openweather.py +0 -0
  363. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/parsers/__init__.py +0 -0
  364. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/parsers/amproduct.py +0 -0
  365. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/parsers/xpath.py +0 -0
  366. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/pokemon.py +0 -0
  367. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/populartimes.py +0 -0
  368. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/py.typed +0 -0
  369. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/rest.py +0 -0
  370. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/retailnext.py +0 -0
  371. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/rssapp.py +0 -0
  372. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/salesforce.py +0 -0
  373. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/scrapper.py +0 -0
  374. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/shoppertrack.py +0 -0
  375. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/swop.py +0 -0
  376. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/uap.py +0 -0
  377. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/upc.py +0 -0
  378. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/wm_stores.py +0 -0
  379. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/zammad.py +0 -0
  380. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sources/zipcodeapi.py +0 -0
  381. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sql.py +0 -0
  382. {querysource-4.5.10 → querysource-4.5.12}/querysource/providers/sqlserver.py +0 -0
  383. {querysource-4.5.10 → querysource-4.5.12}/querysource/py.typed +0 -0
  384. {querysource-4.5.10 → querysource-4.5.12}/querysource/qs_parsers/__init__.py +0 -0
  385. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/__init__.py +0 -0
  386. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/base.py +0 -0
  387. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/executor.py +0 -0
  388. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/models.py +0 -0
  389. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/_introspect.py +0 -0
  390. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/abstract.py +0 -0
  391. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/components/__init__.py +0 -0
  392. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/components/abstract.py +0 -0
  393. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/destinations/__init__.py +0 -0
  394. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/destinations/dwh.py +0 -0
  395. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/destinations/s3.py +0 -0
  396. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/destinations/sharepoint.py +0 -0
  397. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/destinations/table.py +0 -0
  398. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/Concat.py +0 -0
  399. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/GroupBy.catalog.yaml +0 -0
  400. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/GroupBy.py +0 -0
  401. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/Info.py +0 -0
  402. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/Join.catalog.yaml +0 -0
  403. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/Join.py +0 -0
  404. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/Melt.catalog.yaml +0 -0
  405. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/Melt.py +0 -0
  406. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/Merge.catalog.yaml +0 -0
  407. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/Merge.py +0 -0
  408. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/__init__.py +0 -0
  409. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/abstract.py +0 -0
  410. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/filter/Filter.catalog.yaml +0 -0
  411. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/filter/__init__.py +0 -0
  412. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/operators/filter/flt.py +0 -0
  413. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/registry.py +0 -0
  414. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/__init__.py +0 -0
  415. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/airtable.py +0 -0
  416. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/base.py +0 -0
  417. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/executors.py +0 -0
  418. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/file.py +0 -0
  419. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/query.catalog.yaml +0 -0
  420. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/query.py +0 -0
  421. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/s3.py +0 -0
  422. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/sharepoint.py +0 -0
  423. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/smartsheet.py +0 -0
  424. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/sources/table.py +0 -0
  425. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/DropCols.catalog.yaml +0 -0
  426. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/DropCols.py +0 -0
  427. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/FilterCols.catalog.yaml +0 -0
  428. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/FilterCols.py +0 -0
  429. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/Forecast.catalog.yaml +0 -0
  430. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/Forecast.py +0 -0
  431. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/Map.catalog.yaml +0 -0
  432. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/Map.py +0 -0
  433. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/NormalizeColumns.catalog.yaml +0 -0
  434. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/NormalizeColumns.py +0 -0
  435. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/PluckCols.catalog.yaml +0 -0
  436. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/PluckCols.py +0 -0
  437. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/__init__.py +0 -0
  438. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/abstract.py +0 -0
  439. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/correlation.catalog.yaml +0 -0
  440. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/correlation.py +0 -0
  441. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/crosstab.catalog.yaml +0 -0
  442. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/crosstab.py +0 -0
  443. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/google/GoogleMaps.catalog.yaml +0 -0
  444. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/google/__init__.py +0 -0
  445. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/google/maps.py +0 -0
  446. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/pivot.catalog.yaml +0 -0
  447. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/pivot.py +0 -0
  448. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/tExplode.catalog.yaml +0 -0
  449. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/tExplode.py +0 -0
  450. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/tOrder.catalog.yaml +0 -0
  451. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/tOrder.py +0 -0
  452. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/multi/transformations/tPandas.py +0 -0
  453. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/obj.py +0 -0
  454. {querysource-4.5.10 → querysource-4.5.12}/querysource/queries/qs.py +0 -0
  455. {querysource-4.5.10 → querysource-4.5.12}/querysource/scheduler/__init__.py +0 -0
  456. {querysource-4.5.10 → querysource-4.5.12}/querysource/scheduler/jobs.py +0 -0
  457. {querysource-4.5.10 → querysource-4.5.12}/querysource/scheduler/notifications.py +0 -0
  458. {querysource-4.5.10 → querysource-4.5.12}/querysource/scheduler/scheduler.py +0 -0
  459. {querysource-4.5.10 → querysource-4.5.12}/querysource/services.py +0 -0
  460. {querysource-4.5.10 → querysource-4.5.12}/querysource/template/__init__.py +0 -0
  461. {querysource-4.5.10 → querysource-4.5.12}/querysource/template/parser.py +0 -0
  462. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/__init__.py +0 -0
  463. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/converters.cpp +0 -0
  464. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/converters.pyx +0 -0
  465. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/dt/__init__.py +0 -0
  466. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/dt/transforms.py +0 -0
  467. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/py.typed +0 -0
  468. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/typedefs.c +0 -0
  469. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/typedefs.pyx +0 -0
  470. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/validators.cpp +0 -0
  471. {querysource-4.5.10 → querysource-4.5.12}/querysource/types/validators.pyx +0 -0
  472. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/__init__.py +0 -0
  473. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/cache_serialization.py +0 -0
  474. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/events.py +0 -0
  475. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/fn.py +0 -0
  476. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/functions.cpp +0 -0
  477. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/functions.pyx +0 -0
  478. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/getfunc.py +0 -0
  479. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/handlers.py +0 -0
  480. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/parseqs.cpp +0 -0
  481. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/parseqs.pyx +0 -0
  482. {querysource-4.5.10 → querysource-4.5.12}/querysource/utils/validators.py +0 -0
  483. {querysource-4.5.10 → querysource-4.5.12}/querysource.egg-info/dependency_links.txt +0 -0
  484. {querysource-4.5.10 → querysource-4.5.12}/querysource.egg-info/entry_points.txt +0 -0
  485. {querysource-4.5.10 → querysource-4.5.12}/querysource.egg-info/not-zip-safe +0 -0
  486. {querysource-4.5.10 → querysource-4.5.12}/querysource.egg-info/top_level.txt +0 -0
  487. {querysource-4.5.10 → querysource-4.5.12}/run.py +0 -0
  488. {querysource-4.5.10 → querysource-4.5.12}/rust/Cargo.lock +0 -0
  489. {querysource-4.5.10 → querysource-4.5.12}/rust/Cargo.toml +0 -0
  490. {querysource-4.5.10 → querysource-4.5.12}/rust/pyproject.toml +0 -0
  491. {querysource-4.5.10 → querysource-4.5.12}/rust/src/arangodb_parser.rs +0 -0
  492. {querysource-4.5.10 → querysource-4.5.12}/rust/src/bigquery_parser.rs +0 -0
  493. {querysource-4.5.10 → querysource-4.5.12}/rust/src/cql_parser.rs +0 -0
  494. {querysource-4.5.10 → querysource-4.5.12}/rust/src/elastic_parser.rs +0 -0
  495. {querysource-4.5.10 → querysource-4.5.12}/rust/src/filter_common.rs +0 -0
  496. {querysource-4.5.10 → querysource-4.5.12}/rust/src/flux_parser.rs +0 -0
  497. {querysource-4.5.10 → querysource-4.5.12}/rust/src/lib.rs +0 -0
  498. {querysource-4.5.10 → querysource-4.5.12}/rust/src/mongo_parser.rs +0 -0
  499. {querysource-4.5.10 → querysource-4.5.12}/rust/src/mssql_parser.rs +0 -0
  500. {querysource-4.5.10 → querysource-4.5.12}/rust/src/parseqs.rs +0 -0
  501. {querysource-4.5.10 → querysource-4.5.12}/rust/src/pgsql_parser.rs +0 -0
  502. {querysource-4.5.10 → querysource-4.5.12}/rust/src/rethink_parser.rs +0 -0
  503. {querysource-4.5.10 → querysource-4.5.12}/rust/src/safe_dict.rs +0 -0
  504. {querysource-4.5.10 → querysource-4.5.12}/rust/src/soql_parser.rs +0 -0
  505. {querysource-4.5.10 → querysource-4.5.12}/rust/src/sql_parser.rs +0 -0
  506. {querysource-4.5.10 → querysource-4.5.12}/rust/src/validators.rs +0 -0
  507. {querysource-4.5.10 → querysource-4.5.12}/setup.cfg +0 -0
  508. {querysource-4.5.10 → querysource-4.5.12}/setup.py +0 -0
  509. {querysource-4.5.10 → querysource-4.5.12}/static/notebook/bundle.js +0 -0
  510. {querysource-4.5.10 → querysource-4.5.12}/templates/__init__.py +0 -0
  511. {querysource-4.5.10 → querysource-4.5.12}/templates/base.html +0 -0
  512. {querysource-4.5.10 → querysource-4.5.12}/templates/default.html +0 -0
  513. {querysource-4.5.10 → querysource-4.5.12}/templates/default_table.html +0 -0
  514. {querysource-4.5.10 → querysource-4.5.12}/templates/fontlist-v330.json +0 -0
  515. {querysource-4.5.10 → querysource-4.5.12}/templates/fontlist-v390.json +0 -0
  516. {querysource-4.5.10 → querysource-4.5.12}/templates/table_charts.html +0 -0
  517. {querysource-4.5.10 → querysource-4.5.12}/tests/auth/__init__.py +0 -0
  518. {querysource-4.5.10 → querysource-4.5.12}/tests/auth/test_credentials.py +0 -0
  519. {querysource-4.5.10 → querysource-4.5.12}/tests/auth/test_pbac_bootstrap.py +0 -0
  520. {querysource-4.5.10 → querysource-4.5.12}/tests/check_concurrent_get_slug.py +0 -0
  521. {querysource-4.5.10 → querysource-4.5.12}/tests/conftest.py +0 -0
  522. {querysource-4.5.10 → querysource-4.5.12}/tests/datasources/__init__.py +0 -0
  523. {querysource-4.5.10 → querysource-4.5.12}/tests/datasources/test_datasource_view_pbac.py +0 -0
  524. {querysource-4.5.10 → querysource-4.5.12}/tests/datasources/test_driver_factory_session.py +0 -0
  525. {querysource-4.5.10 → querysource-4.5.12}/tests/datasources/test_pg_admin_registration.py +0 -0
  526. {querysource-4.5.10 → querysource-4.5.12}/tests/datasources/test_pg_params_for.py +0 -0
  527. {querysource-4.5.10 → querysource-4.5.12}/tests/handlers/__init__.py +0 -0
  528. {querysource-4.5.10 → querysource-4.5.12}/tests/handlers/conftest.py +0 -0
  529. {querysource-4.5.10 → querysource-4.5.12}/tests/handlers/test_abstract_pbac_helpers.py +0 -0
  530. {querysource-4.5.10 → querysource-4.5.12}/tests/handlers/test_airtable_oauth.py +0 -0
  531. {querysource-4.5.10 → querysource-4.5.12}/tests/handlers/test_multiquery_pbac_smoke.py +0 -0
  532. {querysource-4.5.10 → querysource-4.5.12}/tests/handlers/test_query_param_exclusion.py +0 -0
  533. {querysource-4.5.10 → querysource-4.5.12}/tests/handlers/test_queryexecutor_pbac_smoke.py +0 -0
  534. {querysource-4.5.10 → querysource-4.5.12}/tests/handlers/test_querymanager_pagination.py +0 -0
  535. {querysource-4.5.10 → querysource-4.5.12}/tests/handlers/test_queryservice_pbac_smoke.py +0 -0
  536. {querysource-4.5.10 → querysource-4.5.12}/tests/integration/__init__.py +0 -0
  537. {querysource-4.5.10 → querysource-4.5.12}/tests/integration/test_datasource_endpoint.py +0 -0
  538. {querysource-4.5.10 → querysource-4.5.12}/tests/integration/test_pbac_credentials.py +0 -0
  539. {querysource-4.5.10 → querysource-4.5.12}/tests/integration/test_pbac_enforcement.py +0 -0
  540. {querysource-4.5.10 → querysource-4.5.12}/tests/integration/test_pbac_listing.py +0 -0
  541. {querysource-4.5.10 → querysource-4.5.12}/tests/integration/test_slug_injection.py +0 -0
  542. {querysource-4.5.10 → querysource-4.5.12}/tests/integration/test_slug_regression.py +0 -0
  543. {querysource-4.5.10 → querysource-4.5.12}/tests/interfaces/__init__.py +0 -0
  544. {querysource-4.5.10 → querysource-4.5.12}/tests/interfaces/test_airtable_interface.py +0 -0
  545. {querysource-4.5.10 → querysource-4.5.12}/tests/multi/__init__.py +0 -0
  546. {querysource-4.5.10 → querysource-4.5.12}/tests/multi/sources/__init__.py +0 -0
  547. {querysource-4.5.10 → querysource-4.5.12}/tests/multi/sources/test_airtable_source.py +0 -0
  548. {querysource-4.5.10 → querysource-4.5.12}/tests/multi/sources/test_registry.py +0 -0
  549. {querysource-4.5.10 → querysource-4.5.12}/tests/perf/__init__.py +0 -0
  550. {querysource-4.5.10 → querysource-4.5.12}/tests/perf/test_pbac_overhead.py +0 -0
  551. {querysource-4.5.10 → querysource-4.5.12}/tests/policies/__init__.py +0 -0
  552. {querysource-4.5.10 → querysource-4.5.12}/tests/policies/test_authorized_policy.py +0 -0
  553. {querysource-4.5.10 → querysource-4.5.12}/tests/policies/test_default_policies_load.py +0 -0
  554. {querysource-4.5.10 → querysource-4.5.12}/tests/scheduler/__init__.py +0 -0
  555. {querysource-4.5.10 → querysource-4.5.12}/tests/scheduler/test_parse_trigger_shorthands.py +0 -0
  556. {querysource-4.5.10 → querysource-4.5.12}/tests/scheduler/test_shorthand_loaders.py +0 -0
  557. {querysource-4.5.10 → querysource-4.5.12}/tests/services/__init__.py +0 -0
  558. {querysource-4.5.10 → querysource-4.5.12}/tests/services/test_querysource_setup_pbac.py +0 -0
  559. {querysource-4.5.10 → querysource-4.5.12}/tests/test_abstract_multi.py +0 -0
  560. {querysource-4.5.10 → querysource-4.5.12}/tests/test_abstract_refactor.py +0 -0
  561. {querysource-4.5.10 → querysource-4.5.12}/tests/test_api.py +0 -0
  562. {querysource-4.5.10 → querysource-4.5.12}/tests/test_arangodb_parser.py +0 -0
  563. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_colcols.py +0 -0
  564. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_correlation.py +0 -0
  565. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_filter.py +0 -0
  566. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_forecast.py +0 -0
  567. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_googlemaps.py +0 -0
  568. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_groupby.py +0 -0
  569. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_map.py +0 -0
  570. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_pivot.py +0 -0
  571. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_remote.py +0 -0
  572. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_texplode.py +0 -0
  573. {querysource-4.5.10 → querysource-4.5.12}/tests/test_catalog_torder.py +0 -0
  574. {querysource-4.5.10 → querysource-4.5.12}/tests/test_cli_generate_docs.py +0 -0
  575. {querysource-4.5.10 → querysource-4.5.12}/tests/test_column_filters.py +0 -0
  576. {querysource-4.5.10 → querysource-4.5.12}/tests/test_component_handler.py +0 -0
  577. {querysource-4.5.10 → querysource-4.5.12}/tests/test_component_registry.py +0 -0
  578. {querysource-4.5.10 → querysource-4.5.12}/tests/test_conf_airtable.py +0 -0
  579. {querysource-4.5.10 → querysource-4.5.12}/tests/test_destination_base.py +0 -0
  580. {querysource-4.5.10 → querysource-4.5.12}/tests/test_destination_dwh.py +0 -0
  581. {querysource-4.5.10 → querysource-4.5.12}/tests/test_destination_integration.py +0 -0
  582. {querysource-4.5.10 → querysource-4.5.12}/tests/test_destination_s3.py +0 -0
  583. {querysource-4.5.10 → querysource-4.5.12}/tests/test_destination_sharepoint.py +0 -0
  584. {querysource-4.5.10 → querysource-4.5.12}/tests/test_destination_table.py +0 -0
  585. {querysource-4.5.10 → querysource-4.5.12}/tests/test_destinations_documentation_endpoint.py +0 -0
  586. {querysource-4.5.10 → querysource-4.5.12}/tests/test_elastic_parser.py +0 -0
  587. {querysource-4.5.10 → querysource-4.5.12}/tests/test_error_formatter.py +0 -0
  588. {querysource-4.5.10 → querysource-4.5.12}/tests/test_eval.py +0 -0
  589. {querysource-4.5.10 → querysource-4.5.12}/tests/test_feat102_error_redaction.py +0 -0
  590. {querysource-4.5.10 → querysource-4.5.12}/tests/test_grouping_sync.py +0 -0
  591. {querysource-4.5.10 → querysource-4.5.12}/tests/test_info_eda.py +0 -0
  592. {querysource-4.5.10 → querysource-4.5.12}/tests/test_info_eda_e2e.py +0 -0
  593. {querysource-4.5.10 → querysource-4.5.12}/tests/test_info_eda_integration.py +0 -0
  594. {querysource-4.5.10 → querysource-4.5.12}/tests/test_join_conditions.py +0 -0
  595. {querysource-4.5.10 → querysource-4.5.12}/tests/test_join_with_column_filter.py +0 -0
  596. {querysource-4.5.10 → querysource-4.5.12}/tests/test_local_executor.py +0 -0
  597. {querysource-4.5.10 → querysource-4.5.12}/tests/test_multi_destinations_subpackage.py +0 -0
  598. {querysource-4.5.10 → querysource-4.5.12}/tests/test_multiqs_column_transforms.py +0 -0
  599. {querysource-4.5.10 → querysource-4.5.12}/tests/test_multiqs_destination_dispatch.py +0 -0
  600. {querysource-4.5.10 → querysource-4.5.12}/tests/test_multiqs_remote_dispatch.py +0 -0
  601. {querysource-4.5.10 → querysource-4.5.12}/tests/test_multiqs_sources_integration.py +0 -0
  602. {querysource-4.5.10 → querysource-4.5.12}/tests/test_queryslug_concurrency.py +0 -0
  603. {querysource-4.5.10 → querysource-4.5.12}/tests/test_querysource_setup_airtable.py +0 -0
  604. {querysource-4.5.10 → querysource-4.5.12}/tests/test_qworker_config.py +0 -0
  605. {querysource-4.5.10 → querysource-4.5.12}/tests/test_remote_executor.py +0 -0
  606. {querysource-4.5.10 → querysource-4.5.12}/tests/test_route_registration.py +0 -0
  607. {querysource-4.5.10 → querysource-4.5.12}/tests/test_rss.py +0 -0
  608. {querysource-4.5.10 → querysource-4.5.12}/tests/test_rust_parsers.py +0 -0
  609. {querysource-4.5.10 → querysource-4.5.12}/tests/test_scheduler_core.py +0 -0
  610. {querysource-4.5.10 → querysource-4.5.12}/tests/test_scheduler_handler_integration.py +0 -0
  611. {querysource-4.5.10 → querysource-4.5.12}/tests/test_scheduler_handler_unit.py +0 -0
  612. {querysource-4.5.10 → querysource-4.5.12}/tests/test_scheduler_integration.py +0 -0
  613. {querysource-4.5.10 → querysource-4.5.12}/tests/test_scheduler_jobs.py +0 -0
  614. {querysource-4.5.10 → querysource-4.5.12}/tests/test_scheduler_multi_routing.py +0 -0
  615. {querysource-4.5.10 → querysource-4.5.12}/tests/test_scheduler_notifications.py +0 -0
  616. {querysource-4.5.10 → querysource-4.5.12}/tests/test_schema_introspectable.py +0 -0
  617. {querysource-4.5.10 → querysource-4.5.12}/tests/test_source_registry.py +0 -0
  618. {querysource-4.5.10 → querysource-4.5.12}/tests/test_source_s3.py +0 -0
  619. {querysource-4.5.10 → querysource-4.5.12}/tests/test_source_sharepoint.py +0 -0
  620. {querysource-4.5.10 → querysource-4.5.12}/tests/test_source_smartsheet.py +0 -0
  621. {querysource-4.5.10 → querysource-4.5.12}/tests/test_source_table.py +0 -0
  622. {querysource-4.5.10 → querysource-4.5.12}/tests/test_sql_parser_combinations.py +0 -0
  623. {querysource-4.5.10 → querysource-4.5.12}/tests/test_texplode.py +0 -0
  624. {querysource-4.5.10 → querysource-4.5.12}/tests/test_thread_file_refactor.py +0 -0
  625. {querysource-4.5.10 → querysource-4.5.12}/tests/test_thread_query_refactor.py +0 -0
  626. {querysource-4.5.10 → querysource-4.5.12}/tests/test_thread_source_base.py +0 -0
  627. {querysource-4.5.10 → querysource-4.5.12}/tests/test_threadquery_executor.py +0 -0
  628. {querysource-4.5.10 → querysource-4.5.12}/tests/test_zammad_search.py +0 -0
  629. {querysource-4.5.10 → querysource-4.5.12}/tests/unit/test_cython_filter_fallback.py +0 -0
  630. {querysource-4.5.10 → querysource-4.5.12}/tests/unit/test_datasource_redaction.py +0 -0
  631. {querysource-4.5.10 → querysource-4.5.12}/tests/unit/test_provider_raw_query_validated.py +0 -0
  632. {querysource-4.5.10 → querysource-4.5.12}/tests/unit/test_qs_parsers_validated.py +0 -0
  633. {querysource-4.5.10 → querysource-4.5.12}/tests/unit/test_raw_query_cond_definition_wiring.py +0 -0
  634. {querysource-4.5.10 → querysource-4.5.12}/tox.ini +0 -0
@@ -10,12 +10,11 @@ PYTHON_VERSION := 3.11
10
10
  HAS_UV := $(shell command -v uv 2> /dev/null)
11
11
  HAS_PIP := $(shell command -v pip 2> /dev/null)
12
12
 
13
- # Run maturin via `uv run` so it resolves the project venv (.venv) regardless of
14
- # whether the venv is activated or on PATH. `--with maturin` ensures the tool is
15
- # available ephemerally, so no separate `uv pip install maturin` step is needed.
16
- # (Each Makefile recipe line runs in its own subshell, so installing maturin in
17
- # one line does not put it on PATH for the next.)
18
- MATURIN := uv run --with maturin maturin
13
+ # maturin is a dev dependency (pyproject.toml), so it lives in .venv/bin/.
14
+ # Run it via the venv Python so it always targets the project virtualenv.
15
+ # NOTE: `uv run --with maturin` must NOT be used — it creates an ephemeral
16
+ # environment and maturin installs the extension there instead of .venv.
17
+ MATURIN := .venv/bin/maturin
19
18
 
20
19
  # Install uv for faster workflows
21
20
  install-uv:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: querysource
3
- Version: 4.5.10
3
+ Version: 4.5.12
4
4
  Summary: Aiohttp web service for querying several databases easily
5
5
  Author-email: Jesus Lara <jesuslarag@gmail.com>
6
6
  License: BSD-3-Clause
@@ -123,6 +123,7 @@ Requires-Dist: pytest-asyncio==1.3.0; extra == "dev"
123
123
  Requires-Dist: pytest-xdist==3.3.1; extra == "dev"
124
124
  Requires-Dist: pytest-assume==2.4.3; extra == "dev"
125
125
  Requires-Dist: ruff>=0.6.0; extra == "dev"
126
+ Requires-Dist: maturin<2.0,>=1.7; extra == "dev"
126
127
  Dynamic: license-file
127
128
 
128
129
  # QuerySource #
@@ -165,7 +165,8 @@ dev = [
165
165
  "pytest-asyncio==1.3.0",
166
166
  "pytest-xdist==3.3.1",
167
167
  "pytest-assume==2.4.3",
168
- "ruff>=0.6.0"
168
+ "ruff>=0.6.0",
169
+ "maturin>=1.7,<2.0"
169
170
  ]
170
171
 
171
172
  [project.scripts]
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '4.5.11.dev0+g8016640fc.d20260723'
22
- __version_tuple__ = version_tuple = (4, 5, 11, 'dev0', 'g8016640fc.d20260723')
21
+ __version__ = version = '4.5.13.dev0+gc681e50a6.d20260825'
22
+ __version_tuple__ = version_tuple = (4, 5, 13, 'dev0', 'gc681e50a6.d20260825')
23
23
 
24
- __commit_id__ = commit_id = 'g8016640fc'
24
+ __commit_id__ = commit_id = 'gc681e50a6'
@@ -72,4 +72,24 @@ class ParserError(QueryException):
72
72
 
73
73
 
74
74
  class OutputError(QueryException):
75
- pass
75
+ """Raised when a MultiQuery Output/destination fails.
76
+
77
+ Optionally carries the failing destination ``step_name`` and an error
78
+ ``category`` (``"data"`` | ``"infra"``) so the HTTP handler layer can
79
+ pick an appropriate status code (422 vs 500). Both are backwards
80
+ compatible: existing ``OutputError(message)`` call sites keep working
81
+ unchanged.
82
+ """
83
+
84
+ def __init__(
85
+ self,
86
+ message: str = "",
87
+ code: int = 0,
88
+ *,
89
+ step_name: str = None,
90
+ category: str = None,
91
+ **kwargs,
92
+ ):
93
+ super().__init__(message, code=code, **kwargs)
94
+ self.step_name = step_name
95
+ self.category = category
@@ -154,7 +154,7 @@ class AbstractHandler(BaseHandler):
154
154
  # Map HTTP status code to a formatter category
155
155
  if code == 404:
156
156
  category = "not_found"
157
- elif code in (400, 401, 402, 403, 406, 412, 428):
157
+ elif code in (400, 401, 402, 403, 406, 412, 422, 428):
158
158
  category = "query_error"
159
159
  else:
160
160
  category = "server_error"
@@ -190,6 +190,8 @@ class AbstractHandler(BaseHandler):
190
190
  obj = web.HTTPPreconditionFailed(**args)
191
191
  elif code == 428:
192
192
  obj = web.HTTPPreconditionRequired(**args)
193
+ elif code == 422: # Unprocessable Entity (e.g. data/validation errors)
194
+ obj = web.HTTPUnprocessableEntity(**args)
193
195
  else:
194
196
  obj = web.HTTPBadRequest(**args)
195
197
  return obj
@@ -238,7 +240,12 @@ class AbstractHandler(BaseHandler):
238
240
  }
239
241
  # Only expose the raw exception string in the X-ERROR header when debug
240
242
  if self.debug and exception is not None:
241
- response_headers["X-ERROR"] = str(exception)
243
+ # HTTP header values may not contain embedded CR/LF (aiohttp
244
+ # raises on write) — FEAT-146 routes multi-line OutputError text
245
+ # through this path via Except(code=500), so collapse to a
246
+ # single line here too (same treatment as payload["error"] in
247
+ # build_error_payload and the X-Output-Errors header).
248
+ response_headers["X-ERROR"] = " ".join(str(exception).splitlines())
242
249
 
243
250
  args = {
244
251
  "reason": payload["error"],
@@ -9,10 +9,10 @@ from ..exceptions import (
9
9
  DriverError,
10
10
  QueryException,
11
11
  SlugNotFound,
12
+ OutputError,
12
13
  )
13
14
  from .abstract import AbstractHandler
14
15
  from ..queries import MultiQS
15
- from ..outputs.destinations import get_destination
16
16
  from ..queries.multi.operators import Filter, GroupBy
17
17
  from ..conf import (
18
18
  CSV_DEFAULT_DELIMITER,
@@ -264,6 +264,50 @@ class QueryHandler(AbstractHandler):
264
264
  exception=pe,
265
265
  code=401
266
266
  )
267
+ except OutputError as oe:
268
+ # FEAT-146: MultiQS is the single authoritative Output executor;
269
+ # a raised OutputError means a destination failed. Map its
270
+ # category to a differentiated HTTP status: data -> 422 (via
271
+ # self.Error, a client/query_error category) and infra/unknown
272
+ # -> 500 (via self.Except, the existing server-error responder —
273
+ # self.Error() has no code=500 branch and would otherwise fall
274
+ # through to 400). Both routes call build_error_payload, which
275
+ # exposes the real OutputError detail in the body regardless of
276
+ # `debug` (TASK-712). Placed BEFORE the broader
277
+ # (QueryException, DriverError) branch since OutputError is
278
+ # itself a QueryException subclass.
279
+ trace = traceback.format_exc()
280
+ self.logger.exception(oe, stack_info=True)
281
+ # step_name is attacker-influenced (it's the Output step's dict
282
+ # key straight from the request body — e.g. an unregistered
283
+ # destination name echoed back by get_destination()'s error), so
284
+ # it must be sanitized the same way header_detail is below.
285
+ step = " ".join(
286
+ str(getattr(oe, "step_name", None) or "Output").splitlines()
287
+ )
288
+ if getattr(oe, "category", None) == "data":
289
+ err = self.Error(
290
+ message=str(oe),
291
+ exception=oe,
292
+ stacktrace=trace,
293
+ code=422,
294
+ )
295
+ else:
296
+ err = self.Except(
297
+ message=str(oe),
298
+ exception=oe,
299
+ stacktrace=trace,
300
+ code=500,
301
+ )
302
+ # X-Output-Errors retained as supplementary detail (not the only
303
+ # signal anymore — the status code + body now carry the failure).
304
+ # HTTP header values may not contain embedded CR/LF (aiohttp
305
+ # raises on write) — destination messages (e.g. TableOutput's
306
+ # multi-line "Unconsumed column names" text) are collapsed to a
307
+ # single line here; the full detail is still in the body.
308
+ header_detail = " ".join(str(oe).splitlines())
309
+ err.headers['X-Output-Errors'] = f"{step}: {header_detail}"
310
+ raise err
267
311
  except (QueryException, DriverError) as qe:
268
312
  trace = traceback.format_exc()
269
313
  _remote_queries_on_err = getattr(qs, '_remote_queries', [])
@@ -365,23 +409,11 @@ class QueryHandler(AbstractHandler):
365
409
  'X-Total-Time': f'{total_time:.2f} seconds',
366
410
  }
367
411
  )
368
- output_errors: list[str] = []
369
- if isinstance(data, dict):
370
- if 'Output' in options:
371
- ## Optionally saving result to destination (registry-based dispatch)
372
- for step in options['Output']:
373
- for step_name, component in step.items():
374
- try:
375
- destination_cls = get_destination(step_name)
376
- obj = destination_cls(data=result, **component)
377
- result = await obj.run()
378
- except Exception as dest_err:
379
- self.logger.error(
380
- "QueryHandler: output destination '%s' failed: %s",
381
- step_name,
382
- dest_err,
383
- )
384
- output_errors.append(f"{step_name}: {dest_err}")
412
+ # FEAT-146: Output is now executed exactly once, solely by
413
+ # MultiQS.query() above (single authoritative Output executor). A
414
+ # failed destination raises OutputError there and is mapped to a
415
+ # 422/500 response in the `except OutputError` branch — there is no
416
+ # longer a duplicate Output loop here.
385
417
  ### Step 6: passing Result to DataOutput
386
418
  try:
387
419
  if result is None or isinstance(result, DataFrame) and result.empty:
@@ -412,8 +444,6 @@ class QueryHandler(AbstractHandler):
412
444
  remote_queries = getattr(qs, '_remote_queries', [])
413
445
  if remote_queries:
414
446
  response.headers['X-Remote-Queries'] = ','.join(remote_queries)
415
- if output_errors:
416
- response.headers['X-Output-Errors'] = ' | '.join(output_errors)
417
447
  return response
418
448
  except (DataNotFound) as ex:
419
449
  return self.NoData(
@@ -7,7 +7,8 @@ from ...exceptions import (
7
7
  QueryException,
8
8
  DriverError,
9
9
  DataNotFound,
10
- ParserError
10
+ ParserError,
11
+ OutputError
11
12
  )
12
13
  from importlib import import_module
13
14
  from ..base import BaseQuery
@@ -21,6 +22,36 @@ from .sources.executors import RemoteConfig
21
22
  from ...conf import QWORKER_HOST, QWORKER_PORT, QWORKER_TIMEOUT, QWORKER_WORKERS
22
23
 
23
24
 
25
+ # Best-effort data-vs-infra classification for MultiQuery Output/destination
26
+ # failures (FEAT-146). Deliberately small and centralized so it can be
27
+ # refined later (spec §8: precise classifier is an open question). Matches
28
+ # on the underlying (chained) exception's class name rather than importing
29
+ # a specific driver's exception module, so this stays dependency-light and
30
+ # works across destinations. Defaults to ``None`` (-> HTTP 500 downstream)
31
+ # when unrecognized, to avoid masking infrastructure issues as client errors.
32
+ _DATA_ERROR_TYPES = frozenset({"IntegrityError", "DataError", "ProgrammingError"})
33
+ _INFRA_ERROR_TYPES = frozenset({
34
+ "OperationalError", "InterfaceError", "TimeoutError", "ConnectionError"
35
+ })
36
+
37
+
38
+ def classify_output_error(exc: BaseException) -> Optional[str]:
39
+ """Classify a destination failure as ``"data"`` or ``"infra"``.
40
+
41
+ Inspects the chained cause (``exc.__cause__``) when present, since
42
+ destinations typically wrap the real driver exception via
43
+ ``raise OutputError(...) from err``. Returns ``None`` when the
44
+ exception type is not recognized.
45
+ """
46
+ cause = exc.__cause__ if exc.__cause__ is not None else exc
47
+ type_name = type(cause).__name__
48
+ if type_name in _DATA_ERROR_TYPES:
49
+ return "data"
50
+ if type_name in _INFRA_ERROR_TYPES:
51
+ return "infra"
52
+ return None
53
+
54
+
24
55
  def get_operator_module(clsname: str):
25
56
  """
26
57
  Get an Operator Module
@@ -185,7 +216,15 @@ class MultiQS(BaseQuery):
185
216
  self._options = slug_data
186
217
  self._queries = slug_data.pop('queries', {})
187
218
  self._files = slug_data.pop('files', {})
188
- self._sources = slug_data.pop('sources', [])
219
+ # Normalize sources exactly like the inline (__init__) path does
220
+ # (see line ~98). Without this, a slug whose `sources` is the
221
+ # dict convenience form ({"alias": {"type": ...}}) is left as a
222
+ # raw dict, and the dispatch loop's `for entry in self._sources:
223
+ # for source_type, config in entry.items()` iterates the dict's
224
+ # string keys, raising "'str' object has no attribute 'items'".
225
+ self._sources = self._normalize_sources(
226
+ slug_data.pop('sources', [])
227
+ )
189
228
  # TODO: making replacements based on POST data.
190
229
  else:
191
230
  # Single-query slug: wrap it for the multi-query executor
@@ -529,6 +568,9 @@ class MultiQS(BaseQuery):
529
568
  # reduce to one single Dataframe:
530
569
  result = list(result.values())[0]
531
570
  ### Step 5: Optionally saving result to destination (registry-based dispatch)
571
+ # Single authoritative Output executor (FEAT-146): fail-fast — the
572
+ # first destination failure raises immediately and stops the loop
573
+ # (no "continue to next destination" swallow).
532
574
  if _output:
533
575
  for step in _output:
534
576
  for step_name, component in step.items():
@@ -537,13 +579,31 @@ class MultiQS(BaseQuery):
537
579
  destination_cls = get_destination(step_name)
538
580
  obj = destination_cls(data=result, **component)
539
581
  result = await obj.run()
582
+ except OutputError as oe:
583
+ if getattr(oe, "step_name", None) is None:
584
+ oe.step_name = step_name
585
+ if getattr(oe, "category", None) is None:
586
+ oe.category = classify_output_error(oe)
587
+ logging.error(
588
+ "MultiQS: output destination '%s' failed: %s",
589
+ step_name,
590
+ oe,
591
+ )
592
+ raise
593
+ except DataNotFound:
594
+ # Preserve DataNotFound semantics unchanged.
595
+ raise
540
596
  except Exception as dest_err:
541
597
  logging.error(
542
598
  "MultiQS: output destination '%s' failed: %s",
543
599
  step_name,
544
600
  dest_err,
545
601
  )
546
- # Per spec: continue to next destination on failure
602
+ raise OutputError(
603
+ str(dest_err),
604
+ step_name=step_name,
605
+ category=classify_output_error(dest_err),
606
+ ) from dest_err
547
607
  if result is None or len(result) == 0:
548
608
  raise DataNotFound(
549
609
  "QS Empty Result"
@@ -299,9 +299,12 @@ def drop_duplicates(df: pd.DataFrame, columns: Optional[list] = None, **kwargs):
299
299
  :return: The DataFrame with duplicates dropped.
300
300
  """
301
301
  if columns and isinstance(columns, list):
302
- df.set_index(columns, inplace=True, drop=False)
303
- df = df.sort_values(by=columns)
304
- df = df.drop_duplicates(subset=columns, **kwargs)
302
+ # NOTE: do not ``set_index(columns, drop=False)`` here — it leaves the
303
+ # same names as both an index level and a column, which makes the
304
+ # subsequent ``sort_values(by=columns)`` raise "is both an index level
305
+ # and a column label, which is ambiguous". Sorting on the columns
306
+ # directly keeps ``keep='first'`` deterministic without that clash.
307
+ df = df.sort_values(by=columns).drop_duplicates(subset=columns, **kwargs)
305
308
  return df
306
309
 
307
310
 
@@ -17,6 +17,8 @@ import traceback
17
17
  import uuid
18
18
  from typing import Any, Optional
19
19
 
20
+ from ..exceptions import OutputError
21
+
20
22
  __all__ = ["GENERIC_MESSAGES", "build_error_payload"]
21
23
 
22
24
  # ---------------------------------------------------------------------------
@@ -68,6 +70,14 @@ def build_error_payload(
68
70
  public_message: If supplied, overrides the generic message from
69
71
  ``GENERIC_MESSAGES`` in the public ``"error"`` field.
70
72
 
73
+ Note:
74
+ When ``exception`` is a ``querysource.exceptions.OutputError`` and no
75
+ ``public_message`` is supplied, the exception's own message is used
76
+ as the public ``"error"`` field **even when** ``debug=False``. This
77
+ is a scoped, accepted data-exposure tradeoff for MultiQuery Output
78
+ failures only (FEAT-146) — every other exception type keeps the
79
+ generic redacted message in production.
80
+
71
81
  Returns:
72
82
  dict: Client-safe payload. Production shape::
73
83
 
@@ -106,11 +116,27 @@ def build_error_payload(
106
116
  )
107
117
 
108
118
  # 5. Resolve the public message (never expose raw DB / internal text)
109
- safe_message = (
110
- public_message
111
- if public_message is not None
112
- else GENERIC_MESSAGES.get(category, GENERIC_MESSAGES[_DEFAULT_CATEGORY])
113
- )
119
+ # Scoped override (FEAT-146): OutputError detail is client-visible even
120
+ # in production (debug=False), since navigator-front-next needs the real
121
+ # destination failure text to surface to the user. Every other exception
122
+ # type keeps the generic, redacted message.
123
+ if public_message is not None:
124
+ safe_message = public_message
125
+ elif isinstance(exception, OutputError):
126
+ safe_message = detail
127
+ else:
128
+ safe_message = GENERIC_MESSAGES.get(category, GENERIC_MESSAGES[_DEFAULT_CATEGORY])
129
+
130
+ # 5b. Callers (AbstractHandler.NotFound/Error/Except) reuse this value
131
+ # verbatim as both the HTTP reason phrase and the X-MESSAGE header —
132
+ # neither may contain embedded CR/LF (RFC 7230), which aiohttp enforces
133
+ # by raising ValueError. Real destination failure text (e.g.
134
+ # TableOutput's multi-line "Unconsumed column names" message, now
135
+ # surfaced verbatim per the OutputError override above) can legitimately
136
+ # contain newlines, so collapse them to keep the message intact while
137
+ # staying header/reason-safe.
138
+ if safe_message:
139
+ safe_message = " ".join(safe_message.splitlines())
114
140
 
115
141
  # 6. Build and return the payload
116
142
  payload: dict = {
@@ -6,7 +6,7 @@ __description__ = (
6
6
  'QuerySource Query parser and generator.'
7
7
  'Supports SQL, NoSQL, MongoDB, Cassandra, Elasticsearch, etc.'
8
8
  )
9
- __version__ = '4.5.10'
9
+ __version__ = '4.5.12'
10
10
  __url__ = 'https://github.com/phenobarbital/querysource'
11
11
  __copyright__ = 'Copyright (c) 2018-2025 Jesus Lara'
12
12
  __author__ = 'Jesus Lara'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: querysource
3
- Version: 4.5.10
3
+ Version: 4.5.12
4
4
  Summary: Aiohttp web service for querying several databases easily
5
5
  Author-email: Jesus Lara <jesuslarag@gmail.com>
6
6
  License: BSD-3-Clause
@@ -123,6 +123,7 @@ Requires-Dist: pytest-asyncio==1.3.0; extra == "dev"
123
123
  Requires-Dist: pytest-xdist==3.3.1; extra == "dev"
124
124
  Requires-Dist: pytest-assume==2.4.3; extra == "dev"
125
125
  Requires-Dist: ruff>=0.6.0; extra == "dev"
126
+ Requires-Dist: maturin<2.0,>=1.7; extra == "dev"
126
127
  Dynamic: license-file
127
128
 
128
129
  # QuerySource #
@@ -550,6 +550,7 @@ tests/test_multi_destinations_subpackage.py
550
550
  tests/test_multiqs_column_transforms.py
551
551
  tests/test_multiqs_destination_dispatch.py
552
552
  tests/test_multiqs_remote_dispatch.py
553
+ tests/test_multiqs_slug_sources_normalize.py
553
554
  tests/test_multiqs_sources_integration.py
554
555
  tests/test_queryslug_concurrency.py
555
556
  tests/test_querysource_setup_airtable.py
@@ -597,6 +598,7 @@ tests/handlers/test_querymanager_pagination.py
597
598
  tests/handlers/test_queryservice_pbac_smoke.py
598
599
  tests/integration/__init__.py
599
600
  tests/integration/test_datasource_endpoint.py
601
+ tests/integration/test_multiquery_output_errors.py
600
602
  tests/integration/test_pbac_credentials.py
601
603
  tests/integration/test_pbac_enforcement.py
602
604
  tests/integration/test_pbac_listing.py
@@ -620,6 +622,10 @@ tests/services/__init__.py
620
622
  tests/services/test_querysource_setup_pbac.py
621
623
  tests/unit/test_cython_filter_fallback.py
622
624
  tests/unit/test_datasource_redaction.py
625
+ tests/unit/test_error_payload.py
626
+ tests/unit/test_handler_output_status.py
627
+ tests/unit/test_multiqs_output_raise.py
628
+ tests/unit/test_output_error.py
623
629
  tests/unit/test_provider_raw_query_validated.py
624
630
  tests/unit/test_qs_parsers_validated.py
625
631
  tests/unit/test_raw_query_cond_definition_wiring.py
@@ -84,6 +84,7 @@ pytest-asyncio==1.3.0
84
84
  pytest-xdist==3.3.1
85
85
  pytest-assume==2.4.3
86
86
  ruff>=0.6.0
87
+ maturin<2.0,>=1.7
87
88
 
88
89
  [geo]
89
90
  timezonefinder