querysource 4.4.2__tar.gz → 4.5.0__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 (627) hide show
  1. {querysource-4.4.2 → querysource-4.5.0}/Makefile +27 -2
  2. {querysource-4.4.2/querysource.egg-info → querysource-4.5.0}/PKG-INFO +1 -1
  3. querysource-4.5.0/generated/NormalizeColumns.json +78 -0
  4. {querysource-4.4.2 → querysource-4.5.0}/generated/S3Source.json +1 -1
  5. {querysource-4.4.2 → querysource-4.5.0}/generated/SharepointSource.json +26 -2
  6. {querysource-4.4.2 → querysource-4.5.0}/generated/SmartSheetSource.json +1 -1
  7. {querysource-4.4.2 → querysource-4.5.0}/generated/TableSource.json +1 -1
  8. {querysource-4.4.2 → querysource-4.5.0}/generated/ToSharepoint.json +1 -1
  9. querysource-4.5.0/policies/HARDENING.md +230 -0
  10. querysource-4.5.0/policies/baseline.yaml +35 -0
  11. {querysource-4.4.2 → querysource-4.5.0}/policies/defaults.yaml +1 -1
  12. {querysource-4.4.2 → querysource-4.5.0}/querysource/_version.py +3 -3
  13. {querysource-4.4.2 → querysource-4.5.0}/querysource/conf.py +10 -0
  14. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/handlers/datasource.py +159 -7
  15. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/abstract.py +93 -44
  16. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/multi.py +8 -4
  17. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/connections.py +15 -4
  18. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/output.py +44 -21
  19. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/postgres.py +45 -0
  20. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/table.py +45 -6
  21. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/abstract.py +32 -14
  22. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/abstract.c +1465 -1672
  23. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/abstract.pyx +3 -10
  24. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/bigquery.c +3519 -2117
  25. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/bigquery.pyx +25 -9
  26. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/cql.c +3401 -1965
  27. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/cql.pyx +27 -12
  28. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/pgsql.c +5017 -2869
  29. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/pgsql.pyx +57 -30
  30. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/sosql.c +3319 -1842
  31. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/sosql.pyx +28 -11
  32. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/sql.c +4338 -2827
  33. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/sql.pyx +43 -20
  34. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/sqlserver.c +3197 -1712
  35. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/sqlserver.pyx +28 -11
  36. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/cassandra.py +17 -10
  37. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/default.py +16 -5
  38. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/documentdb.py +17 -1
  39. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/mysql.py +15 -5
  40. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sql.py +38 -15
  41. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sqlserver.py +17 -10
  42. {querysource-4.4.2 → querysource-4.5.0}/querysource/qs_parsers/__init__.py +4 -0
  43. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/__init__.py +54 -1
  44. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/_introspect.py +10 -1
  45. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/destinations/sharepoint.py +105 -36
  46. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/sharepoint.py +50 -23
  47. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/Map.py +0 -1
  48. querysource-4.5.0/querysource/queries/multi/transformations/NormalizeColumns.catalog.yaml +64 -0
  49. querysource-4.5.0/querysource/queries/multi/transformations/NormalizeColumns.py +141 -0
  50. querysource-4.5.0/querysource/utils/errors.py +125 -0
  51. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/handlers.py +23 -2
  52. {querysource-4.4.2 → querysource-4.5.0}/querysource/version.py +1 -1
  53. {querysource-4.4.2 → querysource-4.5.0/querysource.egg-info}/PKG-INFO +1 -1
  54. {querysource-4.4.2 → querysource-4.5.0}/querysource.egg-info/SOURCES.txt +17 -7
  55. {querysource-4.4.2 → querysource-4.5.0}/rust/Cargo.lock +269 -0
  56. {querysource-4.4.2 → querysource-4.5.0}/rust/Cargo.toml +3 -0
  57. {querysource-4.4.2 → querysource-4.5.0}/rust/src/bigquery_parser.rs +1 -1
  58. {querysource-4.4.2 → querysource-4.5.0}/rust/src/lib.rs +1 -0
  59. {querysource-4.4.2 → querysource-4.5.0}/rust/src/pgsql_parser.rs +100 -31
  60. querysource-4.5.0/rust/src/safe_dict.rs +490 -0
  61. {querysource-4.4.2 → querysource-4.5.0}/rust/src/sql_parser.rs +109 -28
  62. querysource-4.5.0/tests/integration/test_datasource_endpoint.py +281 -0
  63. querysource-4.5.0/tests/integration/test_slug_injection.py +224 -0
  64. querysource-4.5.0/tests/integration/test_slug_regression.py +241 -0
  65. querysource-4.5.0/tests/test_error_formatter.py +194 -0
  66. querysource-4.5.0/tests/test_feat102_error_redaction.py +625 -0
  67. querysource-4.5.0/tests/test_grouping_sync.py +82 -0
  68. querysource-4.5.0/tests/unit/test_cython_filter_fallback.py +407 -0
  69. querysource-4.5.0/tests/unit/test_datasource_redaction.py +284 -0
  70. querysource-4.5.0/tests/unit/test_provider_raw_query_validated.py +150 -0
  71. querysource-4.5.0/tests/unit/test_qs_parsers_validated.py +130 -0
  72. querysource-4.4.2/qs-parser/Cargo.lock +0 -334
  73. querysource-4.4.2/qs-parser/Cargo.toml +0 -17
  74. querysource-4.4.2/qs-parser/pyproject.toml +0 -14
  75. querysource-4.4.2/qs-parser/src/lib.rs +0 -13
  76. querysource-4.4.2/qs-parser/src/parser.rs +0 -186
  77. querysource-4.4.2/qs-parser/src/sql.rs +0 -172
  78. querysource-4.4.2/rust/src/safe_dict.rs +0 -115
  79. {querysource-4.4.2 → querysource-4.5.0}/.agent/rules/async-programming-expert.md +0 -0
  80. {querysource-4.4.2 → querysource-4.5.0}/.agent/rules/code-reviewer.md +0 -0
  81. {querysource-4.4.2 → querysource-4.5.0}/.agent/rules/cython-development.md +0 -0
  82. {querysource-4.4.2 → querysource-4.5.0}/.agent/rules/prompt-expert.md +0 -0
  83. {querysource-4.4.2 → querysource-4.5.0}/.agent/rules/python-development.md +0 -0
  84. {querysource-4.4.2 → querysource-4.5.0}/.agent/rules/rust-development.md +0 -0
  85. {querysource-4.4.2 → querysource-4.5.0}/.agent/workflows/create-parrot-tool.md +0 -0
  86. {querysource-4.4.2 → querysource-4.5.0}/.agent/workflows/create-workflow.md +0 -0
  87. {querysource-4.4.2 → querysource-4.5.0}/.agent/workflows/debug-regressions-with-git-bisect-binary-search.md +0 -0
  88. {querysource-4.4.2 → querysource-4.5.0}/.agent/workflows/generate-tests.md +0 -0
  89. {querysource-4.4.2 → querysource-4.5.0}/.agent/workflows/git-new-feature.md +0 -0
  90. {querysource-4.4.2 → querysource-4.5.0}/.agent/workflows/parrot-mcp-server.md +0 -0
  91. {querysource-4.4.2 → querysource-4.5.0}/.agent/workflows/release_package.md +0 -0
  92. {querysource-4.4.2 → querysource-4.5.0}/.agent/workflows/start-flow.md +0 -0
  93. {querysource-4.4.2 → querysource-4.5.0}/.bumpversion.cfg +0 -0
  94. {querysource-4.4.2 → querysource-4.5.0}/.claude/agents/code-reviewer.md +0 -0
  95. {querysource-4.4.2 → querysource-4.5.0}/.claude/agents/sdd-autopilot.md +0 -0
  96. {querysource-4.4.2 → querysource-4.5.0}/.claude/agents/sdd-qa.md +0 -0
  97. {querysource-4.4.2 → querysource-4.5.0}/.claude/agents/sdd-research.md +0 -0
  98. {querysource-4.4.2 → querysource-4.5.0}/.claude/agents/sdd-worker.md +0 -0
  99. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/pr-review.md +0 -0
  100. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-brainstorm.md +0 -0
  101. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-codereview.md +0 -0
  102. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-done.md +0 -0
  103. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-fromjira.md +0 -0
  104. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-next.md +0 -0
  105. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-proposal.md +0 -0
  106. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-spec.md +0 -0
  107. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-start.md +0 -0
  108. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-status.md +0 -0
  109. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-task.md +0 -0
  110. {querysource-4.4.2 → querysource-4.5.0}/.claude/commands/sdd-tojira.md +0 -0
  111. {querysource-4.4.2 → querysource-4.5.0}/.claude/rules/aws-cost-optimization.md +0 -0
  112. {querysource-4.4.2 → querysource-4.5.0}/.claude/rules/code-reviewer.md +0 -0
  113. {querysource-4.4.2 → querysource-4.5.0}/.claude/rules/cython-development.md +0 -0
  114. {querysource-4.4.2 → querysource-4.5.0}/.claude/rules/python-development.md +0 -0
  115. {querysource-4.4.2 → querysource-4.5.0}/.claude/rules/rust-development.md +0 -0
  116. {querysource-4.4.2 → querysource-4.5.0}/.claude/rules/using-git-worktrees.md +0 -0
  117. {querysource-4.4.2 → querysource-4.5.0}/.claude/rules/worktree-pr-and-clean.md +0 -0
  118. {querysource-4.4.2 → querysource-4.5.0}/.claude/rules/worktree-start-feature.md +0 -0
  119. {querysource-4.4.2 → querysource-4.5.0}/.claude/rules/worktree-status.md +0 -0
  120. {querysource-4.4.2 → querysource-4.5.0}/.github/dependabot.yml +0 -0
  121. {querysource-4.4.2 → querysource-4.5.0}/.github/workflows/codeql-analysis.yml +0 -0
  122. {querysource-4.4.2 → querysource-4.5.0}/.github/workflows/release.yml +0 -0
  123. {querysource-4.4.2 → querysource-4.5.0}/.isort.cfg +0 -0
  124. {querysource-4.4.2 → querysource-4.5.0}/.jupyter/jupyter_notebook_config.py +0 -0
  125. {querysource-4.4.2 → querysource-4.5.0}/.pre-commit-config.yaml +0 -0
  126. {querysource-4.4.2 → querysource-4.5.0}/.pylintrc +0 -0
  127. {querysource-4.4.2 → querysource-4.5.0}/CHANGES.rst +0 -0
  128. {querysource-4.4.2 → querysource-4.5.0}/CODE_OF_CONDUCT.md +0 -0
  129. {querysource-4.4.2 → querysource-4.5.0}/CONTRIBUTING.md +0 -0
  130. {querysource-4.4.2 → querysource-4.5.0}/INSTALL +0 -0
  131. {querysource-4.4.2 → querysource-4.5.0}/JOIN_CONDITIONS_FEATURE.md +0 -0
  132. {querysource-4.4.2 → querysource-4.5.0}/JOIN_CONDITIONS_SUMMARY.md +0 -0
  133. {querysource-4.4.2 → querysource-4.5.0}/LICENSE +0 -0
  134. {querysource-4.4.2 → querysource-4.5.0}/MANIFEST.in +0 -0
  135. {querysource-4.4.2 → querysource-4.5.0}/README.md +0 -0
  136. {querysource-4.4.2 → querysource-4.5.0}/app.py +0 -0
  137. {querysource-4.4.2 → querysource-4.5.0}/bin/README.md +0 -0
  138. {querysource-4.4.2 → querysource-4.5.0}/conftest.py +0 -0
  139. {querysource-4.4.2 → querysource-4.5.0}/generated/AirtableSource.json +0 -0
  140. {querysource-4.4.2 → querysource-4.5.0}/generated/Concat.json +0 -0
  141. {querysource-4.4.2 → querysource-4.5.0}/generated/DWHDestination.json +0 -0
  142. {querysource-4.4.2 → querysource-4.5.0}/generated/DropCols.json +0 -0
  143. {querysource-4.4.2 → querysource-4.5.0}/generated/FileSource.json +0 -0
  144. {querysource-4.4.2 → querysource-4.5.0}/generated/Filter.json +0 -0
  145. {querysource-4.4.2 → querysource-4.5.0}/generated/FilterCols.json +0 -0
  146. {querysource-4.4.2 → querysource-4.5.0}/generated/Forecast.json +0 -0
  147. {querysource-4.4.2 → querysource-4.5.0}/generated/GoogleMaps.json +0 -0
  148. {querysource-4.4.2 → querysource-4.5.0}/generated/GroupBy.json +0 -0
  149. {querysource-4.4.2 → querysource-4.5.0}/generated/Info.json +0 -0
  150. {querysource-4.4.2 → querysource-4.5.0}/generated/Join.json +0 -0
  151. {querysource-4.4.2 → querysource-4.5.0}/generated/Map.json +0 -0
  152. {querysource-4.4.2 → querysource-4.5.0}/generated/Melt.json +0 -0
  153. {querysource-4.4.2 → querysource-4.5.0}/generated/Merge.json +0 -0
  154. {querysource-4.4.2 → querysource-4.5.0}/generated/PluckCols.json +0 -0
  155. {querysource-4.4.2 → querysource-4.5.0}/generated/Query.json +0 -0
  156. {querysource-4.4.2 → querysource-4.5.0}/generated/Table.json +0 -0
  157. {querysource-4.4.2 → querysource-4.5.0}/generated/TableDestination.json +0 -0
  158. {querysource-4.4.2 → querysource-4.5.0}/generated/TableOutput.json +0 -0
  159. {querysource-4.4.2 → querysource-4.5.0}/generated/TableOutputAdapter.json +0 -0
  160. {querysource-4.4.2 → querysource-4.5.0}/generated/ToS3.json +0 -0
  161. {querysource-4.4.2 → querysource-4.5.0}/generated/correlation.json +0 -0
  162. {querysource-4.4.2 → querysource-4.5.0}/generated/crosstab.json +0 -0
  163. {querysource-4.4.2 → querysource-4.5.0}/generated/pivot.json +0 -0
  164. {querysource-4.4.2 → querysource-4.5.0}/generated/tExplode.json +0 -0
  165. {querysource-4.4.2 → querysource-4.5.0}/generated/tOrder.json +0 -0
  166. {querysource-4.4.2 → querysource-4.5.0}/generated/tPandas.json +0 -0
  167. {querysource-4.4.2 → querysource-4.5.0}/gunicorn_config.py +0 -0
  168. {querysource-4.4.2 → querysource-4.5.0}/mypy.ini +0 -0
  169. {querysource-4.4.2 → querysource-4.5.0}/nav.py +0 -0
  170. {querysource-4.4.2 → querysource-4.5.0}/policies/datasources.yaml +0 -0
  171. {querysource-4.4.2 → querysource-4.5.0}/policies/drivers.yaml +0 -0
  172. {querysource-4.4.2 → querysource-4.5.0}/policies/raw_queries.yaml +0 -0
  173. {querysource-4.4.2 → querysource-4.5.0}/policies/slugs.yaml +0 -0
  174. {querysource-4.4.2 → querysource-4.5.0}/policies/superusers.yaml +0 -0
  175. {querysource-4.4.2 → querysource-4.5.0}/pyproject.toml +0 -0
  176. {querysource-4.4.2 → querysource-4.5.0}/pytest.ini +0 -0
  177. {querysource-4.4.2 → querysource-4.5.0}/querysource/__cli__.py +0 -0
  178. {querysource-4.4.2 → querysource-4.5.0}/querysource/__init__.py +0 -0
  179. {querysource-4.4.2 → querysource-4.5.0}/querysource/auth/__init__.py +0 -0
  180. {querysource-4.4.2 → querysource-4.5.0}/querysource/auth/_resource_types.py +0 -0
  181. {querysource-4.4.2 → querysource-4.5.0}/querysource/auth/credentials.py +0 -0
  182. {querysource-4.4.2 → querysource-4.5.0}/querysource/auth/pbac.py +0 -0
  183. {querysource-4.4.2 → querysource-4.5.0}/querysource/cache/__init__.py +0 -0
  184. {querysource-4.4.2 → querysource-4.5.0}/querysource/cache/backends/__init__.py +0 -0
  185. {querysource-4.4.2 → querysource-4.5.0}/querysource/cache/backends/abstract.py +0 -0
  186. {querysource-4.4.2 → querysource-4.5.0}/querysource/cache/backends/memcache.py +0 -0
  187. {querysource-4.4.2 → querysource-4.5.0}/querysource/cache/backends/redis.py +0 -0
  188. {querysource-4.4.2 → querysource-4.5.0}/querysource/cache/base.py +0 -0
  189. {querysource-4.4.2 → querysource-4.5.0}/querysource/cli/__init__.py +0 -0
  190. {querysource-4.4.2 → querysource-4.5.0}/querysource/cli/generate_docs.py +0 -0
  191. {querysource-4.4.2 → querysource-4.5.0}/querysource/connections.py +0 -0
  192. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/__init__.py +0 -0
  193. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/__init__.py +0 -0
  194. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/abstract.py +0 -0
  195. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/arangodb.py +0 -0
  196. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/athena.py +0 -0
  197. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/bigquery.py +0 -0
  198. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/cassandra.py +0 -0
  199. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/clickhouse.py +0 -0
  200. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/cockroachdb.py +0 -0
  201. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/couchbase.py +0 -0
  202. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/couchdb.py +0 -0
  203. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/countries.py +0 -0
  204. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/delta.py +0 -0
  205. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/documentdb.py +0 -0
  206. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/dynamodb.py +0 -0
  207. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/elastic.py +0 -0
  208. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/ga.py +0 -0
  209. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/gcalc.py +0 -0
  210. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/hazel.py +0 -0
  211. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/iceberg.py +0 -0
  212. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/influx.py +0 -0
  213. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/jdbc.py +0 -0
  214. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/jira.py +0 -0
  215. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/mariadb.py +0 -0
  216. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/memcached.py +0 -0
  217. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/mongo.py +0 -0
  218. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/mysql.py +0 -0
  219. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/odbc.py +0 -0
  220. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/openweather.py +0 -0
  221. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/oracle.py +0 -0
  222. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/pg.py +0 -0
  223. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/pg_admin.py +0 -0
  224. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/postgres.py +0 -0
  225. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/py.typed +0 -0
  226. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/qs.py +0 -0
  227. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/redis.py +0 -0
  228. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/rest.py +0 -0
  229. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/rethink.py +0 -0
  230. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/sa.py +0 -0
  231. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/salesforce.py +0 -0
  232. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/scylladb.py +0 -0
  233. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/sqlalchemy.py +0 -0
  234. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/sqlite.py +0 -0
  235. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/sqlserver.py +0 -0
  236. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/upc.py +0 -0
  237. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/drivers/zipcodeapi.py +0 -0
  238. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/handlers/__init__.py +0 -0
  239. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/handlers/utils.py +0 -0
  240. {querysource-4.4.2 → querysource-4.5.0}/querysource/datasources/models.py +0 -0
  241. {querysource-4.4.2 → querysource-4.5.0}/querysource/events/__init__.py +0 -0
  242. {querysource-4.4.2 → querysource-4.5.0}/querysource/exceptions.py +0 -0
  243. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/__init__.py +0 -0
  244. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/_pagination.py +0 -0
  245. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/components.py +0 -0
  246. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/executor.py +0 -0
  247. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/integrations/__init__.py +0 -0
  248. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/integrations/airtable.py +0 -0
  249. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/log.py +0 -0
  250. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/manager.py +0 -0
  251. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/outputs/__init__.py +0 -0
  252. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/outputs/tableOutput/__init__.py +0 -0
  253. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/outputs/tableOutput/postgres.py +0 -0
  254. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/outputs/tableOutput/table.py +0 -0
  255. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/scheduler.py +0 -0
  256. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/service.py +0 -0
  257. {querysource-4.4.2 → querysource-4.5.0}/querysource/handlers/variables.py +0 -0
  258. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/__init__.py +0 -0
  259. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/airtable.py +0 -0
  260. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/credentials.py +0 -0
  261. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/databases/__init__.py +0 -0
  262. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/databases/abstract.py +0 -0
  263. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/databases/bigquery.py +0 -0
  264. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/databases/db.py +0 -0
  265. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/databases/mongo.py +0 -0
  266. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/databases/rethink.py +0 -0
  267. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/http.py +0 -0
  268. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/playwright_service.py +0 -0
  269. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/queries.py +0 -0
  270. {querysource-4.4.2 → querysource-4.5.0}/querysource/interfaces/selenium_service.py +0 -0
  271. {querysource-4.4.2 → querysource-4.5.0}/querysource/libs/__init__.py +0 -0
  272. {querysource-4.4.2 → querysource-4.5.0}/querysource/libs/encoders.py +0 -0
  273. {querysource-4.4.2 → querysource-4.5.0}/querysource/libs/functions/__init__.py +0 -0
  274. {querysource-4.4.2 → querysource-4.5.0}/querysource/libs/py.typed +0 -0
  275. {querysource-4.4.2 → querysource-4.5.0}/querysource/models.py +0 -0
  276. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/__init__.py +0 -0
  277. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/destinations/__init__.py +0 -0
  278. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/destinations/abstract.py +0 -0
  279. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/destinations/dwh.py +0 -0
  280. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/destinations/s3.py +0 -0
  281. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/destinations/sharepoint.py +0 -0
  282. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/destinations/table.py +0 -0
  283. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/dt/__init__.py +0 -0
  284. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/dt/abstract.py +0 -0
  285. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/dt/arrow.py +0 -0
  286. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/dt/dt.py +0 -0
  287. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/dt/factory.py +0 -0
  288. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/dt/iter.py +0 -0
  289. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/dt/modin.py +0 -0
  290. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/dt/pandas.py +0 -0
  291. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/dt/polars.py +0 -0
  292. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/__init__.py +0 -0
  293. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/abstract.py +0 -0
  294. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/bigquery.py +0 -0
  295. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/documentdb.py +0 -0
  296. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/mongodb.py +0 -0
  297. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/mysql.py +0 -0
  298. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/rethink.py +0 -0
  299. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/TableOutput/sa.py +0 -0
  300. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/tables/__init__.py +0 -0
  301. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/__init__.py +0 -0
  302. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/bokeh.py +0 -0
  303. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/clustering.py +0 -0
  304. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/csv.py +0 -0
  305. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/describe.py +0 -0
  306. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/eda.py +0 -0
  307. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/excel.py +0 -0
  308. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/html.py +0 -0
  309. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/json.py +0 -0
  310. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/pdf.py +0 -0
  311. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/pickle.py +0 -0
  312. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/plotly.py +0 -0
  313. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/profiling.py +0 -0
  314. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/report.py +0 -0
  315. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/table.py +0 -0
  316. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/tsv.py +0 -0
  317. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/txt.py +0 -0
  318. {querysource-4.4.2 → querysource-4.5.0}/querysource/outputs/writers/xml.py +0 -0
  319. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/__init__.py +0 -0
  320. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/abstract.pxd +0 -0
  321. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/arangodb.c +0 -0
  322. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/arangodb.pxd +0 -0
  323. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/arangodb.pyx +0 -0
  324. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/bigquery.pxd +0 -0
  325. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/cql.pxd +0 -0
  326. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/deltatbl.c +0 -0
  327. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/deltatbl.pxd +0 -0
  328. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/deltatbl.pyx +0 -0
  329. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/elastic.cpp +0 -0
  330. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/elastic.pxd +0 -0
  331. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/elastic.pyx +0 -0
  332. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/iceberg.c +0 -0
  333. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/iceberg.pxd +0 -0
  334. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/iceberg.pyx +0 -0
  335. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/influx.c +0 -0
  336. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/influx.pxd +0 -0
  337. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/influx.pyx +0 -0
  338. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/mongo.cpp +0 -0
  339. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/mongo.pxd +0 -0
  340. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/mongo.pyx +0 -0
  341. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/parser.c +0 -0
  342. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/parser.pxd +0 -0
  343. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/parser.pyx +0 -0
  344. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/pgsql.pxd +0 -0
  345. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/rethink.c +0 -0
  346. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/rethink.pxd +0 -0
  347. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/rethink.pyx +0 -0
  348. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/sosql.pxd +0 -0
  349. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/sql.pxd +0 -0
  350. {querysource-4.4.2 → querysource-4.5.0}/querysource/parsers/sqlserver.pxd +0 -0
  351. {querysource-4.4.2 → querysource-4.5.0}/querysource/plugins/__init__.py +0 -0
  352. {querysource-4.4.2 → querysource-4.5.0}/querysource/plugins/importer.py +0 -0
  353. {querysource-4.4.2 → querysource-4.5.0}/querysource/plugins/sources/__init__.py +0 -0
  354. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/__init__.py +0 -0
  355. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/abstract.py +0 -0
  356. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/arangodb.py +0 -0
  357. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/bigquery.py +0 -0
  358. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/db.py +0 -0
  359. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/deltatbl.py +0 -0
  360. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/dummy.py +0 -0
  361. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/elastic.py +0 -0
  362. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/external.py +0 -0
  363. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/http.py +0 -0
  364. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/iceberg.py +0 -0
  365. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/influx.py +0 -0
  366. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/pg.py +0 -0
  367. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/py.typed +0 -0
  368. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/rest.py +0 -0
  369. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/rethink.py +0 -0
  370. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/salesforce.py +0 -0
  371. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/scylladb.py +0 -0
  372. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/__init__.py +0 -0
  373. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/abstract.py +0 -0
  374. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/amazon.py +0 -0
  375. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/countries.py +0 -0
  376. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/ga.py +0 -0
  377. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/geofcc.py +0 -0
  378. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/gmaps.py +0 -0
  379. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/graphcountries.py +0 -0
  380. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/graphql.py +0 -0
  381. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/http.py +0 -0
  382. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/hubspot.py +0 -0
  383. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/openweather.py +0 -0
  384. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/parsers/__init__.py +0 -0
  385. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/parsers/amproduct.py +0 -0
  386. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/parsers/xpath.py +0 -0
  387. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/pokemon.py +0 -0
  388. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/populartimes.py +0 -0
  389. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/py.typed +0 -0
  390. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/rest.py +0 -0
  391. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/retailnext.py +0 -0
  392. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/rssapp.py +0 -0
  393. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/salesforce.py +0 -0
  394. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/scrapper.py +0 -0
  395. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/shoppertrack.py +0 -0
  396. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/swop.py +0 -0
  397. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/uap.py +0 -0
  398. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/upc.py +0 -0
  399. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/wm_stores.py +0 -0
  400. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/zammad.py +0 -0
  401. {querysource-4.4.2 → querysource-4.5.0}/querysource/providers/sources/zipcodeapi.py +0 -0
  402. {querysource-4.4.2 → querysource-4.5.0}/querysource/py.typed +0 -0
  403. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/__init__.py +0 -0
  404. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/base.py +0 -0
  405. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/executor.py +0 -0
  406. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/models.py +0 -0
  407. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/abstract.py +0 -0
  408. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/components/__init__.py +0 -0
  409. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/components/abstract.py +0 -0
  410. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/destinations/__init__.py +0 -0
  411. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/destinations/dwh.py +0 -0
  412. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/destinations/s3.py +0 -0
  413. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/destinations/table.py +0 -0
  414. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/Concat.py +0 -0
  415. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/GroupBy.catalog.yaml +0 -0
  416. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/GroupBy.py +0 -0
  417. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/Info.py +0 -0
  418. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/Join.catalog.yaml +0 -0
  419. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/Join.py +0 -0
  420. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/Melt.catalog.yaml +0 -0
  421. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/Melt.py +0 -0
  422. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/Merge.catalog.yaml +0 -0
  423. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/Merge.py +0 -0
  424. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/__init__.py +0 -0
  425. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/abstract.py +0 -0
  426. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/filter/Filter.catalog.yaml +0 -0
  427. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/filter/__init__.py +0 -0
  428. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/operators/filter/flt.py +0 -0
  429. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/registry.py +0 -0
  430. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/__init__.py +0 -0
  431. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/airtable.py +0 -0
  432. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/base.py +0 -0
  433. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/executors.py +0 -0
  434. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/file.py +0 -0
  435. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/query.catalog.yaml +0 -0
  436. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/query.py +0 -0
  437. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/s3.py +0 -0
  438. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/smartsheet.py +0 -0
  439. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/sources/table.py +0 -0
  440. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/DropCols.catalog.yaml +0 -0
  441. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/DropCols.py +0 -0
  442. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/FilterCols.catalog.yaml +0 -0
  443. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/FilterCols.py +0 -0
  444. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/Forecast.catalog.yaml +0 -0
  445. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/Forecast.py +0 -0
  446. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/Map.catalog.yaml +0 -0
  447. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/PluckCols.catalog.yaml +0 -0
  448. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/PluckCols.py +0 -0
  449. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/__init__.py +0 -0
  450. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/abstract.py +0 -0
  451. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/correlation.catalog.yaml +0 -0
  452. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/correlation.py +0 -0
  453. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/crosstab.catalog.yaml +0 -0
  454. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/crosstab.py +0 -0
  455. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/google/GoogleMaps.catalog.yaml +0 -0
  456. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/google/__init__.py +0 -0
  457. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/google/maps.py +0 -0
  458. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/pivot.catalog.yaml +0 -0
  459. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/pivot.py +0 -0
  460. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/tExplode.catalog.yaml +0 -0
  461. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/tExplode.py +0 -0
  462. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/tOrder.catalog.yaml +0 -0
  463. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/tOrder.py +0 -0
  464. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/multi/transformations/tPandas.py +0 -0
  465. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/obj.py +0 -0
  466. {querysource-4.4.2 → querysource-4.5.0}/querysource/queries/qs.py +0 -0
  467. {querysource-4.4.2 → querysource-4.5.0}/querysource/scheduler/__init__.py +0 -0
  468. {querysource-4.4.2 → querysource-4.5.0}/querysource/scheduler/jobs.py +0 -0
  469. {querysource-4.4.2 → querysource-4.5.0}/querysource/scheduler/notifications.py +0 -0
  470. {querysource-4.4.2 → querysource-4.5.0}/querysource/scheduler/scheduler.py +0 -0
  471. {querysource-4.4.2 → querysource-4.5.0}/querysource/services.py +0 -0
  472. {querysource-4.4.2 → querysource-4.5.0}/querysource/template/__init__.py +0 -0
  473. {querysource-4.4.2 → querysource-4.5.0}/querysource/template/parser.py +0 -0
  474. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/__init__.py +0 -0
  475. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/converters.cpp +0 -0
  476. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/converters.pyx +0 -0
  477. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/dt/__init__.py +0 -0
  478. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/dt/filters.py +0 -0
  479. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/dt/transforms.py +0 -0
  480. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/py.typed +0 -0
  481. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/typedefs.c +0 -0
  482. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/typedefs.pyx +0 -0
  483. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/validators.cpp +0 -0
  484. {querysource-4.4.2 → querysource-4.5.0}/querysource/types/validators.pyx +0 -0
  485. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/__init__.py +0 -0
  486. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/cache_serialization.py +0 -0
  487. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/events.py +0 -0
  488. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/fn.py +0 -0
  489. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/functions.cpp +0 -0
  490. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/functions.pyx +0 -0
  491. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/getfunc.py +0 -0
  492. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/parseqs.cpp +0 -0
  493. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/parseqs.pyx +0 -0
  494. {querysource-4.4.2 → querysource-4.5.0}/querysource/utils/validators.py +0 -0
  495. {querysource-4.4.2 → querysource-4.5.0}/querysource.egg-info/dependency_links.txt +0 -0
  496. {querysource-4.4.2 → querysource-4.5.0}/querysource.egg-info/entry_points.txt +0 -0
  497. {querysource-4.4.2 → querysource-4.5.0}/querysource.egg-info/not-zip-safe +0 -0
  498. {querysource-4.4.2 → querysource-4.5.0}/querysource.egg-info/requires.txt +0 -0
  499. {querysource-4.4.2 → querysource-4.5.0}/querysource.egg-info/top_level.txt +0 -0
  500. {querysource-4.4.2 → querysource-4.5.0}/run.py +0 -0
  501. {querysource-4.4.2 → querysource-4.5.0}/rust/pyproject.toml +0 -0
  502. {querysource-4.4.2 → querysource-4.5.0}/rust/src/arangodb_parser.rs +0 -0
  503. {querysource-4.4.2 → querysource-4.5.0}/rust/src/cql_parser.rs +0 -0
  504. {querysource-4.4.2 → querysource-4.5.0}/rust/src/elastic_parser.rs +0 -0
  505. {querysource-4.4.2 → querysource-4.5.0}/rust/src/filter_common.rs +0 -0
  506. {querysource-4.4.2 → querysource-4.5.0}/rust/src/flux_parser.rs +0 -0
  507. {querysource-4.4.2 → querysource-4.5.0}/rust/src/mongo_parser.rs +0 -0
  508. {querysource-4.4.2 → querysource-4.5.0}/rust/src/mssql_parser.rs +0 -0
  509. {querysource-4.4.2 → querysource-4.5.0}/rust/src/parseqs.rs +0 -0
  510. {querysource-4.4.2 → querysource-4.5.0}/rust/src/rethink_parser.rs +0 -0
  511. {querysource-4.4.2 → querysource-4.5.0}/rust/src/soql_parser.rs +0 -0
  512. {querysource-4.4.2 → querysource-4.5.0}/rust/src/validators.rs +0 -0
  513. {querysource-4.4.2 → querysource-4.5.0}/setup.cfg +0 -0
  514. {querysource-4.4.2 → querysource-4.5.0}/setup.py +0 -0
  515. {querysource-4.4.2 → querysource-4.5.0}/static/notebook/bundle.js +0 -0
  516. {querysource-4.4.2 → querysource-4.5.0}/templates/__init__.py +0 -0
  517. {querysource-4.4.2 → querysource-4.5.0}/templates/base.html +0 -0
  518. {querysource-4.4.2 → querysource-4.5.0}/templates/default.html +0 -0
  519. {querysource-4.4.2 → querysource-4.5.0}/templates/default_table.html +0 -0
  520. {querysource-4.4.2 → querysource-4.5.0}/templates/fontlist-v330.json +0 -0
  521. {querysource-4.4.2 → querysource-4.5.0}/templates/fontlist-v390.json +0 -0
  522. {querysource-4.4.2 → querysource-4.5.0}/templates/table_charts.html +0 -0
  523. {querysource-4.4.2 → querysource-4.5.0}/tests/auth/__init__.py +0 -0
  524. {querysource-4.4.2 → querysource-4.5.0}/tests/auth/test_credentials.py +0 -0
  525. {querysource-4.4.2 → querysource-4.5.0}/tests/auth/test_pbac_bootstrap.py +0 -0
  526. {querysource-4.4.2 → querysource-4.5.0}/tests/check_concurrent_get_slug.py +0 -0
  527. {querysource-4.4.2 → querysource-4.5.0}/tests/conftest.py +0 -0
  528. {querysource-4.4.2 → querysource-4.5.0}/tests/datasources/__init__.py +0 -0
  529. {querysource-4.4.2 → querysource-4.5.0}/tests/datasources/test_datasource_view_pbac.py +0 -0
  530. {querysource-4.4.2 → querysource-4.5.0}/tests/datasources/test_driver_factory_session.py +0 -0
  531. {querysource-4.4.2 → querysource-4.5.0}/tests/datasources/test_pg_admin_registration.py +0 -0
  532. {querysource-4.4.2 → querysource-4.5.0}/tests/datasources/test_pg_params_for.py +0 -0
  533. {querysource-4.4.2 → querysource-4.5.0}/tests/handlers/__init__.py +0 -0
  534. {querysource-4.4.2 → querysource-4.5.0}/tests/handlers/conftest.py +0 -0
  535. {querysource-4.4.2 → querysource-4.5.0}/tests/handlers/test_abstract_pbac_helpers.py +0 -0
  536. {querysource-4.4.2 → querysource-4.5.0}/tests/handlers/test_airtable_oauth.py +0 -0
  537. {querysource-4.4.2 → querysource-4.5.0}/tests/handlers/test_multiquery_pbac_smoke.py +0 -0
  538. {querysource-4.4.2 → querysource-4.5.0}/tests/handlers/test_queryexecutor_pbac_smoke.py +0 -0
  539. {querysource-4.4.2 → querysource-4.5.0}/tests/handlers/test_querymanager_pagination.py +0 -0
  540. {querysource-4.4.2 → querysource-4.5.0}/tests/handlers/test_queryservice_pbac_smoke.py +0 -0
  541. {querysource-4.4.2 → querysource-4.5.0}/tests/integration/__init__.py +0 -0
  542. {querysource-4.4.2 → querysource-4.5.0}/tests/integration/test_pbac_credentials.py +0 -0
  543. {querysource-4.4.2 → querysource-4.5.0}/tests/integration/test_pbac_enforcement.py +0 -0
  544. {querysource-4.4.2 → querysource-4.5.0}/tests/integration/test_pbac_listing.py +0 -0
  545. {querysource-4.4.2 → querysource-4.5.0}/tests/interfaces/__init__.py +0 -0
  546. {querysource-4.4.2 → querysource-4.5.0}/tests/interfaces/test_airtable_interface.py +0 -0
  547. {querysource-4.4.2 → querysource-4.5.0}/tests/multi/__init__.py +0 -0
  548. {querysource-4.4.2 → querysource-4.5.0}/tests/multi/sources/__init__.py +0 -0
  549. {querysource-4.4.2 → querysource-4.5.0}/tests/multi/sources/test_airtable_source.py +0 -0
  550. {querysource-4.4.2 → querysource-4.5.0}/tests/multi/sources/test_registry.py +0 -0
  551. {querysource-4.4.2 → querysource-4.5.0}/tests/perf/__init__.py +0 -0
  552. {querysource-4.4.2 → querysource-4.5.0}/tests/perf/test_pbac_overhead.py +0 -0
  553. {querysource-4.4.2 → querysource-4.5.0}/tests/policies/__init__.py +0 -0
  554. {querysource-4.4.2 → querysource-4.5.0}/tests/policies/test_default_policies_load.py +0 -0
  555. {querysource-4.4.2 → querysource-4.5.0}/tests/scheduler/__init__.py +0 -0
  556. {querysource-4.4.2 → querysource-4.5.0}/tests/scheduler/test_parse_trigger_shorthands.py +0 -0
  557. {querysource-4.4.2 → querysource-4.5.0}/tests/scheduler/test_shorthand_loaders.py +0 -0
  558. {querysource-4.4.2 → querysource-4.5.0}/tests/services/__init__.py +0 -0
  559. {querysource-4.4.2 → querysource-4.5.0}/tests/services/test_querysource_setup_pbac.py +0 -0
  560. {querysource-4.4.2 → querysource-4.5.0}/tests/test_abstract_multi.py +0 -0
  561. {querysource-4.4.2 → querysource-4.5.0}/tests/test_abstract_refactor.py +0 -0
  562. {querysource-4.4.2 → querysource-4.5.0}/tests/test_api.py +0 -0
  563. {querysource-4.4.2 → querysource-4.5.0}/tests/test_arangodb_parser.py +0 -0
  564. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_colcols.py +0 -0
  565. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_correlation.py +0 -0
  566. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_filter.py +0 -0
  567. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_forecast.py +0 -0
  568. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_googlemaps.py +0 -0
  569. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_groupby.py +0 -0
  570. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_map.py +0 -0
  571. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_pivot.py +0 -0
  572. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_remote.py +0 -0
  573. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_texplode.py +0 -0
  574. {querysource-4.4.2 → querysource-4.5.0}/tests/test_catalog_torder.py +0 -0
  575. {querysource-4.4.2 → querysource-4.5.0}/tests/test_cli_generate_docs.py +0 -0
  576. {querysource-4.4.2 → querysource-4.5.0}/tests/test_column_filters.py +0 -0
  577. {querysource-4.4.2 → querysource-4.5.0}/tests/test_component_handler.py +0 -0
  578. {querysource-4.4.2 → querysource-4.5.0}/tests/test_component_registry.py +0 -0
  579. {querysource-4.4.2 → querysource-4.5.0}/tests/test_conf_airtable.py +0 -0
  580. {querysource-4.4.2 → querysource-4.5.0}/tests/test_destination_base.py +0 -0
  581. {querysource-4.4.2 → querysource-4.5.0}/tests/test_destination_dwh.py +0 -0
  582. {querysource-4.4.2 → querysource-4.5.0}/tests/test_destination_integration.py +0 -0
  583. {querysource-4.4.2 → querysource-4.5.0}/tests/test_destination_s3.py +0 -0
  584. {querysource-4.4.2 → querysource-4.5.0}/tests/test_destination_sharepoint.py +0 -0
  585. {querysource-4.4.2 → querysource-4.5.0}/tests/test_destination_table.py +0 -0
  586. {querysource-4.4.2 → querysource-4.5.0}/tests/test_destinations_documentation_endpoint.py +0 -0
  587. {querysource-4.4.2 → querysource-4.5.0}/tests/test_elastic_parser.py +0 -0
  588. {querysource-4.4.2 → querysource-4.5.0}/tests/test_eval.py +0 -0
  589. {querysource-4.4.2 → querysource-4.5.0}/tests/test_info_eda.py +0 -0
  590. {querysource-4.4.2 → querysource-4.5.0}/tests/test_info_eda_e2e.py +0 -0
  591. {querysource-4.4.2 → querysource-4.5.0}/tests/test_info_eda_integration.py +0 -0
  592. {querysource-4.4.2 → querysource-4.5.0}/tests/test_join_conditions.py +0 -0
  593. {querysource-4.4.2 → querysource-4.5.0}/tests/test_join_with_column_filter.py +0 -0
  594. {querysource-4.4.2 → querysource-4.5.0}/tests/test_local_executor.py +0 -0
  595. {querysource-4.4.2 → querysource-4.5.0}/tests/test_multi_destinations_subpackage.py +0 -0
  596. {querysource-4.4.2 → querysource-4.5.0}/tests/test_multiqs_column_transforms.py +0 -0
  597. {querysource-4.4.2 → querysource-4.5.0}/tests/test_multiqs_destination_dispatch.py +0 -0
  598. {querysource-4.4.2 → querysource-4.5.0}/tests/test_multiqs_remote_dispatch.py +0 -0
  599. {querysource-4.4.2 → querysource-4.5.0}/tests/test_multiqs_sources_integration.py +0 -0
  600. {querysource-4.4.2 → querysource-4.5.0}/tests/test_queryslug_concurrency.py +0 -0
  601. {querysource-4.4.2 → querysource-4.5.0}/tests/test_querysource_setup_airtable.py +0 -0
  602. {querysource-4.4.2 → querysource-4.5.0}/tests/test_qworker_config.py +0 -0
  603. {querysource-4.4.2 → querysource-4.5.0}/tests/test_remote_executor.py +0 -0
  604. {querysource-4.4.2 → querysource-4.5.0}/tests/test_route_registration.py +0 -0
  605. {querysource-4.4.2 → querysource-4.5.0}/tests/test_rss.py +0 -0
  606. {querysource-4.4.2 → querysource-4.5.0}/tests/test_rust_parsers.py +0 -0
  607. {querysource-4.4.2 → querysource-4.5.0}/tests/test_scheduler_core.py +0 -0
  608. {querysource-4.4.2 → querysource-4.5.0}/tests/test_scheduler_handler_integration.py +0 -0
  609. {querysource-4.4.2 → querysource-4.5.0}/tests/test_scheduler_handler_unit.py +0 -0
  610. {querysource-4.4.2 → querysource-4.5.0}/tests/test_scheduler_integration.py +0 -0
  611. {querysource-4.4.2 → querysource-4.5.0}/tests/test_scheduler_jobs.py +0 -0
  612. {querysource-4.4.2 → querysource-4.5.0}/tests/test_scheduler_multi_routing.py +0 -0
  613. {querysource-4.4.2 → querysource-4.5.0}/tests/test_scheduler_notifications.py +0 -0
  614. {querysource-4.4.2 → querysource-4.5.0}/tests/test_schema_introspectable.py +0 -0
  615. {querysource-4.4.2 → querysource-4.5.0}/tests/test_source_registry.py +0 -0
  616. {querysource-4.4.2 → querysource-4.5.0}/tests/test_source_s3.py +0 -0
  617. {querysource-4.4.2 → querysource-4.5.0}/tests/test_source_sharepoint.py +0 -0
  618. {querysource-4.4.2 → querysource-4.5.0}/tests/test_source_smartsheet.py +0 -0
  619. {querysource-4.4.2 → querysource-4.5.0}/tests/test_source_table.py +0 -0
  620. {querysource-4.4.2 → querysource-4.5.0}/tests/test_sql_parser_combinations.py +0 -0
  621. {querysource-4.4.2 → querysource-4.5.0}/tests/test_texplode.py +0 -0
  622. {querysource-4.4.2 → querysource-4.5.0}/tests/test_thread_file_refactor.py +0 -0
  623. {querysource-4.4.2 → querysource-4.5.0}/tests/test_thread_query_refactor.py +0 -0
  624. {querysource-4.4.2 → querysource-4.5.0}/tests/test_thread_source_base.py +0 -0
  625. {querysource-4.4.2 → querysource-4.5.0}/tests/test_threadquery_executor.py +0 -0
  626. {querysource-4.4.2 → querysource-4.5.0}/tests/test_zammad_search.py +0 -0
  627. {querysource-4.4.2 → querysource-4.5.0}/tox.ini +0 -0
@@ -1,7 +1,7 @@
1
1
  # QuerySource Makefile
2
2
  # This Makefile provides a set of commands to manage the QuerySource project.
3
3
 
4
- .PHONY: venv install develop setup dev release format lint test clean distclean lock sync build-rust
4
+ .PHONY: venv install develop setup dev release format lint test clean distclean lock sync build-rust stage-rust
5
5
 
6
6
  # Python version to use
7
7
  PYTHON_VERSION := 3.11
@@ -38,6 +38,7 @@ endif
38
38
  # Install all dependencies including dev dependencies
39
39
  develop: build-rust
40
40
  uv sync --frozen --extra analytics --extra dev
41
+ $(MAKE) build-inplace
41
42
 
42
43
  # Build the Rust-accelerated parser extension (querysource.qs_parsers._qs_parsers)
43
44
  # Use --manifest-path so maturin reads rust/pyproject.toml (build-backend = maturin),
@@ -47,6 +48,25 @@ build-rust:
47
48
  @command -v maturin >/dev/null 2>&1 || uv pip install maturin
48
49
  maturin develop --release --manifest-path rust/Cargo.toml
49
50
 
51
+ # Stage the compiled Rust extension (.so) INTO the source tree so that
52
+ # `uv build` (setuptools backend) bundles it into the wheel. setuptools only
53
+ # packages a pre-existing artifact via package-data
54
+ # ("querysource.qs_parsers" = ["*.so", "*.pyd"]); it never invokes maturin.
55
+ # `maturin develop` installs into the venv (site-packages), NOT the source
56
+ # tree, so the wheel would otherwise ship without the Rust extension.
57
+ RUST_WHEEL_OUT := target/wheels
58
+ stage-rust:
59
+ @command -v maturin >/dev/null 2>&1 || uv pip install maturin
60
+ maturin build --release -i python --manifest-path rust/Cargo.toml --out $(RUST_WHEEL_OUT)
61
+ @whl=$$(ls -t $(RUST_WHEEL_OUT)/qs_parsers-*.whl | head -1); \
62
+ test -n "$$whl" || { echo "ERROR: maturin produced no wheel in $(RUST_WHEEL_OUT)"; exit 1; }; \
63
+ echo "Staging Rust extension from $$whl"; \
64
+ tmp=$$(mktemp -d); \
65
+ unzip -o -q "$$whl" -d "$$tmp"; \
66
+ find "$$tmp" -name '_qs_parsers*.so' -exec cp {} querysource/qs_parsers/ \; ; \
67
+ rm -rf "$$tmp"; \
68
+ ls -la querysource/qs_parsers/_qs_parsers*.so
69
+
50
70
  # Alternative: install without lock file (faster for development)
51
71
  develop-fast:
52
72
  uv pip install -e .[analytics,dev]
@@ -113,8 +133,13 @@ build-inplace:
113
133
  @echo "Building Cython extensions in place..."
114
134
  python setup.py build_ext --inplace
115
135
 
116
- # Full build using uv
136
+ # Full build using uv.
137
+ # Order matters: `clean` wipes every *.so, so the Rust extension must be
138
+ # (re)staged AFTER clean and BEFORE `uv build` packages the wheel. Running
139
+ # stage-rust from the recipe (not as a prerequisite) guarantees that order
140
+ # even under `make -j`.
117
141
  build: clean
142
+ $(MAKE) stage-rust
118
143
  @echo "Building package with uv..."
119
144
  uv build
120
145
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: querysource
3
- Version: 4.4.2
3
+ Version: 4.5.0
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
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "NormalizeColumns",
3
+ "category": "Transformations",
4
+ "description": "Normalize every column name into a database-safe identifier (lowercase, accent-stripped, symbols collapsed to an underscore, truncated to a maximum length, collisions de-duplicated).",
5
+ "usage": "Drop it as a ``Transform`` step before a table/database destination. With no parameters it applies safe defaults (lowercase, strip accents, 63-byte max). Use ``overrides`` to pin specific source columns to an exact target name.",
6
+ "attributes": [
7
+ {
8
+ "name": "max_length",
9
+ "type": "int",
10
+ "default": 63,
11
+ "required": false,
12
+ "description": "Maximum identifier length. Defaults to 63 (the PostgreSQL identifier byte limit)."
13
+ },
14
+ {
15
+ "name": "case",
16
+ "type": "str",
17
+ "default": "lower",
18
+ "required": false,
19
+ "description": "Case handling: \"lower\", \"upper\" or \"preserve\"."
20
+ },
21
+ {
22
+ "name": "strip_accents",
23
+ "type": "bool",
24
+ "default": true,
25
+ "required": false,
26
+ "description": "Remove diacritics (\"Regi\u00f3n\" -> \"region\")."
27
+ },
28
+ {
29
+ "name": "replacement",
30
+ "type": "str",
31
+ "default": "_",
32
+ "required": false,
33
+ "description": "String that replaces runs of non-alphanumeric characters."
34
+ },
35
+ {
36
+ "name": "overrides",
37
+ "type": "dict",
38
+ "default": null,
39
+ "required": false,
40
+ "description": "Mapping {original_name: target_name} pinning specific source columns to an exact name, bypassing normalization for those columns."
41
+ }
42
+ ],
43
+ "json_schema": {
44
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
45
+ "title": "NormalizeColumns",
46
+ "type": "object",
47
+ "properties": {
48
+ "max_length": {
49
+ "type": "integer",
50
+ "description": "Maximum identifier length. Defaults to 63 (the PostgreSQL identifier byte limit).",
51
+ "default": 63
52
+ },
53
+ "case": {
54
+ "type": "string",
55
+ "description": "Case handling: \"lower\", \"upper\" or \"preserve\".",
56
+ "default": "lower"
57
+ },
58
+ "strip_accents": {
59
+ "type": "boolean",
60
+ "description": "Remove diacritics (\"Regi\u00f3n\" -> \"region\").",
61
+ "default": true
62
+ },
63
+ "replacement": {
64
+ "type": "string",
65
+ "description": "String that replaces runs of non-alphanumeric characters.",
66
+ "default": "_"
67
+ },
68
+ "overrides": {
69
+ "type": "object",
70
+ "description": "Mapping {original_name: target_name} pinning specific source columns to an exact name, bypassing normalization for those columns."
71
+ }
72
+ },
73
+ "additionalProperties": true,
74
+ "description": "Normalize all column names into database-safe identifiers. All attributes are optional; with no parameters safe defaults are applied."
75
+ },
76
+ "example": "{\"Transform\": [{\"NormalizeColumns\": {}}]}",
77
+ "icon": "shuffle"
78
+ }
@@ -71,6 +71,6 @@
71
71
  },
72
72
  "required": []
73
73
  },
74
- "example": "{\n \"credentials\": {\n \"region_name\": \"AWS_REGION_NAME\", # navconfig var or literal\n \"bucket\": \"AWS_PLACER_BUCKET\",\n \"aws_key\": \"AWS_ACCESS_KEY_ID\",\n \"aws_secret\": \"AWS_SECRET_ACCESS_KEY\"\n },\n \"source\": {\n \"file\": \"metrics_2024-12-09_0003.csv.gz\",\n \"directory\": \"placer-analytics/bulk-export/\"\n }\n}",
74
+ "example": "{\n \"credentials\": {\n \"region_name\": \"AWS_REGION_NAME\",\n \"bucket\": \"AWS_PLACER_BUCKET\",\n \"aws_key\": \"AWS_ACCESS_KEY_ID\",\n \"aws_secret\": \"AWS_SECRET_ACCESS_KEY\"\n },\n \"source\": {\n \"file\": \"metrics_2024-12-09_0003.csv.gz\",\n \"directory\": \"placer-analytics/bulk-export/\"\n }\n}",
75
75
  "icon": "database"
76
76
  }
@@ -32,6 +32,13 @@
32
32
  "required": false,
33
33
  "description": ""
34
34
  },
35
+ {
36
+ "name": "credentials.tenant_host",
37
+ "type": "Any",
38
+ "default": "",
39
+ "required": false,
40
+ "description": ""
41
+ },
35
42
  {
36
43
  "name": "credentials.site",
37
44
  "type": "Any",
@@ -52,6 +59,20 @@
52
59
  "default": "",
53
60
  "required": false,
54
61
  "description": ""
62
+ },
63
+ {
64
+ "name": "source.sheet_name",
65
+ "type": "Any",
66
+ "default": 0,
67
+ "required": false,
68
+ "description": ""
69
+ },
70
+ {
71
+ "name": "source.pd_args",
72
+ "type": "Any",
73
+ "default": {},
74
+ "required": false,
75
+ "description": ""
55
76
  }
56
77
  ],
57
78
  "json_schema": {
@@ -66,6 +87,7 @@
66
87
  "client_secret": {},
67
88
  "tenant_id": {},
68
89
  "tenant_name": {},
90
+ "tenant_host": {},
69
91
  "site": {}
70
92
  }
71
93
  },
@@ -73,12 +95,14 @@
73
95
  "type": "object",
74
96
  "properties": {
75
97
  "filename": {},
76
- "directory": {}
98
+ "directory": {},
99
+ "sheet_name": {},
100
+ "pd_args": {}
77
101
  }
78
102
  }
79
103
  },
80
104
  "required": []
81
105
  },
82
- "example": "{\n \"credentials\": {\n \"client_id\": \"SHAREPOINT_APP_ID\", # navconfig var or literal\n \"client_secret\": \"SHAREPOINT_APP_SECRET\",\n \"tenant_id\": \"SHAREPOINT_TENANT_ID\",\n \"tenant_name\": \"mytenant\", # optional, defaults to \"sharepoint\"\n \"site\": \"Roadshows\"\n },\n \"source\": {\n \"filename\": \"2025 Events Master Schedule.xlsx\",\n \"directory\": \"Shared Documents/General/Schedule\"\n }\n}",
106
+ "example": "{\n \"credentials\": {\n \"client_id\": \"SHAREPOINT_APP_ID\",\n \"client_secret\": \"SHAREPOINT_APP_SECRET\",\n \"tenant_id\": \"SHAREPOINT_TENANT_ID\",\n \"tenant_name\": \"mytenant\",\n \"site\": \"Roadshows\"\n },\n \"source\": {\n \"filename\": \"2025 Events Master Schedule.xlsx\",\n \"directory\": \"Shared Documents/General/Schedule\"\n }\n}",
83
107
  "icon": "database"
84
108
  }
@@ -42,6 +42,6 @@
42
42
  },
43
43
  "required": []
44
44
  },
45
- "example": "{\n \"credentials\": {\n \"api_key\": \"SMARTSHEET_API_KEY\" # navconfig var or literal\n },\n \"source\": {\n \"file_id\": 8504624500658052\n }\n}",
45
+ "example": "{\n \"credentials\": {\n \"api_key\": \"SMARTSHEET_API_KEY\"\n },\n \"source\": {\n \"file_id\": 8504624500658052\n }\n}",
46
46
  "icon": "database"
47
47
  }
@@ -40,6 +40,6 @@
40
40
  "table"
41
41
  ]
42
42
  },
43
- "example": "{\n \"driver\": \"pg\",\n \"schema\": \"troc\",\n \"table\": \"stores\",\n \"filter\": {\"active\": true},\n \"credentials\": { # optional\n \"host\": \"localhost\",\n \"port\": 5432,\n \"user\": \"myuser\",\n \"password\": \"mypassword\",\n \"database\": \"mydb\"\n }\n}",
43
+ "example": "{\n \"driver\": \"pg\",\n \"schema\": \"troc\",\n \"table\": \"stores\",\n \"filter\": {\n \"active\": true\n },\n \"credentials\": {\n \"host\": \"localhost\",\n \"port\": 5432,\n \"user\": \"myuser\",\n \"password\": \"mypassword\",\n \"database\": \"mydb\"\n }\n}",
44
44
  "icon": "database"
45
45
  }
@@ -33,6 +33,6 @@
33
33
  },
34
34
  "required": []
35
35
  },
36
- "example": "Output:\n - ToSharepoint:\n credentials:\n client_id: SHAREPOINT_APP_ID\n client_secret: SHAREPOINT_APP_SECRET\n tenant_id: SHAREPOINT_TENANT_ID\n site: Roadshows\n destination:\n filename: \"2025 Events Master Schedule.xlsx\"\n directory: \"Shared Documents/General/Schedule\"",
36
+ "example": "{\n \"Output\": [\n {\n \"ToSharepoint\": {\n \"credentials\": {\n \"client_id\": \"SHAREPOINT_APP_ID\",\n \"client_secret\": \"SHAREPOINT_APP_SECRET\",\n \"tenant_id\": \"SHAREPOINT_TENANT_ID\",\n \"site\": \"Roadshows\"\n },\n \"destination\": {\n \"filename\": \"2025 Events Master Schedule.xlsx\",\n \"directory\": \"Shared Documents/General/Schedule\"\n }\n }\n }\n ]\n}",
37
37
  "icon": "upload-cloud"
38
38
  }
@@ -0,0 +1,230 @@
1
+ # QuerySource PBAC — Política de Endurecimiento
2
+
3
+ Guía para migrar desde la *baseline permisiva* (`baseline.yaml`) hacia un control
4
+ de acceso de mínimo privilegio, sin interrumpir la operación en ningún paso.
5
+
6
+ > Aplica con `QS_PBAC_ENABLED=True`. Todos los archivos `policies/*.yaml` se
7
+ > fusionan en un único conjunto al arranque. Cambiar un YAML requiere
8
+ > **reiniciar el servicio** (o disparar un `reload()` explícito).
9
+
10
+ ---
11
+
12
+ ## 1. Reglas del motor (lo que debes tener presente)
13
+
14
+ Por cada request QS evalúa `(resource_type, resource_name, action)`. El motor Rust
15
+ (`rs_pep`) decide así:
16
+
17
+ 1. Conserva las políticas que matchean **tenant + resource + action + subject + environment**.
18
+ 2. **`enforcing: true`** → la primera que matchea (mayor `priority`) decide al instante.
19
+ 3. Si no hay enforcing → gana el mejor `allow` vs. el mejor `deny`:
20
+ **el allow gana solo si su `priority` es estrictamente mayor; el deny gana en empate.**
21
+ 4. Si nada matchea → `ABAC_DEFAULT_EFFECT` (env, default **`deny`**).
22
+
23
+ Capa del handler QS: **sin sesión autenticada → 404 siempre** (fail-closed),
24
+ independientemente de las políticas.
25
+
26
+ ### Semántica de matching
27
+
28
+ | Campo | Vacío / omitido | Comodín | Notas |
29
+ |-------|-----------------|---------|-------|
30
+ | `resources` | matchea **todos** | `"*"` o `"*:*"` | debe ser `tipo:patrón`; glob (`*` `?`) y regex. Un token sin `:` **no matchea nada**. |
31
+ | `actions` | matchea **todas** | `"*"` | exacto o `*`. |
32
+ | `subjects` | `groups`+`users`+`roles` vacíos → **todos** | `groups: ["*"]` → todos | `exclude_*` se evalúa primero: pertenecer = no-match inmediato. |
33
+
34
+ **Tipos de recurso**: `slug`, `datasource`, `driver`, `raw_query`.
35
+ **Acciones en uso**: `slug:execute`, `slug:list`, `slug:read`, `datasource:use`,
36
+ `datasource:list`, `driver:use`, `driver:list`, `raw_query:execute`.
37
+
38
+ > `effect` debe ir en **minúsculas** (`allow` / `deny`).
39
+
40
+ ---
41
+
42
+ ## 2. Estrategia de endurecimiento progresivo
43
+
44
+ La baseline (`authenticated_allow_all`, priority 1, non-enforcing) es un **piso**.
45
+ Endurecer = colocar políticas con **priority mayor** que la corrijan, en este orden:
46
+
47
+ ```
48
+ priority 100 enforcing → admin_full_access (intocable; admins siempre pasan)
49
+ priority 90 enforcing → service accounts (CI/CD, bots)
50
+ priority 50 → deny duros (raw_query, recursos sensibles)
51
+ priority 30 → allow específicos (grupo ↔ recurso)
52
+ priority 1 non-enforc → authenticated_allow_all (baseline; se elimina al final)
53
+ ```
54
+
55
+ **Tácticas clave (derivadas de las reglas del motor):**
56
+
57
+ - **Deny gana en empate** → para prohibir algo a *casi* todos pero permitir a un
58
+ grupo, da al `allow` una `priority` mayor que la del `deny` (no igual).
59
+ - **`enforcing: true` corta** → úsalo solo para reglas absolutas (admin, o un
60
+ deny de cumplimiento que nadie debe poder sobreescribir). No lo uses en reglas
61
+ que quieras poder matizar después.
62
+ - **Migra por recurso**, no de golpe: añade políticas explícitas, observa los
63
+ `PBAC denied` en logs, y solo cuando todo grupo legítimo tenga su `allow`
64
+ explícito, **elimina `baseline.yaml`** (ese borrado es el que activa el
65
+ mínimo privilegio real: lo no permitido pasa a deny por default).
66
+
67
+ ---
68
+
69
+ ## 3. Ejemplos de políticas de endurecimiento
70
+
71
+ ### 3.1 Bloquear raw queries para todos salvo data-engineers
72
+
73
+ `raw_queries.yaml`:
74
+
75
+ ```yaml
76
+ version: "1.0"
77
+ defaults:
78
+ effect: deny
79
+ policies:
80
+ # Deny duro para cualquiera: tapa la baseline (priority 1).
81
+ - name: deny_raw_queries_default
82
+ effect: deny
83
+ description: "Las raw queries (SQL inline) están prohibidas por defecto."
84
+ resources: ["raw_query:*"]
85
+ actions: ["raw_query:execute"]
86
+ subjects:
87
+ groups: ["*"]
88
+ priority: 40
89
+
90
+ # Excepción: data-engineers SÍ pueden. priority > deny → el allow gana.
91
+ - name: allow_raw_queries_data_engineers
92
+ effect: allow
93
+ description: "Data engineers pueden ejecutar raw queries."
94
+ resources: ["raw_query:*"]
95
+ actions: ["raw_query:execute"]
96
+ subjects:
97
+ groups: ["data-engineers"]
98
+ priority: 50
99
+ ```
100
+
101
+ ### 3.2 Restringir un grupo a slugs con cierto prefijo
102
+
103
+ `slugs.yaml`:
104
+
105
+ ```yaml
106
+ version: "1.0"
107
+ defaults:
108
+ effect: deny
109
+ policies:
110
+ # Analysts solo ven/ejecutan slugs "finance_*".
111
+ - name: analysts_finance_slugs
112
+ effect: allow
113
+ description: "Analysts ejecutan y listan únicamente slugs finance_*."
114
+ resources: ["slug:finance_*"]
115
+ actions: ["slug:execute", "slug:list", "slug:read"]
116
+ subjects:
117
+ groups: ["analysts"]
118
+ priority: 30
119
+
120
+ # Cualquier slug que NO sea finance_* queda denegado para analysts.
121
+ - name: analysts_deny_other_slugs
122
+ effect: deny
123
+ description: "Analysts no acceden a slugs fuera de finance_*."
124
+ resources: ["slug:*"]
125
+ actions: ["slug:execute", "slug:list", "slug:read"]
126
+ subjects:
127
+ groups: ["analysts"]
128
+ priority: 35 # > 30: este deny gana sobre la baseline y acota el allow anterior
129
+ ```
130
+
131
+ > Mientras `baseline.yaml` siga presente, los analysts conservan acceso amplio por
132
+ > el piso (priority 1) salvo donde un deny de mayor priority los acote. El recorte
133
+ > total ocurre al **eliminar la baseline**.
134
+
135
+ ### 3.3 Datasource/driver sensible: solo lectura para un grupo
136
+
137
+ `datasources.yaml`:
138
+
139
+ ```yaml
140
+ version: "1.0"
141
+ defaults:
142
+ effect: deny
143
+ policies:
144
+ - name: deny_prod_db_default
145
+ effect: deny
146
+ description: "El datasource de producción está vetado por defecto."
147
+ resources: ["datasource:prod_*"]
148
+ actions: ["datasource:use", "datasource:list"]
149
+ subjects:
150
+ groups: ["*"]
151
+ priority: 40
152
+
153
+ - name: allow_prod_db_reporting
154
+ effect: allow
155
+ description: "Solo el grupo reporting usa los datasources prod_*."
156
+ resources: ["datasource:prod_*"]
157
+ actions: ["datasource:use", "datasource:list"]
158
+ subjects:
159
+ groups: ["reporting"]
160
+ exclude_groups: ["contractors"] # ni siquiera si están en reporting
161
+ priority: 50
162
+ ```
163
+
164
+ ### 3.4 Cuenta de servicio (CI/CD) — acceso total, inamovible
165
+
166
+ `superusers.yaml`:
167
+
168
+ ```yaml
169
+ version: "1.0"
170
+ defaults:
171
+ effect: deny
172
+ policies:
173
+ - name: service_account_ci
174
+ effect: allow
175
+ description: "Cuenta de servicio de CI/CD con acceso total."
176
+ resources: ["*:*"]
177
+ actions: ["*"]
178
+ subjects:
179
+ users: ["ci-service@acme.com"]
180
+ priority: 90
181
+ enforcing: true # corta: ninguna política posterior puede degradarla
182
+ ```
183
+
184
+ ### 3.5 Restricción por atributo de entorno (horario laboral)
185
+
186
+ ```yaml
187
+ - name: analysts_business_hours_only
188
+ effect: allow
189
+ description: "Analysts ejecutan slugs solo en horario laboral."
190
+ resources: ["slug:*"]
191
+ actions: ["slug:execute"]
192
+ subjects:
193
+ groups: ["analysts"]
194
+ conditions:
195
+ environment:
196
+ is_business_hours: true # atributos disponibles: hour, dow,
197
+ # is_business_hours, is_weekend, day_segment
198
+ priority: 30
199
+ ```
200
+
201
+ ---
202
+
203
+ ## 4. Procedimiento de corte (de baseline a mínimo privilegio)
204
+
205
+ 1. **Inventaria** grupos y los recursos que cada uno usa hoy.
206
+ 2. Por cada recurso sensible, añade su `deny` (priority 40) + los `allow`
207
+ específicos (priority 30/50) — la baseline sigue de red de seguridad.
208
+ 3. Despliega, **reinicia**, y vigila los logs `PBAC denied` (info-level) y los
209
+ patrones de uso reales durante un periodo de observación.
210
+ 4. Cuando **todo grupo legítimo tenga su `allow` explícito**, elimina
211
+ `baseline.yaml` y reinicia. A partir de aquí, lo no permitido = **deny** por
212
+ default → mínimo privilegio efectivo.
213
+ 5. (Opcional) revisa que `ABAC_DEFAULT_EFFECT` siga en `deny`.
214
+
215
+ ## 5. Verificación
216
+
217
+ Validar sintaxis y resumen de políticas cargadas:
218
+
219
+ ```bash
220
+ python3 -c "
221
+ import yaml, glob
222
+ for f in sorted(glob.glob('policies/*.yaml')):
223
+ d = yaml.safe_load(open(f)) or {}
224
+ for p in d.get('policies', []):
225
+ print(f\"{p['priority']:>4} {'ENF' if p.get('enforcing') else ' '} \"
226
+ f\"{p['effect']:<5} {p['name']:<35} {p['resources']}\")
227
+ " | sort -rn
228
+ ```
229
+
230
+ Lee de mayor a menor priority: así ves el orden real de resolución.
@@ -0,0 +1,35 @@
1
+ version: "1.0"
2
+
3
+ defaults:
4
+ effect: deny
5
+
6
+ # ─── Soft baseline ──────────────────────────────────────────────────────────
7
+ # Permite que QS_PBAC_ENABLED=True opere SIN hard-enforcement: cualquier usuario
8
+ # autenticado puede usar todos los recursos de QuerySource. Los anónimos siguen
9
+ # bloqueados (fail-closed en el handler → 404).
10
+ #
11
+ # Es un PISO, no un override: priority baja + enforcing:false para que cualquier
12
+ # política posterior (deny o un allow más específico, con priority mayor) la
13
+ # sobreescriba sin necesidad de borrar este archivo. El deny gana en empate; el
14
+ # allow necesita priority estrictamente mayor.
15
+ #
16
+ # Para endurecer un recurso: añade un `deny` (o un `allow` más estrecho) con
17
+ # priority > 1 en el archivo de ese recurso (slugs.yaml, datasources.yaml, …).
18
+ # Cuando termines de migrar a políticas explícitas, elimina este archivo.
19
+ # ────────────────────────────────────────────────────────────────────────────
20
+ policies:
21
+ - name: authenticated_allow_all
22
+ effect: allow
23
+ description: >
24
+ Soft baseline: any authenticated user may use all QuerySource resources.
25
+ Lowest priority and non-enforcing so specific deny/allow policies override
26
+ it without removing this file. Anonymous requests are still denied (404).
27
+ resources:
28
+ - "*:*"
29
+ actions:
30
+ - "*"
31
+ subjects:
32
+ groups:
33
+ - "*"
34
+ priority: 1
35
+ enforcing: false
@@ -14,7 +14,7 @@ policies:
14
14
  - "slug:*"
15
15
  - "datasource:*"
16
16
  - "driver:*"
17
- - "raw_query"
17
+ - "raw_query:*"
18
18
  actions:
19
19
  - "slug:execute"
20
20
  - "slug:list"
@@ -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.4.3.dev0+g7613ad3de.d20260608'
22
- __version_tuple__ = version_tuple = (4, 4, 3, 'dev0', 'g7613ad3de.d20260608')
21
+ __version__ = version = '4.5.1.dev0+gfd354d0c9.d20260619'
22
+ __version_tuple__ = version_tuple = (4, 5, 1, 'dev0', 'gfd354d0c9.d20260619')
23
23
 
24
- __commit_id__ = commit_id = 'g7613ad3de'
24
+ __commit_id__ = commit_id = 'gfd354d0c9'
@@ -366,6 +366,16 @@ DEFAULT_QUERY_FORMAT = config.get(
366
366
  fallback='native'
367
367
  )
368
368
 
369
+ ## Query parameters that must never reach the query parser.
370
+ # Authentication/transport-related params (e.g. ?auth=..., ?apikey=...) get
371
+ # appended to API URLs by upstream gateways/clients and would otherwise be
372
+ # interpreted as query conditions/filters by QuerySource and MultiQuery.
373
+ # Configurable via the EXCLUDED_QUERY_PARAMETERS env var (comma-separated).
374
+ # Matched case-insensitively against query-parameter names.
375
+ EXCLUDED_QUERY_PARAMETERS: set = {
376
+ p.strip().lower() for p in config.getlist('EXCLUDED_QUERY_PARAMETERS') if p.strip()
377
+ } or {'auth', 'apikey', 'api_key', 'authorization'}
378
+
369
379
  ## Geoloc Support:
370
380
  GEOLOC_API_KEY = config.get('GEOLOC_API_KEY')
371
381