querysource 4.4.2__tar.gz → 4.4.3__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.
- {querysource-4.4.2/querysource.egg-info → querysource-4.4.3}/PKG-INFO +1 -1
- {querysource-4.4.2 → querysource-4.4.3}/querysource/_version.py +3 -3
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/multi.py +8 -4
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/__init__.py +54 -1
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/_introspect.py +10 -1
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/destinations/sharepoint.py +105 -36
- {querysource-4.4.2 → querysource-4.4.3}/querysource/version.py +1 -1
- {querysource-4.4.2 → querysource-4.4.3/querysource.egg-info}/PKG-INFO +1 -1
- {querysource-4.4.2 → querysource-4.4.3}/.agent/rules/async-programming-expert.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/rules/code-reviewer.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/rules/cython-development.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/rules/prompt-expert.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/rules/python-development.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/rules/rust-development.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/workflows/create-parrot-tool.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/workflows/create-workflow.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/workflows/debug-regressions-with-git-bisect-binary-search.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/workflows/generate-tests.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/workflows/git-new-feature.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/workflows/parrot-mcp-server.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/workflows/release_package.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.agent/workflows/start-flow.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.bumpversion.cfg +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/agents/code-reviewer.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/agents/sdd-autopilot.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/agents/sdd-qa.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/agents/sdd-research.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/agents/sdd-worker.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/pr-review.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-brainstorm.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-codereview.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-done.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-fromjira.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-next.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-proposal.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-spec.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-start.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-status.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-task.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/commands/sdd-tojira.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/rules/aws-cost-optimization.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/rules/code-reviewer.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/rules/cython-development.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/rules/python-development.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/rules/rust-development.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/rules/using-git-worktrees.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/rules/worktree-pr-and-clean.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/rules/worktree-start-feature.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.claude/rules/worktree-status.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.github/dependabot.yml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.github/workflows/codeql-analysis.yml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.github/workflows/release.yml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.isort.cfg +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.jupyter/jupyter_notebook_config.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.pre-commit-config.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/.pylintrc +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/CHANGES.rst +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/CODE_OF_CONDUCT.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/CONTRIBUTING.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/INSTALL +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/JOIN_CONDITIONS_FEATURE.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/JOIN_CONDITIONS_SUMMARY.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/LICENSE +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/MANIFEST.in +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/Makefile +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/README.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/app.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/bin/README.md +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/conftest.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/AirtableSource.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Concat.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/DWHDestination.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/DropCols.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/FileSource.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Filter.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/FilterCols.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Forecast.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/GoogleMaps.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/GroupBy.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Info.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Join.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Map.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Melt.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Merge.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/PluckCols.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Query.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/S3Source.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/SharepointSource.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/SmartSheetSource.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/Table.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/TableDestination.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/TableOutput.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/TableOutputAdapter.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/TableSource.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/ToS3.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/ToSharepoint.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/correlation.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/crosstab.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/pivot.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/tExplode.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/tOrder.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/generated/tPandas.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/gunicorn_config.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/mypy.ini +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/nav.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/policies/datasources.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/policies/defaults.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/policies/drivers.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/policies/raw_queries.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/policies/slugs.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/policies/superusers.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/pyproject.toml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/pytest.ini +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/qs-parser/Cargo.lock +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/qs-parser/Cargo.toml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/qs-parser/pyproject.toml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/qs-parser/src/lib.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/qs-parser/src/parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/qs-parser/src/sql.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/__cli__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/auth/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/auth/_resource_types.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/auth/credentials.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/auth/pbac.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/cache/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/cache/backends/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/cache/backends/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/cache/backends/memcache.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/cache/backends/redis.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/cache/base.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/cli/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/cli/generate_docs.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/conf.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/connections.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/arangodb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/athena.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/bigquery.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/cassandra.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/clickhouse.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/cockroachdb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/couchbase.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/couchdb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/countries.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/delta.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/documentdb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/dynamodb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/elastic.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/ga.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/gcalc.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/hazel.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/iceberg.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/influx.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/jdbc.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/jira.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/mariadb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/memcached.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/mongo.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/mysql.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/odbc.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/openweather.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/oracle.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/pg.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/pg_admin.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/postgres.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/py.typed +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/qs.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/redis.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/rest.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/rethink.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/sa.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/salesforce.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/scylladb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/sqlalchemy.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/sqlite.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/sqlserver.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/upc.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/drivers/zipcodeapi.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/handlers/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/handlers/datasource.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/handlers/utils.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/datasources/models.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/events/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/exceptions.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/_pagination.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/components.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/executor.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/integrations/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/integrations/airtable.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/log.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/manager.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/outputs/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/outputs/tableOutput/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/outputs/tableOutput/postgres.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/outputs/tableOutput/table.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/scheduler.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/service.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/handlers/variables.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/airtable.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/connections.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/credentials.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/databases/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/databases/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/databases/bigquery.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/databases/db.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/databases/mongo.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/databases/rethink.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/http.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/playwright_service.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/queries.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/interfaces/selenium_service.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/libs/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/libs/encoders.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/libs/functions/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/libs/py.typed +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/models.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/destinations/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/destinations/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/destinations/dwh.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/destinations/s3.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/destinations/sharepoint.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/destinations/table.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/dt/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/dt/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/dt/arrow.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/dt/dt.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/dt/factory.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/dt/iter.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/dt/modin.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/dt/pandas.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/dt/polars.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/output.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/bigquery.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/documentdb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/mongodb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/mysql.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/postgres.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/rethink.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/sa.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/TableOutput/table.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/tables/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/bokeh.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/clustering.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/csv.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/describe.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/eda.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/excel.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/html.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/json.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/pdf.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/pickle.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/plotly.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/profiling.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/report.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/table.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/tsv.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/txt.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/outputs/writers/xml.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/abstract.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/abstract.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/abstract.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/arangodb.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/arangodb.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/arangodb.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/bigquery.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/bigquery.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/bigquery.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/cql.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/cql.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/cql.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/deltatbl.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/deltatbl.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/deltatbl.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/elastic.cpp +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/elastic.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/elastic.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/iceberg.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/iceberg.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/iceberg.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/influx.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/influx.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/influx.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/mongo.cpp +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/mongo.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/mongo.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/parser.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/parser.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/parser.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/pgsql.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/pgsql.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/pgsql.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/rethink.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/rethink.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/rethink.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/sosql.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/sosql.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/sosql.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/sql.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/sql.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/sql.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/sqlserver.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/sqlserver.pxd +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/parsers/sqlserver.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/plugins/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/plugins/importer.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/plugins/sources/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/arangodb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/bigquery.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/cassandra.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/db.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/default.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/deltatbl.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/documentdb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/dummy.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/elastic.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/external.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/http.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/iceberg.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/influx.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/mysql.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/pg.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/py.typed +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/rest.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/rethink.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/salesforce.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/scylladb.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/amazon.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/countries.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/ga.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/geofcc.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/gmaps.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/graphcountries.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/graphql.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/http.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/hubspot.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/openweather.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/parsers/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/parsers/amproduct.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/parsers/xpath.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/pokemon.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/populartimes.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/py.typed +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/rest.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/retailnext.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/rssapp.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/salesforce.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/scrapper.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/shoppertrack.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/swop.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/uap.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/upc.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/wm_stores.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/zammad.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sources/zipcodeapi.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sql.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/providers/sqlserver.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/py.typed +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/qs_parsers/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/base.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/executor.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/models.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/components/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/components/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/destinations/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/destinations/dwh.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/destinations/s3.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/destinations/table.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/Concat.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/GroupBy.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/GroupBy.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/Info.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/Join.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/Join.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/Melt.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/Melt.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/Merge.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/Merge.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/filter/Filter.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/filter/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/operators/filter/flt.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/registry.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/airtable.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/base.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/executors.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/file.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/query.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/query.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/s3.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/sharepoint.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/smartsheet.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/sources/table.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/DropCols.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/DropCols.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/FilterCols.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/FilterCols.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/Forecast.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/Forecast.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/Map.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/Map.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/PluckCols.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/PluckCols.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/abstract.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/correlation.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/correlation.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/crosstab.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/crosstab.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/google/GoogleMaps.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/google/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/google/maps.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/pivot.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/pivot.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/tExplode.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/tExplode.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/tOrder.catalog.yaml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/tOrder.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/transformations/tPandas.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/obj.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/queries/qs.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/scheduler/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/scheduler/jobs.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/scheduler/notifications.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/scheduler/scheduler.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/services.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/template/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/template/parser.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/converters.cpp +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/converters.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/dt/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/dt/filters.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/dt/transforms.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/py.typed +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/typedefs.c +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/typedefs.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/validators.cpp +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/types/validators.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/cache_serialization.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/events.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/fn.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/functions.cpp +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/functions.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/getfunc.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/handlers.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/parseqs.cpp +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/parseqs.pyx +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource/utils/validators.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource.egg-info/SOURCES.txt +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource.egg-info/dependency_links.txt +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource.egg-info/entry_points.txt +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource.egg-info/not-zip-safe +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource.egg-info/requires.txt +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/querysource.egg-info/top_level.txt +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/run.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/Cargo.lock +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/Cargo.toml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/pyproject.toml +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/arangodb_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/bigquery_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/cql_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/elastic_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/filter_common.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/flux_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/lib.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/mongo_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/mssql_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/parseqs.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/pgsql_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/rethink_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/safe_dict.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/soql_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/sql_parser.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/rust/src/validators.rs +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/setup.cfg +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/setup.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/static/notebook/bundle.js +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/templates/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/templates/base.html +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/templates/default.html +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/templates/default_table.html +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/templates/fontlist-v330.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/templates/fontlist-v390.json +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/templates/table_charts.html +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/auth/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/auth/test_credentials.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/auth/test_pbac_bootstrap.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/check_concurrent_get_slug.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/conftest.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/datasources/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/datasources/test_datasource_view_pbac.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/datasources/test_driver_factory_session.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/datasources/test_pg_admin_registration.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/datasources/test_pg_params_for.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/handlers/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/handlers/conftest.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/handlers/test_abstract_pbac_helpers.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/handlers/test_airtable_oauth.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/handlers/test_multiquery_pbac_smoke.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/handlers/test_queryexecutor_pbac_smoke.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/handlers/test_querymanager_pagination.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/handlers/test_queryservice_pbac_smoke.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/integration/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/integration/test_pbac_credentials.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/integration/test_pbac_enforcement.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/integration/test_pbac_listing.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/interfaces/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/interfaces/test_airtable_interface.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/multi/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/multi/sources/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/multi/sources/test_airtable_source.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/multi/sources/test_registry.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/perf/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/perf/test_pbac_overhead.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/policies/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/policies/test_default_policies_load.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/scheduler/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/scheduler/test_parse_trigger_shorthands.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/scheduler/test_shorthand_loaders.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/services/__init__.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/services/test_querysource_setup_pbac.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_abstract_multi.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_abstract_refactor.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_api.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_arangodb_parser.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_colcols.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_correlation.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_filter.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_forecast.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_googlemaps.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_groupby.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_map.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_pivot.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_remote.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_texplode.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_catalog_torder.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_cli_generate_docs.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_column_filters.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_component_handler.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_component_registry.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_conf_airtable.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_destination_base.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_destination_dwh.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_destination_integration.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_destination_s3.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_destination_sharepoint.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_destination_table.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_destinations_documentation_endpoint.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_elastic_parser.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_eval.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_info_eda.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_info_eda_e2e.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_info_eda_integration.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_join_conditions.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_join_with_column_filter.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_local_executor.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_multi_destinations_subpackage.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_multiqs_column_transforms.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_multiqs_destination_dispatch.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_multiqs_remote_dispatch.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_multiqs_sources_integration.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_queryslug_concurrency.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_querysource_setup_airtable.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_qworker_config.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_remote_executor.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_route_registration.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_rss.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_rust_parsers.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_scheduler_core.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_scheduler_handler_integration.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_scheduler_handler_unit.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_scheduler_integration.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_scheduler_jobs.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_scheduler_multi_routing.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_scheduler_notifications.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_schema_introspectable.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_source_registry.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_source_s3.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_source_sharepoint.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_source_smartsheet.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_source_table.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_sql_parser_combinations.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_texplode.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_thread_file_refactor.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_thread_query_refactor.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_thread_source_base.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_threadquery_executor.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tests/test_zammad_search.py +0 -0
- {querysource-4.4.2 → querysource-4.4.3}/tox.ini +0 -0
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (4, 4,
|
|
21
|
+
__version__ = version = '4.4.4.dev0+gf6f711fc9.d20260608'
|
|
22
|
+
__version_tuple__ = version_tuple = (4, 4, 4, 'dev0', 'gf6f711fc9.d20260608')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'gf6f711fc9'
|
|
@@ -140,7 +140,8 @@ class QueryHandler(AbstractHandler):
|
|
|
140
140
|
data = {}
|
|
141
141
|
_queries = options.get('queries', {})
|
|
142
142
|
_files = options.get('files', {})
|
|
143
|
-
|
|
143
|
+
_sources = options.get('sources', {})
|
|
144
|
+
if not (_queries or _files or _sources): # Check if all inputs are effectively empty
|
|
144
145
|
raise self.Error(
|
|
145
146
|
message='Invalid POST Option passed to MultiQuery.',
|
|
146
147
|
code=400
|
|
@@ -203,9 +204,9 @@ class QueryHandler(AbstractHandler):
|
|
|
203
204
|
"writer_options": writer_options,
|
|
204
205
|
}
|
|
205
206
|
## Step 1: PBAC pre-flight (all-or-nothing) before thread fan-out.
|
|
206
|
-
# Detect raw inline query: any non-slug, non-file query component.
|
|
207
|
+
# Detect raw inline query: any non-slug, non-file/source query component.
|
|
207
208
|
_has_raw = bool(
|
|
208
|
-
not slug and not _queries and not _files
|
|
209
|
+
not slug and not _queries and not _files and not _sources
|
|
209
210
|
) or bool(
|
|
210
211
|
isinstance(options, dict) and options.get('query') and
|
|
211
212
|
not _queries and not _files and not slug
|
|
@@ -364,6 +365,7 @@ class QueryHandler(AbstractHandler):
|
|
|
364
365
|
'X-Total-Time': f'{total_time:.2f} seconds',
|
|
365
366
|
}
|
|
366
367
|
)
|
|
368
|
+
output_errors: list[str] = []
|
|
367
369
|
if isinstance(data, dict):
|
|
368
370
|
if 'Output' in options:
|
|
369
371
|
## Optionally saving result to destination (registry-based dispatch)
|
|
@@ -379,7 +381,7 @@ class QueryHandler(AbstractHandler):
|
|
|
379
381
|
step_name,
|
|
380
382
|
dest_err,
|
|
381
383
|
)
|
|
382
|
-
|
|
384
|
+
output_errors.append(f"{step_name}: {dest_err}")
|
|
383
385
|
### Step 6: passing Result to DataOutput
|
|
384
386
|
try:
|
|
385
387
|
if result is None or isinstance(result, DataFrame) and result.empty:
|
|
@@ -410,6 +412,8 @@ class QueryHandler(AbstractHandler):
|
|
|
410
412
|
remote_queries = getattr(qs, '_remote_queries', [])
|
|
411
413
|
if remote_queries:
|
|
412
414
|
response.headers['X-Remote-Queries'] = ','.join(remote_queries)
|
|
415
|
+
if output_errors:
|
|
416
|
+
response.headers['X-Output-Errors'] = ' | '.join(output_errors)
|
|
413
417
|
return response
|
|
414
418
|
except (DataNotFound) as ex:
|
|
415
419
|
return self.NoData(
|
|
@@ -94,7 +94,8 @@ class MultiQS(BaseQuery):
|
|
|
94
94
|
## Getting data from Queries or Files
|
|
95
95
|
self._queries = query.pop('queries', {})
|
|
96
96
|
self._files = query.pop('files', {})
|
|
97
|
-
|
|
97
|
+
raw_sources = query.pop('sources', [])
|
|
98
|
+
self._sources = self._normalize_sources(raw_sources)
|
|
98
99
|
else:
|
|
99
100
|
self._sources = []
|
|
100
101
|
if not (self.slug or self._queries or self._files or self._sources):
|
|
@@ -110,6 +111,58 @@ class MultiQS(BaseQuery):
|
|
|
110
111
|
# FEAT-101: track names of queries dispatched to remote qworker.
|
|
111
112
|
self._remote_queries: list = []
|
|
112
113
|
|
|
114
|
+
@staticmethod
|
|
115
|
+
def _expand_dotted_keys(cfg: dict) -> dict:
|
|
116
|
+
"""Expand dot-notation keys into nested dicts.
|
|
117
|
+
|
|
118
|
+
Frontend sends ``{"source.file_id": {"file_id": 123}}`` instead of
|
|
119
|
+
``{"source": {"file_id": 123}}``. For each dotted key, the parent
|
|
120
|
+
segment becomes the top-level key and the value (a dict) is merged in.
|
|
121
|
+
Multiple dotted keys sharing the same parent are merged together.
|
|
122
|
+
"""
|
|
123
|
+
expanded = {}
|
|
124
|
+
for key, value in cfg.items():
|
|
125
|
+
if '.' in key:
|
|
126
|
+
parent = key.split('.')[0]
|
|
127
|
+
if isinstance(value, dict):
|
|
128
|
+
existing = expanded.get(parent, {})
|
|
129
|
+
expanded[parent] = {**existing, **value}
|
|
130
|
+
else:
|
|
131
|
+
expanded[key] = value
|
|
132
|
+
else:
|
|
133
|
+
expanded[key] = value
|
|
134
|
+
return expanded
|
|
135
|
+
|
|
136
|
+
@staticmethod
|
|
137
|
+
def _normalize_sources(raw) -> list:
|
|
138
|
+
"""Normalize the ``sources`` payload to the internal list format.
|
|
139
|
+
|
|
140
|
+
Accepts two shapes:
|
|
141
|
+
|
|
142
|
+
* **List** (canonical internal format)::
|
|
143
|
+
|
|
144
|
+
[{"SmartSheetSource": {"credentials": {...}, "source": {...}}}]
|
|
145
|
+
|
|
146
|
+
* **Dict** (frontend convenience format)::
|
|
147
|
+
|
|
148
|
+
{"alias": {"type": "SmartSheetSource", "source.file_id": {"file_id": 123}}}
|
|
149
|
+
|
|
150
|
+
Each entry's ``type`` field is extracted as the source-type key.
|
|
151
|
+
Dot-notation keys (e.g. ``source.file_id``) are expanded into nested
|
|
152
|
+
dicts via ``_expand_dotted_keys``.
|
|
153
|
+
"""
|
|
154
|
+
if isinstance(raw, list):
|
|
155
|
+
return raw
|
|
156
|
+
if isinstance(raw, dict):
|
|
157
|
+
normalized = []
|
|
158
|
+
for _alias, cfg in raw.items():
|
|
159
|
+
cfg = dict(cfg)
|
|
160
|
+
source_type = cfg.pop('type', _alias)
|
|
161
|
+
cfg = MultiQS._expand_dotted_keys(cfg)
|
|
162
|
+
normalized.append({source_type: cfg})
|
|
163
|
+
return normalized
|
|
164
|
+
return []
|
|
165
|
+
|
|
113
166
|
async def query(self):
|
|
114
167
|
"""
|
|
115
168
|
Executing Multiple Queries/Files
|
|
@@ -900,7 +900,16 @@ def describe_class(cls: type, category: str | None = None) -> dict:
|
|
|
900
900
|
example_text = json.dumps(example_dict, indent=2)
|
|
901
901
|
if not example_text and body_literal:
|
|
902
902
|
# rST literal block — typically a YAML config example for destinations.
|
|
903
|
-
|
|
903
|
+
# Try to parse as YAML and re-serialize as JSON so the UI shows JSON.
|
|
904
|
+
try:
|
|
905
|
+
import yaml # noqa: PLC0415
|
|
906
|
+
parsed = yaml.safe_load(body_literal)
|
|
907
|
+
if isinstance(parsed, dict):
|
|
908
|
+
example_text = json.dumps(parsed, indent=2)
|
|
909
|
+
else:
|
|
910
|
+
example_text = body_literal
|
|
911
|
+
except Exception:
|
|
912
|
+
example_text = body_literal
|
|
904
913
|
|
|
905
914
|
icon = getattr(cls, "_icon", None) or DEFAULT_CATEGORY_ICONS.get(
|
|
906
915
|
category, DEFAULT_CATEGORY_ICONS["Components"]
|
{querysource-4.4.2 → querysource-4.4.3}/querysource/queries/multi/destinations/sharepoint.py
RENAMED
|
@@ -66,6 +66,9 @@ class ToSharepoint(AbstractDestination):
|
|
|
66
66
|
self._client_secret: str = resolved.get("client_secret", "")
|
|
67
67
|
self._tenant_id: str = resolved.get("tenant_id", "")
|
|
68
68
|
self._site: str = resolved.get("site", "")
|
|
69
|
+
self._tenant_name: str = resolved.get("tenant_name", "")
|
|
70
|
+
# site_id can be provided directly to skip Graph site resolution
|
|
71
|
+
self._site_id: str = resolved.get("site_id", "")
|
|
69
72
|
|
|
70
73
|
# Destination config
|
|
71
74
|
self._filename: str = dest_cfg.get("filename", "output.xlsx")
|
|
@@ -118,6 +121,13 @@ class ToSharepoint(AbstractDestination):
|
|
|
118
121
|
"Install them with: pip install azure-identity msgraph-sdk"
|
|
119
122
|
) from exc
|
|
120
123
|
|
|
124
|
+
# The msgraph/kiota SDK uses platform.version() to build the User-Agent
|
|
125
|
+
# header. On Linux the string has a trailing space which aiohttp rejects
|
|
126
|
+
# as an illegal header value. Patch it before the client is constructed.
|
|
127
|
+
import platform as _platform
|
|
128
|
+
_orig_version = _platform.version
|
|
129
|
+
_platform.version = lambda: _orig_version().strip()
|
|
130
|
+
|
|
121
131
|
if not all([self._tenant_id, self._client_id, self._client_secret]):
|
|
122
132
|
raise OutputError(
|
|
123
133
|
"ToSharepoint: 'tenant_id', 'client_id', and 'client_secret' "
|
|
@@ -137,8 +147,29 @@ class ToSharepoint(AbstractDestination):
|
|
|
137
147
|
# ------------------------------------------------------------------
|
|
138
148
|
|
|
139
149
|
async def _resolve_site_id(self, graph_client) -> str:
|
|
140
|
-
"""Return the Graph site-id for :attr:`_site`.
|
|
141
|
-
|
|
150
|
+
"""Return the Graph site-id for :attr:`_site`.
|
|
151
|
+
|
|
152
|
+
Resolution order:
|
|
153
|
+
1. ``site_id`` credential provided directly → return as-is (no API call).
|
|
154
|
+
2. Hostname-based path: ``{tenant_name}.sharepoint.com:/sites/{site}:``
|
|
155
|
+
3. Fallback path: ``root:/sites/{site}:``
|
|
156
|
+
4. Search by display name via ``$search``.
|
|
157
|
+
"""
|
|
158
|
+
# Fast path: site_id already known
|
|
159
|
+
if self._site_id:
|
|
160
|
+
return self._site_id
|
|
161
|
+
|
|
162
|
+
# Primary lookup: hostname-qualified path (most reliable)
|
|
163
|
+
if self._tenant_name:
|
|
164
|
+
try:
|
|
165
|
+
site_path = f"{self._tenant_name}.sharepoint.com:/sites/{self._site}:"
|
|
166
|
+
site = await graph_client.sites.by_site_id(site_path).get()
|
|
167
|
+
if site and site.id:
|
|
168
|
+
return site.id
|
|
169
|
+
except Exception:
|
|
170
|
+
pass
|
|
171
|
+
|
|
172
|
+
# Secondary lookup: root-relative path
|
|
142
173
|
try:
|
|
143
174
|
site_path = f"root:/sites/{self._site}:"
|
|
144
175
|
site = await graph_client.sites.by_site_id(site_path).get()
|
|
@@ -167,19 +198,78 @@ class ToSharepoint(AbstractDestination):
|
|
|
167
198
|
f"Verify the site name and credentials."
|
|
168
199
|
)
|
|
169
200
|
|
|
170
|
-
|
|
171
|
-
"""
|
|
201
|
+
def _parse_directory_path(self, directory: str) -> tuple:
|
|
202
|
+
"""Split *directory* into ``(library_name, path_within_library)``.
|
|
203
|
+
|
|
204
|
+
When *directory* contains at least two segments, the first segment is
|
|
205
|
+
the document-library name and the rest is the folder path inside that
|
|
206
|
+
library. When only one segment is given it is treated as a subfolder
|
|
207
|
+
inside the default ``"Documents"`` library (single-segment paths are
|
|
208
|
+
rarely library names, and this matches the common convention).
|
|
209
|
+
``"Shared Documents"`` is normalised to ``"Documents"``.
|
|
210
|
+
|
|
211
|
+
Examples::
|
|
212
|
+
|
|
213
|
+
"Shared Documents/Reports/2026" → ("Documents", "Reports/2026")
|
|
214
|
+
"Documents/Tests" → ("Documents", "Tests")
|
|
215
|
+
"Tests" → ("Documents", "Tests")
|
|
216
|
+
"troc/Project Management" → ("troc", "Project Management")
|
|
217
|
+
"""
|
|
218
|
+
if not directory:
|
|
219
|
+
return "Documents", ""
|
|
220
|
+
|
|
221
|
+
directory = directory.replace("\\", "/").strip().strip("/")
|
|
222
|
+
if not directory:
|
|
223
|
+
return "Documents", ""
|
|
224
|
+
|
|
225
|
+
parts = directory.split("/")
|
|
226
|
+
|
|
227
|
+
if len(parts) == 1:
|
|
228
|
+
# Single segment → always treat as subfolder of default library
|
|
229
|
+
return "Documents", parts[0]
|
|
230
|
+
|
|
231
|
+
library_name = parts[0]
|
|
232
|
+
path_within = "/".join(parts[1:])
|
|
233
|
+
|
|
234
|
+
if library_name.lower() == "shared documents":
|
|
235
|
+
library_name = "Documents"
|
|
236
|
+
|
|
237
|
+
return library_name, path_within
|
|
238
|
+
|
|
239
|
+
async def _resolve_drive(
|
|
240
|
+
self, graph_client, site_id: str, library_name: str = "Documents"
|
|
241
|
+
) -> str:
|
|
242
|
+
"""Return the drive-id for *library_name* inside *site_id*.
|
|
243
|
+
|
|
244
|
+
Performs a case-insensitive search across all document libraries.
|
|
245
|
+
If the requested library is not found, logs the available names and
|
|
246
|
+
falls back to the first library named "Documents" / "Shared Documents",
|
|
247
|
+
or the first library overall.
|
|
248
|
+
"""
|
|
172
249
|
try:
|
|
173
250
|
drives = await graph_client.sites.by_site_id(site_id).drives.get()
|
|
174
|
-
if drives
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
251
|
+
if not drives or not drives.value:
|
|
252
|
+
raise OutputError(
|
|
253
|
+
f"ToSharepoint: no document libraries found for site '{site_id}'."
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
# Case-insensitive exact match
|
|
257
|
+
for drive in drives.value:
|
|
258
|
+
if drive.name.lower() == library_name.lower():
|
|
259
|
+
return drive.id
|
|
260
|
+
|
|
261
|
+
# Log available libraries and fall back to default
|
|
262
|
+
available = [d.name for d in drives.value]
|
|
263
|
+
self.logger.warning(
|
|
264
|
+
"ToSharepoint: library '%s' not found. Available: %s. Using default.",
|
|
265
|
+
library_name,
|
|
266
|
+
available,
|
|
182
267
|
)
|
|
268
|
+
for drive in drives.value:
|
|
269
|
+
if drive.name.lower() in ("documents", "shared documents"):
|
|
270
|
+
return drive.id
|
|
271
|
+
return drives.value[0].id
|
|
272
|
+
|
|
183
273
|
except OutputError:
|
|
184
274
|
raise
|
|
185
275
|
except Exception as err:
|
|
@@ -354,30 +444,9 @@ class ToSharepoint(AbstractDestination):
|
|
|
354
444
|
graph_client = self._build_graph_client()
|
|
355
445
|
|
|
356
446
|
site_id = await self._resolve_site_id(graph_client)
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
parts = self._directory.split("/", 1)
|
|
361
|
-
library_part = parts[0]
|
|
362
|
-
path_part = parts[1] if len(parts) > 1 else ""
|
|
363
|
-
|
|
364
|
-
# Find the specific library drive if name was given
|
|
365
|
-
if library_part:
|
|
366
|
-
try:
|
|
367
|
-
drives = await graph_client.sites.by_site_id(site_id).drives.get()
|
|
368
|
-
for drive in (drives.value or []):
|
|
369
|
-
if drive.name.lower() == library_part.lower() or (
|
|
370
|
-
library_part.lower() == "shared documents"
|
|
371
|
-
and drive.name.lower() == "documents"
|
|
372
|
-
):
|
|
373
|
-
drive_id = drive.id
|
|
374
|
-
break
|
|
375
|
-
else:
|
|
376
|
-
path_part = self._directory # fallback: treat whole dir as path
|
|
377
|
-
except Exception:
|
|
378
|
-
path_part = self._directory
|
|
379
|
-
|
|
380
|
-
parent_id = await self._ensure_folder(graph_client, drive_id, path_part)
|
|
447
|
+
library_name, path_within = self._parse_directory_path(self._directory)
|
|
448
|
+
drive_id = await self._resolve_drive(graph_client, site_id, library_name)
|
|
449
|
+
parent_id = await self._ensure_folder(graph_client, drive_id, path_within)
|
|
381
450
|
|
|
382
451
|
if len(content) <= _SMALL_FILE_THRESHOLD:
|
|
383
452
|
self.logger.info(
|
|
@@ -6,7 +6,7 @@ __description__ = (
|
|
|
6
6
|
'QuerySource Query parser and generator.'
|
|
7
7
|
'Supports SQL, NoSQL, MongoDB, Cassandra, Elasticsearch, etc.'
|
|
8
8
|
)
|
|
9
|
-
__version__ = '4.4.
|
|
9
|
+
__version__ = '4.4.3'
|
|
10
10
|
__url__ = 'https://github.com/phenobarbital/querysource'
|
|
11
11
|
__copyright__ = 'Copyright (c) 2018-2025 Jesus Lara'
|
|
12
12
|
__author__ = 'Jesus Lara'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|