querysource 4.1.12__tar.gz → 4.2.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 (437) hide show
  1. {querysource-4.1.12/querysource.egg-info → querysource-4.2.0}/PKG-INFO +1 -1
  2. {querysource-4.1.12 → querysource-4.2.0}/app.py +9 -6
  3. querysource-4.2.0/policies/datasources.yaml +24 -0
  4. querysource-4.2.0/policies/defaults.yaml +31 -0
  5. querysource-4.2.0/policies/drivers.yaml +24 -0
  6. querysource-4.2.0/policies/raw_queries.yaml +24 -0
  7. querysource-4.2.0/policies/slugs.yaml +24 -0
  8. querysource-4.2.0/policies/superusers.yaml +33 -0
  9. {querysource-4.1.12 → querysource-4.2.0}/pyproject.toml +6 -0
  10. {querysource-4.1.12 → querysource-4.2.0}/pytest.ini +2 -0
  11. {querysource-4.1.12 → querysource-4.2.0}/querysource/_version.py +3 -3
  12. querysource-4.2.0/querysource/auth/__init__.py +21 -0
  13. querysource-4.2.0/querysource/auth/_resource_types.py +48 -0
  14. querysource-4.2.0/querysource/auth/credentials.py +224 -0
  15. querysource-4.2.0/querysource/auth/pbac.py +149 -0
  16. {querysource-4.1.12 → querysource-4.2.0}/querysource/conf.py +5 -0
  17. {querysource-4.1.12 → querysource-4.2.0}/querysource/connections.py +6 -8
  18. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/__init__.py +5 -0
  19. querysource-4.2.0/querysource/datasources/drivers/pg.py +124 -0
  20. querysource-4.2.0/querysource/datasources/drivers/pg_admin.py +44 -0
  21. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/postgres.py +1 -0
  22. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/handlers/datasource.py +88 -0
  23. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/abstract.py +141 -0
  24. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/executor.py +60 -0
  25. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/multi.py +110 -5
  26. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/service.py +31 -0
  27. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/connections.py +61 -14
  28. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/queries.py +6 -8
  29. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/bigquery.c +0 -1
  30. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/cql.c +170 -191
  31. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/deltatbl.c +176 -197
  32. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/iceberg.c +173 -194
  33. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/pgsql.c +148 -169
  34. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/sosql.c +167 -188
  35. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/sql.c +3111 -2429
  36. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/sql.pxd +0 -1
  37. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/sql.pyx +82 -12
  38. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/sqlserver.c +150 -171
  39. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/__init__.py +3 -0
  40. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/obj.py +25 -3
  41. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/qs.py +29 -3
  42. {querysource-4.1.12 → querysource-4.2.0}/querysource/services.py +56 -7
  43. {querysource-4.1.12 → querysource-4.2.0}/querysource/version.py +1 -1
  44. {querysource-4.1.12 → querysource-4.2.0/querysource.egg-info}/PKG-INFO +1 -1
  45. {querysource-4.1.12 → querysource-4.2.0}/querysource.egg-info/SOURCES.txt +36 -1
  46. {querysource-4.1.12 → querysource-4.2.0}/rust/src/sql_parser.rs +127 -10
  47. querysource-4.2.0/tests/auth/test_credentials.py +145 -0
  48. querysource-4.2.0/tests/auth/test_pbac_bootstrap.py +121 -0
  49. querysource-4.2.0/tests/conftest.py +177 -0
  50. querysource-4.2.0/tests/datasources/__init__.py +0 -0
  51. querysource-4.2.0/tests/datasources/test_datasource_view_pbac.py +119 -0
  52. querysource-4.2.0/tests/datasources/test_driver_factory_session.py +206 -0
  53. querysource-4.2.0/tests/datasources/test_pg_admin_registration.py +39 -0
  54. querysource-4.2.0/tests/datasources/test_pg_params_for.py +95 -0
  55. querysource-4.2.0/tests/handlers/__init__.py +0 -0
  56. querysource-4.2.0/tests/handlers/test_abstract_pbac_helpers.py +229 -0
  57. querysource-4.2.0/tests/handlers/test_multiquery_pbac_smoke.py +149 -0
  58. querysource-4.2.0/tests/handlers/test_queryexecutor_pbac_smoke.py +113 -0
  59. querysource-4.2.0/tests/handlers/test_queryservice_pbac_smoke.py +75 -0
  60. querysource-4.2.0/tests/integration/__init__.py +0 -0
  61. querysource-4.2.0/tests/integration/test_pbac_credentials.py +172 -0
  62. querysource-4.2.0/tests/integration/test_pbac_enforcement.py +314 -0
  63. querysource-4.2.0/tests/integration/test_pbac_listing.py +196 -0
  64. querysource-4.2.0/tests/perf/__init__.py +0 -0
  65. querysource-4.2.0/tests/perf/test_pbac_overhead.py +183 -0
  66. querysource-4.2.0/tests/policies/__init__.py +0 -0
  67. querysource-4.2.0/tests/policies/test_default_policies_load.py +108 -0
  68. querysource-4.2.0/tests/services/__init__.py +0 -0
  69. querysource-4.2.0/tests/services/test_querysource_setup_pbac.py +50 -0
  70. {querysource-4.1.12 → querysource-4.2.0}/tests/test_rust_parsers.py +53 -0
  71. querysource-4.2.0/tests/test_sql_parser_combinations.py +425 -0
  72. querysource-4.1.12/querysource/datasources/drivers/pg.py +0 -66
  73. {querysource-4.1.12 → querysource-4.2.0}/.bumpversion.cfg +0 -0
  74. {querysource-4.1.12 → querysource-4.2.0}/.claude/agents/code-reviewer.md +0 -0
  75. {querysource-4.1.12 → querysource-4.2.0}/.claude/agents/sdd-worker.md +0 -0
  76. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/pr-review.md +0 -0
  77. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-brainstorm.md +0 -0
  78. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-codereview.md +0 -0
  79. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-done.md +0 -0
  80. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-fromjira.md +0 -0
  81. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-next.md +0 -0
  82. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-proposal.md +0 -0
  83. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-spec.md +0 -0
  84. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-start.md +0 -0
  85. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-status.md +0 -0
  86. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-task.md +0 -0
  87. {querysource-4.1.12 → querysource-4.2.0}/.claude/commands/sdd-tojira.md +0 -0
  88. {querysource-4.1.12 → querysource-4.2.0}/.claude/rules/aws-cost-optimization.md +0 -0
  89. {querysource-4.1.12 → querysource-4.2.0}/.claude/rules/code-reviewer.md +0 -0
  90. {querysource-4.1.12 → querysource-4.2.0}/.claude/rules/cython-development.md +0 -0
  91. {querysource-4.1.12 → querysource-4.2.0}/.claude/rules/python-development.md +0 -0
  92. {querysource-4.1.12 → querysource-4.2.0}/.claude/rules/rust-development.md +0 -0
  93. {querysource-4.1.12 → querysource-4.2.0}/.claude/rules/using-git-worktrees.md +0 -0
  94. {querysource-4.1.12 → querysource-4.2.0}/.claude/rules/worktree-pr-and-clean.md +0 -0
  95. {querysource-4.1.12 → querysource-4.2.0}/.claude/rules/worktree-start-feature.md +0 -0
  96. {querysource-4.1.12 → querysource-4.2.0}/.claude/rules/worktree-status.md +0 -0
  97. {querysource-4.1.12 → querysource-4.2.0}/.github/dependabot.yml +0 -0
  98. {querysource-4.1.12 → querysource-4.2.0}/.github/workflows/codeql-analysis.yml +0 -0
  99. {querysource-4.1.12 → querysource-4.2.0}/.github/workflows/release.yml +0 -0
  100. {querysource-4.1.12 → querysource-4.2.0}/.isort.cfg +0 -0
  101. {querysource-4.1.12 → querysource-4.2.0}/.jupyter/jupyter_notebook_config.py +0 -0
  102. {querysource-4.1.12 → querysource-4.2.0}/.pylintrc +0 -0
  103. {querysource-4.1.12 → querysource-4.2.0}/CHANGES.rst +0 -0
  104. {querysource-4.1.12 → querysource-4.2.0}/CODE_OF_CONDUCT.md +0 -0
  105. {querysource-4.1.12 → querysource-4.2.0}/CONTRIBUTING.md +0 -0
  106. {querysource-4.1.12 → querysource-4.2.0}/INSTALL +0 -0
  107. {querysource-4.1.12 → querysource-4.2.0}/LICENSE +0 -0
  108. {querysource-4.1.12 → querysource-4.2.0}/MANIFEST.in +0 -0
  109. {querysource-4.1.12 → querysource-4.2.0}/Makefile +0 -0
  110. {querysource-4.1.12 → querysource-4.2.0}/README.md +0 -0
  111. {querysource-4.1.12 → querysource-4.2.0}/bin/README.md +0 -0
  112. {querysource-4.1.12 → querysource-4.2.0}/gunicorn_config.py +0 -0
  113. {querysource-4.1.12 → querysource-4.2.0}/mypy.ini +0 -0
  114. {querysource-4.1.12 → querysource-4.2.0}/nav.py +0 -0
  115. {querysource-4.1.12 → querysource-4.2.0}/querysource/__cli__.py +0 -0
  116. {querysource-4.1.12 → querysource-4.2.0}/querysource/__init__.py +0 -0
  117. {querysource-4.1.12 → querysource-4.2.0}/querysource/cache/__init__.py +0 -0
  118. {querysource-4.1.12 → querysource-4.2.0}/querysource/cache/backends/__init__.py +0 -0
  119. {querysource-4.1.12 → querysource-4.2.0}/querysource/cache/backends/abstract.py +0 -0
  120. {querysource-4.1.12 → querysource-4.2.0}/querysource/cache/backends/memcache.py +0 -0
  121. {querysource-4.1.12 → querysource-4.2.0}/querysource/cache/backends/redis.py +0 -0
  122. {querysource-4.1.12 → querysource-4.2.0}/querysource/cache/base.py +0 -0
  123. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/__init__.py +0 -0
  124. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/abstract.py +0 -0
  125. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/arangodb.py +0 -0
  126. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/athena.py +0 -0
  127. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/bigquery.py +0 -0
  128. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/cassandra.py +0 -0
  129. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/clickhouse.py +0 -0
  130. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/cockroachdb.py +0 -0
  131. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/couchbase.py +0 -0
  132. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/couchdb.py +0 -0
  133. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/countries.py +0 -0
  134. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/delta.py +0 -0
  135. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/documentdb.py +0 -0
  136. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/dynamodb.py +0 -0
  137. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/elastic.py +0 -0
  138. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/ga.py +0 -0
  139. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/gcalc.py +0 -0
  140. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/hazel.py +0 -0
  141. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/iceberg.py +0 -0
  142. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/influx.py +0 -0
  143. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/jdbc.py +0 -0
  144. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/jira.py +0 -0
  145. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/mariadb.py +0 -0
  146. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/memcached.py +0 -0
  147. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/mongo.py +0 -0
  148. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/mysql.py +0 -0
  149. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/odbc.py +0 -0
  150. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/openweather.py +0 -0
  151. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/oracle.py +0 -0
  152. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/py.typed +0 -0
  153. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/qs.py +0 -0
  154. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/redis.py +0 -0
  155. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/rest.py +0 -0
  156. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/rethink.py +0 -0
  157. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/sa.py +0 -0
  158. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/salesforce.py +0 -0
  159. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/scylladb.py +0 -0
  160. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/sqlalchemy.py +0 -0
  161. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/sqlite.py +0 -0
  162. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/sqlserver.py +0 -0
  163. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/upc.py +0 -0
  164. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/drivers/zipcodeapi.py +0 -0
  165. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/handlers/__init__.py +0 -0
  166. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/handlers/utils.py +0 -0
  167. {querysource-4.1.12 → querysource-4.2.0}/querysource/datasources/models.py +0 -0
  168. {querysource-4.1.12 → querysource-4.2.0}/querysource/events/__init__.py +0 -0
  169. {querysource-4.1.12 → querysource-4.2.0}/querysource/exceptions.py +0 -0
  170. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/__init__.py +0 -0
  171. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/_pagination.py +0 -0
  172. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/log.py +0 -0
  173. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/manager.py +0 -0
  174. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/outputs/__init__.py +0 -0
  175. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/outputs/tableOutput/__init__.py +0 -0
  176. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/outputs/tableOutput/postgres.py +0 -0
  177. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/outputs/tableOutput/table.py +0 -0
  178. {querysource-4.1.12 → querysource-4.2.0}/querysource/handlers/variables.py +0 -0
  179. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/__init__.py +0 -0
  180. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/credentials.py +0 -0
  181. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/databases/__init__.py +0 -0
  182. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/databases/abstract.py +0 -0
  183. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/databases/bigquery.py +0 -0
  184. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/databases/db.py +0 -0
  185. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/databases/mongo.py +0 -0
  186. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/databases/rethink.py +0 -0
  187. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/http.py +0 -0
  188. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/playwright_service.py +0 -0
  189. {querysource-4.1.12 → querysource-4.2.0}/querysource/interfaces/selenium_service.py +0 -0
  190. {querysource-4.1.12 → querysource-4.2.0}/querysource/libs/__init__.py +0 -0
  191. {querysource-4.1.12 → querysource-4.2.0}/querysource/libs/encoders.py +0 -0
  192. {querysource-4.1.12 → querysource-4.2.0}/querysource/libs/functions/__init__.py +0 -0
  193. {querysource-4.1.12 → querysource-4.2.0}/querysource/libs/py.typed +0 -0
  194. {querysource-4.1.12 → querysource-4.2.0}/querysource/models.py +0 -0
  195. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/__init__.py +0 -0
  196. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/dt/__init__.py +0 -0
  197. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/dt/abstract.py +0 -0
  198. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/dt/arrow.py +0 -0
  199. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/dt/dt.py +0 -0
  200. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/dt/factory.py +0 -0
  201. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/dt/iter.py +0 -0
  202. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/dt/modin.py +0 -0
  203. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/dt/pandas.py +0 -0
  204. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/dt/polars.py +0 -0
  205. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/output.py +0 -0
  206. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/__init__.py +0 -0
  207. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/abstract.py +0 -0
  208. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/bigquery.py +0 -0
  209. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/documentdb.py +0 -0
  210. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/mongodb.py +0 -0
  211. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/mysql.py +0 -0
  212. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/postgres.py +0 -0
  213. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/rethink.py +0 -0
  214. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/sa.py +0 -0
  215. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/TableOutput/table.py +0 -0
  216. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/tables/__init__.py +0 -0
  217. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/__init__.py +0 -0
  218. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/abstract.py +0 -0
  219. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/bokeh.py +0 -0
  220. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/clustering.py +0 -0
  221. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/csv.py +0 -0
  222. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/describe.py +0 -0
  223. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/eda.py +0 -0
  224. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/excel.py +0 -0
  225. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/html.py +0 -0
  226. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/json.py +0 -0
  227. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/pdf.py +0 -0
  228. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/pickle.py +0 -0
  229. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/plotly.py +0 -0
  230. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/profiling.py +0 -0
  231. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/report.py +0 -0
  232. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/table.py +0 -0
  233. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/tsv.py +0 -0
  234. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/txt.py +0 -0
  235. {querysource-4.1.12 → querysource-4.2.0}/querysource/outputs/writers/xml.py +0 -0
  236. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/__init__.py +0 -0
  237. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/abstract.c +0 -0
  238. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/abstract.pxd +0 -0
  239. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/abstract.pyx +0 -0
  240. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/arangodb.c +0 -0
  241. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/arangodb.pxd +0 -0
  242. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/arangodb.pyx +0 -0
  243. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/bigquery.pxd +0 -0
  244. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/bigquery.pyx +0 -0
  245. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/cql.pxd +0 -0
  246. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/cql.pyx +0 -0
  247. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/deltatbl.pxd +0 -0
  248. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/deltatbl.pyx +0 -0
  249. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/elastic.cpp +0 -0
  250. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/elastic.pxd +0 -0
  251. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/elastic.pyx +0 -0
  252. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/iceberg.pxd +0 -0
  253. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/iceberg.pyx +0 -0
  254. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/influx.c +0 -0
  255. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/influx.pxd +0 -0
  256. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/influx.pyx +0 -0
  257. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/mongo.cpp +0 -0
  258. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/mongo.pxd +0 -0
  259. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/mongo.pyx +0 -0
  260. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/parser.c +0 -0
  261. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/parser.pxd +0 -0
  262. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/parser.pyx +0 -0
  263. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/pgsql.pxd +0 -0
  264. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/pgsql.pyx +0 -0
  265. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/rethink.c +0 -0
  266. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/rethink.pxd +0 -0
  267. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/rethink.pyx +0 -0
  268. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/sosql.pxd +0 -0
  269. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/sosql.pyx +0 -0
  270. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/sqlserver.pxd +0 -0
  271. {querysource-4.1.12 → querysource-4.2.0}/querysource/parsers/sqlserver.pyx +0 -0
  272. {querysource-4.1.12 → querysource-4.2.0}/querysource/plugins/__init__.py +0 -0
  273. {querysource-4.1.12 → querysource-4.2.0}/querysource/plugins/importer.py +0 -0
  274. {querysource-4.1.12 → querysource-4.2.0}/querysource/plugins/sources/__init__.py +0 -0
  275. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/__init__.py +0 -0
  276. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/abstract.py +0 -0
  277. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/arangodb.py +0 -0
  278. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/bigquery.py +0 -0
  279. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/cassandra.py +0 -0
  280. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/db.py +0 -0
  281. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/default.py +0 -0
  282. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/deltatbl.py +0 -0
  283. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/documentdb.py +0 -0
  284. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/dummy.py +0 -0
  285. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/elastic.py +0 -0
  286. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/external.py +0 -0
  287. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/http.py +0 -0
  288. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/iceberg.py +0 -0
  289. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/influx.py +0 -0
  290. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/mysql.py +0 -0
  291. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/pg.py +0 -0
  292. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/py.typed +0 -0
  293. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/rest.py +0 -0
  294. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/rethink.py +0 -0
  295. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/salesforce.py +0 -0
  296. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/scylladb.py +0 -0
  297. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/__init__.py +0 -0
  298. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/abstract.py +0 -0
  299. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/amazon.py +0 -0
  300. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/countries.py +0 -0
  301. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/ga.py +0 -0
  302. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/geofcc.py +0 -0
  303. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/gmaps.py +0 -0
  304. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/graphcountries.py +0 -0
  305. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/graphql.py +0 -0
  306. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/http.py +0 -0
  307. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/hubspot.py +0 -0
  308. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/openweather.py +0 -0
  309. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/parsers/__init__.py +0 -0
  310. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/parsers/amproduct.py +0 -0
  311. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/parsers/xpath.py +0 -0
  312. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/pokemon.py +0 -0
  313. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/populartimes.py +0 -0
  314. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/py.typed +0 -0
  315. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/rest.py +0 -0
  316. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/retailnext.py +0 -0
  317. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/rssapp.py +0 -0
  318. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/salesforce.py +0 -0
  319. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/scrapper.py +0 -0
  320. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/shoppertrack.py +0 -0
  321. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/swop.py +0 -0
  322. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/uap.py +0 -0
  323. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/upc.py +0 -0
  324. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/wm_stores.py +0 -0
  325. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/zammad.py +0 -0
  326. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sources/zipcodeapi.py +0 -0
  327. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sql.py +0 -0
  328. {querysource-4.1.12 → querysource-4.2.0}/querysource/providers/sqlserver.py +0 -0
  329. {querysource-4.1.12 → querysource-4.2.0}/querysource/py.typed +0 -0
  330. {querysource-4.1.12 → querysource-4.2.0}/querysource/qs_parsers/__init__.py +0 -0
  331. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/__init__.py +0 -0
  332. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/base.py +0 -0
  333. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/executor.py +0 -0
  334. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/models.py +0 -0
  335. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/components/__init__.py +0 -0
  336. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/Concat.py +0 -0
  337. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/GroupBy.py +0 -0
  338. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/Info.py +0 -0
  339. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/Join.py +0 -0
  340. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/Melt.py +0 -0
  341. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/Merge.py +0 -0
  342. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/__init__.py +0 -0
  343. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/abstract.py +0 -0
  344. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/filter/__init__.py +0 -0
  345. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/operators/filter/flt.py +0 -0
  346. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/sources/__init__.py +0 -0
  347. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/sources/file.py +0 -0
  348. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/sources/query.py +0 -0
  349. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/Forecast.py +0 -0
  350. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/Map.py +0 -0
  351. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/__init__.py +0 -0
  352. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/abstract.py +0 -0
  353. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/correlation.py +0 -0
  354. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/crosstab.py +0 -0
  355. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/google/__init__.py +0 -0
  356. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/google/maps.py +0 -0
  357. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/pivot.py +0 -0
  358. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/tOrder.py +0 -0
  359. {querysource-4.1.12 → querysource-4.2.0}/querysource/queries/multi/transformations/tPandas.py +0 -0
  360. {querysource-4.1.12 → querysource-4.2.0}/querysource/scheduler/__init__.py +0 -0
  361. {querysource-4.1.12 → querysource-4.2.0}/querysource/scheduler/jobs.py +0 -0
  362. {querysource-4.1.12 → querysource-4.2.0}/querysource/scheduler/notifications.py +0 -0
  363. {querysource-4.1.12 → querysource-4.2.0}/querysource/scheduler/scheduler.py +0 -0
  364. {querysource-4.1.12 → querysource-4.2.0}/querysource/template/__init__.py +0 -0
  365. {querysource-4.1.12 → querysource-4.2.0}/querysource/template/parser.py +0 -0
  366. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/__init__.py +0 -0
  367. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/converters.cpp +0 -0
  368. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/converters.pyx +0 -0
  369. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/dt/__init__.py +0 -0
  370. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/dt/filters.py +0 -0
  371. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/dt/transforms.py +0 -0
  372. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/py.typed +0 -0
  373. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/typedefs.c +0 -0
  374. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/typedefs.pyx +0 -0
  375. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/validators.cpp +0 -0
  376. {querysource-4.1.12 → querysource-4.2.0}/querysource/types/validators.pyx +0 -0
  377. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/__init__.py +0 -0
  378. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/cache_serialization.py +0 -0
  379. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/events.py +0 -0
  380. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/fn.py +0 -0
  381. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/functions.cpp +0 -0
  382. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/functions.pyx +0 -0
  383. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/getfunc.py +0 -0
  384. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/handlers.py +0 -0
  385. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/parseqs.cpp +0 -0
  386. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/parseqs.pyx +0 -0
  387. {querysource-4.1.12 → querysource-4.2.0}/querysource/utils/validators.py +0 -0
  388. {querysource-4.1.12 → querysource-4.2.0}/querysource.egg-info/dependency_links.txt +0 -0
  389. {querysource-4.1.12 → querysource-4.2.0}/querysource.egg-info/entry_points.txt +0 -0
  390. {querysource-4.1.12 → querysource-4.2.0}/querysource.egg-info/not-zip-safe +0 -0
  391. {querysource-4.1.12 → querysource-4.2.0}/querysource.egg-info/requires.txt +0 -0
  392. {querysource-4.1.12 → querysource-4.2.0}/querysource.egg-info/top_level.txt +0 -0
  393. {querysource-4.1.12 → querysource-4.2.0}/run.py +0 -0
  394. {querysource-4.1.12 → querysource-4.2.0}/rust/Cargo.lock +0 -0
  395. {querysource-4.1.12 → querysource-4.2.0}/rust/Cargo.toml +0 -0
  396. {querysource-4.1.12 → querysource-4.2.0}/rust/pyproject.toml +0 -0
  397. {querysource-4.1.12 → querysource-4.2.0}/rust/src/arangodb_parser.rs +0 -0
  398. {querysource-4.1.12 → querysource-4.2.0}/rust/src/bigquery_parser.rs +0 -0
  399. {querysource-4.1.12 → querysource-4.2.0}/rust/src/cql_parser.rs +0 -0
  400. {querysource-4.1.12 → querysource-4.2.0}/rust/src/elastic_parser.rs +0 -0
  401. {querysource-4.1.12 → querysource-4.2.0}/rust/src/filter_common.rs +0 -0
  402. {querysource-4.1.12 → querysource-4.2.0}/rust/src/flux_parser.rs +0 -0
  403. {querysource-4.1.12 → querysource-4.2.0}/rust/src/lib.rs +0 -0
  404. {querysource-4.1.12 → querysource-4.2.0}/rust/src/mongo_parser.rs +0 -0
  405. {querysource-4.1.12 → querysource-4.2.0}/rust/src/mssql_parser.rs +0 -0
  406. {querysource-4.1.12 → querysource-4.2.0}/rust/src/parseqs.rs +0 -0
  407. {querysource-4.1.12 → querysource-4.2.0}/rust/src/pgsql_parser.rs +0 -0
  408. {querysource-4.1.12 → querysource-4.2.0}/rust/src/rethink_parser.rs +0 -0
  409. {querysource-4.1.12 → querysource-4.2.0}/rust/src/safe_dict.rs +0 -0
  410. {querysource-4.1.12 → querysource-4.2.0}/rust/src/soql_parser.rs +0 -0
  411. {querysource-4.1.12 → querysource-4.2.0}/rust/src/validators.rs +0 -0
  412. {querysource-4.1.12 → querysource-4.2.0}/setup.cfg +0 -0
  413. {querysource-4.1.12 → querysource-4.2.0}/setup.py +0 -0
  414. {querysource-4.1.12 → querysource-4.2.0}/static/notebook/bundle.js +0 -0
  415. {querysource-4.1.12 → querysource-4.2.0}/templates/__init__.py +0 -0
  416. {querysource-4.1.12 → querysource-4.2.0}/templates/base.html +0 -0
  417. {querysource-4.1.12 → querysource-4.2.0}/templates/default.html +0 -0
  418. {querysource-4.1.12 → querysource-4.2.0}/templates/default_table.html +0 -0
  419. {querysource-4.1.12 → querysource-4.2.0}/templates/fontlist-v330.json +0 -0
  420. {querysource-4.1.12 → querysource-4.2.0}/templates/fontlist-v390.json +0 -0
  421. {querysource-4.1.12 → querysource-4.2.0}/templates/table_charts.html +0 -0
  422. {querysource-4.1.12/tests/handlers → querysource-4.2.0/tests/auth}/__init__.py +0 -0
  423. {querysource-4.1.12 → querysource-4.2.0}/tests/handlers/conftest.py +0 -0
  424. {querysource-4.1.12 → querysource-4.2.0}/tests/handlers/test_querymanager_pagination.py +0 -0
  425. {querysource-4.1.12 → querysource-4.2.0}/tests/test_api.py +0 -0
  426. {querysource-4.1.12 → querysource-4.2.0}/tests/test_arangodb_parser.py +0 -0
  427. {querysource-4.1.12 → querysource-4.2.0}/tests/test_column_filters.py +0 -0
  428. {querysource-4.1.12 → querysource-4.2.0}/tests/test_elastic_parser.py +0 -0
  429. {querysource-4.1.12 → querysource-4.2.0}/tests/test_eval.py +0 -0
  430. {querysource-4.1.12 → querysource-4.2.0}/tests/test_join_conditions.py +0 -0
  431. {querysource-4.1.12 → querysource-4.2.0}/tests/test_join_with_column_filter.py +0 -0
  432. {querysource-4.1.12 → querysource-4.2.0}/tests/test_rss.py +0 -0
  433. {querysource-4.1.12 → querysource-4.2.0}/tests/test_scheduler_core.py +0 -0
  434. {querysource-4.1.12 → querysource-4.2.0}/tests/test_scheduler_integration.py +0 -0
  435. {querysource-4.1.12 → querysource-4.2.0}/tests/test_scheduler_jobs.py +0 -0
  436. {querysource-4.1.12 → querysource-4.2.0}/tests/test_scheduler_notifications.py +0 -0
  437. {querysource-4.1.12 → querysource-4.2.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: querysource
3
- Version: 4.1.12
3
+ Version: 4.2.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
@@ -4,9 +4,11 @@ This file will be auto-generated by code
4
4
  """
5
5
  from navconfig.logging import logging
6
6
  from navigator.handlers.types import AppHandler
7
+ from navigator_auth import AuthHandler
7
8
  from querysource.services import QuerySource
8
9
 
9
10
 
11
+
10
12
  logging.getLogger(name='traitlets').setLevel(logging.ERROR)
11
13
 
12
14
  class Main(AppHandler):
@@ -20,13 +22,14 @@ class Main(AppHandler):
20
22
 
21
23
  def configure(self):
22
24
  super(Main, self).configure()
23
- # version
24
- # Loading QUerySource
25
- qry = QuerySource(
26
- lazy=False,
27
- loop=self.event_loop()
28
- )
25
+ # Loading QuerySource — no need to pass the event loop; it is captured
26
+ # automatically from aiohttp's running loop on startup.
27
+ qry = QuerySource(lazy=False)
29
28
  qry.setup(self.app)
29
+ ### Auth System
30
+ # create a new instance of Auth System
31
+ auth = AuthHandler()
32
+ auth.setup(self.app) # configure this Auth system into App.
30
33
 
31
34
  @classmethod
32
35
  def evt(cls):
@@ -0,0 +1,24 @@
1
+ version: "1.0"
2
+
3
+ defaults:
4
+ effect: deny
5
+
6
+ # Add allow policies for non-admin groups here.
7
+ policies: []
8
+
9
+ # ─── Example (uncomment and customise) ──────────────────────────────────────
10
+ # policies:
11
+ # - name: analysts_use_postgres
12
+ # effect: allow
13
+ # description: "Analysts may use the read-only postgres datasource."
14
+ # resources:
15
+ # - "datasource:postgres"
16
+ # actions:
17
+ # - "datasource:use"
18
+ # - "datasource:list"
19
+ # subjects:
20
+ # groups:
21
+ # - analysts
22
+ # priority: 30
23
+ # enforcing: false
24
+ # ────────────────────────────────────────────────────────────────────────────
@@ -0,0 +1,31 @@
1
+ version: "1.0"
2
+
3
+ defaults:
4
+ effect: deny
5
+
6
+ policies:
7
+ - name: admin_full_access
8
+ effect: allow
9
+ description: >
10
+ Superuser and admin groups have unrestricted access to all
11
+ QuerySource resources. Without this policy, no user can execute
12
+ any slug, raw query, datasource, or driver.
13
+ resources:
14
+ - "slug:*"
15
+ - "datasource:*"
16
+ - "driver:*"
17
+ - "raw_query"
18
+ actions:
19
+ - "slug:execute"
20
+ - "slug:list"
21
+ - "datasource:use"
22
+ - "datasource:list"
23
+ - "driver:use"
24
+ - "driver:list"
25
+ - "raw_query:execute"
26
+ subjects:
27
+ groups:
28
+ - superuser
29
+ - admin
30
+ priority: 100
31
+ enforcing: true
@@ -0,0 +1,24 @@
1
+ version: "1.0"
2
+
3
+ defaults:
4
+ effect: deny
5
+
6
+ # Add allow policies for non-admin groups here.
7
+ policies: []
8
+
9
+ # ─── Example (uncomment and customise) ──────────────────────────────────────
10
+ # policies:
11
+ # - name: analysts_use_pg_driver
12
+ # effect: allow
13
+ # description: "Analysts may use the pg (asyncpg) driver."
14
+ # resources:
15
+ # - "driver:pg"
16
+ # actions:
17
+ # - "driver:use"
18
+ # - "driver:list"
19
+ # subjects:
20
+ # groups:
21
+ # - analysts
22
+ # priority: 30
23
+ # enforcing: false
24
+ # ────────────────────────────────────────────────────────────────────────────
@@ -0,0 +1,24 @@
1
+ version: "1.0"
2
+
3
+ defaults:
4
+ effect: deny
5
+
6
+ # Add allow policies for non-admin groups here.
7
+ # Raw queries grant inline SQL execution — grant sparingly.
8
+ policies: []
9
+
10
+ # ─── Example (uncomment and customise) ──────────────────────────────────────
11
+ # policies:
12
+ # - name: data_engineers_raw_queries
13
+ # effect: allow
14
+ # description: "Data engineers can run inline raw queries."
15
+ # resources:
16
+ # - "raw_query"
17
+ # actions:
18
+ # - "raw_query:execute"
19
+ # subjects:
20
+ # groups:
21
+ # - data-engineers
22
+ # priority: 50
23
+ # enforcing: true
24
+ # ────────────────────────────────────────────────────────────────────────────
@@ -0,0 +1,24 @@
1
+ version: "1.0"
2
+
3
+ defaults:
4
+ effect: deny
5
+
6
+ # Add allow policies for non-admin groups here.
7
+ policies: []
8
+
9
+ # ─── Example (uncomment and customise) ──────────────────────────────────────
10
+ # policies:
11
+ # - name: analysts_run_finance_slugs
12
+ # effect: allow
13
+ # description: "Analysts can execute all finance-prefixed slugs."
14
+ # resources:
15
+ # - "slug:finance_*"
16
+ # actions:
17
+ # - "slug:execute"
18
+ # - "slug:list"
19
+ # subjects:
20
+ # groups:
21
+ # - analysts
22
+ # priority: 30
23
+ # enforcing: false
24
+ # ────────────────────────────────────────────────────────────────────────────
@@ -0,0 +1,33 @@
1
+ version: "1.0"
2
+
3
+ defaults:
4
+ effect: deny
5
+
6
+ # Per-user exemptions for codebase owners and service accounts.
7
+ # Use this file for user-level (not group-level) allow rules.
8
+ policies: []
9
+
10
+ # ─── Example (uncomment and customise) ──────────────────────────────────────
11
+ # policies:
12
+ # - name: service_account_full_access
13
+ # effect: allow
14
+ # description: "Service account used by CI/CD has unrestricted access."
15
+ # resources:
16
+ # - "slug:*"
17
+ # - "datasource:*"
18
+ # - "driver:*"
19
+ # - "raw_query"
20
+ # actions:
21
+ # - "slug:execute"
22
+ # - "slug:list"
23
+ # - "datasource:use"
24
+ # - "datasource:list"
25
+ # - "driver:use"
26
+ # - "driver:list"
27
+ # - "raw_query:execute"
28
+ # subjects:
29
+ # users:
30
+ # - ci-service@example.com
31
+ # priority: 90
32
+ # enforcing: true
33
+ # ────────────────────────────────────────────────────────────────────────────
@@ -171,6 +171,9 @@ addopts = [
171
171
  "--strict-config",
172
172
  "--strict-markers",
173
173
  ]
174
+ markers = [
175
+ "perf: performance regression tests (opt-in via -m perf)",
176
+ ]
174
177
  filterwarnings = [
175
178
  "error",
176
179
  'ignore:The loop argument is deprecated since Python 3\.8, and scheduled for removal in Python 3\.10:DeprecationWarning:asyncio',
@@ -193,3 +196,6 @@ features = ["pyo3/extension-module"]
193
196
  # producing ModuleNotFoundError: No module named '<pkg>.<native>' at import.
194
197
  [tool.uv]
195
198
  link-mode = "copy"
199
+
200
+ [tool.uv.sources]
201
+ navigator-auth = { path = "../../navigator/navigator-auth", editable = true }
@@ -3,3 +3,5 @@
3
3
  asyncio_mode = auto
4
4
  filterwarnings =
5
5
  ignore::DeprecationWarning
6
+ markers =
7
+ perf: performance regression tests (opt-in via -m perf)
@@ -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.1.13.dev0+gd6d474e05.d20260424'
22
- __version_tuple__ = version_tuple = (4, 1, 13, 'dev0', 'gd6d474e05.d20260424')
21
+ __version__ = version = '4.2.1.dev0+g47a6b9db9.d20260430'
22
+ __version_tuple__ = version_tuple = (4, 2, 1, 'dev0', 'g47a6b9db9.d20260430')
23
23
 
24
- __commit_id__ = commit_id = 'gd6d474e05'
24
+ __commit_id__ = commit_id = 'g47a6b9db9'
@@ -0,0 +1,21 @@
1
+ """
2
+ querysource.auth — Policy-based access control (PBAC) for QuerySource.
3
+
4
+ This package wires navigator-auth's PBAC engine into QuerySource handlers
5
+ and provides a per-user credential resolver for the driver layer.
6
+
7
+ Public surface:
8
+ - ``CredentialResolver`` — per-user credential resolver (TASK-628)
9
+ - ``ResolvedCredentials`` — credential dataclass (TASK-628)
10
+ - ``setup_pbac()`` — PBAC bootstrap (TASK-629)
11
+ - ``ResourceType`` — resource-type enum/shim (TASK-631)
12
+ """
13
+ import logging
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+ from querysource.auth.credentials import CredentialResolver, ResolvedCredentials # noqa: E402
18
+ from querysource.auth.pbac import setup_pbac # noqa: E402
19
+ from querysource.auth._resource_types import ResourceType # noqa: E402
20
+
21
+ __all__ = ("CredentialResolver", "ResolvedCredentials", "setup_pbac", "ResourceType", "logger")
@@ -0,0 +1,48 @@
1
+ """
2
+ querysource.auth._resource_types — ResourceType shim for PBAC enforcement.
3
+
4
+ Tries to import ResourceType from navigator-auth (available once TASK-640
5
+ upstream PR is merged and navigator-auth >= 0.20.0 is pinned). Falls back to
6
+ a plain-string stand-in that preserves the same attribute interface.
7
+
8
+ Usage::
9
+
10
+ from querysource.auth._resource_types import ResourceType
11
+ await self._enforce_pbac(request, ResourceType.SLUG, slug, "slug:execute")
12
+
13
+ Once TASK-640 lands, the try-branch is taken automatically and this shim
14
+ becomes a transparent pass-through — no handler changes required.
15
+ """
16
+ from __future__ import annotations
17
+
18
+ try:
19
+ from navigator_auth.abac.policies.resources import ResourceType
20
+ # Validate that the expected QS-specific attrs are present.
21
+ # Raises AttributeError if the upstream PR hasn't landed yet.
22
+ _check = (
23
+ ResourceType.SLUG, # noqa: WPS226
24
+ ResourceType.DATASOURCE,
25
+ ResourceType.DRIVER,
26
+ ResourceType.RAW_QUERY,
27
+ )
28
+ del _check
29
+ except (ImportError, AttributeError):
30
+ # navigator-auth not installed, or SLUG/DATASOURCE/DRIVER/RAW_QUERY not
31
+ # yet added upstream. Use a lightweight string-based stand-in.
32
+ class _StringResourceType(str): # type: ignore[misc]
33
+ """String subclass so isinstance checks still pass for str."""
34
+ __slots__ = ()
35
+
36
+ class ResourceType: # type: ignore[no-redef]
37
+ """String-shim ResourceType for QuerySource PBAC enforcement.
38
+
39
+ Attributes mirror the planned navigator-auth ResourceType enum values
40
+ (FEAT-091 TASK-640 upstream PR). Switch to the real enum once merged.
41
+ """
42
+ SLUG = _StringResourceType("slug")
43
+ DATASOURCE = _StringResourceType("datasource")
44
+ DRIVER = _StringResourceType("driver")
45
+ RAW_QUERY = _StringResourceType("raw_query")
46
+
47
+
48
+ __all__ = ("ResourceType",)
@@ -0,0 +1,224 @@
1
+ """
2
+ querysource.auth.credentials — Per-user credential resolver for driver layer.
3
+
4
+ Implements a three-tier env-var lookup:
5
+ 1. Per-user: ``<PREFIX>_<SANITIZED_USERNAME>_HOST/PORT/USER/PASSWORD/DATABASE``
6
+ 2. Profile: ``<PREFIX>_<SANITIZED_PROFILE>_HOST/PORT/USER/PASSWORD/DATABASE``
7
+ 3. Default: ``<PREFIX>_HOST/PORT/USER/PASSWORD/DATABASE``
8
+
9
+ Group-tier lookup is explicitly out of scope (FEAT-091 v1).
10
+ """
11
+ import os
12
+ import logging
13
+ from dataclasses import dataclass
14
+ from typing import Optional
15
+
16
+
17
+ @dataclass(slots=True)
18
+ class ResolvedCredentials:
19
+ """Connection parameters resolved by CredentialResolver.
20
+
21
+ Args:
22
+ host: Database hostname.
23
+ port: Database port.
24
+ user: Database user.
25
+ password: Database password.
26
+ database: Database name.
27
+ source: Resolution tier used — one of:
28
+ ``"user-override"``, ``"profile:<name>"``,
29
+ or ``"default:<prefix>"``.
30
+ """
31
+
32
+ host: str
33
+ port: int
34
+ user: str
35
+ password: str
36
+ database: str
37
+ source: str
38
+
39
+
40
+ class CredentialResolver:
41
+ """Resolves driver connection params from session + env using a 3-tier lookup.
42
+
43
+ Resolution order:
44
+ 1. Per-user env vars: ``<PREFIX>_<USERNAME>_HOST`` etc.
45
+ 2. Profile-from-policy env vars: ``<PREFIX>_<PROFILE>_HOST`` etc.
46
+ 3. Datasource default: ``<PREFIX>_HOST`` etc.
47
+
48
+ Partial sets (only some of the 5 required vars set) fall through to the
49
+ next tier. A warning is logged once per (tier, missing-key-set) pair.
50
+ """
51
+
52
+ _REQUIRED_FIELDS = ("HOST", "PORT", "USER", "PASSWORD", "DATABASE")
53
+
54
+ def __init__(self, logger: Optional[logging.Logger] = None) -> None:
55
+ """Initialise the resolver.
56
+
57
+ Args:
58
+ logger: Optional logger; defaults to ``logging.getLogger(__name__)``.
59
+ """
60
+ self._logger = logger or logging.getLogger(__name__)
61
+ # Dedup set: frozenset of (tier_label, missing_key) tuples already warned.
62
+ self._warned: set = set()
63
+
64
+ @staticmethod
65
+ def sanitize(value: str) -> str:
66
+ """Canonicalize a username or profile name for env-var key construction.
67
+
68
+ Rules: uppercase; ``.``, ``-``, ``@`` → ``_``.
69
+
70
+ Args:
71
+ value: Raw username or profile string.
72
+
73
+ Returns:
74
+ Sanitized uppercase string safe for env-var lookup.
75
+ """
76
+ return value.upper().replace(".", "_").replace("-", "_").replace("@", "_")
77
+
78
+ def _extract_username(self, session) -> Optional[str]:
79
+ """Extract the username (or user_id) from a session dict.
80
+
81
+ Args:
82
+ session: Session object (dict-like).
83
+
84
+ Returns:
85
+ Username string, or None if not found.
86
+ """
87
+ if session is None:
88
+ return None
89
+ if hasattr(session, "get"):
90
+ username = session.get("username") or session.get("user_id")
91
+ if username:
92
+ return str(username)
93
+ return None
94
+
95
+ def _lookup(self, prefix: str, segment: Optional[str]) -> Optional[dict]:
96
+ """Look up the five required credential env vars for a given prefix+segment.
97
+
98
+ Constructs keys like ``<PREFIX>_<SEGMENT>_HOST`` (with segment) or
99
+ ``<PREFIX>_HOST`` (without segment). Returns ``None`` if any key is
100
+ missing or if the PORT cannot be coerced to int.
101
+
102
+ Args:
103
+ prefix: E.g. ``"PG"`` or ``"DB"``.
104
+ segment: Sanitized username/profile, or ``None`` for the default tier.
105
+
106
+ Returns:
107
+ Dict with keys ``host``, ``port``, ``user``, ``password``,
108
+ ``database`` on full success; ``None`` on partial or missing set.
109
+ """
110
+ base = f"{prefix}_{segment}_" if segment else f"{prefix}_"
111
+ values = {}
112
+ missing = []
113
+ for field in self._REQUIRED_FIELDS:
114
+ key = f"{base}{field}"
115
+ val = os.environ.get(key)
116
+ if val is None:
117
+ missing.append(key)
118
+ else:
119
+ values[field] = val
120
+
121
+ if missing:
122
+ if values:
123
+ # Partial set — warn once per (segment, missing keys) combo.
124
+ dedup_key = frozenset(missing)
125
+ tier_label = f"{prefix}_{segment}" if segment else prefix
126
+ warn_key = (tier_label, dedup_key)
127
+ if warn_key not in self._warned:
128
+ self._warned.add(warn_key)
129
+ self._logger.warning(
130
+ "CredentialResolver: partial credential set for %s — "
131
+ "missing env vars %s; falling through to next tier.",
132
+ tier_label,
133
+ sorted(missing),
134
+ )
135
+ return None
136
+
137
+ try:
138
+ port = int(values["PORT"])
139
+ except (ValueError, TypeError):
140
+ tier_label = f"{prefix}_{segment}" if segment else prefix
141
+ dedup_key = frozenset([f"{base}PORT_invalid"])
142
+ warn_key = (tier_label, dedup_key)
143
+ if warn_key not in self._warned:
144
+ self._warned.add(warn_key)
145
+ self._logger.warning(
146
+ "CredentialResolver: invalid PORT value for %s; "
147
+ "falling through to next tier.",
148
+ tier_label,
149
+ )
150
+ return None
151
+
152
+ return {
153
+ "host": values["HOST"],
154
+ "port": port,
155
+ "user": values["USER"],
156
+ "password": values["PASSWORD"],
157
+ "database": values["DATABASE"],
158
+ }
159
+
160
+ def _build(self, source: str, creds: dict) -> ResolvedCredentials:
161
+ """Construct a ResolvedCredentials from a raw dict + source label.
162
+
163
+ Args:
164
+ source: One of ``"user-override"``, ``"profile:<name>"``, or
165
+ ``"default:<prefix>"``.
166
+ creds: Dict with keys ``host``, ``port``, ``user``, ``password``,
167
+ ``database``.
168
+
169
+ Returns:
170
+ ResolvedCredentials instance.
171
+ """
172
+ return ResolvedCredentials(
173
+ host=creds["host"],
174
+ port=creds["port"],
175
+ user=creds["user"],
176
+ password=creds["password"],
177
+ database=creds["database"],
178
+ source=source,
179
+ )
180
+
181
+ def resolve(
182
+ self,
183
+ prefix: str,
184
+ session,
185
+ credential_profile: Optional[str] = None,
186
+ ) -> Optional[ResolvedCredentials]:
187
+ """Resolve connection credentials using 3-tier env-var lookup.
188
+
189
+ Resolution order:
190
+ 1. Per-user: ``<PREFIX>_<USERNAME>_*`` (if session has a username).
191
+ 2. Profile: ``<PREFIX>_<PROFILE>_*`` (if credential_profile provided).
192
+ 3. Default: ``<PREFIX>_*``.
193
+
194
+ Partial sets fall through silently (with one warning per unique gap).
195
+ If no tier resolves, returns ``None``.
196
+
197
+ Args:
198
+ prefix: Env-var prefix, e.g. ``"PG"`` or ``"DB"``.
199
+ session: Dict-like session object; may be ``None``.
200
+ credential_profile: Optional profile name from policy attributes.
201
+
202
+ Returns:
203
+ ResolvedCredentials or None.
204
+ """
205
+ # Tier 1: per-user
206
+ if session is not None:
207
+ username = self._extract_username(session)
208
+ if username:
209
+ creds = self._lookup(prefix, self.sanitize(username))
210
+ if creds is not None:
211
+ return self._build("user-override", creds)
212
+
213
+ # Tier 2: profile from policy
214
+ if credential_profile:
215
+ creds = self._lookup(prefix, self.sanitize(credential_profile))
216
+ if creds is not None:
217
+ return self._build(f"profile:{credential_profile}", creds)
218
+
219
+ # Tier 3: datasource default
220
+ creds = self._lookup(prefix, None)
221
+ if creds is not None:
222
+ return self._build(f"default:{prefix}", creds)
223
+
224
+ return None